这个问题通常是由于使用了较旧版本的 Matplotlib 或 Pandas.Locators 中的 RRuleLocator 导致的。解决方法是升级 Matplotlib 和 Pandas.Locators 到最新版本。如果你不想升级这些库,也可以手动更改一下使用 RRuleLocator 的部分代码,将 RRuleLocator 更改为 DateFormatter 或其他 Locator 类型。以下是一个使用 DateFormatter 的示例代码:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import backtrader as bt
class MyStrategy(bt.Strategy):
def __init__(self):
self.dataclose = self.datas[0].close
def next(self):
self.log('Close: %.2f' % self.dataclose[0])
if __name__ == '__main__':
cerebro = bt.Cerebro()
# Create a Data Feed
data = bt.feeds.YahooFinanceData(dataname='AAPL',
fromdate=datetime.datetime(2010, 1, 1),
todate=datetime.datetime(2017, 1, 1))
cerebro.adddata(data)
# Set our desired cash start
cerebro.broker.setcash(100000.0)
# Add the strategy
cerebro.addstrategy(MyStrategy)
# Add the analyzers we are interested in
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='mysharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='tradeanalyzer')
# Run over everything
results = cerebro.run()
# Print Analyzers
print(f'Sharpe Ratio: {results[0].analyzers.mysharpe.get_analysis()}')
print(f'Max Drawdown: {results[0].analyzers.drawdown.get_analysis()}')
print(f'Trade Analyzer: {results[0].analyzers.tradeanalyzer.get_analysis()}')
# Plot the result
plt.rcParams['figure.figsize'] = [15, 8]
plt.rcParams['figure.dpi'] = 200
plt.rcParams['savefig.dpi'] = 300
cerebro.plot(style='candlestick',
barup='green',
bardown='red',
fmt_x_ticks='%Y-%m-%d',
fmt_x_data='%Y-%m-%d',
xrotation=45,
numfigs=1)
在这个示例代码中,我们使用 DateFormatter