楼主: hsst
7057 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
拉您进交流群
GMT+8, 2025-12-29 13:13