动态趋势提取#
与传统技术指标对比#
移动平均缺陷:
-
滞后效应显著
-
窗口长度需要人工选择
-
对突变响应迟钝
卡尔曼优势:
-
自适应调整平滑强度
-
实时更新估计
-
概率框架量化不确定性
# 获取苹果公司股价数据
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 → 更强调历史趋势
-
通过极大似然估计自动优化参数
# 使用EM算法优化参数
kf = kf.em(prices.values, n_iter=10)
optimized_means, _ = kf.filter(prices.values)时变Beta估计#
动态风险系数建模#
市场模型:
其中:
-
表示股票在t时期的收益率
-
表示市场在t时期的收益率
-
表示截距项
-
表示系统性风险系数
-
表示随机误差项
# 获取标普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突变预警系统风险
性能优化技巧#
数值稳定性增强#
-
平方根滤波:使用Cholesky分解避免协方差矩阵非正定
-
对数变换:改用对数概率防止下溢
-
并行处理:利用多核CPU加速计算
# 使用更稳定的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)
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)
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:如何验证滤波器性能?#
- NEES检验:归一化估计误差平方
该公式中:
-
表示真实状态向量
-
表示状态估计值
-
表示协方差矩阵
-
表示归一化估计误差平方
应满足:
其中表示状态向量的维度,表示自由度为n的卡方分布。
-
蒙特卡洛仿真:重复实验统计RMSE
-
残差分析:检查残差是否白噪声
创新应用方向#
高频交易信号生成#
订单簿动态建模:
-
状态变量:[中间价, 买卖价差, 订单流不平衡]
-
观测变量:最优买卖报价、成交记录
# L2订单簿数据示例
observations = np.load('orderbook.npy')
kf = KalmanFilter(
transition_matrices=..., # 基于市场微观结构理论
observation_matrices=...,
transition_covariance=...,# 反映市场波动率
observation_covariance=... # 取决于数据质量
)投资组合优化#
动态跟踪组合权重:
其中:
-
表示投资组合权重向量
-
表示资产收益率向量
-
表示基准组合收益率
-
表示投资组合收益率
-
通过卡尔曼滤波对权重进行实时动态调整
这是一个最小化跟踪误差平方的优化问题,目标是使投资组合收益率尽可能贴近基准组合收益率。通过卡尔曼滤波实时调整权重。
综合练习:构建结合价格趋势和交易量的多因子滤波模型,预测短期价格走势
通过本教程的深度学习,您已掌握:
-
卡尔曼滤波的数学基础
-
金融场景下的实现技巧
-
性能优化与验证方法
-
前沿应用方向
下一步可探索:
-
结合深度学习构建混合模型
-
开发基于滤波器的实时交易系统
-
研究非高斯噪声下的鲁棒滤波方法