SAS和蒙物卡罗模拟技术

更新时间:2024-02-13 21:53:48 阅读: 评论:0

2024年2月13日发(作者:天真)

SAS和蒙物卡罗模拟技术

SAS和蒙特卡罗模拟_随机数

(2020-11-10 16:24:47)

标签:

转载自:

一、什么缘应选择SAS做蒙特卡罗模拟

什么缘故要用SAS做蒙卡第一,对我来讲,我只会用SAS,而且打算用SAS完成我所有的工作。固然,其他一些通用的理由有(Fan, etc.,2002):

1. 蒙卡是个计算密集的活,而SAS Ba、SAS Macro、SAS/IML壮大而灵活的编程能力能知足这一要求;

2. 做蒙卡时要用到大量的统计/数学技术,而SAS就内置了大量的统计/数学函数(在

SAS/Stat和SAS/ETS);用Fortran或C++固然也是超级好的主意,只是他们缺少内置的统计函数,代码就要冗长复杂很多。

二、什么是蒙卡一个启发性例子

好,开始,什么是蒙卡了解它背景知识的最好方法固然是。蒙特卡罗是位于摩洛哥的一家赌场,二战时,美国Los Alamos国家实验室把它作为核裂变运算机模拟的代码名称。作为模拟方式,蒙卡以前就叫统计抽样(statistical sampling),咱们感爱好的结果因为输入变量的不确信而不可知,但如果是能依概率产生输入变量的样本,咱们就能够够估量到结果变

量的散布。跟蒙卡对应的,还有一种模拟技术叫系统模拟,包括排队、库存等模型,这些模型都跟从时刻推移而显现的事件序列有关。下面举个蒙卡的例子,来自Evans, etc.( 2001)的超级简化版。

假设一家企业,利润是其需求量的函数,需求是随机变量。为了简化讨论,假定利润确实是需求的两倍。那个地址输入变量确实是不可控的需求,结果变量确实是咱们感爱好的利润。假设需求以相同的概率取10、20、30、40、50、60这六种情形。在如此的简化下,咱们就能够够投一枚均匀的骰子来产生需求的样本,若是点数为1,对应得需求确实是10,点数为2,需求确实是20,以下类推。如此,咱们的模拟进程确实是:

1. 投骰子;

2. 依照骰子的点数确信需求量;

3. 依照需求量,求利润。

掷10次骰子,假设咱们的模拟结果如下:

重复次数

1

2

3

4

5

6

7

骰子点数

5

3

3

6

1

3

4

需求量

50

30

30

60

10

30

40

利润

100

60

60

120

20

60

40

8

9

10

5

2

5

50

20

50

100

20

50

如此通过模拟需求的样本,咱们对结果利润的散布也就有所知晓,比如平均利润能够算出确实是63。蒙卡一个重要的步骤确实是生成随机数,那个地址咱们是用投骰子来完成。

三、又一个例子:利用蒙特卡罗模拟方式求圆周率∏(pi)

再举个很出名的例子,确实是估量圆周率∏的值,来自Ross(2006)。那个实验的思路正好能够帮咱们温习一下几何概型的概念。咱们明白概率的古典概型,确实是把求概率的问题转化为计数:样本空间由n个样本点组成,事件A由k个样本点组成,那么事件A的概率确实是k/n。考虑到概率和面积在测度上具有某种共性,几何概型的大体方式是把事件跟几何区域相对应,用面积来计算概率,其要点是:

1. 以为样本空间Ω是平面上的某个区域,其面积记为υ(Ω);

2. 向区域Ω随机抛掷一点,该点落入Ω内任何部份区域内的可能性只与这部份区域的面积成比例,而与这部份区域的位置和形状无关;

3. 设事件A是Ω的某个区域,面积为υ(A),那么向区域Ω上随机抛掷一点,该点落在区域A的可能性称为事件A的概率,P(A)=υ(A)/υ(Ω)。

扯远了,回到用蒙卡估量圆周率∏的实验思路。假设样本空间是一个边长为2面积为4的正方形,咱们感爱好的

事件是正方形内的一个半径为1面积为∏的圆,因此向正方形内随机抛掷一点,落在圆里面的概率为∏/4。实验的思路如下:

1. 1)生成随机数——生成n个均匀落在正方形内的点;

2. 2)对落在正方形内的n个点,数一数正好落在圆里面的点的个数,假设为k(另外n-k个点就落在圆外面的正方形区域内)。

3. 3)k/n就能够够大致以为是圆的面积与正方形的面积之比,另其等于∏/4,就能够够求出圆周率∏的估量值。

又,提供了利用电子表格Excel求解以上问题的详细进程,有爱好能够看看。另外,也有一个详细的说明,用Mathematica实现。

