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/

    Crossover error operator '-'

    bta-lib
    2
    7
    64
    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.
    • Xavier Escudero
      Xavier Escudero last edited by Xavier Escudero

      Using btalib crossover an error is shown:

      Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/computation/expressions.py:200: UserWarning: evaluating in Python space because the '-' operator is not supported by numexpr/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/computation/expressions.py:200: UserWarning: evaluating in Python space because the '-' operator is not supported by numexpr for the bool dtype, use '^' instead

      My code uses as input parameter a pandas dataframe:

      if len(df)>50:
           sma50 = btalib.sma(df, period=50)
           df['sma50'] = btalib.sma(df, period=50).df
      
           if len(df)>200:
                 sma200 = btalib.sma(df, period=200)
                 df['sma200'] = sma200.df      
                 btalib.crossover(sma50, sma200)
      
      1 Reply Last reply Reply Quote 0
      • run-out
        run-out last edited by

        Could you share a few rows of your dataframe please?

        Xavier Escudero 1 Reply Last reply Reply Quote 0
        • Xavier Escudero
          Xavier Escudero @run-out last edited by Xavier Escudero

          @run-out Here you got it (last columns are sma20 and sma50):

          o h l c v d s symbol max52w min52w sma20 sma50
          ts
          2020-02-18 85.110069 85.527370 83.987318 84.245651 2872500 0.0 0 A NaN NaN NaN NaN
          2020-02-19 84.156212 85.288892 82.914237 84.802040 4741300 0.0 0 A NaN NaN NaN NaN
          2020-02-20 84.354941 84.444359 82.824826 83.798531 2543600 0.0 0 A NaN NaN NaN NaN
          2020-02-21 83.361355 84.543710 82.864565 84.523842 1762500 0.0 0 A NaN NaN NaN NaN
          2020-02-24 81.692144 82.059763 79.506263 79.983185 2919200 0.0 0 A NaN NaN NaN NaN
          ... ... ... ... ... ... ... .. ... ... ... ... ...
          2020-11-24 118.959999 118.959999 111.430000 114.680000 5559900 0.0 0 A NaN NaN 108.683499 104.917219
          2020-11-25 116.089996 116.959999 113.410004 114.349998 2862500 0.0 0 A NaN NaN 109.317999 105.209415
          2020-11-27 113.769997 114.980003 112.940002 114.089996 983700 0.0 0 A NaN NaN 109.921499 105.502801
          2020-11-30 113.889999 117.070000 113.669998 116.900002 3778400 0.0 0 A NaN NaN 110.661999 105.856778
          2020-12-01 117.580002 118.379997 115.040001 115.360001 1753700 0.0 0 A NaN NaN 111.167999 106.204910

          1 Reply Last reply Reply Quote 0
          • run-out
            run-out last edited by

            @Xavier-Escudero said in Crossover error operator '-':

            btalib.crossover(sma50, sma200)

            I took a stab at this and I'm getting the same error. I modified the code slightly:

            df = pd.read_csv("/home/runout/projects/data/es/es18_20.csv")
            df.columns = ['Date', 'High', 'Low', 'Open', 'Close', 'Cumvol', 'Volume']
            df = df.set_index('Date')
            df.index = pd.to_datetime(df.index)
            sma50 = btalib.sma(df, period=50)
            df['sma50'] = sma50.df
            
            sma200 = btalib.sma(df, period=200)
            df['sma200'] = btalib.sma(df, period=200).df
            df = df.dropna()
            df
            btalib.crossover(sma50, sma200).df
            

            It works right up to the crossover point then errors. I get the same error if I just try using open and close to cross over.

            TypeError: numpy boolean subtract, the `-` operator, is not supported, use the bitwise_xor, the `^` operator, or the logical_xor function instead.
            

            So I investigated this and it is a known problem. Here is an example of someone fixing this.

             WillPastor commented on Apr 23, 2019
            
            @zockerwurf @NathanielCustom
            I fixed this problem by changing a single character in dejavu/fingerprint.py and it worked fine on my Ubuntu VirtualBox VM with about 8 GB memory. The code that needs to be changed is on line 104 of fingerprint.py ...
            
                # Boolean mask of arr2D with True at peaks
                detected_peaks = local_max - eroded_background
            
            Needs to be changed to:
            
                # Boolean mask of arr2D with True at peaks
                detected_peaks = local_max ^ eroded_background
            

            So I found the likely culprit in the btalib file btalib/indicators/crossover.py in the crossover class:

            class crossover(_crossbase):
                '''
                This indicator gives a signal if the provided datas (2) cross up or down.
            
                  - `1.0` if the 1st data crosses the 2nd data upwards
                  - `-1.0` if the 1st data crosses the 2nd data downwards
            
                It does need to look into the current time index (0) and the previous time
                index (-1) of both the 1st and 2nd data
            
                Formula:
                  - crossup = data0(-1) < data1(-1) and data0 > data1
                  - crossdown = data0(-1) > data1(-1) and data0 < data1
                  - crossover = crossup - crossdown
                '''
                group = 'utils'
                alias = 'CrossOver'
                outputs = 'crossover'
            
                _updown = 0
            
                def __init__(self):
                    self.o.crossover = self._cup - self._cdown
            
            

            The last line needs to change the - to ^.

                def __init__(self):
                    self.o.crossover = self._cup ^ self._cdown
            

            This seems to solve the problem but I have not bug tested it, and this need to be changed in the codebase me thinks.

            In my final working version I ended up just using this:

            btalib.crossover(sma50.df, sma200.df).df
            
            1 Reply Last reply Reply Quote 0
            • run-out
              run-out last edited by

              I should have checked the pull request for bta-lib, it's a known and ignore issue.

              https://github.com/mementum/bta-lib/pull/6/files

              Xavier Escudero 2 Replies Last reply Reply Quote 0
              • Xavier Escudero
                Xavier Escudero @run-out last edited by Xavier Escudero

                @run-out Yes, now that you mention it I remember I saw the pull request, but I don't understand why it's not merged yet (it was commited on june).

                1 Reply Last reply Reply Quote 1
                • Xavier Escudero
                  Xavier Escudero @run-out last edited by

                  @run-out Anyway, thanks for your support, it works!

                  1 Reply Last reply Reply Quote 1
                  • 1 / 1
                  • First post
                    Last post
                  Copyright © 2016, 2017, 2018 NodeBB Forums | Contributors
                  $(document).ready(function () { app.coldLoad(); }); }