别再只用收盘价了!用Python实战对比Parkinson、Garman-Klass等三种高阶波动率算法(附完整代码)

news2026/5/4 3:51:57
高阶波动率算法实战Parkinson、Garman-Klass与Rogers-Satchell的Python实现与对比在量化交易和金融风险管理中波动率是最核心的指标之一。传统的收盘价波动率Close-to-Close虽然计算简单但它忽略了日内价格变动信息可能导致对市场真实波动性的低估。本文将带你深入探索三种利用日内价格数据的高阶波动率算法——Parkinson、Garman-Klass和Rogers-Satchell通过Python实战对比它们的表现差异。1. 为什么需要高阶波动率算法金融市场的价格变动并非只在收盘时发生。日内价格的高点和低点往往蕴含着重要的市场情绪信息。以2020年3月美股熔断期间为例标普500指数单日振幅经常超过5%但收盘价变动可能只有2-3%。如果仅依赖收盘价计算波动率会严重低估市场实际风险。三种高阶算法的核心思想都是利用OHLC开盘-最高-最低-收盘数据中的更多信息Parkinson波动率专注于日内价格区间最高价与最低价之比Garman-Klass波动率在Parkinson基础上加入开盘价与收盘价信息Rogers-Satchell波动率进一步考虑价格路径不对称性的影响# 示例传统收盘价波动率 vs 高阶波动率 import numpy as np def close_to_close_volatility(returns, window20, trading_days252): return returns.rolling(window).std() * np.sqrt(trading_days)2. 算法原理与Python实现2.1 Parkinson波动率捕捉日内价格区间Parkinson(1980)提出的波动率估计方法基于一个简单而深刻的观察日内价格区间最高价-最低价包含了比单一收盘价更多的波动信息。其公式核心是对数价格区间的平方和$$ \hat{\sigma}{parkinson} \sqrt{\frac{1}{4N\ln2}\sum{i1}^{N}\left(\ln\frac{H_i}{L_i}\right)^2} $$实现要点对最高价/最低价比值取自然对数乘以1/(4ln2)的系数进行标准化年化处理时乘以√252假设252个交易日import numpy as np def parkinson_volatility(data, high_col, low_col, window20, trading_days252): 计算Parkinson波动率 参数 data: 包含OHLC数据的DataFrame high_col: 最高价列名 low_col: 最低价列名 window: 滚动窗口大小 trading_days: 年化交易天数(默认252) 返回 波动率序列 log_hl np.log(data[high_col] / data[low_col]) rs (1.0 / (4.0 * np.log(2))) * log_hl**2 volatility rs.rolling(window).mean().apply(lambda x: np.sqrt(x * trading_days)) return volatility提示Parkinson估计量对价格极值特别敏感在流动性较差的市场中可能高估实际波动率。2.2 Garman-Klass波动率整合更多价格信息Garman和Klass(1980)扩展了Parkinson的方法引入开盘价和收盘价信息旨在提供更精确的波动率估计。其公式包含两个部分$$ \hat{\sigma}_{gk} \sqrt{\frac{1}{2N}\left[\sum\left(\ln\frac{H_i}{L_i}\right)^2 - 2(2\ln2-1)\sum\left(\ln\frac{C_i}{O_i}\right)^2\right]} $$算法优势同时利用价格区间和收盘变动信息理论效率是收盘价波动率的7倍左右对跳跃性波动有更好的捕捉能力def garman_klass_volatility(data, high_col, low_col, open_col, close_col, window20, trading_days252): 计算Garman-Klass波动率 参数 data: 包含OHLC数据的DataFrame high_col: 最高价列名 low_col: 最低价列名 open_col: 开盘价列名 close_col: 收盘价列名 window: 滚动窗口大小 trading_days: 年化交易天数 返回 波动率序列 log_hl np.log(data[high_col] / data[low_col]) log_co np.log(data[close_col] / data[open_col]) rs 0.5 * log_hl**2 - (2*np.log(2)-1) * log_co**2 volatility rs.rolling(window).mean().apply(lambda x: np.sqrt(x * trading_days)) return volatility2.3 Rogers-Satchell波动率处理非对称价格路径Rogers和Satchell(1991)进一步改进了波动率估计特别考虑了价格路径可能存在的非对称性。这在趋势性市场中尤为重要$$ \hat{\sigma}_{rs} \sqrt{\frac{1}{N}\sum\left[\ln\left(\frac{H_i}{C_i}\right)\ln\left(\frac{H_i}{O_i}\right) \ln\left(\frac{L_i}{C_i}\right)\ln\left(\frac{L_i}{O_i}\right)\right]} $$适用场景市场存在明显趋势时开盘跳空频繁的情况对涨跌不对称性敏感的策略def rogers_satchell_volatility(data, high_col, low_col, open_col, close_col, window20, trading_days252): 计算Rogers-Satchell波动率 参数 data: 包含OHLC数据的DataFrame high_col: 最高价列名 low_col: 最低价列名 open_col: 开盘价列名 close_col: 收盘价列名 window: 滚动窗口大小 trading_days: 年化交易天数 返回 波动率序列 log_hc np.log(data[high_col] / data[close_col]) log_ho np.log(data[high_col] / data[open_col]) log_lc np.log(data[low_col] / data[close_col]) log_lo np.log(data[low_col] / data[open_col]) rs log_hc * log_ho log_lc * log_lo volatility rs.rolling(window).mean().apply(lambda x: np.sqrt(x * trading_days)) return volatility3. 实战对比以沪深300指数为例让我们用实际数据对比这三种算法的表现。我们使用tushare获取沪深300指数的日线数据import tushare as ts import matplotlib.pyplot as plt # 获取沪深300指数数据 df ts.get_k_data(hs300, start2018-01-01, end2023-12-31) df df.set_index(date) # 计算各波动率 df[parkinson] parkinson_volatility(df, high, low, window20) df[garman_klass] garman_klass_volatility(df, high, low, open, close, window20) df[rogers_satchell] rogers_satchell_volatility(df, high, low, open, close, window20) df[close_to_close] close_to_close_volatility(df[close].pct_change(), window20) # 绘制对比图 plt.figure(figsize(12, 6)) plt.plot(df.index, df[parkinson], labelParkinson) plt.plot(df.index, df[garman_klass], labelGarman-Klass) plt.plot(df.index, df[rogers_satchell], labelRogers-Satchell) plt.plot(df.index, df[close_to_close], labelClose-to-Close) plt.title(HS300 Volatility Comparison (20-day window)) plt.legend() plt.grid() plt.show()从实证结果可以看到几个关键现象高阶算法普遍高于传统波动率三种方法估计的波动率通常比收盘价波动率高20-30%说明传统方法确实存在低估市场极端时期的差异在2020年3月市场剧烈波动期间Parkinson估计值最高反映出它对价格区间的敏感性平稳期的收敛在市场平稳时期三种估计值差异缩小4. 算法选择与策略应用指南不同的波动率算法适用于不同的交易场景下面通过对比表格总结关键特性特性ParkinsonGarman-KlassRogers-SatchellClose-to-Close使用数据H-LO-H-L-CO-H-L-CC计算复杂度低中中低跳跃敏感性高中中低趋势市场适应性一般较好优秀差效率(相对传统方法)5.2倍7.4倍6.5倍1倍策略应用建议高频与日内策略优先考虑Parkinson或Garman-Klass因其对日内波动敏感趋势跟踪系统Rogers-Satchell能更好捕捉趋势中的波动不对称性期权定价Garman-Klass通常能提供更稳定的波动率估计风险控制在极端市场条件下Parkinson可能提供更及时的风险信号# 波动率策略信号生成示例 def volatility_breakout_signal(data, volatility_typegarman_klass, window20, multiplier1.5): 波动率突破策略信号生成 参数 data: 包含价格和波动率的数据 volatility_type: 使用的波动率类型 window: 波动率计算窗口 multiplier: 波动率乘数 返回 交易信号(1:做多, -1:做空, 0:保持) volatility data[volatility_type] atr multiplier * volatility signals pd.Series(0, indexdata.index) signals[data[close] data[close].shift(1) atr] 1 signals[data[close] data[close].shift(1) - atr] -1 return signals注意实际应用中应考虑交易成本、滑点等因素简单的波动率突破策略可能需要进一步过滤才能获得稳定收益。5. 高级话题与优化方向对于希望进一步优化波动率模型的开发者可以考虑以下方向混合波动率模型def hybrid_volatility(data, weights[0.3, 0.4, 0.3]): 混合波动率估计 参数 weights: 对[Parkinson, Garman-Klass, Rogers-Satchell]的权重 parkinson parkinson_volatility(data, high, low) gk garman_klass_volatility(data, high, low, open, close) rs rogers_satchell_volatility(data, high, low, open, close) return weights[0]*parkinson weights[1]*gk weights[2]*rs波动率曲面建模对不同时间窗口的波动率进行三维可视化观察波动率的期限结构机器学习增强使用LSTM等模型学习波动率的非线性特征结合传统算法市场状态识别根据波动率特征自动识别市场状态平静、波动、极端# 市场状态识别示例 def market_state(volatility, thresholds[0.15, 0.25]): 基于波动率划分市场状态 参数 thresholds: [平静,波动]的阈值 返回 状态标签(0:平静, 1:波动, 2:极端) states pd.Series(1, indexvolatility.index) states[volatility thresholds[0]] 0 states[volatility thresholds[1]] 2 return states在实际项目中我发现Garman-Klass通常在大多数市场环境下提供最平衡的估计而Parkinson在需要快速响应市场波动变化时表现更好。Rogers-Satchell则在趋势明显的市场中展现出独特价值特别是在识别波动率聚集现象时。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…