5、基差交易策略框架:策略分类、策略构建流程、策略评估指标、策略回测框架搭建

做基差交易这些年,我最大的感触就是——没有框架,就像在迷雾里开车。你明明知道基差会回归,但什么时候回归?回归多少?仓位怎么配?这些没想清楚,赚了是运气,亏了是必然。

这一章,我把自己的策略框架拆开给你看。从分类到构建,从评估到回测,一条线串下来。你照着这个框架走,至少能少踩80%的坑。

5.1 策略分类:先搞清楚你在赚什么钱

基差交易策略,说白了就三大类。我习惯按驱动逻辑来分,而不是按品种或周期。

策略类型 核心逻辑 典型场景 我踩过的坑
统计套利型 基差偏离历史均值,赌回归 螺纹钢近远月价差、铜期现价差 曾经在2016年做空螺纹基差,结果供给侧改革一来,基差直接翻倍
事件驱动型 交割规则、库存变化、政策扰动 交割月前基差收敛、仓单注销 有一次没算清楚交割成本,差点被逼仓
基本面量化型 用供需数据预测基差方向 库存+利润+基差的联动模型 数据频率不匹配,日度库存配分钟级基差,结果全是噪音

你想想看,这三种策略的胜率来源完全不同。统计套利靠的是概率,事件驱动靠的是信息差,基本面量化靠的是模型精度。千万别混为一谈。

我个人习惯:把80%的资金放在统计套利上,20%做事件驱动。为什么?因为统计套利可复制、可加仓,而事件驱动机会少、容量小。

5.2 策略构建流程:从想法到代码

很多新手一上来就写代码,这是大忌。我自己的流程分五步,每一步都有明确产出。

  1. 逻辑假设:写下你的核心假设。比如「基差超过2倍标准差后,大概率在5天内回归」。
  2. 数据验证:拉出历史数据,肉眼看一下。别急着跑模型,先画图。
  3. 规则设计:开仓条件、平仓条件、止损条件、仓位管理。缺一不可。
  4. 代码实现:把规则翻译成代码。我建议用Python,pandas+backtrader够用了。
  5. 压力测试:换品种、换时间、换参数。看看策略会不会崩。

嗯,这里要注意——第二步最容易被跳过。我曾经有个策略,回测年化30%,结果一上线就亏。后来发现是数据里有个异常值,拉高了整体收益。肉眼看一下就能发现的事,偏偏偷懒了。

避坑指南:我曾经在构建策略时,直接用了别人分享的代码。结果他的参数是针对铜的,我套在螺纹钢上,亏了三个月才发现。记住:没有万能策略,只有适配策略

5.3 策略评估指标:别只看夏普比率

很多人评估策略,就盯着夏普比率看。其实这玩意儿在基差交易里,参考价值有限。为什么?因为基差策略的收益分布往往是非正态的,夏普比率会失真。

我常用的评估指标,列个表给你看:

指标 计算公式 我的关注点
年化收益率 总收益 / 年数 别超过50%,超过了我反而怀疑
最大回撤 峰值到谷值的最大跌幅 控制在10%以内,超过20%直接放弃
胜率 盈利次数 / 总次数 统计套利型胜率在60%-70%比较合理
盈亏比 平均盈利 / 平均亏损 至少1.5:1,低于这个数不值得做
卡玛比率 年化收益 / 最大回撤 比夏普更实用,我主要看这个

你想想看,一个策略年化30%,但最大回撤40%,你敢上仓位吗?反正我不敢。我宁愿要年化15%、回撤5%的策略,睡得着觉。

注意:回测中的最大回撤,实际交易中至少放大1.5倍。因为滑点、流动性、情绪因素都会放大回撤。我吃过这个亏,回测最大回撤8%,实盘干到15%,差点爆仓。

5.4 策略回测框架搭建:别让回测骗了你

回测框架,说白了就是模拟历史交易。但很多人把回测做成了「历史拟合」,结果一上线就崩。我分享一下自己的框架结构。

5.4.1 数据层

数据是回测的命根子。我要求自己做到三点:

  • 数据清洗:剔除异常值、处理缺失值、对齐时间戳
  • 数据频率:基差策略用日线就够了,别用分钟线,噪音太多
  • 数据跨度:至少3年,包含牛熊周期

5.4.2 策略层

把策略逻辑封装成独立的模块。我习惯用类来写:

class BasisStrategy:
    def __init__(self, params):
        self.entry_z = params.get('entry_z', 2.0)  # 开仓阈值
        self.exit_z = params.get('exit_z', 0.5)    # 平仓阈值
        self.stop_loss = params.get('stop_loss', 0.03)  # 止损比例
        
    def generate_signals(self, data):
        # 计算基差和z-score
        data['basis'] = data['spot'] - data['futures']
        data['z_score'] = (data['basis'] - data['basis'].rolling(20).mean()) / data['basis'].rolling(20).std()
        
        # 生成交易信号
        data['signal'] = 0
        data.loc[data['z_score'] > self.entry_z, 'signal'] = -1  # 做空基差
        data.loc[data['z_score'] < -self.entry_z, 'signal'] = 1  # 做多基差
        
        return data

5.4.3 风控层

这一层很多人忽略。我要求每个策略必须包含:

  • 仓位管理:凯利公式或固定比例,别全仓干
  • 止损逻辑:硬止损(价格)和软止损(时间)都要有
  • 资金曲线监控:连续亏损3次,暂停交易

5.4.4 评估层

回测跑完后,别只看收益。我习惯做三件事:

  1. 参数敏感性分析:改变参数,看收益会不会剧烈波动
  2. 样本外测试:留出20%的数据不参与优化,最后验证
  3. 蒙特卡洛模拟:随机打乱交易顺序,看策略的稳定性

我个人习惯:回测跑完后,我会把资金曲线打印出来贴在墙上。每天看一遍,问自己三个问题——这个曲线真实吗?我能承受这个回撤吗?如果实盘亏了,我还能坚持吗?

5.5 核心框架图:基差交易策略体系

下面这张图,是我自己总结的基差交易策略体系。你照着这个框架走,至少不会跑偏。

基差交易策略体系框架 策略分类 统计套利型 事件驱动型 基本面量化型 策略构建流程 逻辑假设 → 数据验证 → 规则设计 → 代码实现 → 压力测试 策略评估指标 年化收益率 最大回撤 胜率 盈亏比 卡玛比率 回测框架搭建 数据层 策略层 风控层 评估层 部署层

这张图的核心逻辑是:分类决定方向,流程保证质量,指标衡量效果,回测验证可行性。四层缺一不可。

我的经验:框架搭好后,先用一个品种跑三个月。别贪多,一个品种跑通了,再扩展到其他品种。我曾经一口气上了10个品种,结果每个都跑得不深,最后全亏了。

好了,基差交易的策略框架就讲到这里。记住一句话:框架是死的,市场是活的。别死守框架,要根据市场变化不断调整。但前提是——你得先有一个框架。