楼主: ytyaoyao
4534 11

[问答] 求教一个关于用宏求分组移动平均的题目 [推广有奖]

  • 0关注
  • 0粉丝

初中生

47%

还不是VIP/贵宾

-

威望
0
论坛币
604 个
通用积分
1.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
174 点
帖子
9
精华
0
在线时间
23 小时
注册时间
2016-3-28
最后登录
2021-8-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
已知2001到2010年A股的数据,求每五年的移动平均收益率,我设计了两种flag,flag1是每种股票的内部计数,flag2是股票序数,想用lag来计算,就是每60个月的移动平均,但是Note总是出现:在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数
,而且运行总是不成功试了很多次,请求大神指点!!!

proc datasets kill nolist;
run;

DATA TRD_Mnth (Label="月个股回报率文件");
Infile 'C:\Users\Dell001\Desktop\Practise\TRD_Mnth.txt' encoding="utf-8" delimiter = '09'x Missover Dsd lrecl=32767 firstobs=2;

Format Stkcd $6.;
Format Trdmnt $10.;
Format Opndt $10.;
Format Mopnprc 9.3;
Format Clsdt $10.;
Format Mclsprc 9.3;
Format Mnshrtrd 18.;
Format Mnvaltrd 18.3;
Format Msmvosd 16.2;
Format Msmvttl 16.2;
Format Ndaytrd 2.;
Format Mretwd 10.6;
Format Mretnd 10.6;
Format Markettype 10.;
Format Capchgdt YYMMDD10.;/*这里进行了改动*/
Informat Stkcd $6.;
Informat Trdmnt $10.;
Informat Opndt $10.;
Informat Mopnprc 9.3;
Informat Clsdt $10.;
Informat Mclsprc 9.3;
Informat Mnshrtrd 18.;
Informat Mnvaltrd 18.3;
Informat Msmvosd 16.2;
Informat Msmvttl 16.2;
Informat Ndaytrd 2.;
Informat Mretwd 10.6;
Informat Mretnd 10.6;
Informat Markettype 10.;
Informat Capchgdt YYMMDD10.;
Label Stkcd="证券代码";
Label Trdmnt="交易月份";
Label Opndt="月开盘日期";
Label Mopnprc="月开盘价";
Label Clsdt="月收盘日期";
Label Mclsprc="月收盘价";
Label Mnshrtrd="月个股交易股数";
Label Mnvaltrd="月个股交易金额";
Label Msmvosd="月个股流通市值";
Label Msmvttl="月个股总市值";
Label Ndaytrd="月交易天数";
Label Mretwd="考虑现金红利再投资的月个股回报率";
Label Mretnd="不考虑现金红利再投资的月个股回报率";
Label Markettype="市场类型";
Label Capchgdt="最新股本变动日期";
Input Stkcd $ Trdmnt $ Opndt $ Mopnprc Clsdt $ Mclsprc Mnshrtrd Mnvaltrd Msmvosd Msmvttl Ndaytrd Mretwd Mretnd Markettype Capchgdt ;
Run;

libname home "C:\Users\Dell001\Desktop\Practise";
data home.trd_mnth;
        set trd_mnth;
run;

data test1;
        set trd_mnth;
        if Markettype in (1,4,16);
        ymth=input(substr(Trdmnt,1,4),4.)*100+input(substr(Trdmnt,6,2),2.);
run;

proc sort data=test1 out=test2 nodup;
        by stkcd ymth;
run;

data test3;
        set test2(keep=stkcd Trdmnt Mretwd ymth);
run;

data test4;
        set test3;
        year=substr(Trdmnt,1,4)*1;
        month=substr(Trdmnt,6,2)*1;
        ymonth=mdy(month,1,year);
        format ymonth yymmdd10.;
        if year>2000 & year<2011;
run;

data test5;
        set test4;
        by stkcd;
        retain flag1;
        if first.stkcd then flag1=0;
        flag1+1;
        if last.stkcd then;
run;

data test6;
        set test4;
        by stkcd;
        if first.stkcd then output test6;
run;

data test6;
        set test6;
        if stkcd="000001" then flag2=0;
        flag2+1;
run;

data test7(drop=year year ymonth);
        merge test5 test6;
        by stkcd;
run;