四、随机数很重要(和下期预报)

在第一个例子中,我强调了骰子若是均匀的。那里骰子确实是咱们的随机数生成器,骰子的均匀程度确实是咱们随机数的“随机”成份。在上面的10次实验中,投出了3次点数“3”和3次点数“5”,然后点数“1”、“2”、“4”、“6”各显现一次——因为只是重复了10次,如此咱们对骰子的均匀程度不行评估,但如果是重复无数次——假设是十万次,若是还显现类似比例的结果,那么就有理由疑心这粒骰子的均匀程度了。若是骰子灌了铅,比如投出点数“6”的可能性从六分之一上升到6分之三,那么依照这粒骰子来做模拟,咱们就有高估需求和利润的危险。

下次就讲讲随机数的生成原理,固然结合SAS来讲,或也会提一下Excel。

五、其他软件包

在商业领域,基于Excel的插件比较兴盛,比如应用就较为普遍,有试用版能够下载。其他竞争产品有、等。此刻听说也开始兴盛起来,大有后发先至之势。他的开发者Johnathan

Mun还在Wiley Finance系列有一本书,。

S语言(R或S-Plus)由于其面对对象的特性,加上丰硕的内置函数和诸多用户提供的库,使得R或S-Plus也是蒙卡研究的得力工具——或比SAS更有前景。那个我不熟,略之。

Random Numbers

最简单、最大体、最重要的随机变量是在[0,1]上均匀散布的随机变量。一样地,咱们把[0,1]上均匀散布随机变量的抽样值称为随机数,其他散布随机变量的抽样都是借助于随机数来实现的。以下谈的都是所谓“伪随机数”(Pudo Random Numbers)。产生随机数,能够通过物理方式取得(好久好久以前,兰德公司就曾以随机脉冲源做信息源,利用电子旋转轮来产生随机数表),但现今最为普遍的乃是在运算机上利用数学方式产生随机数。这种随机数依照特定的迭代公式计算出来,初值确信后,序列就能够够预测出来,因此不能算是真正的随机数(就成为“伪随机数”)。只是,在应用中,只要产生的伪随机数列能通过一系列统计查验,就能够够把它们当做“真”随机数来用。

此刻大多软件包内置的随机数产生程序,都是利用同余法(Congruential Random

Numbers Generators)。“同余”是数论中的概念。

0.预备知识:同余

捡回小学一年级的东西:"4/2=2"读作“4除以2等于2”,或,“2除4等于2”。还有求模的符号mod(number,divisor),其中,number是被除数(在上式中,为4),divisor

是除数(上式中的2)。如此的约定对SAS和Excel都通用,如mod(4,13)=4,mod(13,4)=1。

此刻咱们能够开讲“同余”了。设m是正整数,用m去除整数a、b,取得的余数相同,那么称“a与b关于模m同余”。上面的概念能够读写成,对整数a、b和正整数m,假设mod(a,m)=mod(b,m),那么称“a与b关于模m有相同的余数(同余)”,记做a≡b(mod m)(这确实是同余式)。举个例子,mod(13,4)=1,mod(1,4)=1,那么读成13和1关于模4同余,记做13≡1(mod 4)。固然,同余具有对称性,上式还能够写成1=13(mod 4)。

a≡b(mod m)的一个充要条件是a=b+mt,t是整数,比如13=1+3*4。a=b+mt能够写成(a-b)/m=t,即m能整除(a-b)。

这些就够了。更多基础性的介绍,能够参考《》。

1.乘同余法

同余法是一大类方式的统称,包括加同余法、乘同余法等。因为这些方式中的迭代公式都能够写成上面咱们见过的同余式形式,故统称同余法。经常使用的确实是下面的乘同余法(Multiplicative Congruential Generator.)。符号不行敲,做些约定,如R(i)确实是R加一个下标i。

乘同余法随机数生成器的同余形式如下:R(i+1)=a*R(i) (mod m)。那个迭代式能够写成更直观的形式,R(i+1)=mod[a*R(i),m],其中初值R(0)称为随机数种子。因为mod(x,m)老是等于0到m-1的一个整数,因此最后把R(i+1)那个随机序列都除以m,就能够够取

得在[0,1]上均匀散布的随机数。下面用电子表格演示一遍,假设随机数种子R(0)=1,a=4,m=13:

1

2

3

4

A

i

0

1

2

B

R(i)

1

=D2

=D3

C

a*R(i)

D E

mod[a*R(i),m] mod[a*R(i),m]/m

=B2*4 =mod(C2,13) =D2/13

=B3*4 =mod(C3,13) =D3/13

=B4*4 =mod(C4,13) =D4/13

