【stata】求滚动波动情况
0.计算对象
计算 t t t、 t + 1 t+1 t+1、 t + 2 t+2 t+2 这三起滚动波动情况
V o l i , t = l n ( ∑ n = t n = t + 2 ( g n − g ˉ ) 2 3 ) Vol_{i,t} = ln(\sqrt{\frac{\sum_{n=t}^{n=t+2}(g_{n}-\bar{g})^2}{3}}) Voli,t=ln(3∑n=tn=t+2(gn−gˉ)2)
e . g e.g e.g: 假设 2008-2010的value分别为【6.264004 】、 【11.11958】 、 【18.7657】
三年均值 g ˉ \bar{g} gˉ等于【12.049761】
此处数据与stata模拟数据一致,便于对比手动计算结果
和代码计算结果
是否一致,
进而证明代码的有效性。
. di (6.264004 + 11.11958 + 18.7657) / 3
12.049761
V o l i , 2008 = l n ( ∑ n = 2008 n = 2010 ( g n − g ˉ ) 2 3 ) Vol_{i,2008} = ln(\sqrt{\frac{\sum_{n=2008}^{n=2010}(g_{n}-\bar{g})^2}{3}}) Voli,2008=ln(3∑n=2008n=2010(gn−gˉ)2)
V o l i , 2008 = l n ( ( 6.26 − 12.05 ) 2 + ( 11.12 − 12.05 ) 2 + ( 18.77 − 12.05 ) 2 3 ) Vol_{i,2008} = ln(\sqrt{\frac{(6.26-12.05)^2 + (11.12-12.05)^2 + (18.77-12.05)^2 }{3}}) Voli,2008=ln(3(6.26−12.05)2+(11.12−12.05)2+(18.77−12.05)2)
V o l i , 2008 = l n ( 79.5474 3 ) Vol_{i,2008} = ln(\sqrt{\frac{79.5474 }{3}}) Voli,2008=ln(379.5474)
V o l i , 2008 = l n ( 26.5158 ) Vol_{i,2008} = ln(\sqrt{26.5158}) Voli,2008=ln(26.5158)
V o l i , 2008 = l n ( 5.1493495 ) Vol_{i,2008} = ln(5.1493495) Voli,2008=ln(5.1493495)
V o l i , 2008 = 1.63 Vol_{i,2008} = 1.63 Voli,2008=1.63
1.模拟数据
clear
set seed 123
set obs 10// ssc install egenmore,replace
egen id = repeat(),v(1/2)
sort id
egen year = repeat(),v(2008/2012)
gen value = uniform() * 20
replace year = year - 1 if id == 2list id year value
运行结果
Number of observations (_N) was 0, now 10.(5 real changes made)+----------------------+| id year value ||----------------------|1. | 1 2008 6.264004 |2. | 1 2009 11.11958 |3. | 1 2010 18.7657 |4. | 1 2011 14.72644 |5. | 1 2012 3.848151 ||----------------------|6. | 2 2007 3.902801 |7. | 2 2008 19.0192 |8. | 2 2009 5.808908 |9. | 2 2010 16.38165 |10. | 2 2011 9.764193 |+----------------------+
2.根据unit id 拆分成多个dta
egen count = group(id)
su count,d
global dim = r(max)forv i = 1/$dim{preservekeep if count == `i'drop countsave temp`i'.dta,replace restore
}
3.对于每一个unit滚动求和
先定义滚动3年
然后求这3年内的value的平均 g ˉ \bar{g} gˉ
再用逐年的数值减去均值,
而后求平方项 / 3
最后取对数
forv id = 1/$dim{
use temp`id'.dta,replace
su year ,dglobal row_year = 3 // 三年滚动求和global range_low = r(min)
global range_high = r(max) - $row_year + 1forv i = $range_low/$range_high{local j = `i' + $row_year - 1gen cond_bin = (year >= `i' & year <= `j')egen m_`i' = mean(value) if cond_bin == 1ereplace m_`i' = mean(m_`i')gen rolling_`i' = (value - m_`i')^2 if cond_bin == 1ereplace rolling_`i' = total(rolling_`i') if cond_bin == 1replace rolling_`i' = ln(sqrt(rolling_`i' / $row_year))drop cond_bin
}
keep id rolling*
forv i = $range_low/$range_high{ereplace rolling_`i' = mean(rolling_`i')
}
duplicates drop id ,force
reshape long rolling_,i(id) j(year)
save rolling_`id'.dta,replace
}
4.合并/清除数据
use rolling_1.dta,replace
forv id = 2/$dim{append using rolling_`id'.dta
}
forv i = 1/$dim{erase temp`i'.dtaerase rolling_`i'.dta
}
save rolling.dta,replace
5.运行结果
use rolling.dta,clear
list id year roll in 1/6
结果对比
:可以看到,id=1时,year=2008时,代码计算结果也为1.63,与手动计算结果一致,证明了代码的有效性
+----------------------+| id year rolling_ ||----------------------|1. | 1 2008 1.638221 |2. | 1 2009 1.138851 |3. | 1 2010 1.840516 |4. | 2 2007 1.905365 |5. | 2 2008 1.741902 |6. | 2 2009 1.472856 |+----------------------+