加快Stata的滚动回归

时间:2011-10-11 18:01:17

标签: regression stata rolling-computation

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

当我一个月前第一次从R换到Stata时我asked this on Statalist并且达成的共识是应该需要很长时间。我在Mata中编写并编译了OLS,并注意到没有速度提升(实际上,略有恶化)。

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

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

3 个答案:

答案 0 :(得分:1)

我认为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做同样的事。我的经验是,Stata的regress比SAS中的proc reg快一点。

答案 1 :(得分:1)

使用rollingregress一起使用rolling进行“手动”回归确实要快得多。以下代码的运行速度比使用regress的{​​{1}}快约400倍。当然,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

答案 2 :(得分: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滚动窗口的大小(以月为单位)。

要在Stata中安装asreg

ssc install asreg