运行 均值回归系列的半衰期代码

Running Half life codes for a mean reverting series

我目前正在尝试计算多列数据的半衰期结果。我试图合并从 'pythonforfinance.com' Link.

获得的代码

但是,我似乎遗漏了一些导致抛出错误的编辑。

这是我的 df 的样子:Link

我的代码是运行:

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)

抛出的错误是:

   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

根据错误消息,我似乎犯了一个非常基本的错误,但由于我是初学者,我无法解决问题。如果不是此代码的解决方案,对这些代码行的解释将有很大帮助:

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)

如错误消息所述,pd.Series.ix不可调用:您应该将 spread_lag.ix([0]) 更改为 spread_lag.ix[0]

此外,您不应该在 axis=1(行)上移动,因为您对每一列的差异感兴趣(axis=0,默认值)。

定义一个 get_halflife 函数可以让您直接将其应用于每一列,而无需循环。

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)