Backtrader入门:专业的量化回测框架

📊 什么是 Backtrader?

Backtrader是Python里最流行的量化回测框架,可以:

  • 📈 历史数据回测
  • 💰 模拟实盘交易
  • 📊 分析策略表现
  • 🔧 参数优化

👨‍💻 安装

pip install backtrader

📝 第一个策略

import backtrader as bt

# 继承bt.Strategy
class MyStrategy(bt.Strategy):

    def __init__(self):
        # 计算5日和20日均线
        self.ma5 = bt.indicators.SimpleMovingAverage(
            self.data.close, period=5)
        self.ma20 = bt.indicators.SimpleMovingAverage(
            self.data.close, period=20)

        # 金叉死叉信号
        self.crossover = bt.indicators.CrossOver(self.ma5, self.ma20)

    def next(self):
        # 金叉买入
        if self.crossover > 0:
            self.buy()

        # 死叉卖出
        elif self.crossover 

🚀 运行回测

import backtrader as bt

# 创建大脑
cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(MyStrategy)

# 加载数据(需要先下载数据)
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)

# 设置初始资金
cerebro.broker.setcash(100000)

# 运行
cerebro.run()

# 最终资金
print(f"最终资金: {cerebro.broker.getvalue():.2f}")

💡 完整例子

import backtrader as bt
import akshare as ak
import pandas as pd

# 获取数据
df = ak.stock_zh_a_hist(symbol="600519", adjust="qfq")
df = df[["日期", "开盘", "最高", "最低", "收盘", "成交量"]]
df.columns = ["datetime", "open", "high", "low", "close", "volume"]
df["datetime"] = pd.to_datetime(df["datetime"])
df = df.set_index("datetime")

# 转为Backtrader格式
data = bt.feeds.PandasData(dataname=df)

# 双均线策略
class MaCrossStrategy(bt.Strategy):
    params = (("ma1", 5), ("ma2", 20),)

    def __init__(self):
        self.ma1 = bt.indicators.SimpleMovingAverage(
            self.data.close, period=self.params.ma1)
        self.ma2 = bt.indicators.SimpleMovingAverage(
            self.data.close, period=self.params.ma2)
        self.crossover = bt.indicators.CrossOver(self.ma1, self.ma2)

    def next(self):
        if self.crossover > 0:
            self.buy()
        elif self.crossover 

📊 分析工具

# 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name="sharpe")
cerebro.addanalyzer(bt.analyzers.DrawDown, _name="dd")

# 运行
results = cerebro.run()

# 查看结果
sharpe = results[0].analyzers.sharpe.get_analysis()
print(f"夏普比率: {sharpe[sharperatio]}")

dd = results[0].analyzers.dd.get_analysis()
print(f"最大回撤: {dd[max][drawdown]}%")

⚠️ 注意事项

  • 📊 数据需要正确格式
  • 💡 建议先在模拟数据上测试
  • 🔧 注意过拟合问题

📚 下一课

学会了Backtrader,我们来学参数优化——找到最好的均线参数!

发表评论