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 个步骤:

  1. 准备数据: 加载历史数据(CSV、DataFrame 等)。
  2. 创建 Cerebro 实例: 初始化回测引擎。
  3. 配置策略与数据: 添加 Strategy 和 DataFeed。
  4. 设置初始条件: 资金、佣金、滑点等。
  5. 运行回测: 调用 cerebro.run()。
  6. 分析结果: 查看收益率、夏普比率、最大回撤等。
常见陷阱: 初学者容易忽略 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 的大数据处理能力结合,实现大规模并行回测和参数优化。
Backtrader 核心组件架构图 Cerebro 回测引擎 Strategy 交易逻辑 DataFeed 数据源 Order 订单管理 Broker 资金/佣金/滑点 大脑:协调所有组件 Backtrader 回测流程 1. 准备数据 2. 创建Cerebro 3. 配置策略 4. 设置条件 5. 运行回测 6. 分析结果 关键提示 步骤 3 和 4 的顺序可互换,但必须在 run() 之前完成 步骤 6 可通过 addanalyzer() 扩展更多绩效指标