期权基础知识(代码片段)

最老程序员闫涛 最老程序员闫涛     2022-12-05     666

关键词:

期权允许做非常复杂的策略,有策略之王的称号。同时我国已经引入期权交易5、6年之久,其中的50ETF期权交易非常活跃。由于期权可以在任意市场上环境下操作,具有高杠杆比的特点,是量化交易领域非常重要的一块。
然而要进行期权的量化交易,我们必须先搞清期权的基本概念。下面我们就以50ETF为例,向大家介绍期权的基本概念。

认购(看涨)期权

认购期权也称为看涨期权,如果认为50ETF会大涨,则可以考虑买入认购期权。

初始状态

我们假设张三持有12月到期的50ETF认购期权:

  • 期权类型:认购期权;
  • 行权价格:2.400元;
  • 标的价格:当时50ETF的价格为2.440元;
  • 期权价格:0.1480元/份,一张合约有10000份,因此价格为1480元;

假设李四买入该期权,则向张三支付1480元权利金。下面我们分为三种情况来分析张三、李四双方的盈利情况。

到期大涨

假设在到期日50ETF涨到2.800元,则此时李四可以以2.400元的价格买到2.800元的50ETF,其利润为:
p r o f i t = ( 2.8 − 2.4 ) ∗ 10000 − 1480 = 2520 profit = (2.8 - 2.4) * 10000 - 1480 = 2520 profit=(2.82.4)100001480=2520
既其利润为2520元。注意:虽然李四买入股票赚了4000元,但是他在一开始时支付给张三1480元权利金,因此其盈利就只有2520元了。
我们再来看张三,由于其需要以2.4元的价格卖出值2.8元的50ETF,其利润为:
p r o f i t = ( 2.4 − 2.8 ) ∗ 10000 + 1480 = − 2520 profit = (2.4 - 2.8)*10000 + 1480 = -2520 profit=(2.42.8)10000+1480=2520
既其亏损2520元。注意:虽然张三卖出50ETF时亏了4000元,但是他在一开始时还收到了李四的1480元的权利金,因此其亏损只有2520元。

到期未涨

假设在到期日50ETF跌到2.0元,则此时李四选择不行权,此时李四会亏损当初交给张三的权利金1480元。
张三此时不需要与李四交易50ETF,但是其在初始时收到了李四的1480元权利金,因此其利润为1480元。

讨论

根据上面的讨论,我们可以看出,对于认购(看涨)期权的买方李四来讲,50ETF在到期日涨得越多赚的越多,呈线性关系。而50ETF在到期日跌得再多,他也可以通过不行权,只亏初始时交易甲的权利金,因此50ETF的波动越大对认购(看涨)期权的买方来说越理想。
对于认购(看涨)期权的卖方而言,50ETF在到期日涨得越多,其亏损就越多,呈线性关系。而50ETF在到期日跌得再多,其也不能获利,只能收取权利金。
我们可以通过下面的程序画出认购(看涨)期权买方和卖方的盈亏图:

    def option_call_demo(self):
        exercise_price = 2.4
        option_price = 0.148
        units = 10000
        plt.figure(figsize=(8,6))
        plt.subplots_adjust(hspace=1) # 设置子图纵向距离
        plt.subplot(2, 1, 1)
        plt.title('认购(看涨)期权买方')
        ax = plt.gca()  # get current axis 获得坐标轴对象
        ax.spines['right'].set_color('none')  # 将右边 边沿线颜色设置为空 其实就相当于抹掉这条边
        ax.spines['top'].set_color('none')
        ax.xaxis.set_ticks_position('bottom')
        ax.yaxis.set_ticks_position('left')
        # 设置中心的为(0,0)的坐标轴
        ax.spines['bottom'].set_position(('data', 0))  # 指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
        ax.spines['left'].set_position(('data', 0))
        # plt.xticks(rotation=45)#x轴数值倾斜45度显示
        plt.xlim(-0.1, 5.0) #x轴数值设置
        plt.ylim(-0.2, 2.5)
        # 认购(看涨)期权买方盈利曲线
        x11 = np.array([0.0, 2.4])
        y11 = np.array([-0.1480, -0.1480])
        plt.plot(x11, y11, 'r-')
        x12 = np.array([2.4, 4.8])
        y12 = np.array([-0.1480, (4.8-2.4)-0.148])
        plt.plot(x12, y12, 'r-')
        # 认购(看涨)期权卖方盈利曲线
        plt.subplot(2, 1, 2)
        plt.title('认购(看涨)期权卖方')
        ax = plt.gca()  # get current axis 获得坐标轴对象
        ax.spines['right'].set_color('none')  # 将右边 边沿线颜色设置为空 其实就相当于抹掉这条边
        ax.spines['top'].set_color('none')
        ax.xaxis.set_ticks_position('bottom')
        ax.yaxis.set_ticks_position('left')
        # 设置中心的为(0,0)的坐标轴
        ax.spines['bottom'].set_position(('data', 0))  # 指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
        ax.spines['left'].set_position(('data', 0))
        # plt.xticks(rotation=45)#x轴数值倾斜45度显示
        plt.xlim(-0.1, 5.0) #x轴数值设置
        plt.ylim(-2.5, 0.2)
        x21 = np.array([0.0, 2.4])
        y21 = np.array([0.1480, 0.1480])
        plt.plot(x21, y21, 'b-')
        x22 = np.array([2.4, 4.8])
        y22 = np.array([0.1480, (2.4-4.8)+0.1480])
        plt.plot(x22, y22, 'b-')
        plt.show()

绘制的图形如下所示:

通过上面的分析,我们可能会得到如下结论,认购(看涨)期权买方只承担权利金的有限损失,但是却可以得到50ETF上涨的无限大(理论上)的利润。而卖方则在最好的情况下可以赚到买方的权利金,最坏的情况下会有无限大的损失,那么谁还会当认购(看涨)期权的卖家呢?
通常认购(看涨)期权的卖家是投资机构,那么机构又是出于什么考虑当这个看似非常不讨好的卖家呢?我们来看上述情况的盈亏平衡点为2.4+0.148=2.548元,机构通过专业人士的计算,实际股价涨到2.548以上的概率是非常小的,例如只有10%的概率,那么在90%的情况下,机构都可以收到权利金,因此机构在大多数情况虽然赚得不多,但是却会在赚钱。相反,买家在少数情况下会很赚钱,但是在多数情况下,却会亏掉支付给卖家的权利金。

提前平仓

假设李四在八月份购买这份期权之后,在9月18日,这份期权的价格大涨到0.3000元,李四考虑提前平仓离场。
对于李四而言:
p r o f i t = ( 0.3003 − 0.1480 ) ∗ 10000 = 1523 profit = (0.3003 - 0.1480)*10000=1523 profit=(0.30030.1480)10000=1523
相应的张三将有1523的亏损。

认沽(看跌)期权

假设李四购买了张三12月到期的认沽(看跌)期权:

  • 期权类型:认沽(看跌)期权
  • 行权价格:2.5
  • 标的价格:2.6
  • 期权价格:0.15元/份,一张合约有10000份,因此价格为1500元

下面我们分大跌和上涨两种情况来分析张三和李四的盈利情况。

标的大跌

假设到期日50ETF大跌到2.0元,李四具有以2.5元的价格卖出的权利,其盈利为:
p r o f i t = ( 2.5 − 2.0 ) ∗ 10000 − 1500 = 3500 profit=(2.5-2.0)*10000-1500=3500 profit=(2.52.0)100001500=3500
李四把只值2.0元的50ETF卖到了2.5元,因此其赚了5000元,但是其在初始时需要支付给张三1500元权利金,因此其盈利为3500元。
我们再来看张三,其盈利为:
p r o f i t = ( 2.0 − 2.5 ) ∗ 10000 + 1500 = − 3500 profit=(2.0-2.5)*10000+1500=-3500 profit=(2.02.5)10000+1500=3500
张三本来可以以2.0元的价格买入50ETF,但是却必须以2.5元买入50ETF,因此其亏损5000元,但是其在初始时收取了1500元的权利金,因此其亏损为3500元。

标的大涨

