利用 CSMAR 1999-2018 之日资料,有三种产业分类 (ind1,ind2,ind3) 以计算产业加权报酬率,然后针对每一种产业报酬率,每公司、每年跑一条 (约 35,000) 回归。要先 ssc install asreg。
- set rmsg on
- cd "E:\Indep-R2"
- cap log close
- log using "log\r2d_ind.log", replace
- use "dta\日個股回報率文件.dta", clear
- merge m:1 Markettype ymd using "dta\日市場回報率文件.dta", nogen
- merge m:1 id using "dta\ind.dta", nogen
- /*
- gen ri_Dsmvosd = ri*Dsmvosd
- rangestat (sum) Dsmvosd ri_Dsmvosd, interval(ymd 0 0) by(ind1) excludeself
- gen rind1 = ri_Dsmvosd_sum/Dsmvosd_sum
- */
- foreach i of varlist ind1 ind2 ind3 {
- bys ymd `i': egen tem1_`i' = total(Dsmvosd)
- gen tem2_`i' = tem1_`i'-Dsmvosd
- bys ymd `i': egen tem3_`i' = total(ri*Dsmvosd)
- gen tem4_`i' = tem3_`i'-ri*Dsmvosd
- gen r`i' = tem4_`i'/tem2_`i'
- }
- sort id ymd
- bys id (year): gen t = _n
- xtset id t
- ren rm_e rm
- foreach v of varlist rm rind1 rind2 rind3 {
- gen L1`v' = L1.`v'
- }
- /*
- gen L1rm = L1.rm
- gen L2rm = L2.rm
- gen F1rm = F1.rm
- gen F2rm = F2.rm
- */
- // asreg
- foreach v of varlist rind1 rind2 rind3 {
- bys id year: asreg ri rm L1rm `v' L1`v' , fit
- ren _R2 r2d_`v'
- drop _*
- }
- ren (r2d_rind1 r2d_rind2 r2d_rind3) (r2d1 r2d2 r2d3)
- collapse (mean) r2d1 r2d2 r2d3, by(id year)
- save "dta\r2d_ind.dta", replace
- log close
复制代码"每一产业"约需 22 秒。但用 statsby 约需 7.5 个小时,就不要说用 loop (foreach/forvalues) 了。