📊 什么是 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,我们来学参数优化——找到最好的均线参数!