...以及對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)
可以看出,函式中的一些引數是串列。我想得到一個陣列作為輸出。但是,我不斷收到主題行中的訊息。
uj5u.com熱心網友回復:
注意此呼叫中的變數:
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 值。它不會對條件進行迭代。它是一個基本的 Python if- 一個開關。
此ambiguity錯誤在各種背景關系中經常出現,但都具有相同的基本問題 - 在需要標量 T/F 的背景關系中使用陣列。一個簡單的網路搜索應該提供很多示例。
uj5u.com熱心網友回復:
@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)
uj5u.com熱心網友回復:
您確定要將陣列傳遞給 haganimpliedvol() 函式嗎?一般約定是撰寫采用單一輸入型別的函式。
也許稱它為陣列中的每個專案?
或者以這樣的方式撰寫函式,如果它看到輸入是一個串列,它會迭代,如果它看到輸入不是串列,那么它只計算一次。
見這個執行緒的想法 如何制作一個可以處理單個輸入或輸入串列的函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/494402.html
