交易信号生成:阈值设定的艺术与科学

做高频统计套利这么多年,我最大的体会就是——信号生成是整个策略的灵魂。阈值怎么设,直接决定了你是吃肉还是喝汤。今天咱们就聊聊这个话题,我把这些年踩过的坑、总结的经验,一股脑倒出来。

一、固定阈值:简单粗暴,但别小看它

固定阈值,说白了就是设定一个不变的数值。比如价差超过2个标准差就开仓,回到0.5个标准差就平仓。我刚开始做套利那会儿,用的就是这招。

固定阈值的典型设定:

  • 开仓阈值:均值 ± 2.0σ(标准差)
  • 平仓阈值:均值 ± 0.5σ
  • 止损阈值:均值 ± 3.5σ

嗯,这里要注意。固定阈值有个致命问题——市场在变。你想想看,去年波动率是1%,今年变成3%了,你那2个标准差还是原来的数值吗?

我在2019年做过一个螺纹钢和热卷的套利策略。回测时固定阈值表现完美,实盘第一个月就亏了8%。为什么?因为那段时间政策频出,波动率翻了一倍。固定阈值根本跟不上节奏。

二、动态阈值:让策略学会自适应

动态阈值,就是让阈值跟着市场状态走。说白了,波动率大的时候阈值放宽,波动率小的时候阈值收紧。这才是实战中更靠谱的做法。

我个人习惯用滚动窗口计算动态阈值。比如取过去60个交易日的价差数据,每天重新算均值和标准差。

# 动态阈值计算示例(Python伪代码)
def calc_dynamic_threshold(spread, window=60, z_entry=2.0, z_exit=0.5):
    # 滚动均值和标准差
    rolling_mean = spread.rolling(window).mean()
    rolling_std = spread.rolling(window).std()
    
    # 动态开仓阈值
    upper_entry = rolling_mean + z_entry * rolling_std
    lower_entry = rolling_mean - z_entry * rolling_std
    
    # 动态平仓阈值
    upper_exit = rolling_mean + z_exit * rolling_std
    lower_exit = rolling_mean - z_exit * rolling_std
    
    return upper_entry, lower_entry, upper_exit, lower_exit

实战小技巧:窗口大小的选择很关键。太短(比如20天)容易受噪音干扰,太长(比如120天)又反应太慢。我个人偏好60-90天,具体要看品种的交易活跃度。

三、开仓信号逻辑:别急着进场

开仓信号,核心就一句话:价差偏离到一定程度,赌它会回归。但怎么定义「一定程度」,这里头学问大了。

我一般用三层过滤:

  1. 第一层:阈值触发 - 价差突破开仓阈值
  2. 第二层:动量确认 - 价差在阈值外停留至少N个tick(防止毛刺)
  3. 第三层:流动性检查 - 买卖盘口深度足够,能容纳你的仓位

为什么要加第二层?我曾经吃过亏。有一次价差瞬间突破阈值又弹回来,我的策略直接开仓了,结果就是个噪音。从那以后,我强制要求价差在阈值外至少停留3个tick才开仓。效果立竿见影,虚假信号减少了40%。

避坑指南:我曾经在股指期货套利中,因为没加流动性检查,开仓后才发现对手盘深度不够,滑点直接吃掉了一半利润。记住,信号再好,没有流动性就是白搭。

四、平仓信号逻辑:会买的是徒弟,会卖的是师傅

平仓比开仓难多了。我见过太多人,开仓信号做得花里胡哨,平仓却草草了事。结果呢?盈利的单子拿不住,亏损的单子死扛。

平仓信号我分三种:

平仓类型 触发条件 适用场景
目标平仓 价差回归到平仓阈值(如0.5σ) 趋势平稳,正常回归
止损平仓 价差突破止损阈值(如3.5σ) 价差持续发散,结构可能变了
时间平仓 持仓超过预设时间(如4小时) 防止隔夜风险,控制持仓周期

这里我想重点说说时间平仓。很多人觉得套利是低风险的,可以一直拿着。但你想过没有?如果价差4个小时都不回归,说明你的统计假设可能已经失效了。这时候硬扛,风险反而更大。

五、固定 vs 动态:到底怎么选?

直接给结论吧:

  • 固定阈值适合:波动率稳定的品种、高频做市策略、回测验证期
  • 动态阈值适合:波动率变化大的品种、中低频套利、实盘交易

我个人建议,新手先从动态阈值入手。虽然计算复杂一点,但容错率高。等你对品种特性摸透了,再考虑固定阈值做精细化调整。

六、一张图看懂信号生成逻辑

下面这张图,是我做课程时画的。它把整个信号生成流程串起来了,你一看就明白。

交易信号生成流程 价差数据输入 阈值计算(固定/动态) 开仓信号判断 未触发:继续监控 已触发:执行开仓 平仓信号判断 输入 计算 判断 执行 平仓

你看,整个流程其实不复杂。关键就在于阈值计算那一步——你选固定还是动态,直接决定了后面所有信号的质量。

七、实战中的几个坑

最后,分享几个我踩过的坑,希望能帮你少走弯路:

  • 别过度优化阈值参数。我见过有人把z_entry从2.0调到2.05,回测曲线好看了,实盘却一塌糊涂。过度拟合是高频策略的头号杀手。
  • 动态阈值要加平滑处理。直接用原始数据算滚动标准差,容易被极端值带偏。我习惯先做一次中位数滤波,再去算阈值。
  • 平仓信号要留余量。比如目标平仓阈值是0.5σ,但实际成交可能在0.6σ。设计时就要考虑这个滑点,别等到实盘才发现利润被吃掉了。

好了,阈值设定这块就聊到这儿。记住一句话:信号生成不是数学题,是艺术。你得在理论和实战之间找到那个平衡点。

专注资料整理