楼主: zhangyanecho
2012 11

[金融学] 请教一个SAS累积和的程序 [推广有奖]

  • 1关注
  • 2粉丝

已卖:180份资源

讲师

18%

还不是VIP/贵宾

-

威望
0
论坛币
372 个
通用积分
17.1769
学术水平
2 点
热心指数
2 点
信用等级
1 点
经验
1926 点
帖子
181
精华
0
在线时间
461 小时
注册时间
2009-11-21
最后登录
2026-1-5

楼主
zhangyanecho 发表于 2017-7-31 17:07:01 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教论坛中的高人,我想取收益率(t月)前12个月到前2个月的收益和,作为t月的控制变量,请教SAS程序,谢谢指点
二维码

扫码加我 拉你入群

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

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

关键词:累积和 sas程序 控制变量 论坛中 收益率

沙发
zhangyanecho 发表于 2017-7-31 17:07:27
自己支持一下,等待好心人指点

藤椅
Rock2000 发表于 2017-8-2 08:53:11
先把TXT改成XLSX,把Trdmnt改成日期格式,再导入。
  1. PROC IMPORT OUT= WORK.TEST
  2.             DATAFILE= "U:\teST.xlsx"
  3.             DBMS=EXCEL REPLACE;
  4.      RANGE="Sheet1$";
  5.      GETNAMES=YES;
  6.      MIXED=NO;
  7.      SCANTEXT=YES;
  8.      USEDATE=YES;
  9.      SCANTIME=YES;
  10. RUN;


  11. DATA TEST; SET TEST;
  12. yr=year(Trdmnt);
  13. mon=month(Trdmnt);
  14. if mon<=2 then mon2=1; else mon2=2;
  15. run;

  16. proc sort data=test; by yr mon2; run;

  17. data result test_mon2;
  18. set test;
  19. by yr mon2 mon;
  20. if first.mon2 then do;
  21. cum_r_mon2=0;
  22. cut_r_mon2=0;
  23. end;
  24. cum_r_mon2+r;
  25. cut_r_mon2+1;
  26. if last.mon2 then output test_mon2;
  27. run;

  28. proc sort data=test; by yr; run;

  29. data result12 test_12;
  30. set test;
  31. by yr;
  32. if first.yr then do;
  33. cum_r_12=0;
  34. cut_r_12=0;
  35. end;
  36. cum_r_12+r;
  37. cut_r_12+1;
  38. if last.yr then output test_12;
  39. run;
复制代码

板凳
zhangyanecho 发表于 2017-8-4 11:57:11
Rock2000 发表于 2017-8-2 08:53
先把TXT改成XLSX,把Trdmnt改成日期格式,再导入。
你好,非常感谢您的回复。不过我按照这个程序运行出来不是我需要的结论。举例:我需要的是:2017年8月份一只股票,求这只股票2016年8月到2017年6月收益和,作为2017年8月的一个控制变量。麻烦赐教。谢谢

报纸
Rock2000 发表于 2017-8-6 16:55:25
哦,原来是节点前2个月到12个月之和,看下面程序是否合适?

  1. PROC IMPORT OUT= WORK.TEST
  2.             DATAFILE= "U:\test\teST.xlsx"
  3.             DBMS=EXCEL REPLACE;
  4.      RANGE="Sheet1$";
  5.      GETNAMES=YES;
  6.      MIXED=NO;
  7.      SCANTEXT=YES;
  8.      USEDATE=YES;
  9.      SCANTIME=YES;
  10. RUN;


  11. DATA TEST; SET TEST;
  12. yr=year(Trdmnt);
  13. mon=month(Trdmnt);
  14. run;


  15. proc sort data=test; by stkcd yr mon; run;

  16. data test_12;
  17. set test;
  18. by stkcd yr mon;
  19. if first.mon then do;
  20. cum_r_12=0;
  21. end;
  22. cum_r_12+r;
  23. if last.mon then output test_12;
  24. run;

  25. proc sort data=test_12; by stkcd yr mon; run;

  26. data  result12;
  27. set test_12;
  28. by stkcd yr mon;
  29. r12_2=lag2(cum_r_12);
  30. r12_3=lag3(cum_r_12);
  31. r12_4=lag4(cum_r_12);
  32. r12_5=lag5(cum_r_12);
  33. r12_6=lag6(cum_r_12);
  34. r12_7=lag7(cum_r_12);
  35. r12_8=lag8(cum_r_12);
  36. r12_9=lag9(cum_r_12);
  37. r12_10=lag10(cum_r_12);
  38. r12_11=lag11(cum_r_12);
  39. r_2_12=r12_2+r12_3+r12_4+r12_5+r12_6+r12_7+r12_8+r12_9+r12_10+r12_11;
  40. /*drop r12_2--r12_11*/
  41. run;
