# OptionAnalyzer **Repository Path**: solar86/option-analyzer ## Basic Information - **Project Name**: OptionAnalyzer - **Description**: 期权图形化分析 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-11 - **Last Updated**: 2026-10-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OptionAnalyzer > **A股期权组合风险分析可视化工具** > 专注 50ETF / 300ETF / 500ETF / 科创50ETF / 创业板ETF 五大标的 > 基于 Black-Scholes 模型,三维曲面 + 二维切片展示组合价值与现金 Greeks ## 功能特性 ### 持仓模式 (CSV 导入) - ✅ 解析汇点 / 各券商持仓报表 CSV (GBK 编码) - ✅ 即时显示当前持仓的 Delta / Gamma / Vega / Theta - ✅ **资金占用展示 (v1.7.10.b)**: 持仓汇总栏显示 `资金占用 = 净权利金 + 估算保证金` (蓝粗体突出, signed 颜色编码); 按标的分类也加; 期权明细表加 资金占用 列 (long=权利金, short=margin 扣权利金收入). 公式跟 v1.7.10 压力测试 pct 分母同口径, 一致展示持仓真实资金占用 - ✅ 按标的分类汇总(市值、Greeks、最新价、数据源 badge、资金占用) - ✅ 期权明细表:合约 / 类型 / 方向 / 数量 / 价格 / 市值 / **资金占用** / IV / Δ / Γ / V / Θ ### 情景分析(三维 + 二维) - ✅ **3D 曲面**:标的价格 × 波动率 × 模拟天数 的组合价值 / Greek 曲面 - ✅ **Greek 切换**:右侧曲面显示 Gamma / Delta / Theta (元 / 元 / 元/天) - ✅ **三种分析模式**: - `fixed_time` — 固定 "N 天后",X=标的价格,Y=波动率 - `fixed_vol` — 固定波动率,X=模拟天数,Y=标的价格 - `fixed_price` — 固定标的价格,X=模拟天数,Y=波动率 - ✅ **2D 切片**:每种模式支持两种切片方向(固定 X / 固定 Y),Greek 跟随切换 ### 波动率曲面分析 (v1.4+, 第 2 个 Tab) - ✅ **3D 曲面**: K × T × σ 隐含波动率曲面 (TdxQuant SDK 期权 + BS 反推) - ✅ **2D IV Skew**: 按到期月分组的 ATM/OTM/ITM 偏度 - ✅ **单月 Skew 联动** (v1.6.0): 聚焦月份下拉框 → 单月 IV skew + term structure 双图 - ✅ **历史 IV 走势** (v1.6.1): 单合约 IV 时序 (蓝线 + 30 天滚动均值 + ±1σ 带) - ✅ **历史 IV Call + Put 双曲线** (v1.6.1.7): 同图叠加展示 Call/Put 时序, 默认 ATM strike (v1.6.1.8) - ✅ **异常 IV 过滤** (v1.6.1.5): deep ITM/OTM + 临到期 BS 病态 → spread + moneyness + T + MAX_IV 四层防御 ### 持仓情景分析 (Tab 1, v1.7.0 IV 分离重构) - ✅ **3D 曲面**: 标的价格 × **波动率倍数 (×IV)** × 模拟天数 的组合价值 / Greek 曲面 - ✅ **Call/Put IV 分离** (v1.7.0): 3D/2D 曲面计算时, call 和 put **各自用真实 IV** (科创50 call 50% / put 70% 真实场景验证) - ✅ **波动率倍数滑块** (v1.7.0): 默认 1.0 = 用各合约当前 IV; 0.3~3.0 倍数范围 (黑天鹅场景: 1.5x = IV × 1.5) - ✅ **三种分析模式**: fixed_time / fixed_vol (固定波动率倍数) / fixed_price - ✅ **Greek 切换**: Gamma / Delta / Theta - ✅ **2D 切片**: 每种模式支持两种切片方向 - ✅ **v1.7.4 字段重命名**: BS delta/gamma 字段跟 Hull 教科书对齐 (share_delta / delta_per_contract / cash_delta / cash_gamma), 删除旧 share_delta/share_gamma 别名 ### 压力测试 (Tab 1, v1.7.1 起持续打磨) - ✅ **8 个预设场景** (一键运行): 急跌-20% / 急跌-10% / 急涨+10% / 急涨+20% / 低波σ×0.5 / 高波σ×2.0 / 临近到期T+60 / 黑天鹅(S-20%+σ×1.5) - ✅ **对比表格**: 每个场景一行, 显示新参数 + 新组合价值 + 价值变化 (元/%) + Δ/Γ/Θ - ✅ **三级颜色告警** (基于 |价值变化|/当前价值): 绿<5% / 黄5-15% / 红>=15% - ✅ **用户自定义**: 选 "🎛️ 用户自定义" → 3 Slider (S变动% -30~+30, σ倍数 0.3~3.0, T变动天 0~90) - ✅ **v1.7.7 删场景下拉框**: 6 预设点击效果都一样 (都跑全部 7 行), 不再有冗余 dropdown - ✅ **v1.7.7.1 自动选第一个持仓标的**: CSV 导入后 stress-underlying 自动有 options, 不依赖手选 - ✅ **v1.7.7.2 切标的表格同步更新**: stress-underlying 变化时 callback 立即重算 (State→Input 修复) - ✅ **v1.7.9 单腿归因**: 表格行 ▶/▼ 切换展开 8 列腿明细 (单 Store 单选 toggle), 看清每个期权对场景的贡献 - ✅ **v1.7.9.2 单腿表列对齐 + 组合加总全局排序**: 展开表格视觉对齐, 组合加总模式下也支持单腿展开 - ✅ **📊 组合加总视图 (v1.7.8)**: dropdown 独立于 vol surface, 选项 `[📊 组合加总, 持仓里的所有标的]`, 默认组合加总. 组合加总按标的分别算再 sum (各 ul 用各自 S_new = S_ul × (1 + s_pct/100), 物理含义 = 全市场 ETF 同时按比例变动) - ✅ **Tab 1 重组 (v1.7.8)**: 顺序 导入 → 三维曲面 → 二维切片 → 压力测试 → 风险评分 (vol surface 类紧挨, 风险评估类紧挨) - ✅ **call/put IV skew**: 跟 v1.7.0 修复一致, 每个合约用自己 base IV - ⚠️ **baseline "当前持仓" 行 vs CSV 报告** (v1.7.8.1): baseline 用 BS 模型重算 (σ=1.0 × 各合约 base_iv → σ_eff=base_iv), **不是直接用 CSV 报告里的 `csv_delta/csv_gamma/csv_theta`**. 同 BS 模型下, 差异主要来自 σ 估计 (TdxQuant/akshare 反推 IV vs 券商 IV), 实测差 < 4%. 设计原因: 跟三维曲面 / 二维切片保持 BS 同口径, 6 个场景数字才可比. CSV 持仓模式可对照原始报表. 详见 `~/.claude/projects/d--GiteeRepo-option-analyzer/memory/stress-baseline-vs-csv.md`. - ✅ **v1.7.10 价值变化 % 改为资金占用回报率**: 分母从 `|组合市值|` 换成 `组合资金占用`, 衡量"占用资金的回报率"而非"组合自身相对位移". 公式: long 腿 cost = |权利金|; short 腿 cost = 12% × 10000 × 标的价 (A 股 ETF 短期风险系数, 已扣权利金收入). 修复 gamma 中性组合 baseline≈0 时 pct 爆炸的失效场景; 跨账户 / 跨规模可比 (跟本金解耦). 排序键仍为 |value_change| 美元 (调仓 UX 不变). 颜色阈值 5%/15% 保留. 单腿归因 (▶/▼ 展开) 每条腿用各自资金占用, 正数=回报率 (越高越好), 负数=风险率 (越低越差). - ✅ **v1.7.10.b 持仓 UI 资金占用展示**: 把 v1.7.10 引入的"资金占用"概念显式暴露给用户. **持仓总汇总栏**: 蓝粗体一行 `资金占用: X 元 (买方资金占用 Y + 卖方资金占用 Z)`. **按标的分类**: 每个 ul 卡片也加 `资金占用 + breakdown`. **期权明细表**: 新加 `资金占用` 列 (95px 宽, 整数显示), 公式 long=|leg value|; short=`12%×10000×S×qty` (净占用, 已扣权利金, 跟 stress test 分母同口径). **公式 (v1.7.10.b.3)**: 总资金占用 = 买方资金占用 + 卖方资金占用 = sum(per-leg) (1e-6 内一致). 买方 = sum(long |leg value|, 长腿权利金之和); 卖方 = sum(short 12%×10000×S×qty, 短腿合约资金占用之和). 例: long call 1000 + short put S=3.0 → 买方 1000 + 卖方 3600 = 4600. 同步修 v1.7.10 隐藏 bug: 短腿 margin 没按 quantity 缩放 (qty=2 时少算, 现在补 `opt.quantity` 参数). - ✅ **v1.7.11 卖方保证金占用风险 (国信 2026-03-18 公告)**: 解决"卖方被强平"盲区. 公式完整 (call/put 不同 + put 多 `Min(..., K)` 上限, 永不超全额名义本金), 系数 X=14% / Y=8% (日常, 临期不实现). **leg 表新 2 列** (展开后): "新保证金" (元, 颜色编码) + "变化%" (margin 涨幅). **暴露卡片新 1 张** (在 stress section): "⚠️ 保证金压力 (短腿)" + 短腿总新保证金 (元) + 变化率 % + 颜色阈值 (20%/50%, 绿/黄/红). tooltip 解释公式 + 国信公告来源 + 临期系数说明. 结算价: `opt.price` (CSV 实盘) 或 fallback BS theoretical value (sim 模式, 跟现有 None fallback 一致). 验证场景: short 50ETF put K=3.0, S=3.05→2.95 (穿 K) 时 margin 跳变约 9.5% (settlement=0 时纯风险系数切换); 实盘 settlement>0 时跳变更平缓. 跟 v1.7.10 pct 口径完全独立 (价值变化 vs 保证金变化, 阈值 5%/15% vs 20%/50%, 公式简化 vs 国信完整). 用户实盘资料: `examples/券商保证金计算.mhtml` (国信证券 2026-03-18 公告). ### 持仓风险评分 (Tab 1, v1.7.2) - ✅ **综合评分 0-100**: 加权公式 (Δ/Γ/V/Θ 各 25 分), 5% 暴露顶满每维度 - ✅ **红色/黄色告警 banner**: score >= 70 红, >= 40 黄, 强制显眼 - ✅ **4 个 mini 卡片**: Delta/Gamma/Vega/Theta 暴露 % (1% 变动归一化, scale-invariant) - ✅ **持仓集中度柱状图**: go.Bar horizontal, 从高到低排序, 颜色按占比阈值 (>=30 红 / >=15 黄 / else 绿) - ✅ **scale-invariant**: 同样比例暴露, 期权数量 × 10 → score 不变 (归一化验证) - ✅ **v1.7.3 cash_delta 归一化修复**: × 0.01 归一化 (1 元 S 变动 → 1% 归一化), 修旧版 2002% 暴露误报 (v1.7.3 / v1.7.3.1 / v1.7.3.2 三次迭代, 用户实盘反馈驱动) - ✅ **v1.7.10.b.4 暴露分母改 capital_cost**: Greeks 暴露 % 分母从 |组合市值| 改 `capital_cost` (买方 + 卖方资金占用), 跟 stress test pct 同口径. **修复 3 类失效场景**: (1) gamma-中性组合 baseline≈0 时旧 abs(市值) 分母返回 0 隐藏真实 cash_delta 暴露; (2) 净做空组合 abs(市值) 语义模糊; (3) 跟 v1.7.10 stress test pct 分母不一致. 现在 exposure 永远 ≥ 0, 跨账户 + 跨 gamma-中性 都可比. - ✅ **v1.7.10.b.5 Gamma/Vega/Theta 口径 bug 修复**: `_greeks_exposure_pct` / `compute_risk_score` 之前对 4 个 greek 都乘 `× 0.01`, 但 BS 模型里 `cash_gamma` 已是 "1% S 变动" 口径 (`gamma × S² × 10000 × 0.01`), `cash_vega` 是 "1% σ 变动" (BS /100, Hull 惯例), `cash_theta` 是 "1 天" 衰减 (BS /365) — 只有 `cash_delta` 是 "1 元 S 变动" 真正需要 × 0.01. 修复后 Gamma/Vega/Theta 暴露数字比之前大 **100 倍**, 5%/15% 颜色阈值恢复有效. 例: 1 张 ATM call S=3 K=3 T=30d σ=0.25 旧版显示 Gamma 0.17%, 现版 186.4% (正确反映 "1% S 变动下 cash_delta 变化 占 capital_cost 的 %"). - ✅ **v1.7.10.b.6 UI 增强 (tooltip + 绝对金额)**: 4 个 mini 卡片加 hover tooltip 解释物理含义 + 公式 + 注意事项 (例: "ATM call Gamma 100%+ 是期权杠杆, 非 bug"), 并显示绝对金额 (元) 在 % 下方. 例: 1 张 ATM call 显示 Gamma 186.32% / **1,666 元**, 用户能直观感受"1% S 变动下 cash_delta 调整 1666 元" 而非被 186% 吓到. 公式保留 v1.7.10.b.5 % capital, 不改. - ✅ **v1.7.10.b.7 暴露卡片改用组合 TOTAL**: 用户实测发现 5 ul 时 `worst_ul.cash_delta / total_capital` 被稀释 5x (e.g. UI 显示 0.011% / 71 元 vs 用户期望 0.27% / 2,041 元). 改用 `total_cash_delta / total_capital` (跨 ul 累加), Score 仍用 worst_ul (用于触发 banner 告警找最危险标的). 新增 `compute_total_portfolio_greeks` helper, +1 测试. - ✅ **v1.7.10.b.8 修复汇总栏 cash_gamma 数字矛盾的 bug** (用户纠错 + 实盘反馈, 2026-07-12): 旧版 `compute_total_portfolio_greeks` 对 gamma/vega 用 abs sum, 跟 `pm.get_summary` 的 signed sum 不一致, 混合持仓时差 4 倍 (用户 CSV: 汇总栏 102487 vs 暴露 400578). **用户关键洞察**: "如果买1张合约同时卖1张相同合约相当于空仓, 0暴露, 但 abs sum 却是 2 倍单腿 gamma, 这样合理吗?" → 不合理. 修复: 全用 SIGNED sum (跟券商 csv_gamma/csv_vega/csv_theta 一致), 暴露卡片 absolute value 用 abs() (永正, 跟 % + "绝对值" tooltip 一致). **核心物理**: cash_gamma 是 cash_delta 一阶导, 天然有符号 (长 1 + 短 1 同合约 = 0, signed 才是物理正确). abs sum 在对冲仓位下重复计数错. **用户 CSV 验证**: 汇总栏 102487 ↔ 暴露 102487(=) ↔ 13.62% (102487/752393 = 用户期望公式 `|total|/capital × 100` ✓). +1 一致性测试 (验证 long 1 + short 1 = 0). APP_VERSION 1.7.9 → 1.7.10. ### 实时数据源 (2 个并存, 配置文件切换, v1.5.3 删 mootdx) - ✅ **配置化切换** (v1.5.1) — `config.yaml` 选择 `tdxquant` / `akshare`, UI 顶部 badge 显示当前源 - ✅ **TdxQuant** 期权 K线/快照 + **标的价格** → BS 反推 IV (v1.5.0, 通达信官方量化金融终端, 沪深 1254 条 ETF 期权, 默认, **v1.5.3 一站式**) - ✅ **akshare** 期权链 + **标的价格** → BS 反推 IV (上交所 + 深交所 5 个标的, v1.5.3 自带价格接口) - ✅ 失败静默降级,不崩 UI - ✅ **v1.5.3**: 删除 mootdx (TdxQuant SDK 拿价, 不再需要第三方库) - ✅ **v1.7.5 通达信 SDK 重连**: 顶部 H1 下黄色 banner 显示 SDK 状态 + 🔄 重连通达信按钮. 通达信客户端未启动时: banner 警告 + 页脚 badge 标 "(未连接)"; 点按钮触发二次初始化, 成功清 stale snapshot 缓存, 失败变红显示具体错误. 修 v1.7.5 latent bug (SDK ready 时 banner children 为空, callback Input 引用不存在 ID 触发 console ReferenceError). **配置示例** (`config.yaml`, 默认自带): ```yaml iv_provider: tdxquant # tdxquant | akshare tdxquant: sdk_path: D:/new_tdx_mock/PYPlugins/user contract_cache_file: data/option_contracts.json akshare: cache_ttl: 30 # 标的价格由 provider 自带 (v1.5.3 删除 price_provider 配置) ``` ### 关键模型口径 (券商一致) - ✅ **Cash Delta** (元) = `share_delta × S × 10000 × qty × sign` - **物理含义**: 复制该期权 (delta hedge) 所需的**对冲标的金额**. 不是 "S 变动 1 元的组合价值变动". - **解读 A (delta hedge 视角)**: 持多 1 张 call → 需卖空 X 元标的; 持空 1 张 call → 需买入 X 元标的. 例: ATM call, S=10, Δ=0.5, qty=10000 → cash_delta = 50000 元 (卖空 5 万元 ETF 对冲). - **解读 B (1% 变动近似)**: S 变动 1% 时, 组合价值近似变动 `cash_delta × 1%`. 例: cash_delta=50000 → ETF 涨 1% 组合约赚 500 元. - **反例 (常见误区)**: 把 cash_delta 当成 "S 涨 1 元 → 合约涨 cash_delta 元". 实际 S 涨 1 元, ATM call 价格涨 `share_delta × 1 = 0.5 元`, 1 张合约涨 `0.5 × 10000 = 5000 元`, 不是 50000 元. cash_delta 比这大 10 倍, 因为 S=10 元, 差的就是 S 这个因子. - ✅ **Cash Gamma** (元, S 变动 1%) = `share_gamma × S² × 100 × qty × sign` - 公式来源: `Gamma × 10000 × S² × 0.01` (券商报表口径) - 物理含义: S 变动 1% 时, **cash_delta 的变化量** (也就是 cash_delta 对 S 的敏感度). - 验证: 跟用户实盘 CSV 报表差 < 4% (σ 估计偏差) - ✅ **Cash Theta** (元/天) = BS 模型直接给, 已经是"每天"的时间衰减. 注意是**自然日** (calendar day), 不是交易日, 周末/假期也衰减. ### 可视化 - ✅ 三维曲面图 (Plotly Surface, 双子图: Value + Gamma/Delta/Theta) - ✅ 二维切片曲线图 (Value + Greek 双图) - ✅ 实时持仓 overlay (Strike 位置 + 当前 Gamma 标注) - ✅ 整数显示 + 千分位 (`26,313` 而非 `26312.87`) ## 开发与测试 测试策略详见 [PROJECT.md](PROJECT.md) "测试策略" 小节跟 [.claude/CLAUDE.md](.claude/CLAUDE.md) "硬规则" 段。 本地开发: ```bash # 装运行时依赖 pip install -r requirements.txt # 装测试依赖 (UI smoke + L2 callback 端到端) pip install -r requirements-dev.txt # 跑全套测试 (单元 + UI smoke + UI 端到端, 约 2 分钟) find . -type d -name __pycache__ -exec rm -rf {} + # 清 Dash 字节码缓存 pytest tests/ --ignore=tests/data_sources # 单跑 UI 测试 pytest tests/test_ui_smoke.py tests/test_ui_stress_tab.py tests/test_ui_portfolio.py tests/test_ui_reconnect.py -v # 当前: 235 测试全绿 (219 单元 + 4 UI smoke + 12 UI 端到端) ``` ## 快速开始 ```bash # 1. 安装依赖 pip install -r requirements.txt # 2. 启动 Web 应用 cd code && python app.py # 3. 浏览器打开 # http://127.0.0.1:8050 ``` 依赖: - Python 3.x - dash, plotly - numpy, scipy - akshare (期权链 + 标的价格兜底) - pandas, requests - **TdxQuant SDK** (v1.5.0 新, 通达信量化金融终端内置, 免费模拟版) ## 项目结构 ``` OptionAnalyzer/ ├── PROJECT.md # 项目管理文档 (含测试策略 / 版本历史 / backlog) ├── README.md # 本文件 (项目简介 + 功能列表) ├── CHANGELOG.md # 版本更新日志 ├── .claude/CLAUDE.md # AI 协作规则 (硬规则 + 工作流惯例, AI 启动时自动加载) ├── requirements.txt # Python 运行时依赖 ├── requirements-dev.txt # Python 测试依赖 (dash[testing] + selenium, 含 UI 测试) ├── docs/ # 产品文档 (架构设计等) ├── code/ # 源代码 │ ├── app.py # Dash Web 应用入口 │ ├── bs_model.py # BS 定价 + 4 套希腊值 (share/cash) │ ├── option_portfolio.py # 期权 + 组合类 │ ├── grid_calculator.py # 三维网格预计算 + 切片 │ ├── portfolio_manager.py# 持仓 / 模拟 统一接口 │ ├── plots.py # Plotly 3D/2D 绘图 │ └── data_sources/ # akshare / TdxQuant 数据源 └── tests/ # 单元测试 + UI 端到端测试 (194 全绿, 含 12 个 UI 测试) ├── conftest.py # UI mock + L2 fixtures (sample_portfolio/sample_csv/sdk_disconnected) ├── test_v1*.py # 版本特定单测 ├── test_ui_smoke.py # L1: app 启动 / Tab 渲染 / console 无 callback error ├── test_ui_stress_tab.py # L2: 切标的表格更新 ├── test_ui_portfolio.py # L2: CSV 上传联动 └── test_ui_reconnect.py # L2: 🔄 重连按钮 ``` ## 数据源 | 来源 | 用途 | 状态 | |------|------|------| | **TdxQuant** (v1.5 新) | 期权 K线/快照 → BS 反推 IV | ✅ 沪深 1254 条 ETF 期权, 自然日 TTL | | akshare | 期权链 → BS 反推 IV | ✅ 5 ETF 全覆盖 (含 SZSE 创业板) | | (已删除) mootdx | ~~标的实时收盘价~~ | ❌ v1.5.3 起由 TdxQuant SDK 替代, 不再依赖 | ## 版本 **当前版本: v1.7.18** (2026-09-21) — 修 SDK init 失败时循环重试 → 日志刷屏 (加 `_tq_init_attempted` 锁 + `reset_sdk_init_attempt()` + `reconnect()` 简化, 13 新测试 0 回归) 完整版本历史见 [CHANGELOG.md](./CHANGELOG.md)。亮点: - **v1.7.5**: 通达信 SDK 重连按钮 (顶部黄色 banner + 🔄 重连按钮) - **v1.7.8**: 压力测试组合加总视图 (独立 dropdown + 7 行表格结构保留, 物理含义: 全市场 ETF 同时按比例变动) + Tab 1 UI 重组 - **v1.7.8.1**: cash_delta 物理含义精确表述 + 压力测试 baseline 行 BS 重算同口径说明 - **v1.7.9**: 压力测试单腿归因 (▶/▼ 展开腿明细) + v1.7.9.2 单腿表列对齐 + 组合加总全局排序 - **v1.7.10**: 压力测试 pct 分母改为资金占用 (修复 gamma 中性 baseline≈0 失效场景 + 跨账户可比) - **v1.7.10.b.4 ~ b.8**: 持仓 UI 资金占用展示 (汇总栏/按标的/明细表) + 修 v1.7.10 短腿 margin 缩放 bug + Greeks 暴露 % 分母改 capital_cost + Γ/V/Θ × 0.01 bug + tooltip + 绝对金额 + 改用 TOTAL + **b.8 回归 signed sum 跟券商 csv_gamma 一致** (用户纠错) - **v1.7.11**: 压力测试卖方保证金占用风险 (国信 2026-03-18 公告 X=14%/Y=8%, call/put 区分 + put 多 Min(...,K) 兜底, leg 表新 2 列 + 暴露卡片新 1 张) - **v1.7.11.1**: test_app_warmup 加环境守卫 (没通达信客户端时 skip 而非 fail) - **v1.7.12**: 清理 sim 模式后端残留 (UI v1.3.0 已删, 后端 mode/mode_name/add_option 字典入口同步清, 文档 README/PROJECT/架构/需求 同步) - **v1.7.14**: 合约清单数据源 TdxQuant 盲扫 → akshare 聚合 (修复 100123xx 号段漏数据: 10012313 = 50ETF购10月3000 现在能查到, 清单从 786 → 1158 条) - **v1.7.13**: 修复沪深300ETF/中证500ETF 深交所标的映射错 (用户实盘反馈: `沪深300ETF → 159919`, `中证500ETF → 159922`, 之前错对上交所代码导致 IV/持仓归类都错) - **v1.8 / v1.8.1**: UI 测试基础设施 (12 个 UI 测试覆盖 callback 端到端, dash[testing] + SeleniumManager) ## License MIT ## 仓库 - Gitee: https://gitee.com/solar86/option-analyzer