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

devtools/2024/10/18 6:25:45/

波动率曲面(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 即可获取期权合约数据。

python">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)和活跃中的期权合约。

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

python"># 将期权按到期时间分类
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)

提取行权价和隐含波动率

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

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

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

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

python"># 行权价和隐含波动率数据的存储
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轴)。

python">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.ppmy.cn/devtools/115286.html

相关文章

函数组件、Hooks和类组件区别

1. 函数组件(Function Components) 函数组件是接收props并返回React元素的纯JavaScript函数。它们不能拥有自己的状态(state)或生命周期方法,但在React 16.8中引入Hooks之后,这种情况发生了变化。 特点&a…

【运营攻略】怎样进行游戏产品的定位

关于游戏商业化设计的一些思考 - 游戏干饭之家 游戏运营进阶:数据分析驱动游戏版本调优 - 游戏干饭之家 在深入挖掘某款游戏数据时,发现了一个有趣的现象:70%的玩家好友数量在1-5个之间,11%的玩家好友数在6-10个,而平…

第三章 SpringBoot静态资源导入原理探究

目录 一、源码解析 二、自定义静态资源读取路径 三、WebJars引入静态资源 四、首页定制 注:本章使用的SpringBoot版本为3.3.4,老版本在配置属性和底层源码细节上会有所调整。 一、源码解析 SpringBoot使用Spring MVC内置的资源处理器来导入静态资源…

城市高楼上的新运动天地:气膜体育馆—轻空间

在现代城市的高楼大厦之中,一座气膜体育馆悄然崛起,成为了一处别具一格的运动空间。这座体育馆的最大亮点在于,它巧妙地利用了楼顶资源,既不占用宝贵的地面空间,又为城市增添了一抹活力。 作为一种临时性建筑&#xff…

Greiner 经典力学(多体系统和哈密顿力学)第一章 学习笔记

第一章题目为 “Newton’s Equations in a Rotating Coordinate System”。这一章内容比较简单。这里只对一些书上没有交待,但是容易混淆的知识点做一些澄清。 一个位置变量 A ( t ) A(t) A(t) 表示的是空间的一个点。这个点在不同的坐标系下表现形式是不同的。但…

滑动窗口算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 目录 滑动窗口算法的简介 209. 长度最小的子数组 3.无重复字符的最长子串 1004. 最大连续1的个数III 1658. 将减到0的最小…

【路径规划】 红嘴蓝鹊优化器:一种用于2D/3D无人机路径规划和工程设计问题的新型元启发式算法

摘要 本文提出了一种新型元启发式算法——红嘴蓝鹊优化器(RBMO),用于解决2D和3D无人机路径规划以及复杂工程设计问题。RBMO灵感来源于红嘴蓝鹊的群体合作行为,包括搜索、追逐、捕猎和食物储藏。该算法通过模拟这些行为&#xff0…

引领长期投资新篇章:价值增长与财务安全的双重保障

随着全球金融市场的不断演变,长期投资策略因其稳健性和对价值增长的显著推动作用而日益受到投资者的重视。在这一背景下,Zeal Digital Shares(ZDS)项目以其创新的数字股票产品,为全球投资者提供了一个全新的长期投资平…