楼主: gazifjfz
2576 7

分组计算当年5月至次年4月收益率之和 [推广有奖]

  • 0关注
  • 0粉丝

已卖:34份资源

博士生

4%

还不是VIP/贵宾

-

威望
0
论坛币
418 个
通用积分
0.3564
学术水平
7 点
热心指数
12 点
信用等级
9 点
经验
33609 点
帖子
302
精华
0
在线时间
141 小时
注册时间
2009-6-3
最后登录
2020-5-14

楼主
gazifjfz 发表于 2013-11-12 20:24:48 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
下面的数据是个股的月收益率,我想每支股票求当年5月至次年4月的月收益率之和,应该怎么做呢?比如代码是000002的股票,其1995年的年收益率应当是1995年5月至1996年4月月收益率之和。谢谢!
QQ截图20131112202836.png





二维码

扫码加我 拉你入群

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

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

关键词:收益率 年收益率 怎么做 收益率

沙发
playmore 发表于 2013-11-13 08:49:42
如果数据没有缺失的话,可以先构建个变量,区分不同的时期

data want;
set have;
retain id 0;
if month(date) eq 5 then id+1;
run;

然后在proc means中by id就可以了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

藤椅
moyunzheng 发表于 2013-11-13 16:08:57
为了避免有日期缺失和排序错乱的情况,建议将日期归属到特定的时间区间,如2009.05-2010.04
  1. data test;
  2. do date='01jan2000'd to '12dec2010'd;
  3. x=rand("UNIFORM");
  4. output;
  5. end;
  6. run;

  7. proc sql noprint;
  8. create table test2
  9.         as select cats(ifn(month(date) in (1 2 3 4),year(date)-1,year(date)),'.05-',ifn(month(date) in (1 2 3 4),year(date),year(date)+1),'.04') as date_group,sum(x) as sum(x)
  10.         from test
  11.         group by date_group;
  12. quit;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 原来SAS也有三目运算符,推荐!

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

板凳
believe448 在职认证  发表于 2013-11-14 13:03:25
用proc means data=数据集 sum;
var 月利率;
where 1995年5月<= 日期<= 1996年4月;
run;
的语句可以不?
初学者,请各位大侠指导

报纸
zhou.wen 发表于 2013-11-14 17:04:01
believe448 发表于 2013-11-14 13:03
用proc means data=数据集 sum;
var 月利率;
where 1995年5月
'where' is not a valid statement in proc means.
playmore's method is good ,it is easy to learn.
Practice Is The Best Teacher!

地板
gazifjfz 发表于 2013-11-16 22:23:44
moyunzheng 发表于 2013-11-13 16:08
为了避免有日期缺失和排序错乱的情况,建议将日期归属到特定的时间区间,如2009.05-2010.04
能麻烦你详细解释一下SQL中间那段程序吗?我没太看懂。
而且用in(1,2,3,4)的话也可能出问题。比如一家公司是1996年8月才上市,那我当年的收益是不能累积的,应该到1997年4月才开始累积收益。那我应该怎样控制呢?

7
yongyitian 发表于 2013-11-17 10:04:50
  1. /* you need a cross_year (fiscal year) variable for grouping */
  2. /* use either proc sql; or proc means to get the sum */

  3. data a;
  4.    format ID z6. date yymmdd10.;
  5.    do id = 1 to 3;
  6.      do date = '31May1995'd to '30Apr1997'd;
  7.         m_return = rannor(123);
  8.          if date = intnx('month', date, 0, 'E') then  output;
  9.      end;
  10.     end;
  11. run;

  12. data b;
  13.     set a;
  14.     length fyear $9.;    /* fyear: variable for fiscal year */
  15.      if month(date) >= 5 then  
  16.            fyear = catx('_', put(year(date),4.),   put(year(date)+1, 4.));
  17.      else  fyear = catx('_', put(year(date)-1,4.), put(year(date),   4.));
  18. run;

  19. proc sql;
  20.     create table c as
  21.     select distinct id, fyear, sum(m_return) as sum_return
  22.     from b
  23.     group by id, fyear;
  24. quit;

  25. proc means data=b sum;
  26.     class id fyear;
  27.     var m_return;
  28.     output out=bb sum=sum_return;
  29.     where id =1;            
  30. run;
复制代码

8
believe448 在职认证  发表于 2013-11-18 09:38:09
zhou.wen 发表于 2013-11-14 17:04
'where' is not a valid statement in proc means.
playmore's method is good ,it is easy to learn.
谢谢~

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

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