[toc]
如果未做特别说明,文中的程序都是 Python3 代码。
QuantLib 金融计算——数学工具之随机数发生器
载入模块
import QuantLib as ql
import scipy
print(ql.__version__)
1.12
概述
随机模拟通常从产生均匀分布的随机数开始。假设 $X \sim U [0, 1]$ 是均匀分布的随机变量。任意分布的随机数通常需要对 $X$ 施加某种变换得到,一般情况下是用累积分布函数的逆函数 $F^{−1}$,$F^{−1}(X)$ 的分布就是 $F$。其他的变换算法可能不需要 $F^{−1}$,比如用于生成正态分布的 Box Muller 变换算法。
均匀分布的随机数发生器主要分两种:
伪随机数(wiki)
拟随机数,也称低偏差序列(wiki)
伪随机数
quantlib-python 提供了以下三种均匀分布的(伪)随机数发生器:
KnuthUniformRng,高德纳(Knuth)算法
LecuyerUniformRng,L'Ecuyer 算法
MersenneTwisterUniformRng,著名的梅森旋转(Mersenne-Twister)算法
随机数发生器的构造函数,
Rng(seed)
其中
seed,整数,默认值是 0,作为种子用于初始化相应的确定性序列;
随机数发生器的成员函数:
next():返回一个 SampleNumber 对象,作为模拟的结果。
r = rng.next()
v = r.value(r)
用户通过反复调用成员函数 next() 获得一连串的随机数,需要注意的是 r 的类型是 SampleNumber,需要调用 value() 得到对应的浮点数。
例子 1,
def testingRandomNumbers1():
seed = 1
unifMt = ql.MersenneTwisterUniformRng(seed)
unifLec = ql.LecuyerUniformRng(seed)
unifKnuth = ql.KnuthUniformRng(seed)
print('{0:<25}{1:<25}{2:<25}'.format(
'Mersenne Twister', 'Lecuyer', 'Knut'))
for i in range(10):
print(