用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

posted @ 2025-03-31 22:11  vhao11  阅读(214)  评论(0)    收藏  举报