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/

    mean reversion half life

    Indicators/Strategies/Analyzers
    2
    2
    463
    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.
    • B
      bc10 last edited by

      Dear fellow backtraders,
      Thank you guys for contributions to the community. I'm new to Python & backorder, and have a difficulty to code a half life analyzer/screener.

      Below is my python code, that works well,

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import numpy as np
      import statsmodels.api as sm
      from pandas import read_csv
      import pandas as pd
      import math
      
      import datetime
      from pandas import read_csv
      from matplotlib import pyplot
      
      
      from pandas import read_csv
      from matplotlib import pyplot
      
      #use pandas read_csv to read stock file
      TimeSeries = read_csv('data/TSLA.CSV', header=0, parse_dates=[0], index_col=0)
      
      #make sure the data are in pandas DataFram format
      TimeSeries = pd.DataFrame(TimeSeries)
      
      
      
      #set start and end date
      start = datetime.date(2019, 1, 3)
      end = datetime.date(2020, 4, 30)
      TimeSeries=TimeSeries.loc(axis=0)[start:end]
      
      #select Adj close price
      data=TimeSeries['Adj Close']
      
      
      
      #set up lagged series of TimeSeries
      
      lag = np.roll(data, 1)
      lag[0] = 0
      ret = data - lag
      ret[0] = 0
      
      # adds intercept terms to X variable for regression
      lag2 = sm.add_constant(lag)
      
      model = sm.OLS(ret, lag2)
      res = model.fit()
      
      #Calculate and print Half life
      half_life = -np.log(2) / res.params[1]
      
      print(half_life)
      
      
      
      
      #pyplot.plot(TimeSeries['Adj Close'])
      #pyplot.show()
      
      

      Here is my backtrader analyzer/screener, that sucks. Could you please help?

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      import datetime
      import backtrader as bt
      import numpy as np
      import statsmodels.api as sm
      
      
      class Half_Life(bt.Analyzer):
          """
          Half Life test from the Ornstein-Uhlenbeck process 
          Source: http://www.pythonforfinance.net/2016/05/09/python-backtesting-mean-reversion-part-2/
          """
       
          def start (self):
             pass
             
       
          def stop (self):
              lag = np.roll(self.data.close, 1)
              lag[0] = 0
              ret = self.data.close - lag
              ret[0] = 0
       
              # adds intercept terms to X variable for regression
              lag2 = sm.add_constant(lag)
       
              model = sm.OLS(ret, lag2)
              res = model.fit()
       
              self.half_life = -np.log(2) / res.params[1]
       
              
      
      
      #Instantiate Cerebro engine
      cerebro = bt.Cerebro()
      
      #Set data parameters and add to Cerebro
      data = bt.feeds.GenericCSVData(
          dataname='data/TSLA.csv',
          nullvalue=0.0,
          dtformat=('%Y-%m-%d'),
          datetime=0,
          time=-1,
          high=2,
          low=3,
          open=1,
          close=4,
          volume=5,
          openinterest=-1,
          timeframe=bt.TimeFrame.Days,
          fromdate=datetime.datetime(2010, 1, 1),
          todate=datetime.datetime(2011, 1, 1),
      )
      
      cerebro.adddata(data) 
      #Add analyzer for screener
      cerebro.addanalyzer(Half_Life)
      if __name__ == '__main__':
      #Run Cerebro Engine
          cerebro.run(runonce=False, stdstats=False, writer=True)
       
      
      
      1 Reply Last reply Reply Quote 0
      • A
        ab_trader last edited by

        https://www.backtrader.com/docu - read about bt data feds, lines concept etc. Try quickstart.

        • If my answer helped, hit reputation up arrow at lower right corner of the post.
        • Python Debugging With Pdb
        • New to python and bt - check this out
        1 Reply Last reply Reply Quote 1
        • 1 / 1
        • First post
          Last post
        Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors