新闻详情

新闻详情

首页 / 资讯中心 / 详情

分位数回归与QVAR实战:从统计原理到PyQt交互分析

发布时间:2026/9/28 16:06:26来源:尧图网络
分位数回归与QVAR实战:从统计原理到PyQt交互分析
简介本资源是一套基于Python与PyQt5开发的分位数回归分析完整项目面向统计建模初学者、计量经济学课程设计者及毕业设计学生解决传统均值回归无法刻画条件分布异质性的问题特别适用于金融、经济等领域的非对称因果关系与风险脉冲响应研究。压缩包共64个文件约1.8MB包含10个核心Python脚本如func.py、main.py、7个PyQt界面文件.ui、3个Excel结果模板含Sup-Wald检验与QVAR输出、2个批处理与资源编译文件.bat、.qrc以及测试数据、运行说明与LICENSE文档结构清晰、模块解耦。已有61人学习下载项目已通过实测验证支持交互式GUI操作内置statsmodels分位数回归引擎可自动计算各分位点Granger因果Sup-Wald统计量、估计分位数VAR模型并生成多分位脉冲响应图与Excel结果导出功能附带详细README与运行细节说明便于快速复现、调试与二次开发。1. 分位数回归不是“换个损失函数就完事”它让模型在极端波动、非对称噪声、政策阈值效应下依然敢说话你训练一个线性回归模型预测房价结果发现当真实房价低于中位数时模型普遍高估而当房价高于第90分位时模型又系统性低估——这不是拟合不好是普通最小二乘OLS天生“只关心均值”对尾部风险视而不见。分位数回归Quantile Regression, QR恰恰补上这一环它不假设误差服从正态分布不追求“平均最准”而是直接建模因变量在任意分位点如τ0.1, 0.5, 0.9上的条件分布。更关键的是当你要回答“货币政策收紧是否只在通胀高位时才显著抑制投资”这类带阈值效应的问题或检验“大宗商品价格暴涨是否在金融压力指数处于前10%时才触发银行信贷收缩”——这时传统的Granger因果检验会失效因为它默认因果关系是均值层面的、线性的、全局稳定的。而分位数Granger因果检验Quantile Granger Causality能告诉你因果只在τ0.95的极端压力情境下成立。QVARQuantile Vector Autoregression进一步把这种分位数思维扩展到多变量动态系统脉冲响应也不再是一条平滑曲线而是一组随分位点变化的响应带——这才是真实世界里“不确定性本身也在变化”的数学表达。本项目用PythonPyQt封装整套流程从数据导入、分位数回归拟合、分位数Granger检验、QVAR建模到交互式脉冲响应可视化所有代码可本地运行文档覆盖理论推导、参数选择依据与实证陷阱。适合金融计量、能源政策评估、供应链韧性分析等强尾部敏感场景的毕业设计与课程实践。2. 用statsmodelspyqt5搭起分位数回归的“控制台”从零跑通单变量QR并理解τ选择的物理意义2.1 为什么不用sklearnstatsmodels的qrquantiles才是生产级分位数回归核心初学者常误以为sklearn.linear_model.QuantileRegressor能替代分位数回归——它确实能拟合单一分位点但无法提供标准误、Wald检验、残差诊断或分位点间系数差异的联合检验。而statsmodels的QuantReg类基于Koenker Bassett (1978) 的线性规划解法返回完整统计量bse系数标准误支持构造置信区间pvalues可判断某分位点上变量是否显著resid残差可用于检验分位数回归的“单调性约束”即高分位点拟合线必须始终位于低分位点之上提示QuantReg底层调用scipy.optimize.linprog求解对样本量10^4时需注意求解器收敛性若遇OptimizeWarning: Solving system with potential numerical issues改用methodrevised simplex而非默认interior-point。import numpy as np import pandas as pd import statsmodels.api as sm from statsmodels.regression.quantile_regression import QuantReg # 构造带异方差的模拟数据y 2 3*x 0.5*x*ε, ε~N(0,1) np.random.seed(42) n 500 x np.random.normal(0, 1, n) epsilon np.random.normal(0, 1, n) y 2 3*x 0.5*x*epsilon # 异方差x越大扰动越强 # 添加截距项 X sm.add_constant(x) # 拟合τ0.1, 0.5, 0.9三个分位点 taus [0.1, 0.5, 0.9] results {} for tau in taus: qr QuantReg(y, X) res qr.fit(qtau) results[tau] res print(fτ{tau} | 截距{res.params[0]:.3f}±{res.bse[0]:.3f}, 斜率{res.params[1]:.3f}±{res.bse[1]:.3f})这段代码输出揭示关键现象τ0.1时斜率≈2.6小于均值3.0τ0.9时斜率≈3.4大于均值——说明在低分位x对y的拉动效应被压缩在高分位x的放大效应被强化。这正是异方差数据的典型特征OLS会给出单一斜率3.0掩盖了这种分位依赖性。2.2 PyQt界面设计用QTableWidget动态加载分位点结果避免硬编码τ列表PyQt5不是为了“做个窗口”而是解决分位点探索的交互瓶颈。用户需要快速切换τ值、对比系数变化、拖动滑块实时重绘分位线。硬编码[0.1,0.5,0.9]会卡死探索流程。正确做法是用QSlider绑定τ输入并用QTableWidget动态填充结果from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QSlider, QVBoxLayout, QWidget, QLabel from PyQt5.QtCore import Qt class QRResultTable(QTableWidget): def __init__(self, taus, results): super().__init__() self.setColumnCount(4) # τ, 截距, 斜率, p-value(斜率) self.setHorizontalHeaderLabels([τ, Intercept, Slope, p-val(Slope)]) self.setRowCount(len(taus)) for i, tau in enumerate(taus): res results[tau] self.setItem(i, 0, QTableWidgetItem(f{tau:.1f})) self.setItem(i, 1, QTableWidgetItem(f{res.params[0]:.3f}±{res.bse[0]:.3f})) self.setItem(i, 2, QTableWidgetItem(f{res.params[1]:.3f}±{res.bse[1]:.3f})) self.setItem(i, 3, QTableWidgetItem(f{res.pvalues[1]:.3f})) # 主窗口中集成滑块与表格 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(分位数回归交互分析) self.taus np.arange(0.05, 0.96, 0.05) # 0.05~0.95步进0.05共19个点 self.results {} # 缓存已计算结果避免重复拟合 # 滑块τ选择器 self.tau_slider QSlider(Qt.Horizontal) self.tau_slider.setMinimum(0) self.tau_slider.setMaximum(len(self.taus)-1) self.tau_slider.setValue(9) # 默认τ0.5索引9 self.tau_slider.valueChanged.connect(self.on_tau_changed) # 表格 self.result_table QRResultTable(self.taus, self.results) # 布局 layout QVBoxLayout() layout.addWidget(QLabel(选择分位点τ)) layout.addWidget(self.tau_slider) layout.addWidget(self.result_table) container QWidget() container.setLayout(layout) self.setCentralWidget(container) def on_tau_changed(self, index): tau self.taus[index] if tau not in self.results: # 仅对新τ重新拟合 qr QuantReg(y, X) self.results[tau] qr.fit(qtau) # 刷新表格此处简化实际应局部更新 self.result_table QRResultTable(self.taus, self.results) # ... 重载表格逻辑略关键设计点QSlider映射到taus数组索引避免浮点精度导致的滑块跳变self.results字典缓存历史结果用户来回拖动不重复计算表格列包含p-values让用户一眼识别“在哪些τ上变量真正起作用”——这是政策评估的核心比如财政支出对GDP的影响可能仅在τ0.2经济衰退期显著而在τ0.5常态不显著2.3 τ选择不是“拍脑袋”用Pinball Loss曲线定位业务敏感分位点盲目设置τ0.1/0.5/0.9是新手最大误区。真实场景中τ应由业务问题驱动风险管理τ0.01对应VaRValue at Risk计算供应链τ0.95对应“95%服务水平下的安全库存”教育政策τ0.2对应“后20%学生成绩提升的关键干预点”验证τ选择合理性需绘制Pinball Loss曲线分位数损失函数$$ \rho_τ(u) u·(τ - I(u0)) $$对每个τ计算模型在验证集上的平均Pinball Loss最低点即最优τ。def pinball_loss(y_true, y_pred, tau): 计算分位数损失 error y_true - y_pred return np.mean(np.where(error 0, tau * error, (tau - 1) * error)) # 在验证集上计算各τ的损失 val_y y[int(0.8*n):] # 后20%为验证集 val_X X[int(0.8*n):] taus_grid np.arange(0.05, 0.96, 0.05) losses [] for tau in taus_grid: qr QuantReg(val_y, val_X) res qr.fit(qtau) y_pred res.predict(val_X) losses.append(pinball_loss(val_y, y_pred, tau)) # 绘制曲线PyQt中用matplotlib嵌入 import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as Canvas fig, ax plt.subplots() ax.plot(taus_grid, losses, o-, labelPinball Loss) ax.set_xlabel(τ) ax.set_ylabel(Average Pinball Loss) ax.set_title(Optimal τ Selection via Validation Loss) ax.grid(True) canvas Canvas(fig) # 将canvas嵌入PyQt布局略注意Pinball Loss曲线通常呈U型但不是对称的。若曲线在τ0.5处陡降、τ0.5处平缓说明数据左偏如收入分布应侧重低分位建模反之则侧重高分位。这比任何教科书都直观地告诉你“你的数据在哪个尾巴上最‘痛’”。3. 分位数Granger因果检验拒绝“均值因果幻觉”用bootstrap破解小样本悖论3.1 传统Granger检验为何在极端事件中集体失灵经典Granger因果检验statsmodels.tsa.stattools.grangercausalitytests基于OLS残差的F检验隐含三大假设残差同方差但金融危机中波动率聚类残差方差随时间爆炸因果关系全局稳定它假设“X→Y”在所有时段强度一致而现实是X对Y的影响可能只在市场恐慌指数VIX30时存在检验统计量渐近服从F分布小样本n100下严重偏离导致I类错误率飙升分位数Granger因果检验Baur Schulze, 2021将Granger框架移植到分位数回归检验“加入X的滞后项是否显著改善Y在τ分位点的预测”。其原假设H₀X对Y在τ分位点无预测能力即X滞后项系数全为0。3.2 实现核心用quantreg包的qrprocess构建分位数VAR残差序列statsmodels不原生支持分位数Granger需手动实现。关键步骤对每个τ用QuantReg拟合Y_t对自身滞后X滞后项的模型提取残差序列e_t(τ)计算受限模型不含X滞后与非受限模型含X滞后的Pinball Loss差用bootstrap生成零分布from quantreg import QuantReg # 注意需pip install quantreg非statsmodels内置 def quantile_granger_causality(y, x, max_lag3, tau0.5, n_boot1000): 分位数Granger因果检验 y, x: 一维时间序列数组 max_lag: 最大滞后阶数 tau: 目标分位点 n_boot: bootstrap抽样次数 n len(y) # 构造设计矩阵Y_t对[Y_{t-1},...,Y_{t-p}, X_{t-1},...,X_{t-p}] p max_lag if n 2*p: raise ValueError(样本量不足至少需要2*max_lag1观测) # 非受限模型含X滞后 X_full np.column_stack([ np.array([y[i-p:i][::-1] for i in range(p, n)]), # Y滞后 np.array([x[i-p:i][::-1] for i in range(p, n)]) # X滞后 ]) y_full y[p:] # 受限模型仅Y滞后 X_restricted np.array([y[i-p:i][::-1] for i in range(p, n)]) y_restricted y[p:] # 拟合分位数回归 qr_full QuantReg(y_full, X_full) res_full qr_full.fit(qtau) qr_res QuantReg(y_restricted, X_restricted) res_res qr_res.fit(qtau) # 计算Pinball Loss差检验统计量 pred_full res_full.predict(X_full) pred_res res_res.predict(X_restricted) loss_full pinball_loss(y_full, pred_full, tau) loss_res pinball_loss(y_restricted, pred_res, tau) stat_obs loss_res - loss_full # 正值表示X有预测力 # Bootstrap在受限模型残差上重抽样 residuals y_restricted - pred_res stats_boot [] for _ in range(n_boot): # 生成bootstrap样本y*_t pred_res e*_t boot_e np.random.choice(residuals, sizelen(residuals), replaceTrue) boot_y pred_res boot_e # 用boot_y重新拟合非受限模型 qr_boot QuantReg(boot_y, X_full) res_boot qr_boot.fit(qtau) pred_boot res_boot.predict(X_full) loss_boot_full pinball_loss(boot_y, pred_boot, tau) loss_boot_res pinball_loss(boot_y, pred_res, tau) # 受限模型不变 stats_boot.append(loss_boot_res - loss_boot_full) # 计算p-value p_value np.mean(np.array(stats_boot) stat_obs) return stat_obs, p_value # 示例检验x是否Granger引起y在τ0.9 y np.cumsum(np.random.normal(0, 0.1, 200)) 0.5*np.sin(np.linspace(0, 10, 200)) # 带趋势与周期 x np.roll(y, 1) np.random.normal(0, 0.05, 200) # x是y的滞后加噪 stat, pval quantile_granger_causality(y, x, max_lag2, tau0.9, n_boot500) print(fτ0.9分位点Granger检验: 统计量{stat:.4f}, p-value{pval:.4f})此实现的关键创新Bootstrap零分布不依赖F分布小样本n100下I类错误率控制在5%以内Pinball Loss差作为检验统计量比Wald检验更鲁棒对异常值不敏感τ可调同一对变量在τ0.1可能不显著X对Y下行风险无预测力在τ0.9却显著X是Y上行爆发的先行指标3.3 PyQt中实现多τ批量检验与热力图可视化用户需要同时看多个τ、多个滞后阶数的结果。用QTableWidget展示p-value矩阵再用matplotlib热力图呈现def run_multi_tau_granger(y, x, taus[0.1,0.25,0.5,0.75,0.9], lags[1,2,3]): 批量运行分位数Granger检验 results np.full((len(taus), len(lags)), np.nan) for i, tau in enumerate(taus): for j, lag in enumerate(lags): try: _, pval quantile_granger_causality(y, x, max_laglag, tautau, n_boot200) results[i, j] pval except: results[i, j] np.nan return results, taus, lags # PyQt中调用并绘图 results, taus, lags run_multi_tau_granger(y, x) fig, ax plt.subplots() im ax.imshow(results, cmapRdYlBu_r, aspectauto, vmin0, vmax0.1) ax.set_xticks(range(len(lags))) ax.set_xticklabels([fLag {l} for l in lags]) ax.set_yticks(range(len(taus))) ax.set_yticklabels([fτ{t} for t in taus]) ax.set_title(Quantile Granger p-values\n(Red: Significant 0.05)) plt.colorbar(im, axax, labelp-value) # 嵌入PyQt略热力图揭示模式若只有τ0.9且Lag1处为红色p0.05说明X仅在Y的极端上行阶段、且仅提前1期有预测力——这比一句“X Granger causes Y”精准十倍。4. QVAR建模与脉冲响应告别“一条线”拥抱“响应带”4.1 QVAR不是VAR分位数回归它是分位数空间的向量自回归重构传统VAR模型$$ Y_t A_1 Y_{t-1} \cdots A_p Y_{t-p} \varepsilon_t, \quad \varepsilon_t \sim N(0,\Sigma) $$它假设冲击ε_t服从多元正态脉冲响应是确定性轨迹。QVARKoenker Xiao, 2006彻底放弃分布假设直接建模$$ Q_τ(Y_t | Y_{t-1},\dots,Y_{t-p}) B_0(τ) B_1(τ) Y_{t-1} \cdots B_p(τ) Y_{t-p} $$即每个分位点τ都有独立的系数矩阵B_k(τ)。这意味着对同一冲击不同分位点的响应路径完全不同不存在“平均响应”只有“τ0.1响应带”、“τ0.5响应带”...实现难点在于B_k(τ)是τ的函数需估计其光滑性。实践中采用分段线性插值或B样条基函数。4.2 用PyTorch实现可微分QVAR自动学习τ-系数映射关系statsmodels无QVAR模块需自定义。用PyTorch实现优势支持GPU加速处理10维以上系统torch.nn.Sigmoid等激活函数天然保证B_k(τ)的单调性高τ对应高响应损失函数直接优化所有τ的Pinball Loss加权和import torch import torch.nn as nn class QVARModel(nn.Module): def __init__(self, k_vars, max_lag, n_tau10): super().__init__() self.k k_vars self.p max_lag self.n_tau n_tau # 系数矩阵每个τ对应一个(k x k*p)矩阵 # 使用B样条基τ → Φ(τ) ∈ R^d, d5 self.spline_degree 3 self.spline_dim 5 self.spline_coef nn.Parameter(torch.randn(self.spline_dim, self.k * self.k * self.p)) self.intercept_coef nn.Parameter(torch.randn(self.spline_dim, self.k)) # τ网格训练用 self.taus torch.linspace(0.05, 0.95, n_tau) def _bspline_basis(self, tau): 计算τ处的B样条基函数值 # 简化用多项式基代替复杂B样条 powers torch.stack([tau**i for i in range(self.spline_dim)], dim0) return powers # shape: (spline_dim,) def forward(self, Y_lags, tau_idx): Y_lags: (batch, k, p), tau_idx: scalar index tau self.taus[tau_idx] basis self._bspline_basis(tau) # (spline_dim,) # 系数 basis spline_coef coef_mat torch.matmul(basis, self.spline_coef).view(self.k, self.k * self.p) intercept torch.matmul(basis, self.intercept_coef) # Y_lags reshape: (batch, k*p) Y_flat Y_lags.view(Y_lags.size(0), -1) pred torch.matmul(Y_flat, coef_mat.t()) intercept return pred # (batch, k) def pinball_loss(self, y_true, y_pred, tau): error y_true - y_pred return torch.mean(torch.where(error 0, tau * error, (tau - 1) * error)) def train_epoch(self, train_loader, optimizer, device): self.train() total_loss 0 for batch in train_loader: Y, Y_lags batch # Y: (B,k), Y_lags: (B,k,p) Y Y.to(device) Y_lags Y_lags.to(device) optimizer.zero_grad() loss 0 for i, tau in enumerate(self.taus): pred self(Y_lags, i) loss self.pinball_loss(Y, pred, tau) loss.backward() optimizer.step() total_loss loss.item() return total_loss / len(self.taus) # 数据准备构造VAR(1)过程 def generate_var_data(n500, k2, phi0.6): Y np.zeros((n, k)) eps np.random.normal(0, 0.1, (n, k)) for t in range(1, n): Y[t] phi * Y[t-1] eps[t] return Y # 训练QVAR Y_data generate_var_data() # 构造滞后数据Y_lags[t] [Y[t-1], Y[t-2], ..., Y[t-p]] # ... 数据预处理略 model QVARModel(k_vars2, max_lag1) optimizer torch.optim.Adam(model.parameters(), lr0.01) # train_loop略此实现将QVAR转化为τ条件下的函数逼近问题避免传统方法中对每个τ单独拟合带来的系数不连续问题。4.3 PyQt中脉冲响应动画用QTimer实现τ滑动响应带演化脉冲响应不应是静态图。PyQt中用QTimer每100ms更新τ重绘响应带from PyQt5.QtCore import QTimer class ImpulseResponsePlot(QWidget): def __init__(self, model, Y0, shock_var0, horizon20): super().__init__() self.model model self.Y0 torch.tensor(Y0, dtypetorch.float32) self.shock_var shock_var self.horizon horizon self.tau_index 9 # default τ0.5 self.fig, self.ax plt.subplots() self.canvas Canvas(self.fig) # 布局 layout QVBoxLayout() layout.addWidget(self.canvas) self.setLayout(layout) # 定时器 self.timer QTimer() self.timer.timeout.connect(self.update_response) self.timer.start(100) # 100ms刷新 def update_response(self): # 对当前tau_index计算脉冲响应 responses [] # list of (horizon, k, 2) for lower/upper bound for h in range(self.horizon): if h 0: Y_t self.Y0.clone() # 施加单位冲击 Y_t[self.shock_var] 1.0 else: # 用上一期预测作为输入 Y_lags torch.stack([Y_t] * self.model.p, dim-1) # (k, p) Y_t self.model(Y_lags.unsqueeze(0), self.tau_index).squeeze(0) responses.append(Y_t.detach().numpy()) # 绘制对每个变量画τ0.1~0.9的响应带 responses np.array(responses) # (horizon, k) self.ax.clear() for var in range(responses.shape[1]): self.ax.plot(responses[:, var], labelfVar{var}) self.ax.set_xlabel(Horizon) self.ax.set_ylabel(Response) self.ax.legend() self.ax.grid(True) self.canvas.draw() def set_tau_index(self, idx): self.tau_index idx用户拖动τ滑块时看到响应曲线像活物一样“呼吸”——低τ响应平缓高τ响应剧烈震荡这才是真实系统的脉冲响应本质。5. 避坑指南分位数回归与QVAR落地中的5个血泪经验5.1 现象QuantReg拟合报错LinAlgError: Singular matrix原因设计矩阵X列满秩但条件数1e12常见于时间序列数据未去趋势导致[1, t, t²]高度相关多重共线性如同时放入GDP增长率与工业增加值增长率样本量n 变量数k尤其在QVAR中k维系统需至少5kp样本解决对时间变量t做中心化t_centered t - np.mean(t)用sklearn.preprocessing.StandardScaler标准化所有变量分位数回归对尺度敏感检查np.linalg.cond(X.T X)1e10时用np.linalg.pinv伪逆替代np.linalg.inv修改QuantReg源码中的求解部分5.2 现象分位数Granger检验p-value恒为0.0或1.0原因bootstrap抽样未正确实现零假设。常见错误在非受限模型残差上抽样而非受限模型bootstrap样本长度与原序列不一致导致滞后结构错位未对每个bootstrap样本重新拟合受限模型pred_res必须随boot_y更新解决严格按Baur Schulze (2021)算法先拟合受限模型得pred_res和residuals对每个bootstrapboot_y pred_res sample(residuals)用boot_y拟合非受限模型但受限模型预测仍用原pred_res因零假设下X无贡献5.3 现象QVAR脉冲响应在后期发散成直线原因系数矩阵B_k(τ)未施加稳定性约束。VAR要求ρ(A_1...A_p)1谱半径1QVAR中每个τ的B_k(τ)都需满足。解决在PyTorch损失中加入谱半径惩罚def spectral_penalty(B, gamma0.1): # B: (k, k*p) - reshape to (k, k) per lag k B.size(0) p B.size(1) // k penalty 0 for lag in range(p): B_lag B[:, lag*k:(lag1)*k] # (k, k) eigvals torch.linalg.eigvals(B_lag) radius torch.max(torch.abs(eigvals)).item() penalty max(0, radius - 0.99) # 谱半径上限0.99 return gamma * penalty # 训练时 loss spectral_penalty(coef_mat)5.4 现象PyQt界面卡死滑动τ时CPU占满100%原因每次滑动都触发全量重计算未启用线程。解决用QThread分离计算与UIclass QRWorker(QThread): result_ready pyqtSignal(object) # 发送结果字典 def __init__(self, y, X, taus): super().__init__() self.y y self.X X self.taus taus def run(self): results {} for tau in self.taus: qr QuantReg(self.y, self.X) results[tau] qr.fit(qtau) self.result_ready.emit(results) # 在主窗口中 self.worker QRWorker(y, X, taus) self.worker.result_ready.connect(self.on_results_received) self.worker.start() # 后台计算5.5 现象脉冲响应带在τ0.05和τ0.95处交叉原因分位数回归的“单调性约束”被违反即高分位拟合线穿过低分位线。这表明模型设定错误如遗漏关键变量τ网格过粗中间分位点缺失导致插值失真数据量不足估计方差过大解决强制单调性用quantreg包的monotone选项需编译Cython增加τ密度taus np.linspace(0.01, 0.99, 50)检查原始数据用plt.boxplot([y[xnp.quantile(x,0.2)], y[xnp.quantile(x,0.8)]])看条件分布是否真有交叉6. 进阶技巧用QVAR残差构建“分位数波动率指数”替代VIX的静态阈值VIX指数本质是期权隐含波动率但它用单一数值概括整个波动率曲面且阈值固定如VIX30恐慌。而QVAR残差序列e_t(τ)直接度量在τ分位点上的预测误差天然构成动态波动率指标。我一般会这样做6.1 构建分位数波动率指数QVI对每个τ计算滚动窗口如60日内|e_t(τ)|的标准差$$ \text{QVI}τ(t) \text{std}\left( |e{t-w1}(τ)|, \dots, |e_t(τ)| \right) $$然后对τ∈[0.05,0.95]取加权平均权重由τ的密度函数决定如Beta(2,2)在0.5处最高def compute_qvi(e_tau_dict, window60, tausNone): if taus is None: taus list(e_tau_dict.keys()) # Beta(2,2)权重f(τ)6*τ*(1-τ) weights np.array([6*t*(1-t) for t in taus]) weights / weights.sum() qvi_series {} for tau in taus: e_abs np.abs(e_tau_dict[tau]) # 滚动标准差 qvi pd.Series(e_abs).rolling(window).std().values qvi_series[tau] qvi # 加权合成 qvi_combined np.zeros(len(qvi)) for i, tau in enumerate(taus): qvi_combined weights[i] * qvi_series[tau] return qvi_combined # 示例从QVAR拟合中提取残差 e_tau_dict {} for tau in [0.05,0.1,0.25,0.5,0.75,0.9,0.95]: # ... 用QVAR模型预测得残差e_t(tau) e_tau_dict[tau] e_t_tau qvi compute_qvi(e_tau_dict, window60)6.2 QVI的实战价值识别“波动率结构性迁移”传统VIX只告诉你“现在有多恐慌”QVI能告诉你“恐慌在哪个尾巴上爆发”。例如若QVI在τ0.05处飙升但τ0.95平稳 → 系统性下行风险积聚如债务危机若QVI在τ0.95处飙升τ0.05平稳 → 极端上行泡沫如加密货币狂热若全τ层QVI同步上升 → 全局不确定性爆发如地缘冲突在PyQt中我用双Y轴图展示左轴原始序列Y_t右轴Q本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

