我确信这个问题经常弹出。但是,在经历了类似的问题之后,我没有设法得出此任务的答案。
我有一个包含多只股票的收益的数据框,并且将需要仅运行单变量回归来得出滚动的beta值。
Brad Solomon的ols.PandasRollingOLS对于包括窗口/滚动非常方便。但是,我没有设法在所有股票退货列上迭代该函数。
我希望此函数循环/迭代/遍历不同股票收益的所有列。
以下,我将使用项目描述https://pypi.org/project/pyfinance/中的代码,因为它应该有助于使问题比从项目中更清楚地指出。
import numpy as np
import pandas as pd
from pyfinance import ols
from pandas_datareader import DataReader
syms = {
'TWEXBMTH': 'usd',
'T10Y2YM': 'term_spread',
'PCOPPUSDM': 'copper'
}
data = DataReader(syms.keys(), data_source='fred',
start='2000-01-01', end='2016-12-31')\
.pct_change()\
.dropna()\
.rename(columns=syms)
y = data.pop('usd')
rolling = ols.PandasRollingOLS(y=y, x=data, window=12)
rolling.beta.head()
#DATE term_spread copper
#2001-01-01 0.000093 0.055448
#2001-02-01 0.000477 0.062622
#2001-03-01 0.001468 0.035703
#2001-04-01 0.001610 0.029522
#2001-05-01 0.001584 -0.044956
我希望该函数代替多元回归,以便将每一列分开并遍历整个数据框。
由于我的数据帧长超过50列,因此我希望避免经常编写该函数,例如以下代码(但是,会产生预期的结果):
rolling = ols.PandasRollingOLS(y=y, x=data[["term_spread"]], window=12).beta
rolling["copper"]= ols.PandasRollingOLS(y=y, x=data[["copper"]], window=12).beta["copper"]
# term_spread copper
#DATE
#2001-01-01 0.000258 0.055856
#2001-02-01 0.000611 0.064094
#2001-03-01 0.001700 0.047485
#2001-04-01 0.001778 0.040413
#2001-05-01 0.001353 -0.032264
#... ... ...
#2016-08-01 -0.100839 -0.176078
#2016-09-01 -0.058668 -0.189192
#2016-10-01 -0.014763 -0.181441
#2016-11-01 0.046531 0.016082
#2016-12-01 0.060192 0.035062
我所做的尝试通常以“ SyntaxError:位置参数跟随关键字参数”结尾,如下所示:
def beta(r):
z = ols.PandasRollingOLS(y=y, x=r, window=12);
return z