在Matlab中从tick数据创建开 - 高 - 低 - 关(ohlc)条

时间:2013-06-14 15:15:55

标签: matlab time-series finance

我有一个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

(第一列是yearmonthdate,第二列是分钟:second:tenthofsecond,第三列是价格,第四列是交易的合约数量,第五列是交易是电子还是在一个坑)。在我的实际数据集中,我可能在任何给定的分钟内有数千个报价。

我使用以下代码读取文件:

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
       .
       .
       .

(69s是我相信的E的matlab表示)

现在我想把它切成一分钟的ohlc条,这样每分钟,我都会记录那一分钟内的第一个,最高价,最低价和最后一个价。我真的很想知道解决这个问题的最佳方法。

我最初的想法是将分钟序列存储在向量d中,在处理数据时,每次d末尾的数字发生变化时,我都会将相应的价格记录为打开,记录前一个价格作为最后一个柱的收盘价,并找到每个开盘价和收盘价内的最大和最小价格。

c(2)是第一分钟,所以我说:

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

在示例数据的情况下。我有点失去了从这里做的事情,或者我正在做的事情是在正确的轨道上。

1 个答案:

答案 0 :(得分: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以上而且你在那里没有时间。否则这根本不起作用。