FRM模型十六:期权策略(期权组合)

文章目录

    • 备兑看涨期权(Covered Call)
    • 保护看跌期权(protective put)
    • 牛市价差套利
    • 熊市价差套利
    • 写在后面

本文所有代码基于windAPI,复现前先下载客户端并注册账号

备兑看涨期权(Covered Call)

构成:标的资产的多头 + 欧式看涨期权空头
损益:当标的资产市场价格上涨时,标的资产多头获利,看涨期权空头不行权。
当标的资产价格下降时,标的资产多头亏损,看涨期权行权获利弥补多头方损失。

头寸损益
标的资产多头 S T − S 0 S_{T}-S_{0} STS0
看涨期权空头 C − m a x ( S T − K , 0 ) C-max(S_{T}-K,0) Cmax(STK,0)
整体策略 S T − S 0 − m a x ( S T − K , 0 ) + C S_{T}-S_{0}-max(S_{T}-K,0)+C STS0max(STK,0)+C

其中 S T S_{T} ST表示T时刻的市价,K表示执行价,C表示看涨期权价格。损益图如下所示。

在这里插入图片描述
代码实现:

def CoveredCall(UnderlyingCode, OptionCode,StartTime):
    '''
    UndelyingCode:标的资产代码
    OptionCode:对冲期权的代码
    StartTime:开始回测时间
    '''

    error_code, wsd_data = w.wsd(OptionCode, "exe_price,exe_enddate,close,exe_ratio", StartTime, StartTime, usedf=True)
    StrikePrice = wsd_data['EXE_PRICE'][0]
    StrikeTime = wsd_data['EXE_ENDDATE'][0]
    OptionPrice = wsd_data['CLOSE'][0]
    Ratio = wsd_data['EXE_RATIO'][0]

    # 取当前系统时间
    current_time = datetime.datetime.now()
    # 比较行权日和当前,如果行权日晚于当前时间,只能回测到当前时间,否则可以回测到行权日。
    if current_time > StrikeTime:
        BacktestTime = StrikeTime
    else:
        BacktestTime = current_time

    # 定义合约份数
    N_ETF = 10000
    N_option = 1

    # 取行情数据
    error_code, etf_data = w.wsd(UnderlyingCode, "close", StartTime, BacktestTime, usedf=True)
    S0 = etf_data['CLOSE'][0]
    Payoff = (etf_data - S0) * N_ETF + N_option * OptionPrice - np.max(etf_data - StrikePrice, 0) * Ratio
    Payoff.plot(legend=None)
    plt.xlabel('Time', fontsize=8)
    plt.xticks(rotation=45)
    plt.ylabel('Payoff', fontsize=8)
    plt.show()


if __name__ == "__main__":
    UnderlyingCode = "510050.SH"
    OptionCode = "10005337.SH"
    StartTime = "2023-04-27"
    CoveredCall(UnderlyingCode, OptionCode, StartTime)

随着到期日临近,策略损益变化如下图:
请添加图片描述

保护看跌期权(protective put)

构成:标的资产多头+看跌期权多头
损益:当标的资产市场价格上涨时,标的资产多头获利,看跌期权多头不行权,损失期权费。
当标的资产价格下降时,标的资产多头亏损,看跌期权行权获利弥补空头方损失。

头寸损益
标的资产多头 S T − S 0 S_{T}-S_{0} STS0
看跌期权多头 m a x ( K − S T , 0 ) − C max(K-S_{T},0)-C max(KST,0)C
整体策略 S T − S 0 + m a x ( S T − K , 0 ) − C S_{T}-S_{0}+max(S_{T}-K,0)-C STS0+max(STK,0)C

在这里插入图片描述
代码实现:

