上一篇 基本概念
文章目录
编程金融小白学 股票期权
期权的定义
-
上篇博客介绍了基本的概念。这次就来更深入的理解。
-
先回顾一下各个术语的定义。
-
权利的买方:期权多头
-
权利的卖方:期权空头
-
权利是未来买资产:认购期权,看涨期权
-
权利是未来卖资产:认沽期权,看跌期权
-
标的资产:买的是什么资产 和 多少数量
-
行权价:有权利买卖的价格
-
到期日:合约未来到期的日期
对比 期权多头与空头
对比 | 期权多头 | 期权空头 |
---|---|---|
义务 | 支付期权费 | 配合多头行权 |
权利 | 决定是否行权 | 收取期权费 |
最大收益 | 看涨:理论无线 看跌:行权价-期权费 | 期权费 |
最大亏损 | 期权费(100%) | 看涨:理论无线 看跌:行权价-期权费 |
保证金 | 0 | 初始保证金与追加保证金 |
对比 期权与期货
- 期货 (Futures)
- 更改之前定义的期权类 把认购与认沽的现价输入支持
array
格式。 - 增加 多头空头转换
buy
True 为多头,False 为空头
# 导入 需要的 library 库
import numpy as np # 科学计算
import matplotlib.pyplot as plt # 画图
plt.rcParams['font.sans-serif'] = ['FangSong'] # 设置中文
plt.rcParams['axes.unicode_minus'] = False # 设置中文负号
class Option:
def __init__(self, option_price:float, deposit:float, buy=True):
self.opt = option_price
self.dep = deposit
self.buy = 1 if buy else -1
def call_opt(self, current:np.array):
'''
认购期权(买)
若 现价 - 期权价 < 0 ,不履行合约, 扣除定金
若 现价 - 期权价 > 0 ,履行合约,扣除定金
'''
return self.buy*((current-self.opt)*(current>=self.opt)-self.dep)
def put_opt(self, current:np.array):
'''
认沽期权(卖)
若 期权价 - 现价 < 0 ,不履行合约, 扣除定金
若 期权价 - 现价 > 0 ,履行合约,扣除定金
'''
return self.buy*((self.opt-current)*(current<=self.opt) - self.dep)
def __repr__(self):
return f"期权(期权价{self.opt},定金{self.dep})"
# 买入 期权价 500元的期权,定金100元
buy = Option(500,100)
price = np.linspace(0,1000,101)
buy_call = buy.call_opt(price)
buy_put = buy.put_opt(price)
buy_future = price-500
plt.figure(figsize=(8,5), dpi=600)
plt.axhline(y=0,ls="-",c="black")
plt.plot(price,buy_call,color='red',label='认购多头')
plt.plot(price,buy_put,color='green',label='认沽多头')
plt.plot(price,buy_future,color='blue',label='期货多头')
plt.grid(True)
plt.title('对比 期权与期货 的多头')
plt.ylabel('收益')
plt.xlabel('到期价格')
plt.legend(loc='upper right')
plt.ylim((-300,300))
plt.show()
- 由此可以看出,买入期权 主要是买入它的波动率,只要波动率越大,那么就越容易赚钱。而期货不同,它没有对波动有特别大的偏好,波动越大,代表风险越大。
# 卖出 期权价 500元的期权,定金100元
sell = Option(500,100,False)
price = np.linspace(0,1000,101)
sell_call = sell.call_opt(price)
sell_put = sell.put_opt(price)
sell_future = -(price-500)
plt.figure(figsize=(8,5), dpi=600)
plt.axhline(y=0,ls="-",c="black")
plt.plot(price,sell_call,color='red',label='认购空头')
plt.plot(price,sell_put,color='green',label='认沽空头')
plt.plot(price,sell_future,color='blue',label='期货空头')
plt.grid(True)
plt.title('对比 期权与期货 的空头')
plt.ylabel('收益')
plt.xlabel('到期价格')
plt.legend(loc='upper right')
plt.ylim((-300,300))
plt.show()
- 在空头这张图 更可以直观看出,期货没有对波动有倾向性偏好。但做期权空头,说明 投资方 认为 波动趋近于平稳。
对比 | 期权(Options) | 期货(Future) |
---|---|---|
合约性质 | 卖方必须履行义务 | 买卖双方都必须履行合约义务域责任 |
多头最大收益 | 无线 或 执行价-期权价 | 无线 |
多头最大损失 | 只限于期权费 | 约定价格 |
空头最大收益 | 只限于期权费 | 约定价格 |
空头最大损失 | 无线 或 执行价-期权价 | 无线 |
缴纳保证金 | 卖方 | 双方 |
影响因素 | 涨跌方向、波动率 | 涨跌方向 |
时间损耗 | 有 | 无 |
保证金
-
多头无需缴纳保证金
-
空头看涨保证金计算(两者取最大):
- ( 结 算 价 ) 期 权 费 收 入 + 标 的 资 产 收 盘 价 值 × 10 % − 虚 值 额 (结算价)期权费收入+标的资产收盘价值 \times 10 \% - 虚值额 (结算价)期权费收入+标的资产收盘价值×10%−虚值额
- ( 结 算 价 ) 期 权 费 收 入 + 标 的 资 产 收 盘 价 值 × 5 % (结算价)期权费收入+标的资产收盘价值 \times 5 \% (结算价)期权费收入+标的资产收盘价值×5%
-
空头看跌保证金计算(两者取最大):
- ( 结 算 价 ) 期 权 费 收 入 + 标 的 资 产 收 盘 价 值 × 10 % − 虚 值 额 (结算价)期权费收入+标的资产收盘价值 \times 10 \% - 虚值额 (结算价)期权费收入+标的资产收盘价值×10%−虚值额
- ( 结 算 价 ) 期 权 费 收 入 + 行 权 价 值 × 5 % (结算价)期权费收入+行权价值 \times 5 \% (结算价)期权费收入+行权价值×5%
使用python 来 模拟一个实例
- 卖空一手当日结算价为 40点,行权价为 2200点的 一个月期 看涨期权,沪深300指数收盘价为 2150点:
def deposit(opt_price,opt_close,settle,vol=1,call=True):
out_of_money = max((opt_price-opt_close),0) if call else max((opt_close-opt_price),0)
price_1 = settle + opt_close*0.1- out_of_money
price_2 = settle + opt_close*0.05 if call else settle + opt_price*0.05
return max(price_1,price_2)*100*vol
deposit(2200,2150,40,1)
20500.0
-
最终缴纳的保证金为 20500元。
-
卖空一手当日结算价为 72点,行权价为 2200点的 一个月期 看跌期权,沪深300指数收盘价为 2150点:
deposit(2200,2150,72,1,False)
28700.0
- 最终缴纳的保证金为 28700元
欧式看涨期权价格曲线
欧式期权价格曲线
- 重新定义 期权类 Option,加入更多信息, 详情参考公式来源。
- 看涨或看跌(c or p)
- 标的资产现价(S0)
- 期权执行价格(K)
- 期权到期时间(t)
- 适用的无风险利率(rf)
- 适用的波动率(sigma)
- 股利信息(本例中使用连续股利率dv)
import scipy.stats as sps
class Options:
def __init__(self, cp, s0, k, t, r, sigma, dv=0):
self.cp = 'Call' if (cp == 'C' or cp == 'c') else 'Put'
self.cp_sign = 1.0 if self.cp == 'Call' else -1.0
self.s0 = s0 * 1.0
self.k = k * 1.0
self.t = t * 1.0
self.sigma = sigma * 1.0
self.r = r * 1.0
self.dv = dv * 1.0
self.d_1 = (np.log(self.s0 / self.k) + (self.r - self.dv + .5 * self.sigma ** 2) * self.t) / self.sigma / np.sqrt(self.t)
self.d_2 = self.d_1 - self.sigma * np.sqrt(self.t)
def bsprice(self):
return self.cp_sign * self.s0 * np.exp(-self.dv * self.t) * sps.norm.cdf(self.cp_sign * self.d_1) \
- self.cp_sign * self.k * np.exp(-self.r * self.t) * sps.norm.cdf(self.cp_sign * self.d_2)
def mcprice(self, iteration=1000000):
zt = np.random.normal(0, 1, iteration)
st = self.s0 * np.exp((self.r - self.dv - .5 * self.sigma ** 2) * self.t + self.sigma * self.t ** .5 * zt)
p = []
for St in st:
p.append(max(self.cp_sign * (St - self.k), 0))
return np.average(p) * np.exp(-self.r * self.t)
欧式看涨期权价格曲线
# 买入 看涨期权价 500元的期权
buy = Option(500,0)
price = np.linspace(0.01,1000,100)
buy_call = buy.call_opt(price)
time_price = np.array([Options('c',x,500,2,0.02,0.5).bsprice() for x in price])
plt.figure(figsize=(8,5), dpi=800)
plt.axvline(x=500,ls="-",c="black")
plt.plot(price,buy_call,color='red',label='期权价格下限')
plt.plot(price,price,color='green',label='期权价格上限')
plt.plot(price,time_price,color='blue',label='看涨价格曲线')
plt.fill_between(price,time_price,buy_call,color='lightskyblue',label='时间价值')
plt.fill_between(price,buy_call,color='mistyrose',label='内在价值')
plt.title('欧式看涨期权价格曲线')
plt.ylabel('看涨期权价格')
plt.xticks([200,500,800],['虚值期权','平值期权','实值期权'])
plt.yticks([0],[0])
plt.legend(loc='upper left')
plt.ylim((-10,600))
plt.xlim((0,1000))
plt.show()
欧式期权看跌价格曲线
# 买入 看跌期权价 500元的期权
buy = Option(500,0)
price = np.linspace(0.1,1000,100)
max_price = np.ones(100)*500
buy_call = buy.put_opt(price)
time_price = np.array([Options('p',x,500,2,0.02,0.5).bsprice() for x in price])+20 # 和理想状态有差 加20调整做为调整
plt.figure(figsize=(8,5), dpi=800)
plt.axvline(x=500,ls="-",c="black")
plt.plot(price,buy_call,color='red',label='期权价格下限')
plt.plot(price,max_price,color='green',label='期权价格上限')
plt.plot(price,time_price,color='blue',label='看跌价格曲线')
plt.fill_between(price,time_price,buy_call,color='lightskyblue',label='时间价值')
plt.fill_between(price,buy_call,color='mistyrose',label='内在价值')
plt.title('欧式看跌期权价格曲线')
plt.ylabel('看跌期权价格')
plt.xticks([200,500,800],['实值期权','平值期权','虚值期权'])
plt.yticks([0],[0])
plt.legend(loc='upper left')
plt.ylim((-10,600))
plt.xlim((0,1000))
plt.show()
-
从上面两图中可以看到,时间价值越接近 平值 它的价值越大。越往两边 它的价值自然减少。当然在其他因素不变的话,距离到期时间越短,它的时间价值就越低。呈抛物线加速衰减。
-
看到这 你可能会冲动 去购买期权,但如果现实都这么容易能赚钱 大家都不用辛苦劳作了。金融市场 风险和利润成正比,以后 如果我有时间的话,会继续补完后面的 各种交易策略 与简易代码,在 预测哪种情况下 可以使用哪种策略等等。
-
若有帮助请给我 “一键三连”支持一下 (CSDN 应该没有这功能吧2333)