使用 Python 绘制 BTC 期权的波动率曲面

news2024/11/16 8:33:57

波动率曲面(Volatility Surface)是期权交易中展示隐含波动率随行权价(strike price)和到期时间(expiry time)变化的一种三维图形。

本文尝试通过 Python,通过 ccxt 基于从交易所获取期权的指标数据绘制构建 BTC 波动率曲面。

准备工作

首先,安装所需的库,确保环境可与交易所交互并绘制图表。

  • ccxt: 一个用于便于连接加密货币交易所的库。
  • pandas: 用于数据处理,本文主要用于将 datetime 字符串转为 timestamp。
  • matplotlib: 用于绘图。
  • mpl_toolkits.mplot3d: 用于绘制三维图表。

安装命令:

pip install ccxt matplotlib pandas

期权合约数据

通过 ccxt 库可以方便地获取加密货币交易所的期权数据。本例中,我们使用 ccxt 的 Bybit API 获取 BTC 期权的市场数据。

通过 ccxt 的 API fetch_option_markets 即可获取期权合约数据。

import ccxt
from collections import defaultdict

# 初始化ccxt并连接到Bybit交易所
bybit = ccxt.bybit(
    {
        "options": {"loadAllOptions": True}, # 获取所有的期权数据
    }
)

# 获取BTC期权市场数据
option_markets = bybit.fetch_option_markets({"baseCoin": "BTC"})

通过在初始化交易所 API 实例时配置 loadAllOptionsfetch_option_markets 参数 baseCoinBTC 指定获取所有 BTC 的期权合约数据

输出 option_markets 中的数据查看下结构:

{'id': 'BTC-20SEP24-70000-P', 'lowercaseId': None, 'symbol': 'BTC/USDC:USDC-240920-70000-P', 'base': 'BTC', 'quote': 'USDC', 'settle': 'USDC', 'baseId': 'BTC', 'quoteId': 'USDC', 'settleId': 'USDC', 'type': 'option', 'spot': False, 'margin': False, 'swap': False, 'future': False, 'option': True, 'index': None, 'active': True, 'contract': True, 'linear': None, 'inverse': None, 'subType': None, 'taker': 0.0006, 'maker': 0.0001, 'contractSize': 0.01, 'expiry': 1726819200000, 'expiryDatetime': '2024-09-20T08:00:00.000Z', 'strike': 70000.0, 'optionType': 'put', 'precision': {'amount': 0.01, 'price': 5.0}, 'limits': {'leverage': {'min': None, 'max': None}, 'amount': {'min': 0.01, 'max': 500.0}, 'price': {'min': 5.0, 'max': 10000000.0}, 'cost': {'min': None, 'max': None}}, 'created': 1724918400000, 'info': {'symbol': 'BTC-20SEP24-70000-P', 'status': 'Trading', 'baseCoin': 'BTC', 'quoteCoin': 'USDC', 'settleCoin': 'USDC', 'optionsType': 'Put', 'launchTime': '1724918400000', 'deliveryTime': '1726819200000', 'deliveryFeeRate': '0.00015', 'priceFilter': {'minPrice': '5', 'maxPrice': '10000000', 'tickSize': '5'}, 'lotSizeFilter': {'maxOrderQty': '500', 'minOrderQty': '0.01', 'qtyStep': '0.01'}}}

其中的 strike 为行权价,optionType 为期权类型(call 和 put),expiryDatetime 为到期时间。

为了分析,我要将期权按到期时间(expiryDatetime)排序,且只过滤看涨期权(call)和活跃中的期权合约。

将这部分数据提取出来,如下所示:

# 将期权按到期时间分类
expiry_option_markets = defaultdict(list)
for option_market in option_markets:
    if option_market["active"] and option_market["optionType"] == "call":
        expiry_option_markets[option_market["expiryDatetime"]].append(option_market)

提取行权价和隐含波动率

将数据按到期时间排序,确保后续的其他的数据按到期日期顺序排列。

# 先对到期时间进行排序
sorted_expiry_dates = sorted(
    expiry_option_markets.keys(), key=lambda d: pd.to_datetime(d).timestamp()
)

接下来就是从期权市场数据中提取出行权价(strike)和隐含波动率(implied volatility)。

隐含波动率通常是由交易所计算并提供的,我们通过 fetch_greeks 提取交易所的数据,不自己计算。

# 行权价和隐含波动率数据的存储
strike_prices = []
expiry_times = []
implied_vols = []

