5、策略信号生成:阈值信号法、移动平均线交叉法、布林带法、Z-score法、机器学习信号法
信号生成,说白了就是给策略装上一双「眼睛」。基差数据摆在那里,怎么判断什么时候该进场、什么时候该离场?我做了这么多年交易,见过太多人拿着漂亮的数据却赚不到钱,问题往往就出在信号生成这个环节上。
今天咱们一口气聊五种信号生成方法。从最简单的阈值法,到最复杂的机器学习法,我会把每种方法的优缺点、适用场景、以及我踩过的坑都讲清楚。
5.1 阈值信号法:最朴素,但最实用
阈值法,就是给基差设定一个上下限。比如基差超过某个值就做多,低于某个值就做空。听起来简单吧?但越简单的东西,往往越容易出问题。
核心逻辑:
- 设定上阈值(Upper Threshold)和下阈值(Lower Threshold)
- 基差 > 上阈值 → 做空(基差回归)
- 基差 < 下阈值 → 做多(基差回归)
我个人习惯:阈值不要拍脑袋定。我一般先用历史数据的90%分位数和10%分位数作为初始值,然后回测调整。你想想看,如果阈值设得太宽,一年都触发不了几次信号;设得太窄,又会被来回打脸。
# 阈值信号生成示例
import numpy as np
def threshold_signal(basis, upper=2.0, lower=-2.0):
signal = np.zeros_like(basis)
signal[basis > upper] = -1 # 做空
signal[basis < lower] = 1 # 做多
return signal
避坑指南:我曾经在螺纹钢上用过固定阈值,结果遇到行情突变,基差直接突破了历史极值。那一次亏得我肉疼。后来我改用滚动窗口的动态阈值,效果好了很多。
5.2 移动平均线交叉法:趋势跟踪的经典
移动平均线交叉,就是把基差的短期均线和长期均线做比较。短期均线上穿长期均线,说明基差在走强;下穿则说明在走弱。
为什么有效?基差本身有趋势性。比如在交割月临近时,基差往往会收敛。移动平均线能帮我们抓住这种趋势。
def ma_cross_signal(basis, short_window=5, long_window=20):
short_ma = basis.rolling(short_window).mean()
long_ma = basis.rolling(long_window).mean()
signal = np.zeros_like(basis)
signal[short_ma > long_ma] = 1 # 基差走强
signal[short_ma < long_ma] = -1 # 基差走弱
return signal
我的经验:均线参数别用默认的5和20。不同品种的基差波动节奏完全不同。比如股指期货的基差变化快,我常用3和10;而商品期货的基差变化慢,我常用10和30。
5.3 布林带法:捕捉极端行情
布林带法,本质上是在阈值法的基础上加入了波动率考量。它用移动平均线作为中轨,上下轨则是中轨加减两倍标准差。
当基差突破上轨或下轨时,意味着行情进入了极端区域,大概率会回归。
def bollinger_signal(basis, window=20, num_std=2):
ma = basis.rolling(window).mean()
std = basis.rolling(window).std()
upper_band = ma + num_std * std
lower_band = ma - num_std * std
signal = np.zeros_like(basis)
signal[basis > upper_band] = -1 # 做空
signal[basis < lower_band] = 1 # 做多
return signal
注意:布林带法在震荡行情中表现很好,但在单边行情中容易「接飞刀」。我记得2020年原油暴跌时,布林带信号连续止损了5次。后来我加了一个趋势过滤条件,才解决了这个问题。
5.4 Z-score法:标准化后的阈值
Z-score法,就是把基差减去均值,再除以标准差。这样得到的数值就变成了一个标准化的分数,表示当前基差偏离均值多少个标准差。
Z-score的优点是跨品种可比。比如螺纹钢的基差和铜的基差,数值范围完全不同,但Z-score都在-3到3之间波动。
def zscore_signal(basis, window=20, threshold=2):
ma = basis.rolling(window).mean()
std = basis.rolling(window).std()
zscore = (basis - ma) / std
signal = np.zeros_like(basis)
signal[zscore > threshold] = -1
signal[zscore < -threshold] = 1
return signal
我建议:Z-score的窗口长度很关键。窗口太短,信号太敏感;窗口太长,信号太迟钝。我一般先用60天窗口做初步测试,然后根据品种特性微调。
5.5 机器学习信号法:从规则到预测
前面四种方法都是基于规则的。机器学习法则不同,它试图从历史数据中「学习」出信号生成的规律。
常用模型:
- 逻辑回归:简单可解释,适合做二分类(做多/做空)
- 随机森林:能处理非线性关系,不容易过拟合
- XGBoost/LightGBM:梯度提升树,目前在量化领域很流行
- LSTM:适合处理时间序列,但训练成本高
# 机器学习信号生成示例(使用随机森林)
from sklearn.ensemble import RandomForestClassifier
def ml_signal(features, labels):
model = RandomForestClassifier(n_estimators=100)
model.fit(features, labels)
return model.predict_proba(features)[:, 1] # 返回做多概率
避坑指南:我曾经在机器学习信号上栽过大跟头。当时我用LSTM模型,回测曲线漂亮得不得了,结果实盘一跑就崩。后来发现是数据泄露了——我用未来数据做了特征工程。记住:机器学习在量化中最大的坑就是过拟合和未来函数。
5.6 五种方法对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 阈值法 | 简单直观,计算快 | 阈值难确定,不适应市场变化 | 基差波动稳定的品种 |
| 移动平均线交叉 | 能捕捉趋势,参数少 | 滞后性强,震荡行情亏损 | 有明显趋势的基差序列 |
| 布林带法 | 考虑波动率,适应性强 | 单边行情容易反向操作 | 震荡回归行情 |
| Z-score法 | 跨品种可比,标准化处理 | 假设正态分布,实际有偏 | 多品种统一策略 |
| 机器学习法 | 能捕捉复杂模式,潜力大 | 容易过拟合,可解释性差 | 数据量大、特征丰富的场景 |
5.7 信号生成的核心逻辑图
下面这张图展示了五种信号生成方法的关系和适用路径。你可以根据自己的品种特性和数据情况,选择最合适的方法。
5.8 我的选择建议
说了这么多,到底该用哪种方法?我的建议是:
- 新手入门:从阈值法或Z-score法开始。简单、透明、容易调试。
- 有一定经验:尝试布林带法或移动平均线交叉法。加入波动率和趋势判断。
- 进阶玩家:可以研究机器学习法。但记住,机器学习不是万能药,它需要高质量的特征工程和严格的风险控制。
最后说一句:信号生成只是交易策略的一部分。再好的信号,如果没有配套的资金管理和风险控制,也是白搭。我见过太多人把精力全花在信号优化上,结果忽略了仓位管理,最后爆仓离场。嗯,这个坑我也踩过。