Navigation

    Backtrader Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

    Error while running backtest

    General Code/Help
    2
    6
    3233
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      mahbubk9 last edited by

      from __future__ import (absolute_import, division, print_function,
                              unicode_literals)
      
      import datetime  # For datetime objects
      import os.path  # To manage paths
      import sys  # To find out the script name (in argv[0])
      
      # Import the backtrader platform
      import backtrader as bt
      import backtrader.feeds as btfeeds
      
      
      # Create a Stratey
      class TestStrategy(bt.Strategy):
         # params = (
          #    ('maperiod', 15),
          #)
      
          def log(self, txt, dt=None):
              ''' Logging function fot this strategy'''
              dt = dt or self.datas[0].datetime.date(0)
              print('%s, %s' % (dt.isoformat(), txt))
      
          def __init__(self):
              # Keep a reference to the "close" line in the data[0] dataseries
              self.dataclose = self.datas[0].close
      
              # To keep track of pending orders and buy price/commission
              self.order = None
              self.buyprice = None
              self.buycomm = None
      
              # Add a MovingAverageSimple indicator
              self.sma = bt.indicators.SimpleMovingAverage(
                  self.data, period=36)
      
              ''' 
             # Indicators for the plotting show
              bt.indicators.ExponentialMovingAverage(self.datas[0], period=25)
              bt.indicators.WeightedMovingAverage(self.datas[0], period=25,
                                                  subplot=True)
              bt.indicators.StochasticSlow(self.datas[0])
              bt.indicators.MACDHisto(self.datas[0])
              rsi = bt.indicators.RSI(self.datas[0])
              bt.indicators.SmoothedMovingAverage(rsi, period=10)
              bt.indicators.ATR(self.datas[0], plot=False)
              '''
      
          def notify_order(self, order):
              if order.status in [order.Submitted, order.Accepted]:
                  # Buy/Sell order submitted/accepted to/by broker - Nothing to do
                  return
      
              # Check if an order has been completed
              # Attention: broker could reject order if not enougth cash
              if order.status in [order.Completed]:
                  if order.isbuy():
                      self.log(
                          'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                          (order.executed.price,
                           order.executed.value,
                           order.executed.comm))
      
                      self.buyprice = order.executed.price
                      self.buycomm = order.executed.comm
                  else:  # Sell
                      self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                               (order.executed.price,
                                order.executed.value,
                                order.executed.comm))
      
                  self.bar_executed = len(self)
      
              elif order.status in [order.Canceled, order.Margin, order.Rejected]:
                  self.log('Order Canceled/Margin/Rejected')
      
              # Write down: no pending order
              self.order = None
      
          def notify_trade(self, trade):
              if not trade.isclosed:
                  return
      
              self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
                       (trade.pnl, trade.pnlcomm))
      
          def next(self):
              # Simply log the closing price of the series from the reference
              self.log('Close, %.2f' % self.dataclose[0])
      
              # Check if an order is pending ... if yes, we cannot send a 2nd one
              if self.order:
                  return
      
              # Check if we are in the market
              if not self.position:
      
                  # Not yet ... we MIGHT BUY if ...
                  if self.dataclose[0] > self.sma[0]:
      
                      # BUY, BUY, BUY!!! (with all possible default parameters)
                      self.log('BUY CREATE, %.2f' % self.dataclose[0])
      
                      # Keep track of the created order to avoid a 2nd order
                      self.order = self.buy()
      
              else:
      
                  if self.dataclose[0] < self.sma[0]:
                      # SELL, SELL, SELL!!! (with all possible default parameters)
                      self.log('SELL CREATE, %.2f' % self.dataclose[0])
      
                      # Keep track of the created order to avoid a 2nd order
                      self.order = self.sell()
      
      
      if __name__ == '__main__':
          # Create a cerebro entity
          cerebro = bt.Cerebro()
      
          # Add a strategy
          cerebro.addstrategy(TestStrategy)
      
          # Datas are in a subfolder of the samples. Need to find where the script is
          # because it could have been called from anywhere
          modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
          datapath = os.path.join(modpath, 'data/msft dt.csv')
          
          data = btfeeds.YahooFinanceCSVData(
                  
                  
                  dataname=datapath,
                  reversed=True,
                  fromdate=datetime.datetime(2016, 4, 1),
                  todate=datetime.datetime(2016, 12, 30),
                  timeframe=bt.TimeFrame.Days,
                  compression=1,
                  name='msft'
                  )
      
        
          
      
          # Add the Data Feed to Cerebro
          cerebro.adddata(data)
      
          # Set our desired cash start
          cerebro.broker.setcash(1000.0)
      
          # Add a FixedSize sizer according to the stake
          cerebro.addsizer(bt.sizers.FixedSize, stake=10)
      
          # Set the commission
          cerebro.broker.setcommission(commission=0.0)
      
          # Print out the starting conditions
          print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
      
          # Run over everything
          cerebro.run()
      
          # Print out the final result
          print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
      
          # Plot the result
          #cerebro.plot()
      
      

      Getting this error msg:

      dst[i] = math.fsum(src[i - period + 1:i + 1]) / period
      
      IndexError: array assignment index out of range
      

      Please help!

      B 1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators @mahbubk9 last edited by

        @mahbubk9 said in Error while running backtest:

        dst[i] = math.fsum(src[i - period + 1:i + 1]) / period

        That shows that not enough data was available for the calculation of the moving average.

        An educated guess is that you are running a version which no longer can download data from Yahoo (See. Community - AttributeError: 'NoneType' object has no attribute 'close')

        You can also:

        • Use cerebro.run(runonce=False) to run in step by step mode. This avoids the batch calculation.
        • Print data values (for example close) from prenext in the strategy (before all indicators can be calculated). If the assumption from above is true, you won't have any data.

        Trying the same data source with a clean script which is only aimed at printing data (with no indicators) will probably clear most doubts about the suspicions from above.

        1 Reply Last reply Reply Quote 0
        • M
          mahbubk9 last edited by

          Thanks,
          I tried running the same script with commenting out indicator line, works fine, no error code.
          Also, having same issue with my saved data in hard drive and data loading using btfeeds.GenericCSVData, some thing wrong with indicators?

          1 Reply Last reply Reply Quote 0
          • B
            backtrader administrators last edited by

            Without knowing (because there is no output) which data (and how much) is being loaded, there is no way to assess what may be going wrong. The error clearly shows that not enough data was loaded for a moving average of period 36. How much data you actually managed to load can only be checked by yourself.

            1 Reply Last reply Reply Quote 0
            • M
              mahbubk9 last edited by

              Hi,
              Could you please elaborate, how to print data values from prenext in the strategy.
              Thanks

              1 Reply Last reply Reply Quote 0
              • B
                backtrader administrators last edited by

                The same way as you do it in next. It's simply called before the minimum period calculated for the indicators is met.

                1 Reply Last reply Reply Quote 0
                • 1 / 1
                • First post
                  Last post
                Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors