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

如何解决如何使用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,如果没有,它可能会起作用,但是结果是错误的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?