python - 计算一组因变量的滚动窗口多元线性回归的有效方法?
问题描述
从 1926 年到今天,我有一个相对大量公司(约 25k,每家由 PERMNO 表示)的财务数据(月度回报)数据框。
我的目标是对三个自变量进行回归,即市场收益 (Mkt-RF) 和两个因素投资组合收益 (SMB & HML),每次回归使用 60 个月的收益窗口。
据我了解,我可以使用 statsmodelRollingOLS
为每家公司实现这一目标。然而,这意味着循环遍历所有 25k 家公司,这似乎不是很有效。例如,为一家公司运行回归需要大约 250 毫秒,即对于所有 25k,这将 > 1.5h。实际上,时间仍然会增加,因为除了计算系数之外,我还需要做进一步的操作,例如回归残差。
我的第一个想法是将自变量与因变量匹配,以构造以下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
我知道至少有两个问题,为什么这不起作用:
- 对于
.rolling
新公司而言,它不是“从 0 开始”,即会在回归中混合来自不同公司的数据。 rolling().apply()
分别在每个输入数据帧的列上工作(见这里),即我没有找到一种方法来应用计算回归系数的函数。
虽然我很确定我不是第一个遇到这个问题的人,但我无法在之前关于类似主题的讨论中找到有用的答案。
我认为有一个解决方案,没有低效/昂贵的循环和保存中间结果,但我不知道该怎么做。关于如何实现有效计算回归系数的目标或如何解决上述问题的任何建议?
解决方案
推荐阅读
- android - 识别资产文件夹时出错“预期表达式,但找到了包名称”
- mips - 下面的 I-Type 指令如何改变程序计数器?
- kubernetes - 验证数据时出错:ValidationError(Deployment.spec.template.spec.volumes[0]):io.k8s.api.core.v1.Volume 中的未知字段“hostAliases”
- javascript - 如何创建比特币测试网交易 - blockcypher?
- bash - 根据命令的结果更改目录
- c - C动态长度字符数组
- python - 从 Docker 会话运行 Jupyter 失败
- python - 查询多个表并在 Django 中返回组合查询集,同时访问数据库一次
- react-native - 将 TProps 传递给 withApollo HOC 的正确方法是什么?
- sql - 使用多个 where 子句检查两个表