- set rmsg on
- cap log close
- log using "cr_rangestat.log", replace
- clear
- set seed 123
- // 2000 firms
- set obs 2000
- gen long id = _n
- // 18 years
- expand 18
- bys id: gen year = 1999 + _n
- // 250 daily / 50 weekly observations
- expand 50
- gen ri = runiform()
- gen rm = runiform()
- bys id (year): gen t = _n
- xtset id t
- gen L1rm = L1.rm
- gen L2rm = L2.rm
- gen F1rm = F1.rm
- gen F2rm = F2.rm
- // rangestat
- rangestat (reg) ri L2rm L1rm rm F1rm F2rm, interval(year 0 0) by(id)
- gen e_rangestat = ri - (b_L2rm*L2rm + b_L1rm*L1rm + b_rm*rm + b_F1rm*F1rm + b_F2rm*F2rm + b_cons)
- // firm-specific returns
- gen W = ln(1+e_rangestat)
- // de-mean
- bys id year: egen W_mean = mean(W)
- replace W = W - W_mean
- * CRASH & CRASH_count
- bys id year: egen W_sd = sd(W)
- gen W_norm = (W-W_mean)/W_sd
- gen crash_week = 1 if W_norm <= -3.2
- replace crash_week = 0 if crash_week ==.
- bys id year: egen crash_count = total(crash_week)
- gen crash = 1 if crash_count != 0
- replace crash = 0 if crash_count == 0
- * NCSKEW
- gen W2 = W^2
- gen W3 = W^3
- bys id year: egen TW2 = total(W2)
- bys id year: egen TW3 = total(W3)
- bys id year: gen n = _N
- gen ncskew = -(TW3*n*(n-1)^1.5)/((n-1)*(n-2)*(TW2)^1.5)
- * DUVOL
- gen down = 0
- replace down = 1 if W < 0
- bys id year: egen down_sd = sd(W) if down == 1
- bys id year: egen up_sd = sd(W) if down == 0
- * ALL
- collapse ncskew down_sd up_sd, by(id year)
- gen duvol = ln(down_sd/up_sd)
- drop down_sd up_sd
- save "cr_rangestat.dta", replace
- sum
- log close