加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

程序18.2: 计算同步性

(2010-08-30 19:10:44)
标签:

杂谈

程序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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有