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 信号生成的核心逻辑图

下面这张图展示了五种信号生成方法的关系和适用路径。你可以根据自己的品种特性和数据情况,选择最合适的方法。

基差交易信号生成方法体系 基差数据 阈值信号法 移动平均线交叉法 布林带法 Z-score法 机器学习信号法 做多/做空信号 做多/做空信号 做多/做空信号 做多/做空信号 做多/做空信号 选择方法时考虑:品种特性、数据质量、计算资源、策略复杂度

5.8 我的选择建议

说了这么多,到底该用哪种方法?我的建议是:

  1. 新手入门:从阈值法或Z-score法开始。简单、透明、容易调试。
  2. 有一定经验:尝试布林带法或移动平均线交叉法。加入波动率和趋势判断。
  3. 进阶玩家:可以研究机器学习法。但记住,机器学习不是万能药,它需要高质量的特征工程和严格的风险控制。

最后说一句:信号生成只是交易策略的一部分。再好的信号,如果没有配套的资金管理和风险控制,也是白搭。我见过太多人把精力全花在信号优化上,结果忽略了仓位管理,最后爆仓离场。嗯,这个坑我也踩过。

公众号:蓝海资料掘金营,微信deep3321