Guest mode: your portfolio is kept in this browser until you connect.

Sys onlineGuest--:-- local

Tax-loss harvesting ETF pairs: how closely 32 swaps moved, and why a high correlation is not the same return

We measured 32 ETF pairs over 261 weeks to Oct. 16, 2026. Same-index pairs never moved more than 1 point apart in a week. Different-index pairs correlated 0.930 to 0.996, yet SMH and SOXX, at 0.987, ended the year 13.82 points apart. Whether a pair is “substantially identical” is a legal question.

Julien Esnault
Julien Esnault

· 10 min read

Bar chart of the share of 261 weeks to October 16, 2026 in which two ETFs’ returns were more than 1 point apart: SMH and SOXX 20.3% despite a 0.987 correlation, VIG and VYM 15.7%, VWO and EEM 6.5%, QQQ and VUG 5.7%, VOO and VTI 0.0%

The short version: VOO and VTI were the closest different-index swap of 32 tax-loss harvesting ETF pairs we measured: correlation 0.996 over 261 weeks to October 16, 2026, and 0.60 points apart over the year. Correlation is not return, though: the chip funds SMH and SOXX, at 0.987, ended the year 13.82 points apart.

A harvest swap sells a fund at a loss and buys a substitute, so the money stays invested. The four pairs that track the same index never moved more than 1 point apart in a week; the 28 on different indexes correlated 0.930 to 0.996. The substitute has two jobs: move like the fund it replaces, and not be "substantially identical" to it under the US wash-sale rule. This study measures the first job only. The second is a legal question, and no price statistic answers it.

32 pairs sharing half their holdings or moreSame index (4 pairs)Different index (28 pairs)
Correlation of weekly returns0.9997 to 0.99990.930 to 0.996, median 0.967
Weeks more than 1 point apart0.0% in every pairmedian 22.2%, up to 36.8%
Gap over the last year, either way0.08 points at mostmedian 5.37, up to 18.62 points
Of a fund's 26 worst weeks, also its pair's25 or 26median 20, as few as 17

A point is a percentage point of return. "Same index" means VOO, SPY and IVV with each other (S&P 500) and QQQ with QQQM (Nasdaq-100). Weekly total returns from Yahoo Finance, weeks ending October 22, 2021 to October 16, 2026.

The 32 pairs are every pair of the 30 funds in our ETF overlap study that hold at least half the same money by weight, on the issuers' full holdings files. Overlap by weight is, for each company both funds hold, the smaller of its two weights, added up. Correlation runs from −1 to 1; at 1, two funds rise and fall together, in exact proportion, every week. Of the 28 different-index pairs, 18 correlated 0.95 or more and 4 reached 0.99.

Why SMH and SOXX correlate at 0.987 and still drift apart

Correlation says whether two funds move in the same direction at the same time. It does not say by how much. The VanEck Semiconductor ETF (SMH) and the iShares Semiconductor ETF (SOXX) correlated 0.987 over the 261 weeks, yet in 53 of those weeks, 20.3%, their returns were more than 1 point apart. No other pair at 0.98 or more had more than 5.7% of its weeks that far apart.

The holdings explain it. The two funds hold 22 of the same companies, and 91.8% of SMH's money sits in companies SOXX also owns. But they weigh them differently, so their overlap by weight is 66.7%: SMH puts 67.6% of its money in its ten largest holdings, against 61.7% for SOXX, in the issuers' files of September 24, 2026. Every line of both funds is on the SMH vs SOXX overlap page.

Over the last year the gaps added up one way: from October 17, 2025 to October 16, 2026, SMH returned 57.9% and SOXX 71.8%, with dividends. Over the whole five years they went the other way: SMH 323.7%, SOXX 238.5%. The SMH vs SOXX comparison shows fees and returns side by side.

Over one year, how far each swap drifted

Over the year to October 16, 2026, the two funds of a different-index pair ended a median 5.37 points apart, and 15 of the 28 pairs 5 points or more. The four same-index pairs ended at most 0.08 points apart.

