sas课程笔记.docx

上传人:b****2 文档编号:17038781 上传时间:2023-07-21 格式:DOCX 页数:60 大小:40.82KB
下载 相关 举报
sas课程笔记.docx_第1页
第1页 / 共60页
sas课程笔记.docx_第2页
第2页 / 共60页
sas课程笔记.docx_第3页
第3页 / 共60页
sas课程笔记.docx_第4页
第4页 / 共60页
sas课程笔记.docx_第5页
第5页 / 共60页
sas课程笔记.docx_第6页
第6页 / 共60页
sas课程笔记.docx_第7页
第7页 / 共60页
sas课程笔记.docx_第8页
第8页 / 共60页
sas课程笔记.docx_第9页
第9页 / 共60页
sas课程笔记.docx_第10页
第10页 / 共60页
sas课程笔记.docx_第11页
第11页 / 共60页
sas课程笔记.docx_第12页
第12页 / 共60页
sas课程笔记.docx_第13页
第13页 / 共60页
sas课程笔记.docx_第14页
第14页 / 共60页
sas课程笔记.docx_第15页
第15页 / 共60页
sas课程笔记.docx_第16页
第16页 / 共60页
sas课程笔记.docx_第17页
第17页 / 共60页
sas课程笔记.docx_第18页
第18页 / 共60页
sas课程笔记.docx_第19页
第19页 / 共60页
sas课程笔记.docx_第20页
第20页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

sas课程笔记.docx

《sas课程笔记.docx》由会员分享,可在线阅读,更多相关《sas课程笔记.docx(60页珍藏版)》请在冰点文库上搜索。

sas课程笔记.docx

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,)表示Returnsthedifferenceinyearsbetweentwodatesaccordingtospecifieddaycountconventions

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2