GBM的基本模拟似乎不起作用。我究竟做错了什么?以下代码始终输出小于1e-20的值,而不是随机分布在1.0左右的值:
import math
import random
p = 1
dt = 1
mu = 0
sigma = 1
for k in range(100):
p *= math.exp((mu - sigma * sigma / 2) * dt +
sigma * random.normalvariate(0, dt * dt))
print(p)
我正在跑步:
ActivePython 3.1.2.3(ActiveState Software Inc.)基于 Python 3.1.2(r312:79147,2010年3月22日,12:30:45)[MSC v.1500 64 bit(AMD64)] on 的win32
我的操作系统是i7-930 CPU(64位)上的Windows 7专业版。
我很乐意在我的机器上运行任何其他测试来解决问题。
答案 0 :(得分:3)
我找到了答案。代码没有问题。只是结果对数正态分布具有巨大的尺度参数= 1 * sqrt(100)= 10.当尺度为10时,偏斜是疯狂的。
因此,即使分布的均值为1.0,我也需要数十亿次迭代(如果不是 数十亿 )才能看到一个大于1.0。
答案 1 :(得分:0)
似乎很好:
import math
import random
def compute():
p = 1
dt = 1
mu = 0
sigma = 1
for k in range(100):
p *= math.exp((mu - sigma * sigma / 2) * dt +
sigma * random.normalvariate(0, dt * dt))
return p
print [compute() for x in range(20)]
给出:
[118.85952235362008, 7.3312246638859059e-14, 29.509674994408684, 1.8720575806397408, 1.5882398997219834e-05, 2967.524471541024, 0.0031130343677571093, 19942.669293314699, 0.00011878818261757498, 5382.80288111769, 0.22867624175360118, 0.028535167622775418, 12.6324011631628, 20.604456159054738, 0.0034504567371058613, 6.5804828930878056e-06, 6398.0493448486704, 0.0014978345496292245, 721546.38343724841, 1285.546939393781]
这是使用python 2.6.1
答案 2 :(得分:0)
在Python 2.6.6中运行代码可以获得合理的答案,而在Python 3.1.2中运行它会给出您描述的小数字。我认为这是因为在Python 2.x中,除法运算符在划分两个整数时给出整数结果,而在Python 3.x中它在相同的情况下给出浮点结果。因此,计算中的除以2会根据版本给出不同的结果。
要使其一致,请将除法的输出强制为整数:
p *= math.exp(int(mu - sigma * sigma / 2)) * dt +
sigma * random.normalvariate(0, dt * dt))
这使得输出在2.x和3.x中都相同。我机器上的一组输出样本是:
0.0243898032782,6126.78299771,0.00450839758621,1.17316856812,0.00479489258202,4.88995369021e-06,0.033957530608,29.9492464423,3.16953460691
这似乎是你正在寻找的球场。
答案 3 :(得分:0)
在Python 3.1中使用float division(//)而不是整数除法(/):
import math
import random
p = 1
dt = 1
mu = 0
sigma = 1
for k in range(100):
p *= math.exp((mu - sigma * sigma // 2) * dt +
sigma * random.normalvariate(0, dt * dt))
print(p)
在一个示例运行中,我得到以下数字:
0.0989269233704
2536660.91466
2146.09989782
0.502233504924
0.43052439984
14.1156450335