【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(3n=tn=t+2(gngˉ)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(3n=2008n=2010(gngˉ)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.2612.05)2+(11.1212.05)2+(18.7712.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 |
     +----------------------+
  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengke25

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值