我有一个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
在示例数据的情况下。我有点失去了从这里做的事情,或者我正在做的事情是在正确的轨道上。
答案 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以上而且你在那里没有时间。否则这根本不起作用。