Python財金應用:Black-Scholes選擇權訂價模型(1)

經典的量化金融案例,也是每天在交易室會碰到無數次的內容,推導Black-Scholes formula就不是本篇的重點,有興趣我會在文章最底下附上推薦書單。

選擇權(Options)就是在未來某個時點可用某個價格買進或賣出標的資產的權利,投資人可以買進當作避險或樂透賭博,選擇權槓桿倍數相當大,如果將Gamma效果考慮進去,槓桿可以至百倍,而行情看錯則頂多失去權利金而已,Black-Scholes就是利用未來標的資產進入價內的機率去計算出選擇權權利金的。

有了這個評價公式後,我們可以衡量在設定波動度下的選擇權理論價值,也可以利用市場報價來反推選擇權的波動率,一般稱為隱含波動率(Implied Volatility)。

上圖就是選擇權的報價畫面,可以看到某個日期到期的選擇權鏈(Options Chain)的各履約價報價,並從中反推各種參數。

用Python撰寫Black-Scholes評價公式其實很輕鬆,按照公式的寫法轉換為套件的函數而已,同步還可學會函數的應用。

import numpy as np
from scipy import stats
S = 100.
K = 105.
r = 0.01
t = 180/252.
Sigma = 0.2

d1 = (np.log(S/K) + (r + 0.5 * Sigma**2)*t)/(Sigma * np.sqrt(t))
d2 = d1 - Sigma * np.sqrt(t)

Call = S * stats.norm.cdf(d1,0.0,1.0) - K * np.exp(-r*t) * stats.norm.cdf(d2,0.0,1.0)

以上就是一個簡單的選擇權評價範例,給定五個參數數值後,就直接開始計算d1與d2,大家可以對照一下公式,就會發現其實很簡單,下面將每個區塊拆解並解釋。

1. 引入套件(numpy, scipy)

import numpy as np
from scipy import stats

由於Black-Scholes需要用到指數(Exponential)與常態累積分配(Normal distribution c.d.f.)的科學運算 現有預設的Python是沒有這類函數的,則需要引用大量擁有科學運算函數的numpy與scipy。

2. 給定Black-Scholes參數

S = 100.
K = 105.
r = 0.01
t = 180/252.
Sigma = 0.2

先行預設標的資產價格(S)、履約價格(K)、無風險利率(r)、具到期日(t)與波動率(Sigma),在整數位後幾乎都有加上小數點,就是為了將變數設定為浮點位,以確保運算正確。
(Python不用另行宣告變數型態)

3. 計算d1與d2

d1 = (np.log(S/K) + (r + 0.5 * Sigma**2)*t)/(Sigma * np.sqrt(t))
d2 = d1 - Sigma * np.sqrt(t)

有利用的函數為numpy的log與sqrt,詳細可對照封面照的公式,要小心括號的擺放。

4. 計算Call的理論價格

Call = S * stats.norm.cdf(d1,0.0,1.0) - K * np.exp(-r*t) * stats.norm.cdf(d2,0.0,1.0)

這裡用到常態累積分配的函數,參數為0與1,代表是標準常態分配(mean = 0, std = 1),相信大家應該可以舉一反三求出Put的程式了吧?

最後要教大家如何把Black-Scholes選擇權評價公式包裝為函數(function),函數可以把既有的運算邏輯轉換為一個可以呼叫的程式,例如Excel中既有的函數(Ex. Sum, Average等),我們可以設計成BlackScholes(S,K,T,r,Sigma,C/P),之後要重複使用則只要把參數丟給這行程式就可以產出選擇權價格啦!是不是很方便呢?

推薦書單:
1. 陳松男-金融工程學
2. 陳威光-選擇權理論、實務與風險管理

 


雷大的Python投資筆記電子報

歡迎訂閱雷大的Python投資筆記電子報,每週將會發布定期市場分析文章與不定期的專案研究文章:

  1. 國際金融市場分析
  2. 量化交易策略分享
  3. Python程式撰寫教學

立即訂閱最新文章