第六讲:基差回归策略设计——Z-score信号、阈值设定与仓位管理

各位同学,欢迎来到第六讲。前面我们讲了基差数据的获取、处理,也聊了套利的基本逻辑。今天这一讲,是真正把策略落地的关键一步——基差回归策略的设计

说白了,就是回答三个问题:什么时候进场?什么时候止损?每次下多少仓位?

我个人习惯把这三件事拆开来看,但实际执行时它们是联动的。你想想看,信号再准,仓位管理一塌糊涂,照样亏钱。反过来,仓位管理再好,信号全是噪音,也是白搭。

一、Z-score信号生成:把基差变成可交易的信号

基差本身是一个绝对值,比如螺纹钢的基差现在是80元/吨。但80元是高是低?这得看历史分布。

Z-score就是干这个的。它把基差标准化,告诉你当前基差偏离均值多少个标准差。

公式很简单:

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

我一般用过去20个交易日或者60个交易日作为滚动窗口。为什么是20?因为一个月大概20个交易日,符合中短期回归的节奏。

来看一段Python代码,这是我实际项目中用过的简化版:

import pandas as pd
import numpy as np

def calc_zscore(basis_series, window=20):
    """
    计算基差的滚动Z-score
    basis_series: 基差时间序列
    window: 滚动窗口
    """
    mean = basis_series.rolling(window).mean()
    std = basis_series.rolling(window).std()
    zscore = (basis_series - mean) / std
    return zscore

嗯,这里要注意:标准差不能为零。如果某段时间基差完全不动,std=0,Z-score就变成无穷大。我在实盘里遇到过这种情况,后来加了一个最小std的过滤,比如std小于0.1就跳过。

避坑指南: 我曾经在螺纹钢上用过5日窗口,结果Z-score频繁触发信号,手续费都亏掉了。后来改成20日,效果好了很多。窗口太短,信号太敏感;窗口太长,反应太迟钝。这个度得自己调。

二、开仓阈值与止损阈值设定

有了Z-score,接下来就是设定阈值。阈值设多少?这没有标准答案,但我给你一个经验范围。

开仓阈值

一般用±1.5到±2.5个标准差。我个人习惯:

  • 保守型: Z-score > 2.0 或 < -2.0 才开仓
  • 激进型: Z-score > 1.5 或 < -1.5 就开仓
  • 稳健型: 结合波动率动态调整,波动大时用2.5,波动小时用1.5

为什么会有这个差异?因为不同品种的基差波动特性不一样。比如股指期货的基差波动小,2.0可能一年都触发不了几次;而商品期货波动大,1.5可能每周都有信号。

止损阈值

止损比开仓更重要。我见过太多人只想着赚,没想过亏了怎么办。

止损阈值一般设为开仓阈值的1.5到2倍。举个例子:

  • 开仓阈值设为Z-score=2.0
  • 止损阈值可以设在Z-score=3.0或3.5

为什么?因为如果基差已经偏离到2.0个标准差,理论上回归概率很大。但如果继续偏离到3.0,说明市场结构可能变了,原来的套利逻辑不成立了。

核心原则: 止损不是用来扛单的,是用来承认错误的。基差回归策略的前提是“均值回归”,如果基差不回归反而越走越远,说明均值可能已经变了。

我曾经在铁矿石上吃过这个亏。当时基差Z-score到了2.3,我开仓做回归。结果基差继续拉到3.5,我硬扛,最后亏了15%。后来复盘发现,那段时间港口库存大幅下降,基差的均值已经上移了。

三、仓位管理模型:凯利公式

信号有了,阈值有了,接下来就是下多少仓位。这里我推荐凯利公式

凯利公式的原始形式是用于赌博的,但用在交易上也完全OK。它的核心思想是:根据胜率和盈亏比,计算出最优的下注比例。

公式:

f* = (bp - q) / b

其中:
f* = 最优仓位比例
b  = 盈亏比(平均盈利 / 平均亏损)
p  = 胜率
q  = 1 - p(败率)

举个例子:

  • 你的策略历史胜率是60%(p=0.6)
  • 平均盈利是1000元,平均亏损是500元(b=2)
  • 那么 f* = (2*0.6 - 0.4) / 2 = 0.4

也就是说,每次应该用总资金的40%来开仓。

但这里有个问题——凯利公式算出来的仓位往往偏大。实盘中我一般用半凯利,也就是把结果除以2。上面那个例子,40%变成20%。

我的经验: 半凯利更安全。全凯利在连续亏损时回撤太大,心理上扛不住。我见过有人用全凯利,连续亏了3次就爆仓了。交易不是数学游戏,还得考虑人性。

来看一个完整的仓位计算代码:

def kelly_position(win_rate, avg_win, avg_loss, total_capital, half_kelly=True):
    """
    凯利公式仓位计算
    win_rate: 胜率 (0-1)
    avg_win: 平均盈利
    avg_loss: 平均亏损
    total_capital: 总资金
    half_kelly: 是否使用半凯利
    """
    b = avg_win / avg_loss  # 盈亏比
    p = win_rate
    q = 1 - p
    
    f = (b * p - q) / b
    
    if half_kelly:
        f = f / 2
    
    # 限制仓位在0到1之间
    f = max(0, min(f, 1))
    
    position = f * total_capital
    return position

四、完整策略框架图

下面我用一张SVG图来展示整个策略的流程。从数据输入到最终执行,每一步都串起来:

基差回归策略执行流程 步骤1:基差数据输入 步骤2:计算Z-score 步骤3:开仓/止损阈值判断 |Z| > 阈值? 继续等待/监控 步骤4:凯利公式 计算仓位 步骤5:执行交易 实时更新基差数据

五、实战中的几个要点

讲完了理论,我再说几个实战中容易踩的坑:

  1. Z-score不是万能的。 它假设基差服从正态分布,但实际中基差有厚尾特征。极端行情下,Z-score到4.0都有可能。这时候别死扛。
  2. 阈值要动态调整。 我习惯每季度重新计算一次阈值参数。市场在变,基差的波动率也在变。
  3. 凯利公式的输入要靠谱。 胜率和盈亏比要用样本外数据算,别拿回测数据自欺欺人。
  4. 多品种分散。 别把所有资金压在一个品种上。我一般同时做3-5个品种的基差套利,相关性越低越好。
总结一下: Z-score告诉你什么时候进场,止损阈值告诉你什么时候认错,凯利公式告诉你下多少注。这三者缺一不可。我见过太多人只盯着信号,忽略了仓位管理,最后赚了小钱亏了大钱。

好了,这一讲就到这里。记住,策略设计不是一锤子买卖,需要不断迭代优化。下一讲我们会聊回测框架的搭建,到时候把这些策略逻辑全部跑一遍。


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