跳到主内容
研究主线时间序列与统计套利 · 第43–50讲8/8模块导览 →
研究案例

第50讲:案例·基于卡尔曼滤波的配对交易 (Example: Kalman Filter Pairs Trade)

将卡尔曼滤波用于趋势提取和时变对冲系数,构建动态价差与风险权重,并讨论非线性扩展和计算边界。

完成状态保存在当前浏览器,可随时取消。

动态趋势提取#

与传统技术指标对比#

移动平均缺陷

  • 滞后效应显著

  • 窗口长度需要人工选择

  • 对突变响应迟钝

卡尔曼优势

  • 自适应调整平滑强度

  • 实时更新估计

  • 概率框架量化不确定性

code
# 获取苹果公司股价数据
data = yf.download('AAPL', start='2018-01-01', end='2022-12-31')
prices = data['Close']

# 构建状态空间模型 (假设局部恒定趋势)
kf = KalmanFilter(
    transition_matrices=[1],          # 状态保持不变
    observation_matrices=[1],         # 直接观测价格
    initial_state_mean=prices.iloc[0],
    initial_state_covariance=1,
    observation_covariance=10,        # 假设观测噪声较大
    transition_covariance=0.1         # 允许趋势缓慢变化
)

# 执行滤波
state_means, state_covs = kf.filter(prices.values)

# 可视化结果
plt.figure(figsize=(12,6))
plt.plot(prices, label='原始价格', alpha=0.4)
plt.plot(prices.index, state_means, 'r-', lw=2, label='卡尔曼滤波')
plt.plot(prices.rolling(30).mean(), 'g--', label='30日MA')
plt.title('趋势提取效果对比')
plt.legend()
plt.grid(True)

参数调优技巧

  • 增大transition_covariance → 更快速响应变化

  • 增大observation_covariance → 更强调历史趋势

  • 通过极大似然估计自动优化参数

code
# 使用EM算法优化参数
kf = kf.em(prices.values, n_iter=10)
optimized_means, _ = kf.filter(prices.values)

时变Beta估计#

动态风险系数建模#

市场模型

rstock,t=αt+βtrmarket,t+ϵtr_{stock,t} = \alpha_t + \beta_t r_{market,t} + \epsilon_t

其中:

  • rstock,tr_{stock,t}表示股票在t时期的收益率

  • rmarket,tr_{market,t} 表示市场在t时期的收益率

  • αt\alpha_t 表示截距项

  • βt\beta_t表示系统性风险系数

  • ϵt\epsilon_t 表示随机误差项

code
# 获取标普500和苹果收益率数据
market = yf.download('SPY', start='2015-01-01', end='2020-01-01')['Close'].pct_change().dropna()
stock = yf.download('AAPL', start='2015-01-01', end='2020-01-01')['Close'].pct_change().dropna()

# 数据对齐
common_idx = market.index.intersection(stock.index)
market, stock = market.loc[common_idx], stock.loc[common_idx]

# 构建动态回归模型
observation_matrix = np.ones((len(market), 1, 2))  # [截距项, 市场收益]
observation_matrix[:, 0, 1] = market.values

kf = KalmanFilter(
    n_dim_state=2,
    n_dim_obs=1,
    transition_matrices=np.eye(2),  # 参数随机游走
    observation_matrices=observation_matrix,
    initial_state_mean=[0, 1],
    initial_state_covariance=np.eye(2),
    observation_covariance=0.1,
    transition_covariance=[[0.0001,0],[0,0.0001]]  # 控制参数变化速度
)

# 执行滤波
state_means, _ = kf.filter(stock.values)

# 可视化时变Beta
plt.figure(figsize=(12,6))
plt.plot(common_idx, state_means[:,1], label='动态Beta')
plt.axhline(y=1, ls='--', color='gray', label='市场中性')
plt.title('苹果股票Beta系数动态变化')
plt.xlabel('日期')
plt.ylabel('Beta值')
plt.legend()

策略应用

  • 当Beta>1时:市场上涨时加仓,下跌时减仓

  • 当Beta<1时:作为防御性资产配置

  • 监测Beta突变预警系统风险

性能优化技巧#

