【精选】卡尔曼滤波及其在配对交易中的应用

2018 年 10 月 13 日 量化投资与机器学习

——人工智能与量化交易公众号——


前沿


听过卡尔曼滤波的差不多有两年的时间了,虽然大致上明白其原理,但是也是直到现在才能够彻底掌握下来。主要是卡尔曼滤波算法涉及到比较复杂的数学公式推导。在很多博客上都有写卡尔曼滤波的相关文章,但都是花非常大的篇幅来通过一些例子来通俗地讲解卡尔曼滤波,对于不知道其数学原理的读者来说,看完之后依然是一知半解。


本文会先讲解最简单的单变量卡尔曼滤波,让大家知道卡尔曼滤波大致是什么样的,然后再详细地给出公式的推导过程,最后展示卡尔曼滤波在配对交易中的应用。


卡尔曼滤波


卡尔曼滤波(Kalman filtering)一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。


最简单的单变量卡尔曼滤波,可以认为,我们观测的时间序列是存在噪声的,而我们可以通过卡尔曼滤波,过滤掉噪声,而得到了去除噪声之后的状态序列。


卡尔曼滤波在配对交易的应用


关于什么配对交易,什么是统计套利中的协整,知乎上有非常好的回答,在这里我们只讨论卡尔曼滤波在配对交易中的应用。

在配对交易中,我们构造了如下回归方程

然后利用该方程在样本外进行套利。那么,假如我们这里的a和B是会改变的,那么我们如何动态地去调整回归方程的系数?我们可以使用如下滤波的方式。

建立观测方程

建立状态方程

我们需要估计的状态为

下面以焦炭和螺纹为例,采用焦炭和螺纹主力连续合约的收盘价数据:

     
     
       
# 以焦炭的收盘价数据作为x,螺纹的收盘价数据作为y
# 螺纹价格 = alpha + beta * 焦炭价格 + 随机误差 
from pykalman import KalmanFilter

#建立观测矩阵
observation_matrices = np.vstack(( np.ones(len(df[:'2013'])),
                                  df.loc[:'2013','焦炭'].values )).T
Shape = observation_matrices.shape
observation_matrices = observation_matrices.reshape(Shape[0],1,Shape[1])

#定义卡尔曼滤波的方程
kf = KalmanFilter(transition_matrices=np.array([[1,0],[0,1]]), #转移矩阵为单位阵
                  observation_matrices=observation_matrices)
np.random.seed(0)

# 使用2013年以前的数据,采用EM算法,估计出初始状态,
# 初始状态的协方差,观测方程和状态方程误差的协方差
kf.em(df.loc[:'2013','螺纹'])


#对2013年的数据做滤波
filter_mean,filter_cov = kf.filter(df.loc[:'2013','螺纹'])#观测值为螺纹

#从2014年开始滚动
start_index = np.where(df.index.year==2014)[0][0]

for i in range(start_index,len(df)):
    observation_matrix = np.array([[1,df['焦炭'].values[i]]])
    observation = df['螺纹'].values[i]

    #以上一个时刻的状态,状态的协方差以及当前的观测值,得到当前状态的估计
    next_filter_mean,next_filter_cov = kf.filter_update(
            filtered_state_mean = filter_mean[-1],
            filtered_state_covariance = filter_cov[-1],
            observation = observation,
            observation_matrix = observation_matrix)

    filter_mean = np.vstack((filter_mean,next_filter_mean))
    filter_cov = np.vstack((filter_cov,next_filter_cov.reshape(1,2,2)))

#得到alpha和beta
alpha = pd.Series(filter_mean[start_index:,0], index = df.index[start_index:])
beta = pd.Series(filter_mean[start_index:,1], index = df.index[start_index:])

得到alpha和beta的值如下:


本文来自:人工智能与量化交易


推荐阅读


1、经过多年交易之后你应该学到的东西(深度分享)

2、监督学习标签在股市中的应用(代码+书籍)

3、2018年学习Python最好的5门课程

4、全球投行顶尖机器学习团队全面分析

5、使用Tensorflow预测股票市场变动

6、被投资圈残害的清北复交学生们


知识在于分享

在量化投资的道路上

你不是一个人在战斗

登录查看更多
1

相关内容

卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器),它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态。
专知会员服务
128+阅读 · 2020年7月10日
【ICLR2020-哥伦比亚大学】多关系图神经网络CompGCN
专知会员服务
49+阅读 · 2020年4月2日
周志华教授:如何做研究与写论文?
专知会员服务
149+阅读 · 2019年10月9日
推荐系统概述
Linux爱好者
20+阅读 · 2018年9月6日
基于 Keras 用深度学习预测时间序列
R语言中文社区
23+阅读 · 2018年7月27日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
推荐系统经典技术:矩阵分解
机器学习研究会
10+阅读 · 2017年10月10日
基于深度学习的电商交易欺诈检测系统
AI研习社
8+阅读 · 2017年9月26日
EKF常用于目标跟踪系统的扩展卡尔曼滤波器
无人机
9+阅读 · 2017年7月25日
基于LDA的主题模型实践(二 )MCMC--吉布斯采样
机器学习深度学习实战原创交流
24+阅读 · 2015年9月17日
Arxiv
14+阅读 · 2019年11月26日
Meta-Learning with Implicit Gradients
Arxiv
13+阅读 · 2019年9月10日
Arxiv
9+阅读 · 2018年3月28日
Arxiv
5+阅读 · 2018年1月17日
VIP会员
相关资讯
推荐系统概述
Linux爱好者
20+阅读 · 2018年9月6日
基于 Keras 用深度学习预测时间序列
R语言中文社区
23+阅读 · 2018年7月27日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
推荐系统经典技术:矩阵分解
机器学习研究会
10+阅读 · 2017年10月10日
基于深度学习的电商交易欺诈检测系统
AI研习社
8+阅读 · 2017年9月26日
EKF常用于目标跟踪系统的扩展卡尔曼滤波器
无人机
9+阅读 · 2017年7月25日
基于LDA的主题模型实践(二 )MCMC--吉布斯采样
机器学习深度学习实战原创交流
24+阅读 · 2015年9月17日
Top
微信扫码咨询专知VIP会员