Stata每日回报复合到每月

时间:2017-05-14 18:42:20

标签: return stata

我有每日股票回报的面板数据。对于每只股票,我需要计算其复合月报表(比如说30天):

(1+r_1)*(1+r_2)*...*(1+r_30) - 1

股票标识符为permnodm为年和月指标。我使用以下Stata代码:

gen gross_ret = 1+ret
bys permno dm: gen prod = sum(ln(gross_ret))
by permno dm: replace prod = exp(prod[_N])
gen mret = prod - 1

我随机选择permno dm组合来验证结果,它们似乎是正确的。但是,我确实看到mret = 26等极端值。我猜原因是某些gross_ret接近0,所以ln(gross_ret)非常高。然后我使用CRSP月度返回数据进行双重检查,我发现复合回报(由上面的代码计算)和CRSP月回报率之间的差异小于0.0007,这是可以接受的。但最大的绝对差异是3.24,这太大了,可能会影响我的最终结果(我整整两天都遇到麻烦,这可能是我的最后一招)。

我计算月度回报的方式是错误的吗?如果是这样,请建议一个更好的方法。

1 个答案:

答案 0 :(得分:1)

也许你可以通过避免使用对数来获得更好的准确性,同时使用双倍的中间结果,如尼克所建议的那样。

bys permno dm: gen double prod = (1+ret) if _n==1
by permno dm: replace prod = (1+ret)*prod[_n-1] if _n>1
by permno dm: gen mret = prod[_N] - 1

话虽如此,如果你有一个每日日期变量(年 - 月 - 日或者只是一天),你可以将它包含在排序中,这样你的数据就会按照你在此过程后期望的顺序。

bys permno dm (day): gen double prod = (1+ret) if _n==1
by permno dm: replace prod = (1+ret)*prod[_n-1] if _n>1
by permno dm: gen mret = prod[_N] - 1