楼主: hsst
6284 17

[问答] 金融momentum指标计算 求sas代码 大神们路过帮忙 [推广有奖]

11
yongyitian 发表于 2013-6-15 00:02:15 |只看作者 |坛友微信交流群
LZ的问题比较复杂,不太可能一步到位。要一步一步来。 首先要生成一个小一点的数据处理集,用于测试程序. 而且每一步有不同的问题和解决方法。 比如:

第一步,中return variable 的缺矢值如何处理?
第二步,每一个月的等权重加权收益 如何计算?
第三步,每一个月的赢家组合收益序列和输家组合收益序列, 由不同的股票构成,如何处理? 两者之差是什么意思? 怎么计算?

下面的code只是做ranking.   

data mdata1;       /* creat year and month variable, fill missing value for retrun */
    set mdata;     /* imported from excel file */  
     retain lag_return;
     lag_return=lag(return);
     year= input(substr(trdmnt, 1,4), 4.);
     month = input(substr(trdmnt, 6,2), 2.);
     if missing(return) then return=lag_return; /* missing might be filled */
     drop lag_return;                                       /* using other methods */   
run;

proc sort data=mdata1 out=mdata_sort;   /* sort the data by year, month, and return */
     by year month descending return;
run;

proc rank data=mdata_sort out=mdata_rank group=100;
  var return;
  ranks return_rank;   /* define a ranking variable */
  by year month;
run;

data mdata_rank1;
  length rank $6.;
  set mdata_rank;
    if return_rank < 30 then rank= 'Low   ';
    if return_rank > 69 then rank= 'High  ';
    if return_rank >= 30 and return_rank <=69 then rank = 'Middle';
run;

proc sort data=mdata_rank1 out=mdata_rank_sort;  /* the sorting may not be required */
    by year month descending return;
run;

data mdata_high mdata_middle mdata_low;
  set mdata_rank_sort;
    if rank = 'High' then output mdata_high;
    if rank = 'Low' then output mdata_low;
    if rank = 'Middle' then output mdata_middle;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
hsst + 1 + 1 + 1 热心

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

使用道具

12
佛印 发表于 2013-6-15 11:07:41 |只看作者 |坛友微信交流群
x 'cd 文件存放地址';
proc import out=test
datafile='TRD_Mnth.xls'
dbms=excel replace;
getnames=yes;label stkcd='股票代码' return='月收益率';run;
proc sort data=test;
by trdmnt;
proc rank data=test out=ttest descending percent;
var return;
ranks r_return;/*排名*/
by trdmnt;
run;
data treat;
set ttest;
if 0<=r_return<=30 then flag=1;
if 70<=r_return<=100 then flag=2;
if flag=. then delete;
run;
proc format;
value flg 1="赢家" 2="输家";
run;
proc sql;
create table a as select distinct trdmnt,flag format flg. label='组合',avg(return) as ret label='平均收益'  from treat group by trdmnt,flag;
quit;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
hsst + 1 + 1 + 1 观点有启发

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

使用道具

13
邓贵大 发表于 2013-6-15 11:17:27 |只看作者 |坛友微信交流群
赢家输家是老天爷做决定的事,世人怎么理论得清。好比我跟玉娇,都是邓家的人,却没有赢家。
Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

使用道具

14
playmore 发表于 2013-6-17 14:39:00 |只看作者 |坛友微信交流群
邓贵大 发表于 2013-6-15 11:17
赢家输家是老天爷做决定的事,世人怎么理论得清。好比我跟玉娇,都是邓家的人,却没有赢家。
终于见到邓老大非学术的回贴了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

15
hsst 在职认证  发表于 2013-6-18 14:36:00 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-6-15 00:02
LZ的问题比较复杂,不太可能一步到位。要一步一步来。 首先要生成一个小一点的数据处理集,用于测试程序. 而 ...
非常感谢热心人哈  赞一个

使用道具

16
hsst 在职认证  发表于 2013-6-18 14:37:39 |只看作者 |坛友微信交流群
佛印 发表于 2013-6-15 11:07
x 'cd 文件存放地址';
proc import out=test
datafile='TRD_Mnth.xls'
才看到  我已经做出来了 总体思路感觉跟你的差不多 你的方法很好,有空我也把我的做法贴出来方便类似需要的人,再次赞一个

使用道具

17
Memorylane 发表于 2018-4-23 14:49:12 来自手机 |只看作者 |坛友微信交流群
hsst 发表于 2013-5-27 23:56
目前需要构造momentum指标,但代码不知道如何写。
momentum指标计算步骤如下:将收益最高的 30% 股票定义为 ...
楼主,可以把你的做法分享一下吗,我现在也在做这个方面。求分享。

使用道具

18
hsst 在职认证  发表于 2018-4-24 09:22:01 |只看作者 |坛友微信交流群
Memorylane 发表于 2018-4-23 14:49
楼主,可以把你的做法分享一下吗,我现在也在做这个方面。求分享。
抱歉,时间较为久远,新电脑未留档原代码。详见楼上yongyitian的回复,当时是用他的方法实现了目标的。

使用道具

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

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

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

GMT+8, 2024-4-20 00:30