IAA(迭代自适应)谱估计算法负责"读懂"成交量周期——识别机构行为痕迹,卡尔曼负责"跟踪"这些信号的演化,避免因市场波动急转而导致因子信号滞后。IAA通过提高成交量功率谱密度估计的精度,让"频域能量占比"这一因子的信号质量提升,从而增强因子本身的选股能力——这是因子层面的优化。"自适应卡尔曼滤波",将知情交易者的真实信号视为被噪声交易掩盖的隐状态,并显式地将测量噪声方差与市场实现波动率挂钩——即波动率越高时,卡尔曼滤波会动态调整其对观测数据的信任权重,增强了对时变市场环境的鲁棒性。

 

关键参数配置说明

参数 推荐值 调整依据
window 240 一个完整交易日的分钟数(4小时×60),也是 IAA 谱估计的信号长度
n_grid 120 频点网格数,为信号长度的一半。过大则计算负担重、谱估计过平滑
n_iter 5 已在实践中验证为收敛所需的最小迭代次数
kalman_Q 0.001~0.01 过程噪声,反映因子隐状态变化的剧烈程度。高波动时期建议上调
kalman_R 0.05~0.3 观测噪声,市场噪声越大则 R 越大,此时卡尔曼更「信任」预测而非观测
z_score_threshold 1.0~2.0 生成交易信号所需的偏离程度。阈值越低则交易越频繁,但假信号增加
n_layers 5 或 10 分层数量,一般 5-10 层可有效检验单调性。实际回测中 IAA 相比 FFT 能提升分层单调性
volatility_lookback 20 自适应卡尔曼中的波动率回看窗口,20个交易日约一个月

回测稳定性评估指标

建议在回测中重点关注以下指标,以验证 IAA + 卡尔曼 组合是否真正提升了模型的稳健性:

  1. 分层收益单调性:各层组合收益是否随因子值单调变化,IAA 版本应表现出比 FFT 版本更平滑的递减曲线
  2. IC IR 变化:因子 IC 的均值与标准差之比,卡尔曼跟踪后应有一定提升
  3. 噪声抑制效率:因子与真实信号间的残差标准差,卡尔曼滤波后应显著降低
  4. 交易频次稳定性:过高频次可能意味着过拟合,过低则捕捉不到信号
  5. 多空组合收益:IAA 因子构建的多空组合应比 FFT 版本有更高的年化收益率和信息比率

按此框架执行完整回测并输出上述指标,即可系统评估 IAA 谱因子与卡尔曼动态跟踪组合的实际效果。

多源数据获取方案

从Tushare获取数据

Tushare提供了三个层面数据接口的完善支持:

成交量数据(分钟级):
利用pro.rt_min接口即可获取各股票实时分钟数据,包含成交量、成交额、开盘价、收盘价、最高价、最低价等完整字段。

财务基本面数据:
通过fina_indicator()接口获取财务指标,用于构建质量因子。

宏观经济与政策数据:
Tushare的宏观经济数据接口可获取CPI、PMI、M2等经济指标,日均处理超10亿次数据请求。

政策、黑天鹅等非结构化数据获取

政策事件类: 聚合财经API(新浪财经、东方财富),采集「中央政治局会议」「央行降准降息」「国务院常务会议」公告,人工标注政策类型和强度后构建事件数据库。

黑天鹅事件: 结合GDELT全球事件数据库、新闻情绪API(如NewsAPI)进行实时爬取,利用LLM模型做事件情感和冲击力的秒级分析。

因积分配置策略: 数据采集频率设置三档——成交量数据以分钟级高频为主,财务数据按季更新,宏观事件数据日更扫描,信号触发阈值依据各自不同波动特征动态调整。

完整实施文档

一、项目整体架构

本项目构建了多层信号处理流水线:Tushare数据源 → 多源数据集成 → IAA谱因子提取 → UKF非线性状态跟踪 → 预测输出与可视化

在开始搭建项目之前,您需要先完成Tushare环境的初始化。请在Python环境中执行以下代码设置您的Token:

import tushare as ts
ts.set_token('*********************************')
pro = ts.pro_api()

如遇网络问题,也可以使用备用镜像:ts.set_token('your_token', server='https://api.tushare.pro')

📁 项目文件结构

 

iaa_ukf_quant/

├── config.py # 全局配置、参数定义
├── requirements.txt # 依赖包清单

├── data/
│ ├── __init__.py
│ ├── tushare_client.py # Tushare数据获取封装
│ ├── multi_source_loader.py # 多源数据集成(成交量、财务、宏观)
│ ├── preprocessor.py # 数据清洗、预处理
│ └── cache_manager.py # 数据缓存与持久化

