方案1:numpy_ext.rolling_apply

基于numpy_ext.rolling_apply的滚动回归需要自己定义一个回归计算的函数,可以直接使用sklearn或者statsmodels库中的方法进行回归计算。

相关环境准备

首先安装numpy_ext库,添加清华镜像源可以让下载更快。

1
2
3
4
5
# 以防有人没有,全部写出来吧
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy_ext
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn

导入相关环境

1
2
3
4
import numpy as np
import pandas as pd
from numpy_ext import rolling_apply
from sklearn.linear_model import LinearRegression as LR

滚动回归实现

1
2
3
4
5
6
7
8
9
10
def rolling_regression(s1,s2):
'''线性回归函数,基于sklearn'''
reg=LR().fit(pd.DataFrame(s1),pd.DataFrame(s2))
return reg.coef_[0][0], reg.intercept_[0]

# 随机生成一个200*3的DataFrame
df = pd.DataFrame(np.random.random((200, 3), ), columns=['y', 'x1', 'x2'])

# rolling_apply(回归函数,滚动窗口,Y,X)
df[['beta', 'alpha']] = rolling_apply(rolling_regression, 20, df['y'].values, df['x1'].values)

方法优劣

优势:

  • 方法简单
  • 可以自定义相关函数

劣势:

  • 用时相对较慢(比遍历快,比下一个方法慢)
  • 只进行一元回归
  • 所有需要的指标与结果都需要自定义进行计算

方案2:pyfinance.ols.PandasRollingOLS

首先安装pyfinance库,添加清华镜像源可以让下载更快。

1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyfinance

导入相关环境

1
2
3
import numpy as np
import pandas as pd
from pyfinance.ols import RollingOLS, PandasRollingOLS

滚动回归实现

1
2
3
4
5
6
7
8
9
10
# 随机生成一个200*3的DataFrame
df = pd.DataFrame(np.random.random((200, 3), ), columns=['y', 'x1', 'x2'])

# 直接进行滚动回归
# PandasRollingOLS(y, X, windows)
r = PandasRollingOLS(df.iloc[:, 0], df.iloc[:, 1:3], 20)

# 结果保存
df['alpha'] = t.alpha
df[['beta1', 'beta2']] = t.beta

其他计算结果

使用PandasRollingOLS方法不只能计算回归的结果,其他的相关指标也都一并计算了出来。以下是指标名称之间的对应关系:

方法名称返回结果方法名称返回结果方法名称返回结果
alpha常数项α\alphams_reg模型MSEss_err类内和方差
beta斜率项β\betan窗口大小ss_reg类间和方差
condition_number条件数names变量名称ss_tot总和方差
df_err残差自由度predicted每次回归y的预测值std_err模型标准误
df_reg模型自由度pvalue_alpha常数项p值tstat_alpha常数项的t统计量值
df_tot总自由度pvalue_beta斜率p值tstat_beta自变量的t统计量
durbin_watsonDW检验resids每次回归的残差use_const不确定
fstatF统计量ridx有回归结果的序列时间window窗口大小
fstat_sigF统计量p值rsq拟合优度R^2x自变量(包含截距项)
has_const不确定rsq_adj调整拟合优度xwins每个窗口的自变量
index全部序列时间se_alpha常数项标准误差y因变量
jarque_beraJ-B检验值se_beta斜率项标准误差ybar窗口因变量均值
k自变量个数solution拟合出的所有参数
(α\alpha在第一列)
ywins每个窗口的因变量
ms_err残差MSE

方法优劣

优势:

  • 方法简单
  • 可以进行多元线性回归
  • 代码效率较高,计算快
  • 相关指标容易获得

劣势:

  • 不能自定义相关函数