0

大家下午好!我对卡尔曼滤波器有点陌生,但我遇到了这篇非常有趣的文章(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, 0, 0, 0, 0, 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()

在此先感谢您的时间!

4

1 回答 1

0

设计转换矩阵和观察矩阵是使用卡尔曼滤波器最困难和最重要的部分。(如您所知,卡尔曼滤波器本身的实现由您的库 pykalm 提供。)

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

对于测量矩阵:

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

对于转移矩阵:

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

另请注意

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

于 2020-11-07T20:26:08.827 回答