我的代码附在下面,带有示例输出。我正在尝试绘制我的策略的交易,但它们在输出中显示得很奇怪。买入/卖出标记有时不在曲线上,只是漂浮在空间中。这让我觉得我的数据有错误。你知道为什么会这样吗?
import backtrader as bt
import backtrader.analyzers as btanalyzers
import matplotlib
from datetime import datetime
class MaCrossStrategy(bt.Strategy):
params = (
('fast_length', 5),
('slow_length', 25)
)
def __init__(self):
self.crossovers = []
for d in self.datas:
ma_fast = bt.ind.SMA(d, period = self.params.fast_length)
ma_slow = bt.ind.SMA(d, period = self.params.slow_length)
self.crossovers.append(bt.ind.CrossOver(ma_fast, ma_slow))
def next(self):
for i, d in enumerate(self.datas):
if not self.getposition(d).size:
if self.crossovers[i] > 0:
self.buy(data = d)
elif self.crossovers[i] < 0:
self.close(data = d)
cerebro = bt.Cerebro()
stocks = ['SPY', 'QQQ', 'VOO']
for s in stocks:
data = bt.feeds.YahooFinanceData(dataname = s, fromdate = datetime(2010, 1, 1), todate = datetime(2020, 1, 1))
cerebro.adddata(data, name = s)
cerebro.addstrategy(MaCrossStrategy)
cerebro.broker.setcash(1000000.0)
cerebro.addsizer(bt.sizers.PercentSizer, percents = 10)
cerebro.addanalyzer(btanalyzers.SharpeRatio, _name = "sharpe")
cerebro.addanalyzer(btanalyzers.Returns, _name = "returns")
cerebro.addanalyzer(btanalyzers.Transactions, _name = "trans")
back = cerebro.run()
cerebro.broker.getvalue()
back[0].analyzers.returns.get_analysis()['rnorm100']
back[0].analyzers.sharpe.get_analysis()
back[0].analyzers.trans.get_analysis()
cerebro.plot(style='candlestick')