...并建议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
工作,k
、t
、f
必须是大小匹配的列表或数组;
完成 迭代变量的k
;它已经在zip
中使用。 我认为你只是在这里粗心大意;或困惑。
以及hagen...
函数的参数。f
、k
、t
应该是zip
中使用的变量吗? 使用迭代变量(i,j,?)会更有意义。 同样,这看起来只是你粗心大意,或者不在乎发生了什么。
至于ambiguity
错误,这很可能出现在
if k != f:
如果k
或f
是数组(或两者),则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() 函数中吗? 一般约定是编写采用单个输入类型的函数。
也许在数组中为每个项目调用它一个?
或者以这样一种方式编写函数,如果它看到输入是一个列表,它就会迭代,如果它看到输入不是列表,那么它只计算一次。
请参阅此线程以获取想法 如何制作可以处理单个输入或输入列表的函数