Python計算期權隱含波動率

更多精彩內容,歡迎關注公眾號:數量技術宅,也可添加技術宅個人微信號:sljsz01,與我交流。

Black-Scholes 將期權價格描述為標的價格、行權價、無風險利率、到期時間和波動性的函數。

 V=BS(S,K,r,T,σ)

在本文中,我們使用的波動率值是對未來已實現價格波動率的估計。

鑒於股票價格、行權價、無風險利率和到期時間都是已知且容易找到的,我們實際上可以將市場上的期權價格視為 σ 的函數。

 V=BS(σ)

期權的價格在 σ 中單調增加,這意味着隨着波動性的增加,期權的價值也會增加,如下圖所示。

 

當價格等於期權行權價時,其結果是線性的(中間圖)。而當行權價高於或低於當前價格時(左右圖),波動性的增加也會對期權價格產生積極影響。

尋找市場隱含波動率

以下是 GOOG 的看漲期權報價,其行使價為 585.00,到期日為 2014 年 10 月 18 日。最後交易價格為 17.50 美元。

 

到目前為止,我們知道我們的期權價格 V 、我們的行權價 K 和到期時間 T,上述數據是從雅虎財經獲得的 。GOOG 的交易價格為 586.08 美元,現在我們知道了S,唯一缺少的是無風險利率 r ,我們可以通過找到接近我們的期權到期時到期的國庫券利率來近似無風險利率。4 周利率目前為 0.02% ,我們可以把這個數值當作是r。

從目前收集到的數據中,我們可以看到:

V=BS(S,K,r,T,σ)

$17.50=BS(586.08,585.00,0.0002,0.10958….,σ)

現在我們有一個方程,其中只有一個未知變量,即波動率。然而,我們無法重新排列 Black-Scholes 公式來求解波動性。但是,我們知道價格相對於波動率是單調增加的,因此我們可以嘗試猜測波動率是多少,然後找出該期權的價值。如果該值太高,我們降低我們的猜測,反之亦然,並重複直到我們找到 σ 的值,使我們的期權價格足夠接近市場價格。

雖然上述方法可行,但它相當不精確。 我們可以做的是使用求根方法,如二分法或牛頓法。

牛頓法

牛頓法是一種尋找函數根的提高近似值的方法。通過隱含波動率,我們試圖找出使我們的期權價格儘可能接近 8.50 美元的 σ 值。

如果我們有一個函數 f(x) 及其導數 f'(x),我們可以從初始猜測開始,然後通過以下方式通過更新的猜測不斷迭代它:

Xn+1=Xn−f(Xn)/f′(Xn)

為了找到隱含波動率,我們想要找到的根是我們的 Black-Scholes 價格在一定程度上與市場價格相匹配的。 我們可以這樣表達:

|Vmarket−Vmodel|>=ϵ

其中 ϵ 是精度水平,Vmarket 是期權的市場價格。

這裡,我們的 f(x) 函數是期權定價的 Black-Scholes 方程:

Vmodel=f(x)=BS(σ)

正如您可能猜到的,價格相對於波動率的導數是 vega,這將是我們的 f'(x) 函數。

Python實現隱含波動率計算

那麼讓我們在python中實現牛頓的方法:

def find_vol(target_value, call_put, S, K, T, r):
   MAX_ITERATIONS = 100
   PRECISION = 1.0e-5

   sigma = 0.5
   for i in xrange(0, MAX_ITERATIONS):
       price = bs_price(call_put, S, K, T, r, sigma)
       vega = bs_vega(call_put, S, K, T, r, sigma)

       price = price
       diff = target_value - price  # 我們的根

       print i, sigma, diff

       if (abs(diff) < PRECISION):
           return sigma
       sigma = sigma + diff/vega # f(x) / f'(x)

   # 未找到值,返回迄今為止的最佳猜測
   return sigma

這裡,我們將精度設置為 1e-5 (0.00001),並且我們不會執行超過 100 次的猜測。

我們還需要兩個計算Black-Scholes公式的函數,bs_price 和 bs_vega:

n = norm.pdf
N = norm.cdf

def bs_price(cp_flag,S,K,T,r,v,q=0.0):
   d1 = (log(S/K)+(r+v*v/2.)*T)/(v*sqrt(T))
   d2 = d1-v*sqrt(T)
   if cp_flag == 'c':
       price = S*exp(-q*T)*N(d1)-K*exp(-r*T)*N(d2)
   else:
       price = K*exp(-r*T)*N(-d2)-S*exp(-q*T)*N(-d1)
   return price

def bs_vega(cp_flag,S,K,T,r,v,q=0.0):
   d1 = (log(S/K)+(r+v*v/2.)*T)/(v*sqrt(T))
   return S * sqrt(T)*n(d1)

讓我們嘗試找出上面報價的隱含波動率:

V_market = 17.5
K = 585
T = (datetime.date(2014,10,18) - datetime.date(2014,9,8)).days / 365.
S = 586.08
r = 0.0002
cp = 'c' # 看漲期權

implied_vol = find_vol(V_market, cp, S, K, T, r)

print 'Implied vol: %.2f%%' % (implied_vol * 100)

print 'Market price = %.2f' % V_market
print 'Model price = %.2f' % bs_price(cp, S, K, T, r, implied_vol)

運行Python代碼,得到結果:

Implied vol: 21.92%
Market price = 17.50
Model price = 17.50

到這裡,我們已經成功計算了上述期權的隱含波動率。 2014 年 10 月 18 日到期的 585 美元看漲期權的隱含波動率為 21.92%。

 

 


往期乾貨分享推薦閱讀

數字貨幣穩定幣對網格做市策略

數字貨幣資金費策略

分享一個年化15%以上的無風險套利機會

網格交易系統開發

通過深度學習股價截面數據分析和預測股票價格

Omega System Trading and Development Club內部分享策略Easylanguage源碼

一個真實數據集的完整機器學習解決方案(下)

一個真實數據集的完整機器學習解決方案(上)

如何使用交易開拓者(TB)開發數字貨幣策略

股指期貨高頻數據機器學習預測

如何使用TradingView(TV)回測數字貨幣交易策略

如何投資股票型基金?什麼時間買?買什麼?

【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略

AMA指標原作者Perry Kaufman 100+套交易策略源碼分享

【 數量技術宅 | 期權系列分享】期權策略的「獨孤九劍」

【數量技術宅|金融數據系列分享】套利策略的價差序列計算,恐怕沒有你想的那麼簡單

【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略

如何獲取免費的數字貨幣歷史數據

【數量技術宅|量化投資策略系列分享】多周期共振交易策略

【數量技術宅|金融數據分析系列分享】為什麼中證500(IC)是最適合長期做多的指數

商品現貨數據不好拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享

【數量技術宅|金融數據分析系列分享】如何正確抄底商品期貨、大宗商品

【數量技術宅|量化投資策略系列分享】股指期貨IF分鐘波動率統計策略

【數量技術宅 | Python爬蟲系列分享】實時監控股市重大公告的Python爬蟲