目标:从yahoo财经获得所有中国股票数据。
程序简单介绍:利用filename url,指定网络的csv文件,之后利用infile导入数据。
存在问题,第一:感觉有网络连接的问题,程序运行时候未改动却有时候可以成功,有时候失败,我测试了20只股票,上海、深圳各
10只,如果2800只,觉得会出问题。
第二,从网络获取csv文件可以直接用infile不用下载文件,直接导入sas,但是如果目标文件是excel等编码过的文件,怎么
处理,或者我就是希望下载网络pdf文件,怎么下载?
第三,未对log和报错进行控制,大规模批量时候需要控制,不过因为很熟悉log控制了,未写代码。
第四,如何对批量数据进行抽检。唯一能想到的就是随机抽10%人工核对一下,略蠢。
%macro yahoo(table=work.cc7,des=work);
/*产生股票代码宏变量,产生全部股票数量宏变量*/
proc sql noprint;
select count(code) into:totalnum from &table;
select name into:ss1-:ss%left(&totalnum) from &table;
quit;
/*读取type2变量,若成功执行*/
%let open=%sysfunc(open(&table));
%if %eval(&open>0) %then %do;
%let attrn=%sysfunc(attrn(&open,nobs));
%put attrn=&attrn;
%do mm=1 %to &attrn;
%let fetch=%sysfunc(fetchobs(&open,&mm));
%put fetch=&fetch;
%let varnum=%sysfunc(varnum(&open,type2));
%put varnum=&varnum;
%let getvarc=%sysfunc(getvarc(&open,&varnum));
%put getvarc=&getvarc;
/*截取type2判断市场是sz还是ss*/
%let trunc=%sysfunc(substr(&getvarc,7,2));
%let trunc2=%sysfunc(substr(&getvarc,1,6));
%let location="http://table.finance.yahoo.com/table.csv?s=&trunc2..ss";
%let location2="http://table.finance.yahoo.com/table.csv?s=&trunc2..sz";
%put trunc=&trunc trunc2=&trunc2 &location &location2;
%if &trunc=SS %then %do;
filename urlname url &location;
data &des..s&trunc2;
infile urlname dlm=',' FIRSTOBS=2;
input date yymmdd10. open high low close volume adjust_close;
run;
%end;
%else %if &trunc=SZ %then %do;
filename urlname url &location2;
data &des..z&trunc2;
infile urlname dlm=',' FIRSTOBS=2;
input date yymmdd10. open high low close volume adjust_close;
run;
%end;
%end;
%end;
/*读取type2变量,若失败执行*/
%else %do;
%put %str("Can't find table");
%end;
%let close=%sysfunc(close(&open));
%mend yahoo;
options mprint symbolgen=1 mlogic=1;
options mprint=0 symbolgen=0 mlogic=0;
options mprint mfile;
filename mprint 'd:\freddata\desttt';
%yahoo(table=work.cc7,des=work);
|