如何使用Pykalman指定过渡和观察矩阵

问题描述

大家下午好! 我是卡尔曼过滤器的新手,但是我遇到了一篇非常有趣的文章https://pdfs.semanticscholar.org/d348/37b8e535974c341d8c8a5c38666581e83309.pdf),内容涉及在财务时间序列分析中,尤其是在动态样式分析的背景下使用此过滤器的可能性。 我想实现此算法,但不确定如何指定过渡和观察矩阵。 实际上,我有一个共同的参考基金,其中包含60个月度回报观察和8个指数,我希望以此为基准。我专注于弱样式分析,因为使用pykalman库进行编码应该最容易。 这是到目前为止的代码,我只需要指定过渡和观察矩阵:

import matplotlib.pyplot as plt
from pykalman import KalmanFilter
import numpy as np
import pandas as pd

df1 = pd.read_excel('/Users/marco/Desktop/SA_trial.xlsx')
df1.drop(['Mth'],axis='columns',inplace=True)
fund = df1.iloc[:,0:1]
index = df1.iloc[:,2:10]

fund = np.array(fund)
index = np.array(index)
n_timesteps = index.shape[0]
measurements = np.asarray(fund)

kf = KalmanFilter(transition_matrices=np.identity(8),observation_matrices=index[0,:],#transition_offsets=[0,0],initial_state_mean=index[0])

(filtered_state_means,filtered_state_covariances) = kf.filter(measurements)
kf.em(measurements).smooth(measurements)[0]

print('------\n')
print(filtered_state_means)
print(len(filtered_state_means.shape))

weights = filtered_state_means

benchmark = []


for i in range(len(weights)):
    benchmark_return = index[i] @ weights[i]
    benchmark.append(benchmark_return)

print('------\n')
print(benchmark)

plt.plot(measurements,'-r',label='measurment')
plt.plot(benchmark,'-g',label='kalman-filter output')
plt.legend(loc='upper left')
plt.show()

提前感谢您的时间!

解决方法

设计过渡和观测矩阵是使用卡尔曼滤波器最困难也是最重要的部分。 (您知道,卡尔曼过滤器本身的实现由您的库pykalm提供。)

这两个矩阵必须在您的论文中指定,并且确实如此。

对于测量矩阵:

请参阅第43页的第4.2节“测量方程式”。对于您的弱风格分析,测量公式由公式(19)提供。请记住,第36页的公式(4)中的kalman方程定义。如您所见,您的测量矩阵为R'_t。您还需要独立于t的sigma ^ 2测量噪声。

对于过渡矩阵:

请参阅第42和43页的第4.1节“状态方程式”。状态方程式由公式(18)提供。同样,请记住第36页的公式(4)中的卡尔曼方程式的定义。您可以看到,转换矩阵是单位矩阵。过渡噪声为Q。

也请注意

那应该回答你的问题。但是让我指出,您必须在代码中指定噪声矩阵,就像转换矩阵和测量矩阵一样。我不知道pykalm,如果没有,它可能会起作用,但是结果是错误的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...