def ProtectedPut(UnderlyingCode, OptionCode,StartTime):
    '''
    UndelyingCode:标的资产代码
    OptionCode:对冲期权的代码
    StartTime:开始回测时间
    '''

    error_code, wsd_data = w.wsd(OptionCode, "exe_price,exe_enddate, close,exe_ratio", StartTime, StartTime, usedf=True)
    StrikePrice = wsd_data['EXE_PRICE'][0]
    StrikeTime = wsd_data['EXE_ENDDATE'][0]
    OptionPrice = wsd_data['CLOSE'][0]
    Ratio = wsd_data['EXE_RATIO'][0]

    # 取当前系统时间
    current_time = datetime.datetime.now()
    # 比较行权日和当前,如果行权日晚于当前时间,只能回测到当前时间,否则可以回测到行权日。
    if current_time > StrikeTime:
        BacktestTime = StrikeTime
    else:
        BacktestTime = current_time


    # 定义合约份数
    N_etf = 10000
    N_option = 1

    # 取现货价格序列
    error_code, etf_data = w.wsd(UnderlyingCode, "close", StartTime, BacktestTime,  usedf=True)
    S0 = etf_data['CLOSE'][0]
    payoff = -N_option * OptionPrice + N_option * np.max(StrikePrice - etf_data) * Ratio + (etf_data - S0) * N_etf
    payoff.plot(legend=None)
    plt.xlabel('Time', fontsize=8)
    plt.xticks(rotation=45)
    plt.ylabel('Payoff', fontsize=8)
    plt.show()



if __name__ == "__main__":
    OptionCode = "10005338.SH"
    UnderlyingCode = "510050.SH"
    StartTime = "2023-04-27"
    ProtectedPut(UnderlyingCode, OptionCode, StartTime)


随着到期日临近,策略损益变化如下图:
请添加图片描述

牛市价差套利

构成:买入行权价低的看涨期权/看跌期权,卖出行权价高的看涨期权/看跌期权,即低买高卖。
损益:以看涨期权为例,当标的资产价格上涨时,看涨期权的多头方获利,空头方亏损。

头寸损益
低行权价看涨期权多头 m a x ( S t − K l o w , 0 ) − C 1 max(S_{t}-K_{low},0)-C1 max(StKlow,0)C1
高行权价看涨期权空头 C 2 − m a x ( S t − K h i g h , 0 ) C2-max(S_{t}-K_{high},0) C2max(StKhigh,0)
整体策略 C 2 − C 1 + m a x ( S t − K l o w , 0 ) − m a x ( S t − K h i g h , 0 ) C2-C1+max(S_{t}-K_{low},0)-max(S_{t}-K_{high},0) C2C1+max(StKlow,0)max(StKhigh,0)

整体损益情况如下图所示:
在这里插入图片描述
代码实现:

############################ BullSpread
def BullSpread(UnderlyingCode, code_high_strike, code_low_strike):
    '''
    UnderlyingCode:标的资产代码
    code_high_strike:行权价高的期权代码
    code_low_strike:行权价低的期权代码

    :return:
    '''


    # 取期权基本数据
    error_code, wss_data = w.wss(code_high_strike, "startdate,lasttradingdate", usedf=True)       # 取期权的上市时间及结束时间
    StartDate = wss_data['STARTDATE'][0]
    EndDate = wss_data['LASTTRADINGDATE'][0]

    # 取期权价格及执行价
    error_code, high_strike_data = w.wsd(code_high_strike, "exe_price,close,exe_ratio,exe_mode", StartDate, StartDate, usedf=True)
    error_code, low_strike_data = w.wsd(code_low_strike, "exe_price,close,exe_ratio,exe_mode", StartDate, StartDate, usedf=True)
    K_high = high_strike_data['EXE_PRICE'][0]
    K_low = low_strike_data['EXE_PRICE'][0]
    OptionPrice_high_strike = high_strike_data['CLOSE'][0]
    OptionPrice_low_strike = low_strike_data['CLOSE'][0]
    Type = high_strike_data['EXE_MODE'][0]
    Ratio_high_strike = high_strike_data['EXE_RATIO'][0]
    Ratio_low_strike = low_strike_data['EXE_RATIO'][0]


    # 取标的资产价格数据
    error_code, etf_data = w.wsd(UnderlyingCode, "close", StartDate, EndDate,  usedf=True)

    # 定义合约份数
    N_option = 1


    # 判断期权是看涨还是看跌
    if Type == "认购":
        Payoff = N_option * OptionPrice_high_strike - np.maximum(etf_data - K_high, 0) * Ratio_high_strike - N_option * OptionPrice_low_strike + np.maximum(etf_data - K_low, 0) * Ratio_low_strike

    elif Type == "认沽":
        Payoff = N_option * OptionPrice_high_strike - np.maximum(K_high - etf_data, 0) * Ratio_high_strike - N_option * OptionPrice_low_strike + np.maximum(K_low - etf_data, 0) * Ratio_low_strike
    else:
        print("期权类型判断有误")

    Payoff.plot(legend=None)
    plt.xlabel('Time', fontsize=8)
    plt.xticks(rotation=45)
    plt.ylabel('Payoff', fontsize=8)
    plt.show()

if __name__ == "__main__":
    code_high_strike = "10006371.SH"
    code_low_strike = "10006365.SH"
    UnderlyingCode = "510050.SH"
    BullSpread(UnderlyingCode, code_high_strike, code_low_strike)

随着到期日临近,策略损益变化如下图:
请添加图片描述

熊市价差套利

构成:卖出行权价低的看涨期权/看跌期权,买入行权价高的看涨期权/看跌期权,即低买高卖。
损益:以看涨期权为例,当标的资产价格上涨时,看涨期权的多头方获利,空头方亏损。

头寸损益
低行权价看涨期权空头 C 1 − m a x ( S t − K l o w , 0 ) C1-max(S_{t}-K_{low},0) C1max(StKlow,0)
高行权价看涨期权多头 m a x ( S t − K h i g h , 0 ) − C 2 max(S_{t}-K_{high},0)-C2 max(StKhigh,0)C2
整体策略 C 1 − C 2 + m a x ( S t − K h i g h , 0 ) − m a x ( S t − K l o w , 0 ) C1-C2+max(S_{t}-K_{high},0)-max(S_{t}-K_{low},0) C1C2+max(StKhigh,0)max(StKlow,0)

整体损益情况如下图所示:
在这里插入图片描述
代码实现:

def BearSpread(UnderlyingCode, code_high_strike, code_low_strike):
    '''
    UnderlyingCode:标的资产代码
    code_high_strike:行权价高的期权代码
    code_low_strike:行权价低的期权代码

    :return:
    '''

    # 取期权基本数据
    error_code, wss_data = w.wss(code_high_strike, "startdate,lasttradingdate", usedf=True)       # 取期权的上市时间及结束时间
    StartDate = wss_data['STARTDATE'][0]
    EndDate = wss_data['LASTTRADINGDATE'][0]

    # 取期权价格及执行价
    error_code, high_strike_data = w.wsd(code_high_strike, "exe_price,close,exe_ratio,exe_mode", StartDate, StartDate, usedf=True)
    error_code, low_strike_data = w.wsd(code_low_strike, "exe_price,close,exe_ratio,exe_mode", StartDate, StartDate, usedf=True)
    K_high = high_strike_data['EXE_PRICE'][0]
    K_low = low_strike_data['EXE_PRICE'][0]
    OptionPrice_high_strike = high_strike_data['CLOSE'][0]
    OptionPrice_low_strike = low_strike_data['CLOSE'][0]
    Type = high_strike_data['EXE_MODE'][0]
    Ratio_high_strike = high_strike_data['EXE_RATIO'][0]
    Ratio_low_strike = low_strike_data['EXE_RATIO'][0]


    # 取标的资产价格数据
    error_code, etf_data = w.wsd(UnderlyingCode, "close", StartDate, EndDate,  usedf=True)

    # 定义合约份数
    N_option = 1


    # 判断期权是看涨还是看跌
    if Type == "认购":
        Payoff = N_option * OptionPrice_low_strike - np.maximum(etf_data - K_low, 0) * Ratio_low_strike - N_option * OptionPrice_high_strike + np.maximum(etf_data - K_high, 0) * Ratio_high_strike

    elif Type == "认沽":
        Payoff = N_option * OptionPrice_low_strike - np.maximum(K_low - etf_data, 0) * Ratio_low_strike - N_option * OptionPrice_high_strike + np.maximum(K_high - etf_data, 0) * Ratio_high_strike
    else:
        print("期权类型判断有误")

    Payoff.plot(legend=None)
    plt.xlabel('Time', fontsize=8)
    plt.xticks(rotation=45)
    plt.ylabel('Payoff', fontsize=8)
    plt.show()

