用Backtrader实现经典策略(如均线交叉)并回测
使用backtrader回测
import pandas as pd import numpy as np import akshare as ak import backtrader as bt import matplotlib.pyplot as plt
akshare 获取行情
futures_zh_minute_sina_df = ak.futures_zh_minute_sina(symbol="RB0", period="1").set_index('datetime') futures_zh_minute_sina_df.index = pd.to_datetime(futures_zh_minute_sina_df.index) print(futures_zh_minute_sina_df.index.dtype)
双均线策略
class MAcrossStrategy(bt.Strategy): params= (('short_period', 10), ('long_period', 30)) def __init__(self): self.sma_short = bt.indicators.SMA(self.data.close, period=self.p.short_period) self.sma_long = bt.indicators.SMA(self.data.close, period=self.p.long_period) self.crossover = bt.indicators.CrossOver(self.sma_short, self.sma_long) def next(self): if not self.position: if self.crossover > 0: self.buy() else: if self.crossover < 0: self.sell()
回测
feed = bt.feeds.PandasData(dataname = futures_zh_minute_sina_df.dropna()) cerebro = bt.Cerebro() cerebro.adddata(feed) cerebro.addstrategy(MAcrossStrategy) cerebro.broker.setcash(1000000) cerebro.broker.setcommission(commission=0.00001) cerebro.addsizer(bt.sizers.FixedSize, stake=100) cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe') cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown') cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades') print(f'初始资金: {cerebro.broker.getvalue():.2f}') cerebro.run() print(f'最终资金: {cerebro.broker.getvalue():.2f}') print(f"持仓数量: {cerebro.broker.getposition(data=feed).size}") plt.plot([1]) # 触发环境初始化 plt.close() # 关闭空白图避免干扰 cerebro.plot() # cerebro.plot(style='candle', volume=False)
初始资金: 1000000.00 最终资金: 1001170.37 持仓数量: 100

浙公网安备 33010602011771号