
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
如果你曾经处理过金融市场数据,一定会遇到这样一个问题:我们看到的市场价格真的是"真实价格"吗?
答案是:不完全是。市场价格包含了各种噪声,比如买卖价差、随机小额交易、延迟以及市场微观结构等因素。那么,如何从嘈杂的市场数据中提取出隐藏的"真实价格"呢?
卡尔曼滤波器(Kalman Filter)正是解决这个问题的利器。它不是简单的平滑算法,而是一个基于模型的估计系统,能够在每个时间步动态调整对数据的"信任程度"。
本文将带你用 Python 一步步实现卡尔曼滤波器,估算股票的高效价格。
卡尔曼滤波器基于两条规则建立模型:
规则一:隐藏的真实价格逐步变化
真实的对数价格是一个隐藏状态,它随时间发生小幅随机变化。这种随机性由参数 Q(过程噪声)控制。
规则二:市场价格 = 真实价格 + 噪声
我们观察到的对数价格等于真实对数价格加上额外的测量噪声。这种噪声由参数 R(观测噪声)控制。
整个算法不断重复一个循环:预测 → 更新 → 预测 → 更新 ……
首先,我们生成一组模拟的市场数据,包括隐藏的"真实价格"和带噪声的"观测价格":
import numpy as npimport matplotlib.pyplot as plt# 设置随机种子,保证结果可复现np.random.seed(7)# 数据点数量n = 260dt = 1.0# 价格漂移和过程噪声参数mu = 0.0003sigma_process = 0.01# 生成隐藏的真实对数价格x_true = np.zeros(n)x_true[0] = np.log(100.0) # 初始价格为 100w = np.random.normal(loc=mu * dt, scale=sigma_process * np.sqrt(dt), size=n-1)x_true[1:] = x_true[0] + np.cumsum(w)# 观测噪声参数sigma_obs = 0.03# 生成带噪声的观测对数价格y_obs = x_true + np.random.normal(0.0, sigma_obs, size=n)# 转换为实际价格p_true = np.exp(x_true) # 隐藏的真实价格(实际中不可见)p_obs = np.exp(y_obs) # 带噪声的观测价格(实际可见)在这段代码中,p_true 是我们希望估算的干净价格路径(在现实中是隐藏的),而 p_obs 是我们实际能获取的带噪声市场价格。
卡尔曼滤波器的核心代码非常简洁,但功能强大:
# 卡尔曼滤波器参数Q = (sigma_process ** 2) * dt # 过程噪声方差R = (sigma_obs ** 2) # 观测噪声方差# 初始化滤波结果数组x_filt = np.zeros(n) # 滤波后的对数价格估计P = np.zeros(n) # 估计的不确定性K = np.zeros(n) # 卡尔曼增益# 初始状态x_filt[0] = y_obs[0] # 用第一个观测值初始化P[0] = 1.0 # 初始不确定性# 卡尔曼滤波主循环for t in range(1, n): # 预测步骤:假设价格保持不变 x_pred = x_filt[t - 1] P_pred = P[t - 1] + Q # 不确定性增加 # 更新步骤 S = P_pred + R # 总不确定性 K[t] = P_pred / S # 计算卡尔曼增益 x_filt[t] = x_pred + K[t] * (y_obs[t] - x_pred) # 更新估计值 P[t] = (1 - K[t]) * P_pred # 更新不确定性# 转换为实际价格p_filt = np.exp(x_filt)卡尔曼增益 K 是整个算法的核心概念,它决定了我们在多大程度上信任新的观测数据:
这就是为什么卡尔曼滤波器比简单的移动平均更像一个真正的机器学习模型——它在模型预测和新观测之间动态调整信任程度。
让我们把观测价格、滤波估计和真实价格绑定在一起进行可视化:
# 创建图表fig, (ax_price, ax_gain) = plt.subplots(2, 1, figsize=(10, 8))# 绘制价格对比图t = np.arange(n)ax_price.plot(t, p_obs, label='观测价格(带噪声)', alpha=0.6)ax_price.plot(t, p_filt, label='滤波估计', linewidth=2)ax_price.plot(t, p_true, label='真实价格(隐藏)', linestyle='--')ax_price.set_xlabel('时间')ax_price.set_ylabel('价格')ax_price.set_title('卡尔曼滤波器:观测价格 vs 滤波估计 vs 真实价格')ax_price.legend()# 绘制卡尔曼增益图ax_gain.plot(t, K)ax_gain.set_xlabel('时间')ax_gain.set_ylabel('增益')ax_gain.set_title('卡尔曼增益(对新观测的信任程度)')plt.tight_layout()plt.show()一旦你有了滤波后的价格估计,就可以将其应用于多种数据科学场景:
相比移动平均等传统方法,卡尔曼滤波器能够在减少微观噪声的同时,避免引入较大的滞后。
卡尔曼滤波器是一个小巧但强大的模型,通过不断重复"预测 → 更新"的循环,从带噪声的市场观测中估算隐藏的"真实价格"。
它的优势在于:不仅能给出平滑的价格曲线,还能提供实时的信任度量(卡尔曼增益)和不确定性估计。通过调整 Q 和 R 参数,你可以控制滤波器的"个性"——是更相信模型还是更相信数据。
对于学习 Python 和量化金融的同学来说,卡尔曼滤波器是一个非常值得掌握的工具,它在信号处理、目标追踪、时间序列分析等领域都有广泛应用。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