请选择 进入手机版 | 继续访问电脑版
楼主: FlyUFalcon
4703 4

[问答] 请教sas 里面 rolling mean/std 的问题 [推广有奖]

  • 6关注
  • 43粉丝

教授

18%

还不是VIP/贵宾

-

威望
0
论坛币
2683 个
通用积分
15.8811
学术水平
54 点
热心指数
74 点
信用等级
53 点
经验
34273 点
帖子
1052
精华
0
在线时间
1258 小时
注册时间
2011-8-16
最后登录
2023-11-24

FlyUFalcon 在职认证  发表于 2015-9-22 00:33:13 |显示全部楼层 |坛友微信交流群
30论坛币
大家好,

我要在sas 里处理 股票交易数据,要算每只股票(-2,+2 )交易日内数值的标准差 和平均值, 我的数据格式大概的数据格式如下  (左到右依次为,交易日,股票代码,价格)
Screen Shot 2015-09-21 at 14.42.35.png



这里要注意两点:
1, 这个是交易日数据,因此日期是非连续性的。
2. 每个交易日下面的 成交数量 不一样。

由于以上两点,不能在这个地方建立fixed window (觉得这里不能用proc expand)


所以我建立了一个sub-query

我的代码在下面


  1. data want;
  2.     set input;
  3.     by   day ;
  4.     retain gdate;
  5.     if first.day then gdate+1;
  6. run;

  7. proc sort data= want; by stock gdate ; run;

  8. proc sql;
  9. create table want2 as
  10. select   
  11.   h.stock,
  12.   h.day,
  13.   h.value,
  14. ( select std(s.value)
  15.     from want s
  16.     where h.gdate between s.gdate-2 and s.gdate+2) as std
  17. from
  18.   want h
  19.   group by h._ric, h.gdate;

  20. quit;
复制代码


请注意, 我的
  1. group by h._ric, h.gdate;
复制代码
代码在这里 没有起到作用, 最后数据集给无视了股票代码,出了所有价格在整段时间内的stddev。 而我这里 想要每只股票 (-2,+2 )交易日内数值。


请问大家有没有好的方法。 必有重谢~





最佳答案

关键词:rolling roll mean ING Std 股票交易 股票代码 window 标准差 交易日
godxh 在职认证  发表于 2015-9-22 00:33:14 |显示全部楼层 |坛友微信交流群
FlyUFalcon 发表于 2015-9-22 17:51
十分感谢啊!!!  真的好用。

有个小问题 如果我这里的区间 是(-100,0)个交易日呢?
应该是0<=h.gdate-k.gdate2<=100或者-100<=k.gdate2-h.gdate<=0

金币掉下来呀。。。哈哈

使用道具

好,有才

使用道具

godxh 在职认证  发表于 2015-9-22 14:16:28 |显示全部楼层 |坛友微信交流群
  1. data input;
  2.     format day yymmdd10.;
  3.     do stock='VOD', "RBS";
  4.         do day='01Jan2015'd to '10jan2015'd;
  5.             value=ranuni(23267);
  6.             output;
  7.         end;
  8.     end;
  9. run;

  10. proc sort data=input;
  11.     by day;
  12. run;

  13. data want;
  14.     set input;
  15.     by day;
  16.     retain gdate;
  17.     if first.day then gdate+1;
  18. run;

  19. proc sort data= want;
  20.     by stock gdate ;
  21. run;

  22. proc sql noprint;
  23.     create table want2 as
  24.         select h.*, k.value2, k.gdate2
  25.         from want as h cross join (select *, value as value2, gdate as gdate2 from want) as k
  26.         having h.stock=k.stock and abs(h.gdate-k.gdate2)<=2
  27.         order by h.stock, h.gdate
  28.     ;

  29.     create table final as
  30.         select distinct stock, day, value, gdate, mean(value2) as mean, std(value2) as std
  31.         from want2
  32.         group by stock, gdate
  33.         order by stock, gdate
  34.     ;
  35. quit;
复制代码


已有 1 人评分论坛币 收起 理由
admin_kefu + 30 热心帮助其他会员

总评分: 论坛币 + 30   查看全部评分

使用道具

FlyUFalcon 在职认证  发表于 2015-9-22 17:51:59 |显示全部楼层 |坛友微信交流群
godxh 发表于 2015-9-22 14:16
十分感谢啊!!!  真的好用。

有个小问题 如果我这里的区间 是(-100,0)个交易日呢?

把代码改成 h.gdate-k.gdate2<=100 还是 k.gdate2-h.gdate<=100 呢?

谢谢啦!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 22:59