说出具有多个元素的数组的真值时出错是不明确的



...并建议Use a.any() or a.all().

我是python的新手,我正在尝试实现一个sabr模型。我定义了一个具有以下参数的函数:

def haganimpliedvol(a,f,k,B,v,t,p):
if k != f:
z = v/a*math.pow(f*k,(1-B)/2)*math.log(f/k)
xz = math.log((math.sqrt(1-2*p*z+math.pow(z,2))+z-p)/(1-p))

sigma = a/math.pow(f*k,(1-B)/2)*(1 + math.pow(1-B,2)/24* math.pow(math.log(f/k),2)+
math.pow(1-B,4)/1920* math.pow(math.log(f/k),4))*
xz*
(1+(math.pow(1-B,2)/24*math.pow(a,2)/math.pow(f/k,1-B)+1/4*(p*B*v*a)/math.pow(f/k,(1-B)/2)+
(2-3*math.pow(p,2))/24*math.pow(v,2)))*t

else:
sigma = a/math.pow(f,1-B)*
(1+(math.pow(1-B,2)/24*math.pow(a,2)/math.pow(f,(2-2*B))+
1/4*(p*B*a*v)/math.pow(f,1-B)+(2-3*math.pow(p,2))/24*math.pow(v,2)))*t

return(sigma)

现在我定义另一个函数并调用haganimpliedvol()函数

params = [0.4,0.6,0.1,-0.4]
def objective(params):
global k,sigma_iv,t,f
a = params[0]
B = params[1]
v = params[2]
p = params[1]
for (i,j,k) in zip(k,t,f):
calc_vols = np.array([haganimpliedvol(a,f,k,B,v,t,p)])
return(calc_vols)

可以看出,列出了函数中的一些参数。我想获取一个数组作为输出。但是,我一直在主题行中收到消息。

注意此调用中的变量:

for (i,j,k) in zip(k,t,f):
calc_vols = np.array([haganimpliedvol(a,f,k,B,v,t,p)])

要使zip工作,ktf必须是大小匹配的列表或数组;

完成 迭代变量的k;它已经在zip中使用。 我认为你只是在这里粗心大意;或困惑。

以及hagen...函数的参数。fkt应该是zip中使用的变量吗? 使用迭代变量(i,j,?)会更有意义。 同样,这看起来只是你粗心大意,或者不在乎发生了什么。

至于ambiguity错误,这很可能出现在

if k != f:

如果kf是数组(或两者),则k!=f将是布尔数组。 这不能在if中使用,这需要一个简单的 True 或 False 值。 它不会迭代条件。 这是一个基本的 Pythonif- 一个开关。

这个ambiguity错误在各种上下文中经常出现,但都有相同的基本问题 - 在需要标量 T/F 的上下文中使用数组。 一个简单的网络搜索应该提供很多例子。

@hpaulj感谢您带领我走上正确的道路。我矢量化了我的函数并进行了一些编辑,现在它工作正常。

haganimpliedvol = np.vectorize(haganimpliedvol,excluded = ['a','B','v','p'])
params = [0.2,0.7,0.01,-0.4]
def objective(params):
global k,sigma_iv,t,f
a = params[0]
B = params[1]
v = params[2]
p = params[1]
calc_vols = haganimpliedvol(a,f,k,B,v,t,p)
return(calc_vols)

你确定要把数组传递到 haganimpliedvol() 函数中吗? 一般约定是编写采用单个输入类型的函数。

也许在数组中为每个项目调用它一个?

或者以这样一种方式编写函数,如果它看到输入是一个列表,它就会迭代,如果它看到输入不是列表,那么它只计算一次。

请参阅此线程以获取想法 如何制作可以处理单个输入或输入列表的函数

最新更新