sas金融计算清华朱世武数据集char14

合集下载

SAS中计算总和或者计算总数的方法

SAS中计算总和或者计算总数的方法

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金融计算清华朱世武数据集

SAS金融计算清华朱世武数据集

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表。

sas金融计算清华朱世武数据集char15

sas金融计算清华朱世武数据集char15

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.SAS介绍

1.SAS介绍

政府调查和监管部门。特别是在加拿大的金融中心-多伦多,
每年更是需要大量熟练掌握和运用SAS的科技人员。
SAS软件介绍
• SAS 是一个庞大的系统,它多个功能模块组成,每个模块分 别完成不同的功能。由于SAS最初是为专业统计人员设计的 (这一点和SPSS已恰恰相反),因此使用上以编程为主,初学 者掌握较为困难。
IF conditions THEN DELETE; RUN;
data语句有两个重要的功能,标志数据步的开始和命名将要创 建的SAS数据集。
除data语句外,数据步一般情况下还包括infile语句、input语 句以及datalines语句等。在不同的数据输入方式下对于它们的使用 方式也不一样。
SAS程序概述
• SAS程序有两种常见的数据输入方式,即从外部文件读入和直接输入两 种方式。 (1)外部文件读入方式 数据若已经包含在某个外部文件(文本文件或数据文件)中,可用 此方法输入数据到数据集文件中。 在以上介绍的data语句后,写入以下语句: infile ‘外部文件的所在位置及名称’ 选项; input 变量名1 变量名2 … 变量名n; infile语句用于从外部文件读入数据,必须出现在input语句之前。它的 功能是指定一个包含原始数据的外部文件。 input语句用于向系统表明如何读入每一条数据记录。它的主要功能有: 读入由语句指定的数据列,为相应的数据域定义变量名,确定变量的读 入模式。
中。SAS中的库分为永久性和临时性两种。顾名思义,存在于 永久库中的数据集是永久存在的(只要你不去删除它),临时 库中的数据集则在你退出SAS后自动被删除。至于SAS中库的 概念,最简单的理解就是一个目录,一个存放数据集的目录。
SAS系统基本操作及基本概念

清华大学研究生金融专业课程设置

清华大学研究生金融专业课程设置

[考研外校] 清华大学金融专业课程设置(研究生)教师:裴宇红课程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:商业银行管理简介:商业银行是重要的金融中介机构,商业银行从事业务获取收益的过程就是接受风险和管理风险的过程,所以商业银行管理的核心问题是风险以及进行风险管理的方法和工具。

SAS数据展现(tabulate)

SAS数据展现(tabulate)
OUTPUT窗口结果
Obs Name Sex Age Height Weight
1 Alice F 13 56.5 84.0
2 Barbara F 13 65.3 98.0
3 Carol F 14 62.8 102.5
4 Jane F 12 59.8 84.5
5 Janet F 15 62.5 112.5
6 Joyce F 11 51.3 50.5
7 Judy F 14 64.3 90.0
8 Louise F 12 56.3 77.0
9 Mary F 15 66.5 112.0
10 Alfred M 14 69.0 112.5
……
……
NOOBS选项: proc print data=ResDat.class noobs; run;
应用举例
例17.11创建二维报表。 proc format; value regfmt 1='Northeast'
2='South' 3='Midwest' 4='West'; value divfmt 1='New England' 2='Middle Atlantic' 3='Mountain' 4='Pacific'; value usetype 1='Residential Customers' 2='Business Customers'; run; options nodate pageno=1 linesize=80 pagesize=60; proc tabulate data=ResDat.energy format=dollar12.; class region division type; var expenditures; table region*division, type*expenditures / rts=25; format region regfmt. division divfmt. type usetype.; title 'Energy Expenditures for Each Region'; title2 '(millions of dollars)'; run;

金融计算与建模(上)(清华大学,朱世武)