复制代码


地板
zhangyanecho 发表于 2017-8-7 08:57:18
Rock2000 发表于 2017-8-6 16:55
哦,原来是节点前2个月到12个月之和,看下面程序是否合适?
你好,非常感谢您的解答。不过这样做存在一个问题,就是第二只股票前几年的控制变量时用的是第一只股票滞后的数据。附上我自己的一个程序,存在滞后不一致的问题,麻烦请您指点,非常感谢

data r;
set C;
%let n=12;
by stkcd ;
retain index;
if first.stkcd  then index=1;
else index=index+1;
R = lag2(Mretwd)+lag3(Mretwd)+ lag4(Mretwd)+lag5(Mretwd)+ lag6(Mretwd)+lag7(Mretwd)+ lag8(Mretwd)+lag9(Mretwd)
           + lag10(Mretwd)+lag11(Mretwd)+ lag12(Mretwd);

if index<=&n. then R=.;
R1 = lag2(Mretnd)+lag3(Mretnd)+ lag4(Mretnd)+lag5(Mretnd)+ lag6(Mretnd)+lag7(Mretnd)+ lag8(Mretnd)+lag9(Mretnd)
           + lag10(Mretnd)+lag11(Mretnd)+ lag12(Mretnd);

if index<=&n. then R1=.;
drop index Mretwd Mretnd ;
run;

7
zhangyanecho 发表于 2017-8-7 09:04:00
Rock2000 发表于 2017-8-6 16:55
哦,原来是节点前2个月到12个月之和,看下面程序是否合适?

就是这种问题

8
zhangyanecho 发表于 2017-8-7 09:05:02
你好,就是会存在这种问题@Rock2000

QQ图片20170807090034.png (25.71 KB)

QQ图片20170807090034.png

9
Rock2000 发表于 2017-8-7 10:33:47
关键是stkcd前10个记录的r_2_12是滞后的,我现在也想不出方法,我问问。

10
Rock2000 发表于 2017-8-7 11:00:17
已经解决,凡是同一股票排前11条记录的和为缺失值就可以。
  1. PROC IMPORT OUT= WORK.TEST
  2.             DATAFILE= "U:\test\teST.xlsx"
  3.             DBMS=EXCEL REPLACE;
  4.      RANGE="Sheet1$";
  5.      GETNAMES=YES;
  6.      MIXED=NO;
  7.      SCANTEXT=YES;
  8.      USEDATE=YES;
  9.      SCANTIME=YES;
  10. RUN;


  11. DATA TEST; SET TEST;
  12. yr=year(Trdmnt);
  13. mon=month(Trdmnt);
  14. run;


  15. proc sort data=test; by stkcd yr mon; run;

  16. data test_12;
  17. set test;
  18. by stkcd yr mon;
  19. if first.mon then do;
  20. cum_r_12=0;
  21. end;
  22. cum_r_12+r;
  23. if last.mon then output test_12;
  24. run;

  25. proc sort data=test_12; by stkcd yr; run;

  26. data  result12;
  27. set test_12;
  28. by stkcd yr;
  29. if first.yr then do;
  30. r12_2=.;
  31. r12_3=.;
  32. r12_4=.;
  33. r12_5=.;
  34. r12_6=.;
  35. r12_7=.;
  36. r12_8=.;
  37. r12_9=.;
  38. r12_10=.;
  39. r12_11=.;
  40. end;
  41. r12_2=lag2(cum_r_12);
  42. r12_3=lag3(cum_r_12);
  43. r12_4=lag4(cum_r_12);
  44. r12_5=lag5(cum_r_12);
  45. r12_6=lag6(cum_r_12);
  46. r12_7=lag7(cum_r_12);
  47. r12_8=lag8(cum_r_12);
  48. r12_9=lag9(cum_r_12);
  49. r12_10=lag10(cum_r_12);
  50. r12_11=lag11(cum_r_12);
  51. r_2_12=r12_2+r12_3+r12_4+r12_5+r12_6+r12_7+r12_8+r12_9+r12_10+r12_11;
  52. /*drop r12_2--r12_11*/
  53. run;

  54. proc sort data=RESULT12;by stkcd yr; run;

  55. data RESULT12; set RESULT12;
  56. by stkcd yr;
  57. retain  group_id 0;
  58. if first.stkcd then group_id=1;
  59. else group_id=group_id+1;
  60. if group_id<12 then r_2_12=.;
  61. /*drop r12_2--r12_11 group_id*/
  62. run;
复制代码


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

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-13 12:32