Sam18J
Sam18J

Reputation: 15

Running Half life codes for a mean reverting series

I am currently trying to compute the Half life results for multiple columns of data. I have tried to incorporate the codes I got from 'pythonforfinance.com' Link.

However, I seem to have missed a few edits that is resulting in errors being thrown.

This is how my df looks like: Link

and the code I am running:

import pandas as pd                 
import numpy as np
import statsmodels.api as sm

df1=pd.read_excel('C:\\Users\Sai\Desktop\Test\Spreads.xlsx')  

Halflife_results={} 

for col in df1.columns.values:

  spread_lag = df1.shift(periods=1, axis=1)
  spread_lag.ix([0]) = spread_lag.ix([1])
  spread_ret = df1.columns - spread_lag
  spread_ret.ix([0]) = spread_ret.ix([1])
  spread_lag2 = sm.add_constant(spread_lag)
  md = sm.OLS(spread_ret,spread_lag2)
  mdf = md.fit()
  half_life = round(-np.log(2) / mdf.params[1],0)
  print('half life:', half_life)

The error that is being thrown is:

   File "C:/Users/Sai/Desktop/Test/Half life test 2.py", line 12
    spread_lag.ix([0]) = spread_lag.ix([1])
    ^
SyntaxError: can't assign to function call

Based on the error message, I seem to have made a very basic mistake but since I am a beginner I am not able to fix the issue. If not a solution to this code, an explanation to these lines of the codes would be of great help:

spread_lag = df1.shift(periods=1, axis=1)
spread_lag.ix([0]) = spread_lag.ix([1])
spread_ret = df1.columns - spread_lag
spread_ret.ix([0]) = spread_ret.ix([1])
spread_lag2 = sm.add_constant(spread_lag)

Upvotes: 0

Views: 2823

Answers (1)

jodoox
jodoox

Reputation: 839

As explained by the error message, pd.Series.ixisn't callable: you should change spread_lag.ix([0]) to spread_lag.ix[0].

Also, you shouldn't shift on axis=1 (rows) since you're interested in differences along each column (axis=0, default value).

Defining a get_halflifefunction allows you then to directly apply it to each column, removing the need for a loop.

def get_halflife(s):
    s_lag = s.shift(1)
    s_lag.ix[0] = s_lag.ix[1]

    s_ret = s - s_lag
    s_ret.ix[0] = s_ret.ix[1]

    s_lag2 = sm.add_constant(s_lag)

    model = sm.OLS(s_ret,s_lag2)
    res = model.fit()

    halflife = round(-np.log(2) / res.params[1],0)
    return halflife

df1.apply(get_halflife)

Upvotes: 1

Related Questions