if __name__ == "__main__":
    code_high_strike = "10006371.SH"
    code_low_strike = "10006365.SH"
    UnderlyingCode = "510050.SH"
    BearSpread(UnderlyingCode, code_high_strike, code_low_strike)

随着到期日临近,策略损益变化如下图:
请添加图片描述

写在后面

最近和做期权的朋友交流发现,实际应用这些策略是很复杂的。由于期权买方卖方权利和义务的特点,Covered Call在卖看涨期权时需要缴纳保证金,一旦标的资产价格迅速上涨,期权端可能会被强平。所以可能根本就熬不到合约到期,也就不会有上述的收益曲线了。

Protective Put策略也是一样。如果盘中隐含波动率急速上涨,期权价格上涨,此时将看跌期权平仓会获得不小的收益,根本不用持有到期…

所以期权的策略其实是非常复杂的,不光光只考虑初始时间点的期权价格,更要考虑盘中期权价格的变动。这里只是为了复现FRM中提出的策略,还有很多不严谨的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/456908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2022-1310:RegExp[@@replace] missing write barrier lead a UAF

文章目录 环境搭建漏洞分析漏洞利用漏洞触发链RCE原语构造 总结参考 环境搭建 嗯,这里不知道是不是环境搭建的有问题,笔者最后成功的实现了任意地址读写,但是任意读写的存在限制,任意写 wasm 的 RWX 区域时会直接报错&#xff0c…

暗光增强——IAT网络推理测试(详细图文教程)

IAT模型由两个独立的分支组成,局部分支用于像素调整,并输出两个用于加法和乘法的特征图。全局分支用于全局调整并输出颜色矩阵和gamma值,全局分支受DETR启发,网络通过动态查询学习的方式更新颜色矩阵和gamma值。整个模型只有超过9…

设置浏览器显示小于12px以下字体

问题 我们在项目开发过程中有时候会遇到设计师给的小于12px的字体,IE、火狐浏览器、移动端等小于12px的字号大小还是可以正常显示的,但是谷歌浏览器上显示字体最小为12px,css设置font-size:10px,运行代码显示结果仍然…

JAVA基础:数组、重载、数据类型、封装、字符串、静态、继承、重写、多态、代码块、权限、接口、内部类

1 数组 //静态初始化 int[] arr1new int[]{1,2,3,4} //简化形式 int[] arr2{1,2,3,4} //动态初始化 int[] arr3new int[5] 2 方法重载 在同一个类中的多个方法的方法名相同,参数个数不同,参数类型不同,参数类型顺序不同 public class Test1 {public …

KubeSphere 社区双周报|2024.02.29-03.14

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.02.29-03.14…

多媒体操作流程

