我有每日股票回报的面板数据。对于每只股票,我需要计算其复合月报表(比如说30天):
(1+r_1)*(1+r_2)*...*(1+r_30) - 1
股票标识符为permno
,dm
为年和月指标。我使用以下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,这太大了,可能会影响我的最终结果(我整整两天都遇到麻烦,这可能是我的最后一招)。
我计算月度回报的方式是错误的吗?如果是这样,请建议一个更好的方法。
答案 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