前言
本篇推文,是从一场比赛中学到的一些方法与技巧,分享给公众号的读者们!本文是预测因子的一部分内容。
参赛者要求从限价订单簿(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的变化如下:
ω代表白噪声过程。
卡尔曼滤波算法在下面的代码中实现:
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和交叉验证的细节
直接上代码: