statsmodels卡尔曼滤波预测步未使用state_cov参数问题咨询
问题根因与修复方案
1. 核心BUG:super调用类名错误
你代码中update方法的第一行传入了错误的类名作为super的第一个参数:
# 错误写法 params = super(dynamic_nelson_siegel, self).update(params, **kwargs)
你自定义的类名称是affine_term_structure,传入不匹配的类名会导致父类MLEModel的update逻辑没有被正确触发,你后续对state_cov等状态空间矩阵的赋值无法同步到卡尔曼滤波的计算链路中,因此预测步的协方差计算没有加上状态噪声项。
修复方案:将该行替换为正确的类名:
# 正确写法 params = super(affine_term_structure, self).update(params, **kwargs)
2. 其他遗漏配置检查
- 你在
__init__方法中接收了tau参数,但没有将其赋值为实例属性,update方法中调用self.tau会触发属性不存在错误,需要在__init__中补充赋值:def __init__(self, yields, tau, k_states=3, **kwargs): super(affine_term_structure, self).__init__(yields, k_states=k_states, **kwargs) self.tau = tau # 补充这行 self.initialize_known(np.zeros(self.k_states), np.eye(self.k_states) * 10000) - 确认你已经实现了
nss方法,否则update中调用self.nss会报错。
3. 验证方法
修复后你可以在update方法末尾添加打印逻辑,确认state_cov赋值生效:
print("赋值的state_cov:", self['state_cov'])
再重新运行滤波,对比predicted_state_cov的计算结果,此时应该符合你预期的transition @ filtered_cov @ transition.T + state_cov的公式。
内容的提问来源于stack exchange,提问作者raghav
相关产品推荐
相关产品推荐

