簡體   English   中英

'Lines_LineSeries_LineIterator_DataAccessor_Strateg' object 沒有屬性 'self'

[英]'Lines_LineSeries_LineIterator_DataAccessor_Strateg' object has no attribute 'self'

每個人!

我試圖用 backtrader 復制其中一種策略用於練習目的,但當我嘗試運行它時收到此消息:'Lines_LineSeries_LineIterator_DataAccessor_Strateg'object 沒有屬性'self'。

我想在 RSI 高於 30 且 SMA(14) 向上穿過 SMA (50) 時買入,當 RSI 低於 70 且 SMA(14) 向下穿過 SMA (50) 時賣出。

你能幫我找出錯誤在哪里嗎?我該如何解決? 非常感謝你!

請看下面我的代碼:

´´´

class RSI_SMA_Strategy(bt.Strategy):
    params = dict(rsi_periods=21, rsi_upper=70, 
                  rsi_lower=30, rsi_mid=50,
                 sma_periods=14, sma_periods2=50)

    def __init__(self):
        # keep track of close price in the series
        self.data_close = self.datas[0].close
        self.data_open = self.datas[0].open

        # keep track of pending orders/buy price/buy commission
        self.order = None
        self.price = None
        self.comm = None

        # initializing rsi and sma
        self.rsi = bt.indicators.RSI(self.datas[0], period=self.p.rsi_periods)
        
        self.sma14=bt.ind.SMA(self.datas[0], period=self.params.sma_periods)
        self.sma50=bt.ind.SMA(self.datas[0], period=self.params.sma_periods2)
        
        self.rsi_signal_long_buy = bt.ind.CrossUp(self.rsi, self.p.rsi_lower)
        self.rsi_signal_long_exit = bt.ind.CrossUp(self.rsi, self.p.rsi_mid)
        self.rsi_signal_short = bt.ind.CrossDown(self.rsi, self.p.rsi_upper)

    def log(self, txt):
        '''Logging function'''
        dt = self.datas[0].datetime.date(0).isoformat()
        print(f'{dt}, {txt}')

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            # order already submitted/accepted - no action required
            return

        # report executed order
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(
                    f'BUY EXECUTED --- Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}, Commission: {order.executed.comm:.2f}'
                )
                self.price = order.executed.price
                self.comm = order.executed.comm
            else:
                self.log(
                    f'SELL EXECUTED --- Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}, Commission: {order.executed.comm:.2f}'
                )

        # report failed order
        elif order.status in [order.Canceled, order.Margin, 
                              order.Rejected]:
            self.log('Order Failed')

        # set no pending order
        self.order = None

    def notify_trade(self, trade):
        if not trade.isclosed:
            return

        self.log(f'OPERATION RESULT --- Gross: {trade.pnl:.2f}, Net: {trade.pnlcomm:.2f}')

    def next_open(self):
        if not self.position:
            if self.rsi > 30 and self.self.sma14 > self.self.sma50:
                # calculate the max number of shares ('all-in')
                size = int(self.broker.getcash() / self.datas[0].open)
                # buy condition
                self.log(f'BUY CREATED --- Size: {size}, Cash: {self.broker.getcash():.2f}, Open: {self.data_open[0]}, Close: {self.data_close[0]}')
                self.buy(size=size)
        else:
            if self.rsi < 70 and self.self.sma14 < self.self.sma50:
                # sell order
                self.log(f'SELL CREATED --- Size: {self.position.size}')
                self.sell(size=self.position.size)
                
data = bt.feeds.PandasData(dataname=yf.download('MSFT', '2018-01-01', '2018-12-31'))


cerebro = bt.Cerebro(stdstats = False, cheat_on_open=True)

cerebro.addstrategy(RSI_SMA_Strategy)
cerebro.adddata(data)
cerebro.broker.setcash(10000.0)
cerebro.broker.setcommission(commission=0.002)
cerebro.addobserver(bt.observers.BuySell)
cerebro.addobserver(bt.observers.Value)
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='time_return')

print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
backtest_result = cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

´´´

您的問題來自 class 定義末尾的self.self.sma14self.self.sma50行。 它們應該是self.sma14self.sma50

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM