第三章:交易信号生成——从统计到机器学习的进阶之路

信号生成,说白了就是决定「什么时候开仓、什么时候平仓」。

我在做跨期套利的前两年,一直用纯统计方法。后来发现市场变了——有些规律用传统方法抓不住。于是我开始引入机器学习。今天我就把这两条路都给你讲透。

核心观点:统计套利适合捕捉均值回归,机器学习擅长识别非线性模式。两者结合,效果往往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方法 均值回归假设 机器学习:逻辑回归/随机森林 非线性模式识别 信号过滤与噪声处理 时间过滤 波动率过滤 信号一致性过滤 最终交易信号

这张图你看懂了吗?核心就三条:

  1. 两条腿走路——统计方法和机器学习方法并行,互相验证
  2. 过滤是关键——信号不是越多越好,质量比数量重要
  3. 最终输出——经过三层过滤后的信号,才是真正可以执行的

最后说一句:信号生成没有银弹。我见过有人用深度学习做信号,效果还不如简单的Z-score。关键是要理解你的品种特性,然后选择合适的方法。多试、多测、多总结,这才是王道。


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