上面显示的是公式(Excel中,公式与计算结果的转换,用快捷键ctrl+~实现),结果看起来是如此的,E列确实是咱们想要的在[0,1]上均匀散布的随机数:

1

2

3

4

A

i

0

1

2

B

R(i)

1

4

3

C D E

a*R(i) mod[a*R(i),m] mod[a*R(i),m]/m

4

16

12

4

3

12

上表中,a*R(1)=16,R(2)=3,m=13,一个同余式确实是R(2)=a*R(1) (mod m),3=16(mod 13),或说,16-3能够被13整除——同余法确实是这意思了。说“乘同余法”,要点在于a*R(i)是乘法形式。在SAS系统中,a=397,204,094,m = 2^31-1=47(一个素数),随机种子R(0)能够取1到m-1之间的任何整数。

2.伪随机数的查验

此刻内置于各大软件包的随机数生成器都通过了完全的查验,咱们固然能够安心地利用那个黑箱。或那么咱们也能够多了解些。一个好的“伪”随机数列,应该看起来就跟从[0,1]上均匀散布的随机数列中随机抽掏出来的一样。两个比较直观的查验有:

1. 均匀性查验——所有的数是不是均匀地散布在[0,1]区间;

2. 独立性(或不相关)查验——序列中的数不存在序列相关,每一个数都跟其前后显现的数独立无关。一个例子是如、、、、,那个地址每一个接踵的数都正比如它前面的一个数大,如此那个数列就似乎有了某种“格局”。

具体的查验方式就略之了,更多请参见徐钟济(1985)。

3.生成其他概率散布的随机数

前面提到过,咱们把[0,1]上均匀散布随机变量的抽样值称为随机数,其他散布随机变量的抽样都是借助于随机数来实现的。对其他持续型散布,(积存)散布函数为F(x),r是在[0,1]上均匀散布的随机变量,另r=F(x),解出的x确实是该持续型散布的随机抽样。由于x能够写成r的反函数,该变换就称作“逆变换”(Inver Transformation method)。对离散型散布,思路类似,只是繁琐些,具体能够见徐钟济(1985)、Ross(2006)和Evans等(2001)。大多数相关软件包都会提供各类散布的随机数生成函数,明白有这回事就能够够。最重要的,是咱们陈述一类问题时,明白需要用哪一种概率散布来描述Evans等(2001):

经常使用的持续散布

1. 均匀散布(Uniform Distribution)描述在某最小值和最大值之间所有结果等可能的随机变量的特性。

2. 正态散布(Normal Distribution)是对称的,具有中位数等于均值的性质,确实是咱们熟悉的钟形形状。各类类型的误差常常是正态散布的。最后,作为中心极限定理的推论,大量具有任意散布的随机变量的平均数也呈正态散布。

3. 三角形散布(Triangular Distribution)由三个参数来概念,最大值、最小值和最可能值。临近最可能值的结果比那些位于端点的结果有更大的显现机遇。

4. 指数散布(Exponential Distribution)经常使用来构建在时刻上随机重现的事件的模型,如顾客抵达效劳系统的时刻距离、机械元件失效前的工作时刻等。它的要紧性质是“无经历性”(Memoryless) ,即当前时刻对以后结果没有阻碍。例如,不论机械原先已经运转了多长时刻,它继续运转直至显现故障的时刻距离总有一样的散布。

5. 对数正态散布(Lognormal Distribution):假设随机变量x的自然对数是正态的,那么x就服从对数正态散布。对数正态散布的常见例子是股票价钱。

经常使用的离散散布

1. 贝努利散布(Bernoulli Distribution)描述的是只有两个以常数概率显现的可能结果的随机变量的特性;

2. 二项散布(Binomial Distribution)给出每次实验成功概率为p的n次独立重复贝努利实验的模型;

3. 泊松散布(Poisson Distribution)用于成立某种气宇单位内发生次数的模型的一种离散散布,如某时段内某事件发生的次数。

其他有效的散布如伽玛散布(Gamma Distribution)、威布尔散布(Weibull Distribution)、贝塔散布(Beta Distribution)略之。

4.下期预报

上次落了些东西。说到蒙卡与C++,在数量金融领域,不能不提的一本书确实是Mark Joshi的C++ Design Patterns and Derivatives Pricing (Cambridge Uni. Press, 2004),面试中必然要说自己读过的,如这人家以为你至少会用C++做一个蒙特卡罗模拟。那个系列只讲SAS,下次先讲如何用SAS生成随机数,然后确实是具体的项目。

SAS随机数函数及CALL子程序

**************************************************************************************************************************

《》——简介,通过例子成立起蒙卡的直观概念;参考软件包及书目

《》——随机数入门;参考书目

**************************************************************************************************************************************************