data test8;
        set test7;
        Moveaver_undone=Mretwd+0;
run;

%macro ma60;
        data test8;
                set test8;
                %let lagnum=59;
                %do flag2=1 %to 2109;
                        if flag1=1 then;
                        %do i=1 %to &lagnum;
                                Moveaver_undone=Moveaver_undone+lag&i.(Moveaver_undone);
                        %end;
                %end;
                %if last.Moveaver_undone %then %do;
                Moveaver=%eval(last.Moveaver_undone)/60;
                %end;
        proc print data=test8(drop=Moveaver_undone);
        run;
%mend;


%ma60;
二维码

扫码加我 拉你入群

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

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

关键词:移动平均 delimiter informat Practise missover Desktop 收益率 Users 而且

沙发
teqel 发表于 2016-4-12 09:59:50 |只看作者 |坛友微信交流群
Moveaver=last.Moveaver_undone/60; ????做不了last%if last.Moveaver_undone %then %do; 这句也不对啊

使用道具

藤椅
ytyaoyao 发表于 2016-4-12 13:02:21 |只看作者 |坛友微信交流群
teqel 发表于 2016-4-12 09:59
Moveaver=last.Moveaver_undone/60; ????做不了last%if last.Moveaver_undone %then %do; 这句也不对啊 ...
我又改了一下,可是还是不行QAQ;
%macro ma60;
        data test8;
                set test8;
                %let lagnum=59;
                %let i=0;
                %do flag2=1 %to 2109;
                        %do %until(i<=&lagnum);
                                Moveaver_undone=Moveaver_undone+lag&i.(Mretwd);
                                &i+1;
                        %end;
                %end;
                %if last.Moveaver_undone %then output data test9;
        run;
       
        data test9;
                set test9;
                Moveaver=Moveaver_undone/60;
                proc print data=test9(drop=Moveaver_undone);
        run;
%mend;


%ma60;

使用道具

板凳
ytyaoyao 发表于 2016-4-12 13:11:37 |只看作者 |坛友微信交流群
QAQ 刚上手sas,这个题已经试了两天了QAQ急死我惹~~求大神解救!!

使用道具

报纸
孤单的我们 发表于 2016-4-12 13:26:45 |只看作者 |坛友微信交流群
用法太混乱。
last.variable是set dateset;by variable;生成的
do loop、宏循环、累加语句都是错的。&i+1;这句应该是%let i=%eval(&i+1);
%if last.Moveaver_undone %then output data test9;不需要%,data也不需要
建议你先一步一步调试,一口吃不成个胖子,对新手而言

使用道具

地板
ytyaoyao 发表于 2016-4-12 13:43:09 |只看作者 |坛友微信交流群
孤单的我们 发表于 2016-4-12 13:26
用法太混乱。
last.variable是set dateset;by variable;生成的
do loop、宏循环、累加语句都是错的。&i+1 ...
求教怎样一步一步地调试?
第一个也就是说last.和first.只能在set;by;中使用是吗?
因为这是我们的一个作业,然后我怎么都调试不出来,唉

使用道具

7
孤单的我们 发表于 2016-4-12 13:48:21 |只看作者 |坛友微信交流群
ytyaoyao 发表于 2016-4-12 13:43
求教怎样一步一步地调试?
第一个也就是说last.和first.只能在set;by;中使用是吗?
因为这是我们的一 ...
第一个问题:可以把循环数设置的小点。
第二个问题:是的。

使用道具

8
ytyaoyao 发表于 2016-4-12 13:56:07 |只看作者 |坛友微信交流群
孤单的我们 发表于 2016-4-12 13:48
第一个问题:可以把循环数设置的小点。
第二个问题:是的。
第一个问题可以麻烦再详细一点吗?比如举个栗子~~谢谢,麻烦您了~

使用道具

9
stry 发表于 2016-4-12 14:15:31 |只看作者 |坛友微信交流群
请独立完成作业。
许志

使用道具

10
ytyaoyao 发表于 2016-4-12 14:29:36 |只看作者 |坛友微信交流群
stry 发表于 2016-4-12 14:15
请独立完成作业。
许志
手动再见,宝宝做了三天了,不分白天黑夜2333

使用道具

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

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

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

GMT+8, 2024-4-27 07:26