0

为了对非中心卡方分布进行抽样以对欧式看涨期权定价,使用 mp.sum 似乎是最佳选择;但是,我放在一起的程序给出了 TypeError: 'mpf' ​​对象在运行时不能被解释为整数。

我将代码发送给了一个朋友,他能够运行完全相同的代码并获得没有错误的输出。我不确定是什么原因造成的。问题应该来自我的 ncx2_samp1 和 ncx2_samp2 中的 mp.gammainc 和 mp.gamma 函数。

import math
import mpmath as mp

S_0 = 100
X = 105
sigma = 0.25
t = 1
T = 2
tau = T - t
r = 0.1
q = 0
beta = 1
S_t = S_0 * math.exp(r * t)
delta2 = sigma ** 2 * S_0 ** (2 - beta)

k = 2 * (r - q) / (delta2 * (2 - beta) * (math.exp((r - q) * (2 - beta) * tau) - 1))
x = k * S_t ** (2 - beta) * math.exp((r - q) * (2 - beta) * tau)
y = k * X ** (2 - beta)

v = 10

omega_samp1 = 2 * x
omega_samp2 = 2 * y
lambda_samp1 = 2 * y
lambda_samp2 = 2 * x


mp.dps = 25
mp.pretty = True
ncx2_samp1 = mp.nsum(lambda i: (lambda_samp1 / 2) ** i * math.exp(-lambda_samp1 / 2) / math.factorial(i) * (1 - (mp.gammainc(v / 2 + i, omega_samp1 / 2))) / (mp.gamma(v / 2 + i)), [0, math.inf])
ncx2_samp2 = mp.nsum(lambda i: (lambda_samp2 / 2) ** i * math.exp(-lambda_samp2 / 2) / math.factorial(i) * (1 - (mp.gammainc(v / 2 + i, omega_samp2 / 2))) / (mp.gamma(v / 2 + i)), [0, math.inf])

c_t = max(S_t * math.exp(-q * tau) * ncx2_samp1 - X * math.exp(-r * tau) * ncx2_samp2, 0)

print(c_t)

关于可能导致问题的任何想法?它应该保存为 mpf 并被解释为字符串;问题是由于内存引起的吗?

谢谢

4

1 回答 1

0

将解释器换成 Python 3.7 而不是 3.8 解决了这个问题。假设它与 Python 3.8 中 mpf 文件的存储有关

于 2019-11-18T11:02:55.323 回答