问题 从Pandas到Statsmodels的OLS中不推荐使用的滚动窗口选项
正如标题所示,Pandas中ols命令中的滚动功能选项在statsmodels中迁移到哪里?我似乎无法找到它。
熊猫告诉我厄运正在起作用:
FutureWarning: The pandas.stats.ols module is deprecated and will be removed in a future version. We refer to external packages like statsmodels, see some examples here: http://statsmodels.sourceforge.net/stable/regression.html
model = pd.ols(y=series_1, x=mmmm, window=50)
事实上,如果你做的事情如下:
import statsmodels.api as sm
model = sm.OLS(series_1, mmmm, window=50).fit()
print(model.summary())
你得到结果(窗口不会影响代码的运行)但你只得到整个时期的回归运行参数,而不是应该应该处理的每个滚动周期的一系列参数。
8127
2018-05-19 08:22
起源
答案:
我创造了一个 ols
旨在模仿大熊猫的模块被弃用了 MovingOLS
;它是 这里。
它有三个核心类:
OLS
:静态(单窗口)普通最小二乘回归。输出是NumPy数组
RollingOLS
:滚动(多窗口)普通最小二乘回归。输出是更高维度的NumPy数组。
PandasRollingOLS
:包装结果 RollingOLS
在熊猫系列和DataFrames。旨在模仿已弃用的pandas模块的外观。
请注意,该模块是a的一部分 包 (我目前正在上传到PyPi),它需要一个包间导入。
上面的前两个类完全在NumPy中实现,主要使用矩阵代数。 RollingOLS
广泛利用广播。属性很大程度上模仿了statsmodels的OLS RegressionResultsWrapper
。
一个例子:
# Pull some data from fred.stlouisfed.org
from pandas_datareader.data import DataReader
syms = {'TWEXBMTH' : 'usd',
'T10Y2YM' : 'term_spread',
'PCOPPUSDM' : 'copper'
}
data = (DataReader(syms.keys(), 'fred', start='2000-01-01')
.pct_change()
.dropna())
data = data.rename(columns=syms)
print(data.head())
# usd term_spread copper
# DATE
# 2000-02-01 0.01260 -1.40909 -0.01997
# 2000-03-01 -0.00012 2.00000 -0.03720
# 2000-04-01 0.00564 0.51852 -0.03328
# 2000-05-01 0.02204 -0.09756 0.06135
# 2000-06-01 -0.01012 0.02703 -0.01850
# Rolling regressions
from pyfinance.ols import PandasRollingOLS
y = data.usd
x = data.drop('usd', axis=1)
window = 12 # months
model = PandasRollingOLS(y=y, x=x, window=window)
print(model.beta.head()) # Coefficients excluding the intercept
# term_spread copper
# DATE
# 2001-01-01 0.00010 0.05568
# 2001-02-01 0.00047 0.06271
# 2001-03-01 0.00147 0.03576
# 2001-04-01 0.00161 0.02956
# 2001-05-01 0.00158 -0.04497
print(model.fstat.head())
# DATE
# 2001-01-01 0.28121
# 2001-02-01 0.42602
# 2001-03-01 0.38802
# 2001-04-01 0.39230
# 2001-05-01 0.41706
# Freq: MS, Name: fstat, dtype: float64
print(model.rsq.head()) # R-squared
# DATE
# 2001-01-01 0.05882
# 2001-02-01 0.08648
# 2001-03-01 0.07938
# 2001-04-01 0.08019
# 2001-05-01 0.08482
# Freq: MS, Name: rsq, dtype: float64
6
2018-06-11 17:32
答案:
我创造了一个 ols
旨在模仿大熊猫的模块被弃用了 MovingOLS
;它是 这里。
它有三个核心类:
OLS
:静态(单窗口)普通最小二乘回归。输出是NumPy数组
RollingOLS
:滚动(多窗口)普通最小二乘回归。输出是更高维度的NumPy数组。
PandasRollingOLS
:包装结果 RollingOLS
在熊猫系列和DataFrames。旨在模仿已弃用的pandas模块的外观。
请注意,该模块是a的一部分 包 (我目前正在上传到PyPi),它需要一个包间导入。
上面的前两个类完全在NumPy中实现,主要使用矩阵代数。 RollingOLS
广泛利用广播。属性很大程度上模仿了statsmodels的OLS RegressionResultsWrapper
。
一个例子:
# Pull some data from fred.stlouisfed.org
from pandas_datareader.data import DataReader
syms = {'TWEXBMTH' : 'usd',
'T10Y2YM' : 'term_spread',
'PCOPPUSDM' : 'copper'
}
data = (DataReader(syms.keys(), 'fred', start='2000-01-01')
.pct_change()
.dropna())
data = data.rename(columns=syms)
print(data.head())
# usd term_spread copper
# DATE
# 2000-02-01 0.01260 -1.40909 -0.01997
# 2000-03-01 -0.00012 2.00000 -0.03720
# 2000-04-01 0.00564 0.51852 -0.03328
# 2000-05-01 0.02204 -0.09756 0.06135
# 2000-06-01 -0.01012 0.02703 -0.01850
# Rolling regressions
from pyfinance.ols import PandasRollingOLS
y = data.usd
x = data.drop('usd', axis=1)
window = 12 # months
model = PandasRollingOLS(y=y, x=x, window=window)
print(model.beta.head()) # Coefficients excluding the intercept
# term_spread copper
# DATE
# 2001-01-01 0.00010 0.05568
# 2001-02-01 0.00047 0.06271
# 2001-03-01 0.00147 0.03576
# 2001-04-01 0.00161 0.02956
# 2001-05-01 0.00158 -0.04497
print(model.fstat.head())
# DATE
# 2001-01-01 0.28121
# 2001-02-01 0.42602
# 2001-03-01 0.38802
# 2001-04-01 0.39230
# 2001-05-01 0.41706
# Freq: MS, Name: fstat, dtype: float64
print(model.rsq.head()) # R-squared
# DATE
# 2001-01-01 0.05882
# 2001-02-01 0.08648
# 2001-03-01 0.07938
# 2001-04-01 0.08019
# 2001-05-01 0.08482
# Freq: MS, Name: rsq, dtype: float64
6
2018-06-11 17:32
用sklearn滚动测试版
import pandas as pd
from sklearn import linear_model
def rolling_beta(X, y, idx, window=255):
assert len(X)==len(y)
out_dates = []
out_beta = []
model_ols = linear_model.LinearRegression()
for iStart in range(0, len(X)-window):
iEnd = iStart+window
model_ols.fit(X[iStart:iEnd], y[iStart:iEnd])
#store output
out_dates.append(idx[iEnd])
out_beta.append(model_ols.coef_[0][0])
return pd.DataFrame({'beta':out_beta}, index=out_dates)
df_beta = rolling_beta(df_rtn_stocks['NDX'].values.reshape(-1, 1), df_rtn_stocks['CRM'].values.reshape(-1, 1), df_rtn_stocks.index.values, 255)
4
2017-11-20 16:02
添加完整性更快 numpy
- 仅将计算仅限于回归系数和最终估计的解决方案
Numpy滚动回归函数
import numpy as np
def rolling_regression(y, x, window=60):
"""
y and x must be pandas.Series
"""
# === Clean-up ============================================================
x = x.dropna()
y = y.dropna()
# === Trim acc to shortest ================================================
if x.index.size > y.index.size:
x = x[y.index]
else:
y = y[x.index]
# === Verify enough space =================================================
if x.index.size < window:
return None
else:
# === Add a constant if needed ========================================
X = x.to_frame()
X['c'] = 1
# === Loop... this can be improved ====================================
estimate_data = []
for i in range(window, x.index.size+1):
X_slice = X.values[i-window:i,:] # always index in np as opposed to pandas, much faster
y_slice = y.values[i-window:i]
coeff = np.dot(np.dot(np.linalg.inv(np.dot(X_slice.T, X_slice)), X_slice.T), y_slice)
estimate_data.append(coeff[0] * x.values[window-1] + coeff[1])
# === Assemble ========================================================
estimate = pandas.Series(data=estimate_data, index=x.index[window-1:])
return estimate
笔记
在某些特定情况下,只需要对回归进行最终估计, x.rolling(window=60).apply(my_ols)
看起来有点慢
提醒一下,回归的系数可以计算为矩阵乘积,您可以阅读 维基百科的最小方块页面。这种方法通过 numpy
与使用ols相比,矩阵乘法可以加快这个过程 statsmodels
。该产品以行开头表示 coeff = ...
0
2018-04-30 17:47