返回列表 发布新帖

高频因子--tick级别订单流因子计算(附代码)

2853 0
发表于 2024-7-29 14:48:19 | 显示全部楼层 阅读模式
[color=rgba(0, 0, 0, 0.9)]往期精选文章:
[color=rgba(0, 0, 0, 0.9)]因子计算的1000倍加速
[color=rgba(0, 0, 0, 0.9)]二级:手搓的择时指增
[color=rgba(0, 0, 0, 0.9)]一级:轮胎行业的研究


[color=rgba(0, 0, 0, 0.9)]有兴趣的朋友可以在公众号回复“OFI”获取因子计算的代码来自己改进再进行测试(附一个月单只股票的tick数据)

我国证券市场是订单驱动市场,在该市场中投资者通过发送订单将买卖委托命令发送到交易所进行撮合,而这一行为会被完整记录于限价订单薄(Limit Order Book,LOB)之中。限价订单薄包含了当前时刻一至五档的委买价、委卖价、委买量和委卖量,这些数据的变化可以识别为订单委托的增加、成交或者取消,价格的上升和下降,一定程度上反映了市场的买卖意图和价值信息。
[color=rgba(0, 0, 0, 0.9)]目前在学术界基于订单薄构建的高频因子有许多,其有一种是研究交易不平衡(Trade Imbalance)来对价格的影响,如Chorida等(2002),也有一种是基于Cont等(2014)所提出的订单流不平衡(Order Flow Imbalance)框架进一步展开研究。
[color=rgba(0, 0, 0, 0.9)]交易不平衡是使用已成交的订单成交量来进行计算,目前国内外大多数研究都基于Lee和Ready(1991)提出的分类算法来计算交易不平衡,主要是通过将某一时间段内的成交量通过 Lee-Ready(1991)判别法判断出是买方订单还是卖方订单,然后通过将一段时间内的买方订单和卖方订单相减进而计算得出。以下为LeeReady计算的不平衡因子代码。

  1.     G_data = {}
  2.     cal_footpoint_model = 'quota_method'
  3.     last_row = []
  4.     for index, row in data.iterrows():
  5.         if not last_row:
  6.             last_row = row

  7.         G_data[index] = {}

  8.         bOF, aOF = multi_imb_En_t(row, last_row, count=5)
  9.         
  10.         G_data[index].update(bOF)
  11.         G_data[index].update(aOF)
  12.         
  13.         midpoint = (row['a1'] + row['b1']) / 2  # 计算中间价
  14.         G_data[index].update({'midprice': midpoint})

  15.         last_price = row['last']
  16.         sub_data = {}
  17.         if cal_footpoint_model == 'quota_method':  #LeeReady分类算法
  18.             if last_price > midpoint:
  19.                 pre_along = 1
  20.             elif last_price < midpoint:
  21.                 pre_along = -1
  22.             else:
  23.                 pre_along = pre_along

  24.         sub_data['dirc'] = pre_along

  25.         if cal_footpoint_model == 'quota_method':
  26.             sub_data['OIBSH'] = pre_along * (max(0, row['volume'] - last_row['volume']))  # 股票时用的

  27.         # sub_data['OIBNUM'] = pre_along * (row['num_trades'] - last_row['num_trades']) # 米筐的期货数据没有num_trades
  28.         sub_data['OIBNUM'] = pre_along  # 没有num_trades时只能用每个tick当作一笔交易

  29.         sub_data['spread'] = row['a1'] - row['b1']
  30.         sub_data['S_B_share'] = max(0, row['volume'] - last_row['volume'])

  31.         G_data[index].update(sub_data)
  32.         G_data[index].update({'OIBDOL': pre_along * (max(0, row['total_turnover'] - last_row['total_turnover']))})
复制代码
[color=rgba(0, 0, 0, 0.9)]在上面的代码中,基于LeeReady的方法计算了OIBSH(交易量不平衡)、OIBNUM(交易次数不平衡)和OIBDOL(交易额不平衡)
[color=rgba(0, 0, 0, 0.9)]但是基于这种方法计算的高频不平衡因子存在显著的局限性。因为在于交易量的标量性质无法捕捉交易方向的细微差别,而交易方向本身蕴含着关于股票价格行为的重要信息。所以Cont(2014)提出的订单流不平衡(Order Flow Imbalance,OFI)开始被纳入微观市场结构的研究范畴。
[color=rgba(0, 0, 0, 0.9)]OFI根据市场订单到达的量、限价单到达的量和订单取消的量,以及对最优买价和最优卖价进行量化。
[color=rgba(0, 0, 0, 0.9)]
image.png [color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]我自己通过翻阅文献,也对这个OFI 因子做了一些改进,大致的思想就利用主成分分析PCA和机器学习算法进行信息提取和预测。
[color=rgba(0, 0, 0, 0.9)]
image.png [color=rgba(0, 0, 0, 0.9)]
image.png
image.png
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]总共对90个股票进行了高频因子的计算,使用2年历史的1分钟级别数据进行滚动预测,上图为其中三只股票的预测结果。准确率平均在60%左右,原来的因子准确率为57%,这一点提升在高频领域算是不错了。
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]虽是如此,但是想要将这个因子直接拿来实盘用还需要很多的改进和测试,上文的测试并没有从因子分析的框架进行分组回测来分析,主要是考虑到了数据量过于庞大,自己电脑没办法跑的原因。有兴趣的朋友可以在公众号回复“OFI”获取因子计算的代码来自己改进再进行测试。

参考文献:[1]Cont R, Kukanov A, Stoikov S. The Price Impact of Order Book Events[J]. Journal of Financial Econometrics, 2014, 12(1): 47-88.[2]Lee C M C, Ready M J. Inferring Trade Direction from Intraday Data[J]. The Journal of Finance, 1991, 46(2): 733-746.
81c5f2f5dc89f23b16f07c0e098c5342.jpg
44a3001139ea9fc1038661bd3242ec7a.png
image.png
image.png

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2025 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表