我需要构建一个循环(模拟),它会迭代一定次数并在新公司价值接近猜测公司价值时显示一个值。具体而言,我们的想法是从公司价值的猜测开始(例如股票价格乘以股票数量)。然后,您使用与股票价格相同的波动率将权证值作为此值的看涨期权(下面的代码)乘以稀释因子。然后你重新计算公司的价值(股票数量乘以股票价格加上权证数量和权证价格)。此值将与您开始时所在公司的价值不同。然后重做该过程,经过几次迭代后,您将看到公司价值的差异趋于零。为此,我有以下代码,但我得到的是以下内容:
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))
答案 0 :(得分:0)
我不是真正的python专家,我不熟悉你正在使用的算法,但我会指出一些可能导致问题的事情。
1)在warrant_1observable
中,您首先为Guess_FirmValue
分配标量值(因为S0
和N
都是您调用函数的方式的标量),然后您尝试使用索引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 ...