【问题标题】:Summarized huge data, How to handle it with R?总结海量数据,如何用R处理?
【发布时间】:2013-08-30 02:32:54
【问题描述】:

我正在研究 EBS,外汇市场限价订单簿(LOB):这是一个 100 毫秒时间片中的 LOB 示例:

datetime|side(0=Bid,1=Ask)| distance(1:best price, 2: 2nd best, etc.)| price
2008/01/28,09:11:28.000,0,1,1.6066
2008/01/28,09:11:28.000,0,2,1.6065
2008/01/28,09:11:28.000,0,3,1.6064
2008/01/28,09:11:28.000,0,4,1.6063
2008/01/28,09:11:28.000,0,5,1.6062

2008/01/28,09:11:28.000,1,1,1.6067
2008/01/28,09:11:28.000,1,2,1.6068
2008/01/28,09:11:28.000,1,3,1.6069
2008/01/28,09:11:28.000,1,4,1.6070
2008/01/28,09:11:28.000,1,5,1.6071

2008/01/28,09:11:28.500,0,1,1.6065 (I skip the rest)

总结一下数据,他们有两条规则(为了简单起见,我稍微改了一下):

  1. 如果买入或卖出方的 LOB 没有变化,他们将不会记录该方。查看数据的最后一行,毫秒是 000,现在是 500,这意味着在 100、200、300 和 400 毫秒内任何一侧的 LOB 都没有变化(但这些信息对于任何计算都很重要)。

  2. 从订单簿的给定一侧删除最后一个价格(仅最后一个)。在这种情况下,价格字段中没有任何内容的单个记录。同样,那时将没有整个 LOB 的记录。

    例如:2008/01/28,09:11:28.800,0,1,

我想计算 minAsk-maxBid(1.6067-1.6066) 或加权平均价格(使用所有距离的大小作为权重,我的真实数据中有 size 列)。我想为我的全部数据做。但正如你所见,数据已经汇总,这不是常规的。我已经编写了一个代码来生成整个数据(不仅仅是摘要)。这对于小型数据集很好,但对于大型数据集,我正在创建一个巨大的文件。我想知道您是否有任何提示如何处理数据?如何在高效的同时填补空白。

【问题讨论】:

  • 我建议您将数据过滤并拆分为两个 data.frame:一个用于最佳出价,一个用于最佳询问。然后,对于这两个 data.frame 中的每一个,使用findInterval 来计算对应的askbid 的列。然后你就会知道如何达到最低限度。
  • @flodel- 谢谢,它可能在这里工作,但有更复杂的计算,我需要所有的距离,而不仅仅是最好的出价或要价。简单的例子,如果我想计算加权价格,那么我需要所有的距离,我不能过滤它。我编辑了我的问题。
  • 对于给定的时间戳和边,你总是有五个价格?请定义加权平均价格。它是否使用给定时间戳的所有十个价格,或者大小作为权重?
  • 现在,我正在处理 EUR/USD,每边总是 10。但例如 EUR/CAD,并非一直都是一样的。这有什么区别吗?对于加权平均价格,我使用每个时间片上所有十个价格的交易量作为权重。
  • 对于加权平均价格,我会使用类似的方法,但两个初始 data.frames 应该是 weighted.avg.bidweighted.avg.ask。然后再次使用findInterval 查找两者之间对应的要价/出价。

标签: r summary forex


【解决方案1】:

您没有给出一个很好的可重现示例,因此这将是伪/未经测试的代码。仔细阅读文档并根据需要进行调整。

我建议您首先过滤并将您的数据分成两个 data.frames:

best.bid <- subset(data, side == 0 & distance == 1)
best.ask <- subset(data, side == 1 & distance == 1)

然后,对于这两个 data.frame 中的每一个,使用findInterval 计算相应的最佳卖价或最佳卖价:

best.bid$ask <- best.ask$price[findInterval(best.bid$time, best.ask$time)]
best.ask$bid <- best.bid$price[findInterval(best.ask$time, best.bid$time)]

(为此,您可能必须将日期/时间转换为线性度量,例如开市后的秒数。)

那么应该很简单:

min.spread <- min(c(best.bid$ask - best.bid$price,
                    best.ask$bid - best.ask$price))

我不确定我是否理解收盘时的特殊性,但我敢打赌,您可以在收盘时计算点差并将其添加到最终的min 调用中。


对于加权平均价格,使用相同的想法,但不是两个 best.bidbest.ask data.frames,您应该从两个 weighted.avg.bidweighted.avg.ask data.frames 开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2018-06-13
    相关资源
    最近更新 更多