0

次の形式の先物ティック データの CSV ファイル 'XPQ12.csv' があります。

20090312    30:14.0 717.25  1   E
20090312    30:15.0 718.47  1   E
20090312    30:17.0 717.25  1   E
20090312    30:32.0 718.42  1   E
20090312    30:49.0 715.32  1   E
20090312    30:58.0 717.57  1   E
20090312    31:06.0 716.65  3   E
20090312    31:12.0 718.35  2   E
20090312    31:45.0 721.14  1   E
20090312    31:52.0 719.24  1   E
20090312    32:11.0 717.02  6   E
20090312    32:29.0 717.14  1   E
20090312    32:35.0 717.34  1   E
20090312    32:55.0 717.26  1   E

(最初の列は年月日、2 番目の列は分:秒:10 秒、3 番目の列は価格、4 番目の列は取引された限月の数、5 番目の列は取引が電子的であったかピットで行われたかを示します) . 私の実際のデータ セットでは、特定の 1 分間に数千の価格見積もりが表示される場合があります。

次のコードを使用してファイルを読み取りました。

fid = fopen('C:\Program Files\MATLAB\R2013a\XPQ12.csv','r'); 
[c] = fscanf(fid, '%d,%d:%d.%d,%f,%d,%c')

どの出力:

20090312
      30
      14
       0
  717.25
       1
      69
20090312
      30
      15
       0
  718.47
       3
      69
       .
       .
       .

(69 は EI の matlab 表現です)

ここで、これを 1 分間の ohlc バーに分割して、1 分ごとに、その分内の最初、最高、最低、および最後の価格を記録します。これについて最善の方法を知りたいです。

私の最初のアイデアは、分のシーケンスを vector に保存することでしdた。データを処理している間、 の最後の数字が変更されるたびにd、対応する価格を始値として記録し、前の価格を最後の終値として記録します。バーを開き、始値と終値のそれぞれで最大値と最小値を見つけます。

c(2)は最初の 1 分なので、次のように言いました。

d(1)=c(2);

そして、次の分に進む前に、いつも 7 ずつ数えていたことに気づき、次のように言いました。

Nrows = numel(textread('XPQ12.csv','%1c%*[^\n]')); % counts rows in file
for i=1:Nrows
 if mod(i-2,7)== 0; 
     d(end+1)=c(i);
 end
end

dすべての分でいっぱいになるはずです:

30
30
30
30
30
30
31
31
31
31
32
32
32
32

サンプルデータの場合。私はここから何をすべきか、または私がしていることが正しい軌道に乗っているかどうか、ちょっと迷っています.

4

1 に答える 1

1

今いらっしゃる所から:

Minutes = c(2:7:end);    
MinuteValues=unique(Minutes);
Prices = c(5:7:end);
if (length(Prices)>length(Minutes))
    Prices=Prices(1:length(Minutes));
elseif (length(Prices)<length(Minutes))
    Minutes=Minutes(1:length(Prices));

OverflowValues=1+find(Minutes(2:end)==0 & Minutes(1:end-1)==59);
for v=length(OverflowValues):-1:1
    Minutes(OverflowValues(v):end)=Minutes(OverflowValues(v):end)+60;
end

Highs=zeros(1,length(MinuteValues));
Lows=zeros(1,length(MinuteValues));
First=zeros(1,length(MinuteValues));
Last=zeros(1,length(MinuteValues));
for v=1:length(MinuteValues)
    Highs(v) = max(Prices(Minutes==MinuteValues(v)));
    Lows(v) = min(Prices(Minutes==MinuteValues(v)));
    First(v) = Prices(find(Minutes==MinuteVales(v),1,'first'));
    Last(v) = Prices(find(Minutes==MinuteVales(v),1,'last'));
end

前述のように、textread を使用すると、これが簡単になります。

(この段階で迷子になっている場合は、コメントに記載されている accumarray から始めるのが最適だとは思いません!)

ところで、これは、分が 60 を超えて増加し、どこかに時間がないことを前提としています。そうしないと、これはまったく機能しません。

于 2013-06-14T16:34:05.587 に答える