假设到期日50ETF的价格上涨到2.8元,此时李四就会觉得以2.5元的价格卖出会比较亏,因此选择不行权,因此其损失权利金。
由于李四选择不行权,张三就不能以2.5元买入50ETF,因此其也只能赚取权利金1500元。

讨论

我们可以仿照认购(看涨)期权的方法,绘制出认沽(看跌)期权的盈利曲线:

    def option_put_demo(self):
        exercise_price = 2.5
        option_price = 0.15
        units = 10000
        plt.figure(figsize=(8,6))
        plt.subplots_adjust(hspace=1) # 设置子图纵向距离
        plt.subplot(2, 1, 1)
        plt.title('认沽(看跌)期权买方')
        ax = plt.gca()  # get current axis 获得坐标轴对象
        ax.spines['right'].set_color('none')  # 将右边 边沿线颜色设置为空 其实就相当于抹掉这条边
        ax.spines['top'].set_color('none')
        ax.xaxis.set_ticks_position('bottom')
        ax.yaxis.set_ticks_position('left')
        # 设置中心的为(0,0)的坐标轴
        ax.spines['bottom'].set_position(('data', 0))  # 指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
        ax.spines['left'].set_position(('data', 0))
        # plt.xticks(rotation=45)#x轴数值倾斜45度显示
        plt.xlim(-0.1, 5.0) #x轴数值设置
        plt.ylim(-0.2, 2.5)
        # 认沽(看跌)期权买方盈利曲线
        x11 = np.array([2.5, 5])
        y11 = np.array([-0.15, -0.15])
        plt.plot(x11, y11, 'r-')
        x12 = np.array([0.0, 2.5])
        y12 = np.array([(2.5-0.0)-0.15, -0.15])
        plt.plot(x12, y12, 'r-')
        # 认购(看涨)期权卖方盈利曲线
        plt.subplot(2, 1, 2)
        plt.title('认沽(看跌)期权卖方')
        ax = plt.gca()  # get current axis 获得坐标轴对象
        ax.spines['right'].set_color('none')  # 将右边 边沿线颜色设置为空 其实就相当于抹掉这条边
        ax.spines['top'].set_color('none')
        ax.xaxis.set_ticks_position('bottom')
        ax.yaxis.set_ticks_position('left')
        # 设置中心的为(0,0)的坐标轴
        ax.spines['bottom'].set_position(('data', 0))  # 指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
        ax.spines['left'].set_position(('data', 0))
        # plt.xticks(rotation=45)#x轴数值倾斜45度显示
        plt.xlim(-0.1, 5.0) #x轴数值设置
        plt.ylim(-2.5, 0.2)
        x21 = np.array([2.5, 5.0])
        y21 = np.array([0.15, 0.15])
        plt.plot(x21, y21, 'b-')
        x22 = np.array([0.0, 2.5])
        y22 = np.array([(0.0 - 2.5) + 0.15, 0.15])
        plt.plot(x22, y22, 'b-')
        plt.show()     

其图形如下所示:

以上是关于期权最基础的知识,但是如果我们来看50ETF期权,我们会看到其会有很多个报价,在下一篇博文中,我们将向大家介绍期权的各种价格以及形成原理。

html国际货币期权(代码片段)

查看详情

利用akshare读取50eff期权1(代码片段)

目前国内期权市场比较活跃的期权产品,当属上证的50ETF期权,下面我们将通过akshare库,来获取50ETF期权数据。获取合约到期月份列表defdemo(self):#获取合约到期月份列表option_sina_sse_list_df=ak.option_sina_sse_list(symbol=&... 查看详情

期权基础知识

一、期权的定义期权是指在未来一定时期可以买卖的权力,是买方向卖方支付一定数量的金额(指权利金)后拥有的在未来一段时间内(指美式期权)或未来某一特定日期(指欧式期权)以事先规定好... 查看详情

sh具有短期和长期期权的bash脚本(代码片段)

查看详情

sh具有短期和长期期权的bash脚本(代码片段)

查看详情

《期货基础知识》期权交易入门知识

