楼主: douweifeng
9393 16

proc expand 求助!!!! [推广有奖]

  • 0关注
  • 1粉丝

已卖:8份资源

博士生

53%

还不是VIP/贵宾

-

威望
0
论坛币
122 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
972 点
帖子
122
精华
0
在线时间
448 小时
注册时间
2009-3-8
最后登录
2022-7-28

楼主
douweifeng 发表于 2010-7-21 22:58:59 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
现有数据如下:
   cusip   date               return
10002     01JAN1988     0.025
10002     02JAN1988     0.01
  。          。
  。          。
  。          。
10003      01JAN1988     0.007
  。          。
10004       01JAN1988     0.008



cusip是有10000家firm,date从1988年1月1日到2000年12月31日,return是股票交易日的日return,所以日期并不是连续的
我现在想做的事情是将一家公司每一交易日之后整整一年的股票收益率求出来,即:对第一个观测值来说,求year_return=sum(return)where  01JAN1988<=date<31DEC1988,对第二个观测值来说是year_return=sum(return)where  02JAN1988<=date<01JAN1989,后面的依次求出
本人sas初学,请教各位大侠,如何用proc expand做出来呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:expand EXP ROC RETURN Where 求助 proc expand

沙发
BraveMadMan 发表于 2010-7-21 23:15:47
为什么非得用proc expand?你要的东西最简单的办法是用proc sql.

参见 http://www.pinggu.org/bbs/viewth ... p;page=1#pid6330159

proc sql;
  create table AnnualRets as
select distinct cusip, year(date) as year, exp(sum(log(1+return)))-1 as ret_annual
  from dailydata
  group by cusip, calculated year;
quit;
已有 1 人评分热心指数 收起 理由
jingju11 + 1 好啊。

总评分: 热心指数 + 1   查看全部评分

Don't get lost in technical details. What is the big picture?

藤椅
jingju11 发表于 2010-7-22 09:36:50
douweifeng 发表于 2010-7-21 22:58
现有数据如下:
   cusip   date               return
10002     01JAN1988     0.025
10002     02JAN1988     0.01
  。          。
  。          。
  。          。
10003      01JAN1988     0.007
  。          。
10004       01JAN1988     0.008



cusip是有10000家firm,date从1988年1月1日到2000年12月31日,return是股票交易日的日return,所以日期并不是连续的
我现在想做的事情是将一家公司每一交易日之后整整一年的股票收益率求出来,即:对第一个观测值来说,求year_return=sum(return)where  01JAN1988
Proc expand is a very interesting procedure. Hopefully someone can offer the help.

板凳
douweifeng 发表于 2010-7-22 15:06:36
非常感谢你的帮助,不过有两个问题:
1、我想要计算的是每一个观测值之后一年的sum_return,并非是某一年的,比如说如果第十二个观测值的date是02MAR1988,那我想要的return就是从02MAR1988到01MAR1989的sum_return;
2、因为我的数据有3千万条,如果用sql的话可能要跑上一两天的时间,机器不是很高端,所以希望能通过proc expand来解决
希望得到你的回复,多谢!! 2# BraveMadMan

报纸
BraveMadMan 发表于 2010-7-22 20:05:04
不好意思,没看仔细。推荐你写个宏,滚动提取数值,然后用proc sql求和。

用proc expand作滚动求和,难点在于你“每年”的观测值不一样。proc expand要求一个指定的观测值。比如,从月到年容易,因为每年12个月是固定的。我想应该可以用宏让这个观测值变动起来,不过这样就太麻烦了。

另外有个问题:你的数据是美国的吗?为什么不用PERMNO而用CUSIP呢?
Don't get lost in technical details. What is the big picture?

地板
jingju11 发表于 2010-7-23 02:30:22
1# douweifeng

  1. data have; *simulate a data set;
  2. do cusip = 10000 to 20000;
  3.   do date = '01Jan1988'd to '31dec2000'd;
  4.    return = ranuni(1);if weekday(date) notin (1 7)  then output;
  5.   end;
  6. end;
  7. format date date11.;
  8. run;
  9. proc sort data = have out = have1; by cusip date; run;
  10. proc sql;
  11. create table have0 as select distinct cusip from have1;
  12. quit;
  13. data have2; *an ideal data with consecutive dates and set return as 0;
  14. set have0;
  15. do date = '01Jan1988'd to '31dec2000'd;
  16.   return = .; output;
  17. end;
  18. format date date11.;
  19. run;
  20. data have3; *data for expand inputs;
  21. update have2 have1; by cusip date;
  22. run;
  23. proc expand data =have3 out =have4  method = none;
  24. by cusip; id date;
  25. convert return = sum/transformout= (reverse movsum 365 reverse); *problem here: how to tell the leap year;
  26. run;
复制代码
差不多5千万的数据,用时大概十分钟。我的问题是无法解决闰年的问题。希望有人帮助。
已有 1 人评分热心指数 收起 理由
BraveMadMan + 1 赞热情

总评分: 热心指数 + 1   查看全部评分

7
jingju11 发表于 2010-7-23 03:02:28
一个笨办法去解决这个问题是,如果闰年,用366天。程序类似于

  1. proc expand data =have3 out =have4  method = none;
  2. by cusip; id date;
  3. convert return = sum1/transformout= (reverse movsum 365 reverse);
  4. convert return = sum2/transformout= (reverse movsum 366 reverse);
  5. run;
  6. data have5;
  7. set have4;
  8. sum = sum1;
  9. if year(date) in (1988, 1992, 1996) then if month(date) in (1 2) then sum = sum2;
  10. run;
复制代码
这个额外的过程应该用时在5分钟之内。

8
BraveMadMan 发表于 2010-7-23 03:30:21
6# jingju11

一年里大约只有250个交易日(周一到周五,扣除节假日),并且每年的交易日是不固定的。
Don't get lost in technical details. What is the big picture?

9
jingju11 发表于 2010-7-23 04:00:52
BraveMadMan 发表于 2010-7-23 03:30
6# jingju11

一年里大约只有250个交易日(周一到周五,扣除节假日),并且每年的交易日是不固定的。
这个没有关系。求和不受零值的影响。

10
BraveMadMan 发表于 2010-7-23 04:10:35
jingju11 发表于 2010-7-23 04:00
BraveMadMan 发表于 2010-7-23 03:30
6# jingju11

一年里大约只有250个交易日(周一到周五,扣除节假日),并且每年的交易日是不固定的。
这个没有关系。求和不受零值的影响。
如果非交易日的数据为零的话,是没影响。但是我接触的数据库里,没有一个显示非交易日数据的。也就是说,如果proc expand里用365的话,就不是每年求和了,而是每365个交易日求和了。

这里是一个CSMAR里的股票交易数据库样本: check.rar (453.74 KB) 本附件包括:
  • check.sas7bdat
Don't get lost in technical details. What is the big picture?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 07:11