免费的股价同步性,一片片从邮局寄来

2016-11-16 李春涛&余金馨 爬虫俱乐部 爬虫俱乐部
本推文由李春涛教授指导,向大家介绍股价同步性计算的stata程序,与上一期推文“免费事件研究,一片片从邮局寄来”一样,今天的推文将继续用到好用的post命令。

股 价同步性,即单个公司股票价格的变动与市场平均变动之间的关联性,是测度企业财务信息透明度的重要指标。透明度高的企业,其信息会很快反映在股价中导致股 票价格背离市场指数波动,同步性下降。而对于透明度低的企业,企业信息不可得,投资者对企业的判断基于宏观形势,由此表现出股票价格与市场指数“同涨同 跌”,股价同步性上升。这一指标在学术界受到了广泛的关注。Morck et al.(2000)发表在JF的文章指出中国是股价同步性最高的两个国家之一;而Jin and Myers(2006)发表在JFE的研究中表明我国股价同步性是最高的。国内学者也逐渐开始关注我国同步性指标,李春涛教授(2013)关于我国上市银行透明度研究一文曾在《金融研究》发表。

关于股价同步性的计算,Morck et al.(2000)提出了用个股收益与市场收益回归的R2代表股价同步性的观点。Durnev et al.(2003)在此观点基础上提出了同步性计算做法:1.个股每年收益率和市场收益率做一次回归分析;2.通过回归分析得到一个拟合优度R2;3.将拟合优度通过对数转换得到衡量股票同步性的指标(syn)。

拟合优度R2与同步性syn转化公式为:


接下来,我们就运用stata来做股价同步性研究。

股价同步性研究数据准备之市场收益率获取

股价同步性计算需要数据准备之一便是市场收益率,即股指。cnindex命令可以帮助我们获得指数的日数据(提醒大家注意,cnidex目前还不能在stata14中使用,13版可放心使用)

因此我们需要在13版中检查我们是否已经安装了cnindex,若无则安装,步骤如下:

cap which cntrade
if _rc!=0{
ssc install cntrade
}

安装完成后输入命令:

cnindex 000300, path("c:/同步性/")

即可得到沪深300指数的日数据。

所 得数据中,我们只需要日期和收益率两个指标。并且为了同步性的计算工作,我们需要将日数据转化为周数据。而将一周内多个交易日的收益率相加得到的收益率往 往因为会受到周末效应的影响而饱受诟病,因此我们要将自然周转化为非自然周。比如用周三收盘到下一个周三收盘的日收益率累积计算周收益率。命令程序如下:

keep date rit         只保留我们所需的日期和收益率指标
rename rit rmt         为了和个股收益率相区分,用rmt代表市场收益率
gen year = year(date)
gen dow = dow(date)
gen week = week(date)
replace week = week-1 if dow<=2         自然周转化为每周三到下个周三的非自然周
sort year week dow             将非自然周的交易日分组
by year week: gen rmw=sum(rmt)       每周每个交易日收益率依次相加
by year week: keep if _n==_N          保留每周最后一行
(由于sum命令是将本日数据与昨日数据相加,我们的周数据即为每周最后一日sum值,保留该值即可。)
keep year week rmw
sort year week
save "c:/同步性/index.dta",replace

至此,通过cnindex我们成功拿到了每年每周市场收益率。


股价同步性研究数据准备之个股收益率获取

cntrade可以获取上市公司历史交易数据,包括每日收益率。同市场收益率一样,我们需要通过整理得到每年每周收益率。以万科A为例:

cntrade 2
keep stkcd rit date
destring rit, force replace           将收益率强制转化为数值型,避免其为字符型
gen year = year(date)
keep if year>2010 & year<2016    只研究2010-2016年
gen dow = dow(date)
gen week = week(date)
replace week = week-1 if dow<=2
sort year week dow
by year week: gen riw=sum(rit)
by year week: keep if _n==_N
sort year week riw
by year: keep if _N>=20         删除不足20个交易周的公司年度
sort year week

个股每年每周市场收益率也轻松搞定~  我们可以发现个股收益率和市场收益率有相同的year、weak变量,为了便于收益率的回归分析,我们可以通过year、weak将个股收益率和市场收益率横向合并为一个文件,这个工作只需再加一个merge命令:

merge year week using c:/同步性/index.dta, nokeep
drop _m

股价同步性研究之计算同步性

