继续得到"只有长度为1的数组才能转换为Python标量"

时间:2017-09-19 18:33:15

标签: python numpy finance montecarlo

我不断收到错误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>

1 个答案:

答案 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 *一致的任何教程。