其他
通过 yfinance 计算 ETF…
当需要判断 ETF 交易价相对 NAV 的溢价/折价、筛选极端偏离,或把单日异常涨幅拆成 NAV 驱动与结构性溢价时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
通过 yfinance 计算 ETF 溢特定
解决思路
- 运行环境检查:执行 `python3 -c` 检查 `yfinance`、`pandas`、`numpy` 是否可用,并打印版本;若返回 `DEPS_MISSING` 则进入安装。
- 若依赖缺失,执行安装:`subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-q', 'yfinance', 'pandas', 'numpy'])`;若已安装则跳过。
- 按用户请求路由到子技能:单个 ETF 溢价/折价 → Sub-Skill A;比较多个 ETF → Sub-Skill B;筛选极端溢价/折价 → Sub-Skill C;带上下文深度分析 → Sub-Skill D;突然溢价飙升/gamma squeeze → Sub-Skill E。
- 若用户只问一般 ETF 溢价/折价且未指定分析类型,默认使用 Sub-Skill A: Single ETF Snapshot。
- 使用默认参数:数据源为 yfinance `navPrice`;价格字段为 `regularMarketPrice`,缺失时回退到 `previousClose`;Screener 股票池为 Sub-Skill C 中按类别列出的常见 ETF 列表。
- Sub-Skill A1:用 `yfinance.Ticker(ticker_symbol)` 获取 `info`。
- Sub-Skill A1:验证 `quoteType == 'ETF'`;若不是 ETF,返回错误 `... is not an ETF`。
- Sub-Skill A1:取 `price = info.get('regularMarketPrice') or info.get('previousClose')`,取 `nav = info.get('navPrice')`;若 price、nav 缺失或 nav <= 0,返回 NAV 数据不可用错误。
- Sub-Skill A1:计算 `premium_pct = (price - nav) / nav * 100` 与 `premium_dollar = price - nav`。
- Sub-Skill A1:汇总结果字段:`ticker`、`name`、`market_price`、`nav`、`premium_discount_pct`、`premium_discount_dollar`、`status`(PREMIUM/DISCOUNT/AT NAV)、`category`、`fund_family`、`total_assets`、`net_expense_ratio`、`avg_volume`、`bid`、`ask`、`yield_pct`、`ytd_return`。
- Sub-Skill A1:若有 `bid` 和 `ask` 且 `bid > 0`,计算 `bid_ask_spread_pct = (ask - bid) / ((ask + bid) / 2) * 100` 并加入结果。
- Sub-Skill A1:使用 `CATEGORY_PEERS` 映射按 `category` 选择 peer groups:Digital Assets、Intermediate Core Bond、High Yield Bond、Long Government、Emerging Markets Bond、Large Growth、Large Blend、Commodities Focused、China Region、Trading--Leveraged Equity、Trading--Inverse Equity、Derivative Income、Large Value。
- Sub-Skill A2:计算目标 ETF 快照后,根据 `category` 拉取同类别 peers 的溢价数据;从 peers 中移除目标自身;对每个 peer 运行相同 price/NAV 计算。
- Sub-Skill A2:跳过无 NAV 的 peer,但报告 requested 与 returned 数量,让缺失数据可见。
- Sub-Skill A2:在主快照后用小表格展示 peer comparison,判断溢价是 ETF 特有还是整个 category 共有。
- Sub-Skill A3:用解释框架判断溢价/折价是否有意义:±0.05% 基本 at NAV;±0.05% 到 ±0.25% 微小偏离;±0.25% 到 ±1.0% 值得注意;±1.0% 到 ±3.0% 显著;超过 ±3.0% 可能表示压力、流动性差或结构性问题。
- Sub-Skill A3:按类别解释:US large-cap equity(SPY、QQQ、IVV)溢价 > 0.10% 不寻常;bond ETFs(AGG、HYG、LQD、TLT)波动期折价 0.5-2% 会发生;international/EM(EEM、VWO、KWEB)时区错配造成常规 0.3-1% 偏离;leveraged/inverse(TQQQ、SQQQ、JNUG)因每日重置机制 0.3-1.5% 正常;crypto(IBIT、BITO)1-3% 溢价常见;commodity(GLD、USO、UNG)取决于期货 contango/backwardation。
- Sub-Skill A3:将溢价/折价与 bid-ask spread 比较;若溢价小于 spread,视为噪音而非信号。
- Sub-Skill B1:用 `compare_etf_premiums(tickers)` 遍历 tickers。
- Sub-Skill B1:对每个 symbol 获取 `info`,检查 `quoteType == 'ETF'`;非 ETF 记录 error。
- Sub-Skill B1:取 `price = regularMarketPrice or previousClose`,取 `nav = navPrice`;若 price 和 nav 有效且 nav > 0,计算 `premium_pct = (price - nav) / nav * 100`。
- Sub-Skill B1:取 `bid` 和 `ask`;若 `bid > 0`,计算 `spread_pct = (ask - bid) / ((ask + bid) / 2) * 100`。
- Sub-Skill B1:每行包含 `ticker`、`name`、`price`、`nav`、`premium_pct`、`spread_pct`、`category`、`total_assets`。
- Sub-Skill B1:用 pandas DataFrame 汇总,并按 `premium_pct` 升序排序。
- Sub-Skill B2:按溢价/折价排序展示排名表(最折价在前),高亮最深折价、最高溢价,以及溢价/折价是否超过 bid-ask spread;若未超过则是市场微观结构噪音。
- Sub-Skill C1:使用 `references/etf_premium_reference.md` 中按类别组织的 universe 或用户自己的列表。
- Sub-Skill C1:对每个 symbol 应用 Sub-Skill A 的 price/NAV 计算,保留 category 标签,按请求的绝对溢价阈值过滤,并从最深折价到最高溢价排序。
- Sub-Skill C1:保留 failed 或 missing-NAV 计数,不要静默把它们当作零。
- Sub-Skill C2:展示按 premium 排序的排名表(最折价在前);列表长时按 category 分组。
- Sub-Skill C2:标注 Top 5 最深折价(潜在买点或压力信号)、Top 5 最高溢价(过度支付风险)、类别模式(如所有 bond ETFs 折价、所有 crypto ETFs 溢价)。
- Sub-Skill C2:警告大 universe 扫描可能需要 1-2 分钟。
- Sub-Skill D1:运行 Sub-Skill A snapshot,然后拉取三个月日线历史。
- Sub-Skill D1:计算 annualized volatility = `std(daily returns) * sqrt(252)`。
- Sub-Skill D1:计算 average daily dollar volume = `mean(close * volume)`。
- Sub-Skill D1:计算距三个月收盘高点的百分比距离。
- Sub-Skill D1:获取 AUM、expense ratio、yield、YTD return、three-year beta。
- Sub-Skill D1:计算 bid-ask spread percentage,并判断绝对 premium 是否超过该 spread。
- Sub-Skill D1:不可用字段保留为 `null`,不要编造;为 price 和 NAV 输入打时间戳,便于判断是否同步。
- Sub-Skill D2:用诊断框架解释 why:溢价常见原因包括需求激增、时区错配、creation mechanism bottleneck、sentiment premium。
- Sub-Skill D2:折价常见原因包括流动性压力、赎回压力、stale NAV、结构性问题(如 futures contango 对 USO/UNG 的持续拖累)。
- Sub-Skill D2:判断溢价是否可能持续:liquid US equity ETFs 不会,套利会在数分钟内修正;bond ETFs 在压力期折价可持续数日或数周;crypto ETFs 随基金成熟和 AP 活跃度提升而收窄;international ETFs 随 underlying markets open 每日重置。
- Sub-Skill E1:当 ETF 单日移动 5%+、与 named underlyings 背离、疑似 gamma squeeze,或怀疑 dealer hedging 放大波动时,运行 E。
- Sub-Skill E1:运行 E2 前阅读 `references/gamma_squeeze_reference.md`。
- Sub-Skill E1:静态 `navPrice` 只给最近 EOD NAV;用当前 holdings weights 和同 session holding returns 估算 today's NAV return,并按 covered weight 归一化。
- Sub-Skill E1:计算 `NAV proxy return = sum(weight_i x return_i) / covered weight`,`Excess premium return = ETF return - NAV proxy return`。
- Sub-Skill E1:报告 holdings coverage 和 per-holding returns;若 `funds_data.top_holdings` 不完整,优先 issuer-published holdings 或用户提供的 weights。
- Sub-Skill E1:对国际 ETF,若 underlying 在 closed session 交易,使用 US-listed proxies(ADRs)或 futures;若都没有,向用户标记 NAV proxy 会 stale。
- Sub-Skill E2:从 options chain 计算 dealer gamma exposure(GEX)。阅读 reference 中的公式和两种 positioning conventions。
- Sub-Skill E2:用 current spot、strike、time、risk-free rate、IV 计算 contract gamma。
- Sub-Skill E2:聚合 `OI x gamma x spot^2` across chain。
- Sub-Skill E2:返回 call GEX、put GEX、SqueezeMetrics-style net GEX、gross hedge pressure、call/put OI ratio、median near-ATM IV、expirations analyzed、top strike/expiry concentrations。
- Sub-Skill E2:明确 sign convention;不要仅凭 public OI 推断实际 dealer inventory。
- Sub-Skill E2:解释输出:`net_gex_squeezemetrics_$` 高度负 → dealers short gamma,rally 被其 hedging buys 放大;单一近到期 strike 集中 → squeeze fragile 且集中;ATM IV 远高于近期均值 → 市场定价持续大波动,期权时间衰减带来收敛压力;Call/Put OI ratio > 2.5 → call-heavy,符合 bullish gamma squeeze setup。
- Sub-Skill E3:估算 dealer share 上界:`Implied dealer-driven dollars = abs(GEX per 1% move) x abs(ETF return in percentage points)`,`Dealer share of volume = implied dealer-driven dollars / (close x volume)`。
- Sub-Skill E3:说明这是 rough estimate,假设每个 contract 的 full gamma 在单方向被对冲;实际对冲是增量式,且不同 dealer 对冲方式不同;作为 upper-bound heuristic,与假设一起呈现。
- Sub-Skill E4:用三层收敛框架。Hours:AP creation/redemption arbitrage;检查 underlying market 是否 open、creation units 是否 restricted、bid/ask spread 是否 widening(AP 退后)。Days:options expiration/gamma decay;检查 dominant strike expiration、OI 是否 rolling 或 closed、IV 是否压缩。Weeks:net flow normalization;检查 daily inflows 是否大、short interest 是否 building。
- Sub-Skill E4:Hours view 记录 underlying market open 和 creation/redemption constrained;Days view 计算距最大 gamma concentration expiry 的天数,检查 IV/OI 是 decay 还是 roll;Weeks view 使用 issuer flow/creation data,AUM 仅作 rough proxy。
- Sub-Skill E5:按顺序呈现:headline number(today's ETF move、NAV-proxy move、excess premium,单位 pp)。
- Sub-Skill E5:展示 decomposition table:NAV-driven(holdings × weights)、Excess premium(residual)、Total ETF move。
- Sub-Skill E5:展示 dealer hedging quantification:Net GEX(SqueezeMetrics convention)、implied dealer $ buying for day vs actual $ volume、estimated dealer share of buying pressure。
- Sub-Skill E5:展示 risk indicators:ATM IV、call/put OI ratio、top-3 strike/expiration concentrations。
- Sub-Skill E5:展示 convergence outlook:列出 hours/days/weeks mechanisms 和当前状态。
- Sub-Skill E5:展示 caveats:GEX estimate 假设 uniform dealer positioning;NAV proxy 在 overnight sessions 会 stale;这不是未来价格预测。
- Step 3 回复用户时始终包含:ETF name 和 ticker、market price 和 NAV 及计算过程、清楚标注的 premium/discount percentage、context(该 ETF category 下该偏离是否正常)。
- Step 3 始终 caveat:Yahoo Finance 的 NAV 是最新官方 NAV(通常为前一交易日收盘)非实时;market price 可能有 15 分钟延迟;premium/discount 盘中会快速变化,这是快照不是实时 feed;小溢价/折价(< bid-ask spread)是市场微观结构噪音,不是真实错价;绝不要仅凭 premium/discount 推荐买入或卖出。
- Step 3 格式化:多 ETF 比较用 markdown 表格;展示公式 `Premium/Discount = (Market Price - NAV) / NAV x 100`;文本中用颜色指示,如 trading at a **0.45% discount** 或 at a **1.2% premium**;按幅度把百分比四舍五入到 2-4 位小数。
- 阅读参考文件 `references/etf_premium_reference.md` 获取公式、类别基准、常见 ETF universe 和 creation/redemption 机制背景。
- 在运行 Sub-Skill E 前阅读 `references/gamma_squeeze_reference.md`,获取 premium decomposition 框架、Black-Scholes gamma + GEX 公式(含 SqueezeMetrics 与 customer-net-long conventions)、收敛时间线、gamma-squeeze vs routine-rally 诊断表和 worked example。
- 始终注明:仅供研究和教育用途,不构成财务建议;yfinance 与 Yahoo, Inc. 无关联。
适用边界 · 注意事项
- 不适用于非 ETF 标的,或无法从 yfinance/Yahoo Finance 取得 navPrice、价格、期权链等必要数据的场景。
- 不适用于实时 NAV 或盘中实时套利判断;Yahoo Finance NAV 通常为上一交易日官方 NAV,价格可能延迟,盘中会快速变化。
- 不要仅凭溢价/折价或 GEX 估算推荐买入/卖出;这是研究/教育用途,不是财务建议。