金融计算与建模(上)(清华大学,朱世武)

固定收益类样本数据
表名 Bankir 中文全称 银行存款利率 内容简介 本表提供3个月到8年整存整取银行存款利率数据。可作为 基准利率使用。数据自1988年9月1日至当前日。其中, d8y-八年及以上整存整取利率数据到1996年5月1日截止。 本表提供回购利率日平均价、同业拆借市场利率日平均价 利率数据、银行间市场基准利率参考指标。本表数据可用 于浮动利率债券的票面利率、无风险利率等。 本表提供用于研究的日无风险收益数据。数据选择标准: 1998年7月1日前用一年期银行存款利率加10%为基准利率, 1998年7月1日后使用七日回购利率两周指数加权平均为基 准利率B2W。本表已将年度化的基准利率转化为以日为单 位计量的收益数据,研究时可直接引用。 本表提供用于研究的月无风险收益数据。数据选择标准: 1998年7月1日前用一年期银行存款利率加10%为基准利率, 1998年7月1日后使用七日回购利率两周指数加权平均为基 准利率B2W。本表数据已作过月度化处理,即将年度化的 基准利率转化为月度数据,研究时可直接引用。

汇率
Commtax
Iissulst
佣金与印花税
首次发行与上 市
本表按时间排序,记录每日的佣金率和印花税信息,可用于 计算交易费用。
记录每只股票在发行和上市时的情况,发行信息包括发行日、 发行市盈率,发行面值,发行股份数量,募集金额,发行费 用和配售等;上市信息包括股票首次上市日及职工股上市日 等。对于B股,发行价格,募集资金总额和发行费用等均分别 用外币和换算后的人民币表示,可适用于不同的研究需要。
本书不仅展现了应用SAS软件的技术,同时 也会使读者对相关的金融专题有一个彻底的 了解,会使读者的知识水平在金融理论、实 务和统计模型的基础上,更深入到如何实现 和应用。

SAS编程技术教程 (13)

SAS编程技术教程 (13)
例中,第一个RUN语句在读第二个TITLE语之前执行PROC MEANS 步。如果省略第一个RUN语,SAS系统在它读PROC PLOT语句之后 执行PROC MEANS步。这时第二个TITLE语覆盖第一个TITLE语,也 就是两个过程的输出都包含了标题'USING PROC PLOT'。所以,这 种情况下,第一个RUN语不能省略。
例11.12 规定脚注。 footnote ‘清华大学金融系’;
例11.13 取消所有已规定的脚注行。 footnote;
例11.14 取消第3个及以后的所有脚注行。 footnote3;
RUN语句
RUN语句使SAS程序被执行。
语句格式: RUN <CANCEL>; 其中: CANCEL让SAS系统结束当前步的执行。SAS将输 出一个信息说明这一步没有执行。但CANECL选 项不能阻止包含CARDS或CARDS4语句的DATA步 执行。
例11.19 不同引擎的逻辑库数据集的转换。 libname ResDatv6 v6 'D:\ResDat'; data ResDatv6.class; set ResDat.class; run;
例11.20 对已经存在的逻辑库使用LIBNAME语句联系一个SAS引擎。 libname SASDB3 ODBC;
/*---- See SAS/ETS User's Guide, Version 5 Edition, -----*/
/*---- pages
------*/
/*-----------------------------------------------------------*/
X语句
运行SAS系统时,发布主机操作系统命令。

清华大学经济管理学院硕士生导师简介-朱世武

清华大学经济管理学院硕士生导师简介-朱世武

清华大学经济管理学院硕士生导师简介-朱世武朱世武金融系副教授办公室伟伦楼321凯程教育是五道口金融学院和清华经管考研黄埔军校,在2014年,凯程学员考入五道口金融学院28人,清华经管11人,五道口状元武xy出自凯程, 在2013年,凯程学员考入五道口金融学院29人,清华经管5人,状元李少h出在凯程, 在凯程网站有很多凯程学员成功经验视频,大家随时可以去查看. 2016年五道口金融学院和清华经管考研保录班开始报名!个人简介研究成果研究项目朱世武,自2001至今,担任清华大学经济管理学院副教授。

1983年,他毕业于河南师范大学数学专业,并获得理学学士学位。

1987年,在武汉大学获得统计学专业的理学硕士学位。

1999年,赴上海财经大学学习,并获得该校数量经济学专业的博士学位。

1999年至2001年在清华大学经济管理学院作博士后研究。

他教授的主要课程包括:金融数据库、金融统计学、实证金融学、数据模型与决策、统计分析软件。

朱世武教授研究的主要领域是:固定收益、风险管理、金融计算与建模、金融数据库。

在从事的所有科研项目里,朱世武教授主要担任项目负责人。

他重点研究的项目包括:“随机边缘模型的统计分析”,“国家债务管理和利率研究”,“金融工程的理论,技术和方法”,“违约相关性度量与信用衍生工具定价研究”—国家自然科学基金委员会;“中国股票市场的证券模型”,“中国股票市场结构性指数设计”—中国证监会;“中信实业银行的私人金融模型”—中信实业银行;“基于微网格的网格计算研究,基础研究”,“度量违约相关性的研究”,“中国资本市场股权风险溢价的实证研究”—清华大学;“中国资本市场的股权风险溢价研究”—中国国家社会科学基金;“中国金融研究数据库”—清华211项目;“中国银行间债券市场期限结构最优化模型”—中国外汇交易中心和全国银行间同业拆借中心;“浙江财经学院金融实验室金融数据项目”—浙江财经学院;“浙江万里学院金融实验室金融数据项”—浙江万里学院;“人民币市场化利率中长期预测模型”—中国人寿资产管理有限公司;“农村金融市场风险管理研究”—香港汇丰银行;“青藏高原矿产资源开发利用战略研究”—中国地质大学(北京)地质调查研究院。

06-股权风险溢价计算[金融计算与建模]

06-股权风险溢价计算[金融计算与建模]

市场风险溢价计算思路
研究方法选择
历史数据法是当前研究中国股权风险溢价的最佳方法。
计算中国市场股权风险溢价思路图
年度无风险资产收益 名义收益下的溢价
年度股票投资收益
年度无风险资产收益 实际收益下的溢价 年度股票投资收益
年度通货膨胀率
周期的确定
1995年2月~2002年12月是一个比较好的周期选择。
--------------------------------------------------------------------rp3 不考虑交易成本的实际收益溢价 0.0692755 rp4 考虑交易成本的实际收益溢价 0.0571228 ---------------------------------------------------------------------
计算市场投资收益
市场投资收益数据采用Resset/DB数据库中的市场年持有期收益数据。数 据集名为Yrretm 。 不考虑交易成本的市场投资收益使用表Yrretm中的“流通市值加权平均 市场年收益率”Yrettmv。 考虑交易成本的市场投资收益使用表Yrretm中的“流通市值加权平均市 场年收益率_考虑交易成本”Yret_tcctmv。 data yrretm; set resdat.yrretm; where Exchflg='0' and Mktflg='A' and 1995<=year(date)<=2005; year=year(date); keep year yrettmv yret_tcctmv; run;
实际收益下的溢价
股票实际收益=(1+股票名义收益率)/(1+通货膨胀率)-1; 无风险资产实际收益率=(1+无风险资产名义收益率) /(1+通货膨胀率)-1;

sas金融计算清华朱世武数据集char03

sas金融计算清华朱世武数据集char03

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;。

金融数据库——13变量输入输出格式控制

