SAS教程(金融)
- 格式:ppt
- 大小:2.24 MB
- 文档页数:4
第3章SAS编程基础3.1 SAS语法基础3.1.1 SAS常数SAS常数用来表示固定的值,它或者是一个数字,或者是用引号引起来的字符串,或者是其他特殊记号。
SAS常用以下三类常数:一、数值常数一个数值常数就是出现在SAS语句里的数字。
其书写和用法与其他高级语言的使用基本相同,它可以包括小数点,负号及E记号等,如:0.1 ,1.23, -5, 1.2E3, 0.5E-5数值常数缺失时用小数点“.”表示。
二、字符常数字符常数是由单引号括起来的1到200个字符组成的。
如语句:if name=’tom’ then do;中的’tom’是一个字符常数。
如果字符常数含有引号,此时应用双引号括起来,如name=”’tom’ s”。
字符常数缺失时用空格加引号(’’)表示。
三、日期、时间和日期时间常数为了把日期、时间或日期时间值表示为常数,在输入格式或输出格式中使用相同记法:TIME.,DATE.和DATETIME.。
格式值用单引号括起来,并跟随一个D(日期),T (时间)或DT(日期时间)。
如:’1JAN1998’D, ’01JAN98’D, ’9:25’T ,’18JAN98:9:25:20’DT。
3.1.2 SAS操作符SAS操作符是一些符号,用它们可以作比较、算术运算或逻辑运算,它有前缀和中缀之分。
前缀操作符用在数值、变量或函数的前面,主要有+、-、NOT。
而中缀操作符则是用在两个运算对象的中间,主要有算术操作符、比较操作符、逻辑操作符、其他操作符四类。
一、算术操作符算术操作符表示执行一种算术运算。
常用算术操作符、含义及举例见表3.1。
表3.1 SA S算术操作符、含义及举例二、比较操作符比较操作符用来建立两个量之间的一种关系,并要求SAS确定这种关系是成立或不成立。
如果成立,输出的结果为1;如果不成立,结果为0。
常用比较操作符、含义及举例见表3.2。
表3.2 SA S比较操作符、含义及举例三、逻辑操作符逻辑操作符也称为布尔算符,在表达式里通常用来连接一系列比较式,常与IF语句结合使用。
常用统计分布函数SAS 实现1. 正态分布密度函数作图分布函数作图产生随机数 其它作图(1)μ=2, σ=0.5, 1, 2。
三图重叠在一个坐标系内。
(2)μ=2, σ=0.5, 1, 2, 5, 10。
四图重叠在一个坐标系内。
(3)μ= 0,1,2 σ=1。
三图重叠在一个坐标系内。
(4)μ=0, σ=1用SAS 软件产生标准正态的概率分布表 其它概率计算注意)(2121)(22)(222σμπσπσμσμ-Φ===--∞---∞-⎰⎰x dt edt ex F t x t x于是,对任意的实数)(,2121x x x x <有,(1)μ=1.5,σ=2,产生正态概率分布表。
(2)μ=1.5,σ=2,求P(X>0)。
(3)μ=1.5,σ=2,求P(-1<X<2)。
(4)用SAS 计算下面概率,并与查表结果对比。
~(1,4)X N ,求( 1.6),(0 1.6),(||4)P X P X P X ≤<≤>分位数定义:设~(0,1)X N ,若Z α满足条件(),01P X Z ααα>=<<,则称Z α为标准正态分布的上α分位点。
(1)计算0.001,0.0025,0.005和0.010的下分位数。
(2) 计算0.001,0.0025,0.005和0.010的上分位数。
本人不同意分为上下分位数,分位数就是分位数,定义为:若Z α满足条件(),01P X Z ααα<=<<则称点Z α为随机变量的α分位数。
单边的, 双边的,注意和以均值为中心,1,2,3倍标准差宽度区间的概率值的区别。
其它可参考例子(1)概率的两种计算公式data ;p1=PROBNORM(1)-PROBNORM(-1); put p1=; p2= PROBNORM(2)-PROBNORM(-2); put p2=; p3= PROBNORM(3)-PROBNORM(-3); put p3=; run ;p1=0.6826894921 p2=0.9544997361 p3=0.9973002039data;p1=2*PROBNORM(1)-1; put p1=;p2=2*PROBNORM(2)-1; put p2=;p3=2*PROBNORM(3)-1; put p3=;run;p1=0.6826894921p2=0.9544997361p3=0.9973002039(2)以均值为中心的区间与概率如,以μ为中心,需要几倍标准差σ距离所构成的区间,其区间内的概率等上面(1)中的概率。
SAS与TXT和XLS接口程序1.SAS数据集导出多个TXT文本。
设数据集名称为Thstk.quotation,要求导出三个文本600001.txt,600002.txt,000001.txt,变量名及变量格式如下:变量名标签|Label 类型长度Permno 永久性代码|Permanent No. 字符8Hstkcd 最新股票代码|Stock Code – Header 字符 6Dt 日期|Date 日期10Openpr 开盘价|Open Price 数值8.2Highpr 最高价|High Price 数值8.2Lowpr 最低价|Low Price 数值8.2Closepr 收盘价|Close Price 数值8.2Trdvol 成交量|Trading Volume 数值20.Trdsum 成交金额|Trading Sums 数值20.2Facpr 股价调整因子|Adjusting Factor for Price 数值10.42. 多个TXT文本文件导入SAS数据集。
设有三个文本600001.txt,600002.txt,000001.txt,变量一致,变量名及变量格式如下:变量名标签|Label 类型长度Permno 永久性代码|Permanent No. 字符8Hstkcd 最新股票代码|Stock Code – Header 字符 6Dt 日期|Date 日期10Openpr 开盘价|Open Price 数值8.2Highpr 最高价|High Price 数值8.2Lowpr 最低价|Low Price 数值8.2Closepr 收盘价|Close Price 数值8.2Trdvol 成交量|Trading Volume 数值20.Trdsum 成交金额|Trading Sums 数值20.2Facpr 股价调整因子|Adjusting Factor for Price 数值10.43. SAS数据集导出多个EXCEL表。
SAS金融计算教学中自定义函数的实验设计作者:桂文明来源:《科技创新导报》 2014年第34期桂文明1 2(1.金陵科技学院江苏南京 211169; 2.南京财经大学江苏南京 210046)摘要:SAS在金融计算领域有着旺盛的生命力,SAS金融计算课程是金融类专业中实践性较强的课程之一。
在该课程的教学过程中,如何设计好实验环节是教学成功与否的关键所在。
该文针对难度较高但适用性广的SAS自定义函数部分,结合债券久期理论,采用我国债券市场的真实数据,设计了一个课程实验,具有内容新颖、综合性强的特点,可使学生在动手过程中快速掌握相关知识。
课程内容分为SAS自定义函数讲授、久期基本概念回顾、实验内容、实验步骤提示和实验答案讲解五个环节。
关键词:金融计算 SAS编程债券久期自定义函数中图分类号:G420 文献标识码:A 文章编号:1674-098X(2014)12(a)-0152-02SAS软件在国际上已被誉为统计分析的标准软件,在各个领域得到广泛应用,它在金融计算领域也具有强大的生命力,对金融学及其相关专业的学生来说,掌握SAS并运用它到金融专业的理论计算和实践非常必要[1,2]。
SAS金融计算课程是金融学及其相关专业课程体系中的实践性较强的课程。
在这类课程中,讲授理论知识的同时,往往需要辅以实验来提升学生理解理论的层次。
一些高校的金融学专业中还专门开设此类综合实验课程,以期学生能掌握SAS编程方法,加深对相关金融理论知识的理解,增强动手能力,提升解决金融实务问题的能力,培养和启发用数据说话的理念。
SAS金融计算课程对学生的要求较高,难度较大,因为它是一门跨学科性质的课程,既要求掌握金融理论知识,又要具备基本的计算机编程基础,而编程知识一般是金融学及其相关专业学生的弱项。
要使SAS金融计算课程在学生和教师的互动过程中顺利展开,设计好实验环节是关键。
实验的内容应该和金融相关,实验数据应该是金融市场中的真实数据。
SAS基础与金融计算4引言本文档旨在介绍SAS(Statistical Analysis System)及其在金融计算中的基础应用。
SAS是一种广泛使用的统计分析软件,其功能强大,能够进行数据的处理、分析和可视化。
在金融领域,SAS被广泛应用于风险管理、投资组合分析、量化交易等方面。
本文将介绍SAS的一些基础知识,并结合金融计算的实例进行说明。
第一部分:SAS基础知识1. SAS语言基础SAS语言是一种类似于英语的编程语言,用于描述数据的处理和分析过程。
以下是一些基础的SAS语言元素:•数据集(Data Set):SAS中的数据存储在数据集中,每个数据集由变量和观测组成。
•数据步(Data Step):数据步是SAS程序中用来对数据进行处理的基本单位,包括数据导入、数据转换等操作。
•过程(Procedure):过程是SAS程序中用来进行数据分析的模块,比如描述统计、线性回归等。
•语句(Statement):语句是SAS程序的最小执行单位,每个语句以分号结尾。
2. SAS数据集操作SAS提供了丰富的数据集操作函数,可以对数据集进行增删改查等操作。
以下是一些常用的数据集操作:•创建数据集:使用data语句可以创建一个新的数据集,并定义其中的变量。
•导入数据:使用import语句可以从外部文件导入数据到SAS中的数据集。
•数据过滤:使用where语句可以对数据进行条件过滤,只选择满足条件的观测。
•数据排序:使用sort语句可以对数据集按照指定的变量进行排序。
•数据合并:使用merge语句可以将两个或多个数据集按照共有的变量合并成一个数据集。
3. SAS统计分析SAS提供了各种统计分析的过程,可用于探索数据的特征、分析数据之间的关系等。
以下是一些常用的统计分析过程:•描述统计:使用proc means过程可以计算数据的基本统计量,比如均值、方差等。
•数据分组:使用proc freq过程可以对数据按照指定的变量进行分组统计。
12.2.1数据选取data ;weeks=('31dec2000'd-'01jan1995'd)/14;put weeks=;run;weeks=156.512.3.2 计算双周收益率/*计算市场组合双周收益率*/options nodate nonotes nosource;data index;set compufin.final;dweek=ceil((date-'01Jan95'd-6)/14); /*标记双周序号,1995年1月1日及以后的第一周为0,以后每两周加1*/data index(keep=dweek dwr_index);set index;if last.dweek=1 ; /*保留双周末数据*/by dweek;dwr_index=dif(index)/lag(index); /*计算双周收益率*/if dwr_index=. then delete; /*去掉空值*/run;/*通过DOS命令为计算个股双周收益率创建宏文本:char12.txt*//*第一步,在DOS的“d:\基于sas系统的金融计算光盘\stoindif”目录下键入“dir a6*.*/b >list.txt”,生成文件list.txt*//*第二步,生成宏文本*/data a;infile ' d:\基于SAS系统的金融计算光盘\stoindif\list.txt';informat fname $16.;input fname $;data a;set a;hexcd=substr(fname,2,6);format hexcd $6.;data a;set a;a='%a(';b=');' ;file "d:\基于SAS系统的金融计算光盘\stoindif\char12_1.txt" ;put a $ hexcd $ b $ ;run;/*根据复权个股数据库(stoindif)复权价计算个股双周收益率*/ data stock;delete;%macro a(a1);data a;set stoindif.a&a1.;dweek=ceil((date-'01Jan95'd-6)/14); /*标记双周序号*/hexcd="&a1.";data a(keep=dweek dwr hexcd);set a(where=(date<'01Jan01'd));if last.dweek=1 ; /*保留周末数据*/by dweek;dwr=dif(clpr_r)/lag(clpr_r); /*计算双周收益率*/data stock;set stock a(firstobs=2); /*去掉第一行,收益率为空*/%mend a;%include "d:\基于SAS系统的金融计算光盘\stoindif\char12_1.txt" ;proc sort;by dweek hexcd;run;12.3.3 计算无风险利率data deposit;set compufin.deposit_r;where '01Jan95'd<=date<='31Dec00'd;dweek=ceil((date-'01Jan95'd)/14); /*标记双周序号*/data deposit(keep=dweek dw_rf);set deposit;if last.dweek=0 then delete; /*保留周末数据*/by dweek;if dweek in(0,157) then delete;dw_rf=y_r/26; /* 一年有26个双周*/run;12.3.4 验证CAPM循环程序/*合并市场组合及个股双周收益率、无风险收益率*/data table;merge stock deposit index;by dweek;label dwr='个股双周收益率'dw_rf='无风险双周收益率'dwr_index='市场组合双周收益率'hexcd='股票代码';if hexcd=. then delete;proc sort;by hexcd dweek;run;/*循环计算过程*/data reg;/*后面要在reg里面存放最后一步日回归用的所有变量*/delete;run;%macro b(b1);data a;set table;where %eval(&b1.)<=dweek<=%eval(&b1.+15);/*分组过程,保留这一区间内的股票收益率、指数收益率*/proc reg outest=a noprint;/*在此区间内分组回归,得到每一只股票的Beta值,输出到数据集a*/model dwr=dwr_index;by hexcd;/*每支股票分别回归*/run;proc sort data=a;by dwr_index;/*在a中从小到大排列Beta*/run;data a(keep=hexcd group);/*在a中分15个组,只保留股票代码与组号*/set a nobs=nobs;x0=mod(nobs,15);x1=floor(nobs/15);if _n_ le x0*(x1+1) then group=ceil(_n_/(x1+1));if _n_ gt x0*(x1+1) then group=ceil((_n_/x1);proc sort data=a;by hexcd;run;%do i=%eval(&b1.+25) %to %eval(&b1.+34);/*在同一分组期内逐个计算“估值期”Beta值*/data b;set table;where %eval(&b1.+16)<=dweek<=&i. and dwr^=.;/*控制每次读相应数据行*/proc reg outest=b noprint; /*Beta和S值输出到b*/model dwr=dwr_index;by hexcd;run;data b;merge b(keep=hexcd dwr_index _rmse_ rename=(dwr_index=b _rmse_=s)) a;/*将b与a合并,加上组号,并只保留Beta和残差标准差S*/by hexcd;if group=. then delete; /*如果股票在“分组期”没有上市,则此处不参与计算*/proc sort;by group;run;proc means data=b noprint; /*每组Beta与S取简单平均*/by group;var b s;output out=b mean=b s; /*输出到b*/run;data b(keep=group s b bb); /*只保留回归用变量S、β、β平方*/set b;bb=b*b; /*加入beta的平方这个变量*/run;data c;set table;where dweek=%eval(&i.+1);/*“检验期”对应的一个数据点*/data c;merge c a;/*加上组号*/by hexcd;if group=. then delete;/*如果股票在“分组期”没有上市,则此处不参与计算*/proc sort;by group;run;proc means data=c noprint; /*组收益率简单平均*/by group;var dwr dwr_index;output out=c mean=dwr dwr_index;/*输出到c文件*/run;data b(keep=group dwr dwr_index b bb s dweek);merge c b; /*合并b、c,这样“估值期”得到的Beta、Beta平方、S和“检验期”的对应数据都到了一个表格中*/by group;dweek=%eval(&i.+1); /*加上序号*/run;data reg;set reg b; /*合并成大表*/run;%end;%mend b;%b(1);%b(11);%b(21);%b(31);%b(41);%b(51);%b(61);%b(71);%b(81);%b(91);%b(101);%b(111);%b(121);data reg;set reg;where dwr^=.;run;proc reg data=reg outest=out tableout noprint;/*将生成的reg表进行分组回归,得到相应参数*/model dwr=b bb s/dw;by dweek;run;/*检验结果*/data out1;set out;where _type_='PARMS';proc means data=out1 noprint; /*t检验,输出到out1*/var bb s b;output out=out1 t=t_bb t_s t_b probt=probt_bb probt_s probt_b mean=mean_bb mean_s mean_b;run;/*结果已输出到work.out中,这里加上日期并把t检验和参数估计放在同一行,以更好的呈现*/data out2;set out;keep dweek intercept b bb s _TYPE_;where _type_ in ('PARMS','T');proc sort;by dweek descending _type_;data out2(drop=_type_);set out2;intercept_t=lag(intercept);b_t=lag(b);bb_t=lag(bb);s_t=lag(s);if _type_='T' then delete;data a(keep=date dweek);set compufin.final;dweek=ceil((date-'01Jan95'd-6)/14);if dweek=lag(dweek) then delete;data out2;merge out2 a;by dweek;if intercept=. then delete;run;/*计算一阶自相关系数*/data a(drop=_type_ _freq_ probt_bb probt_s probt_b);set out1;do dweek=27 to 156;output;end;data out3;merge out2(drop=intercept_t b_t bb_t s_t date) deposit a;by dweek;if bb=. then delete;var1=bb;var2=s;var3=b-mean_b;var4=intercept-dw_rf;data out3;set out3;lag_var1=lag(var1);lag_var2=lag(var2);lag_var3=lag(var3);lag_var4=lag(var4);proc corr data=out3 out=out3 (type=corr) oprint; /*协方差矩阵输出到out3*/ var var1-var4 lag_var1-lag_var4;run;。