SAS 数据提取(北大光华金融建模SAS部分课件)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CCER数据
CCER中数据缺项
-97 -95 -11 -35 计算原因(如收益率第一项) 价格库中没有交易的记录,如停牌 公司基本信息缺失 数据源数据缺失
SAS读取方式之一
• Import (导入)Excel文件
– 文件->导入数据
Excel格式
• • • • •
是否用第一行作为变量名 是否将“混合”类型变量中的数值转为字符
参数含义
• dsd • 假设输入变量为 v1,v2,v3,v4,v5 • 文件有一行数据 12,,34,23,3 • 如果没有这个参数,系统忽略两个连续分隔号 • 如果有这个参数,系统将两个连续分隔符号视为空值;

• data ab_b ;
– – – – – – infile 'E:\ab_b.txt' delimiter = ',' MISSOVER DSD firstobs=2 ; informat bcode $6. ; informat trdmnt $7. ; informat bvolume 8. ; informat acode $6.; Input bcode $ trdmnt $ bvolume acode $;
SAS数据提取
第二讲
内容
• 从金融数据库中提取数据 • SAS数据导入
CCER数据库
• 通过网页直接访问 • http://www.ccerdata.com • 帐户名:pkugsm • 密码:pkugsm • 选择购买的数据库
CCER数据
• 选择所需数据的时间频率及开始时间和结束时间
CCER数据
• 三种方法输入代码列表
– 输入以空格分割的代码列表。 – 上传代码列表,每行一个代码,如果需要可以在代码 后跟开始时间和结束时间,例如:
• 000001 1999-12-31 2003-01-30 • 000004 1992.11.11 2002.09.08
– 选择数据库中的所有代码
CCER数据
• run;
参数含义
• delimiter = ‘,‘ 指定分隔号 • firstobs=2,从第二行开始读取 • Informat,指定输入变量的格式
参数含义
• Missover • 假设输入变量为 v1,v2,v3,v4,v5 • 文件有一行数据 12,12,34,23, • 如果没有这个参数,系统将跳到下一行用第一个数来填入 变量v5 • 如果有这个参数,v5在这一行的数值为空
处理方法
• 假设将第二列数读入一个字符型变量D,如何产 生一个新的日期型变量Date • 方法:从字符型变量中取出对应的字符,然后将 其转换成数字,然后结合成日期
处理方法
Data ***(drop=D year month day); Set ***; Format Date YYMMDD10.; Year=input(substr(left(D),1,4),8.); Month=input(substr(left(D),6,2),8.); Day=input(substr(left(D),9,2),8.); Date=mdy(month,day,year); Run;
缺点
• 对输入变量的格式控制性弱,需要在导入后进行 初步的数据处理
– 日期型变量的处理 – 字符型数据的处理
• 受行数限制(65535)
可能出现的问题
• 字符型变量
– 原始数据中stock_code是Excel字符型变量 – 导入SAS后,仍然是字符型
• 如果SCANTEXT=NO,那么但长度为缺省的255个字符 • 如果SCANTEXT=YES,由于Excel和SAS版本多样的问题,通 常也不是想要的结果
• trdmnt=year(trade_date)*100+month(trade_date);
Data abb1; Set a; trdmnt=year(trade_date)*100+month(trade_date); Run;
解决方法
• 一个数据集中的月度时间变量trdmnt为整数 “YYYYMM”类型转为日期型 • “YYYYMM”类型转为日期型
????
解决方法二
• 生成新数值型变量stkcd,将stock_code转为数值型 并赋予stkcd Data abb1(drop=stock_code); Set a; Stkcd=input(stock_code,8.); Run; • 用到的函数 input
可能出现的问题
• 日期型变量
– 原始数据中trade_date是Excel日期型变量 – 导入SAS后,如果USEDATE=NO,那么trade_date为 SAS的日期时间型变量 – 例如:“1993-5-1” -> “1May1993:00:00:00” – 问题:显示不直观
• 先用字符型变量将数据导入 • 再用函数处理,生成日期型变量或整数日期 • 用到的函数
– – – – Left( var ): 将字符变量中的内容向左对齐 Substr( var ,position, n):取字符变量的内容 Input(var, n.):将字符变量转换为数值 Mdy(m, d, y): 将数值变量组合为日期 变量
– YES:转换成字符;NO:变为缺失
应用该列最长的观测值的长度作为变量的长度 用日期型来导入时期时间数据 应用时间型如果只有时间数据
对应程序
PROC IMPORT OUT= WORK.a DATAFILE= "D:\teaching\FinModeling\MS0809_2\Data\ab\ab_b.xls" DBMS=EXCEL REPLACE; SHEET="ab_b$"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; * 如果该参数为NO,则导入日期时间型; SCANTIME=YES; RUN;
解决方法
• SAS日期型变量
– 日期型(年、月、日) – 日期时间型(年、月、日、时、分、秒)
解决方法
• 取出日期时间型变量中的日期信息 Data abb1; Set b; Dt=datepart(trade_date); Format dt YYMMDD10.; Run; • 用到的函数 datepart()
• Format dt YYMMDD10.; • dt=mdy(mod(trdmnt,100),1,int(trdmtn/100));
SAS读取方式之二
• 直接读取以逗号分隔的文件(.csv) • Data 数据集名;
– infile ‘文件路径' delimiter = ',' MISSOVER DSD firstobs=2 ; – informat 变量名 格式 ; – input 变量名;
引入后的数据集
• 字符型->字符型 • 数值型->数值型 • 日期型->日期型;或日期时间型 • 例:导入CCER数据“ab_b.xls”(同时具有a股和b 股发行的上市公司的b股成交量的月度数据;时 期:1993年1月-2003年12月)
结果有什么不同
PROC IMPORT OUT= WORK.a DATAFILE= "D:\teaching\FinModeling\MS0809_2\Data\ab\ab_b.xls" DBMS=EXCEL REPLACE; SHEET="ab_b$"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN; PROC IMPORT OUT= WORK.b DATAFILE= "D:\teaching\FinModeling\MS0809_2\Data\ab\ab_b.xls" DBMS=EXCEL REPLACE; SHEET="ab_b$"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=NO; SCANTIME=YES; RUN;
• run;
可能出现的问题
• 原始数据 • • • • 200002,1993-05,668000,000002 200002,1993-06,1214000,0000ቤተ መጻሕፍቲ ባይዱ2 200002,1993-07,332000,000002 200002,1993-08,3882000,000002
日期数据
可能出现的问题
• 月度时间如何标识
– 原始数据中的trade_date实际为日度时间,即每个月的 第一天 – SAS中也没有特定的月度时间 – 问题
• 不同数据库中月度信息的匹配 • 例如:另一个数据库中的月度时间变量为一个整数,形式为 “YYYYMM”
解决方法
• 一个数据集中的月度时间变量trade_date为日期型 • 日期型转为“YYYYMM”整数类型
如何进一步加工
• 例如我们将ab_b.xls导入后形成work.a数据集 • 对work.a进一步处理,形成一个新变量stkcd来替 代stock_code
解决方法一
Data abb1(drop=stock_code); Set a; Length stkcd $ 6; Stkcd=substr(left(stock_code),2,6); Run; • 用到的函数 • Substr(argument,position<,n>) • Left(argument)
– 问题:数据集的大小增大,资源浪费,降低处理效率
结果有什么不同
PROC IMPORT OUT= WORK.c DATAFILE= "D:\teaching\FinModeling\MS0809_2\Data\ab\ab_b.xls" DBMS=EXCEL REPLACE; SHEET="ab_b$"; GETNAMES=YES; MIXED=NO; SCANTEXT=NO; USEDATE=YES; SCANTIME=YES; RUN; PROC IMPORT OUT= WORK.d DATAFILE= "D:\teaching\FinModeling\MS0809_2\Data\ab\ab_b.xls" DBMS=EXCEL REPLACE; SHEET="ab_b$"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN;
相关文档
最新文档