楼主: fxx2010
11327 4

[问答] 求助:sas如何依次对每列变量进行排序 [推广有奖]

  • 0关注
  • 0粉丝

大专生

28%

还不是VIP/贵宾

-

威望
0
论坛币
906 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
212 点
帖子
7
精华
0
在线时间
86 小时
注册时间
2011-12-29
最后登录
2021-1-19

3论坛币
有个问题想求助一下。
某一pool数据,已求得n个商品期货品种n个月的月收益,
现在想每个月根据商品期货品种的收益大小进行排序,选出前四种和后四种商品期货,记录下其名称。
我已对数据进行转置,数据形式如下:列为商品期货名称,变量为月份,数据为收益

_name_ _2010N01N01_2010N02N01 ……
bl 123 45 …………
cv 345 43……
as 34 23 ……
bd 34 23 ……
…… 23 56 ……
我现在仅可写出一个月的排序代码,如下:proc sort data=futures.finished out=c;
by _2010N01N01;
run;
data c1;
set c;
retain t 0;
if _2010N01N01^='.' then t=t+1;
if 0<t and t<=4 then min=_name_;
run;
proc sort data=futures.finished out=d;
by descending _2010N01N01;
run;
data d1;
set d;
if _n_<=4 then max=_name_;
run;

但如上图,我有很多月份的数据,如果对每个月都依次写出代码运行很麻烦,有没有办法可以一次性解决所有月份的运算。

最佳答案

关键词:finished futures future RETAIN finish 如何 记录 品种 收益
沙发
jeozu 发表于 2014-5-2 16:44:33 |只看作者 |坛友微信交流群
fxx2010 发表于 2014-5-2 20:44
其实我想写的是一个动量策略的代码。我想对以上的数据进行排序,选出前四和后四个商品期货,然后持有前四 ...
  1. proc transpose data=return1.finished out=_a1 name=dt prefix=rtrn;
  2.     by _name_;
  3. run;
  4. proc sort data=_a1; by dt descending rtrn;
  5. data _a1 _a2(keep=dt ord);
  6. set _a1;
  7. by dt;
  8. if first.dt then ord=0;
  9. ord+1;
  10. output _a1;
  11. if last.dt then output _a2;
  12. run;
  13. proc sql noprint;
  14. create table
  15. select a.dt
  16. , a.r_max
  17. , b.r_min
  18. , (a.r_max-b.r_min)  as t
  19. from (
  20.     select mean(rtrn) as r_max
  21.     from _a1
  22.     where _a1.ord le 4
  23.     group by dt
  24.     ) a, (
  25.     select mean(rtrn) as r_min
  26.     from _a1, _a2
  27.     where _a1.dt=_a2.dt
  28.     and _a1.ord ge (_a2.ord-3)
  29.     group by dt
  30.     ) b
  31. where a.dt=b.dt
  32. ;
  33. quit;
复制代码

使用道具

藤椅
jeozu 发表于 2014-5-2 17:42:30 |只看作者 |坛友微信交流群
给出一个你要的报表的最终格式。。

使用道具

板凳
congmu 发表于 2014-5-2 19:57:06 |只看作者 |坛友微信交流群
不是太清楚你最终要什么样的结果,批量处理的话你可以结合宏试试

使用道具

报纸
fxx2010 发表于 2014-5-2 20:44:44 |只看作者 |坛友微信交流群
jeozu 发表于 2014-5-2 17:42
给出一个你要的报表的最终格式。。
其实我想写的是一个动量策略的代码。我想对以上的数据进行排序,选出前四和后四个商品期货,然后持有前四种期货,卖出后四种期货,构建投资组合。
所以我需要的是先对某个月的数据排序,如上,用max数据集和min数据集选出前四个后四个商品期货,然后用sql,用max和min选出另一个收益数据集中对应月份对应品种期货的收益率。

proc sort data=return1.finished out=c;/*选择前四种和后四种商品期货*/
by _2010N01N01;
run;
data c1;
set c;
retain t 0;
if _2010N01N01^='.' then t=t+1;
if 0<t and t<=4 then min=_name_;
if min='' then delete;
keep min;
run;
proc sort data=return1.finished out=d;
by descending _2010N01N01;
run;
data d1;
set d;
if _n_<=4 then max=_name_;
if max='' then delete;
keep max;
run;
data e;
set return1.finished;
keep _name_ _2010N02N01;
run;
proc sql;
create table min as
select * from c1 ,e
where c1.min=e._name_;
quit;
proc means data=min noprint;
var _2010N02N01;
output out=min1 mean=mean;
quit;
proc sql;
create table max as
select * from d1,e
where d1.max=e._name_;
quit;
proc means data=max noprint;
var _2010N02N01;
output out=max1 mean=mean;
quit;
data full;
set min1 max1;
t=mean-lag(mean);
if t='.' then delete;
run;

但是这是一次动量的结果,最后只有一个结果,即一个观测值。我需要的是批量依次对每个月实施动量策略的结果,所以最后得出的结果应该是一列数据,即一系列观测值。

求指教,谢谢

使用道具

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

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

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

GMT+8, 2024-6-17 10:30