第三章:交易信号生成——从统计到机器学习的进阶之路
信号生成,说白了就是决定「什么时候开仓、什么时候平仓」。
我在做跨期套利的前两年,一直用纯统计方法。后来发现市场变了——有些规律用传统方法抓不住。于是我开始引入机器学习。今天我就把这两条路都给你讲透。
核心观点:统计套利适合捕捉均值回归,机器学习擅长识别非线性模式。两者结合,效果往往1+1>2。
3.1 基于Z-score的统计套利信号
Z-score是啥?说白了就是「当前价差偏离均值多少个标准差」。我习惯用这个指标来判断价差是否「过分」了。
公式很简单:
Z = (当前价差 - 价差均值) / 价差标准差
嗯,这里要注意:窗口期的选择很关键。我见过有人用20天窗口,有人用60天。我个人习惯先做滚动窗口测试——看看哪个窗口的历史回测表现最好。
我的经验:对于股指期货跨期套利,30天窗口通常效果不错。但商品期货波动大,我建议用60天以上。
信号规则一般这样定:
- 当Z > 2.0:价差过高,做空价差(卖近买远)
- 当Z < -2.0:价差过低,做多价差(买近卖远)
- 当Z回到0附近:平仓
代码实现也不复杂:
def generate_zscore_signals(spread, window=30, entry_threshold=2.0):
mean = spread.rolling(window).mean()
std = spread.rolling(window).std()
zscore = (spread - mean) / std
signals = pd.Series(0, index=spread.index)
signals[zscore > entry_threshold] = -1 # 做空价差
signals[zscore < -entry_threshold] = 1 # 做多价差
# 回归时平仓
signals[abs(zscore) < 0.5] = 0
return signals
避坑指南:我曾经吃过一次大亏——没考虑价差的非平稳性。如果价差有趋势,Z-score会频繁发出错误信号。记得先做ADF检验。
3.2 基于机器学习的信号生成
统计方法有个硬伤:它假设价差是线性均值回归的。但真实市场哪有这么乖?
我试过用逻辑回归和随机森林来生成信号,效果确实不一样。
3.2.1 逻辑回归——简单但有效
逻辑回归说白了就是「用一堆特征去预测涨跌概率」。我常用的特征包括:
- 当前Z-score值
- 价差的一阶差分(动量)
- 成交量比值
- 波动率(用ATR衡量)
- 时间特征(上午/下午、周几)
标签怎么定?我习惯用未来N期的价差收益率:
# 标签生成:未来5分钟价差上涨为1,下跌为0
spread_future = spread.shift(-5)
label = (spread_future > spread).astype(int)
训练模型时,我建议用滚动训练——每天用过去60天的数据重新训练。为什么?因为市场规律会变,模型也得跟着变。
关键点:逻辑回归的系数可以解释特征重要性。我在项目中经常用这个来筛选特征——把系数接近0的特征直接扔掉。
3.2.2 随机森林——捕捉非线性关系
随机森林的好处是:你不用太操心特征工程。它能自动捕捉特征间的交互作用。
我记得有一次,用逻辑回归死活找不到有效信号。换成随机森林后,夏普比率直接从0.8跳到了1.5。为什么?因为价差和波动率之间存在非线性关系——低波动时Z-score有效,高波动时Z-score失效。随机森林能学到这个规律。
from sklearn.ensemble import RandomForestClassifier
def train_rf_model(X_train, y_train):
model = RandomForestClassifier(
n_estimators=200,
max_depth=5,
min_samples_leaf=10,
random_state=42
)
model.fit(X_train, y_train)
return model
# 预测信号概率
prob = model.predict_proba(X_test)[:, 1]
# 生成交易信号:概率大于0.6时开仓
signals = (prob > 0.6).astype(int)
我的建议:随机森林的树不要太多,200棵就够。太多容易过拟合,而且训练慢。另外,max_depth控制在5-8之间效果最好。
3.3 信号过滤与噪声处理
信号生成只是第一步。你想想看,如果每个信号都执行,手续费都能把你亏哭。
我总结了三层过滤机制:
3.3.1 时间过滤
开盘前15分钟和收盘前15分钟,我一般不做。为什么?这两个时间段流动性差,滑点大。我曾经在这上面吃过亏——信号对了,但成交价差太大,反而亏钱。
3.3.2 波动率过滤
当市场波动率异常高时(比如超过过去20天均值的2倍),我会暂停交易。高波动环境下,价差容易走极端,均值回归策略容易被打脸。
3.3.3 信号一致性过滤
如果统计信号和机器学习信号方向一致,我才开仓。不一致就观望。这个方法虽然减少了交易次数,但胜率明显提升。
实战效果:加了这三层过滤后,我的交易次数减少了40%,但总收益反而增加了15%。这就是「少即是多」的道理。
3.4 本章知识体系
下面这张图,是我做这个章节时画的框架。你看一眼就能明白整个信号生成的逻辑:
这张图你看懂了吗?核心就三条:
- 两条腿走路——统计方法和机器学习方法并行,互相验证
- 过滤是关键——信号不是越多越好,质量比数量重要
- 最终输出——经过三层过滤后的信号,才是真正可以执行的
最后说一句:信号生成没有银弹。我见过有人用深度学习做信号,效果还不如简单的Z-score。关键是要理解你的品种特性,然后选择合适的方法。多试、多测、多总结,这才是王道。
公众号:蓝海资料掘金营,微信deep3321