滚动拼图 windows for statsmodels RollingOLS

Puzzles with rolling windows for statsmodels RollingOLS

我对 RollingOLS example page 中描述的 statsmodels RollingOLS 的滚动 windows 感到很困惑。 它提到

Estimated values are aligned so that models estimated using data points t, (t+1), ..., (t + windows) are stored in location (t + windows).

我有一些问题:

Q1: 假设我们在第 t 行,如果我设置 RollingOLS(endog, exog, window=60),它使用来自 [t - 60, t] 的数据估计模型(即( t - 60), (t - 59), ..., t) 有 61 个观测值,对吗?但这是 61 天的 window。

Q2: 如果我们用model.params提取估计系数,第t行的系数是OLS使用[t - 60, t]数据的结果(即 (t - 60), (t - 59), ..., t),我说得对吗?

Q3:如果我在Q2中的猜测是正确的,我们如何解决提到的滚动问题?即

I want to run a rolling 100-day window OLS regression estimation, which is:

First for the 101st row, I run a regression of Y-X1,X2,X3 using the 1st to 100th rows, and estimate Y for the 101st row;

Then for the 102nd row, I run a regression of Y-X1,X2,X3 using the 2nd to 101st rows, and estimate Y for the 102nd row;

Then for the 103rd row, I run a regression of Y-X1,X2,X3 using the 2nd to 101st rows, and estimate Y for the 103rd row;

Until the last row.

示例中有一个小错字。当 windown 时,计算的第一个值使用观测值 0,1,...,n-1 并出现在 res.params[n-1] 中。这就是应该如何 window 大小实际上是强制执行的。你可以在这里看到这个

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pandas_datareader as pdr
import seaborn

import statsmodels.api as sm
from statsmodels.regression.rolling import RollingOLS

factors = pdr.get_data_famafrench("F-F_Research_Data_Factors", start="1-1-1926")[0]
industries = pdr.get_data_famafrench("10_Industry_Portfolios", start="1-1-1926")[0]

endog = industries.HiTec - factors.RF.values
exog = sm.add_constant(factors["Mkt-RF"])
rols = RollingOLS(endog, exog, window=60)
rres = rols.fit()
params = rres.params.copy()
params.index = np.arange(1, params.shape[0] + 1)
params.iloc[57:62]

请注意,此处的索引是 1、2、...,因此第一个位于位置 60,表示用于计算第一个估计值的 60 个观测值。

       const    Mkt-RF
58       NaN       NaN
59       NaN       NaN
60  0.876155  1.399240
61  0.879936  1.406578
62  0.953169  1.408826

要使用直至并包括任何点 t 的数据进行估算,请使用 res.params[t]

shift

如果您希望观察值与“样本外”对齐,以便使用直到并包括观察值 t 的观察值的参数估计值与 t+1 对齐,您可以使用 shift

params.shift(1).iloc[57:62]

您看到之前为 60 的参数值现在为 61。