一、SAS随机数函数和CALL子程序

SAS系统产生随机数,两种方式,利用SAS函数(Functions)或CALL子程序(CALL

Routines),它们的语法格式是(具体的区别容后讨论):

方式

函数

代码 说明

var=name(ed,) var为存储随机数列的变量,name为特定的分布函数形式,ed为随机数种子,为特定分布要求的参数(可选)

CALL子程序 call 同上,记得ed=0, ±1,±2, , ±

name(ed,,var) (2**31-2)

SAS可用的随机数函数列表如下(能够参见SAS Help and Documentation-SAS

Products-Ba SAS-SAS Language Dictionary-Functions and CALL

Routines-Functions and CALL Routines by Category):

分布 SAS函数 说明

n为独立实验的次数,p为成功概率

二项分布(Binomial) ranBin(ed,n,p)

指数分布(Exponential)

ranExp(ed)

正态分布(Normal) ranNor(ed),or

normal(ed)

ranNor和normal是同质的,但normal没有相对应的CALL子程序

泊松分布(Poisson) ranPoi(ed,m) m为均值

均匀分布(Uniform) ranUni(ed),or

uniform(ed)

ranUni和uniform是同质的,但uniform没有相对应的CALL子程序

柯西分布(Cauchy) ranCau(ed)

伽玛分布(Gamma) ranGam(ed,a)

a>0为形状参数

由分布律表格决定的ranTbl(ed,p1,p2,...pn) ∑p=1

离散分布(tabled

probability

distribution)

三角分布(Triangular)

ranTri(ed,h) h为斜边(最可能值)

上面的随机函数,除normal和uniform,都能够由直接相应的CALL子程序挪用。

二、SAS随机数函数和CALL子程序:比较

用SAS随机数函数同时创建的多个随机数变量其实都属于同一个随机数列。这话费解,一个例子先,创建两个随机数变量,各包括3个记录,其中x1的种子为123,x2的种子为456:

data ranuni(drop=i);

retain ed1 123 ed2 456;

do i=1 to 3;

x1=ranuni(ed1);

x2=ranuni(ed2);

output;

end;

run;

proc print data=ranuni;run;

结果为:

Obs ed1 ed2 x1 x2

1 123 456

2 123 456

3 123 456

仿佛没什么异样。咱们把上面的x1增加为6个记录:

data ranuni2(drop=i);

retain ed1 123;

do i=1 to 6;

x1=ranuni(ed1);

output;

end;

run;

proc print data=ranuni2;run;

结果如下,把上下用红色标出的数字对照看一看:

Obs ed1 x1

1 123

2 123

3 123

4 123

5 123

6 123

什么意思在第一段代码中,x2的种子全然不起作用,把x2的记录安插到x1里,看起来确实是用种子123产生的随机数列加长了罢了。x2的第一个值并非是由种子456产生的,而是产生第一个x1后的下一个值,x1、x2其实属于同一个随机数列,尽管x2的种子被指定为456,而x1的被指定为123。此刻就能够够重复上面的一句话:用SAS随机数函数同时创建的多个随机数变量其实都属于同一个随机数列。

用CALL子程序就能够够同时产生独立的随机数列。

data ranuni3(drop=i);

retain ed3 123 ed4 456;

do i=1 to 3;

call ranuni(ed3,x3);

call ranuni(ed4,x4);

output;

end;

run;

proc print data=ranuni3;run;

结果如下:

Obs ed3 ed4 x3 x4

1 28 6

2 6 4

3 4 0

以上x3确实是x1。x1和x3的初始种子都是123,但x3那个结果显示的种子是当前种子值。要在SAS随机数函数语句中显示随机种子的当前值,能够由以下代码给出:

data ranuni4(drop=i);

retain ed1 123;

do i=1 to 3;

x1=ranuni(ed1);

ed=x1*(2**31-1);

output;

end;

run;

proc print data=ranuni4;

var ed1 ed x1;

run;

结果如下,能够跟上面由CALL子程序得出的结果对照:

Obs ed1 ed x1

1 123 28

2 123 6

3 123 4

---------参考资料---------

1. Xitao Fan, etc..Monte Carlo Studies: A Guide for Quantitative

Rearchers. SAS Institute Inc.,2002

2. 朱世武《SAS编程技术与金融数据处置》,北京:清华大学出版社,2003

SAS和蒙物卡罗模拟技术

本文发布于:2024-02-13 21:53:48,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/1707832428266047.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:SAS和蒙物卡罗模拟技术.doc

本文 PDF 下载地址:SAS和蒙物卡罗模拟技术.pdf

上一篇:SAS语言介绍
下一篇:返回列表
标签:能够   散布   结果   蒙卡   函数   概率   模拟
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|