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/

    ValueError: zero-size array to reduction operation maximum which has no identity

    General Code/Help
    2
    6
    3239
    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.
    • John Hegstrom
      John Hegstrom last edited by

      I am a bit of a newb to backtrader and I have bit off a bit more than I can easily chew. I have constructed a pair trading script that uses multiple data feeds for various pairs. For some pairs, all seems to be well. for others, I get ValueError: zero-size array to reduction operation maximum which has no identity.

      My init function is:

          def __init__(self):
              # To control operation entries
              
              self.upper_limit = self.p.upper
              self.lower_limit = self.p.lower
              self.up_medium = self.p.up_medium
              self.low_medium = self.p.low_medium
      
              self.qty1 = dict()
              self.qty2 = dict()
              self.portfolio_value = dict()
              self.status = dict()
              self.transform = dict()
              self.zscore = dict()
              for i, d in enumerate(self.datas[::2]):
                  # d1 = self.datas[2 * i + 1]
                  
                  self.orderid = None
                  self.qty1[i] = self.p.qty1
                  self.qty2[i] = self.p.qty2
                  self.status[i] = self.p.status
                  self.portfolio_value[i] = self.p.portfolio_value
              # Signals performed with PD.OLS :
                  
                  self.transform[i] = btind.OLS_TransformationN(self.datas[2 * i], self.datas[2 * i + 1],
                                                     period=self.p.period)
                  self.zscore[i] = self.transform[i].zscore
      

      The full error stack is :

      Traceback (most recent call last):
        File "C:\Users\john\Anaconda3\lib\pdb.py", line 1701, in main
          pdb._runscript(mainpyfile)
        File "C:\Users\john\Anaconda3\lib\pdb.py", line 1570, in _runscript
          self.run(statement)
        File "C:\Users\john\Anaconda3\lib\bdb.py", line 585, in run
          exec(cmd, globals, locals)
        File "<string>", line 1, in <module>
        File "c:\users\john\onedrive\documents\pair\models\pair_bt_test2.py", line 274, in <module>
          runstrategy()
        File "c:\users\john\onedrive\documents\pair\models\pair_bt_test2.py", line 232, in runstrategy
          for i,p in enumerate(pairs):
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1127, in run
          runstrat = self.runstrategies(iterstrat)
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1298, in runstrategies
          self._runnext(runstrats)
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1630, in _runnext
          strat._next()
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\strategy.py", line 347, in _next
          super(Strategy, self)._next()
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\lineiterator.py", line 263, in _next
          indicator._next()
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\lineiterator.py", line 263, in _next
          indicator._next()
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\lineiterator.py", line 282, in _next
          self.nextstart()  # only called for the 1st value
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\lineiterator.py", line 347, in nextstart
          self.next()
        File "C:\Users\john\Anaconda3\lib\site-packages\backtrader\indicators\ols.py", line 58, in next
          slope, intercept = sm.OLS(p0, p1).fit().params
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\regression\linear_model.py", line 838, in __init__
          hasconst=hasconst, **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\regression\linear_model.py", line 684, in __init__
          weights=weights, hasconst=hasconst, **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\regression\linear_model.py", line 196, in __init__
          super(RegressionModel, self).__init__(endog, exog, **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\base\model.py", line 216, in __init__
          super(LikelihoodModel, self).__init__(endog, exog, **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\base\model.py", line 68, in __init__
          **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\base\model.py", line 91, in _handle_data
          data = handle_data(endog, exog, missing, hasconst, **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\base\data.py", line 635, in handle_data
          **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\base\data.py", line 80, in __init__
          self._handle_constant(hasconst)
        File "C:\Users\john\Anaconda3\lib\site-packages\statsmodels\base\data.py", line 124, in _handle_constant
          ptp_ = np.ptp(self.exog, axis=0)
        File "C:\Users\john\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py", line 2390, in ptp
          return _methods._ptp(a, axis=axis, out=out, **kwargs)
        File "C:\Users\john\Anaconda3\lib\site-packages\numpy\core\_methods.py", line 153, in _ptp
          umr_maximum(a, axis, None, out, keepdims),
      ValueError: zero-size array to reduction operation maximum which has no identity
      
      John Hegstrom 1 Reply Last reply Reply Quote 0
      • John Hegstrom
        John Hegstrom @John Hegstrom last edited by

        @John-Hegstrom
        and for data:

           DataFactory = alpaca_backtrader_api.AlpacaData#store.getdata# Develop feed    
        
            cerebro.addstrategy(PairTradingStrategy,
                                period=400,
                                )
        
            for i,p in enumerate(pairs):
                # if i != 22: continue
                ps = p.split('/',2)
                d0 = DataFactory(dataname=ps[0], historical=True, fromdate=startdat, todate=enddat, timeframe=bt.TimeFrame.Days)
                cerebro.adddata(d0)
                d1 = DataFactory(dataname=ps[1], historical=True, fromdate=startdat, todate=enddat, timeframe=bt.TimeFrame.Days)
                cerebro.adddata(d1)
                import pdb; pdb.set_trace()
        
        1 Reply Last reply Reply Quote 0
        • John Hegstrom
          John Hegstrom last edited by

          I think I need to find a different data source

          1 Reply Last reply Reply Quote 0
          • John Hegstrom
            John Hegstrom last edited by

            Upon further investigation, the data is shorter for certain symbols than others. Does anyone know of a way to test the length of the data prior to a strategy being run?

            1 Reply Last reply Reply Quote 0
            • B
              benmercerdev last edited by

              Did you ever resolve this issue? I'm getting the same error.

              B 1 Reply Last reply Reply Quote 0
              • B
                benmercerdev @benmercerdev last edited by

                @benmercerdev @John-Hegstrom
                Ok, I discovered the issue for me. The data I was using was from 2016-2020.

                The default parameters have dates that were out of range for my data

                parser.add_argument('--fromdate', '-f',
                                        default='1997-01-01',
                                        help='Starting date in YYYY-MM-DD format')
                
                    parser.add_argument('--todate', '-t',
                                        default='1998-06-01',
                                        help='Starting date in YYYY-MM-DD format')
                

                So my original bash command was this:

                python pairs_trade.py -d0 AAPL.csv -d1 TSM.csv
                

                I changed to this:

                python pairs_trade.py -d0 AAPL.csv -d1 TSM.csv -f 2017-01-01 -t 2018-01-01
                1 Reply Last reply Reply Quote 0
                • 1 / 1
                • First post
                  Last post
                Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors