sas金融计算清华朱世武数据集char14
- 格式:doc
- 大小:88.00 KB
- 文档页数:13
SAS中计算总和或者计算总数的方法在SAS中,计算数据总和或者计算数据总数有多种方法。
下面将介绍一些常用的方法:1. 使用PROC MEANS:PROC MEANS是用于计算数据统计指标的过程。
对于计算数据总和,我们可以使用SUM选项。
例如,以下代码将计算变量"var"的总和和总数:```proc means data=dataset sum n;var var;run;```其中,"dataset"是数据集名称,"var"是变量名称。
SUM选项用于计算总和,N选项用于计算总数。
2. 使用PROC SQL:PROC SQL是一种在SAS中进行SQL查询的过程。
通过使用SUM函数和COUNT函数,我们可以计算总和和总数。
例如,以下代码将计算变量"var"的总和和总数:```proc sql;select sum(var) as total_sum, count(var) as total_countfrom dataset;quit;```其中,"dataset"是数据集名称。
SUM函数用于计算总和,COUNT函数用于计算总数。
3.使用DATA步:可以使用DATA步编写SAS代码来计算数据总和和总数。
以下是一个示例代码:```data dataset_summary;set dataset;sum_var + var;count_var + 1;run;proc print data=dataset_summary;run;```在这个例子中,我们通过DATA步将数据集中的每个观测值的"var"变量加到"sum_var"变量中,并将每个观测值计数加到"count_var"变量中。
然后使用PROC PRINT将这些变量的结果输出。
4. 使用SUMMARY步:SUMMARY步是用于创建摘要报告的过程。
SAS金融计算清华朱世武数据集10r_1=r_1+r_2;if r_1=. Then r_1=0;else r_1=r_1;data stoindiv.r_shenzhen(rename=(r_1=r&x)); merge stoindiv.r_shenzhen a;by date;data stoindiv.r_shenzhen;set stoindiv.r_shenzhen;if r&x=. then r&x=0;else r&x= r&x;%mend a;%include "D:\基于SAS系统的金融计算光盘\Compufin\宏文本\深市全部A股.txt";run;2.3.4收益SAS数据集转换为EXCEL数据表proc transpose data=stoindiv.lg_shanghai out=stoindiv.lg_shanghai_tr; run;data stoindiv.lg_shanghai_tr_1;set stoindiv.lg_shanghai_tr;if _n_<200;run;proc transpose data= stoindiv.lg_shanghai_tr_1 out= stoindiv.lg_shanghai_1; data stoindiv.lg_shanghai_1;set stoindiv.lg_shanghai_1;format date yymmdd10.;run;set stoindiv.lg_shanghai_tr;if 201<=_n_<400;run;proc transpose data= stoindiv.lg_shanghai_tr_2 out= stoindiv.lg_shanghai_2; data stoindiv.lg_shanghai_2;set stoindiv.lg_shanghai_2;format date yymmdd10.;run;data stoindiv.lg_shanghai_tr_3;set stoindiv.lg_shanghai_tr;if 401<=_n_;11run;proc transpose data= stoindiv.lg_shanghai_tr_3 out= stoindiv.lg_shanghai_3;set stoindiv.lg_shanghai_3;format date yymmdd10.;run;proc export data=stoindiv.lg_shanghai_1outfile="d:\基于sas系统的金融计算光盘\compufin\lg_shanghai_1.xls"dbms=excel2000 replace;run;proc export data=stoindiv.lg_shanghai_2outfile="d:\基于sas系统的金融计算光盘\compufin\lg_shanghai_2.xls"dbms=excel2000 replace;run;proc export data=stoindiv.lg_shanghai_3 outfile="d:\基于sas系统的金融计算光盘\compufin\lg_shanghai_3.xls"dbms=excel2000 replace;run;同样,可以转换其他收益SAS数据集为相应的EXCEL表。
15.2.1 基础数据集/*创建数据集bonds03328 */data compufin.bonds03328(label='2003年3月28日上交所15只附息国债收盘价');input name $10. enddate fre coupond price du;informat enddate yymmdd10.;format enddate yymmdd10.;labelname='债券名称'enddate='到期日'fre='年付息频率'coupond='票面利息'price='市场价格'du='久期';cards;96国债08 2003-11-01 1 8.56 107.39 0.5896国债06 2006-06-14 1 11.83 138.17 2.5699国债05 2007-08-20 1 3.28 105.17 4.0097国债04 2007-09-05 1 9.78 135.51 3.6502国债14 2007-10-24 1 2.65 101.52 4.2101国债03 2008-04-24 1 3.27 106.17 4.5101国债15 2008-12-18 1 3.00 102.52 5.1702国债10 2009-08-16 1 2.39 100.19 5.7699国债08 2009-09-23 1 3.30 105.07 5.7002国债15 2009-12-06 1 2.93 102.27 5.9601国债10 2011-09-25 1 2.95 102.49 7.3201国债12 2011-10-30 1 3.05 102.96 7.3902国债03 2012-04-18 1 2.54 101.99 7.8102国债13 2017-09-20 2 2.60 100.07 11.7801国债07 2021-07-31 2 4.26 115.26 12.83;run;15.2.2 现金流分解将某一天(以2003年3月28日为例)债券的现金流进行分解,产生不同债券在以后不同时刻的现金流。
[考研外校] 清华大学金融专业课程设置(研究生)教师:裴宇红课程1:国际金融简介:在金融一体化及新信息技术条件下,建立分析现代金融宏观框架,充分了解外汇市场、货币市场、资本市场和金融衍生证券之间的关联性,掌握国际金融原理及我国在国际金融领域的具体实践。
着重培养学生独立思考、正确处理国际金融业务的能力。
内容:虚拟经济对金融的深远影响;外汇、国际结算、外汇交易等知识;货币市场、外汇期货、外汇期权、金融互换等基本衍生金融工具定价关系以及在外汇风险管理方面的运用;国际收支及不平衡调节;经济变量之间平价关系与汇率预测;国际金融市场、国际资本流动、国际货币体系及国际金融组织等。
教材:国际金融原理,张陶伟,清华大学出版社参考书:1.期权、期货及其他衍生产品,华夏出版社,2.Sercu, P., and R. Uppal, International Financial Markets and the Firm3:《国际金融市场》人大出版社教师:张丽宏课程2:应用随机过程简介:主要内容包括:概率论基础;Possion 过程;Markov过程;平稳过程;Brown运动;停时与鞅论;随机积分;随机微分方程等教师:陈涛涛课程3:国际经济学简介:《国际经济学》课程借鉴MIT斯隆商学院和哈佛商学院开设类似课程的方法,全程采用十几个真实的国家案例,试图通过全新的案例教学方式,为学生们提供一个体会国际经济基本原理在真实世界中的作用方式与机制的机会。
课程内容分为“宏观经济分析”“国际贸易”“发展中国家发展战略”“发达国家的经济问题”以及“国际经济一体化”五个部分。
所选案例既包括美国、德国、法国等发达国家,也包括中国、韩国和墨西哥等发展中国家。
课程旨在帮助参加学习的学生提高对国际经济形势及其变化的感悟能力和培养一定程度的分析能力。
1.本课程采用10余个哈佛案例展开教学工作2.理论知识可以参看:Paul Krugman and Maurice Obstfeld's International Economics, Theory and Policy, Addison-Wesley, 6th Edition.教师:宋逢明课程4:金融工程案例分析教师:王桂琴课程5:管理沟通简介:This course is practice-oriented and the class language is English so that students' Englishwriting and speaking ability hopefully can be improved. It is designed to help students think strategically about communication goals and practice the skills to carry out the goals. It will help students improve their communication skills and acquire the expertise to prepare memoranda and other forms of written communication. Students will learn how to deliver presentations effectively and understand them.教师:赵冬青课程6:商业银行管理简介:商业银行是重要的金融中介机构,商业银行从事业务获取收益的过程就是接受风险和管理风险的过程,所以商业银行管理的核心问题是风险以及进行风险管理的方法和工具。
清华大学经济管理学院硕士生导师简介-朱世武朱世武金融系副教授办公室伟伦楼321凯程教育是五道口金融学院和清华经管考研黄埔军校,在2014年,凯程学员考入五道口金融学院28人,清华经管11人,五道口状元武xy出自凯程, 在2013年,凯程学员考入五道口金融学院29人,清华经管5人,状元李少h出在凯程, 在凯程网站有很多凯程学员成功经验视频,大家随时可以去查看. 2016年五道口金融学院和清华经管考研保录班开始报名!个人简介研究成果研究项目朱世武,自2001至今,担任清华大学经济管理学院副教授。
1983年,他毕业于河南师范大学数学专业,并获得理学学士学位。
1987年,在武汉大学获得统计学专业的理学硕士学位。
1999年,赴上海财经大学学习,并获得该校数量经济学专业的博士学位。
1999年至2001年在清华大学经济管理学院作博士后研究。
他教授的主要课程包括:金融数据库、金融统计学、实证金融学、数据模型与决策、统计分析软件。
朱世武教授研究的主要领域是:固定收益、风险管理、金融计算与建模、金融数据库。
在从事的所有科研项目里,朱世武教授主要担任项目负责人。
他重点研究的项目包括:“随机边缘模型的统计分析”,“国家债务管理和利率研究”,“金融工程的理论,技术和方法”,“违约相关性度量与信用衍生工具定价研究”—国家自然科学基金委员会;“中国股票市场的证券模型”,“中国股票市场结构性指数设计”—中国证监会;“中信实业银行的私人金融模型”—中信实业银行;“基于微网格的网格计算研究,基础研究”,“度量违约相关性的研究”,“中国资本市场股权风险溢价的实证研究”—清华大学;“中国资本市场的股权风险溢价研究”—中国国家社会科学基金;“中国金融研究数据库”—清华211项目;“中国银行间债券市场期限结构最优化模型”—中国外汇交易中心和全国银行间同业拆借中心;“浙江财经学院金融实验室金融数据项目”—浙江财经学院;“浙江万里学院金融实验室金融数据项”—浙江万里学院;“人民币市场化利率中长期预测模型”—中国人寿资产管理有限公司;“农村金融市场风险管理研究”—香港汇丰银行;“青藏高原矿产资源开发利用战略研究”—中国地质大学(北京)地质调查研究院。
3.1.1 内生收益率计算试错法计算内生收益率通用程序:data a;delete;Run;%macro a(r, n, d, par);data a1;p1=0;%do i=1 %to &n ;p1=p1+&d/(1+&r)** &i;output;%end;data a1;set a1 end=lasobs;if lasobs;p2=&par/(1+&r)**&n;p=p1+p2;r=200*&r;r1=100*&r;n=&n;data a;set a a1;%mend a;/* %a(r, n, d, par)内的具体参数值*/proc print data=a ;run;例3.2 利用通用程序,a(r, n, d, par)取值如下:%a(0.00625, 360, 349.6, 0);%a(0.006667, 360, 349.6, 0);%a(0.007083, 360, 349.6, 0);%a(0.0075, 360, 349.6, 0);本例计算程序:%macro a(r);data;p=2000/(1+&r)+2000/(1+&r)**2+2500/(1+&r)**3+4000/(1+&r)**4;r=100*&r;put r= p=;%mend a;%a(0.1);%a(0.14);%a(0.12);run;3.1.2 有效年利率计算例3.4计算程序:%macro a(r,m);data;i=(1+&r)**&m-1;r=100*&r;put r= i=;%mend a;%a(0.02,4);run;3.1.3 到期收益率计算例3.5利用通用程序,a(r, n, d, par)取值如下:%a(0.0325, 36, 30, 1000);%a(0.035, 36, 30, 1000);%a(0.0375, 36, 30, 1000);%a(0.04, 36, 30, 1000);%a(0.0425, 36, 30, 1000);%a(0.045, 36, 30, 1000);%a(0.0475, 36, 30, 1000);3.1.5 第一个赎回日收益率计算例3.6 利用通用程序,a(r, n, d, par)取值如下:%a(0.056, 10, 30, 1030);%a(0.0585, 10, 30, 1030);%a(0.061, 10, 30, 1030);%a(0.0635, 10, 30, 1030);%a(0.066, 10, 30, 1030);%a(0.0685, 10, 30, 1030);%a(0.071, 10, 30, 1030);%a(0.0735, 10, 30, 1030);%a(0.076, 10, 30, 1030);3.1.6清算日处于两个到期日之间的到期收益率计算计算程序:data ;date0='01mar1997'd;date1='17jul1997'd;date2='01sep1997'd;days02=datdif(date0, date2, '30/360'); /*美国公司债适合30/360标准*/days12=datdif(date1, date2, '30/360');n=2*(2003-1997)-1;w=days12/days02;put days02/days12/n/w;call symput(‘n’, n); /*创建一个值来自data步的宏变量n*/call symput(‘w’, w); /*创建一个值来自data步的宏变量w*/ data a;delete;%macro a(r);data a1;p1=0;do i=1 to &n ;p1=p1+5/((1+&r)**(i-1+&w));output;end;data a1;set a1 end=lasobs;if lasobs;p2=105/((1+&r)**(&n-1+&w));p=p1+p2;r=200*&r;r1=100*&r;data a(drop=i);set a a1;w=&w;n=&n;%mend a;%a(0.0363);%a(0.03735);proc print data=a;run;例3.8计算程序:data ;date0='01mar1997'd;date1='17jul1997'd;date2='01sep1997'd;days02=datdif(date0, date2, 'act/act'); /*美国政府债适合的标准*/days12=datdif(date1, date2, 'act/act');n=2*(2003-1997)-1;w=days12/days02;put days02/days12/n/w;call symput(‘n’, n); /*创建一个值来自data步的宏变量n*/call symput(‘w’, w); /*创建一个值来自data步的宏变量w*/ data a;delete;%macro a(r);data a1;p1=0;do i=1 to &n ;p1=p1+5/((1+&r)**(i-1+&w));output;end;data a1;set a1 end=lasobs;if lasobs;p2=105/((1+&r)**(&n-1+&w));p=p1+p2;r=200*&r;r1=100*&r;data a(drop=i);set a a1;w=&w;n=&n;%mend a;%a(0.03627);%a(0.0363);proc print data=a;run;3.1.7 投资组合内生收益率计算例3.9%macro a(y);data a;ap1=0;do n=1 to 9 ;ap1=ap1+350000/(1+&y)**n;output;end;data a;set a end=lasobs;if lasobs;ap2=10350000/(1+&y)**10;ap=ap1+ap2;data b;bp1=0;do n=1 to 13 ;bp1=bp1+1050000/(1+&y)**n;output;end;data b;set b end=lasobs;if lasobs;bp2=21050000/(1+&y)**14;bp=bp1+bp2;data c;cp1=0;do n=1 to 5 ;cp1=cp1+900000/(1+&y)**n;output;end;data c;set c end=lasobs;if lasobs;cp2=30900000/(1+&y)**6;cp=cp1+cp2;%mend a;%a(0.0476966);data abc;merge a b c;p=ap+bp+cp;put p=;run;3.2.1 浮动利率债券贴现差额计算计算程序:data a ;delete;%macro a(y,z,x);data a1;do n=1 to 12 ;if n<12 then p&x=5.4/(1+&y+&z)**n;else p&x=105.4/(1+&y+&z)**n;output;end;data a1;set a1;sump&x+p&x;data a;merge a a1;%mend a;%a(0.05, 0.004,80);%a(0.05, 0.0042,84);%a(0.05, 0.0044,88);%a(0.05, 0.0048,96);%a(0.05, 0.005,100);proc print data=a noobs;run;3.2.2 债券价格与必要收益率例3.11data a;delete;%macro a(y);data a1;p1=45*(1-(1/(1+&y)**40))/&y;p2=1000*(1/(1+&y)**40);p=p1+p2;y=200*&y;data a;set a a1;%mend a;%a(0.025);%a(0.03);%a(0.035);%a(0.04);%a(0.045);%a(0.05);%a(0.055);%a(0.06);%a(0.065);%a(0.07);proc print data=a;run;不含期权债券价格与收益率关系图:proc gplot data=a ;plot p*y=1;symbol1 v=none i=join r=1 c=black;title2 '不含期权债券价格与收益率关系图';labelp=’价格’y=’必要收益率’;run;3.2.3 债券价格时间轨迹例3.12 作表程序:title2;data a;do n=40 to 0 by -2 ;p1=45*(1-(1/(1+0.06)**n))/0.06;p2=1000*(1/(1+0.06)**n);p=p1+p2;year=n/2;output;end;proc print data=a noobs;var year p1 p2 p;run;假定必要收益率不变的情况下, 贴水债券时间轨迹图程序:data a;set a;p0=1000;proc gplot data=a ;plot p*year=1 p0*year=2/overlay;symbol1 v=none i=join r=1 c=black; symbol2 v=none i=join r=1 c=black;title2 '假定必要收益率不变的情况下,贴水债券时间轨迹';labelp='价格'year='剩余到期年数';run;例3.13 生成图表程序:data a;do n=40 to 0 by -2 ;p1=45*(1-(1/(1+0.035)**n))/0.035;p2=1000*(1/(1+0.035)**n);p=p1+p2;year=n/2;output;end;proc print data=a noobs;var year p1 p2 p;run;data a;set a;p0=1000;proc gplot data=a ;plot p*year=1 p0*year=2/overlay;symbol1 v=none i=join r=1 c=black;symbol2 v=none i=join r=1 c=black;labelp='价格'year='剩余到期年数';title2 '假定必要收益率不变的情况下,升水债券时间轨迹'; run;例3.14data a;delete;%macro a(y);data a1;date1='17jul1997'd;date2='01sep1997'd;days1=datdif(date1, date2, '30/360');w=days1/180;%let x=w;p1=0;do n=1 to 12 ;p1=p1+5/((1+&y)**(n-1+&x));output;end;data a1;set a1 end=lasobs;if lasobs;p2=105/((1+&y)**(12-1+&x));p=p1+p2;y=200*&y;y1=100*&y;data a;set a a1;%mend a;%a(0.0325);proc print data=a;run;3.2.4 债券组合的到期收益率计算例3.15 收益率计算:%macro r(v1,v0,d);data;r=(&v1-&v0+&d)/&v0;put r=;%mend r(v1,v0,d);%r(112000000,100000000,5000000);run;例3.16 算术平均时序收益率程序:%macro r(r1,r2,r3,r4,n);data a;r=(&r1+&r2+&r3+&r4)/&n;put r=;%mend R(r1,r2,r3,r4,n);%r(0.12,0.25,-0.15,-0.02,4);run;几何平均时序收益率程序:%macro r(r1,r2,r3,r4,n);data a;r=((&r1+1)*(&r2+1)*(&r3+1)*(&r4+1))**(1/&n)-1;put r=;%mend R(r1,r2,r3,r4,n);%r(0.12,0.25,-0.15,-0.02,4);run;3.2.5 债券组合的美元权重收益率计算例3.17计算程序:data;do n=0.07 to 0.10 by 0.001;p=5000/(1+n)+5000/((1+n)**2)+115000/((1+n)**3);r=n;if abs(p-100000)<100 then put p= r=;end;run;。
SAS编程与数据处理2-18章复习题朱世武著.《SAS编程技术与金融数据处理》.清华大学出版社. 2003.7第2章SAS系统快速入门1.SAS系统的特点。
2.简述SAS的三类功能与相应的模块举例。
3.SAS技术水平的三个层次.4.缺省情况下SAS系统的五个功能窗口及各自的作用是什么?怎样定义激活这些窗口的快捷键?5.SAS程序的一般特点。
6.SAS日志窗口的信息构成。
7.会使用工具菜单的options选项。
8.在显示管理系统下,切换窗口和完成各种特定的功能等,有四种发布命令的方式:即,在命令框直接键入命令;使用下拉菜单;使用工具栏;按功能键。
试举例说明这些用法。
9.理解SAS逻辑库、临时库和永久库的概念。
会用菜单方式新建SAS永久库。
10.说明下面SAS命令的用途:keys, dlglib, libname, dir, var, options, submit, recall.11.怎样增加和删除SAS工具?12.会用菜单方式导入(Import)和导出SAS数据集(Export)。
13.会用菜单方式创建查询。
14.会用SAS的INSIGHT模块进行简单的数据分析。
15.简述SAS逻辑库的作用。
第3章数据步创建SAS数据集1.理解SAS语句的信息构成。
举例说明。
2.SAS名的种类及命名规则。
什么是SAS关键词?3.理解Data步的Proc步。
4.SAS变量的类型和属性。
举例说明SAS自动变量。
5.理解SAS程序。
SAS程序的书写规则。
给一个简单SAS 程序的例子,适当应用SAS的注释语句。
6.SAS数据集中变量列表时,X1-Xn表示什么?特殊SAS变量列表_numeric_, _character_和_all_的含义。
7.怎样提交SAS程序?程序执行过程中,LOG窗口显示的信息结构。
8.怎样查看SAS程序的输出结果。
9.SAS表达式定义及其构成元素。
10.构成SAS表达式的操作对象和操作符有哪些?11.SAS常数及其类型。
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;。
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金融计算课程在学生和教师的互动过程中顺利展开,设计好实验环节是关键。
实验的内容应该和金融相关,实验数据应该是金融市场中的真实数据。
14.4.3 组合构建/*挑选1997年以前发行的A股股票,用到数据集:行情数据集compufin.quot和股本数据集compufin.shares*//*选择行情数据*/Data quot;length hexcd $6.;Set compufin.quot;Keep date clpr hexcd; /*选择保留变量, date为日期,clpr为收盘价*/if substr(hstocd,3,1)=6 or substr(hstocd,1,5)=21000;hexcd=substr(hstocd,3,6); /*将行情数据集中的股票代码转换为交易所最新代码*/ label hexcd='最新交易所代码';proc sort data=quot;by hexcd date;run;/*选择流通股本数据*/data shares;length hexcd $6.;set compufin.shares;keep date pubflt hexcd; /*选择变量,date为日期,pubflt为观测到的流通股本数*/ hexcd =substr(hstocd,3,6); /*转换股本观测数据集中的股票代码*/proc sort data=shares;by hexcd date;run;/*合并行情与股本数据*/data biao;merge quot shares;by hexcd date;run;/*对每个交易日都填上流通股本数据*/data a;set biao;if pubflt^=. then y=1;sumy+y; /*创建新变量sumy, 为变量y的累加变量,即对每支股票,每一次股本变动变量sumy都加上1, 后面要用到(实际上sumy还是起到了加标识的作用,它是站在整个数据集的角度上加的)*/data b;set a;keep sumy pubflt;if pubflt^=.; /*if保证了只保留数据集A中pubflt不等于.时的变量sumy和pubflt */run;data c;set a;drop pubflt; /*删除数据集A中的变量pubflt, 方便下面数据集c和b合并时,将股本填全,这是个很重要的技巧*/data biao2 (drop=y sumy);merge c b;by sumy;run;/*上面这里,在数据并不一一对应的情况下(同时c中没有pubflt这一变量),在新生成的biao2中,pubflt的值是对应于b中sumy相同的那个pubflt值。
这一过程实际上是为了用个别的pubflt填全整个数据集,这一实现方法需要注意。
同样的目的也可以通过retain等语句加以实现*//*生成最终表zongbiao*/data zongbiao;set biao2;where year(date)=1996; /*日期可以灵活控制,但最好用where语句*/proc sort data=zongbiao;by hexcd date;run;/*计算1996年每支股票的平均流通市值*/data mv(keep=clpr pubflt date hexcd mv);set zongbiao;mv=clpr*pubflt;proc means data=mv noprint;var mv;by hexcd;output out=mv mean=m_mv;run;/*由此得到的数据集mv, 其中有我们随机抽股票和按1996年平均流通市值抽股票需要的变量:股票代码hexcd和1996年各股票平均流通市值m_mv *//*选取股票方法一:随机抽取20支股票*/data mv;set mv;if substr(hexcd,1,1)^=0 and substr(hexcd,4,1)=6; /*只对复权价逻辑库stoindif中的股票抽取*/proc sql;create view _tmp_ asselect *, ranuni(1055) as _ran_ from mvorder by calculated _ran_;quit;data stocks;set _tmp_(obs = 20);drop _ran_;a='%a(';c=");";file " d:\genstock.txt";put a $ hexcd $ c $;run;/*选取股票方法二:按1996年股票平均流通市值m_mv均匀选取20只股票*/proc sort data= mv out=a;by m_mv;data b;set a nobs=nobs;n=round(nobs/20);t=_n_ - int( _n_ / n)*n;a='%a(';c=");";file " d:\genstock1.txt";put a $ hexcd $ c $;run;/* 将随机抽取的20支股票合并到一个数据集中*/data price;set stoindif.a1a0001;keep date;where 1997<=year(date)<=2000;%macro a(x);data a;set stoindif.a&x;where 1997<=year(date)<=2000;keep date clpr_r;data price;merge price a(rename=(clpr_r=p&x));by date;%mend a;%include "d:\genstock.txt";run;/*对抽取的20支股票随机赋权重:选择2000年最后一个交易日作为购买股票组合的日期,实际上是2000年12月29日*/data tprice;set price end=lastob; /*end为选项,lastob为自动变量*/if lastob=1; /*选择数据集price中的最后一个观测值,即2000年12月29日的数据*/drop date;run;proc iml;rv=uniform(repeat(0,20,1)); /*产生1列[0, 1]均匀分布的随机数20个*/sum=rv[+,]; /*向量rv列求和*/b=rv/sum; /*计算权重向量b */b=b#1000000; /*假设投资总额为100万元时,计算组合购买每去股票的金额*/use tprice;read all into tprice;b=b/t(tprice); /* t(tprice)为矩阵tprice转置,向量b为以2000年12月29日股票的收盘价为标准组合购买每支股票的股数*/create weight from b; /*由向量b创建的SAS数据集weight为购买每支股票的股数*/append from b;close weight;quit;/*计算1997~2000年3年间投资组合每一交易日的价值和对数收益率*/data dateinfo;set price;keep date; /*取数据集price中的日期变量作为下面计算出投资组合价值后的合并变量*/data return; /*去掉日期变量date,以便下面的矩阵运算*/set price;drop date;proc iml;use return;read all into clpr; /*创建组合中股票的价格矩阵clpr */close return;t=nrow(clpr); /*矩阵clpr的列数,实际上是交易日数*/do _i_=1 to t;do _j_=1 to 20;if clpr[_i_,_j_]=. then clpr[_i_,_j_]= clpr[_i_-1,_j_]; /*如果某支股票某一交易日没有交易的话,用前一个交易日的价格来替代该交易日价格*/end;end;use weight; /*创建组合中购买每支股票股数矩阵*/read all into weight;close weight;p_value = clpr * weight; /*计算组合的价值*/create p_value from p_value; /*创建组合价值SAS数据集p_value */append from p_value;close p_value;quit;data p_value (rename=(col1=p_value));merge dateinfo p_value; /* 为计算得出的组合价值添加交易日变量*/data compufin.return; /*计算各交易日组合的对数收益率*/set p_value;return=log(p_value)-log(lag(p_value));if return=. then delete;drop p_value;run;14.4.4 历史模拟法实现程序/* 创建宏变量nobs,其值为2000年的交易日数,即数据集a中的观测数*/data a;set compufin.return;where year(date)=2000;obs=_n_;keep date obs;run;data a;set a nobs=nobs;call symput('nobs', nobs); /* 创建宏变量nobs,其值为数据集a中的观测数*/%put &nobs; /* 显示宏变量nobs的值,这里为239 */run;data return;merge compufin.return a;by date;if obs=. Then obs=0;run;options nodate nonotes nosource; /* 系统选项:不在log窗口输出日期、注释和原程序*/ %macro calvar(days, prob, aa);%do i=1 %to &nobs; /* 计算2000年每个交易日的VaR值, 这里的宏变量nobs的值是前面得到的239 */data a;set return;if obs<&I; /* 计算某日的VaR时,选择该日(即2000年的第i日)前的历史数据*/ proc sort data=a out=b;by descending date;data b;set b;if _n_<=&days;/* 选择该日期(即2000年的第i日)前历史数据的数据,如480个或720个数据用于估计该日期的VaR */proc sort data=b;by return; /* 对选择的历史数据按收益率排序*/data c(keep=return rename=(return=var));set b;n=int(&days*&prob);if _n_ = n;/* 选择prob分位数,即为相应的VaR ,实际的VaR为相应的收变益率乘以100万元,这里为了简单起见,没有乘100万,但不影响结果*/data d;set return;where obs=&I; /* 选择所计算VaR值日期(即2000年的第i日)的实际收益率数据*/ data e;merge d c; /* 将用历史数据计算的风险值和该日的实际值合并到一个数据集中,以便后面的事后检验*/data e;set e;if return<var then flag=1; /* 如果实际值小于该日的VaR值时,设变量flag的值为1,否则为0 */else flag=0;proc append base=compufin.his&days&aa data=e;/* 将计算出2000年每个交易日的VaR值和实际值合并到同一个数据集his2000中。