期权到期时的盈亏图
欧式看涨期权的盈亏为max(ST-K,0),若考虑期权费就是max(ST-K-c,-c);欧式看跌期权的盈亏为max(K-ST,0),若考虑期权费就是max(K-ST-p,-p)。下面以看跌期权为例,画出它到期时的盈亏图。需要注意的是np.maximum可以逐个比较array与数值,而np.max是求序列的最值,这里应该使用np.maximum函数。
有一投资者买入基础资产为100股Q股票、执行价格为50元/股的欧式看跌期权,每股的期权费为6元。假定Q股票现在的股价为56元,画出该看跌期权到期时多空头的盈亏图。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
K=50;P=6;S0=56
S=np.linspace(30,70,100)
plt.figure(figsize=(10,5))
plt.subplot(121)
plt.plot(S,100*np.maximum(K-S,0),'r-',label='看跌期权多头收益图')
plt.plot(S,100*np.maximum(K-S-P,-P),'k--',label='看跌期权多头盈亏图')
plt.xlabel('股价')
plt.ylabel('payoff')
plt.title('看跌期权多头盈亏图')
plt.grid()
plt.legend()
plt.subplot(122)
plt.plot(S,-100*np.maximum(K-S,0),'r-',label='看跌期权空头收益图')
plt.plot(S,-100*np.maximum(K-S-P,-P),'k--',label='看跌期权空头盈亏图')
plt.xlabel('股价')
plt.ylabel('payoff')
plt.title('看跌期权空头盈亏图')
plt.grid()
plt.legend()
看涨-看跌期权平价公式
考虑两个组合:组合A:一份欧式看涨期权+Ke-rt的现金;组合B:一份看跌期权+一份标的资产。
对于组合A,当到期ST>K时,以手中的K去买标的资产,价值为ST;到期ST<K时,放弃行权,价值为手中的K;对于组合B,当到期ST>K时,放弃行权,价值为ST;到期ST<K时行权,卖掉标的资产后手中价值为K。因此两个组合到期时的价值均为max(ST,K),那么当前的价值也相等,即P+S=C+Ke-rt。
假设当前股价为20,执行价格为18,无风险利率为每年5%,3个月的欧式看涨期权报价为2.3,3个月的欧式看跌期权报价为0.2,通过平价公式判断期权价格的合理性,如何套利?
def c(p,s,k,r,t):
return p+s-k*np.exp(-r*t)
def p(c,s,k,r,t):
return c-s+k*np.exp(-r*t)
c(0.2,20,18,0.05,0.25)
Out[1]: 2.4235995911101327
p(2.3,20,18,0.05,0.25)
Out[2]: 0.07640040888986732
#可见看涨期权价格被低估,看跌期权价格被高估,可以买入组合A,卖出组合B:
payoff=-2.3-18*np.exp(-0.05*0.25)+0.2+20
payoff
Out[3]: 0.12359959111013197
用BS公式计算期权价格
其中N(·)为标准正态分布的累积分布函数。假设有一份期限为六个月的股票期权,标的资产股票价格为5.29元,期权执行价格为6元,年化无风险利率和年化波动率分别为4%和24%,用BS公式求看涨期权和看跌期权的价格。
from scipy.stats import norm
def bscall(S,K,r,sigma,t):
d1=(np.log(S/K)+(r+0.5*sigma**2)*t)/(sigma*np.sqrt(t))
d2=(np.log(S/K)+(r-0.5*sigma**2)*t)/(sigma*np.sqrt(t))
return S*norm.cdf(d1)-K*np.exp(-r*t)*norm.cdf(d2)
def bsput(S,K,r,sigma,t):
d1=(np.log(S/K)+(r+0.5*sigma**2)*t)/(sigma*np.sqrt(t))
d2=(np.log(S/K)+(r-0.5*sigma**2)*t)/(sigma*np.sqrt(t))
return -S*norm.cdf(-d1)+K*np.exp(-r*t)*norm.cdf(-d2)
print('看涨期权价格为{:.4f},看跌期权价格为{:.4f}。'.format(bscall(5.29,6,0.04,0.24,0.5),bsput(5.29,6,0.04,0.24,0.5)))
看涨期权价格为0.1532,看跌期权价格为0.7443。
如果在权利期间内支付红利,只需将S修改为S减去红利的现值,红利的现值可以由sum(d*exp(-rf *t))来计算,其中d和t以array或Series格式传入。