【问题标题】:Creating open-high-low-close (ohlc) bars from tick data in Matlab从 Matlab 中的分时数据创建开高低收 (ohlc) 柱
【发布时间】:2013-06-15 20:42:22
【问题描述】:

我有一个期货报价数据的 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

(第一栏是年月日,第二栏是分:秒:十秒,第三栏是价格,第四栏是交易的合约数量,第五栏表示交易是电子交易还是电子交易一个坑)。在我的实际数据集中,我可能在任何给定的分钟内都有数千个报价。

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

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

在示例数据的情况下。我有点不知道从这里做什么,或者我正在做的事情是否在正确的轨道上。

【问题讨论】:

  • 对不起,不清楚,我正在编辑它。我想知道在每分钟内找到开盘高低和收盘价的最佳方法。
  • 你有金融工具箱吗?
  • 我有,还有其他我可能需要的。
  • 有一个函数可以做到这一点:highlow(),或candle()。这是否只是您的问题?
  • 根据文档highlow() 生成一个对象的图,该对象已经具有开盘高低收盘价的 4 个数据系列。 highlow() 在我将连续的分时数据流切割成每分钟的开盘高低和收盘价之后会很有用,但是我遇到的问题是这个将分时数据切割成 ohlc 分钟柱的过程。

标签: matlab time-series finance


【解决方案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 会让您更轻松。

(如果你在这个阶段迷路了,我不会发现 cmets 中提到的 accumarray 是最好的起点!)

顺便说一句,这是假设分钟数增加到 60 以上,而您在某处没有小时数。否则这根本行不通。

【讨论】:

  • 感谢代码!在 60 分钟时,时间如下所示:59:58.0 59:59.0 00:01.0 00:02.0
  • 我添加了一个小更新,将其转换为 59:58.0 59:59.0 60:01.0 60:02.0 等等,这样您就有了唯一的分钟值。
  • 谢谢你,你真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多