├── features/
│ ├── __init__.py
│ ├── iaa_estimator.py # IAA谱估计核心实现
│ ├── dripping_stone.py # 滴水穿石因子(基于IAA)
│ └── factor_combiner.py # 多因子聚合

├── models/
│ ├── __init__.py
│ ├── ukf_tracker.py # UKF非线性状态跟踪器
│ └── signal_generator.py # 交易信号生成

├── prediction/
│ ├── __init__.py
│ ├── predictor.py # 综合预测引擎
│ └── visualizer.py # 走势预测可视化

├── machine_learning/ # 机器学习集成模块(可选)
│ ├── __init__.py
│ ├── feature_engineering.py # 特征工程
│ ├── lightgbm_model.py # LightGBM辅助模型
│ └── ensemble.py # UKF+ML融合预测器

├── backtest/
│ ├── __init__.py
│ ├── layered_backtest.py # 分层回测
│ └── metrics.py # 回测指标计算

├── main.py # 主入口:输入股票代码,输出预测

└── run_example.ipynb # Jupyter 运行示例

二、多源数据获取方案

2.1 从Tushare获取数据

Tushare提供了三个层面数据接口的完善支持:

成交量数据(分钟级):
利用pro.rt_min接口即可获取各股票实时分钟数据,包含成交量、成交额、开盘价、收盘价、最高价、最低价等完整字段。

财务基本面数据:
通过fina_indicator()接口获取财务指标,用于构建质量因子。

宏观经济与政策数据:
Tushare的宏观经济数据接口可获取CPI、PMI、M2等经济指标,日均处理超10亿次数据请求。

2.2 政策、黑天鹅等非结构化数据获取

政策事件类: 聚合财经API(新浪财经、东方财富),采集「中央政治局会议」「央行降准降息」「国务院常务会议」公告,人工标注政策类型和强度后构建事件数据库。

黑天鹅事件: 结合GDELT全球事件数据库、新闻情绪API(如NewsAPI)进行实时爬取,利用LLM模型做事件情感和冲击力的秒级分析。

因积分配置策略: 数据采集频率设置三档——成交量数据以分钟级高频为主,财务数据按季更新,宏观事件数据日更扫描,信号触发阈值依据各自不同波动特征动态调整。

2.3 多源数据集成关键实现

python

# data/multi_source_loader.py 核心代码片段
def load_multi_source_data(ts_code, start_date, end_date):
# 1. 成交量数据
minute_vol = pro.rt_min(ts_code=ts_code, freq='1MIN')

# 2. 财务数据
fina = pro.fina_indicator(ts_code=ts_code, start_date=start_date, end_date=end_date)

# 3. 宏观经济数据
macro = pro.cn_m(period=start_date[:6]) # 需一定积分权限

return merge_data(minute_vol, fina, macro)

三、IAA频谱分析器(优化版)

3.1 核心原理与参数说明

IAA(迭代自适应)算法相比传统FFT,无需预设信源数即可实现高分辨率谱估计,实测中迭代5次即可收敛。核心参数包括n_grid(频点网格数,推荐信号长度一半)和n_iter(迭代次数,5次后收敛),前者决定频率分辨精度,后者权衡计算速度。

3.2 完整实现代码

python

# features/iaa_estimator.py

import numpy as np
from scipy import linalg

class IAASpectralEstimator:
"""IAA谱估计器:迭代自适应谱估计算法"""

def __init__(self, n_grid=120, n_iter=5, eps=1e-10):
self.n_grid = n_grid # 频点网格数
self.n_iter = n_iter # 迭代次数
self.eps = eps # 数值稳定性阈值
self._L = None # 信号长度

def _build_dictionary(self, L, freqs):
"""构建傅里叶字典矩阵 A ∈ C^{L×M}"""
n = np.arange(L).reshape(-1, 1)
return np.exp(1j * 2 * np.pi * n @ freqs.reshape(1, -1))

def estimate(self, signal):
"""执行 IAA 谱估计,返回功率谱密度"""
signal = np.asarray(signal).flatten()
L = len(signal)
self._L = L

# 频点网格 (归一化频率 0~0.5)
freqs = np.linspace(0.0, 0.5, self.n_grid)
A = self._build_dictionary(L, freqs)

# 初始化:周期图法
P = np.abs(A.conj().T @ signal) ** 2 / L
P = np.maximum(P, self.eps)

# IAA 迭代更新
for _ in range(self.n_iter):
# 构建相关序列(Toeplitz协方差矩阵对角)
r = np.fft.ifft(np.concatenate([P, P[-2:0:-1]])).real[:L] * (2 * self.n_grid - 2)

