玩转stata秘籍 | 巧妙利用循环(forvalues)处理股价联动问题
推文作者:西安交通大学 博士生 孙俊勤
本文在处理股价联动问题的时候,所受到的启发。
股价联动即两个股票每日收益率之间的关系,用如下公式进行计算。
首先需要将股票i,j等的每日回报率变为一列列的,同时每日还需相对应。本文以2006年部分数据为例,代码为000001-000559,共计155家公司。
use "C:\Users\lenovo\Desktop\案例\origin.dta",clear
replace return=. if return==0 //return为0,认为当天其停牌
egen id1= group(id) //以id为分组标准,同一id为一组,重新定义id1 ,使得其更有规律从1到155,便于后面的循环
操作结果如下图所示:
save "C:\Users\lenovo\Desktop\案例\origin1.dta",replace
use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear
sum id1
forvalues i=1/155{
use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear
keep if id1==`i'
rename return return`i'
drop id1 id
save "C:\Users\lenovo\Desktop\案例/`i'.dta",replace
}
forvalues是循环命令,括号{}内为循环内容,i为循环所引用的,循环内容中表示为`i',每次循环只保留一家公司,即keep if id1==`i'这步,将return变量也进行更名,去掉无关变量id,id1;最终每一家公司保存为1个dta,以便用于下面的合并,下图为第155家的2006年数据。注意点,循环中保存数据最后的一步需要为/,而不是\,即save"C:\Users\lenovo\Desktop\案例/`i'.dta",replace
合并代码如下:
use "C:\Users\lenovo\Desktop\案例/1.dta",clear
forvalues i=2/155{
merge 1:1 time using "C:\Users\lenovo\Desktop\案例/`i'.dta"
drop _merge
}
save "C:\Users\lenovo\Desktop\案例/final.dta",replace
此处合并不需要删去未匹配,为了保证最大交易日,从而不致丢失数据。
最终可得到如下数据,每一列为一个公司一年度的日回报率,如下图所示。
最后再用循环便可以算出股价联动的系数了,以下数据处理操作,读者可以模仿上面所涉及的独立尝试完成。(有问题和不足,欢迎大家指正和交流,谢谢!!)
完整代码如下:
use "C:\Users\lenovo\Desktop\案例\origin.dta",clear
replace return=. if return==0 //return为0,认为当天其停牌,故需要改为缺失值
egen id1= group(id) //以id为分组标准,同一id为一组,重新定义id1
save "C:\Users\lenovo\Desktop\案例\origin1.dta",replace
use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear
forval i=1/155 {
use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear
keep if id1==`i'
rename return return`i'
drop id1 id
save "C:\Users\lenovo\Desktop\案例/`i'.dta",replace
}
use "C:\Users\lenovo\Desktop\案例/1.dta",clear
forval i=2/155{
merge 1:1 time using "C:\Users\lenovo\Desktop\案例/`i'.dta"
drop _merge
}
save "C:\Users\lenovo\Desktop\案例/final.dta",replace
关注我们:请点击顶部“会计学术联盟”蓝色小字 朋友圈分享:请点击右上角三个点的图标,进入后点分享到朋友圈。 历史信息查看:请点击我的头像,查看历史信息,即可查看往期推送 直接长按下方二维码,“识别图中二维码”即可轻松关注。 如果您想分享您的研究心得或联系我们会计学术联盟微信公众平台,欢迎发送邮件至Accounting_AU@yeah.net,或联系主页君水皮: