使用pandas从订单的时间序列创建订单簿的快照?

时间:2013-06-11 20:42:11

标签: python pandas quantitative-finance

我对python和pandas相当新,我想知道是否有人知道在pandas之上是否有任何用于python构建的库,这将需要一系列具有以下列的订单序列: 时间戳,身份证,价格,大小,交换

每条记录按大小调整每个价格和交换的总数,以便为您提供当前视图,即记录可能如下所示:

9:00:25.123, 1, 1.02, 100, N
9:00:25.123, 2, 1.02, -50, N
9:00:25.129, 3, 1.03,  50, X
9:00:25.130, 4, 1.02, 150, X
9:00:25.131, 5, 1.02,  -5, X

我希望能够随时了解市场的现状。例如,如果我在9:00:25.130拨打市场电话,我会得到:

1.02, N,  50
1.02, X, 150
1.03, X,  50

9:00:25.131的查询将返回

1.02, N,  50
1.02, X, 145
1.03, X,  50

这些记录可能有一百万或更多,迭代所有记录的每个请求都需要很长时间,特别是如果你想在当天晚些时候查看。我想人们可以制作"快照"在一段时间间隔内使用它们就像mpeg播放中的关键帧一样,我可以自己编写代码,但我认为书籍构建/回放,对于使用熊猫和财务数据的人们来说,这可能已经是库存了这样做。

任何想法,还是我自己动手?

1 个答案:

答案 0 :(得分:7)

我知道这已经过时了但看到大熊猫的好处和限制是有益的

我构建了一个trivial jupyter notebook来展示您所描述的订单簿是如何构建的,以便按照您的要求使用。

核心是一个循环,用于更新订单簿的状态并将其保存以便合并到一个pandas Dataframe中:

states = []
current_timestamp = None
current_state = {}

for timestamp, (id_, price, exch, size) in df.iterrows():
    if current_timestamp is None:
        current_timestamp = timestamp
    if current_timestamp != timestamp:
        for key in list(current_state):
            if current_state[key] == 0.:
                del current_state[key]
        states.append((current_timestamp, dict(**current_state)))
        current_timestamp = timestamp
    key = (exch, price)
    current_state.setdefault(key, 0.)
    current_state[key] += size
states.append((timestamp, dict(**current_state)))

order_book = pd.DataFrame.from_items(states).T

但是:请注意如何在大熊猫之外建立图书状态,并且订单簿状态的pandas.DataFrame不适合模拟每个级别优先级或深度的订单簿(级别3)数据),这可能是一个主要的限制,取决于您想要对订单簿建模的准确程度。

在现实世界中,订购书籍以及更新它们的订单和报价(两者都归入术语"请求")具有相当复杂的交互。这些交互受管理它们的交换规则的约束,这些规则一直在变化。由于这些规则需要时间来正确建模,所以很少有人能够理解,旧的规则通常甚至没有太大的学术兴趣,人们倾向于将这些规则编入图书馆的唯一地方是不太感兴趣的地方与他人分享。

要理解订单簿的简单("程式化")模型背后的理论,其订单和报价,请参阅论文"A stochastic model for order book dynamics" by Rama Cont, Sasha Stoikov, Rishi Talreja,第2部分:

  

2.1限制订单簿

     

考虑在订单驱动的市场中交易的金融资产。市场参与者可以发布两种类型的买入/卖出订单。 limit 订单是以给定价格交易一定数量的证券的订单。限价订单会过帐到电子交易系统,并且可以通过说明在每个价格级别过帐的数量来汇总未结限价订单的状态:这称为限价订单簿。存在未结限制卖单的最低价格称为卖价,最高买入价格称为买入价。   [...更有用的描述]

     

2.2。订单动态

     

现在让我们描述如何通过新订单的流入更新限价订单簿。 [...]假设所有订单都是单位大小[...],

     

•价格水平的限价买单p      

•价格水平的限价卖单p> p_B(t)增加p级的数量:x→x_ {p + 1}

     

•市场买单以卖价减少数量:x→x_ {p_A(t)-1}

     

•市场卖单减少了买入价:x→x_ {p_B(t)+1}

     

•在价格水平上取消一个限制买入订单p      

•在价格水平上取消一个限价卖单p> p_B(t)会减少p级别的数量:x→x_ {p-1}

     

订单的发展因此受到每个价格水平的市场订单,限价订单和取消流入的驱动[...]

您可以看到人们尝试建模或可视化简单限价订单簿的一些库是:

并且有一个很好的quant.stackoverflow.com问题和答案here