如何通过迭代使两个函数接近零的差异?

时间:2018-02-06 11:44:18

标签: python-3.x iteration montecarlo

我需要构建一个循环(模拟),它会迭代一定次数并在新公司价值接近猜测公司价值时显示一个值。具体而言,我们的想法是从公司价值的猜测开始(例如股票价格乘以股票数量)。然后,您使用与股票价格相同的波动率将权证值作为此值的看涨期权(下面的代码)乘以稀释因子。然后你重新计算公司的价值(股票数量乘以股票价格加上权证数量和权证价格)。此值将与您开始时所在公司的价值不同。然后重做该过程,经过几次迭代后,您将看到公司价值的差异趋于零。为此,我有以下代码,但我得到的是以下内容:

TypeError: 'int' object is not subscriptable

请帮我解决下面代码中的错误:

 def bsm_call_value(S0, K, T, r, sigma):
    from math import log, sqrt, exp
    from scipy import stats
    S0 = float(S0)
    d1 = (log(S0 / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sqrt(T))
    d2 = (log(S0 / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * sqrt(T))
    value = (S0 * stats.norm.cdf(d1, 0.0, 1.0) - K * exp(-r * T) *stats.norm.cdf(d2, 0.0, 1.0))
    return value

def warrant_1unobservable(S0, K, T, r, sigma, k, N, M, Iteration):
    for i in range(1, Iteration):  
    Guess_FirmValue = S0*N
    dilution = N/(N +k*M)
    warrant[i] = bsm_call_value(Guess_FirmValue[i]/N,100,1,0.1,0.2)*dilution
    New_FirmValue[i] = Guess_FirmValue[i]+ warrant[i]
    Guess_FirmValue[i] - New_FirmValue[i] == 0
return warrant                   

print(warrant_1unobservable(100,100,1,0.1,0.2,1,100,10, 1000))    

1 个答案:

答案 0 :(得分:0)

我不是真正的python专家,我不熟悉你正在使用的算法,但我会指出一些可能导致问题的事情。

1)在warrant_1observable中,您首先为Guess_FirmValue分配标量值(因为S0N都是您调用函数的方式的标量),然后您尝试使用索引Guess_FirmValue[i]来访问它。我的猜测是这会导致你显示的错误,因为你试图索引/下标一个变量,根据你的函数输入值,它将是一个整数。

2)warrant[i]New_FirmValue[i]都试图将值分配给列表中的索引位置,但是您无处将这些变量初始化为列表。 python中的列表初始化为warrant = []。此外,您可能需要a)根据Iteration或b)使用append将列表预先分配到正确的大小,以将新值推送到列表的后面。< / p>

3)Guess_FirmValue[i] - New_FirmValue[i] == 0是一个空洞的代码行。所有这一切都是评估为真或假,而不执行其他操作。我想你正试图检查这些值是否相等然后返回,但即使你把它放在if语句中也不会发生这种情况。值的浮点表示极不可能相同。通过检查值的差异是否低于某个容差来实现这种中断,该容差被设置为非常小的数量。例:

if (abs(Guess_FirmValue[i] - New_FirmValue[i]) <= 1e-9):
    return ...