金融数据库——13变量输入输出格式控制
例13.2 字符转换数值。 data; x='98.6'; y=input(x, 4.); put x= y=; run; 例中,INPUT函数和w.d输入格式将X的字符值转换为一个数值Y. INPUT函数对于数据的转换是很有用的,当然,有更简单的方法将字符 值转换为数值。 data; x='98.6'; y=x-0; put x= y=; run;
w.d输入格式
读入标准数值数据。
例13.6 INPUT语句对变量使用列指针控制和w.d的输入格式。 INPUT X 8.2; INPUT X 1-10 .2; W.D输入格式把一个点(.)作为缺失值。 用W.D输入格式时,数值域尾部的空白不表示0,用BZ.输入 格式可以把尾部空白读为0.
BZw.d输入格式
DATA步中用FORMAT或ATTRIB语句
例13.17 DATA步中用FORMAT或ATTRIB语句。 format sales1-sales12 comma10.2; 例中,FORMAT语句对变量sales1至sales12规定输出格式 COMMAw.d. attrib sales1-sales12 format=comma10.2;例中,ATTRIB语句对 变量sales1至sales12规定输出格式COMMAw.d.
$ INFORMAT W D 规定为字符输出格式 规定有效SAS输出格式 规定输出数据的列数 规定数值输出格式中保留小数的位数
通用规则:
所有输出格式必须包含一个点(.)作为名字的一部分; 省略W和D的值时,使用系统的缺省值; 无论怎样规定输出格式中的小数位,输出格式都不会影响存贮 的数据值; 规定的输出格式宽度太窄小时,对字符格式截去右边的字符, 对数值格式转换为BESTw.的格式; 使用一个不协调的输出格式时,SAS系统首先试着使用其它类 型的类似格式。如果行不通,将输出一个错误信息在SAS日志。

金融数据库——SAS编程与数据处理2-18章复习题

金融数据库——SAS编程与数据处理2-18章复习题

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常数及其类型。

sas金融计算清华朱世武数据集char12

sas金融计算清华朱世武数据集char12

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;。

04收益波动率计算

04收益波动率计算

波动率计算
计算环境
计算数据集:ResDat目录下的全部股票数据集,共30 只。 需要宏文本文件:Stk.TXT。 时间区间: 2005年。 计算日波动率;计算周、月或年波动率,可以用相应的 收益率计算或直接由日波动率乘以一个相关因子。 对涨跌停板不作处理。
单个股票波动率计算
分别选择股票深发展(Stk000001)进行计算。时间区间为2005年。 日对数收益率计算:
j 1
T
简单移动平均(Simple Moving Average, SMA)模
型是动态模型中最为简单的一种。它是以过去M天收益 的样本方差来估计当前的波动率,即:
t 2 [1 /( M 1)] (rt i
i 1
M
r
j 1
M
t j
M
)2
这样每天通过增加前一天的信息和去掉第前M+1天 的信息来更新预测。
proc sort data=log_ret; by Date; data sma(keep=Date); set log_ret; %macro a(x); data a; set log_ret; sum+rr&x; data b(keep=Date sma&x); merge a a (firstobs=21 rename=(sum=sum_1)); sma&x=(sum_1-sum)/(20-1); /* 这里计算的是20天移动平均 */ sma&x=sqrt(sma&x); proc sort data=b; by Date;
三种模型结果比较
画出2005年,股票Stk000001(深发展)的对数收益 图,图4.2。
%macro a(x); proc gplot data=log_ret; plot r&x*Date=1 ; symbol1 v=none i=join r=1 c=black line=1; %mend a; %a(Stk000001); run;

SAS金融计算第一讲