我们已经得到了2010-2016年每年每周万科股票收益率和市场收益率,做完了全部的数据准备工作,接下来就需要对个股收益率和市场收益率做回归分析得到R2进而计算出同步性。由于2010-2015年每一年都需要做一次回归分析,我们可以对年份进行循环,命令如下:

levelsof year,local(YEAR)
foreach y of local YEAR {
 qui reg riw rmw if year==`y'             得到r2
 local syn =  ln(e(r2)/(1- e(r2) ))        e()放入回归得到的r2值计算同步性并将结果放入宏
 }

循环得到多只股票同步性

比如我们要得到股票代码为1、2、600900、601666同步性数据,可以在万科数据处理命令基础上通过foreach命令对四只股票循环来得到。命令如下:

foreach stkcd in 1 2  600900 601666 {
cntrade `stkcd’
keep stkcd rit date
destring rit, force replace
gen year = year(date)
keep if year>2010 & year<2016
gen dow = dow(date)
gen week = week(date)
replace week = week-1 if dow<=2
sort year week dow
by year week: gen riw=sum(rit)
by year week: keep if _n==_N
sort year week riw
by year: keep if _N>=20
sort year week
merge year week using c:/同步性/index.dta, nokeep
drop _m
 
levelsof year,local(YEAR)
foreach y of local YEAR {
 qui reg riw rmw if year==`y'
 local syn =  ln(e(r2)/(1- e(r2) ))
}

post寄出股价同步性数据

上述处理,我们将每股每年同步性local放入了宏,但我们想把这些零散的信息整理到一个文件中。这时候,就需要用到数据整理法宝级命令——post,来将local里的信息装入信封寄出。

首先,我们来看一看要邮寄哪些信息:stkcd(股票代码)Year(年份)syn(同步性)根据所需信息我们就可以在数据整理之前先定义邮件,设定好接收地址:

postfile syn stkcd year syn using c:/同步性/syn, replace

再用post将我们循环得到的每股每年同步性数据按照定义的格式邮寄到我们设定好的地址:        

post syn (`stkcd') (`y') (`syn')

一份份股票同步性数据寄出后,我们关闭邮件系统即可:

postclose syn

use c:/同步性/syn 打开syn文件,四只股票每年的同步性数据一目了然:

(注意我们删除了删除不足20个交易周的公司年度)
后记
附全部程序:
clear
capture mkdir "c:/同步性/"
 
cap which cnindex
if _rc!=0{
ssc install cnindex
}
 
cap which cntrade
if _rc!=0{
ssc install cntrade
}
 
capture postclose syn
postfile syn stkcd year syn using c:/同步性/syn, replace
 
cnindex 000300, path("c:/同步性/")
keep date rit
rename rit rmt
gen year = year(date)
gen dow = dow(date)
gen week = week(date)
replace week = week-1 if dow<=2
sort year week dow
by year week: gen rmw=sum(rmt)
by year week: keep if _n==_N
keep year week rmw
sort year week
save "c:/同步性/index.dta",replace
 
 
foreach stkcd in 1 2  600900 601666 {
cntrade `stkcd'
keep stkcd rit date
destring rit, force replace
gen year = year(date)
keep if year>2010 & year<2016
gen dow = dow(date)
gen week = week(date)
replace week = week-1 if dow<=2
sort year week dow
by year week: gen riw=sum(rit)
by year week: keep if _n==_N
sort year week riw
by year: keep if _N>=20
sort year week
merge year week using c:/同步性/index.dta, nokeep
drop _m
 
levelsof year,local(YEAR)
foreach y of local YEAR {
 
 qui reg riw rmw if year==`y'
 local syn =  ln(e(r2)/(1- e(r2) ))
 post syn (`stkcd') (`y') (`syn')
 }
}
postclose syn
use c:/同步性/syn, clear

说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场,点赞打赏,且随心意。今朝点滴,让我们更进一步;他年涌泉,更好的文章给更好的你。

编辑 by.徐苾雯

往期推文推荐:

1.天路——chinafin与cntrade命令

2.分时数据,从此唾手可得

3.有了这个命令,以后还怕重复?

4.esttab功能挖掘:“Yes”or“No”

5.用“套路”处理数据

6.厉害了,我stata哥

7.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度

8.据说这样数据替换比较快,你试一下,然后……

9.众里寻她千百度,synth命令来帮助!

10.I have a Stata, I have a python

11.用subinfile修改文件,滚蛋吧,繁琐的命令君!

12.删繁就简三秋叶,subinfile似剪刀



此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:xueyuan19920310@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


长按二维码关注公众号

微信扫一扫
关注该公众号