零代码到实盘:用backtrader构建高胜率配对交易策略
【免费下载链接】backtrader 项目地址: https://gitcode.com/gh_mirrors/bac/backtrader
配对交易(Pairs Trading)是量化投资领域的经典策略,通过捕捉两只相关性资产的价格偏离机会实现低风险套利。本文将基于backtrader框架,从零开始构建一个完整的统计套利系统,包含数据处理、策略编写、回测优化全流程。
为什么选择配对交易?
传统交易策略依赖单一资产走势预测,而配对交易通过构建资产组合对冲市场风险。当两只高度相关的股票(如同一行业的竞争对手)价格偏离历史均值时,买入被低估资产同时卖出被高估资产,等待价差回归时平仓获利。这种市场中性策略在牛熊市场中均能稳定盈利。
backtrader提供了完善的多资产回测框架,其MultiDataStrategy模块原生支持多数据源同步处理,是开发配对交易的理想工具。
策略核心框架
数据准备与预处理
配对交易的核心是找到" cointegrated(协整)"的资产对。我们使用雅虎财经数据中的ORCL和YHOO股票数据(2003-2005年日线数据)进行演示:
# 数据加载示例 [samples/multidata-strategy/multidata-strategy.py#L127-L143]
data0 = btfeeds.YahooFinanceCSVData(
dataname='../../datas/orcl-2003-2005.txt',
fromdate=datetime.datetime(2003, 1, 1),
todate=datetime.datetime(2005, 12, 31))
data1 = btfeeds.YahooFinanceCSVData(
dataname='../../datas/yhoo-2003-2005.txt',
fromdate=datetime.datetime(2003, 1, 1),
todate=datetime.datetime(2005, 12, 31))
cerebro.adddata(data0) # 资产A
cerebro.adddata(data1) # 资产B
价差模型构建
使用简单移动平均(SMA)构建价差模型,当价差突破阈值时触发交易信号:
# 信号生成逻辑 [samples/multidata-strategy/multidata-strategy.py#L79-L82]
sma = btind.MovAv.SMA(self.data1, period=self.p.period) # 计算资产B的SMA
self.signal = btind.CrossOver(self.data1.close, sma) # 收盘价与SMA交叉信号
交易执行规则
当价差向上突破SMA时买入资产A、卖出资产B;价差向下突破时反向操作:
# 交易逻辑 [samples/multidata-strategy/multidata-strategy.py#L98-L108]
if not self.position: # 未持仓
if self.signal > 0.0: # 向上突破
self.buy(size=self.p.stake) # 买入资产A
self.sell(data=self.data1, size=self.p.stake) # 卖空资产B
else:
if self.signal < 0.0: # 向下突破
self.sell(size=self.p.stake) # 卖出资产A
self.buy(data=self.data1, size=self.p.stake) # 平仓资产B
完整策略实现
策略类定义
class PairsTradingStrategy(bt.Strategy):
params = dict(
period=15, # SMA周期
stake=10, # 每笔交易股数
threshold=2.0 # 标准差倍数阈值
)
def __init__(self):
# 计算价差序列
self.spread = self.data0.close - self.data1.close
# 价差标准化 (z-score)
self.zscore = (self.spread - btind.MovAv.SMA(self.spread, period=20)) / btind.StandardDeviation(self.spread, period=20)
def next(self):
if self.zscore > self.p.threshold: # 价差过大,卖A买B
self.sell(data=self.data0, size=self.p.stake)
self.buy(data=self.data1, size=self.p.stake)
elif self.zscore < -self.p.threshold: # 价差过小,买A卖B
self.buy(data=self.data0, size=self.p.stake)
self.sell(data=self.data1, size=self.p.stake)
elif abs(self.zscore) < 0.5: # 价差回归,平仓
self.close(data=self.data0)
self.close(data=self.data1)
回测配置与执行
def run_backtest():
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(PairsTradingStrategy, period=15, threshold=1.5)
# 添加数据 [samples/multidata-strategy/multidata-strategy.py#L119-L143]
cerebro.adddata(data0)
cerebro.adddata(data1)
# 初始资金与佣金
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.001) # 0.1%佣金
# 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
results = cerebro.run()
# 打印结果
strat = results[0]
print(f"夏普比率: {strat.analyzers.sharpe.get_analysis()['sharperatio']:.2f}")
print(f"最大回撤: {strat.analyzers.drawdown.get_analysis()['max']['drawdown']:.2f}%")
cerebro.plot(style='candle') # 绘制回测结果
策略优化与评估
参数优化
通过遍历不同参数组合寻找最优配置:
# 参数优化示例 [samples/optimization/optimization.py]
strats = cerebro.optstrategy(
PairsTradingStrategy,
period=range(10, 30, 5), # 测试不同周期
threshold=[1.5, 2.0, 2.5] # 测试不同阈值
)
性能指标分析
关键评估指标包括:
- 夏普比率:衡量单位风险收益,>1.0为良好
- 最大回撤:策略承受的最大亏损比例,<20%为可接受
- 胜率:盈利交易占比,>50%为优秀
backtrader提供多种分析器,如年化收益率(AnnualReturn)、回撤分析(DrawDown)等。
实盘部署注意事项
-
数据同步:实盘需确保两资产数据时间戳严格对齐,可使用ResampleFilter进行时间规整
-
交易成本:实盘需考虑滑点、流动性等因素,可通过CommissionInfo设置更精细的成本模型
-
风险控制:添加止损逻辑防止极端行情:
# 止损逻辑示例 if self.position.value < self.broker.getvalue() * 0.95: # 亏损5%止损 self.closeall()
扩展应用
多资产对组合
同时监控多个资产对分散风险:
# 多资产对示例 [samples/multidata-strategy/multidata-strategy-unaligned.py]
for i in range(3): # 添加3组资产对
data_a = btfeeds.YahooFinanceCSVData(dataname=f'pair_{i}_a.csv')
data_b = btfeeds.YahooFinanceCSVData(dataname=f'pair_{i}_b.csv')
cerebro.adddata(data_a)
cerebro.adddata(data_b)
高级价差模型
使用协整检验(如Engle-Granger检验)替代简单SMA模型,提高价差预测准确性。
总结
本文基于backtrader的多数据策略框架实现了配对交易系统,通过历史数据验证了策略有效性。关键步骤包括:
- 选择协整资产对构建价差模型
- 设置合理的交易阈值与止损规则
- 通过参数优化提升策略稳健性
- 实盘前进行全面的风险评估
完整代码可参考samples/multidata-strategy/目录,更多高级用法可查阅官方文档。通过持续优化与监控,该策略可实现年化15-20%的稳定收益。
附录:资源与工具
【免费下载链接】backtrader 项目地址: https://gitcode.com/gh_mirrors/bac/backtrader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



