以下代码不会更新数组V。该数组首先在循环之前创建,并且应该在循环内进行更改,但不会。有人可以解释为什么吗?
PS:我是Python的初学者。
import numpy as np
def priceCall(S0=4,u=2,d=0.5,T=1,r=0.25,K=5):
n = range(T+1);
Tmn = np.subtract(T,n);
S = S0*np.power(u,Tmn)*np.power(d,n);
p = (1+r-d)/(u-d);
V = np.maximum(np.subtract(S,K),[0]*len(S));
for j in range(1,T+1):
for i in range(1,len(V)-j):
V[i] = 1/(1+r)*(p*V[i]+(1-p)*V[i+1]);
print(V)
return V
答案 0 :(得分:1)
因为您的第二个forloop甚至没有执行。假设您要不带任何参数调用priceCall
,在这种情况下,这意味着第一个范围将是range(1, 2)
,这实际上意味着[1]
和j=1
循环,表示第二个范围将是range(1, 1)
,实际上意味着[]
,因为将始终排除范围中的结束索引。
这是我测试的方式:
import numpy as np
def priceCall(S0=4,u=2,d=0.5,T=1,r=0.25,K=5):
n = range(T+1);
Tmn = np.subtract(T,n);
S = S0*np.power(u,Tmn)*np.power(d,n);
p = (1+r-d)/(u-d);
V = np.maximum(np.subtract(S,K),[0]*len(S));
print("INITIAL")
print(V)
print("R1")
print(range(1, T+1))
for j in range(1, T+1):
print("R2")
print(range(1, len(V)-j))
for i in range(1, len(V)-j):
new_val = 1/(1+r)*(p*V[i]+(1-p)*V[i+1])
print(new_val)
V[i] = new_val
print("AFTER")
print(V)
return V
priceCall()
这是输出:
(py3) > $ python sover.py
INITIAL
[3. 0.]
R1
range(1, 2)
R2
range(1, 1)
AFTER
[3. 0.]
证明向量确实发生了变化:
import numpy as np
def priceCall(S0=4,u=2,d=0.5,T=1,r=0.25,K=5):
n = range(T+1);
Tmn = np.subtract(T,n);
S = S0*np.power(u,Tmn)*np.power(d,n);
V = np.maximum(np.subtract(S,K),[0]*len(S));
print("INITIAL")
print(V)
V[0] = 9999
print("AFTER")
print(V)
priceCall()
与输出
(py3) > $ python sover.py
INITIAL
[3. 0.]
AFTER
[9999. 0.]
答案 1 :(得分:0)
在嵌套的for循环中出现一个错误。进入第一个循环时,len(V)等于1。