! 从左至右依次为:话筒、投影遥控器、ppt演讲笔、幕布升降遥控器、无线投屏连接器 主机箱 投影仪 二、操作流程 1、打开主机电源:最下面两台设备的开关打开 2、打开投影仪:用投影遥控器对准投影仪按开机键(如无需用到…

SwiftUI的context Menu

SwiftUI的 context Menu 现在来演示一下如何使用 SwiftUI 的 Context Menu 。 代码: import SwiftUIstruct ContextMenuBootCamp: View {State var bgColor: Color .purplevar body: some View {VStack(alignment: .leading, spacing: 10.0) {Image(systemName: …

【开源】SpringBoot框架开发公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

力扣刷题日记——L83. 删除排序链表中的重复元素

1. 前言 今天是力扣刷题打卡的第四天,今天带来一道简单题。一开始做了一道中等难度的题,但是很遗憾,没有解出来,但是为了不耽误今天的打卡计划,所以先选一个简单题做了,回头做出来那道题再和大家分享。话不…

一口吃掉Linux基础操作

一般在windows上面想要操作Linux系统就需要装软件搞一个虚拟机,我用的是Ubuntu22,就是Linux的发行版.安装Ubuntu的过程比较复杂,最重要的一点是安装时要断网,否则会很慢。 Ubuntu 配置指南 — 地震“学”科研入门教程 先介绍一个…

安卓通过termux部署ChatGLM

一、安装Termux并进行相关配置 1、安装termux Termux 是一个 Android 终端仿真应用程序,用于在 Android 手机上搭建一个完整的 Linux 环境。 不需要 root 权限 Termux 就可以正常运行。Termux 基本实现 Linux 下的许多基本操作。可以使用 Termux 安装 python&…

logistic回归分析

结局变量:二分类(常见)或多分类变量研究一个或多个原因变量和结果变量的因果关系 eg:Y必须是分类变量

手写简易操作系统(九)--实现打印函数

前情提要 前面我们已经进入内核程序了,中间穿插了一点特权级的知识,现在我们开始准备一个打印函数 很不幸,还有汇编程序 一、C调用规约 因为涉及到C与汇编的联合编程,我们这里简述一下调用规约,调用规约就是约定参…

【DataWhale学习】用免费GPU线上跑chatGLM项目实践

用免费GPU线上跑chatGLM项目实践 ​ DataWhale组织了一个线上白嫖GPU跑chatGLM与SD的项目活动,我很感兴趣就参加啦。之前就对chatGLM有所耳闻,是去年清华联合发布的开源大语言模型,可以用来打造个人知识库什么的,一直没有尝试。而…

MES管理系统中电子看板都有哪些类型?

随着工业信息化和智能制造的不断发展,MES管理系统已经成为现代制造业不可或缺的重要工具。MES管理系统通过集成和优化生产过程中的各个环节,实现对生产过程的实时监控、调度和管理,提高生产效率和质量。 在生产制造过程中,看板管…

1 redis7概述

Redis7 1 Redis简介 Redis之所以称之为字典服务, 是因为 Redis 是一个 key-value存储系统。 支持存储的 value类型很多, 包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型)等。 Redis…

python INI文件操作与configparser内置库

目录 INI文件 configparser内置库 类与方法 操作实例 导入INI文件 查询所有节的列表 判断某个节是否存在 查询某个节的所有键的列表 判断节下是否存在某个键 增加节点 删除节点 增加节点的键 修改键值 保存修改结果 获取键值 获取节点所有键值 其他读取方式 …

linux下dlib静态库和动态库编译

本文讲述的linux系统下如何编译dlib的静态库和动态库方法。 dlib源码下载地址 dlib官网:dlib C LibraryGitHub - davisking/dlib: A toolkit for making real world machine learning and data analysis applications in C dlib源码的目录结构如下: 编…

【TB作品】MSP430单片机,音乐播放器,四首音乐,八音盒,Proteus仿真

文章目录 题目要求仿真结果实验报告:基于MSP430单片机的八音盒设计实验目的实验设备实验原理总结 代码和仿真图 题目要求 八音盒 本设计利用MSP430单片机结合内部定时器及LED/LCD,设计一个八音盒,按下单键可以演奏预先设置的歌曲旋律。 基本要求: 使用LED/LCD显示器…

格子表单GRID-FORM | 必填项检验 BUG 修复实录

格子表单/GRID-FORM已在Github 开源,如能帮到您麻烦给个星🤝 GRID-FORM 系列文章 基于 VUE3 可视化低代码表单设计器嵌套表单与自定义脚本交互文档网站搭建(VitePress)与部署(Github Pages)必填项检验 BUG…