5、基差交易策略框架:策略分类、策略构建流程、策略评估指标、策略回测框架搭建
做基差交易这些年,我最大的感触就是——没有框架,就像在迷雾里开车。你明明知道基差会回归,但什么时候回归?回归多少?仓位怎么配?这些没想清楚,赚了是运气,亏了是必然。
这一章,我把自己的策略框架拆开给你看。从分类到构建,从评估到回测,一条线串下来。你照着这个框架走,至少能少踩80%的坑。
5.1 策略分类:先搞清楚你在赚什么钱
基差交易策略,说白了就三大类。我习惯按驱动逻辑来分,而不是按品种或周期。
| 策略类型 | 核心逻辑 | 典型场景 | 我踩过的坑 |
|---|---|---|---|
| 统计套利型 | 基差偏离历史均值,赌回归 | 螺纹钢近远月价差、铜期现价差 | 曾经在2016年做空螺纹基差,结果供给侧改革一来,基差直接翻倍 |
| 事件驱动型 | 交割规则、库存变化、政策扰动 | 交割月前基差收敛、仓单注销 | 有一次没算清楚交割成本,差点被逼仓 |
| 基本面量化型 | 用供需数据预测基差方向 | 库存+利润+基差的联动模型 | 数据频率不匹配,日度库存配分钟级基差,结果全是噪音 |
你想想看,这三种策略的胜率来源完全不同。统计套利靠的是概率,事件驱动靠的是信息差,基本面量化靠的是模型精度。千万别混为一谈。
我个人习惯:把80%的资金放在统计套利上,20%做事件驱动。为什么?因为统计套利可复制、可加仓,而事件驱动机会少、容量小。
5.2 策略构建流程:从想法到代码
很多新手一上来就写代码,这是大忌。我自己的流程分五步,每一步都有明确产出。
- 逻辑假设:写下你的核心假设。比如「基差超过2倍标准差后,大概率在5天内回归」。
- 数据验证:拉出历史数据,肉眼看一下。别急着跑模型,先画图。
- 规则设计:开仓条件、平仓条件、止损条件、仓位管理。缺一不可。
- 代码实现:把规则翻译成代码。我建议用Python,pandas+backtrader够用了。
- 压力测试:换品种、换时间、换参数。看看策略会不会崩。
嗯,这里要注意——第二步最容易被跳过。我曾经有个策略,回测年化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 评估层
回测跑完后,别只看收益。我习惯做三件事:
- 参数敏感性分析:改变参数,看收益会不会剧烈波动
- 样本外测试:留出20%的数据不参与优化,最后验证
- 蒙特卡洛模拟:随机打乱交易顺序,看策略的稳定性
我个人习惯:回测跑完后,我会把资金曲线打印出来贴在墙上。每天看一遍,问自己三个问题——这个曲线真实吗?我能承受这个回撤吗?如果实盘亏了,我还能坚持吗?
5.5 核心框架图:基差交易策略体系
下面这张图,是我自己总结的基差交易策略体系。你照着这个框架走,至少不会跑偏。
这张图的核心逻辑是:分类决定方向,流程保证质量,指标衡量效果,回测验证可行性。四层缺一不可。
我的经验:框架搭好后,先用一个品种跑三个月。别贪多,一个品种跑通了,再扩展到其他品种。我曾经一口气上了10个品种,结果每个都跑得不深,最后全亏了。
好了,基差交易的策略框架就讲到这里。记住一句话:框架是死的,市场是活的。别死守框架,要根据市场变化不断调整。但前提是——你得先有一个框架。