查看完整版本: 用SAS提取分析家各类数据的方法

guest 2006-10-11 09:22

用SAS提取分析家各类数据的方法

[color=#f70909][b][u]方法一:[/u][/b][/color]采用PIPE方法,详见下面的CallFinDataDll程序
/* ============================BeginningOfHeader===============================
/ 名称: CallFinDataDll
/ 功能: 调用FinData工具,读取分析家各类数据。
/ 版本: 1.0
/ 作者: zwz
/ 日期: 2006-5-1
/ 备注: 请先安装FinDataTools.MSI.如果在FinDataTools安装目录中没有找到fxj2txt.exe,请用FinDataTools.MSI最新版本.
/ 所需模块: Base SAS
/ 测试环境: SAS 9.1.3
/ 用法:
/     修改参数后运行.
/ 修改:
/
/-------------------------------------------------------------------------------
/ 声明:本代码按现状("AS IS")提供,没有任何明确或隐含的担保,用户自己须承担使用本代码的
/ 风险。授予用户使用或复制本代码的权限,可以将其用于任何非商业用途,只要在所有副本中包
/ 含以上说明及本声明。
/===============================EndingOFHeader=================================*/
/*读取行情数据,其它可类推*/
%let FinDataPath = c:\findata\;
filename fxjfile pipe "&FinDataPath.fxj2txt.exe getdata hq sz000002";
data hq;
format dm $8. rq yymmdd10.;
infile fxjfile delimiter=',' dsd ;
input dm $ rq :yymmdd10. kp zg zd sp sl je;
run;
filename fxjfile;
/*读取字段信息*/
filename fxjfile pipe "&FinDataPath.fxj2txt.exe getfields hq";
data fields;
infile fxjfile delimiter=',' dsd ;
input f1 $ f2 $ f3 $;
run;
filename fxjfile;
/*读取表名等*/
filename fxjfile pipe "&FinDataPath.fxj2txt.exe GetTables";
data Tables;
format table $20. tablename $20. filename $30.;
infile fxjfile delimiter=',' dsd ;
input table $ tablename $ filename $;
run;
filename fxjfile;
/*读取市场名称*/
filename fxjfile pipe "&FinDataPath.fxj2txt.exe GetMarkets";
data markets;
format market $20. marketname $20. shortname $30.;
infile fxjfile delimiter=',' dsd ;
input market $ marketname $ shortname $;
run;
filename fxjfile;
/*根据代码判断证券类别*/
filename fxjfile pipe "&FinDataPath.fxj2txt.exe getcodetype sz000001";
data CodeType;
format codeType $20.;
infile fxjfile delimiter=',' dsd ;
input codeType $;
run;
filename fxjfile;

[b][u][color=#f70909]方法二:[/color][/u][/b]用SCL调用FinData组件
(1)重新下载FinDataTools V0.6并安装。
(2)在一逻辑库如FinData中创建一个目录如FxjTool,创建SCL程序,复制以下的代码,保存为GetFxjData.scl。
ENTRY dataType code targetLib :char;
INIT:
dataType=lowcase(trim(dataType));
descDataSet=trim(targetLib)||'.'||datatype;
hostcls = loadclass('sashelp.fsp.hauto');
call send(hostcls,'_NEW_',fxj,0,'FinData.FxjData');
declare list fieldList;
fieldList=makelist();
call send(fxj,'_COMPUTE_','GetFields',dataType,fieldList);/* */
fieldCount=int(listlen(fieldList)/3);
if(fieldCount>0) then
do;
    declare char(3000) tablesql;
    call send(fxj,'_COMPUTE_','GetTableDef',dataType,"SAS","false",tablesql);
    tablesql=tranwrd(tablesql,"FinData."||dataType,descDataSet);
    if(tablesql eq "") then leave;
    call symput('mysassql',tablesql);
    submit continue;
        &mysassql;
    endsubmit;
    declare list dataList;
    dataList=makelist();
    call send(fxj,'_COMPUTE_','GetData',dataType,code,dataList);
    dataCount=listlen(dataList);
    tableid=open(descDataSet,'u');
    do i=1 to dataCount;
        iField= mod(i-1,fieldCount)+1;
        fieldName=getitemc(fieldList,iField*3-2);
        fieldType=getitemc(fieldList,iField*3);
        if( index('int,single,double',fieldType )>0 )then do;
            call putvarn(tableid,  varnum(tableid,fieldName), inputn(getitemc(dataList,i),'18.3') );
        end;
        else if(fieldType eq "date") then do;
            call putvarn(tableid ,  varnum(tableid,fieldName) ,  inputn(getitemc(dataList,i),'yymmdd10.') );
        end;
        else if(fieldType eq "datetime") then do;
            dt=getitemc(dataList,i);
            dt=trim(dt);
            d=dhms(inputn(substrn(dt,1,10),'yymmdd10.'),inputn(substrn(dt,12,2),'2.'),inputn(substrn(dt,15,2),'2.'),inputn(substrn(dt,18,2),'2.'));
            call putvarn(tableid ,  varnum(tableid,fieldName) , d );
        end;
        else do;
            call putvarc(tableid ,  varnum(tableid,fieldName) ,  getitemc(dataList,i) );
        end;
        if( mod(i,fieldcount) eq 0) then do;
            if (append(tableid,'noinit')) then
                _msg_=sysmsg();
        end;
    end;
    call close(tableid);
    if (dellist(datalist)) then _msg_=sysmsg();
    if (dellist(fieldlist)) then _msg_=sysmsg();
end;
call send(fxj,'_TERM_');
put 'Done!';
return;
(3)再创建一个SCL程序,代码如下,保存为CALLER.SCL。
INIT:
    call display('GetFxjdata.scl','hq0','SZ000001','work');
/*参数分别为:
A)SCL程序;
B)数据类型:只能为dm,hq,hqmb,hq0,hq5,cq,cw0,fp,gb,gd,cw,jjjz,jjzh
C)证券代码:如SZ000001等,必须与数据类型匹配,否则可能会……
D)目标逻辑库:在该库中生成数据集,如数据类型为DM且目标逻辑库为work,则将生成 work.dm
*/
return;

(4)编辑并运行caller.scl,或者在程序编辑器中输入以下代码并执行:
proc build batch catalog =findata.fxjtool.getfxjdata.scl;
compile;
run;
proc build batch catalog =findata.fxjtool.caller.scl;
compile;
run;
proc display catalog=findata.fxjtool.caller.scl;
run;

(5)根据需要修改caller参数等。
这种方法存在问题:消耗内存相当大,问题有待查明;好象无法在DATA STEP在调用。
[b][u][color=#f70909]方法三:[/color][/u][/b]采用FxjData2FinData程序直接读取,不需要组件。
FxjData2FinData程序有上千行
调用方法:
/*************************************************************************************
使用说明:
1)调用格式:FxjData2FinData(Market,DataType,FinDataLib)
其中,
Market:市场代码,SH为沪市,SZ为深市,BK为板块指数,如果有其它市场数据,可有其它市场代码如HK等.
DataType:数据类型,dm,cq,cw0,hq0,hq,等等,含义见下面注释
FinDataLib:目标逻辑库,如果给定的目标逻辑库不存在,则将设为Work
2)如果数据文件已经被分析家等软件占用导致无法打开时,将自动复制一份该文件,并从该备份文件中读取数据.
3)程序将自动补充数据,即如果目标表不存在,则建立并添加数据,如果目标表已存在,则判断表中每只证券的最新
数据,然后只添加数据表中所缺少的数据.
***************************************************************************************/
/*请修改以下的参数*/
%let FxjPath=C:\fxj\;/*分析家安装目录*/
/*HqmbFilesToRead=分笔成交读取文件数.若为1则只读取report.dat,
若为值n,则除了读取Report.dat外还将读取(n-1)个最新.PRP历史分笔成交数据文件*/
%let HqmbFilesToRead=2;
/*请确认要转换的数据,在下面语句的%后加*变为注释取消转换*/
/*沪市*/
%FxjData2FinData(sh,dm,FinData); /*dm--证券代码,原数据集将保存为xxDM_bak*/
%FxjData2FinData(sh,cq,FinData); /*cq--除权数据*/
%FxjData2FinData(sh,cw0,FinData); /*cw0--最新财务数据*/
%FxjData2FinData(sh,hq0,FinData); /*hq0--最新行情*/
%FxjData2FinData(sh,hq,FinData); /*hq--每日行情*/
%FxjData2FinData(sh,hqmb,FinData); /*hqmb--每笔成交*/
%FxjData2FinData(sh,hq5,FinData);/*hq5--5分钟行情*/
%FxjData2FinData(sh,fp,FinData);/*fp--分红送配(专业财务数据)*/
%FxjData2FinData(sh,gb,FinData);/*gb--股本结构(专业财务数据)*/
%FxjData2FinData(sh,cw,FinData);/*cw--财务数据(专业财务数据)*/
%FxjData2FinData(sh,gd,FinData);/*gd--十大股东(专业财务数据)*/
%FxjData2FinData(sh,jjjz,FinData);/*jjjz--基金净值(专业财务数据)*/
%FxjData2FinData(sh,jjzh,FinData);/*jjzh--基金投资组合(专业财务数据)*/
/*深市*/
%FxjData2FinData(sz,dm,FinData);
%FxjData2FinData(sz,cq,FinData);
%FxjData2FinData(sz,cw0,FinData);
%FxjData2FinData(sz,hq0,FinData);
%FxjData2FinData(sz,hq,FinData);
%FxjData2FinData(sz,hqmb,FinData);
%FxjData2FinData(sz,hq5,FinData);
%FxjData2FinData(sz,fp,FinData);
%FxjData2FinData(sz,gb,FinData);
%FxjData2FinData(sz,cw,FinData);
%FxjData2FinData(sz,gd,FinData);
%FxjData2FinData(sz,jjjz,FinData);
%FxjData2FinData(sz,jjzh,FinData);
/*板块及板块指数*/
%FxjData2FinData(bk,zh,FinData);/*板块数据:Market=bk,DataType=zh,...*/
%FxjData2FinData(bk,dm,FinData);
%FxjData2FinData(bk,hq0,FinData);
%FxjData2FinData(bk,hq,FinData);
%FxjData2FinData(bk,hqmb,FinData);
%FxjData2FinData(bk,hq5,FinData);
/*香港市场*/
%*FxjData2FinData(hk,dm,FinData);  
%*FxjData2FinData(hk,hq0,FinData);
%*FxjData2FinData(hk,hq,FinData);
%*FxjData2FinData(hk,hqmb,FinData);
%*FxjData2FinData(hk,hq5,FinData);

sysufsaint 2006-11-2 17:19

好东西!!人人为我,我为人人!!

sysurichard 2007-4-5 09:22

好东西!!人人为我,我为人人!!
页: [1]
查看完整版本: 用SAS提取分析家各类数据的方法