2. Backtrader 基础回顾
在深入 Spark 集成之前,必须牢固掌握 Backtrader 的核心概念与回测流程。Backtrader 是一个事件驱动的回测框架,其设计围绕四个核心组件展开:Cerebro(大脑)、Strategy(策略)、DataFeed(数据源)和 Order(订单)。理解这些组件如何协同工作,是构建高效量化回测系统的基础。
2.1 核心概念详解
| 组件 | 角色 | 关键职责 |
|---|---|---|
| Cerebro | 引擎/控制器 | 协调数据加载、策略执行、订单撮合、结果输出 |
| Strategy | 交易逻辑 | 定义买入/卖出信号、仓位管理、风险控制 |
| DataFeed | 数据输入 | 提供历史价格、成交量、指标数据 |
| Order | 交易指令 | 描述买卖方向、数量、价格类型(市价/限价) |
核心要点: Cerebro 是 Backtrader 的“操作系统”,Strategy 是“应用程序”,DataFeed 是“输入设备”,Order 是“执行指令”。四者缺一不可。
2.1.1 Cerebro — 回测引擎
Cerebro 是 Backtrader 的中央控制器。它负责:
- 注册数据源: 通过
cerebro.adddata()加载一个或多个 DataFeed。 - 添加策略: 通过
cerebro.addstrategy()注册自定义 Strategy 类。 - 设置初始资金:
cerebro.broker.setcash(100000.0)。 - 运行回测:
cerebro.run()启动事件循环。 - 输出结果:
cerebro.plot()生成图表,cerebro.plotter()获取分析报告。
2.1.2 Strategy — 策略核心
Strategy 是用户自定义的类,必须继承 bt.Strategy。核心生命周期方法:
__init__():初始化指标、参数、变量。next():每个 bar 调用一次,在此编写交易逻辑。notify_order(order):订单状态变化时回调。notify_trade(trade):交易完成时回调。
import backtrader as bt
class MyStrategy(bt.Strategy):
params = (('sma_period', 20),)
def __init__(self):
self.sma = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.sma_period)
def next(self):
if not self.position:
if self.data.close[0] > self.sma[0]:
self.buy(size=100)
elif self.data.close[0] < self.sma[0]:
self.sell(size=100)
2.1.3 DataFeed — 数据源
DataFeed 是 Backtrader 的数据抽象层。支持多种数据格式:
- CSV 文件:
bt.feeds.GenericCSVData,最常用。 - Pandas DataFrame:
bt.feeds.PandasData,适合与 Spark 集成。 - 在线 API: Yahoo Finance、Alpha Vantage 等。
- 自定义 DataFeed: 继承
bt.feeds.DataBase实现。
最佳实践: 在 Spark 集成场景中,优先使用
PandasData,因为 Spark DataFrame 可以轻松转换为 Pandas DataFrame,实现无缝对接。
2.1.4 Order — 订单管理
Backtrader 支持多种订单类型:
| 订单类型 | 说明 | 使用场景 |
|---|---|---|
MarketOrder |
市价单,立即以当前价格成交 | 高流动性、快速执行 |
LimitOrder |
限价单,指定价格或更优价格成交 | 控制滑点、等待特定价格 |
StopOrder |
止损单,价格触及止损价后转为市价单 | 风险控制、止损离场 |
StopLimitOrder |
止损限价单,结合止损和限价 | 精确控制止损价格区间 |
2.2 回测流程
一个标准的 Backtrader 回测流程包含以下 6 个步骤:
- 准备数据: 加载历史数据(CSV、DataFrame 等)。
- 创建 Cerebro 实例: 初始化回测引擎。
- 配置策略与数据: 添加 Strategy 和 DataFeed。
- 设置初始条件: 资金、佣金、滑点等。
- 运行回测: 调用
cerebro.run()。 - 分析结果: 查看收益率、夏普比率、最大回撤等。
常见陷阱: 初学者容易忽略
cerebro.addanalyzer() 来注册分析器,导致无法获取回测绩效指标。务必在 run() 之前添加分析器。
import backtrader as bt
# 1. 准备数据
data = bt.feeds.PandasData(dataname=df)
# 2. 创建 Cerebro
cerebro = bt.Cerebro()
# 3. 添加策略和数据
cerebro.addstrategy(MyStrategy)
cerebro.adddata(data)
# 4. 设置初始条件
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.001)
# 5. 运行回测
results = cerebro.run()
# 6. 分析结果
cerebro.plot()
2.3 常见应用场景
Backtrader 广泛应用于以下场景:
- 趋势跟踪策略: 基于移动平均线、MACD、布林带等指标。
- 均值回归策略: 利用 RSI、布林带宽度等判断超买超卖。
- 多资产组合回测: 同时回测股票、期货、ETF 等。
- 参数优化: 使用
cerebro.optstrategy()进行网格搜索。 - 实盘模拟: 通过
cerebro.live模式连接真实行情。
课程关联: 本章后续将展示如何将 Backtrader 的回测流程与 Spark 的大数据处理能力结合,实现大规模并行回测和参数优化。