程序18.2: 计算同步性
1)
use E:\trade_2007\trade_2007, clear
2)
drop stknme v25 PC PS PN tsh PE
Boustsh Aoustsh tmkcap Bmkcap Amkcap TVrate Avgpric Chgeper prcchge
DNvaltrd DNshrtrd PrevClo
3)
gen trddt = date(Trddt, "ymd")
4)
drop Trddt
5)
format trddt %dCY_N_D
6)
sort trddt
7)
merge trddt using e:\trade_2007\index\sha
8)
drop _m
9)
gen dow = dow(trddt)
10) gen year
= year(trddt)
11) keep if
year>2002
12) gen
wednesday = (dow==3)
13) sort
stkcd year trddt
14) by stkcd
year: gen week = sum(wednesday)
15) sort
stkcd year week trddt
16) by stkcd
year week: keep if _n==_N
17) sort
stkcd trddt
18) by stkcd:
gen ri = Clsprc/Clsprc[_n-1]-1 if stkcd==stkcd[_n-1]
19) by stkcd:
gen rm = sha_index/sha_index[_n-1]-1 if stkcd==stkcd[_n-1]
20) sort
stkcd year
21) by stkcd
year: keep if _N>=20
22) egen firm
= group(stkcd)
23) qui sum
firm
24) local
FIRM = r(max)
25) capture
postclose syncronicity
26) postfile
syncronicity stkcd year syn resvar return_sd
using e:\analyst\syncronicity, replace
27) forval i
= 1(1) `FIRM' {
28) disp
"`i' of `FIRM'"
29)
preserve
30) qui keep
if firm==`i'
31) local
stkcd=stkcd[1]
32) forval
year=2003(1) 2007 {
33) qui sum
ri if year==`year'
34) if
r(N)==0 {
35) disp
"zero obs, continue"
36)
continue
37) }
38) local
return_sd = r(sd)
39) qui
capture drop res
40) qui reg
ri rm if year==`year'
41) qui
predict res if year==`year', r
42) qui sum
res if year==`year'
43) local
resvar=r(Var)
44) local
r_squ = e(r2)
45) local s =
ln(`r_squ'/(1-`r_squ'))
46) post
syncronicity (`stkcd') (`year') (`s') (`resvar') (`return_sd’)
47) }
48)
restore
49) qui drop
if firm==`i'
50) }
51) postclose
syncronicity
52) clear
53)
use e:\analyst\syncronicity
程序18.2注释:
1)
读入交易数据E:\trade_2007\trade_2007.注意,在作者原始的研究中,这个程序本身是嵌套在另一个主程序(main.do)中的,主程序一开始就为Stata分配了足够的内存,所以,此时我们不再单独为Stata
分配内存,如单独运行这一程序片段,由于2007年之前的交易数据本身很大,需要用set
memory命令为Stata分配至少300兆的内存。
2)
原始的交易数据涉及很多本研究用不上的变量,因此剔除这些变量。
3)
将字符型变量Trddt(yyyy-mm-dd格式)转化成Stata的日期格式,并保存在变量trddt中
4)
删除字符型变量Trddt
5)
改变Stata的日期数据trddt的显示格式为“yyyy mm dd”
6)
将数据按照交易日期trddt从小到大排序
7)
将指数收益数据e:\trade_2007\index\sha.dta按照交易日期trddt与前面排序过的交易数据横向合并(注意,必须保证e:\trade_2007\index\sha.dta的样本已经包含一个变量Stata的日期型变量trddt,而且各个观测值已经按照交易日期trddt排序过)
8)
删除横向合并的标志变量_merge(该变量因merge命令而产生)
9)
生成变量dow (day of week,交易日为星期一则对应于dow=1)
10) 生成变量year,代表交易日对应的年份
11) 删除2002年之前的交易记录
12)
生成哑变量Wednesday,星期三的交易日对应Wednesday等于1,其它情况取值为0
13) 将数据按照股票代码,年份和交易日期升序排列
14)
对相同的股票代码和年份,生成交易日期对应的周次(定义为从上周的周三收盘到本周周三收盘),比如某只股票在2004年交易的第一个周对应的week等于1,第二周对应的week等于2,以此类推。此处用到函数sum(),它将哑变量Wednesday在相同股票代码,相同年份中,按照trddt的先后顺序进行累加
15) 数据按照stkcd year week
trddt等重新排序
16)
每一个股票代码、年份和交易周,只保留最后一个结果(周三的交易记录)
17) 将数据按照stkcd和trddt重新排序
18)
计算股票的周收益率ri,注意此处我们直接用收盘价来计算周收益率了,一般情况下,这一计算会由于分红和配股等行为而产生误差,但是,Wind数据库提供的收盘价包含复权的价格,即价格本身已经根据分红配股等行为进行了调整,而不是实际的收盘价格,因此我们可以很方便地计算股票的周收益率
19)
类似股票的周收益率,我们计算出对应的市场周收益率rm
20) 将数据按照stkcd和trddt重新排序
21)
我们要求每只股票在每一个自然年中至少交易20周,否则将其从样本中剔除
22)
以下三行计算此时样本中的股票个数,我们也可以用codebook命令来完成该任务,我们首先给股票编码,比如说按照1到1500编码,并把编码记作firm
23)
计算有关firm变量的基本统计特征,这里的目的是计算最大值
24)
将该最大值记录在一个局部宏FIRM中,以便将来循环中调用
25)
我们本来是要打开一个post文件,在调试程序中,常常由于该post文件已经打开而出错,所以我们用一个capture命令,如果post文件syncronicity已经打开,则将它关掉,否则就忽略该postclose命令
26)
定义一个post文件syncronicity,其中该文件包含变量有stkcd year syn
resvar,分别代表股票代码,年份,同步性,噪声,股票收益率的标准差等,保存在e:\analyst\syncronicity.dta文件中
27) 对每一只股票进行如下的循环 forval i = 1(1)
`FIRM' {
28) 屏幕输出计数器`i'
和总循环次数`FIRM'",以便用户知道循环进行了多少次
29)
用preserve命令预存数据,此后可以对数据进行任何操作,直到程序执行到下一个restore命令,Stata将恢复内存中的数据,到达preserve前的状态
30) 只保留公司编码为 firm==`i'的那些记录
31)
将对应的股票代码,也就是第一条记录对应的股票代码,保存在局部宏stkcd中
32)
对2003到2007年间的每一个年份进行如下的循环(这是第二层循环)forval year=2003(1) 2007 {
33)
对`year’年的记录,计算ri变量的基本统计特征,此处主要是为了得到该股票在该年中的交易周数和周收益的标准差
34) 如果交易周数r(N)==0,则执行如下的程序 {
35) 屏幕输出 "zero obs, continue"
36) 回到第二层循环的起始阶段
37) }
38) 如果r(N)==0,则定义局部宏return_sd =
r(sd),即股票周收益的标准差
39) 删除变量res(如果此变量存在的话)
40)
估计一个CAMP模型(仅仅用当前某一只股票某一个年份的数据)
41)
计算对应的残差,记作res,其中predict后面,逗号后的r代表residual,告诉Stata该预测是用来预测残差
42) 计算残差项的基本统计量
43) 将残差的方差保存在局部宏resvar中
44) 将回归模型的拟合优度 保存在局部宏r_squ中
45) 计算同步性,并保存在局部宏s中
46) 将局部宏`stkcd' `year' `s'
`resvar' `
return_sd’按照前面定义的post文件syncronicity的格式,作为一条观测记录,输出到外部文件中
47) }结束第二层循环
48) Restore将数据恢复到preserve前的水平
49)
删除股票编码firm==`i'的记录,以便内存中数据减少,提高运行速度
50) }结束第一层循环
51) 关闭post数据输出文件 syncronicity
52) 清空内存
53)
调入前面构造的post文件e:\analyst\syncronicity.dta
加载中,请稍候......