GARCH模型与衍生品波动率实证:Python复现股价影响分析

发布时间:2026/10/13 15:47:57

GARCH模型与衍生品波动率实证:Python复现股价影响分析 简介面向金融工程学生、量化投资者及实证研究学者这份Python论文复现资料完整还原了衍生品使用对上市公司股价波动率影响的研究流程。内容涵盖金融数据预处理、年化波动率与贝塔系数计算、双向固定效应面板回归建模并深入拓展内生性处理滞后项工具变量、规模与行业异质性、中介效应路径、更换因变量及空间效应等稳健性检验以及预测和敏感性测试代码均配有逐步注释帮读者打通从原始财务数据到实证结论的完整链路。资源为单个docx文档体积仅28KB便于离线查阅与代码复制作者同时强调真实场景需以实际数据库替换示例数据避免结果失真。目前已有220人学习下载适合希望掌握金融面板数据分析、时间序列处理及Python实证研究范式的中高级学习者可直接参考其变量定义与模型设定开展自己的研究。1. 衍生品波动性实证这篇论文复现到底在做什么同样是业绩披露有的股票在股指期货持仓量放大后波动明显加剧有的却一路走平。这个现象背后是一个老问题衍生品交易到底在放大还是平抑股价波动这篇论文复现笔记就是把这类研究最常见的一套实证框架——用GARCH模型估计股价波动再把衍生品成交量和持仓量作为解释变量放进去检验——用Python完整跑通每一步都给代码和参数说明。适合想复现金融实证论文、想给量化策略加波动率预判维度的从业者也适合刚接触ARCH/GARCH但不知道怎么落地的人。这里不依赖Wind或Matlab只用开源Python库就能做完整条链路。2. 模型选型为什么实证研究都从GARCH(1,1)起步2.1 先确认波动率有聚集性ARCH效应检验做这篇复现的第一个卡点不是代码而是搞清楚你的被解释变量到底该用哪个模型。金融收益率序列的典型特征是波动聚集大涨大跌之后往往跟着更大的波动平稳之后又趋于安静。这意味着残差方差不是常数直接拿最小二乘回归去解释「波动率」本质上是在用一个错误的假设做统计推断——系数可能显著但标准误不可信。所以在建模之前我先对收益率序列跑一次ARCH-LM检验。这个检验的原假设是「残差不存在自回归条件异方差」也就是波动率没有聚集性如果p值小于0.05就拒绝原假设说明用GARCH类模型是有依据的。常见做法是用statsmodels的het_arch函数滞后阶数选5或10。这一步的结果决定后续整个模型路线不是走形式。2.2 GARCH(1,1)参数含义与平稳条件GARCH(1,1)的条件方差方程写作σ²ₜ ω α·ε²ₜ₋₁ β·σ²ₜ₋₁三个参数各有用处ω是长期平均方差的锚点α衡量上一期新息即意外的冲击对当期波动的影响β衡量上一期波动自身的惯性。αβ越接近1波动率越持久实际金融数据里αβ通常在0.95以上这就是为什么波动率在危机时会持续好几个月。在复现时我一般先跑这个基准模型。它有两个约束要注意α、β都必须大于0且αβ1才能保证条件方差平稳。如果估计结果里αβ超过1说明数据里有极端异常值或者样本太短不要急着把结果写进论文先回头清数据。这是GARCH系列里最容易翻车却最常被忽略的一点。2.3 衍生品变量打哪个方程均值方程还是方差方程研究设计上有个容易绕晕的选择衍生品交易量到底该放进均值方程还是方差方程。放进均值方程意思是衍生品交易量的变化会影响股票收益率本身放进方差方程意思是它影响的是收益率的不确定性也就是波动率。这篇标题既然问的是「对股价波动性的影响」核心解释变量就应该摆在方差这一侧。但在Python的开源生态里arch库的外生变量参数默认进的是均值方程直接传进去会导致解释变量放错了位置我还见过有人拿这个错误结果去答辩的。后面避坑章会专门说这个。实际操作中最常见的做法是两步法先用GARCH(1,1)估计出条件波动率序列再用衍生品成交量、持仓量对这条波动率序列做回归。这样既能回答「衍生品是否影响波动」又能配合控制变量做扩展对论文复现来说最透明也最好改。下面这个表是我常用的模型对比。模型条件方差设定适用场景在本复现中的角色GARCH(1,1)σ² ω αε²ₜ₋₁ βσ²ₜ₋₁波动聚集、对称波动基准模型GARCH-X一步法方差方程加入外生变量直接估计衍生品影响Python支持受限用两步法替代EGARCHlnσ² ω α(z−E两步回归先GARCH取σ再OLS论文复现、加控制变量本复现核心方案2.4 为什么不用已实现波动率直接做回归有的论文会用日收益率的平方或日内高频数据算已实现波动率RV再直接用OLS回归。这样省去了GARCH估计看起来更简单但代价是丢掉条件波动率里「信息逐步释放」的过程且单一日的平方收益噪声极大。GARCH的好处是它把波动率看成一个随时间更新、能从前一期状态平滑递推的变量而不是把每一天的波动割裂对待。论文复现里采用两步法——先GARCH提取条件波动率再做线性回归——既能保留GARCH对波动的平滑估计又能灵活地加入衍生品变量和控制变量这是我认为性价比最高的路径。3. 数据准备与清洗先让现货和期货数据对齐再谈模型3.1 数据源与字段设计从哪里拿衍生品和现货数据这个方向的实证通常需要两类数据标的价格序列指数或个股和对应的衍生品交易数据期货成交量、持仓量、期权持仓等。数据源上常见做法是TuShare Pro、AkShare这类Python接口机构用户直接用Wind或Choice。注意接口权限和数据频率要提前确认日频数据足够支撑GARCH(1,1)没必要一上来就碰分钟数据。需要准备的核心字段如下表数据集关键字段频率用途现货日线close、volume、return日频计算收益率、波动率被解释变量期货日线volume、open_interest日频构造衍生品流动性/持仓变量市场指数close日频控制市场整体波动无风险利率年化值日频/周频计算超额收益可选我建议把现货和衍生品数据分开读入不要手工拼接Excel因为后面要对齐交易日历分开读更干净。3.2 收益率和衍生品变量怎么构造先做干净再进模型拿到日线数据后先算收益率。这里有两个选择简单收益率用pct_change()对数收益率用np.log().diff()。两者的差异在日频尺度上很小但对数收益率在时间上加总更自然金融实证偏好用它。复现代码里我会同时写上方便你对比。衍生品变量方面不要直接用成交量原始数值进模型——成交量的量纲和价格波动率差了好几个数量级会让后面的数值优化非常不稳定。常见做法是取对数或对数差分我一般用对数成交量的差分它代表成交量的变化率和波动率的经济含义更好对应。import pandas as pd import numpy as np # 假设 df_spot 是现货日线df_future 是期货日线都是date索引升序 df_spot[ret] df_spot[close].pct_change() * 100 # 百分比收益率 df_spot[log_ret] np.log(df_spot[close] / df_spot[close].shift(1)) * 100 # 衍生品变量对数成交量变化率 df_future[log_vol] np.log(df_future[volume]) df_future[d_log_vol] df_future[log_vol].diff() # 成交量变化率 # 对齐并保留有效样本 df pd.concat([ df_spot[[ret, log_ret]], df_future[d_log_vol] ], axis1, joininner) df df.dropna() print(df.head())这里的关键点是pct_change()第一行一定为NaNdiff()同理dropna()之后样本量通常会少一行到两行这是正常的。另一个细节是收益率乘以100让数值从0.001量级变成0.1量级GARCH估计时优化器更容易收敛。这种线性缩放不会改变显著性和符号方向。3.3 交易日历对齐一个容易被忽视的坑现货和期货的交易日历并不完全一致。股指期货在节假日调休时可能照常交易而现货休市反之现货有数据但期货没有。如果直接把两份DataFrame按位置拼接会让第n天的收益率对应第n−1天的成交量整个回归的逻辑就错了。我惯用的做法是pd.concat(..., joininner)相当于只保留两边都有的交易日。如果要用align或merge务必指定howinner不要用默认的外连接否则NaN会被dropna静默清掉但样本区间可能已经悄悄变了。清完数据后检查一下索引长度和日期首尾确认一下你的样本覆盖哪段时间。这一步做完数据层面才会进入建模环节。4. 核心复现代码从ARCH检验到衍生品波动率回归4.1 ARCH-LM检验给GARCH模型找依据在跑GARCH之前先用ARCH-LM检验确认序列确实存在条件异方差。我用的是statsmodels的het_arch它输出两组统计量LM统计量和F统计量两者结论通常一致。滞后阶数nlags我一般取5对应检验最近5天的波动率是否互相影响。from statsmodels.stats.diagnostic import het_arch # 取对数收益率去掉NaN ret_series df[log_ret].dropna() # ARCH-LM检验滞后5阶 lm_stat, lm_pvalue, f_stat, f_pvalue het_arch(ret_series, nlags5) print(fLM stat{lm_stat:.3f}, p-value{lm_pvalue:.4f}) print(fF stat{f_stat:.3f}, p-value{f_pvalue:.4f}) if lm_pvalue 0.05: print(拒绝原假设存在ARCH效应适合用GARCH建模) else: print(无法拒绝原假设波动率聚集性不明显谨慎使用GARCH)het_arch返回四个值顺序分别是LM统计量、LM的p值、F统计量、F的p值。我第一次用的时候就因为记错了返回顺序把p值当统计量看了半天。如果p值大于0.05先别急着否定模型——检查一下样本里是否含有涨跌停导致的连续零收益日这类数据会稀释ARCH效应。4.2 基准GARCH(1,1)提取条件波动率序列ARCH检验通过后我用arch库估计GARCH(1,1)。这里的meanAR, lags1表示条件均值方程中加入一阶自回归项因为日收益率常有轻微的一阶自相关尤其在流动性不太好的标的上。如果复现的论文没有提均值方程设定直接用meanConstant也完全说得通。from arch import arch_model # 估计基准GARCH(1,1) model_base arch_model( ret_series, meanAR, lags1, # 均值方程: AR(1) volGARCH, p1, q1, # 方差方程: GARCH(1,1) distnormal # 正态分布 ) res_base model_base.fit(dispoff) print(res_base.summary())dispoff用来关掉优化过程的逐轮输出否则控制台会被刷屏。如果出现ConvergenceWarning不要忽略这通常意味着数据中有极端值或参数初值不合适。我一般会先对收益率做1%和99%分位的缩尾处理把极端日剔除掉再重新估计。估计完成后把条件波动率序列取出来保存它是后面两步回归的被解释变量。# 提取条件波动率百分比形式 df[cond_vol] res_base.conditional_volatility # 看一眼波动率的统计特征 print(df[cond_vol].describe())conditional_volatility是arch库在估计结束后直接提供的属性代表每一天模型估计出的条件标准差。数据里最近一次市场大幅波动期间这个值会明显抬升可以简单画一下图确认走势是否符合直觉。4.3 衍生品变量对条件波动率的回归方向与显著性条件波动率序列拿到后核心回归就很简单了。被解释变量是GARCH提取的条件波动率解释变量是衍生品成交量的对数变化率同时加上市场收益率和现货自身成交量作为控制变量。为什么要控制这两个变量因为市场整体波动会同时影响衍生品成交量和现货波动率不控制的话衍生品变量的系数会被高估。import statsmodels.api as sm # 构造回归数据 df_reg df.copy() # 控制变量市场指数的对数收益率假设已算好 df_reg[mkt_ret] mkt_ret.align(df_reg, joininner)[0] # 核心解释变量衍生品成交量对数变化率已经对齐 X_cols [d_log_vol, mkt_ret, d_log_spot_vol] X sm.add_constant(df_reg[X_cols]) y df_reg[cond_vol] # OLS回归使用HAC稳健标准误 ols sm.OLS(y, X).fit(cov_typeHAC, cov_kwds{maxlags: 10}) print(ols.summary()) # 提取关键结果 coef ols.params[d_log_vol] pvalue ols.pvalues[d_log_vol] print(f衍生品成交量变化率系数: {coef:.4f}, p值: {pvalue:.4f})回归里我用了cov_typeHAC也就是Newey-West异方差自相关稳健标准误。因为条件波动率序列本身有很强的自相关性普通标准误会严重低估不确定性导致t值虚高。这是做波动率回归时最常被忽略的一步审稿人和导师都会盯这个。d_log_spot_vol是现货自身成交量对数变化率用来剔除「股票自身交易活跃度上升导致波动率上升」的混淆效应。加上这个控制变量后d_log_vol的系数才能更干净地反映衍生品交易的边际影响。4.4 结果解读系数符号与论文报告格式现在到了整个复现最容易被过度解读的地方。衍生品变量的系数显著为正论点是「衍生品交易放大了股价波动」显著为负则说明衍生品交易起到了平抑波动的作用。但有一点我必须提醒相关性不等于因果性。论文复现里通常还需要补充两个检验才能让故事站得住一是格兰杰因果检验看衍生品成交量的滞后项是否对波动率有预测能力二是把解释变量换成滞后一期避免同期双向因果的干扰。这两个检验第6章会展开。做回归时把系数、稳健t值、p值和样本量记录到一张结果表里这是金融论文的标准报告格式后面写论文直接能用。5. 复现避坑清单数据、模型、代码三层翻车现场5.1 日期错位收益率和衍生品数据差一天现象回归结果里衍生品变量系数方向跟论文完全相反检查代码逻辑也没发现错误。原因把两份DataFrame按位置直接concat没有做日期索引对齐。现货和期货的交易日并不同步遇到调休日第n行的收益率对应的是第n−1行的衍生品数据。解决用pd.concat(..., joininner)或merge(..., ondate, howinner)对齐后再构造衍生品变量。另外衍生品变量的diff()要在对齐之前基于自身原始序列计算不要在对齐后跨行做差分否则会把不同交易日的成交量错位算成同一期变化。5.2 pct_change 首值缺失导致样本量悄悄变少现象建模时总报样本量不足或者GARCH估计结果与论文差异很大。原因pct_change()和diff()都会把首行变成NaN连续多个衍生品变量的diff()会让前几行全变成缺失值dropna()之后样本量比预期少了好几行。这在样本量500以下时影响尤其明显。解决在做任何差分前先打印数据长度dropna()后再打印长度对比少了多少行。如果时间序列有特殊事件如期货合约换月还要把换月当天的异常成交量直接剔除而不是靠差分硬算。5.3 GARCH不收敛数值尺度过小是元凶现象arch库报ConvergenceWarning或者估计出的ω为负、αβ大于1。原因收益率如果以小数形式0.001级别输入方差方程的ω和α会在10的负几次方尺度上优化数值梯度过小BFGS优化器很容易停在边界。高频数据里这个问题更明显。解决收益率乘以100百分比形式再做估计这是一行代码的事效果立竿见影。如果还不收敛检查是否存在涨跌停或异常跳空日用分位数缩尾处理后再试。还没用的话把fit的method换成nmNelder-Mead跑一轮再把结果作为初值传给BFGS。5.4 把外生变量直接塞进 arch 的 x 参数结果全错现象参考某些示例代码把df[[d_log_vol]]传给arch_model(..., x...)输出的summary里多了一个均值方程系数但方差方程里没有衍生品变量的影子。原因arch库的x参数是设计给均值方程用的外生变量放进条件均值模型后就成了「用衍生品成交量预测收益率」而不是「检验衍生品对波动性的影响」。方向偏了结论自然不对。解决想检验波动性影响就用两步法——先用GARCH提取条件波动率再对衍生品变量做回归。这是开源库能力边界内最稳的方案。我自己的血泪经验是拿到一个库先查文档确认参数归属方程别凭函数名猜测。5.5 复现结果和论文方向相反先查样本区间和数据源现象代码逻辑没问题但衍生品变量的符号和论文显著相反。原因样本区间不同。衍生品市场在不同发展阶段对现货波动的影响方向可能发生结构性变化比如上市初期的市场引入期和成熟期结论可能完全不同。数据源不同也会导致同一时点的成交量数值有口径差异。解决先把论文里的样本起止时间、合约选择主连还是当月连续、数据口径看清楚逐一核对。这个步骤没法省所谓「论文复现」很大程度上是复现别人的数据处理口径而不是复现自己的直觉。6. 进阶验证怎么让结论从「显著」变成「稳健」6.1 换波动率代理变量从条件波动率到已实现波动率两步法的一条被诟病之处是完全依赖GARCH模型的条件波动率。如果GARCH设定有偏结论可能跟着偏。我习惯用已实现波动率做稳健性检验日频数据下可以用收益率平方作为简单近似有日内数据的话直接用高频收益率平方和。把GARCH条件波动率替换成这个变量重跑一遍回归如果衍生品系数的符号和显著性基本一致核心结论才算立得住。6.2 换EGARCH模型看非对称效应衍生品对波动率的影响可能不是对称的——价格上涨时的波动响应和下跌时不一样。EGARCH模型允许好消息和坏消息对波动率产生不同影响其对数形式还天然保证方差为正规避了GARCH参数非负约束的麻烦。如果论文里讨论了杠杆效应这一步几乎是必做的。用arch库把volEGARCH跑一遍对比一下杠杆系数是否显著。6.3 滚动窗口检验看结论是否只属于某段时期这是我最常用的一招把样本按2年窗口滚动切分对每个子窗口重复两步法估计把衍生品系数画成时间序列图。如果系数符号在多数窗口稳定说明结论有时效性但大体可靠如果符号频繁翻转那倒也不是坏事——说明衍生品和价格波动的关系本身就随市场状态变化反而是个值得写进论文里的增量发现。滚动窗口会让计算量翻好几倍我一般优先保证基准模型结果正确再跑这一段。做实证分析这么多年我的习惯是多怀疑数据、多怀疑设定少怀疑自己最后得出的「灵感」——大多数看似反常的结论排查下来都是某个预处理步骤的小失误。希望这篇笔记能帮你把每一步的坑提前避开顺利跑通自己的复现结果。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/13 15:42:50

GPU底层架构与部署实战:从SIMT、CUDA到集群调度与故障排查

“又是显卡!这周已经第三次有人拿着报错来找我了。”一个老朋友发来截图,是某大模型推理服务在调度GPU时提示 “GPU / 加速器不受支持 (可用的: CUDA)” ,另一个群里的消息是 Chrome 右上角弹出的 “GPU process crashed” 通知。这年头&…

2026/10/13 15:42:50

工商业储能系统投资回报分析与优化策略

1. 工商储投资回报分析概述工商业储能系统作为分布式能源的重要组成部分,正在成为企业降低用电成本、参与电力市场的重要工具。一套500kWh的典型工商业储能系统,初始投资约80-120万元,通过峰谷套利、容量电费管理等模式,通常可在5…

2026/10/13 17:03:24

pdf.js 1.9.426 老版本实战:离线PDF预览与中文渲染避坑指南

简介:pdf.js 1.9.426 是一份纯 JavaScript 实现的免费开源 PDF 阅读组件,面向需要在网页中嵌入 PDF 预览功能的开发者,尤其适合不想让用户额外安装插件的前端项目。它支持缩放、打印、查找等常用操作,兼容火狐、谷歌及 IE9 以上主…

2026/10/13 17:03:24

STM32三轴增稳云台源码解析:姿态解算与PID调参实战

简介:这份资源是Simple Bgc开源项目的完整源码,面向从事三轴增稳云台开发、嵌入式控制学习以及STM32工程实践的开发者。该项目源自俄版云台方案,早期基于Arduino平台,后续版本转向STM32控制器,可用于研究云台姿态解算、…

2026/10/13 17:03:24

Windbg调试手册:从符号表配置到崩溃现场定位的实用指南

简介:《Windbg中文调试手册》是一份基于微软官方WinDbg文档整理的中文PDF指南,面向Windows驱动开发者、系统程序员及IT运维人员,用于解决故障转储分析、实时内核与用户态调试、寄存器及内存检查等调试难题。手册系统覆盖工具安装与自动更新、…

2026/10/13 17:03:24

基于大数据的共享单车数据分析与建模实践

1. 毕业设计选题拆解:共享单车数据分析,到底在做什么每年毕业季都会有不少同学来问我,选什么题目既好通过又能拿高分。如果要做大数据方向的题目,我强烈建议可以考虑“基于大数据的共享单车数据分析”这类方向,它非常经…

2026/10/13 17:03:24

Yarn 包管理器架构解析:CLI、解析器与缓存机制

1. 从一个让人抓狂的依赖安装说起如果你写过前端项目,大概率经历过这样的场景:早上到公司,拉下最新代码,删掉node_modules,敲下npm install,然后去泡了杯咖啡、刷了会儿手机、跟同事聊了聊昨天的球赛&#…

2026/10/13 16:58:21

化学方程式解析器设计:Python递归下降实现原理与工程实践

1. 项目概述:一道考察能力边界的算法题,远不止“写个Python程序”那么简单“CCF CSP 201912-3 化学方程式”——这个标题在算法刷题圈里,是不少准备CSP认证、蓝桥杯或校招笔试的同学绕不开的一道“分水岭”。它不像前两题那样靠模拟就能拿下&…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/13 0:04:41

基于Triton部署YOLO目标检测:从训练脚本到线上服务

简介:这份资源面向希望将目标检测模型落地到生产环境的深度学习开发者与算法工程师,聚焦于用 Triton Inference Server 部署 YOLOv9 的完整实战方案,解决从训练权重到线上推理服务之间的工程化难题。压缩包共 16 个文件,约 886KB&…

2026/10/13 0:04:41

手把手教你云端部署Qwen-Image-2.1:从GPU选型到在线文生图服务

Qwen-Image-2.1 这个开源的图像生成模型,最近在内容创作和 AI 应用圈子里热度相当高。它属于通义 Qwen 系列里的视觉生成分支,让我眼前一亮的是它对中文长文本的理解能力——以前用那些老方案生成带中文文字的图,十个里九个是“乱码印刷体”&…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