sas课程笔记.docx
- 文档编号:29241357
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:60
- 大小:40.82KB
sas课程笔记.docx
《sas课程笔记.docx》由会员分享,可在线阅读,更多相关《sas课程笔记.docx(60页珍藏版)》请在冰豆网上搜索。
sas课程笔记
目录
1、数据导入(对于导入数据参见littlesasbook第二章)2
1.1创建新逻辑库创建新逻辑库有两种方法:
2
1.2将你的数据放入SAS*/2
1.3用LIBNAME语句使用永久数据集3
2、开发数据(参见littlesasbook第三章)3
2.1格式、输入、读取3
2.2用IFTHENDOEND和elseif选择数据或选取部分数据4
2.3求取最大值和总值6
2.4累加和累乘6
2.5数组处理7
练习计算某只股票某段时间的累计收益率和年化收益率(提取数据和计算)8
3、函数-COMPBL&COMPRESS、11
3.1COMPBL&COMPRESS去掉空格11
3.2INDEX;是找寻后一个变量在前一个变量中的位置12
3.3SCAN提取字串、SUBSTR替换字串12
3.4VERIFY;核实某字符的存在13
3.5UPCASEvs.LOWCASE;13
3.6日期时间的显示和计算14
3.7Truncation用函数处理具体数值16
3.8数据转置18
3.9概率统计与随机抽样函数18
练习计算A股股票在2014年的双周收益率序列21
4、对表的处理22
4.1表的连接22
4.2表的合并24
5、数据查询实例27
6、利用宏30
6.1利用宏程序导入股票日交易数据30
6.2用宏程序导入两个文本文件的数据并计算两只股票的总收益率和(几何平均)年收益率32
6.3求winners50和losers50(答案)33
6.4.1定义宏变量35
6.4.2引用宏变量36
6.4.3多次引用宏变量36
6.4.4改变宏变量的值37
6.4.5如何隔开宏变量引用和文本38
6.4.6显示宏变量值38
6.4.7间接引用宏变量&&38
6.4.8定义宏和调用宏(什么是宏?
)39
6.4.9宏参数(定义在宏%MACRO语句内的宏变量)40
6.4.10宏程序语句和宏函数41
1、对于在CSMAR下载的数据,用foxpro格式下载,然后用Stat/Transfer转换成SAS格式;
对于在RESSET数据库下载的数据,建议使用下载数据时自动生成的数据导入程序(可能要稍作修改)导入SAS。
2、对于在其它地方下载的数据格式规范的excel数据,可能有两种情形
(1)变量名已经符合SAS变量名规范:
下划线或者英文字母开头且变量名只包括“下划线、英文字母和阿拉伯数字”,例如
_var1,sales001,year_2008,etc.
则可以直接使用Stat/Transfer转换成SAS格式;
(2)变量名不符合SAS规范,先使其规范,然后使用Stat/Transfer转换成SAS格式。
3、对于在其他地方下载的格式不规范的数据,建议先使用word和excel整理成规范的excel表格式,然后用Stat/Transfer转换成SAS格式。
1、数据导入(对于导入数据参见littlesasbook第二章)
1.1创建新逻辑库创建新逻辑库有两种方法:
在逻辑库窗口中选择文件(file)下拉菜单的新建(new);或者
直接右键——新建。
在新建逻辑库(newlibrary)窗口中,为你的逻辑库起一个名字,指定库的存放路径。
如果不想每次启动SAS都要调用这个库,则勾选启动时启用(enableatstartup)即可。
1.2将你的数据放入SAS*/
数据导入是比较复杂的,建议大家要化繁为简:
Ø对于在CSMAR下载的数据,用foxpro格式下载,然后用Stat/Transfer转换成SAS格式;
Ø对于在RESSET数据库下载的数据,建议使用下载数据时自动生成的数据导入程序(可能要稍作修改)导入SAS。
Ø对于在其它地方下载的数据格式规范的excel数据,可能有两种情形
A.变量名已经符合SAS变量名规范:
下划线或者英文字母开头且变量名只包括“下划线、英文字母和阿拉伯数字”,例如
a)_var1,sales001,year_2008,etc.
则可以直接使用Stat/Transfer转换成SAS格式;
B.变量名不符合SAS规范,先使其规范,然后使用Stat/Transfer转换成SAS格式。
Ø对于在其他地方下载的格式不规范的数据,建议先使用word和excel整理成规范的excel表格式,然后用Stat/Transfer转换成SAS格式。
1.3用LIBNAME语句使用永久数据集
注意这种方法创建的逻辑库在关闭SAS后就失效了
libnameaa1"E:
\research\CEO跳楼\data";
libnameall("E:
\research\project01""E:
\research\project01\data");
2、开发数据(参见littlesasbook第三章)
2.1格式、输入、读取
DATAhomegarden;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Garden.dat';
*请注意要根据自己电脑上的物理地址修改上述文件的路径,下同;
INPUTName$1-7TomatoZucchiniPeasGrapes;
Zone=14;
Type='home';赋值为home
Zucchini=Zucchini*10;
Total=Tomato+Zucchini+Peas+Grapes;
PerTom=(Tomato/Total)*100;
RUN;
PROCPRINTDATA=homegarden;
TITLE'HomeGardeningSurvey';
RUN;
/*Pumpkin.dat的原始数据
AliciaGrossman13c10-28-20127.86.57.28.07.9
MatthewLee9D10-30-20126.55.96.86.08.1
ElizabethGarcia10C10-29-20128.97.98.59.08.8
LoriNewcombe6D10-30-20126.75.64.95.26.1
JoseMartinez7d10-31-20128.99.510.09.79.0
BrianWilliams11C10-29-20127.88.48.57.98.0
*/
/*读入数据时的指针控制
@n:
绝对控制,表示将输入指针移动到第n列
+n:
相对控制,表示将输入指针向后移动n列
*/
DATAcontest;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Pumpkin.dat';
INPUTName$16.Age3.+1Type$1.+1DateMMDDYY10.$表示字符
(Scr1Scr2Scr3Scr4Scr5)(4.1);
*+1表示将输入指针向后移动1列;(4.1)表示保留一位小数
AvgScore=MEAN(Scr1,Scr2,Scr3,Scr4,Scr5);
DayEntered=DAY(Date);DAY(Date)指的是returnsthedayofthemonthfromaSASdatevalue.
Type=UPCASE(Type);
RUN;
PROCPRINTDATA=contest;
TITLE'PumpkinCarvingContest';
RUN;
/*我们可以看到:
date这个日期变量,由于是机器存储格式,我们看不懂,可以将程序略作修改*/
DATAcontest;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Pumpkin.dat';
INPUTName$16.Age3.+1Type$1.+1DateMMDDYY10.
(Scr1Scr2Scr3Scr4Scr5)(4.1);
formatdateyymmdd10.;使日期的格式改成年月日
AvgScore=MEAN(Scr1,Scr2,Scr3,Scr4,Scr5);
DayEntered=DAY(Date);/*一个月中的第几天*/
Type=UPCASE(Type);
RUN;
PROCPRINTDATA=contest;
TITLE'PumpkinCarvingContest';
RUN;
2.2用IFTHENDOEND和elseif选择数据或选取部分数据
DATAoldcars;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Auction.dat';
INPUTMake$1-13Model$15-29YearMadeSeatsMillionsPaid;
IFYearMade<1890THENVeteran='Yes';
IFModel='F-88'THENDO;
Make='Oldsmobile';
Seats=2;
END;
学会用IFTHENDOEND语句
RUN;
PROCPRINTDATA=oldcars;
TITLE'CarsSoldatAuction';
RUN;
————————————————————————
*Groupobservationsbycost;
DATAhomeimprovements;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Home.dat';
INPUTOwner$1-7Description$9-33Cost;
IFCost=.THENCostGroup='missing';
ELSEIFCost<2000THENCostGroup='low';
ELSEIFCost<10000THENCostGroup='medium';
ELSECostGroup='high';
学会用elseif语句
RUN;
PROCPRINTDATA=homeimprovements;
TITLE'HomeImprovementCostGroups';
RUN;
—————————————————————————
*Chooseonlycomedies;
DATAcomedy;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Shakespeare.dat';
INPUTTitle$1-26YearType$;
IFType='comedy';
If是选取部分数据的条件
RUN;
PROCPRINTDATA=comedy;
TITLE'ShakespeareanComedies';
RUN;
—————————————————————————
DATAlibrarycards;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Library.dat'TRUNCOVER;
INPUTName$11.+1BirthDateMMDDYY10.+1IssueDateANYDTDTE10.
ANYDTDTE10表示以93/06/04这样的格式呈现或者说以ANYDTDTE10这样的格式读取issuedate这个变量。
DueDateDATE11.;
DaysOverDue=TODAY()-DueDate;
TODAY()-DateDue(注意顺序哦)
CurrentAge=INT(YRDIF(BirthDate,TODAY(),'AGE'));
Int表示取整,yrdif(start-date,end-date,
IFIssueDate>'01JAN2012'DTHENNewCard='yes';
RUN;
PROCPRINTDATA=librarycards;
FORMATIssuedateMMDDYY8.DueDateWEEKDATE17.;
TITLE'SASDateswithoutandwithFormats';
RUN;
2.3求取最大值和总值
*UsingRETAINandsumstatementstofindmostrunsandtotalruns;
DATAgamestats;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\Games.dat';
INPUTMonth1Day3-4Team$6-25Hits27-28Runs30-31;
RETAINMaxRuns;
MaxRuns=MAX(MaxRuns,Runs);
RunsToDate+Runs;
RUN;
PROCPRINTDATA=gamestats;
TITLE"Season'sRecordtoDate";
RUN;
retain语句可以让SAS保存前一次变量的值
变量maxruns取前面迭代的maxruns和runs中最大值;
RunsToDate+Runs表示:
变量runstodate将每一场比赛的runs都加到自己身上
2.4累加和累乘
datat1;
doi=1to5;
output;
end;
run;
*累加;
datat2;
sett1;
total+i;
run;
*累乘;
datat3;
sett1;
retainmul1;
1表示初值为1
mul=mul*i;
run;
不能mul*i
2.5数组处理
*Changeall9stomissingvalues;
DATAsongs;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\KBRK.dat';
INPUTCity$1-15Agewjkttrfilpttr;
ARRAYsong(5)wjkttrfilpttr;
DOi=1TO5;
IFsong(i)=9THENsong(i)=.;
END;
RUN;
PROCPRINTDATA=songs;
TITLE'KBRKSongSurvey';
RUN;
ARRAYsong(5)wjkttrfilpttr;数组在数据步中用ARRAY来定义
————————————————————
DATAsongs;
INFILE'F:
\教学\04统计计量\000实证财务方法\TheLittleSASBook_APrimer\data\MyRawData\KBRK.dat';
INPUTCity$1-15Agewjkttrfilpttr;
ARRAYnew(5)Song1-Song5;
ARRAYold(5)wj--ttr;
DOi=1TO5;
IFold(i)=9THENnew(i)=.;
ELSEnew(i)=old(i);
END;
AvgScore=MEAN(OFSong1-Song5);
PROCPRINTDATA=songs;
TITLE'KBRKSongSurvey';
RUN;
练习计算某只股票某段时间的累计收益率和年化收益率(提取数据和计算)
1、使用gtrd.trd_year的年度股票收益率YRETWD计算'000001'在
2000-2014年的累计收益率和年化收益率(几何平均收益率)。
第一步:
先把该提取的数据提取出来
datam1;
setgtrd.trd_year;
ifstkcd='000001'and'2000'<=TRDYNT<='2014';
formatyear4.ret10.6;
year=input(TRDYNT,4.);
Input()表示bringsaninputdatarecordintotheinputbufferwithoutcreatinganySASvariables
ret=YRETWD;
keepstkcdyearr;
run;
用Format设置格式
第二步:
求累计收益率
datam2;
setm1;
retainmul1;
Mul初值为1
mul=mul*(1+ret);
这条语句是求累计收益率的关键
run;
第三步:
求年化收益率
datam3;
setm2;
bystkcd;
iflast.stkcd;
formatcumretannretpercentn10.2;
labelcumret='累计收益率'annret='年化收益率';
cumret=mul-1;
annret=mul**(1/15)-1;
**表示幂次方
keepstkcdcumretannret;
run;
用labelcumret='累计收益率'设置显示的列名
2、基于gtrd.trd_year的复权价数据adjprcwd计算上市日期<2011.1.1的创业板股票自上市至2014.12.31的累计收益率和年化收益率。
第一步:
提取数据
procsql;
createtableh1as
/*创建表*/
selectdistinct
/*去掉重复的*/
b.stkcd,b.stknme,
/*别名*/
input(b.listdt,yymmdd10.)aslistdateformat=yymmdd10.label='上市日期',
input(a.trddt,yymmdd10.)asdateformat=yymmdd10.,
a.adjprcwd+0
/*可以不加0*/asapformat=12.6label='后复权价'
fromgtrd.trd_dalyra,gtrd.trd_cob
/*数据来源,并取别名*/
wheresubstr(b.stkcd,1,1)='3'
/*1起始位置1选择长度,选取创业板股票*/
anda.stkcd=b.stkcd
andb.listdt<'2011-01-01'
anda.trddt<='2014-12-31'
orderbystkcd,date;
quit;
第二步:
建立数据表
/*方法一:
纯data步*/
datar1;
seth1;
bystkcd;
iffirst.stkcd;
formatp010.6;
/*命名p0*/
labelp0='上市首日收盘价';
/*会分行*/
p0=ap;
keepstkcdstknmelistdatep0;
run;
datar2;
seth1;
bystkcd;
iflast.stkcd;
formatp110.6;
labeldate='截止日期'p1='截止日期复权价';
p1=ap;
keepstkcddatep1;
run;
第三步:
计算
dataresult_1;
merger1r2;
bystkcd;
formatyr10.4cumretannretpercentn10.2;
labelyr='年限'cumret='累计收益率'annret='年化收益率';
yr=yrdif(listdate,date,'act/act');
cumret=p1/p0-1;
annret=(p1/p0)**(1/yr)-1;
keepstkcdstknmelistdatedateyrcumretannret;
run;
procsortdata=result_1;
bydescendingannret;
run;
/*方法二:
结合SQL步*/
datas1;
seth1;
bystkcd;
iffirst.stkcdorlast.stkcd;
run;
datas1;
sets1;
bystkcd;
iffirst.stkcdthennum=0;
num+1;
run;
/*编号1代表首日和2代表截止日*/
procsql;
createtableresult_2as
selectdistinct
a.stkcd,a.stknme,a.listdate,
b.datelabel='截止日期',
yrdif(a.listdate,b.date,'act/act')asyrformat=10.4label='年限',
b.ap/a.ap-1ascumretformat=percentn10.2label='累计收益率',
(b.ap/a.ap)**(1/calculatedyr)-1asannretformat=percentn10.2label='年化收益率'
froms1a,s1b
wherea.stkcd=b.stkcdanda.num=1andb.num=2
orderbyannretdesc;
quit;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sas 课程 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)