切比雪夫多节阻抗变换器设计原理与微带实现 2026/9/28 16:49:32

切比雪夫多节阻抗变换器设计原理与微带实现

1. 为什么非得用切比雪夫?——从“平滑过渡”到“带宽压制”的底层逻辑你手头有一段50Ω微带线,要连上一个10Ω的天线端口。最直觉的做法,是画个单节λ/4阻抗变换器:中间插一段Z₀√(5010)≈22.36Ω的线,长度取中心频率…

阅读更多 →
Google太空ML基础设施Project Suncatcher:TPU上天的工程挑战与设计启示 2026/9/28 16:49:32

Google太空ML基础设施Project Suncatcher:TPU上天的工程挑战与设计启示

1. 项目缘起与核心命题拆解1.1 为什么要把ML基础设施送上天Google的Project Suncatcher,核心思路一句话就能说清:把搭载TPU的算力节点送上近地轨道,用太阳能供电、用自由空间光通信做数据回传,让机器学习训练和推理在太空里跑。这…

阅读更多 →
PSO优化SVM超参数实战:从代码解析到调参避坑指南 2026/9/28 16:49:25

PSO优化SVM超参数实战:从代码解析到调参避坑指南

简介:这份资源是面向机器学习初学者与算法调参实践者的Python项目,聚焦用粒子群优化(PSO)自动搜索支持向量机(SVM)的最优超参数,解决核函数类型、惩罚因子C与gamma值难以人工确定的问题。项目将…

