本文重點概要:

from scipy.stats import norm plt.style.use('bmh') plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 登入TEJ API api_key = 'YOUR_KEY' tejapi.ApiConfig.api_key = api_key tejapi.ApiConfig.ignoretz = True

資料庫使用

公司交易面資料庫 : 未調整股價(日),資料代碼為(TWN/APRCD)。
衍生性金融商品資料庫 : 選擇權日交易狀況,資料代碼為(TWN/AOPTION)。

使用台灣加權股價指數(Y9999)未調整收盤價,時間區間為2021/03/16到2023/04/10。並且載入台灣加權指數買權(TXO202304C15500),該選擇權為歐式買權、開始交易日為3/16,到期日為4/19,履約價格為15500。

gte, lte = '2021-03-16', '2023-04-10'
# 標的物價格
stocks = tejapi.get('TWN/APRCD',
                   paginate = True,
                   coid = 'Y9999',
                   mdate = {'gte':gte, 'lte':lte},
                   chinese_column_name = True,
                   opts = {
                       'columns':[ 'mdate','close_d']
# 選擇權價格
options = tejapi.get(
    'TWN/AOPTION',
    paginate = True,
    coid = 'TXO202304C15500',
    mdate = {'gte':gte, 'lte':lte},
    chinese_column_name = True,
    opts = {
        'columns':['mdate', 'coid','settle', 'kk', 'theoremp', 'acls', 'ex_price', 'td1y', 'avolt', 'rtime']
# 重設日期為index
stocks = stocks.set_index('年月日')
options = options.set_index('日期')

計算大盤之日報酬並且計算移動報酬波動度,以252天也就是一年為窗格迭代下去。

stocks['日報酬'] = np.log(stocks['收盤價(元)']) - np.log(stocks['收盤價(元)'].shift(1))
stocks['移動報酬波動度'] = stocks['日報酬'].rolling(252).std()

所得標的物價格表格如下:

self.sigma = sigma # 歷史波動度 self.T = T # 剩餘到期時間 self.d1 = (np.log(s0/k)+(r+sigma**2/2)*T) / (sigma * np.sqrt(T)) self.d2 = ((np.log(s0/k)+(r+sigma**2/2)*T) / (sigma * np.sqrt(T))) - sigma*np.sqrt(T) def BS_price(self): # 計算理論價格 c = self.s0*norm.cdf(self.d1) - self.k*np.exp(-self.r*self.T)*norm.cdf(self.d2) p = self.k*np.exp(-self.r*self.T)*norm.cdf(-self.d2) - self.s0*norm.cdf(-self.d1) return c,p def BS_delta(self): # 計算 delta return norm.cdf(self.d1), norm.cdf(self.d1)-1 def BS_gamma(self): # 計算 gamma return norm.pdf(self.d1)/(self.s0*self.sigma*np.sqrt(self.T)), norm.pdf(self.d1)/(self.s0*self.sigma*np.sqrt(self.T)) def BS_vega(self): # 計算 vega return self.s0*np.sqrt(self.T)*norm.pdf(self.d1), self.s0*np.sqrt(self.T)*norm.pdf(self.d1) def BS_theta(self): # 計算 theta c_theta = -self.s0*norm.pdf(self.d1)*self.sigma / (2*np.sqrt(self.T)) - self.r*self.k*np.exp(-self.r*self.T)*norm.cdf(self.d2) p_theta = -self.s0*norm.pdf(self.d1)*self.sigma / (2*np.sqrt(self.T)) + self.r*self.k*np.exp(-self.r*self.T)*norm.cdf(-self.d2) return c_theta, p_theta def BS_rho(self): # 計算 rho return self.k*self.T*np.exp(-self.r*self.T)*norm.cdf(self.d2), -self.k*self.T*np.exp(-self.r*self.T)*norm.cdf(-self.d2)

買賣權價格

接著我們用上述公式,在給定其他條件下,以視覺化方式觀察標的物價格對買賣權價格之影響。可以發現買權與賣權價格大致呈現對稱,買權價格與標的物價呈現正向變動,而賣權價格與標的物價呈現反向變動。除此之外,我們可以發現持有買權之下, 具有風險有限、增值無限的特性 ,因為當深價外時,選擇權價值至多減損至0,然而深價內時報酬可趨近於無限。而持有賣權雖風險有限,但受限於標的物價格至多減損到0,故報酬無法達成無限。

s0 = np.linspace(200,800)
k = 500
r = 0.00
sigma = 0.2
T = 252/252
mybs = BS_formula(s0, k, r, sigma, T)
c, p = mybs.BS_price()
fig = plt.figure(figsize = (12,8))
plt.plot(s0, c, label = '買權')
plt.plot(s0, p, label = '賣權')
plt.axvline(x = 500, color = 'black', linestyle = '--')
plt.xlabel('標的物價格', fontsize = 15)
plt.ylabel('選擇權價格', fontsize = 15)
plt.title('選擇權價格 VS. 標的物價格', fontsize = 20)
plt.legend(fontsize = 14)
plt.savefig('black scholes put call price.png')
plt.show()
fig = plt.figure(figsize = (12,8)) plt.plot(s0, c, label = '買權') plt.plot(s0, p, label = '賣權') plt.axvline(x = 500, color = 'black', linestyle = '--') plt.axhline(y = 0, color = 'black', linestyle = '--') plt.xlabel('標的物價格', fontsize = 15) plt.ylabel('Delta值', fontsize = 15) plt.title('Delta值 VS. 標的物價格', fontsize = 20) plt.legend(fontsize = 14) plt.savefig('black scholes put call delta.png') plt.show() fig = plt.figure(figsize = (12,8)) plt.plot(T, c0, label = '買權(價外)') plt.plot(T, c1, label = '買權(價平)') plt.plot(T, c2, label = '買權(價內)') plt.xlabel('剩餘時間', fontsize = 15) plt.ylabel('Gamma值', fontsize = 15) plt.title('Gamma值 VS. 剩餘時間', fontsize = 20) plt.legend(fontsize = 14) plt.axis([1.005, -0, -0.005, .045]) plt.savefig('black scholes put call gamma2.png') plt.show() s0 = stocks.loc['2023-04-10']['收盤價(元)'] k = 15500 sigma = stocks.loc['2023-04-10']['移動報酬波動度']*np.sqrt(252) T = 6/252 mybs = BS_formula(s0, k, r, sigma, T) c, p = mybs.BS_price() c_delta, p_delta = mybs.BS_delta() c_gamma, p_gamma = mybs.BS_gamma() c_vega, p_vega = mybs.BS_vega() c_theta, p_theta = mybs.BS_theta() c_rho, p_rho = mybs.BS_rho() print('==2023-04-10履約價為525的台積電買權==') print('當前標的物價格為 %.3f, 年化波動度為 %.3f, 剩餘期間為 %.3f'%(s0, sigma, T*252)) print('買權理論價格: %.4f, 賣權理論價格: %.4f' %(c,p)) print('買權delta: %.4f, 賣權delta: %.4f' %(c_delta,p_delta)) print('買權gamma: %.4f, 賣權gamma: %.4f' %(c_gamma,p_gamma)) print('買權vega: %.4f, 賣權vega: %.4f' %(c_vega,p_vega)) print('買權theta: %.4f, 賣權theta: %.4f' %(c_theta,p_theta)) print('買權rho: %.4f, 賣權rho: %.4f' %(c_rho,p_rho))