交易信号生成:基于Z-score的阈值开仓、平仓、止损逻辑设计

信号生成,说白了就是给策略装上一双眼睛。

让它知道什么时候该进场,什么时候该离场。我个人习惯把信号系统拆成三块:开仓、平仓、止损。每一块都有自己的脾气,咱们一个一个聊。

一、Z-score:把价差变成标准分

先说说Z-score这个工具。它其实就是一个标准化公式:

Z = (当前价差 - 价差均值) / 价差标准差

嗯,就这么简单。但你别小看它。我刚开始做价差策略时,直接拿原始价差设阈值,结果被市场来回打脸。后来才明白,价差本身会漂移,不标准化根本没法用。

Z-score的好处在于:

  • 它告诉你当前价差偏离均值多少个标准差
  • 正数表示价差偏大,负数表示偏小
  • 绝对值越大,回归的概率理论上越高

举个例子。假设某品种价差均值是10,标准差是2。当前价差是14,那Z-score就是(14-10)/2=2.0。意味着价差已经偏大了两个标准差,这时候做空价差(卖高买低)的胜率会比较高。

核心思路:Z-score的绝对值越大,价差回归的动力越强。但阈值设多少,这是个艺术活。

二、开仓逻辑:阈值怎么定?

开仓阈值,我一般设±1.5到±2.5之间。为什么是这个范围?

我在项目中遇到过,阈值设太小(比如±1.0),信号太多,手续费吃掉利润。设太大(比如±3.0),信号太少,一年开不了几单。

我的经验是:

  • 保守型:±2.0以上开仓,信号少但胜率高
  • 激进型:±1.5开仓,信号多但需要更严格的风控
  • 动态调整:根据近期市场波动率调整阈值

代码实现其实不复杂:

def generate_signal(z_score, open_threshold=2.0):
    if z_score > open_threshold:
        return 'short'  # 价差偏大,做空
    elif z_score < -open_threshold:
        return 'long'   # 价差偏小,做多
    else:
        return 'neutral'

你想想看,这个逻辑其实就是在赌价差会回归均值。但市场有时候不按套路出牌,所以平仓和止损必须跟上。

三、平仓逻辑:见好就收

平仓比开仓难。为什么?因为人性贪婪,总想多赚一点。

我常用的平仓方式有两种:

  1. 阈值平仓:Z-score回归到0附近(比如±0.5)就平仓
  2. 时间平仓:持仓超过N个周期强制平仓

我个人更推荐第一种。因为价差回归策略的核心就是赚回归的钱,既然已经回归了,就别恋战。

代码示例:

def close_signal(z_score, close_threshold=0.5):
    if abs(z_score) < close_threshold:
        return True
    return False

这里有个坑。我曾经遇到过价差回归到0附近后又迅速偏离,结果平仓早了。后来我加了一个“确认机制”:连续两个周期都在阈值内才平仓。

小技巧:平仓阈值可以设得比开仓阈值更严格。比如开仓用±2.0,平仓用±0.3。这样能吃到大部分回归利润。

四、止损逻辑:活下来最重要

止损,是策略的保险丝。没有止损的策略,就像没有刹车的车。

我常用的止损方式:

止损类型 触发条件 适用场景
固定价差止损 价差偏离开仓价X% 波动稳定的品种
Z-score止损 Z-score超过±3.0 极端行情保护
时间止损 持仓超过N小时 防止死扛

我个人习惯用Z-score止损。因为开仓是基于Z-score的,止损也用Z-score,逻辑上更统一。

举个例子:开仓时Z-score是2.2,止损设在3.0。如果价差继续扩大,Z-score到了3.0,说明回归逻辑可能失效了,必须走。

def stop_loss(z_score, stop_threshold=3.0):
    if abs(z_score) > stop_threshold:
        return True
    return False

注意:止损不是摆设。我曾经有一次没设止损,结果价差从2.0一直跑到4.5,单笔亏损把之前半年的利润全吐回去了。从那以后,止损成了我的铁律。

五、完整信号流程

把上面三块拼起来,就是一个完整的信号系统:

def trading_signal(z_score):
    # 先检查止损
    if abs(z_score) > 3.0:
        return 'stop_loss'
    
    # 再检查平仓
    if abs(z_score) < 0.5:
        return 'close'
    
    # 最后检查开仓
    if z_score > 2.0:
        return 'short_open'
    elif z_score < -2.0:
        return 'long_open'
    
    return 'hold'

这个流程的顺序很重要。止损优先,平仓次之,开仓最后。为什么?因为保住本金永远是第一位的。

六、知识体系图

下面这张图,把整个信号生成逻辑串起来了:

基于Z-score的信号生成体系 价差数据输入 Z-score计算 止损判断 开仓判断 平仓判断 输出:止损信号 输出:开仓信号 输出:平仓信号 最终交易指令

嗯,这张图把整个流程讲清楚了。从价差输入,到Z-score计算,再到三个判断模块,最后输出交易指令。每一步都环环相扣。

总结一下:开仓靠阈值,平仓靠回归,止损靠纪律。三者缺一不可。我见过太多人只关注开仓信号,忽略了平仓和止损,结果策略跑着跑着就崩了。

好了,这一章就聊到这儿。信号生成这块,说白了就是定规矩。规矩定好了,策略才能稳定运行。

专注资料整理