Bar chart of the one-year return of the first ETF minus the second, October 17, 2025 to October 16, 2026, in points: QQQ minus VUG +7.30, VEA minus EFA +4.18, VOO minus VTI +0.60, VGT minus XLK −2.46, VIG minus VYM −3.29, VYM minus VTV −5.63, VWO minus EEM −9.13, SMH minus SOXX −13.82
Return of the first fund minus the second over one year. Source: Yahoo Finance adjusted weekly closes; same-index pairs at most 0.08 points.

The gap runs both ways. The Invesco QQQ Trust (QQQ) returned 7.30 points more than the Vanguard Growth ETF (VUG); the Vanguard Information Technology ETF (VGT) 2.46 points less than the Technology Select Sector SPDR (XLK). The widest gap was VUG against XLK, 18.62 points: VUG returned 10.8% and XLK 29.4%. The closest different-index pair, VOO against the Vanguard Total Stock Market ETF (VTI), ended 0.60 points apart (VOO vs VTI).

In the worst weeks, the substitutes fell too

We took each fund's 26 worst weeks, its worst 10%, and counted how many were also among its pair's 26 worst. The different-index pairs shared a median 20 of 26, and the lowest was VUG against XLK, 17 of 26.

Bar chart of how many of a fund's 26 worst weeks out of 261 were also among its substitute's 26 worst, to October 16, 2026: VOO and VTI 25, VEA and EFA 25, VWO and EEM 24, SMH and SOXX 24, VGT and XLK 23, QQQ and VUG 22, VYM and VTV 21, VIG and VYM 21
Of each fund's 26 worst weeks, how many were its pair's too. Source: Yahoo Finance adjusted weekly closes; median of the 28 different-index pairs 20 of 26.

SMH and SOXX shared 24 of their 26 worst weeks: they fell in the same weeks, by different amounts.

Overlap by weight comes first

Of the 435 pairs among the 30 funds, 32 hold at least half the same money by weight, and those 32 are the pairs in this study. Below that line, correlation falls fast. One pair under 50% overlap correlated 0.95 or more: the Vanguard Dividend Appreciation ETF (VIG) and the SPDR Dow Jones Industrial Average ETF (DIA), at 0.958 with 33.8% overlap.

Scatter plot of holdings overlap by weight against weekly return correlation for all 435 pairs of 30 ETFs over 261 weeks to October 16, 2026: 32 pairs at 50% overlap or more, the 28 different-index ones correlated 0.930 to 0.996, SMH and SOXX at 0.987, VOO and VTI at 0.996, VIG and DIA at 0.958
Holdings overlap from the issuers' files, August 31 to October 1, 2026, against weekly correlation. Source: Yahoo Finance adjusted weekly closes; issuers' holdings files.

All 32 pairs

Sorted by correlation. In "VOO–VTI", VOO is the first fund and VTI the second; the 1-year gap is the first fund's return minus the second's, October 17, 2025 to October 16, 2026, in points; worst weeks counts how many of the first fund's 26 worst weeks were the second's too.

PairSame indexOverlapCorr.Weeks over 1 pt1-year gapWorst weeks
QQQ–QQQMyes98.3%0.99990.0%−0.0526
VOO–SPYyes96.5%0.99990.0%+0.0826
SPY–IVVyes99.8%0.99980.0%−0.0625
VOO–IVVyes96.5%0.99970.0%+0.0225
VOO–VTIno88.6%0.99630.0%+0.6025
SPY–VTIno88.3%0.99630.0%+0.5225
VTI–IVVno88.3%0.99590.0%−0.5924
VGT–XLKno82.6%0.99392.3%−2.4623
VEA–EFAno65.5%0.98992.3%+4.1825
SMH–SOXXno66.7%0.987220.3%−13.8224
VYM–VTVno69.9%0.98551.9%−5.6321
QQQ–VUGno58.8%0.98315.7%+7.3022
QQQM–VUGno58.9%0.98315.4%+7.3422
QQQM–VGTno51.7%0.975320.7%−8.8220
QQQ–VGTno51.4%0.975221.8%−8.8620
VWO–EEMno71.8%0.97116.5%−9.1324
QQQM–XLKno56.7%0.969623.4%−11.2818
QQQ–XLKno55.9%0.969622.6%−11.3218
VUG–VGTno57.1%0.964326.1%−16.1619
IVV–VUGno58.2%0.955730.7%+5.4020
SPY–VUGno58.3%0.955631.8%+5.3319
VOO–VUGno57.3%0.955532.6%+5.4119
VUG–XLKno56.1%0.949629.9%−18.6217
VTI–VUGno52.1%0.947433.3%+4.8118
VOO–QQQno53.8%0.943236.8%−1.8818
SPY–QQQno55.5%0.943036.4%−1.9618
VOO–QQQMno53.8%0.943036.8%−1.9318
QQQ–IVVno55.5%0.942935.6%+1.9019
SPY–QQQMno55.4%0.942836.4%−2.0118
IVV–QQQMno55.3%0.942736.0%−1.9519
VIG–VTVno51.0%0.937213.0%−8.9223
VIG–VYMno60.3%0.929815.7%−3.2921

