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 == 2
list 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{
preserve
keep if count == `i'
drop count
save 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 ,d
global row_year = 3 // 三年滚动求和
global range_low = r(min)
global range_high = r(max) - $row_year + 1
forv i = $range_low/$range_high{
local j = `i' + $row_year - 1
gen cond_bin = (year >= `i' & year <= `j')
egen m_`i' = mean(value) if cond_bin == 1
ereplace m_`i' = mean(m_`i')
gen rolling_`i' = (value - m_`i')^2 if cond_bin == 1
ereplace rolling_`i' = total(rolling_`i') if cond_bin == 1
replace 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'.dta
erase 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 |
+----------------------+