# 遍历每个到期时间,收集行权价和隐含波动率
for expiry_date in sorted_expiry_dates:
    option_markets = expiry_option_markets[expiry_date]
    for option_market in option_markets:
        greeks = bybit.fetch_greeks(symbol=option_market["id"])  # 获取希腊字母和波动率
        strike_price = option_market["strike"]
        implied_volatility = greeks["markImpliedVolatility"]

        # 将数据添加到列表中
        strike_prices.append(strike_price)
        expiry_times.append(pd.to_datetime(expiry_date).timestamp())  # 转为时间戳
        implied_vols.append(implied_volatility)

这个步骤中,通过 Bybit 的 API 获取了每个期权的隐含波动率(标记价格的隐含波动率),存储起来便于绘图。

如果有获取希腊字母的需求,如 delta、gamma、theta、vega 等,这个接口中也有相应的字段,可自行查看。

现在我们有了行权价-strikes,到期日期 expiry_times 和对应的隐含波动率 implied_vols

绘制波动率曲面

数据准备就绪后,我们使用 matplotlib 库绘制三维波动率曲面图。这张图的三维轴分别表示行权价(X轴)、到期时间(Y轴)和隐含波动率(Z轴)。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 创建图形
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection="3d")

# 绘制三维曲面
surf = ax.plot_trisurf(strike_prices, expiry_times, implied_vols, cmap="viridis")

# 设置坐标轴标签
ax.set_xlabel("Strike Price")
ax.set_ylabel("Expiry Time")
ax.set_zlabel("Implied Volatility")

# 设置标题
ax.set_title("Implied Volatility Surface")

# 显示图形
plt.show()

如下所示:

看着有点怪怪的,没发现问题,应该是对的吧。

解释:

  • X 轴(行权价): 期权的行权价格。它决定了期权持有者是否会在到期时行使期权。
  • Y 轴(到期时间): 期权的到期时间,通常表示为 UNIX 时间戳。
  • Z 轴(隐含波动率): 隐含波动率反映了市场对于标的资产未来波动的预期。

plot_trisurf 函数通过三角剖分来绘制不规则网格的数据点,使得我们能够直观地观察隐含波动率随行权价和到期时间的变化。

结语

本文介绍了如何使用 Python 获取交易所 BTC 期权数据,并通过隐含波动率绘制波动率曲面。

我还在不断学习中,希望这篇文章对你有用!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程连接MySQL并操作

配置MySQL开发环境 如果你使用的是基于Debian的系统(如Ubuntu),可以在终端通过如下步骤安装MySQL开发包。 更新软件包列表 运行以下命令以确保你拥有最新的软件包列表。 sudo apt-get update安装libmysqlclient-dev开发包 执行以下命令以…

python-字符排列问题

题目描述 有 n 个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。输入格式 第一行输入是字母个数 n 。 接下来一行输入的是待排列的 n 个字母。输出格式 计算出的 n 个字母的所有不同排列总数。样例输入输出样例输入 4 aacc样例…

道路驾驶视角人车检测数据集 16000张 带标注 voc yolo

随着智能驾驶技术和车辆辅助系统的快速发展,道路驾驶视角下的多目标检测成为了保障行车安全的关键技术之一。为了提高自动驾驶车辆以及辅助驾驶系统的性能,需要大量的高质量标注数据来训练这些系统。本数据集旨在为道路驾驶视角下的人车检测提供高质量的…

python画图|中秋到了,尝试画个月亮(球体画法)

学习了一段时间的画图,已经掌握了一些3D图的画法,部分链接如下: python画图|极坐标下的3D surface-CSDN博客 python画图|3D参数化图形输出-CSDN博客 我们今天尝试一下月亮的画法。 【1】官网教程 首先还是到达官网教程学习: …

java: 警告: 源发行版 17 需要目标发行版 17(100% 解决)

1. 问题说明 Idea启动Springboot服务报错:java: 警告: 源发行版 17 需要目标发行版 17 2. 解决方案 Project Structure指定jdk版本为我们当前使用的版本; Java Compiler指定jdk为我们当前使用的版本; Invalidate Caches重启Idea。 如果还…

NTC温度电阻--100K 10K

