我应该避免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
答案 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)
使用rolling
与regress
一起使用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