etf-premium
Calculate ETF premium/discount vs NAV via Yahoo Finance, and decompose single-day surges into NAV-driven vs structural components (gamma squeeze, dealer hedging, blocked AP arbitrage). Use whenever the user asks about an ETF's premium or discount, NAV comparison, why an ETF diverged from its holding
By himself65 · 2,453 installs
npx skills add himself65/finance-skills --skill etf-premium
Source repository · Upstream listing
ETF Premium/Discount Analysis Skill
If your host has not already executed the shell probes below (for example, in Codex), run the commands inside the ! wrappers with its shell tool before choosing a setup path. Use the actual output; if shell access is unavailable, report that limitation.
Calculates the premium or discount of an ETF's market price relative to its Net Asset Value (NAV) using data from Yahoo Finance via [yfinance](https://github.com/ranaroussi/yfinance).
Why this matters: An ETF's market price can diverge from the value of its underlying holdings (NAV). When you buy at a premium, you're overpaying relative to the assets; at a discount, you're getting a bargain. This divergence is typically small for liquid US equity ETFs but can be significant for bond ETFs, international ETFs, leveraged/inverse products, and crypto ETFs — especially during periods of market stress.
Important : For research and educational purposes only. Not financial advice. yfinance is not affiliated with Yahoo, Inc.
Step 1: Ensure Dependencies Are Available
Current environment status:
If DEPS MISSING , install required packages:
If already installed, skip and proceed.
Step 2: Route to the Correct Sub Skill
Classify the user's request and jump to the matching section. If the user asks a general question about an ETF's premium or discount without specifying a particular analysis type, default to Sub Skill A (Single ETF Snapshot).
User Request Route To Examples
Single ETF premium/discount Sub Skill A: Single ETF Snapshot "is SPY at a premium?", "AGG premium to NAV", "BITO premium"
Compare multiple ETFs Sub Skill B: Multi ETF Comparison "compare bond ETF discounts", "which has bigger premium IBIT or BITO", "rank these ETFs by premium"
Screener / find extreme premiums Sub Skill C: Premium Screener "which ETFs have biggest discount", "find ETFs trading below NAV", "premium screener"
Deep analysis with context Sub Skill D: Premium Deep Dive "why is HYG at a discount", "is ARKK premium normal", "ETF premium analysis with context"
Sudden premium surge / gamma squeeze Sub Skill E: Premium Surge Decomposition "why did KWEB jump 13% today", "is this ETF rally driven by gamma", "decompose today's ETF move", "dealer GEX for SOXL", "how long until the premium converges"
Defaults
Parameter Default
Data source yfinance navPrice field
Price field regularMarketPrice (falls back to previousClose )
Screener universe Common ETF list by category (see Sub Skill C)
Sub Skill A: Single ETF Snapshot
Goal : Show the current premium/discount for one ETF with context about what's normal, plus a peer comparison to show how it stacks up against similar ETFs.
A1: Fetch and compute
A2: Fetch peer comparison
After computing the target ETF's snapshot, look up its category and pull premium data for peers in the same category. This gives the user immediate context on whether the premium is ETF specific or market wide.
Use the target's category to select CATEGORY PEERS , remove the target, and run the same price/NAV calculation for each peer. Skip unavailable NAV rows but report how many peers were requested and returned so missing data is visible.
Present the peer comparison as a small table after the main snapshot. This helps the user see whether the premium is unique to their ETF or shared across the category — for example, if all crypto ETFs are at ~1.5% premium, the user's ETF isn't an outlier.
A3: Interpret the result
Use this framework to explain whether the premium/discount is meaningful:
Premium/Discount Interpretation
Within +/ 0.05% Essentially at NAV — normal for large, liquid ETFs
+/ 0.05% to 0.25% Minor deviation — common and usually not actionable
+/ 0.25% to 1.0% Notable — worth mentioning. Check bid ask spread and category
+/ 1.0% to 3.0% Significant — common for less liquid, international, or specialty ETFs
Beyond +/ 3.0% Large — may indicate stress, illiquidity, or structural issues
Context matters by category:
US large cap equity (SPY, QQQ, IVV): premiums 0.10% are unusual
Bond ETFs (AGG, HYG, LQD, TLT): discounts of 0.5 2% happen during volatility
International/EM (EEM, VWO, KWEB): time zone mismatch causes regular 0.3 1% deviations
Leveraged/Inverse (TQQQ, SQQQ, JNUG): 0.3 1.5% is normal due to daily reset mechanics
Crypto (IBIT, BITO): 1 3% premiums are common, especially for newer funds
Commodity (GLD, USO, UNG): depends on contango/backwardation in futures
Also compare the premium/discount to the bid ask spread : if the premium is smaller than the spread, it's noise, not signal.
Sub Skill B: Multi ETF Comparison
Goal : Compare premium/discount across multiple ETFs side by side.
B1: Fetch and rank
B2: Present as a ranked table
Sort by premium/discount (most discounted first). Highlight:
Which ETFs are at the deepest discount
Which are at the highest premium
Whether the premium/discount exceeds the bid ask spread (if it doesn't, it's market microstructure noise)
Sub Skill C: Premium Screener
Goal : Scan a universe of common ETFs to find those with the largest premiums or discounts.
C1: Define the universe and scan
Use the category organized universe in references/etf premium reference.md , or the user's own list. Apply the Sub Skill A calculation to each symbol, preserve category labels, filter by the requested absolute premium threshold, and sort from deepest discount to highest premium. Keep failed or missing NAV counts visible instead of silently treating them as zero.
C2: Present the results
Show a ranked table sorted by premium (most discounted first). Group by category if the list is long. Call out:
Top 5 deepest discounts — potential buying opportunities (or signs of stress)
Top 5 highest premiums — overpaying risk
Category patterns — are all bond ETFs at a discount? Are all crypto ETFs at a premium?
Warn that large universes may take 1 2 minutes.
Sub Skill D: Premium Deep Dive
Goal : Combine premium/discount data with additional context to help the user understand why the premium exists and whether it's likely to persist.
D1: Gather comprehensive data
Run the Sub Skill A snapshot, then pull three months of daily history and add:
Annualized volatility: std(daily returns) sqrt(252)
Average daily dollar volume: mean(close volume)
Percentage distance from the three month closing high
AUM, expense ratio, yield, YTD return, and three year beta
Bid ask spread percentage and whether the absolute premium exceeds that spread
Keep unavailable fields as null rather than inventing values. Timestamp price and NAV inputs so users can judge whether the comparison is synchronized.
D2: Explain the why
After gathering data, explain the premium/discount using this diagnostic framework:
Common causes of premiums:
Demand surge — more buyers than authorized participants can create shares (common for new/hot ETFs like crypto)
Time zone mismatch — international ETF trading when underlying markets are closed; price reflects anticipated moves
Creation mechanism bottleneck — when authorized participants face constraints on creating new shares
Sentiment premium — retail demand pushes price above fair value during hype cycles
Common causes of discounts:
Liquidity stress — during sell offs, bond and credit ETFs often trade at discounts because underlying bonds are harder to price/trade than the ETF itself
Redemption pressure — heavy outflows but slow authorized participant response
Stale NAV — the official NAV may not reflect after hours news or events
Structural issues — contango in futures based ETFs (USO, UNG) creates persistent drag
Is the premium likely to persist?
For liquid US equity ETFs: No — arbitrage corrects deviations within minutes
For bond ETFs during stress: Discounts can persist for days or weeks
For crypto ETFs: Premiums tend to narrow as the fund matures and APs become more active
For international ETFs: Resets daily as underlying markets open
Sub Skill E: Premium Surge Decomposition (Gamma Squeeze Analysis)
Goal : When an ETF has just experienced a dramatic intraday move that diverges from its underlying holdings, decompose the move into (1) a fundamental NAV driven component and (2) an "excess premium" driven by structural forces — most commonly options dealer gamma hedging, AP arbitrage breakdowns, or sentiment surges. Then assess how long the premium will likely take to converge.
This sub skill is appropriate when the user reports or asks about:
An ETF moving 5%+ in a single session
A divergence between the ETF and its named underlyings (e.g., "MSTR jumped 13% but BTC only rose 3%")
A suspected gamma squeeze in an ETF or single name
Whether dealer hedging is amplifying a move
Read references/gamma squeeze reference.md for the full GEX formula derivation, dealer positioning conventions, and worked examples before running E2.
E1: Decompose today's move into NAV driven vs excess premium
The static navPrice field gives only the most recent end of day NAV. Estimate today's NAV return from current holdings weights and same session holding returns, normalize by the covered weight, then calculate:
Report holdings coverage and the per holding returns used. If funds data.top holdings is incomplete, prefer issuer published holdings or user supplied weights.
Caveat : For international ETFs whose underlyings trade in a closed session (e.g., Asian holdings during US hours), the holdings' US listed proxies (ADRs) or futures must be used. If neither is available, flag this to the user — the NAV proxy will be stale.
E2: Compute dealer gamma exposure (GEX) from the options chain
GEX approximates dealer hedging sensitivity per 1% underlying move. Read the formulas and both positioning conventions in references/gamma squeeze reference.md , calculate contract gamma from current spot, strike, time, risk free rate, and IV, then aggregate OI x gamma x spot^2 across the chain.
Return call GEX, put GEX, SqueezeMetrics style net GEX, gross hedge pressure, call/put OI ratio, median near ATM IV, expirations analyzed, and the top strike/expiry concentrations. State the sign convention explicitly; do not infer actual dealer inventory from public OI alone.
Interpret the output:
net gex squeezemetrics $ highly negative → dealers are short gamma; rallies will be amplified by their hedging buys. Classic gamma squeeze fuel.
Concentration on a single near dated strike (e.g., heavy open interest in one strike of next month's calls) → squeeze is fragile and concentrated. When that strike expires or the spot moves past it, the gamma decays sharply.
ATM IV well above the recent average (e.g., 78% against a typical 30–40%) → market is pricing in continued large moves; option premium decay alone will provide some convergence pressure over days.
Call/Put OI ratio 2.5 → call heavy positioning, consistent with a bullish gamma squeeze setup.
E3: Compare structural buying pressure to actual volume
Estimate the upper bound dealer share with:
This is a rough estimate — it assumes every contract's full gamma was hedged in a single direction during the move. Real hedging is incremental, and not all dealers hedge identically. Treat as an upper bound heuristic, not a precise figure. Always present it alongside the assumptions.
E4: Assess premium convergence timeline
Convergence plays out on three time scales (details in the Convergence Timeline section of references/gamma squeeze reference.md ):
Time scale Mechanism What to check
Hours AP creation/redemption arbitrage Is the underlying market open? Are creation units restricted? Is the spread between bid/ask widening (suggests AP step