楼主: stefaniekenny
2190 7

这样的问题,sas应该如何编程呢? [推广有奖]

  • 0关注
  • 0粉丝

本科生

54%

还不是VIP/贵宾

-

威望
0
论坛币
290 个
通用积分
0.1200
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1672 点
帖子
99
精华
0
在线时间
79 小时
注册时间
2008-11-3
最后登录
2019-6-13

楼主
stefaniekenny 发表于 2010-8-13 08:57:38 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我的数据集是这样的:
date                        name              rt(每日收益)
1995-01-01            A                      ……
1995-01-02            A                      ……
……
……
2009-12-31            A                         ……

1995-01-01             B                           ……

……
2009-01-01            B                              ……

……
一共有1000多个股票,每个股票都是在95年到2009年这个时间区间上,但不是每一天都有收益率,有的可能是从2002年6月到2009年12月31等。

就是类似这样的数据集,

我想实现(最终得到数据集,不是要输出结果):
1.首先计算abc=r(t)*r(t-1),注:每个月第一天该值为零。
2.然后把每个月中的每天的abc相加求和(时间序列上)。
3.得到每只股票月度abc后,求每年每月所有股票abc的均值(横截面上)。

本人对sas比较白,一知半解,希望大家帮下忙,如果很复杂,可以以论坛币答谢,绝不吝啬。谢谢。
二维码

扫码加我 拉你入群

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

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

关键词:name 输出结果 一知半解 时间序列 date SAS

回帖推荐

hopewell 发表于2楼  查看完整内容

本帖被以下文库推荐

沙发
hopewell 发表于 2010-8-13 10:04:56
  1. data raw;
  2.         input date yymmdd10. name $ rt;
  3.         format date yymmdd10.;
  4. datalines;
  5. 2010-01-01 A 1
  6. 2010-01-02 A 2
  7. 2010-01-03 A 3
  8. 2010-02-01 A 4
  9. 2010-02-02 A 5
  10. 2010-02-03 A 6
  11. 2010-01-01 B 2
  12. 2010-01-02 B 3
  13. 2010-01-03 B 4
  14. 2010-02-01 B 5
  15. 2010-02-02 B 6
  16. 2010-02-03 B 7
  17. ;
  18. data temp(index=(month_name=(date_month name)));
  19.         set raw;
  20.         date_month=intnx('month',date,0,'b');
  21.         format date_month yymm7.;
  22. run;
  23. data temp(keep=date_month name abc);
  24.         do _n_=1 by 1 until(last.name);
  25.                 set temp;
  26.                 by date_month name;
  27.                 day_abc=rt*ifn(_n_=1,0,lag(rt));
  28.                 abc=sum(abc,day_abc);
  29.         end;
  30. run;
  31. proc means data=temp noprint;
  32.         var abc;
  33.         class date_month;
  34.         output out=temp(where=(_type_>0)) mean=abc_mean;
  35. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
stefaniekenny + 1 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
jingju11 发表于 2010-8-13 11:49:44
很好啊:借问一个问题---如果其中date不按照顺序给出,但是r(t)*r(t-1)是和日期的顺序相关。用index有再排列的功能吗?如果没有,那和by date_month notsorted; 有什么区别呢?如果本来就排列就绪,那么index的好处在哪里呢?(我想这是你用index的关键考虑吧)。

板凳
hopewell 发表于 2010-8-13 13:29:52
3# jingju11
眼真尖,又被你抓到...
确实依赖原始数据的排序,不然r(t-1)成问题
用index只是考虑数据集可能比较大,不想proc sort

报纸
stefaniekenny 发表于 2010-8-13 15:10:47
数据集确实比较大,有300多万,元数据集有拍过序的,by name date

地板
stefaniekenny 发表于 2010-8-14 10:24:25
一。数据集确实比较大,有300多万,元数据集有拍过序的,by name date。

其实我问题的公式是这样的,EWAVt=(1/Nt)∑[∑r(id)**2+2*∑r(id)*r(id-1)]

第一个∑从i=1--Nt,Nt是第t个月的股票数;第二个∑从d=1--Dt,Dt是第t个月的天数;第三个∑从d=2--Dt,r(id)就是我前面说的r(t);

这和我前面说的唯一差别是多了一个r(id)的平方,和后面躲乘以了个2,本来以为自己可以修改下程序实现,发现不怎么懂,希望高手们给修改下。

主要意思是:(最终得到数据集,不是要输出结果):
1.首先计算abc=r(id)*r(id-1),注:每个月第一天该值为零,计算edf=r(id)**2,
2.然后把每个月中的每天的abc相加求和(时间序列上),记为sum1;把每个月中的每天的edf相加求和(时间序列上),记为sum2,
3.得到每只股票月度sum1,sum2后,求得sum3=sum2+2*sum1,最后得到每年每月所有股票sum3和的均值(横截面上,即这个和除以当月股票数量)。

7
hopewell 发表于 2010-8-14 12:20:57
Q1
  1. data r;
  2.         input date yymmdd10. name $ r;
  3.         format date yymmdd10.;
  4. datalines;
  5. 2010-01-01 A 1
  6. 2010-01-02 A 2
  7. 2010-01-03 A 3
  8. 2010-02-01 A 4
  9. 2010-02-02 A 5
  10. 2010-02-03 A 6
  11. 2010-01-01 B 2
  12. 2010-01-02 B 3
  13. 2010-01-03 B 4
  14. 2010-02-01 B 5
  15. 2010-02-02 B 6
  16. 2010-02-03 B 7
  17. ;
  18. /*proc sort data=r out=r;*/
  19. /*        by name date;*/
  20. /*run;*/
  21. data month_data(index=(month_name=(date_month name)));
  22.         set r;
  23.         date_month=intnx('month',date,0,'b');
  24.         format date_month yymm7.;
  25. run;
  26. data month_data(keep=date_month name sum3);
  27.         do _n_=1 by 1 until(last.name);
  28.                 set month_data;
  29.                 by date_month name;
  30.                 abc=r*ifn(_n_=1,0,lag(r));
  31.                 edf=r**2;
  32.                 sum1=sum(sum1,abc);
  33.                 sum2=sum(sum2,edf);
  34.                 sum3=sum2+2*sum1;
  35.         end;
  36. run;
  37. proc means data=month_data noprint;
  38.         var sum3;
  39.         class date_month;
  40.         output out=ewav(where=(_type_>0)) mean=ewav;
  41. run;
复制代码

8
xiaoxiahu0571 发表于 2010-8-17 15:52:34
7# hopewell    上面的set/set用法可否介绍下?你的代码我看不懂,关于两个set的链接部分 谢谢!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 06:58