為什麼用Newton-Raphson方法求隱含波動率得不到閉解?

使用市場50ETF期權的信息試圖計算隱含波動率,用牛頓法,為啥不用二分法是因為據說牛頓法比較快。但是由於vega比較小,在第一步迭代得到sigma為負值,之後就一直持續變大,最後結果變為infinite,檢查了函數的編輯,和原理都沒有錯誤。

*****問題補充的分割線******

已經修改了一下之前出錯的代碼。主要是導數的符號,和打錯了期權市場價。

還有一些其他問題如果解決了,我會持續更新。

代碼:

http://pan.baidu.com/s/1c25vApE


1. 檢查期權的價格是不是在無套利的範圍內。超出這個範圍,肯定沒解,不用去迭代了。你輸入的期權價格有問題。

2. Vega很小的期權,迭代時切線會導出很奇怪的點,你加上個sigma的範圍,比如0.0001 和 1.0,就會穩定很多。

3. 期權價格合理時,牛頓法會很快收斂,如果迭代次數過多還沒有收斂,那就跳出,用二分法更穩定。


首先期權價格0.038你打成0.0038了吧。。。。

if optiontype == 認購:
Vcall = option_call(close, TimetoMat, rfrate, strike, sigma_pre)
vega = option_vega(close, TimetoMat, rfrate, strike, sigma_pre)
print(value of call, Vcall)
print(value of vega, vega)
sigma = sigma_pre - (optionprice - option_call(
close, TimetoMat, rfrate, strike, sigma_pre
)) / (-option_vega(close, TimetoMat, rfrate, strike, sigma_pre))
print(sigma)
print(math.fabs(sigma - sigma_pre))

while math.fabs(sigma - sigma_pre) &> 0.0001:
sigma_pre = sigma
print(sigma_k, sigma_pre)
sigma = sigma_pre - (optionprice - option_call(
close, TimetoMat, rfrate, strike, sigma_pre
)) / (-option_vega(close, TimetoMat, rfrate, strike, sigma_pre))
print(sigma_kp1, sigma)

我只改了call的部分

牛頓法應該是 x_{n+1}=x_{n}-f(x_{n})/f(x_{n})

你寫的是 x_{n+1}=f(x_{n})/f(x_{n})+x_{n}


Newton法不保證「不依賴於起始點」的收斂性


結合Qusi-Newton and Nelder-Mead,快速與穩定結合。


你用50ETF價格帶入的話,深度價內的期權確實沒有閉解,考慮到HTB-rate的存在,現貨價格怎麼也得調整一下


推薦閱讀:

Delta 對沖有什麼意義?

TAG:Python | 期權 | 隱含波動率 |