首页 > 解决方案 > 计算一组因变量的滚动窗口多元线性回归的有效方法?

问题描述

从 1926 年到今天,我有一个相对大量公司(约 25k,每家由 PERMNO 表示)的财务数据(月度回报)数据框。

因变量:月回报数据框

我的目标是对三个自变量进行回归,即市场收益 (Mkt-RF) 和两个因素投资组合收益 (SMB & HML),每次回归使用 60 个月的收益窗口。

自变量

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

时序示例

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

所有公司的df

然后使用类似的东西

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()分别在每个输入数据帧的列上工作(见这里),即我没有找到一种方法来应用计算回归系数的函数。

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

我认为有一个解决方案,没有低效/昂贵的循环和保存中间结果,但我不知道该怎么做。关于如何实现有效计算回归系数的目标或如何解决上述问题的任何建议?

标签: pythonpandasnumpyregressionfinance

解决方案


推荐阅读