SAS金融计算第一讲
• 对这种计算系统的探索包括:
① network computing, ② cluster computing, ③ Web computing, ④ Internet computing, ⑤ Grid computing(computing grid, data grid, memory grid); ⑥ Pervasive computing(普适计算), ⑦ Mobile computing, ⑧ Volunteer computing(志愿计算)。
互连网应用主要趋势(2)
目前技术及应用发展:
① 以HTTP协议为集成基础,以HTML,XML等语言建立应用 界面,实现不同应用方便使用;
② 以JAVA编程技术作为计算系统开发语言共同,建立高性能 计算平台,实现服务扩展成为热点。
③ 计算作为一种资源进行开发。人们对计算资源的使用采取 “随用随买”的使用模式。Sun Microsystems公司在其2004 年第四季度网络计算新品发布会上宣布,TELUS 公司成为 了拓展其安全的对网格计算能力"随用随买"服务模式的第一 家战略合作伙伴。为了进一步发挥 Sun公司2004 年 9 月推出 的标准化的网格服务批量销售模式的优势,TELUS公司将 转销 Sun的基于Web的Grid Computing(网格计算)服务,起价 为1美元/CPU/小时。该项服务开始阶段的市场目标是金融服 务和石油天然气行业。
• 截至2004年,CERNET主干网带宽达到2.5G-5Gbps,地区 网传输速率达到155M-2.5Gbps,对外互联带宽总数超过 10G,国际出口超过1G.联网单位超过1600个,联网用户超 过1800万。成为中国三大互联网之一(其他为中国电信、 中国网通)。
互连网应用主要趋势

SAS金融计算教学中自定义函数的实验设计

SAS金融计算教学中自定义函数的实验设计

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金融计算清华朱世武数据集char04

sas金融计算清华朱世武数据集char04

4.1.2 通用计算程序数据集准备:(程序时点设为2000年12月31日)data a;set compufin.header_genius (keep=f0001 f0002 f0003 f0004);proc sort data=a;by f0001 ;run;data b (keep=f0001 gb002 gb004 gb008 gb009 gb016 gb017 gb018 );set compufin.shares_genius;proc sort data=b;by f0001 gb002;data c;merge a b;by F0001;if f0002=. then delete;if f0003=’A’ ; /*只算A股*/run;data c;set c;date=datepart(gb002);if date>'31dec2000'd then delete ; /*2000年12月31日,其它时点可修改此处*/ run;data c;set c;by f0001;if last.f0001;run;data c;set c;a_state= gb008+gb009;a_all= gb004-gb017-gb018; /*全部a股股本,求全市场股票比率修改此处*/run;data c_1 (keep=suma_state suma_all suma_pub ratio_state ratio_pub);set c end=aaa;suma_all+a_all;suma_state+a_state;suma_pub+gb016;ratio_state=100*suma_state/suma_all;ratio_pub=100* Suma_pub/suma_all;If aaa=1;put suma_state/Suma_pub/suma_all/Ratio_state /ratio_pub=;Run;A股计算结果:2000年12月31日:Suma_State=215044425739Suma_Pub=103400844064Suma_All=346763200649Ratio_State=62.01477704Ratio_Pub=29.81886309520001年8月31日:Suma_State=287393936240Suma_Pub=121828508426Suma_All=438426705492Ratio_State=65.551193082Ratio_Pub=27.787656842Suma_State=287393936240Suma_All=438426705492Ratio=65.5511930824.1.3 指数300成份股股本比例计算创建数据集STALL_GENIUS:data a;set compufin.header_genius (keep=f0001 f0002 f0003 f0004);proc sort data=a;by f0001 ;run;data b (keep=f0001 gb002 gb004 gb008 gb009 gb016 gb017 gb018 );set compufin.shares_genius;proc sort data=b;by f0001 gb002;data stall_genius;merge a b;by f0001;if f0002=. then delete;if f0003='A' ; /*只算A股*/run;data compufin.stall_genius;set stall_genius;date=datepart(gb002);if date>='18jan2001'd then delete ; /*2001年1月18日前全部A股*/run;data compufin.stall_genius;set compufin.stall_genius;by f0001;if last.f0001;run;求数据集C_1,股本数据集,包括2001年1月18日前全部A股股票并标识INX300_GENIUS中的股票。

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

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中。

相关文档
最新文档