1

我应该避免rolling并手动编码滚动回归吗?还是我最好创建一个具有重叠条目并使用的巨型面板statsby?即,给每个窗口自己的by条目。在 RI 中可以将数据预先拆分为日期框架列表,我认为这可以加快后续操作。

一个月前,当我第一次从 R 切换到 Stata 时,我在 Statalist 上问过这个问题,共识是这应该需要很长时间。我在 Mata 中编码和编译了 OLS,发现速度没有提高(实际上,稍微变差了)。

这似乎滚动回归是一种常见的技术,Stata 似乎相当复杂;大多数研究人员是否将这些回归运行了 1 天以上?或者他们是否使用 SAS 进行这些计算?例如,我在 Compustat 数据库上从 1975 年到 2010 年(大约 30,000 次回归)运行以下内容,大约需要 12 个小时。

rolling arbrisk = (e(rss) / e(N)), window(48) stepsize(12) ///
         saving(arbrisk, replace) nodots: regress r1 ewretd
4

3 回答 3

3

我认为来自 Statalist 的人说这需要很长时间是对的。您正在对重要数量的观察结果进行 30000 次回归。

如果您想知道 Stata 将时间花在哪里,可以使用该profiler命令。

profiler clear
profiler on
rolling arbrisk = (e(rss) / e(N)), window(48) stepsize(12) ///
     saving(arbrisk, replace) nodots: regress r1 ewretd
profiler off
profiler report

我想知道创建一个巨大的面板是否会有所帮助。您很可能会遇到内存问题。您应该事先检查您的面板有多大以及需要多少内存:

http://www.stata.com/support/faqs/data/howbig.html

使用自编码 OLS 例程并没有提高性能,我并不感到惊讶。该regress命令是所谓的内置命令,已经非常高效。很难做得更好。

就 SAS 而言,在 SAS 中运行几个回归并检查它需要多少时间。在Stata中做同样的事情。我的经验是 Stataregressproc regSAS 快一点。

于 2011-10-12T07:22:12.523 回答
2

使用求和“手动”回归确实比rolling使用regress. rolling下面的代码运行速度比with快大约 400 倍regress。当然,rolling可扩展性更高,但如果您只需要 beta、alpha、R^2 和 sigma^2,那么这可以解决问题。

program rolling_beta
    version 11.2
    syntax varlist(numeric), window(real)

    * get dependent and indpendent vars from varlist
    tempvar x y x2 y2 xy xs ys xys x2s y2s covxy varx vary
    tokenize "`varlist'"
    generate `y' = `1' 
    generate `x' = `2' 
    local w = `window' 

    * generate products
    generate `xy' = `x'*`y'
    generate `x2' = `x'*`x'
    generate `y2' = `y'*`y'

    * generate cumulative sums
    generate `xs' = sum(`x')
    generate `ys' = sum(`y')
    generate `xys' = sum(`xy')
    generate `x2s' = sum(`x2')
    generate `y2s' = sum(`y2')

    * generate variances and covariances
    generate `covxy' = (s`w'.`xys' - s`w'.`xs'*s`w'.`ys'/`w')/`w'
    generate `varx' = (s`w'.`x2s' - s`w'.`xs'*s`w'.`xs'/`w')/`w'
    generate `vary' = (s`w'.`y2s' - s`w'.`ys'*s`w'.`ys'/`w')/`w'

    * generate alpha, beta, r2, s2
    generate beta = `covxy'/`varx'
    generate alpha = (s`w'.`ys' - beta*s`w'.`xs')/`w'
    generate r2 = `covxy'*`covxy'/`varx'/`vary'
    generate s2 = `vary'*`w'*(1 - r2)/(`w' - 2)

end
于 2011-10-15T22:12:44.540 回答
0

asreg 社区贡献的命令执行速度如此之快,甚至都不好笑。我让通常的循环代码运行了36几个小时,然后asreg在不到5几分钟的时间内运行了同样的代码。

显然,每次回归的大部分时间都浪费在选择观察子集来运行回归,也就是说o(N)N作为数据集中观察的总数。它似乎asreg在 Mata 中实现了这种混乱。

这将实现标准 CAPM 滚动回归:

bysort permno: asreg mret_rf mkt_rf, wind(month 60)

permno作为公司标识符,每月mret_rf公司回报减去无风险利率,mkt_rf每月市场回报减去无风险利率,month标识月份的日期变量的名称,以及60滚动窗口的大小(以月为单位)。

asreg在 Stata 中安装:

ssc install asreg
于 2019-08-13T14:10:39.437 回答