100K温度电阻分度表 粗精度直接用公式计算 细精度用厂家的传感器参数来计算 Y C1 C2* y C3 * y * y*y static float get_ntc_temp(double Rt) { double y log(Rt);//122.6us48M double val; static const double c1 0.0008314; static const double c2 0.00026178;…

Linux下vscode配置C++和python编译调试环境

Visual Studio Code (简称 VSCode) 是由微软开发的一款免费、开源、跨平台的代码编辑器。它支持 Windows、macOS 和 Linux 操作系统,并且内置对多种编程语言的支持,包括但不限于 C/C、Python、JavaScript、TypeScript、Java 和 Go 等。VSCode 主要用于编…

【C语言进阶】动态内存与柔性数组:C语言开发者必须知道的陷阱与技巧

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言动态内存管理 🌹🌹期待您的关注 🌹🌹 ❀C语言动态内存管理 &…

数据结构-链式二叉树-四种遍历

博客主页:【夜泉_ly】 本文专栏:【数据结构】 欢迎点赞👍收藏⭐关注❤️ 数据结构-链式二叉树-四种遍历 1.前言2.前、中、后序遍历2.1前序遍历2.1中、后序遍历 3.层序遍历3.1递归实现3.2队列实现关于在Pop之后为什么还能用tmp访问节点&#x…

Docker学习笔记(四)单主机网络

简介 Docker从容器中抽象除出了底层的主机连接网络,使得程序不用关心运行时的环境。连接到Docker网络的容器将获得唯一的地址,其他连接到同一Docker网络的容器也可以根据该IP找到目标容器并发送消息。   但是容器内运行的软件没法方便的确定主机IP地址…

第二期: 第二节 , 裸机编程 , gpio

1 首先就是 看原理图: 这里有两个 LED 核心板的原理图。 可以看到 是这个脚。 2 然后就是 查看数据手册。 从 数据手册可以看出 ,一共有这么多的 gpio 组, 但是这些 组 是有复用的&#xf…

非常实用的桌面日历 你桌面上的备忘录和提醒工具

在快节奏的现代生活中,时间管理成为了每个人不可或缺的技能。随着数字化时代的到来,我们虽然拥有了智能手机、平板电脑以及各类时间管理应用,但那份传统而温馨的桌面日历,却依然以其独特的魅力,在无数人的工作台上占据…

油耳拿什么清理比较好?好用的无线可视挖耳勺推荐

油耳的朋友通常都是用棉签来掏耳。这种方式是很不安全的。因为使用棉签戳破耳道和棉絮掉落在耳道中而引起感染的新闻不在少数。在使用过程中更加建议大家可视挖耳勺来清理会更好。不仅清晰度得干净而且安全会更高。但最近这几年我发现可视挖耳勺市面上不合格产品很多&#xff0…

澳元/美元价格:进一步上涨看向美联储

澳元/美元在0.6700关口附近波动不定。美元因美国经济数据强劲而重新获得上行动力。接下来,澳大利亚将公布西太平洋领先指数。 美元的再度走强使风险敏感资产承压,澳元/美元周二维持在0.6700关口上方的小幅区间内。尽管美元反弹,澳元仍成功维…

关于STM32项目面试题02:ADC与DAC篇(输入部分NTC、AV:0-5V、AI:4-20mA和DAC的两个引脚)

博客的风格是:答案一定不能在问题的后面,要自己想、自己背;回答都是最精简、最精简、最精简,可能就几个字,你要自己自信的展开。 面试官01:什么是模数转换/ADC?说说模数转换的流程? …

STM32F407 - 01

嵌入式概述 什么是嵌入式?嵌入式是以应用为中心,以计算机技术为基础 硬件可裁剪 适用于对体积 可靠性 功耗 性能等方面有着严格的专用计算机系统 简单来说 除了处理桌面PC和服务器之外所有的控制类设备都是嵌入式. 通用计算机和专用计算机的区别 两者的区别在于技术的发展和…

Python编码系列—Python组合模式:构建灵活的对象组合

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

质量与数量的博弈!大模型数据建设

质量与数量的博弈!大模型数据建设 前言大模型数据建设 前言 大数据和人工智能(DataAI)技术正以惊人的速度改变着我们的生活和工作方式。大模型数据建设作为人工智能领域的核心组成部分,其重要性日益凸显。 大模型数据建设涉及到海…

硬件工程师笔试面试——电机

目录 18、电机 18.1 基础 电机原理图 电机实物图 18.1.1 概念 18.1.2 电机的一些基本分类和特点 18.2 相关问题 18.2.1 不同类型的电机在实际应用中有哪些具体的优势和劣势 18.2.2 在设计一个电机系统时,我应该如何考虑电机的选型和配置? 18.2.3 对于需要频繁启停的…

【C++篇】C++类与对象深度解析(三):类的默认成员函数详解

文章目录 【C篇】C类与对象深度解析(三)前言4. 运算符重载基本概念4.1 运算符重载的基本概念4.2 重载运算符的规则4.3 成员函数重载运算符4.4 运算符重载的优先级与结合性4.5 运算符重载中的限制与特殊情况4.5.1 不能创建新的操作符4.5.2 无法重载的运算…