for k in range(self.n_grid):
a_k = A[:, k]
numerator = np.abs(np.vdot(a_k, signal)) ** 2
# 用FFT加速Toeplitz矩阵乘法
conv = np.convolve(a_k.conj(), r, mode='full')
denominator = np.real(conv[L-1]) + self.eps
P[k] = numerator / denominator
P = np.maximum(P, self.eps)

return P

def energy_ratio(self, signal, low_idx, high_idx):
"""计算指定频段能量占比"""
P = self.estimate(signal)
total = np.sum(P[1:]) + self.eps
band = np.sum(P[low_idx:high_idx+1])
return band / total

3.3 滴水穿石因子构建

基于上述IAA核心,可构建滴水穿石因子:统计2~5分钟周期的频域能量占比,能量占比越高,说明成交量周期越短,可能对应TWAP等算法交易行为,据此识别机构或知情交易者参与的痕迹。

python

# features/dripping_stone.py

class DrippingStoneFactor:
"""滴水穿石因子:基于IAA的高分辨率谱估计"""

def __init__(self, window=240, n_grid=120, n_iter=5):
self.window = window
self.iaa = IAASpectralEstimator(n_grid=n_grid, n_iter=n_iter)

def _get_freq_indices(self):
"""获取2-5分钟周期在频点网格中的索引"""
freqs = np.linspace(0.0, 0.5, self.iaa.n_grid)
return np.argmin(np.abs(freqs - 0.2)), np.argmin(np.abs(freqs - 0.5))

def compute(self, volume_series):
"""计算单只股票单日因子值"""
if len(volume_series) < self.window:
# 不足时边缘填充
vol = np.pad(volume_series.values, (self.window - len(volume_series), 0), 'edge')
else:
vol = volume_series.values[-self.window:]

# 预处理:异常剔除 + 零均值化 + 汉宁窗
q1, q3 = np.percentile(vol, [25, 75])
iqr = q3 - q1
vol = np.clip(vol, q1 - 3*iqr, q3 + 3*iqr)
vol = vol - np.mean(vol)
vol = vol * np.hanning(len(vol))

low, high = self._get_freq_indices()
return self.iaa.energy_ratio(vol, low, high)

四、无迹卡尔曼滤波(UKF)跟踪器(核心)

4.1 UKF vs 标准卡尔曼:在金融场景下的优势

标准卡尔曼面对成交量这类强非线性、高度非高斯分布的信号时,精度急剧下降,而UKF通过无迹变换(UT)选取Sigma点直接逼近真实分布,对非线性映射的拟合能力远超标准卡尔曼。针对股票市场的低频长尾分布与成交量分布的功率谱特性,推荐使用Van der Merwe缩放采样变体,其合理控制非局部效应,更适合金融时序的不可靠不确定性场景。

完整实现需配置四类核心参数:dim_x(状态维度,推荐5~6)、dim_z(观测维度,至少包括成交量、量比)、dt(采样步长,与分钟级频率对齐)、points_class(Sigma点生成策略,选择MerweScaledSigmaPoints可有效控制非局部效应)。

4.2 基于FilterPy的完整UKF实现

python

# models/ukf_tracker.py

import numpy as np
from filterpy.kalman import UnscentedKalmanFilter, MerweScaledSigmaPoints
from filterpy.common import Q_discrete_white_noise

class UKFTracker:
"""UKF非线性状态跟踪器"""

def __init__(self, dim_x=5, dt=60, alpha=0.001, beta=2, kappa=1):
"""
dim_x: 状态维度 [成交量主趋势, 高频周期项, 成交量变化率, 因子隐变量, 市场情绪]
dt: 时间步长(秒)
alpha/beta/kappa: UKF缩放参数
"""
self.dim_x = dim_x
self.dt = dt

# Sigma点生成器
self.points = MerweScaledSigmaPoints(
n=dim_x, alpha=alpha, beta=beta, kappa=kappa
)

# 初始化UKF
self.ukf = UnscentedKalmanFilter(
dim_x=dim_x, dim_z=1, dt=dt,
fx=self._state_transition, hx=self._measurement,
points=self.points
)
self.ukf.Q = Q_discrete_white_noise(dim=dim_x, dt=dt, var=0.001)
self.ukf.R = np.array([[0.1]])

self.history = []

def _state_transition(self, x, dt):
"""非线性状态转移函数"""
x_new = np.zeros_like(x)
x_new[0] = x[0] + x[1] * dt / 60 # 成交量趋势
x_new[1] = x[1] # 周期项
x_new[2] = x[2] # 变化率
x_new[3] = np.tanh(x[3]) * 0.05 # 因子隐变量
x_new[4] = x[4] # 市场情绪
return x_new

def _measurement(self, x):
"""观测函数:从状态映射到可观测成交量"""
return np.array([x[0] * (1 + 0.01 * x[2])])

def update(self, z, market_volatility=None):
"""
z: 观测值(成交量或因子值)
market_volatility: 市场波动率,用于自适应调整R
"""
if market_volatility:
# 高波动期:降低对观测值的信任
self.ukf.R = np.array([[0.1 + 0.5 * market_volatility]])

self.ukf.predict()
self.ukf.update(z)
self.history.append(self.ukf.x.copy())
return self.ukf.x

五、主控流程与预测输出

5.1 主入口实现

python

# main.py

from data.tushare_client import TushareDataClient
from features.dripping_stone import DrippingStoneFactor
from models.ukf_tracker import UKFTracker
from prediction.predictor import TrendPredictor

class IAAUKFSystem:
def __init__(self):
self.data_client = TushareDataClient()
self.factor_engine = DrippingStoneFactor()
self.ukf = UKFTracker()
self.predictor = TrendPredictor()

def predict_stock(self, ts_code):
"""
ts_code: 股票代码,如 '600519.SH'
returns: 预测结果字典
"""
# Step 1: 获取数据
minute_vol = self.data_client.get_minute_volume(ts_code)
factor_value = self.factor_engine.compute(minute_vol)

# Step 2: UKF状态跟踪
ukf_state = self.ukf.update(factor_value)

# Step 3: 生成预测
prediction = self.predictor.generate(
iaa_factor=factor_value,
ukf_state=ukf_state,
market_ctx=self.data_client.get_market_context()
)
return prediction

if __name__ == '__main__':
system = IAAUKFSystem()
result = system.predict_stock('600519.SH')
print(f"预测方向: {result['direction']}, 置信度: {result['confidence']:.2f}")

六、关于机器学习模型融入的分析

6.1 如何融入机器学习模型

UKF擅长实时状态跟踪(应对高噪声场景),机器学习模型擅长从海量历史数据中挖掘非线性模式(发现复杂规律)。建议的融合架构:

  1. 轻量级集成方案(优先推荐) :用LightGBM构建辅助回归模型,输入特征取自UKF输出的状态序列与IAA因子历史值的拼接,输出为次日收益率预测。UKF提供高精度的状态估计,LightGBM挖掘跨越多个股票的决策规律——两者功能互补,且降低了单一模型的过拟合风险。
  2. 端到端替代方案:以LSTM直接映射量价序列(IAA已处理的谱特征)到收益率,需要大规模数据支持防过拟合。
  3. 混合迭代方案:将UKF的输出作为LSTM的额外输入变量,进行联合迭代训练,以UKF确保短期跟踪准确性,以LSTM捕获长期依赖。

推荐路径:从轻量级LightGBM集成开始,验证预测能力提升后,再逐步引入时间序列深度模型。

6.2 机器学习融合示例

python

# machine_learning/ensemble.py

import lightgbm as lgb

class MLEnhancedPredictor:
def __init__(self):
self.model = lgb.LGBMRegressor(
n_estimators=100, max_depth=5, learning_rate=0.05
)
self.scaler = StandardScaler()

def predict(self, iaa_factor, ukf_state, factor_history, window=60):
# 构造特征
features = np.array([
iaa_factor,
ukf_state[0], ukf_state[1], ukf_state[2],
np.mean(factor_history[-window:]),
np.std(factor_history[-window:]),
]).reshape(1, -1)

# 标准化 + 预测
return self.model.predict(self.scaler.transform(features))

七、核心参数配置总表

模块 参数 推荐值 调参逻辑
IAA谱估计 n_grid 120 信号长度的一半,提高频率分辨率
IAA谱估计 n_iter 5 已验证收敛的最小迭代次数
滴水穿石因子 window 240 240分钟完整交易时段
UKF滤波 dim_x 5 包含趋势项、周期项、变化率等核心状态
UKF滤波 alpha/beta 0.001/2 Merwe缩放标准配置
UKF滤波 Q 0.001 过程噪声,高波动期适度上调
UKF滤波 R 0.05~0.3 高波动时增大,降低观测权重
机器学习层 n_estimators 100 均衡速度与精度
机器学习层 max_depth 5 防止过拟合

八、风险提示与免责声明

本系统仅为算法研究与技术探讨而构建,不构成任何投资建议。量化交易系统本质上是对历史规律的归纳,无法预测黑天鹅等极端事件。金融市场受宏观经济数据发布窗口、政策出台节奏、流动性冲击与情绪过度反应等多类不确定性的综合影响。任何依赖此系统的真实交易行为导致的收益或损失,均由使用者独立承担。请在模拟环境中充分验证系统表现后,审慎评估自身风险承受能力再做决策。


登陆