卡尔曼滤波及其在配对交易中的应用--Python落地

感谢周航郭增岳的投稿,人工智能与量化交易公众号的运营者,他们热衷于人工智能和量化投资方面的研究。

前言

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

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

卡尔曼滤波

卡尔曼滤波(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的值如下:

There is always someone to learn from

在学习的路上

你永远不会独行

本文分享自微信公众号 - 数据分析1480(lsxxx2011)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量子位

自学机器学习,怎么才能找到工作啊?至少要避开十大雷区 | Reddit高热

一个叫做AdditionalWay的网友,在Reddit提出了这个直击灵魂的问题,引发了大量讨论,两天热度已经超过500。

10920
来自专栏机器之心

业界首个视频识别与定位工具集PaddleVideo重磅更新,前沿视频模型等你用

PaddleVideo 在实际工业界可以形成很多具体应用,包括:视频精彩片段预测、关键镜头定位、视频剪辑等任务,例如定位 NBA 篮球赛视频中扣篮镜头,电视剧中...

12040
来自专栏机器之心

谷歌2019学术影响力新榜:CVPR跃升总榜前10,工程与计算机第2

榜单地址:https://scholar.google.com/citations?view_op=top_venues&hl=en

7810
来自专栏罗超频道

百度深度学习平台飞桨:中国科技自主的AI秘密武器

海量的论文出现在国际顶尖AI学术会议,各种AI商业化实践受到全世界认可。在AI这一赛道上,中国已经颇具底气。然而,AI既然是推动世界第四次工业革命的“发动机”,...

26430
来自专栏微卡智享

C++ OpenCV视频操作之背景消除建模(BSM)-2

上一篇《C++ OpenCV视频操作之背景消除建模(BSM)-1》中我们学习了背景消除建模(BSM)中的采用图像分割模式的高斯混合模型,介绍中我们还说过BS算法...

12030
来自专栏微卡智享

C++ OpenCV特征提取之HOG特征提取(自带行人检测调用)

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计...

16320
来自专栏机器之心

对于AI的未来,我们需要保持谨慎乐观:市北·GMIS 2019首日全亮点

本届大会以「拥抱数智经济,赋能产业生态」为主题,聚焦人工智能学术研究、工程技术与产业应用。「由大数据、人工智能引领的科技革命方兴未艾,正对社会正产生着深远的影响...

9630
来自专栏微卡智享

C++ OpenCV之级联分类器--人脸检测

使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,...

10820
来自专栏码的一手好代码

K- 近邻算法

K-近邻算法实现&python中k-近邻算法使用&模型评估

11910
来自专栏小詹同学

加速时光,让你永远70岁的「变老神器」FaceAPP突然爆红,却恐遭美国封杀

这款应用使用 AI 算法,可以瞬间把人们上传的人脸照片「年轻」或者「老化」。它就是这几天网上充斥各界明星 17 岁/80 岁照片的万恶之源。

14640

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励