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

累乘法计算事件收益率(SAS+STATA)

(2014-05-02 11:20:25)
标签:

sas

数据处理

体育

分类: 03SAS数据处理

累乘法计算事件收益率。  需要注意的问题:

1.数据中间有缺失(我的办法是赋值为0,还有其他办法);

2.上市公司2千多家,如果计算所有公司的累乘(if set time interval:180/360days)计算耗用memory 较大,STATA不够用,电脑内存大应该可以克服这个问题,alternatively, 把数据分割后处理,最后合并。

参考:http://bbs.pinggu.org/thread-881526-1-1.html

code

date

1

20010102

1

20010103

1

20010105

1

20010506

2

20030201

2

20030206

2

20030406


上面的表格是事件数据

code

date

ret

1

20010101

0.001

1

20010102

0.011

1

20010103

0.021

1

20010104

0.031

1

20010105

0.041

1

20010106

0.051

1

20010107

0.061

1

20010108

0.071

1

20010109

0.081

1

20010110

0.091

1

20010505

0.101

1

20010506

0.111

1

20010507

0.121

1

20010508

0.131

1

20010509

0.141

1

20010510

0.151

1

20010511

0.161

1

20010512

0.171

1

20010513

0.181

2

20030201

0.191

2

20030202

0.201

2

20030203

0.211

2

20030204

0.221

2

20030205

0.231

2

20030206

0.241

2

20030207

0.251

2

20030405

0.261

2

20030406

0.271

2

20030407

0.281

2

20030408

0.291



上面的表格是收益率数据


code

date

rrer(10)

1

20010102

 

1

20010103

 

1

20010105

 

1

20010506

 

2

20030201

 

2

20030206

 

2

20030406

 



现在要计算上面的表格,也就是对每一个事件发生之后10日的累积股票收益率(累积乘法 方法计算)
注意,有的日子里有事件发生但是不是交易日,这样子的情况,需要将事件发生日期顺延到下一个交易日。

 

 

 

 

data a;

        input code date:yymmdd8.;

format date yymmdd10.;

datalines;

1 20010101

1 20010103

1 20010105

1 20010506

2 20030201

2 20030206

2 20030406

;

run;

 

data b;

        input code date:yymmdd8. ret;

        id+1;

        format date yymmdd10.;

datalines;

1 20010101 0.001

1 20010102 0.011

1 20010103 0.021

1 20010104 0.031

1 20010105 0.041

1 20010106 0.051

1 20010107 0.061

1 20010108 0.071

1 20010109 0.081

1 20010110 0.091

1 20010505 0.101

1 20010506 0.111

1 20010507 0.121

1 20010508 0.131

1 20010509 0.141

1 20010510 0.151

1 20010511 0.161

1 20010512 0.171

1 20010513 0.181

2 20030201 0.191

2 20030202 0.201

2 20030203 0.211

2 20030204 0.221

2 20030205 0.231

2 20030206 0.241

2 20030207 0.251

2 20030405 0.261

2 20030407 0.271

2 20030408 0.281

2 20030409 0.291

;

run;

 

proc sql;

        create table c as

                select

                        a.*

                        ,min(b.date) as evt_date format=yymmdd10.

                        ,min(b.id) as evt_id

                from a a

                inner join b b

                on a.code=b.code

                        and a.date<=b.date

                group by

                        a.code

                        ,a.date

        ;

quit;

 

proc sql;

        create table d as

                select

                        a.*

                        ,exp(sum(log(b.ret))) as rrer label='rrer(10)'

                from c as a

                inner join b as b

                on a.code=b.code

                        and b.id-a.evt_id between 0 and 9

                group by

                        a.code

                        ,a.date

                        ,a.evt_date

                        ,a.evt_id

                ;

quit;



STATA  例子: 

计算累计的收益率 比较简单的代码。

clear all

set mem 500m

set more off

use d:\result01

rename stkcd code

rename trddt date

replace dretwd=0 if dretwd==.

keep if code=="000001"

*drop in 1/1

*drop if date>"2014-03-05"

sort code date

gen rate=dretwd+1

capture drop product1

by code:gen product1=rate

forv i=2/180 {

local j=`i'-1

g product`i'=rate*product`j'[_n+1]

}


gen ind_return=product180-1

*keep date cdretwdtl mkt_return

save d:\kkk01.dta,replace

0

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

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

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

新浪公司 版权所有