前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从限价订单薄中推导预测因子:卡尔曼滤波来搞定!

从限价订单薄中推导预测因子:卡尔曼滤波来搞定!

作者头像
量化投资与机器学习微信公众号
发布2019-12-17 17:06:58
1.7K0
发布2019-12-17 17:06:58
举报

前言

本篇推文,是从一场比赛中学到的一些方法与技巧,分享给公众号的读者们!本文是预测因子的一部分内容。

参赛者要求从限价订单簿(LOB)数据预测外汇资产的未来收益。 这些数据包括300万条交易记录,每条记录都包含多档的bid和ask价格。作为比赛的保密性。其没有披露资产或限价订单日期的细节。

在本文中,我们将重点介绍卡尔曼滤波的应用,以推导LOB的隐式状态。关于卡尔曼滤波理论的详细描述可见下面的链接:

http://web.mit.edu/kirtley/kirtley/binlustuff/literature/control/Kalman%20filter.pdf

知乎网友@太空精酿的这段回答,通俗易懂,让大家很容易理解什么是卡尔曼滤波(一定要看哦!)

模型框架

我们采用一种相对标准(传统)的方法来建立回归模型:

1、以XGBoost回归模型为核心

2、基于walk forward交叉验证的参数网格搜索

3、根据历史tick数据生成额外的动态因子

卡尔曼滤波的特征工程与LOB推导

LOB数据以bid/ask规模和价格数组的形式呈现,分为15个部分:bidSize[0..14],askSize[0..14],bidPrice[0..14],askPrice[0..14]。参考下面图,了解 LOB 在短时间内的累计bid/ask交易量:

为了跟踪LOB随时间的动态变化,引入了LOB buckets之间隐含的现金流。简化一下,所有的buckets[1..14] 被合并成一个。因此,观察结果被描述为向量[bidSize1_14, bidSize0, askSize0, askSize1_14]。

根据以下11个参数定义系统的隐藏状态:

1、每个buckets中四个参数为当前成交量bidSize1_14,bidSize0,askSize0,askSize1_14。虽然这些参数在数据中是直接观测到的,但卡尔曼滤波将其视为受到测量和过程误差的影响;

2、相应buckets的外部现金流量的四个参数;

3、三个参数定义了buckets之间的现金流:

ask1_14 ⇆ ask_0

bid1_14 ⇆ bid_0

ask_0 ⇆ bid_0

除了来自外部的流之外,隐藏状态假定存在于buckets之间的隐式流。 正如我们看到的,这些流的估计被用作回归模型中的因子。

基于上述状态,11×11卡尔曼状态转移矩阵为:

在状态转换矩阵中,行和列按照上面的隐藏状态列表排序。从第5行开始,它是一个单位矩阵,表示流不会发生任何变化。第1行到第4行表示当前bid/ask的成交量。例如,buckets1-14的BidSize随时间t的变化如下:

ω代表白噪声过程。

卡尔曼滤波算法在下面的代码中实现:

代码语言:javascript
复制
process_data = np.array(data[['bidSize1_14', 'bidSize0', 'askSize0', 'askSize1_14']])
N_states = 11                                                                       # number of states
xhat = np.zeros((process_data.shape[0], N_states)) # a posteriori estimate of x
P = np.identity(N_states) # a posteriori error estimate
xhatminus = np.zeros((process_data.shape[0], N_states)) # a priori estimate of x
Pminus = np.identity(N_states) # a priori error estimate
K = np.zeros((N_states, process_data.shape[1])) # gain or blending factor
Q = np.identity(N_states) * 1e-3                                                    # estimate of process variance
R = 1                                                                               # estimate of measurement variance

A = np.identity(N_states)
A[0:4, 4:11] = [
    [1, 0, 0, 0, 0, -1, 0],
    [0, 1, 0, 0, 0, 1, -1],
    [0, 0, 1, 0, 1, 0, 1],
    [0, 0, 0, 1, -1, 0, 0]
]

该代码返回隐式流的值,这些值进一步用作核心回归模型中的预测因子。作为一个例子,流的第一个20000个观测值(ask_0 ⇆ bid_0)表示在下面的时间序列中:

在XGBoost模型中使用了新的预测因子,并根据它们在XGBoost决策树中使用的次数来估计它们的相对重要性。

变量的提取重要统计数据表示在下面的图上,第一个特征表示流ask_0⇆bid_0:

我们观察了一个基于LOB隐式动态现金流生成因子的示例。尽管流是隐式的,数据中没有观察到,但是使用卡尔曼滤波算法可以生成具有显著预测能力的因子,并将其作为核心X输入到GBoost算法中。

XGBoost和交叉验证的细节

直接上代码:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化投资与机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档