我不断收到错误Traceback (most recent call last): File "/Users/jimmy/Documents/2.py", line 20, in <module>
eu = mc_simulation(89,102,0.5,0.03,0.3,1000) File "/Users/jimmy/Documents/2.py", line 12, in mc_simulation
ST = s0 * exp((r - 0.5 * sigma ** 2) * T + sigma * a * z) TypeError: only length-1 arrays can be converted to Python scalars
。大多数人认为有时numpy与其他现有的数学函数不兼容。但我把每个数学函数都改成了np函数。
错误说明:
from numpy import *
import numpy as np
from math import exp
def mc_simulation(s0, K, T, r, sigma, no_t):
random.seed(1000)
z = random.standard_normal(no_t)
ST = s0 * exp((r - 0.5 * sigma ** 2) * T + sigma * np.sqrt(T) * z)
payoff = maximum(ST - K, 0)
eu_call = exp(-r * T) * sum(payoff) / no_t
return eu_call
eu = mc_simulation(89,102,0.5,0.03,0.3,1000)
我的代码:
<iframe id="welcome" width="100%" height="100%" src="SomeUrl" frameborder="0" allowfullscreen class="player"></iframe>
答案 0 :(得分:3)
你在这里不需要math
。使用numpy.exp
。此外,考虑养成不使用带有导入的*运算符的习惯。
import numpy as np
np.random.seed(1000)
def mc_simulation(s0, K, T, r, sigma, no_t):
z = np.random.standard_normal(no_t)
ST = s0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * np.sqrt(T) * z)
payoff = np.maximum(ST - K, 0)
eu_call = np.exp(-r * T) * np.sum(payoff) / no_t
return eu_call
print(mc_simulation(89,102,0.5,0.03,0.3,1000))
3.4054951916465099
对你的评论&#34;为什么我不应该使用*运算符&#34;:有很多关于为何会造成麻烦的好讨论。但是官方documentation对此有何评价:当你使用from numpy import *
时:
这将导入除以下划线(_)开头的所有名称。 在大多数情况下,Python程序员不使用此工具 可能会在解释器中引入一组未知的名称 隐藏你已定义的一些东西。
你自己的例子说明了这一点。如果您要使用:
from numpy import *
from math import *
两者都有exp
函数,可以exp
导入名称空间。然后,Python可能无法知道您要使用哪个exp
,正如您在此处看到的那样,它们完全不同。如果您已经自己定义了exp
函数,或者与这两个软件包中的任何一个共享名称的任何其他函数,则同样适用。
一般情况下,请注意您使用from x import *
一致的任何教程。