运行 均值回归系列的半衰期代码
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)
我目前正在尝试计算多列数据的半衰期结果。我试图合并从 '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)