卡尔曼滤波(kalman filter)对单时间序列平滑-python

本文介绍了如何使用Python中的pandas和numpy库实现卡尔曼滤波算法对CSV数据进行平滑处理,通过迭代计算预测和更新状态估计,以得到更平滑的滤波后数据。
摘要由CSDN通过智能技术生成

准备文件:

import pandas as pd
import numpy as np
import random

# 读取CSV文件
file_path = 'data02.csv'  # 替换为你的CSV文件路径
data = pd.read_csv(file_path)
x_data = data.iloc[:, 0].values  # 假设第一列是要平滑的数据

# 初始化卡尔曼滤波器参数
n_iter = len(x_data)  # 迭代次数
sz = (n_iter,)  # 数据尺寸
Q = 1e-5  # 过程噪声协方差
R = 0.005**2  # 观测噪声协方差

# 初始估计
xhat = np.zeros(sz)  # 状态估计
P = np.zeros(sz)  # 状态估计协方差
xhatminus = np.zeros(sz)  # 预测估计
Pminus = np.zeros(sz)  # 预测协方差
K = np.zeros(sz)  # 卡尔曼增益

# 初始状态
xhat[0] = 0.0
P[0] = 1.0

# 卡尔曼滤波迭代
for k in range(1, n_iter):
    # 预测
    xhatminus[k] = xhat[k-1]
    Pminus[k] = P[k-1] + Q

    # 更新
    K[k] = Pminus[k] / (Pminus[k] + R)
    xhat[k] = xhatminus[k] + K[k] * (x_data[k] - xhatminus[k])
    P[k] = (1 - K[k]) * Pminus[k]

# 使用 xhat 作为滤波后的数据
filtered_data = xhat

# 绘制原始数据和滤波后的数据进行对比
import matplotlib.pyplot as plt
plt.plot(x_data, label='Original Data')
plt.plot(filtered_data, label='Filtered Data', color='red')
plt.legend()
plt.show()


原始数据

266
145
183
119
180
168
231
224
192
122
336
185
194
149
210
273
191
287
226
303
289
421
264
342
339
440
315
439
401
437
575
407
682
475
581
646

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波是一种利用已知数据对未知数据进行估计的滤波算法。它可用于估计未知的状态量,例如物体的位置、速度和加速度等。在配对交易中,卡尔曼滤波可以用来估计股票价格或其他金融数据的未知变化量,从而预测未来价格走势。 以下是一个使用Python实现卡尔曼滤波的示例代码: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt # 定义卡尔曼滤波函数 def kalman_filter(data): n = len(data) xhat = np.zeros(n) # 估计值 P = np.zeros(n) # 估计协方差矩阵 xhatminus = np.zeros(n) # 先验估计值 Pminus = np.zeros(n) # 先验估计协方差矩阵 K = np.zeros(n) # 卡尔曼增益 # 初始化 xhat[0] = data[0] P[0] = 1.0 # 迭代计算 for k in range(1, n): # 先验估计 xhatminus[k] = xhat[k - 1] Pminus[k] = P[k - 1] + 1 # 卡尔曼增益 K[k] = Pminus[k] / (Pminus[k] + 1) # 后验估计 xhat[k] = xhatminus[k] + K[k] * (data[k] - xhatminus[k]) P[k] = (1 - K[k]) * Pminus[k] return xhat # 加载数据 df = pd.read_csv('data.csv', parse_dates=True, index_col=0) # 取收盘价 data = df['close'].values # 卡尔曼滤波 filtered = kalman_filter(data) # 绘图 plt.figure(figsize=(12, 6)) plt.plot(df.index, data, label='Raw Data') plt.plot(df.index, filtered, label='Filtered Data') plt.legend() plt.title('Kalman Filter for Stock Price') plt.xlabel('Date') plt.ylabel('Price') plt.show() ``` 在上面的代码中,我们首先定义了一个`kalman_filter`函数,该函数接受一个数据数组并返回一个经过卡尔曼滤波处理的数组。然后我们加载了一个包含股票收盘价数据的CSV文件,并使用`kalman_filter`函数对该数据进行滤波处理。最后,我们使用matplotlib库绘制了原始数据和滤波后的数据的图表。 这只是一个简单的示例,实际应用中需要根据具体情况进行参数调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值