从经济的意义上说,你对数据的处理有点问题。
比如中国联通200403季度位列前五,且其zcgbl=0.0537,而下一季度则跌出前五,则根据你的思路示例,最终数据表中没有中国联通的数据。
个人认为最终数据表中应该包括中国联通的数据,但由于缺乏下一季度的zcgbl数据,其wijt的计算只能想个办法尽可能合理设定。
考虑上述因素之后的程序示例如下:
// 生成模拟数据,只包括关键变量
clear
set obs 20
gen dm = _n
expandcl = 8+floor(9*uniform()), cl(dm) gen(cl)
drop cl
sort dm
by dm: egen N = count(dm)
by dm: gen jd = tq(2008-4)-N+1 if _n==1
by dm: replace jd = jd[_n-1]+1 if _n>1
format jd %tqCCYY!Qq
drop N
// 生成随机不重复持仓股票代码
// 参见:
http://www.stata.com/statalist/archive/2002-06/msg00261.html
expand 15
bysort dm jd: gen zcg = _n
gen zcgbl = 0.03+0.02*invnormal(uniform())
bysort dm jd (zcgbl): drop if _n <=10
tostring zcg, format(%06.0f) replace
bysort dm jd (zcgbl): gen rank = 6-_n
reshape wide zcg zcg@bl, i(dm jd) j(rank)
save sample, replace
// main
use sample, clear
reshape long zcg zcg@bl, i(dm jd) j(rank)
bysort dm jd (rank): keep if _n==_N
keep dm jd zcgbl
xtset dm jd
gen L_min_bl = L.zcgbl
gen F_min_bl = F.zcgbl
keep dm jd L F
save minbl, replace
use sample, clear
reshape long zcg zcg@bl, i(dm jd) j(rank)
merge dm jd using minbl
drop _merge
gen wijt = .
sort dm zcg jd
by dm zcg: gen byte stay5 = (jd-jd[_n-1]==1)   // 连续进入前五样本
replace wijt = zcgbl-zcgbl[_n-1] if stay5
by dm zcg: gen byte enter5 = (jd-jd[_n-1]!=1)  // 本季度进入前五样本
replace wijt = zcgbl-L_min_bl if enter5
by dm zcg: gen byte nexit5 = (jd-jd[_n+1]!=-1)  // 下季度退出前五样本
expand = nexit5+1, gen(exit5)
replace jd = jd+1 if exit5
replace stay5 = 0 if exit5
replace enter5 = 0 if exit5
replace wijt = zcgbl-F_min_bl if exit5
keep if wijt != .
ren zcg gp
sort dm gp jd
keep dm jd gp wijt stay5 enter5 exit5
save last, replace