已知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;