Three readings:

  • QQQ and QQQM against the three S&P 500 funds were apart most often: more than 1 point apart in 35.6% to 36.8% of weeks, at a correlation of about 0.943. The Nasdaq-100 holds the S&P 500's largest companies at much larger weights (VOO vs QQQ).
  • Two technology funds, VGT and XLK, correlated 0.994 with 2.3% of weeks over 1 point, yet ended the year 2.46 points apart (VGT vs XLK).
  • The international pairs are closer than their overlap suggests: VEA and EFA, 65.5% overlap, correlated 0.990, and VWO and EEM, 71.8%, correlated 0.971 (VEA vs EFA).

What the wash-sale rule says, and what this data can't tell you

IRS Publication 550 (2025) defines the rule: "A wash sale occurs when you sell or trade stock or securities at a loss and within 30 days before or after the sale you: Buy substantially identical stock or securities". The list goes on: acquiring them in a fully taxable trade, acquiring a contract or option to buy them, and "Acquire substantially identical stock for your individual retirement arrangement (IRA) or Roth IRA." It adds: "If you sell stock and your spouse or a corporation you control buys substantially identical stock, you also have a wash sale."

On what "substantially identical" means, it says: "In determining whether stock or securities are substantially identical, you must consider all the facts and circumstances in your particular case." Its examples are about one corporation's stock, bonds and preferred stock. It names no test for two funds, and no threshold of correlation or overlap.

So this study draws no line. A correlation of 0.9999 does not make two funds substantially identical, and a correlation of 0.930 does not make a swap safe. The "same index" column is a fact about what each fund tracks, not a legal finding. For a real sale, ask a tax professional. The funds are US-listed and the rule is the US one; other countries tax fund sales under their own rules.

What to do with your own funds

If you are weighing a swap, three checks the data supports:

  1. What the two funds hold. Add your funds, even roughly, to see every pair measured on the issuers' full files, as in the ETF overlap tool:
› your funds, side by side

your two most alike funds

??.?%

Two funds can hold the same companies at nearly the same weights.

three funds many readers hold

pairoverlap
VOO × VTI503 companies in both88.6%
VOO × QQQ86 companies in both53.8%
QQQ × VTI91 companies in both48.0%
  1. How far they drifted. Find your pair in the table of all 32 pairs. The head-to-head pages, such as VOO vs VTI, put returns and fees side by side, and the VOO vs VTI overlap page lists all 503 shared companies. A high correlation with many weeks over 1 point, like SMH and SOXX, means the substitute can end months later well above or below the fund you sold.
  2. What else you own. A swap changes one line; the portfolio X-ray adds up the same company held through several funds, and you can import your positions to see each line's gain or loss in one place.

More on fund overlap: two mid-cap ETFs with one stock in common, and how to benchmark a portfolio against the S&P 500 on the same basis.

Not investment or tax advice: this study describes how the funds moved over those dates.