期权交易的权利金与保证金所谓期权的权利金,其实质上就是期权的价格,表示期权的买方获得选择权的成本,同时也是期权的卖方赋予买方选择权的所得。市场上对于不同标的、不同到期期限、不同行权价格的期权... 查看详情

利用akshare读取50eff期权2(代码片段)

我们接下来将研究获取期权历史行情数据的方法。获取当天分钟级数据我们可以获取指定合约编号,当天的分钟级数据:defdemo(self):option_sina_sse_minute_df=ak.option_sina_sse_minute(code="10002513")ticks=option_sina_sse_minute_... 查看详情

基于强化学习的期权量化交易回测系统3(代码片段)

在本篇博文中,我们将获取50EFT期权的日行情数据和50ETF的日行情数据,作为环境的状态数据,可以在强化学习环境SopEnv中逐日显示出来。数据集对象定义我们定义50ETF日行情数据集类D50etfDataset,在其中统一管理50E... 查看详情

基于强化学习的期权量化交易回测系统4(代码片段)

获取50ETF指数行情数据50ETF期权的标的物是50ETF指数,我们可以使用akshare来获取该指数的日行情数据,如下所示:classSh50etfIndexDataSource(object): ......defget_daily_data(self,start_date,end_date):df=ak.stock_zh_index_dai 查看详情

金融计算的开源库——quantlib学习入门(代码片段)

...算速度。主要功能QuantLib所提供的功能聚焦在两大领域:期权定价以及相关计算;固定收益产品定价以及相关计算。与期权相关的主要内容有:表示亚式期权、欧式期权、美式期权、百慕大期权等等不同种类期权的数据结构;基... 查看详情

基于强化学习的期权量化交易回测系统5(代码片段)

...本篇博文中将对这些内容进行介绍。交易费用计算在进行期权交易时,多头买入认购和认沽期权时,需要向卖出方支付权利金,而为了保证卖方可以履约,要向卖方收取保证金。同时,券商还会收取手续费和... 查看详情

基于强化学习的期权量化交易回测系统5(代码片段)

...本篇博文中将对这些内容进行介绍。交易费用计算在进行期权交易时,多头买入认购和认沽期权时,需要向卖出方支付权利金,而为了保证卖方可以履约,要向卖方收取保证金。同时,券商还会收取手续费和... 查看详情

基于强化学习的期权量化交易回测系统3(代码片段)

在本篇博文中,我们将获取50EFT期权的日行情数据和50ETF的日行情数据,作为环境的状态数据,可以在强化学习环境SopEnv中逐日显示出来。数据集对象定义我们定义50ETF日行情数据集类D50etfDataset,在其中统一管理50E... 查看详情

基于强化学习的期权量化交易回测系统4(代码片段)

获取50ETF指数行情数据50ETF期权的标的物是50ETF指数,我们可以使用akshare来获取该指数的日行情数据,如下所示:classSh50etfIndexDataSource(object): ......defget_daily_data(self,start_date,end_date):df=ak.stock_zh_index_daily(symbol="sh5... 查看详情

只看到了别人28岁从字节跳动退休,背后的期权知识你知道吗?

...网上大部分传的,郭同学的发家致富是因为有字节跳动的期权,期权的价值随着字节 查看详情

百科知识什么是对冲基金

...一种股票后,同时购入这种股票的一定价位和时效的看跌期权(PutOption)。看跌期权的效用在于当股票价位跌破期权限定的价格时,卖方期权的持有者可将手中持有的股票以期权限定的价格卖出,从而使股票跌价的风险得到对冲... 查看详情

实现欧式期权类

】实现欧式期权类【英文标题】:ImplementingaEuropeanOptionclass【发布时间】:2021-06-0121:11:43【问题描述】:我需要实现类Option_Pricer,它封装了与看涨期权和看跌期权定价相关的所有函数。老师给了我一个代码清单(.cpp文件),我... 查看详情

基于强化学习的期权量化交易回测系统2(代码片段)

在本篇博文中,我们将介绍强化学习环境类SopEnv的具体实现。SopEnv类的基类为gym.Env类,这样做的目的是为了与当前主流的强化学习系统兼容,我们需要重写该类的四个方法:reset:重置系统为初始状态;_ne... 查看详情