0

我的代码附在下面,带有示例输出。我正在尝试绘制我的策略的交易,但它们在输出中显示得很奇怪。买入/卖出标记有时不在曲线上,只是漂浮在空间中。这让我觉得我的数据有错误。你知道为什么会这样吗? 在此处输入图像描述

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')
4

1 回答 1

0

我已经确定错误出在数据中,或者反向交易者 Yahoo.py 在进行在线拉取时如何处理它。手动下载数据并使用 YahooFinanceCSVData() 打开时,不会发生错误。在线数据收集版本 YahooFinanceData() 已经存在一个已知问题,这可能与此有关。

于 2021-09-20T22:59:20.917 回答