Backtrader Community

    • 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/

    Multiple time period on a single stock

    Indicators/Strategies/Analyzers
    2
    6
    1105
    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.
    • A
      andrewsky last edited by andrewsky

      Hello, I have my customized indicator (similar to RSI and stochastic) that changes values based on a certain period. The value of the indicator will change as time passes. I wanted to do a backtest for the following scenario :

      1/1/2000 to 1/1/2005 is the initial period to generate the indicator value.
      2/1/2005 onwards , start simulation of backtesting to track indicator for buy and sell signal.

      As each day pass, the value of the indicator will change but the starting point i.e. 1/1/2000 is anchored. I read that Backtrader support multiple timeframe but this is multiple period. Is there a code reference for multi period back testng ? I am trying to code along the following but somehow, i sense that it is not the correct way and even if it is, i need some help with the looping of the date...

      cerebro = bt.Cerebro(stdstats=True)
      cerebro.addstrategy(MyStrategy)

      -- a special loop to increment date by 1 day until year Jun 2019
      full_df = ...panda frame obtained from reading database for indicator value from period 1/1/2000 to 1/1/2005. Every loop increment by 1 day.

      data = MyDataLoader(dataname=full_df)

      cerebro.adddata(data)

      ---- end loop ---------------

      cerebro.broker.setcash(100000.0)
      cerebro.addsizer(bt.sizers.FixedSize, stake=1)
      cerebro.broker.setcommission(commission=0.0)
      cerebro.run()

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

        What I seem to understand is that you are creating survivorship bias ...

        Read:

        • Articles - Momentum Strategy - Next and PreNext
        • Docs - - Minimum Period
        A 1 Reply Last reply Reply Quote 0
        • A
          andrewsky @backtrader last edited by andrewsky

          @backtrader
          Thanks, i am studying the following code and need clarification on two item

          class Momentum(bt.Indicator):
              lines = ('trend',)
              params = (('period', 90),)```
           
              def __init__(self):
                  self.addminperiod(self.params.period)
          
              def next(self):
                  returns = np.log(self.data.get(size=self.p.period))
                  x = np.arange(len(returns))
                  slope, _, rvalue, _, _ = linregress(x, returns)
                  annualized = (1 + slope) ** 252
                  self.lines.trend[0] = annualized * (rvalue ** 2)
          

          Item 1 :
          I understand that next method will be called every tick after the minimum period. As an example, if minimum period is 20, after iterating through 20 closing prices, on the 21st closing price,

          self.data.get(size=self.p.period)

          will have the first 20 data points from the datafeed. Subsequent call will be retrieving 0 to 21 data point, and following this, the third call will have 0 to 22 set of data point and so on. Is this the behavior ? I am looking for an anchor starting point and not a moving period.

          Item 2:
          Also i need two array to do computation so since i am using Panda Dataframe, instead of self.data.get(), can I use self.data.close.get() and self.data.datetime.get() ?

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

            Item 0

            For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
            

            It's at the top of each page.

            A 1 Reply Last reply Reply Quote 0
            • A
              andrewsky @backtrader last edited by

              @backtrader
              Thanks for the help with the formatting. I had edited the second post with the correct formatting. Appreciate if you are able to provide some answer to the clarification.

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

                @andrewsky said in Multiple time period on a single stock:

                self.data.get(size=self.p.period)

                If you ask for size=self.p.period you are always going to get period data points. If you need the array to grow with each iteration use the len of the data which keeps on growing with each iteration

                • Docs - Platform Concepts - Lines len

                @andrewsky said in Multiple time period on a single stock:

                instead of self.data.get(), can I use self.data.close.get() and self.data.datetime.get() ?

                self.data.get is giving you the default for a multi-line object, which in most cases will be self.data.close.get. Working with the individual lines is obviously possible.

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