数值稳定性增强#

  1. 平方根滤波:使用Cholesky分解避免协方差矩阵非正定

  2. 对数变换:改用对数概率防止下溢

  3. 并行处理:利用多核CPU加速计算

code
# 使用更稳定的KalmanFilter实现
from filterpy.kalman import KalmanFilter

kf = KalmanFilter(dim_x=2, dim_z=1)
kf.x = np.array([30., 10.])          # 初始状态
kf.P = np.diag([100., 100.])        # 初始不确定性
kf.F = np.array([[1., dt], [0., 1.]])  # 状态转移
kf.H = np.array([[1., 0.]])          # 观测函数
kf.Q = np.eye(2)*0.01               # 过程噪声
kf.R = np.array([[obs_noise**2]])   # 观测噪声

常见问题精解#

Q1:如何处理非线性系统?#

当存在非线性关系时,可采用:

扩展卡尔曼滤波(EKF)

code
def f(x, dt):
    return np.dot(F, x) + B

def h(x):
    return np.dot(H, x)

kf = ExtendedKalmanFilter(
    transition_functions=f,
    observation_functions=h,
)

无迹卡尔曼滤波(UKF)

code
from filterpy.kalman import UnscentedKalmanFilter
from filterpy.common import Q_discrete_white_noise

ukf = UnscentedKalmanFilter(
    dim_x=3, dim_z=1,
    dt=1, hx=hx, fx=fx,
    points=MerweScaledSigmaPoints(3, alpha=.1, beta=2., kappa=0.),
)

Q2:如何验证滤波器性能?#

  1. NEES检验:归一化估计误差平方
ϵ=(xx^)TP1(xx^)\epsilon = (x - \hat{x})^T P^{-1}(x - \hat{x})

该公式中:

  • xx表示真实状态向量

  • x^\hat{x}表示状态估计值

  • PP 表示协方差矩阵

  • ϵ\epsilon 表示归一化估计误差平方

应满足:

ϵχ2(n)\epsilon \sim \chi^2(n)

其中nn表示状态向量的维度,χ2(n)\chi^2(n)表示自由度为n的卡方分布。

  1. 蒙特卡洛仿真:重复实验统计RMSE

  2. 残差分析:检查残差是否白噪声

创新应用方向#

高频交易信号生成#

订单簿动态建模

  • 状态变量:[中间价, 买卖价差, 订单流不平衡]

  • 观测变量:最优买卖报价、成交记录

code
# L2订单簿数据示例
observations = np.load('orderbook.npy')

kf = KalmanFilter(
    transition_matrices=...,  # 基于市场微观结构理论
    observation_matrices=...,
    transition_covariance=...,# 反映市场波动率
    observation_covariance=... # 取决于数据质量
)

投资组合优化#

动态跟踪组合权重:

minwE[(wTrrbench)2]\min_{w} \mathbb{E}[ (w^T r - r_{bench})^2 ]

其中:

  • ww 表示投资组合权重向量

  • rr表示资产收益率向量

  • rbenchr_{bench} 表示基准组合收益率

  • wTrw^T r表示投资组合收益率

  • 通过卡尔曼滤波对权重wtw_t进行实时动态调整

这是一个最小化跟踪误差平方的优化问题,目标是使投资组合收益率尽可能贴近基准组合收益率。通过卡尔曼滤波实时调整权重wtw_t


综合练习:构建结合价格趋势和交易量的多因子滤波模型,预测短期价格走势

通过本教程的深度学习,您已掌握:

  • 卡尔曼滤波的数学基础

  • 金融场景下的实现技巧

  • 性能优化与验证方法

  • 前沿应用方向

下一步可探索:

  1. 结合深度学习构建混合模型

  2. 开发基于滤波器的实时交易系统

  3. 研究非高斯噪声下的鲁棒滤波方法

完成研究复核后,自评一次

请按能否复现、质疑并改进研究过程来判断,而不是按是否读完。

模块收束 · 0/8 已完成

把知识收束成可复核的研究产物

完成后应该能够

  • 能够检验并实现统计套利研究
  • 能够识别结构突变、数据挖掘和动态对冲风险

交付物

  • 一份含筛选、稳定性、成本和失效条件的统计套利报告

本模块已有 0/8 个主要学习单元完成。 本模块没有待复习项。