How we measured

  • Funds and pairs: the 30 US-listed ETFs of our overlap study and all 435 pairs. Overlap by weight is the sum, over companies both funds hold, of the smaller weight, from each issuer's full holdings file (August 31 to October 1, 2026), matched on ISIN. The candidates are the 32 pairs at 50% or more; 4 track the same index.
  • Prices: Yahoo Finance daily adjusted closes, with dividends and splits folded in, fetched October 19, 2026. A week's close is the last close of each Saturday-to-Friday week, from the week ending October 15, 2021 to the week ending October 16, 2026: 261 weekly returns. All 30 funds trade over the whole window.
  • Measures: correlation is the Pearson correlation of the two funds' 261 weekly returns. A week counts as more than 1 point apart when the two returns differ by more than 1 percentage point. The 1-year gap is the first fund's total return minus the second's, October 17, 2025 to October 16, 2026. The worst weeks are each fund's 26 lowest weekly returns, its worst 10%; the count depends on where the 26-week line falls, which is why SPY and IVV, at 0.9998, share 25 of 26 and not all 26.
  • What would change the result: the window (five years with the 2022 rate shock and the 2025–26 chip rally; another stretch can bring pairs like SMH and SOXX closer or push them apart), the frequency (daily returns would likely lower the international funds' correlations, since their holdings trade hours before the US close), the 1-point and 10% thresholds, the 50% cut, and index changes since the holdings files. Fees are inside the prices; trading costs and taxes on dividends are not.

Reproduce it

The 32 pairs and the headline figures, from Yahoo Finance with yfinance. We ran it on October 19, 2026, and it prints the same numbers as the study's results file.

Show the code48 lines of Python, and what it printed
# Reproduces https://portfolio-terminal.com/blog/tax-loss-harvesting-etf-swap-pairs
# pip install pandas yfinance
import pandas as pd
import yfinance as yf

# The 32 pairs of the 30-fund ETF overlap study that share at least half their
# holdings by weight. "=" marks the four pairs that track the same index.
PAIRS = ("VOO-SPY= QQQ-QQQM= SPY-IVV= VOO-IVV= VOO-VTI SPY-VTI VTI-IVV VGT-XLK "
         "VEA-EFA SMH-SOXX VYM-VTV QQQ-VUG QQQM-VUG QQQM-VGT QQQ-VGT VWO-EEM "
         "QQQ-XLK QQQM-XLK VUG-VGT IVV-VUG SPY-VUG VOO-VUG VUG-XLK VTI-VUG "
         "VOO-QQQ VOO-QQQM SPY-QQQ QQQ-IVV SPY-QQQM IVV-QQQM VIG-VTV VIG-VYM").split()
SHOWCASE = ["VOO-VTI", "VGT-XLK", "VWO-EEM", "VEA-EFA", "SMH-SOXX", "VYM-VTV", "QQQ-VUG", "VIG-VYM"]
tickers = sorted({t for p in PAIRS for t in p.rstrip("=").split("-")})

# Adjusted daily closes (dividends folded in), then the last close of each
# Saturday-to-Friday week, Oct. 15, 2021 to Oct. 16, 2026.
px = yf.download(tickers, start="2021-09-01", end="2026-10-17", auto_adjust=True, progress=False)["Close"]
px.index = pd.to_datetime(px.index).tz_localize(None)
weekly = px.resample("W-FRI").last().loc["2021-10-15":"2026-10-16"]
r = weekly.pct_change().dropna()
k = int(len(r) * 0.10)
year = weekly.loc["2026-10-16"] / weekly.loc["2025-10-17"] - 1


def measure(pair):
    a, b = pair.rstrip("=").split("-")
    worst_a, worst_b = set(r[a].nsmallest(k).index), set(r[b].nsmallest(k).index)
    return {"pair": pair.rstrip("="), "same": pair.endswith("="),
            "rho": r[a].corr(r[b]),
            "over1pp": ((r[a] - r[b]).abs() > 0.01).mean(),
            "diff1y": (year[a] - year[b]) * 100,
            "shared": len(worst_a & worst_b)}


t = pd.DataFrame([measure(p) for p in PAIRS]).set_index("pair")
print(f"Weekly returns: {len(r)} (weeks ending {r.index[0].date()} to {r.index[-1].date()}); worst 10% = {k} weeks")
for label, g in (("Same index", t[t.same]), ("Different index", t[~t.same])):
    print(f"{label}: {len(g)} pairs")
    print(f"  correlation  min {g.rho.min():.4f}  median {g.rho.median():.4f}  max {g.rho.max():.4f}")
    print(f"  weeks >1pp apart  median {g.over1pp.median() * 100:.1f}%  max {g.over1pp.max() * 100:.1f}%")
    print(f"  1-year gap (abs)  median {g.diff1y.abs().median():.2f}pp  max {g.diff1y.abs().max():.2f}pp")
    print(f"  worst weeks shared  median {g.shared.median():g}/{k}  min {g.shared.min()}/{k}")
d = t[~t.same]
print(f"Different-index pairs with correlation >= 0.99: {(d.rho >= 0.99).sum()}, >= 0.95: {(d.rho >= 0.95).sum()}")
print("Pair       corr    weeks>1pp  1y gap    worst weeks shared")
for p in SHOWCASE:
    x = t.loc[p]
    print(f"{p:<10} {x.rho:.4f}  {x.over1pp * 100:5.1f}%    {x.diff1y:+6.2f}pp  {x.shared}/{k}")
Weekly returns: 261 (weeks ending 2021-10-22 to 2026-10-16); worst 10% = 26 weeks
Same index: 4 pairs
  correlation  min 0.9997  median 0.9999  max 0.9999
  weeks >1pp apart  median 0.0%  max 0.0%
  1-year gap (abs)  median 0.06pp  max 0.08pp
  worst weeks shared  median 25.5/26  min 25/26
Different index: 28 pairs
  correlation  min 0.9298  median 0.9669  max 0.9963
  weeks >1pp apart  median 22.2%  max 36.8%
  1-year gap (abs)  median 5.37pp  max 18.62pp
  worst weeks shared  median 20/26  min 17/26
Different-index pairs with correlation >= 0.99: 4, >= 0.95: 18
Pair       corr    weeks>1pp  1y gap    worst weeks shared
VOO-VTI    0.9963    0.0%     +0.60pp  25/26
VGT-XLK    0.9939    2.3%     -2.46pp  23/26
VWO-EEM    0.9711    6.5%     -9.13pp  24/26
VEA-EFA    0.9899    2.3%     +4.18pp  25/26
SMH-SOXX   0.9872   20.3%    -13.82pp  24/26
VYM-VTV    0.9855    1.9%     -5.63pp  21/26
QQQ-VUG    0.9831    5.7%     +7.30pp  22/26
VIG-VYM    0.9298   15.7%     -3.29pp  21/26

Sources: IRS Publication 550 (2025), Wash Sales · 26 U.S. Code § 1091, wash sales · Yahoo Finance SMH price history · VanEck Semiconductor ETF (SMH) holdings · iShares Semiconductor ETF (SOXX) · Vanguard Total Stock Market ETF (VTI)

#research#etfs

Keep reading

8 min read30 popular ETFs, 435 pairs: which ones are the same fund?VOO and VTI are 88.6% the same money, VOO and QQQ 53.8%, SCHD and VOO 7.9%. We measured all 435 pairs of 30 popular ETFs on the issuers’ full holdings files, and why top-10 calculators get most of them wrong.9 min readVO vs IJH: two mid-cap ETFs with one stock in common, and what fund size labels really holdThe Vanguard Mid-Cap ETF (VO) and the iShares Core S&P Mid-Cap ETF (IJH) share one company and 0.3% of their money. We split 8 popular funds by S&P index on the issuers’ full holdings files: VO is 90.8% S&P 500, and Vanguard’s Small-Cap ETF only 18.6% S&P SmallCap 600.5 min readIs My Portfolio Actually Diversified?A portfolio can look busy and still be concentrated. This checklist helps you spot hidden overlap in positions, sectors, currencies, and risk.

cite: Julien Esnault, “Tax-loss harvesting ETF pairs: how closely 32 swaps moved, and why a high correlation is not the same return”, Portfolio Terminal, 2026-10-20. plain-text version for AI tools

Try it on your own holdings

portfolio terminal

Measure your own portfolio’s risk, not a textbook one.

Import your positions from any broker and see your volatility, beta, drawdown and correlations every morning.

Wall Street in 60s, every morning. What’s in it

One short email before the open. Unsubscribe anytime.