Gold Miner Covered Call ETFs: Yield vs Upside
Gold miner covered call ETFs quote the biggest yields in the income aisle. Here is the measured GDX and GDXJ volatility behind them, and the upside they cap.
Gold miner covered call ETFs quote some of the biggest distribution rates in the whole ETF income aisle, and the mechanism behind that is measurable rather than mysterious. These funds hold miner exposure, either the mining shares themselves or a synthetic position built with options, and sell call options against it, collecting cash premium in exchange for giving away part of the upside. Options on the miners carry much higher implied volatility than options on the S&P 500 ETF, which makes the premium collected larger. It also makes the upside being sold away larger, and the panels below price both halves of that trade with dates attached.
Why gold miner covered call ETFs quote such big yields
Three terms carry the whole post. A call option gives its buyer the right to buy a security at a fixed strike price up to an expiration date. Implied volatility, usually shortened to IV, is the annualized movement priced into that option, quoted as a percent. A covered call is the pairing of those two: own the exposure, sell a call against it, keep the premium, and hand over any gain above the strike.
Option premium rises with implied volatility. Everything else held equal, a security the market expects to swing 45% a year prices a one-month call far above an identical call on a security expected to swing 15%. That single relationship is the entire reason the miner wrappers can quote headline distribution rates several times what a plain equity income fund quotes. The mechanics are the same ones covered in our guide to how covered call ETFs work. Only the volatility input changes.
The panel below measures at-the-money IV over the last several weeks of trading for the two miner ETFs, GDX and GDXJ, alongside the bullion ETF GLD and the S&P 500 ETF SPY. At the money here means the strike sits within 5% of the underlying price, and the contracts are filtered to 20 to 45 days from expiry, the window a monthly call writer actually lives in.
| symbol | atm_iv_pct | iv_low_pct | iv_high_pct | sample_count | iv_window |
|---|---|---|---|---|---|
| GDXJ | 49.5 | 23.7 | 80.1 | 705 | Aug 20 to Oct 1 |
| GDX | 44.4 | 25.4 | 80.1 | 1974 | Aug 20 to Oct 1 |
| GLD | 23.7 | 8.3 | 42 | 7399 | Aug 20 to Oct 1 |
| SPY | 13.4 | 2.5 | 25.2 | 14980 | Aug 20 to Oct 1 |
The exact SQL behind every number
SELECT
underlying_symbol AS symbol,
round(avg(toFloat64(implied_volatility)) * 100, 1) AS atm_iv_pct,
round(min(toFloat64(implied_volatility)) * 100, 1) AS iv_low_pct,
round(max(toFloat64(implied_volatility)) * 100, 1) AS iv_high_pct,
count() AS sample_count,
concat(formatDateTime(min(date), '%b %e'), ' to ', formatDateTime(max(date), '%b %e')) AS iv_window
FROM global_markets.options_greeks
WHERE underlying_symbol IN ('GDX', 'GDXJ', 'GLD', 'SPY')
AND date >= today() - 45
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND toFloat64(underlying_close) > 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY symbol
ORDER BY atm_iv_pct DESCThe panel is sorted widest first. GDXJ sits at the top at 49.5% average ATM IV, measured across 705 converged contract observations from Aug 20 to Oct 1. At the bottom, SPY averaged 13.4%, with its own range running 2.5% to 25.2%. Bullion and the miners that dig it up are not the same volatility product, which is the comparison our GLD implied volatility breakdown works through in detail.
How much more volatile are the miners than the index?
A single snapshot can catch an unusual week, so the next panel runs the same at-the-money measurement month by month over the past year. The spread column subtracts the index reading from the GDX reading, in volatility points.
| month | gdx_iv_pct | gdxj_iv_pct | spy_iv_pct | gdx_spy_spread_pts |
|---|---|---|---|---|
| 2025-10 | 42.4 | 46.9 | 15.7 | 26.7 |
| 2025-11 | 41.1 | 46.3 | 16.7 | 24.4 |
| 2025-12 | 40.9 | 46.4 | 13.5 | 27.4 |
| 2026-01 | 48 | 55.1 | 14 | 34 |
| 2026-02 | 51.5 | 57.9 | 16.4 | 35.1 |
| 2026-03 | 54.3 | 60.2 | 21 | 33.3 |
| 2026-04 | 49.3 | 55.8 | 17.2 | 32.1 |
| 2026-05 | 46.4 | 51.7 | 15.4 | 31 |
| 2026-06 | 47.5 | 52.6 | 15.7 | 31.8 |
| 2026-07 | 44 | 48.8 | 14.8 | 29.2 |
| 2026-08 | 44.7 | 49.6 | 13.3 | 31.3 |
| 2026-09 | 43.6 | 48.5 | 13.5 | 30.1 |
| 2026-10 | 41.1 | 44.5 | 14.1 | 27 |
The exact SQL behind every number
SELECT
formatDateTime(toStartOfMonth(date), '%Y-%m') AS month,
round(avgIf(toFloat64(implied_volatility), underlying_symbol = 'GDX') * 100, 1) AS gdx_iv_pct,
round(avgIf(toFloat64(implied_volatility), underlying_symbol = 'GDXJ') * 100, 1) AS gdxj_iv_pct,
round(avgIf(toFloat64(implied_volatility), underlying_symbol = 'SPY') * 100, 1) AS spy_iv_pct,
round((avgIf(toFloat64(implied_volatility), underlying_symbol = 'GDX')
- avgIf(toFloat64(implied_volatility), underlying_symbol = 'SPY')) * 100, 1) AS gdx_spy_spread_pts
FROM global_markets.options_greeks
WHERE underlying_symbol IN ('GDX', 'GDXJ', 'SPY')
AND date >= '2025-10-01'
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND toFloat64(underlying_close) > 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY month
HAVING countIf(underlying_symbol = 'GDX') > 0
AND countIf(underlying_symbol = 'GDXJ') > 0
AND countIf(underlying_symbol = 'SPY') > 0
ORDER BY monthThe gap stayed open at both ends of the window. In 2025-10, GDX averaged 42.4% against SPY at 15.7%, a spread of 26.7 volatility points. By 2026-10 the pair measured 41.1% and 14.1%, a spread of 27 points, with the junior miners in GDXJ at 44.5%. A call writer selling against the miners is harvesting that spread every month. The size of the harvest moves with the line, which is why a distribution rate quoted from last month's payment is a reading, not a run rate.
What the call seller gives up when the miners run
Here is the cost side, stated plainly. A sold call stops the seller's participation at the strike. In a flat month the premium is close to pure gain. In a falling month the premium offsets part of the decline and the position still carries the full drop below it. In a month the underlying climbs well past the strike, the fund keeps the premium plus the move up to the strike, and the rest of the gain belongs to the call buyer. 2026 has been a running year for gold miners, which is the exact regime where that cap costs the most.
The panel below puts GDX's monthly price move next to GDXY's, the YieldMax option income wrapper written against GDX, for every month of 2026 on the tape.
| month | gdx_move_pct | gdxy_move_pct |
|---|---|---|
| 2026-01 | 9.9 | 0.9 |
| 2026-02 | 23 | 13.4 |
| 2026-03 | -20.4 | -23.1 |
| 2026-04 | -8 | -11.8 |
| 2026-05 | 2.7 | -3.6 |
| 2026-06 | -13 | -15.6 |
| 2026-07 | -1.3 | -5.3 |
| 2026-08 | 29.5 | 16.4 |
| 2026-09 | -7.3 | -7.9 |
| 2026-10 | 1.2 | 1 |
The exact SQL behind every number
SELECT
formatDateTime(toStartOfMonth(date), '%Y-%m') AS month,
round((argMaxIf(toFloat64(close), date, ticker = 'GDX')
/ argMinIf(toFloat64(close), date, ticker = 'GDX') - 1) * 100, 1) AS gdx_move_pct,
round((argMaxIf(toFloat64(close), date, ticker = 'GDXY')
/ argMinIf(toFloat64(close), date, ticker = 'GDXY') - 1) * 100, 1) AS gdxy_move_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('GDX', 'GDXY')
AND date >= '2026-01-01'
GROUP BY month
HAVING countIf(ticker = 'GDX') > 0
AND countIf(ticker = 'GDXY') > 0
ORDER BY monthRead the two lines together. In 2026-10 the GDX line moved 1.2% from its first close of the month to its last, against 1% for the wrapper. At the start of the year, in 2026-01, the pair printed 9.9% and 0.9%. One caveat matters more than any single month in the panel: these are price moves only. A monthly payer's share price steps down on each ex-distribution date by roughly the amount paid out, so part of the separation between the lines is cash that left the fund and reached the holder. Separating the cap from the payout takes a total return measurement, which is the next panel.
Distribution rate, SEC yield and total return are three separate numbers
Income products get misread when these three get blended, so define them once:
- Distribution rate. The most recent distribution, annualized, divided by share price or NAV. It looks backward at one payment and it changes every month on these funds. It is not a forecast of the next twelve payments.
- SEC 30-day yield. A standardized calculation of net investment income over a trailing month. Option premium is generally not investment income under that definition, which is how a covered call fund can quote an enormous distribution rate next to an SEC yield near zero. Our SEC 30-day yield versus distribution yield piece walks the formula.
- Total return. Price change plus distributions received. This is the only one of the three that answers whether a holder ended the period with more.
The panel below computes the third of those over 2026 for the plain miner ETFs, the covered call wrapper, and bullion, adding each cash distribution back at face value on the January starting price.
| symbol | price_return_pct | distributions_pct | total_return_pct | priced_window |
|---|---|---|---|---|
| GDX | 2.4 | 0 | 2.4 | Jan 2 to Oct 2, 2026 |
| GDXJ | 0.4 | 0 | 0.4 | Jan 2 to Oct 2, 2026 |
| GDXY | -37 | 34.9 | -2 | Jan 2 to Oct 2, 2026 |
| GLD | -4.6 | 0 | -4.6 | Jan 2 to Oct 2, 2026 |
The exact SQL behind every number
WITH
price_window AS
(
SELECT
ticker,
argMin(toFloat64(close), date) AS first_close,
argMax(toFloat64(close), date) AS last_close,
min(date) AS from_date,
max(date) AS through_date
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('GDX', 'GDXJ', 'GDXY', 'GLD')
AND date >= '2026-01-02'
GROUP BY ticker
),
cash AS
(
SELECT
ticker,
sum(amount) AS cash_paid
FROM
(
SELECT
ticker,
id,
max(toFloat64(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('GDX', 'GDXJ', 'GDXY', 'GLD')
AND ex_dividend_date >= '2026-01-02'
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
GROUP BY ticker
)
SELECT
p.ticker AS symbol,
round((p.last_close / p.first_close - 1) * 100, 1) AS price_return_pct,
round(ifNull(c.cash_paid, 0) / p.first_close * 100, 1) AS distributions_pct,
round(((p.last_close + ifNull(c.cash_paid, 0)) / p.first_close - 1) * 100, 1) AS total_return_pct,
concat(formatDateTime(p.from_date, '%b %e'), ' to ', formatDateTime(p.through_date, '%b %e, %Y')) AS priced_window
FROM price_window AS p
LEFT JOIN cash AS c ON c.ticker = p.ticker
ORDER BY symbolThe rows run alphabetically, so the plain senior miner ETF sits first and the wrapper third. Over Jan 2 to Oct 2, 2026, GDX returned 2.4% in total, of which 2.4% came from price and 0% from cash paid. GDXY, the covered call wrapper on that same basket, returned -2% in total: -37% from price and 34.9% from distributions. The junior miners in GDXJ came in at 0.4% and bullion in GLD at -4.6%.
Whichever way those two numbers fall in the panel on the day you read it, the structure is unchanged: the wrapper's return is premium collected plus participation up to the strike, and the plain ETF's return is the full move. A trending-up window favors the full move. A flat or choppy window favors the premium, since the cap costs nothing when the upside never arrives. The ordering in the panel is a measurement of the regime, not a property of the product. The same asymmetry shows up in the crypto covered call ETFs, where the volatility input is higher again and the cap bites harder in the up months.
Where return of capital sits in the distribution
A headline distribution rate says nothing about what the cash is made of. Funds that pay out more than their net investment income and realized gains classify the remainder as return of capital, or ROC: the holder is receiving part of their own invested principal back. ROC is not automatically a problem. Option premium often flows through the accounting as ROC even when the fund's assets are growing, and ROC generally reduces cost basis instead of being taxed as income in the year received, which defers rather than erases the tax.
What matters is where it comes from. ROC paid alongside a rising NAV is a tax character. ROC paid alongside a steadily eroding NAV is the fund shipping capital back out the door. The composition split lives in the sponsor's own documents: the monthly 19a-1 notice gives the estimated breakdown, and the annual report gives the audited one. A screener's yield field carries neither. Our return of capital in ETF distributions explainer shows how to read a 19a-1 next to a NAV history.
Who the structure actually fits
The profile is narrow and specific. A gold miner covered call ETF converts a volatile, non-income-producing exposure into monthly cash, and it hands over the right tail of the miners to do it. That trade suits a holder whose objective is current cash flow from a sleeve they have already decided to own, who is content to track cost basis adjustments in a taxable account, and who treats the quoted distribution rate as a measurement of recent premium rather than a yield they are owed. A holder whose objective is participation in a miner upcycle is buying the cap along with the cash.
Two questions to answer before buying one
- What has total return been, not the distribution rate? Pull price plus distributions over a window that contains both a run and a drawdown, the way the panel above does, and compare it against the plain ETF the fund writes against.
- What is in the latest distribution? Open the sponsor's most recent 19a-1 notice, read the ROC share of the payment, and set it beside the fund's NAV over the same stretch.
FAQ
Why do gold miner covered call ETFs have such high yields?
The funds sell call options on gold miner exposure, and option premium scales with implied volatility. Miner options price far more expected movement than S&P 500 options, as the panels above measure month by month, so the premium collected per month is larger. The quoted rate annualizes that premium.
Do covered call ETFs cap your upside?
Yes. A sold call transfers every gain above its strike to the option buyer for that expiration. The fund keeps the premium and the move up to the strike. In a strong up month that cap is the dominant cost of the structure, and it is why a covered call fund's total return can trail the ETF it writes against while still paying a large distribution.
Is the distribution rate the same thing as a dividend yield?
No. A distribution rate on these funds annualizes the most recent payment and can include option premium and return of capital, none of which is dividend income from the underlying miners. The SEC 30-day yield measures net investment income on a standardized basis and will often print far lower on the same fund.
Is return of capital in a distribution a bad sign?
Not on its own. Option premium commonly gets classified as return of capital, and ROC generally lowers cost basis rather than being taxed as income that year. The distinction worth checking is whether NAV held up over the periods the ROC was paid, which the sponsor's 19a-1 notices and annual report let you verify.
Is there a covered call ETF on junior gold miners?
The junior miner index tracked by GDXJ carries even higher at-the-money implied volatility than the senior index, as the monthly panel above shows, and option income wrappers are concentrated on the larger, more liquid option chains. Check a prospectus for the specific underlying a given fund writes against before assuming it is the junior basket.
Full data notes and method
IV panels read daily per-contract option data, filtered to converged implied volatility with non-zero volume, 20 to 45 days to expiry, and strikes within 5% of the underlying close. Readings are averaged across the qualifying contracts for each underlying, so the figure is an at-the-money IV level, not a single contract's quote.
The monthly price panel measures each ticker's first close to last close inside the calendar month. It is price only. A monthly payer steps down on ex-distribution dates, so part of the gap between the two lines is cash delivered to holders rather than upside surrendered to call buyers.
The total return panel adds each distribution back at its cash amount against the starting price, with no reinvestment compounding, and treats the first and last available closes in the window as the endpoints. Distribution rows are deduplicated by their vendor identifier before summing.
Structures differ across sponsors. Some wrappers hold the underlying shares and write calls directly on them; others build a synthetic long position with options and write calls against that. The prospectus names which, and the difference changes both the counterparty exposure and the tax character of the payout. Fund-level distribution rates, SEC 30-day yields and distribution composition in this post are described, never quoted: those figures belong to the sponsor's own 19a-1 notices, fact sheet and annual report.
Every panel on this page ships with the exact SQL beneath it, so the IV spread and the total return gap can be re-measured on any window. To run the same at-the-money comparison on a different pair of tickers, ask the question in plain English on the Strasmore terminal.