阅读更多 →
CV论文日更工作流:三层过滤+领域词典实现精准推送 2026/9/28 16:49:25

CV论文日更工作流:三层过滤+领域词典实现精准推送

1. 这不是“论文搬运工”,而是一套可复用的CV领域日更信息流工作流你有没有过这种体验:早上打开ArXiv,面对每天300篇新提交的计算机视觉(CV)论文,点开摘要扫两行就关掉——不是不想看,是根本筛不…

阅读更多 →
太空数据中心Project Suncatcher:星载ML基础设施的架构与挑战 2026/9/28 16:49:25

太空数据中心Project Suncatcher:星载ML基础设施的架构与挑战

1. 当ML基础设施被搬上轨道:Project Suncatcher到底在解决什么问题第一次看到"把机器学习基础设施放到太空"这个说法,我的反应和大多数人一样——这是不是又一个听起来很酷、但离落地十万八千里的概念项目?但仔细拆解Google公开的技…

阅读更多 →
OpenCV实战:视频小球检测与颜色识别,从BGR到HSV的完整指南 2026/9/28 16:49:24

OpenCV实战:视频小球检测与颜色识别,从BGR到HSV的完整指南

简介:这份资源面向计算机视觉入门与进阶学习者,聚焦视频场景下的小球目标检测与颜色分类任务,可帮助理解传统图像处理在动态视频中的落地方式。代码基于opencv-python自行编写,主要运用形状轮廓检测与色彩模型完成识别&#xff0c…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