【问题标题】:Vectorize High Frequency Data, Calculate Spread,矢量化高频数据,计算传播,
【发布时间】:2012-06-16 11:24:35
【问题描述】:

我将以下数据保存为熊猫dataframe。有了这些数据,我想计算特定秒的买卖价差。但是,正如您所见,要价比出价多很多倍,反之亦然。所以我的目标是执行以下操作:我只想获取这样的数据,即它是一个出价,然后是一个要价,或者是一个要价,然后是相同时间戳的出价,然后计算点差以及有多少点差。

在下面的数据中,它看起来像下面,我会取第 1 行和第 2 行,并计算差值为 0。然后我会取第 3 行和第 4 行,差值为 2。

        time quote   price  volume
0   07:00:00     B  3950.5       5
1   07:00:00     B  3950.0       4
2   07:00:00     A  3950.0       7
3   07:00:00     B  3948.0      17
4   07:00:00     A  3950.0      20
5   07:00:00     A  3950.0      31
6   07:00:00     A  3950.0      44
7   07:00:00     A  3950.0      57
8   07:00:00     A  3950.0      67
9   07:00:00     A  3950.0      57
10  07:00:00     A  3950.0      67
11  07:00:00     A  3950.0      80
12  07:00:00     A  3950.0      90
13  07:00:00     A  3950.0      99
14  07:00:01     B  3948.0      15
15  07:00:01     A  3950.0      89
16  07:00:01     A  3949.5       1
17  07:00:02     A  3950.0      89
18  07:00:03     B  3948.0      12
19  07:00:03     A  3949.0       1
20  07:00:03     B  3948.0       9
21  07:00:03     B  3948.5       4
22  07:00:04     A  3949.5       5
23  07:00:04     B  3948.5       2
24  07:00:05     B  3948.5       1

这是我想要的输出:

       time spread num_spread
   07:00:00      2          2 
   07:00:01      2          1  
   07:00:03      1          1
   07:00:04      1          1

【问题讨论】:

  • 您首先需要按时间戳拆分数据,然后如果要将其视为数组,则从那里移出数组中的一个元素以用作比较,如果报价类型相等,然后继续并移动一个新元素重复直到!= 然后计算传播。我不知道你的num_spread来自哪里。
  • 这正是我的想法。我首先进行了 groupby,但是要比较的数组移位将非常缓慢。我正在尝试对此进行矢量化。到目前为止,我已经想出将 1 分配给 B 并将 -1 分配给 A。取数组本身和 1 滞后之间的差异将起作用,除非它是 BABABA 的情况,它将产生 0 0 0 0 0。我可以通过循环解决此问题,但重点是对其进行矢量化以最小化计算时间。 num_spread 来自该时间段内计算的点差数量
  • 我不相信你可以用你正在尝试做的事情来避免 100% 的迭代。您可以复制quote 列两次,每个方向将其移动一个并将其应用于您的数据集,以根据其中quote 为!= 到quote_nextquote_prev 的条目创建数据透视表。
  • 它似乎可以使用智能数论参数,但它似乎比迭代慢,因为它涉及幂和向量乘法

标签: python time-series pandas


【解决方案1】:
with open('/tmp/ba.data') as dataF:
    oldk, oldsub = None, None
    for key, subi in groupby(map(str.split,dataF), lambda x: (x[1],x[2])):
        if oldk == None:
            oldk, oldsub = key, list(subi)
        else:       
            newsub = list(subi)
            print ' '.join(oldk), '->', ' '.join(key), float(oldsub[-1][3])-float(newsub[0][3])
            oldk, oldsub = None, None

得到这个

07:00:00 B -> 07:00:00 A 0.0
07:00:00 B -> 07:00:00 A -2.0
07:00:01 B -> 07:00:01 A -2.0
07:00:02 A -> 07:00:03 B 2.0
07:00:03 A -> 07:00:03 B 1.0
07:00:04 A -> 07:00:04 B 1.0

如果你改变了

if oldk == None:

if oldk == None or oldk[0] != key[0]:

你会得到

07:00:00 B -> 07:00:00 A 0.0
07:00:00 B -> 07:00:00 A -2.0
07:00:01 B -> 07:00:01 A -2.0
07:00:03 B -> 07:00:03 A -1.0
07:00:04 A -> 07:00:04 B 1.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多