文章目录
编程金融小白学 股票期权
最近 沉迷股市 学习期权,所以 学了半斤八两的我 来写写 关于 股票期权 的介绍手册, 帮助 像我一样的小白 从 编程 与 数学的角度 了解期权。若有哪里不对,欢迎大佬在评论区留言。
基本概念
什么是期权?
- 2015年 2月 9日,股票期权(option)入驻了我国证券市场。
- 期 -> 未来,权 -> 权利
- 期权 顾名思义 就是追寻未来的权利。
- 说起来 期权也没有那么的复杂,和买保险是一个意思。
- 例:张三 买了辆新车,并买入了一份一个月的保险(一个月的期权),如果 他的车在这个月内没有出问题,那么他就损失了这一部分保险费,如果这个月 车出了大毛病,那么他就有权利 去保险公司 所取赔偿(在期权内就是有权 不损失保险以外的金额)。
- 在期权里 定金是不退的。
认购期权
- 又称 看涨期权
- 认购期权(call option),就是上面举的例子,购买认购期权就是 拥有 未来买入某个东西的权利。如果 这个东西在未来 价格 比你订的价格低,那么你就有权利不购买它,你就只损失这一笔 定金。
- 锁定 买入价
认沽期权
- 又称 看跌期权
- 认沽期权(put option),和认购相反,就是 在未来拥有卖出的权利。
- 锁定 卖出价
Python 期权类
- 好了 我们现在知道了 认购与认沽期权 那么就可以来构建期权类了。
option_price
: 期权价
deposi
: 定金
current
: 现价
class Option:
def __init__(self, option_price:float, deposit:float):
self.opt = option_price
self.dep = deposit
def call_opt(self, current:float):
'''
认购期权(买)
若 现价 - 期权价 < 0 ,不履行合约, 扣除定金
若 现价 - 期权价 > 0 ,履行合约,扣除定金
'''
return max(current-self.opt, 0) - self.dep
def put_opt(self, current:float):
'''
认沽期权(卖)
若 期权价 - 现价 < 0 ,不履行合约, 扣除定金
若 期权价 - 现价 > 0 ,履行合约,扣除定金
'''
return max(self.opt-current, 0) - self.dep
def __repr__(self):
return f"期权(期权价{self.opt},定金{self.dep})"
-
好了 我们现在 构建 好了 这个期权类。接下来可以,就可以绘制 认购 与 认沽的线性图 更直观的理解它了。
-
为了绘图 导入库
# 导入 需要的 library 库
import numpy as np # 科学计算
import matplotlib.pyplot as plt # 画图
plt.rcParams['font.sans-serif'] = ['FangSong'] # 设置中文
plt.rcParams['axes.unicode_minus'] = False # 设置中文负号
买入认购线性图
- 设定 我们 买入 期权价 500元的认购期权,定金100元。(支付100元 约定 一个月后 以500 元 价格 购买它)
- 一个月后 它的价格 变为 X。(若 X为 600,那么我不赚钱 ( 600 − 500 ) − 100 (600-500)-100 (600−500)−100 ,若700 我赚一百 ( 700 − 500 ) − 100 (700-500)-100 (700−500)−100, 若 400 我不履行合约 亏定金100 ( 0 − 100 ) (0-100) (0−100))。
- 设定 因变量 Y 为 赚的钱, 就可以 画出:
# 买入 期权价 500元的认购期权,定金100元。
buy = Option(500,100)
X = np.linspace(0,1000,100)
Y1 = np.array([buy.call_opt(x) for x in X])
plt.figure(figsize=(8,5), dpi=600)
plt.axhline(y=0,ls="-",c="green")
plt.plot(X,Y1)
plt.grid(True)
plt.title('买入认购期权')
plt.ylabel('收益')
plt.xlabel('到期价格')
plt.ylim((-300,300))
plt.show()
买入认沽线性图
- 设定 我们 买入 期权价 500元的认沽期权(就是觉得一个月后 会跌),定金100元。(支付100元 约定 一个月后 以500 元 价格 卖出它)
- 一个月后 它的价格 变为 X。(若 X为 600,那么我不履行合约亏一百 0 − 100 0-100 0−100 ,若700 我不履行合约还亏一百 0 − 100 0-100 0−100, 若 400 我履行合约 但不赚钱 ( 500 − 400 ) − 100 (500-400)-100 (500−400)−100)。
- 设定 因变量 Y 为 赚的钱, 就可以 画出:
# 买入 期权价 500元的认沽期权,定金100元。
buy = Option(500,100)
X = np.linspace(0,1000,100)
Y2 = np.array([buy.put_opt(x) for x in X])
plt.figure(figsize=(8,5), dpi=600)
plt.axhline(y=0,ls="-",c="green")
plt.plot(X,Y2)
plt.grid(True)
plt.title('买入认沽期权')
plt.ylabel('收益')
plt.xlabel('到期价格')
plt.ylim((-300,300))
plt.show()
- 那么 有了买入 那么 就有卖出 所以 我们 可以由买入 期权 变成卖出期权。
- 也就是 把 买入图 按x轴 倒一下
卖出认购线性图
- 设定 我们 卖出 期权价 500元的认购期权(就是觉得一个月后 不会涨),收入定金100元。(收入100元 约定 一个月后 以500 元 价格 卖出它),由于卖方没有权利毁约,所以一个月后必须卖出。
- 一个月后 它的价格 变为 X。
- 设定 因变量 Y 为 赚的钱, 就可以 画出:
# 卖出 期权价 500元的认购期权,定金100元。
sell = Option(500,100)
X = np.linspace(0,1000,100)
Y3 = np.array([-sell.call_opt(x) for x in X])
plt.figure(figsize=(8,5), dpi=600)
plt.axhline(y=0,ls="-",c="green")
plt.plot(X,Y3)
plt.grid(True)
plt.title('卖出认购期权')
plt.ylabel('收益')
plt.xlabel('到期价格')
plt.ylim((-300,300))
plt.show()
卖出认沽线性图
- 设定 我们 卖出 期权价 500元的认沽期权(就是觉得一个月后 不会跌),收入定金100元。(收入100元 约定 一个月后 以500 元 价格 买入它),由于卖方没有权利毁约,所以一个月后必须卖出。
- 一个月后 它的价格 变为 X。
- 设定 因变量 Y 为 赚的钱, 就可以 画出:
# 卖出 期权价 500元的认沽期权,定金100元。
sell = Option(500,100)
X = np.linspace(0,1000,100)
Y4 = np.array([-sell.put_opt(x) for x in X])
plt.figure(figsize=(8,5), dpi=600)
plt.axhline(y=0,ls="-",c="green")
plt.plot(X,Y4)
plt.grid(True)
plt.title('卖出认沽期权')
plt.ylabel('收益')
plt.xlabel('到期价格')
plt.ylim((-300,300))
plt.show()
期权线性图
- 我们学会了 四种期权的简单构成 那么就可以画出所有的图 进行对比。
- 红色 为认购,绿色 为认沽
- 实线 为买入,虚线 为卖出
plt.figure(figsize=(8,5), dpi=600)
plt.axhline(y=0,ls="-",c="black")
plt.plot(X,Y1, color='red', label='买入认购')
plt.plot(X,Y2, color='green', label='买入认沽')
plt.plot(X,Y3, color='red', label='卖出认购',ls = '--')
plt.plot(X,Y4, color='green', label='卖出认沽',ls = '--')
plt.grid(True)
plt.title('期权')
plt.ylabel('收益')
plt.xlabel('到期价格')
plt.ylim((-300,300))
plt.show()
-
在 图中 我们可以看到 这属于 零和博弈,有买入 那么 就有买出。在不考虑 税等因素情况下,买入的收益 就是卖出的亏损。
-
所以 期权是一种 即使 市场处于波动情况下 投资方 依然可以盈利的 金融产品。
-
补充说明(欧式期权 与 美式期权):
- 在全球 有两种 期权 (或三种)
- 欧式期权:一种买方只能到期日当天行使权利 (中国使用的类型)
- 美式期权:一种买方可以在交易期间任何时间都可以行使权利
- 第三种:在到期前指定一段时间可以行使权利
-
您 看到这 基本上了解了 期权的最基本的原理,现实交易肯定不可能这么的简单,那么接下来就 再 聊聊 现实中的 期权的时间价值 和 内在价值吧。
合约要素
实值,虚值与平值
- 实值,虚值与平值 这三要素 理解起来很是简单:
- 实值:如果我现在行使权利 那我就赚了
- 虚值:如果我现在行使权利 那我就亏了 所以我不会行使权利
- 平值:如果我现在行使权利 不赚也不亏
- 我们用实例 来解释一下(我用的是 tushare,这是我的推荐码https://tushare.pro/register?reg=361123):
import pandas as pd
import tushare as tus
pro = tus.pro_api()
print(tus.__version__)
1.2.54
# 获取 期权合约信息
opt_name = pro.opt_basic(exchange='SSE', fields='ts_code,name,exercise_type,list_date,delist_date')
# 选取 当月的合约
opt_name.query('list_date > "20200401" and delist_date < "20200529"')
ts_code | name | exercise_type | list_date | delist_date | |
---|---|---|---|---|---|
925 | 10002475.SH | 华夏上证50ETF期权2005认购3.00 | 欧式 | 20200420 | 20200527 |
926 | 10002476.SH | 华夏上证50ETF期权2005认沽3.00 | 欧式 | 20200420 | 20200527 |
1019 | 10002471.SH | 华夏上证50ETF期权2005认购2.95 | 欧式 | 20200408 | 20200527 |
1020 | 10002472.SH | 华夏上证50ETF期权2005认沽2.95 | 欧式 | 20200408 | 20200527 |
1885 | 10002469.SH | 华夏上证50ETF期权2005认购2.45 | 欧式 | 20200402 | 20200527 |
1886 | 10002470.SH | 华夏上证50ETF期权2005认沽2.45 | 欧式 | 20200402 | 20200527 |
2314 | 10002473.SH | 华泰柏瑞沪深300ETF期权2005认购4.20 | 欧式 | 20200408 | 20200527 |
2315 | 10002474.SH | 华泰柏瑞沪深300ETF期权2005认沽4.20 | 欧式 | 20200408 | 20200527 |
- 介绍一下 上表信息。
- 50 ETF 和 300 ETF 是目前 中国唯二 的 两个 在证券交易所可交易的期权。
10002475.SH
为 在 tushare 的编号华夏上证50ETF期权2005认购2.95
的意思是 投资者有权利以2.95元每份 买入 10000份 在2020年05月的 50ETF合约。也就是预期 在 5月 价格 会比 2.95元 高。- 2020年4月17日 收盘价为 2.793 元。当天的价格如图:
- 若我们 在 2020年4月17日 以 0.0150元每份 买入
华夏上证50ETF期权2005认购2.95
, 那么这时候 收盘价 对于行权价 2.95元 就为虚值,就是说 我现在就行使权利不合算,会亏本。 - 若我们 在 2020年4月17日 以 0.1978元 买入
华夏上证50ETF期权2005认沽2.95
, 那么这时候 收盘价 对于行权价 2.95 就为实值,就是说 我现在就行使权利 会赚, 但是 我们还要考虑到买入的成本。
内在价值与时间价值
-
我们通过上面的例子 可以算出 若 0.1978元 买入 2.95元的5月期货,那么对于 4月17日那天 收盘价2.793元 就直接行使权利的话 它的 内在价值为 2.95 − 2.793 = 0.157 2.95 - 2.793 = 0.157 2.95−2.793=0.157元。但是我们 又以 0.1978元购入,所以可以得出 它的时间价值为 0.1978 − 0.157 = 0.0408 0.1978 - 0.157=0.0408 0.1978−0.157=0.0408元。
-
在其他因素不变的话,距离到期时间越短,它的时间价值就越低。呈抛物线加速衰减。
-
接下来 看一下 认购期权 与 认沽期权 在 2020年04月的数据 (今日为4月19日 周日)
call295 = pro.opt_daily(ts_code='10002471.SH', start_date='20200408')
call295
ts_code | trade_date | exchange | pre_settle | pre_close | open | high | low | close | settle | vol | amount | oi | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 10002471.SH | 20200417 | SSE | 0.0104 | 0.0104 | 0.0116 | 0.0225 | 0.0116 | 0.0150 | 0.0150 | 3.8711 | 6559168.0 | 51792.0 |
1 | 10002471.SH | 20200416 | SSE | 0.0111 | 0.0111 | 0.0105 | 0.0117 | 0.0091 | 0.0104 | 0.0104 | 1.4148 | 1466280.0 | 39377.0 |
2 | 10002471.SH | 20200415 | SSE | 0.0121 | 0.0121 | 0.0120 | 0.0170 | 0.0107 | 0.0111 | 0.0111 | 1.6649 | 2153384.0 | 34645.0 |
3 | 10002471.SH | 20200414 | SSE | 0.0094 | 0.0094 | 0.0101 | 0.0123 | 0.0081 | 0.0121 | 0.0121 | 1.6154 | 1615393.0 | 28321.0 |
4 | 10002471.SH | 20200413 | SSE | 0.0160 | 0.0160 | 0.0160 | 0.0160 | 0.0089 | 0.0094 | 0.0094 | 1.6560 | 1915005.0 | 23352.0 |
5 | 10002471.SH | 20200410 | SSE | 0.0195 | 0.0195 | 0.0190 | 0.0216 | 0.0158 | 0.0160 | 0.0160 | 1.3566 | 2392633.0 | 17205.0 |
6 | 10002471.SH | 20200409 | SSE | 0.0206 | 0.0206 | 0.0223 | 0.0228 | 0.0183 | 0.0195 | 0.0195 | 1.3723 | 2803389.0 | 12130.0 |
7 | 10002471.SH | 20200408 | SSE | 0.0278 | 0.0278 | 0.0246 | 0.0266 | 0.0206 | 0.0206 | 0.0206 | 0.9021 | 2119503.0 | 5423.0 |
put295 = pro.opt_daily(ts_code='10002472.SH', start_date='20200408')
put295
ts_code | trade_date | exchange | pre_settle | pre_close | open | high | low | close | settle | vol | amount | oi | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 10002472.SH | 20200417 | SSE | 0.2250 | 0.2250 | 0.2079 | 0.2079 | 0.1810 | 0.1978 | 0.1978 | 0.4036 | 7704138.0 | 7258.0 |
1 | 10002472.SH | 20200416 | SSE | 0.2320 | 0.2320 | 0.2396 | 0.2399 | 0.2200 | 0.2250 | 0.2250 | 0.2473 | 5640617.0 | 6228.0 |
2 | 10002472.SH | 20200415 | SSE | 0.2175 | 0.2173 | 0.2185 | 0.2320 | 0.2118 | 0.2320 | 0.2320 | 0.3116 | 6925738.0 | 5288.0 |
3 | 10002472.SH | 20200414 | SSE | 0.2482 | 0.2482 | 0.2382 | 0.2460 | 0.2173 | 0.2173 | 0.2175 | 0.1450 | 3281409.0 | 3741.0 |
4 | 10002472.SH | 20200413 | SSE | 0.2421 | 0.2407 | 0.2475 | 0.2529 | 0.2396 | 0.2482 | 0.2482 | 0.1281 | 3179785.0 | 2868.0 |
5 | 10002472.SH | 20200410 | SSE | 0.2419 | 0.2414 | 0.2415 | 0.2483 | 0.2135 | 0.2407 | 0.2421 | 0.1260 | 2941148.0 | 1855.0 |
6 | 10002472.SH | 20200409 | SSE | 0.2496 | 0.2496 | 0.2421 | 0.2437 | 0.2345 | 0.2414 | 0.2419 | 0.0572 | 1370615.0 | 1278.0 |
7 | 10002472.SH | 20200408 | SSE | 0.2433 | 0.2433 | 0.2481 | 0.2569 | 0.2406 | 0.2496 | 0.2496 | 0.1524 | 3806835.0 | 1044.0 |
- 可以看到 由于认购期权 为虚值 购入的价格很低。这是因为 购买 虚值的期权 就像赌博,以小博大。例如,我在 04月17日时 购买了 一亿份
华夏上证50ETF期权2005认购2.95
花费 150万元 定金。若在5月27日时,价格涨到了3.05元 每份,那么我就相当于 赚了一千万元。若是没有比 2.95元高,那么我就损失 150万。在虚值交易中,这和杠杆类似。 - 看到这 你可能会冲动 去购买期权,但如果现实都这么容易能赚钱 大家都不用辛苦劳作了。金融市场 风险和利润成正比,以后 如果我有时间的话,会继续补完后面的 各种交易策略 与简易代码,在 预测哪种情况下 可以使用哪种策略等等。
- 若有帮助请给我 “一键三连”支持一下 (CSDN 应该没有这功能吧)