第十七章:基差交易的回测框架
回测框架这东西,说白了就是你的交易策略的「时光机」。我刚开始做基差交易那会儿,总觉得回测就是跑跑历史数据,看看赚不赚钱。后来被市场狠狠教育了几次,才明白——回测框架搭不好,实盘就是送钱。
这一章,我把自己踩过的坑、积累的经验,全部分享给你。从平台搭建到过拟合检验,咱们一步步来。
一、回测平台搭建:地基要稳
我个人习惯用 Python + Pandas + NumPy 搭回测框架。为什么?因为灵活。你想想看,基差交易涉及期货、现货两个市场,数据对齐、价差计算、保证金管理,这些逻辑用现成的回测软件很难完全适配。
核心组件清单:
- 数据层:期货主力合约连续数据、现货指数数据、展期收益率
- 计算层:基差计算、持仓成本、保证金占用
- 策略层:开平仓信号、仓位管理、止损止盈
- 风控层:最大回撤限制、杠杆控制、流动性过滤
嗯,这里要注意:数据对齐是最大的坑。期货有到期日,现货有分红除权,时间戳必须精确到秒。我曾经因为数据没对齐,回测年化收益多算了8个点,实盘直接打脸。
# 一个简单的回测框架骨架
class BasisTradingBacktest:
def __init__(self, futures_data, spot_data):
self.futures = futures_data
self.spot = spot_data
self.basis = self.calc_basis()
def calc_basis(self):
# 基差 = 期货价格 - 现货价格
return self.futures['close'] - self.spot['close']
def run(self, strategy_params):
# 策略逻辑在这里
pass
二、历史数据回测:别被幸存者偏差骗了
回测最怕什么?幸存者偏差。你只看到活下来的品种,那些退市、换月的品种呢?
我建议做三件事:
- 全品种覆盖:不要只选几个好做的品种,把能交易的都跑一遍
- 多周期验证:牛市、熊市、震荡市,每个阶段至少跑3年
- 交易成本实算:滑点、手续费、冲击成本,往大了估
我的经验:回测时把交易成本设成实盘的1.5倍。如果还能赚钱,实盘大概率没问题。如果刚好在盈亏线附近,那基本就是亏钱的命。
三、参数优化:过犹不及
参数优化这事儿,我踩过最大的坑就是「网格搜索」。把参数空间划得密密麻麻,找到一组完美拟合历史数据的参数,结果实盘一跑就崩。
为什么会这样?因为参数优化本质上是在「记忆」历史数据,而不是「学习」市场规律。
我的优化原则:
- 参数不超过3个:越多越容易过拟合
- 步长要粗:比如移动平均线周期,用10、20、30,别用11、12、13
- 稳定性优先:参数微调时,绩效不能剧烈波动
# 参数稳定性检验示例
def stability_test(strategy, param_range):
results = []
for param in param_range:
perf = strategy.run(param=param)
results.append(perf['sharpe'])
# 计算相邻参数绩效的波动率
volatility = np.std(np.diff(results))
return volatility # 越小越稳定
四、过拟合检验:最后的防线
过拟合检验,说白了就是看你的策略是不是「看图说话」。我常用的方法有四种:
| 检验方法 | 怎么做 | 我的标准 |
|---|---|---|
| 样本外测试 | 留出最后20%数据不参与优化 | 样本外夏普比率不低于样本内的70% |
| 蒙特卡洛模拟 | 随机打乱交易信号,重复1000次 | 真实绩效位于前5%分位 |
| 滚动窗口测试 | 每12个月重新优化一次参数 | 参数变化不超过20% |
| 压力测试 | 用极端行情数据(如2015年股灾) | 最大回撤不超过30% |
警告:过拟合检验不是走过场。我曾经有一个策略,样本内夏普2.3,样本外只有0.4。后来发现是参数刚好拟合了某次异常波动。从那以后,我每个策略必须通过至少两种过拟合检验,才敢上实盘。
五、回测框架的核心逻辑图
下面这张图,是我自己总结的回测框架全流程。每次搭新策略,我都会对着这张图走一遍,确保没有遗漏。
这张图里,我最想强调的是「反馈回路」。很多新手做完回测就完事了,其实应该把实盘数据再喂回回测框架,看看策略有没有失效。我每个月都会做一次这样的「回测-实盘对比」,及时发现问题。
最后说一句:回测框架不是一次性工程。随着市场变化,你的框架也要迭代。我自己的框架从第一版到现在,已经重构了4次。每次重构,都是因为发现了新的坑。