计算因变量集滚动窗口多元线性回归的有效方法?

2024-05-31 23:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从1926年到今天的财务数据(月回报)的数据框架,用于相对大量的公司(约2.5万家,每个公司用一个PERMNO表示)

dependent variables: dataframe of monthly return

我的目标是在三个独立变量(即市场回报率(Mkt RF)和双因素投资组合回报率(SMB&HML))上回归这些数据,每次回归使用60个月的回报窗口

independent variables

据我所知,我可以使用statsmodel的RollingOLS为每个公司实现这一点。然而,这将意味着在所有2.5万家公司之间进行循环,这似乎不是很有效。例如,为一家公司运行回归需要约250毫秒,即对于所有25k,这将是>;1.5小时。实际上,时间仍然会增加,因为除了计算系数之外,我还需要做进一步的操作,例如回归残差

timing example

我的第一个想法是将自变量与因变量相匹配,以构建以下df:

df of all firms

然后使用类似

df.rolling(window=60, min_periods=24).apply(lambda x: myreg(x['RET'], x[['Mkt-RF', 'SMB', 'HML']])

用矩阵代数计算回归系数

def myreg(x, y):
   Y = y.values.reshape(-1,1)
   X = np.concatenate((np.ones(shape=Y.shape), x.values), 1)
   coeffs = inv(X.transpose().dot(X)).dot(X.transpose()).dot(Y)

   return coeffs

我知道至少有两个问题,为什么这不起作用:

  1. 新公司的.rolling不是“从0开始”,即在回归中会混淆不同公司的数据
  2. rolling().apply()分别作用于每个输入数据帧的列(see here),也就是说,我没有找到一种方法来应用计算回归系数的函数

虽然我很确定我不是第一个遇到这个问题的人,但在之前关于类似主题的讨论中,我没有找到一个有用的答案

我假设有一个解决方案可以解决这个问题,而不需要低效/昂贵的循环和保存中间结果,但我不知道如何做到这一点。 关于如何实现高效计算回归系数的目标,或者如何解决上述问题,有什么建议吗


Tags: of数据目标dfreturn公司variablesdot