Drop your portfolio CSV export(s) for a complete breakdown of your true company exposure across every ETF, mutual fund, direct holding, and options position — fully offline. Supports Fidelity and Schwab; upload more than one file to combine multiple accounts or brokerages into a single view.
Fully offline · no API keys · no internet required Holdings database sourced from stockanalysis.com — updated May 2026
XR
XRay My Portfolio — Compare
Portfolio Comparison
Load two CSV exports (Fidelity or Schwab — mix and match if you like) to see what changed — positions added, removed, and value shifts
Snapshot A Earlier date
📂
Drop earlier CSV
e.g. May 26, 2026
→
Snapshot B Later date
📂
Drop later CSV
e.g. Jun 2, 2026
XRay My Portfolio — Comparison
Portfolio Change Report
XRay My Portfolio
Accounts & holdings
#
Company
Sector
Total exposure
% of total
Direct
Via Funds
Options (net MV)
Sources
Sector allocation
Exposure by sector
Thematic allocation
Same totals as the breakdown below — a stock like NVIDIA counts toward more than one theme, so these bars don't sum to 100% of your portfolio. Click a bar to jump to its detail below.
Exposure by theme — high risk / high reward growth themes
Semiconductors, AI infrastructure, software, biotech, crypto, and robotics tend to carry more volatility — and more upside — than the broader market. These bars overlap on purpose (a stock like NVIDIA counts toward more than one), so they won't sum to 100%.
Target allocation tracker — set your goals, see the gap in real dollars
Enter your target % for each sector. The bars show current vs target — teal means under-allocated, red means over-allocated.
Preset profiles give you a starting point you can customize.
Iconic investor models
Quick shape comparison — hover or click any row/slice to link them together
Current
Sector
Current
Target
Gap
Target — My Current
Style box — market cap × valuation
See how your portfolio's shape compares across cap size and growth/value style — independent of sector. The right column shows where your selected target model concentrates, when available.
Your portfolio
Click any cell to see holdings
Target — My Current
⚖ Rebalancing trade plan
$
Deployed first — no tax cost
Holdings ledger — all positions across all accounts
Symbol ↕
Description
Type ↕
Shares ↕
Price ↕
Market Value ↕
Cost Basis ↕
Gain / Loss $ ↕
Gain / Loss % ↕
Accounts
Gain/Loss figures use your broker's reported cost basis from the CSV.
Where that figure is missing for a position,
it is calculated instead as current value − cost basis.
Positions with no cost basis at all show — for gain/loss.
Options and money market excluded. Click any column header to sort.
Market benchmarks vs your portfolio
Pre-built database () · click Fetch to populate YTD and Δ 52-Wk High
Symbol ⇕
Description ⇕
Mkt Value ⇕
YTD ⇕
Δ 52-Wk High ⇕
1 Year ↓
3 Year ⇕
5 Year ⇕
10 Year ⇕
15 Year ⇕
Type ⇕
Multi-year returns annualized · price return only (excl. dividends) · YTD, 1yr, and Δ 52-Wk High live from Finnhub once fetched · † = 1yr still showing a static estimate (unverified, click Fetch above) · * = fund's 52-Wk High estimated from its tracking ETF · 3/5/10/15yr have no free live data source and come from a hand-maintained database — treat as rough estimates, not verified figures
Pre-buy impact analysis
Add one or more positions you're considering — the tool shows you instantly how they change your portfolio before you commit any capital. No API calls needed; uses your existing data.
Tax-loss harvesting scanner
Identifies positions in taxable accounts only where you can sell at a loss to offset capital gains and up to $3,000 of ordinary income per year.
IRA / Roth / 401k positions are excluded — losses inside tax-advantaged accounts cannot be harvested.
%
Ordinary income rate (losses held <1yr)
%
LTCG rate (losses held >1yr)
$
Skip positions below this loss
Roth conversion planner
Estimates how much of your pre-tax IRA/401(k) balance you could convert to Roth this year without leaving a target tax bracket — or model converting steadily over several years to shrink future RMDs. Uses federal tax brackets only (state tax isn't modeled). This is a planning estimate, not tax advice — confirm with a tax professional before converting.
$
Convert until you'd hit the next one
%
Retirement planner
Projects your portfolio through retirement — when the money runs out (if it does), how to withdraw across taxable / pre-tax / Roth accounts, and what that costs in tax. Compares two withdrawal strategies side by side. Federal tax only, flat 3% inflation, single-filer (one person's age/life expectancy) scope — this is a planning estimate, not tax or financial advice.
Your timeline
Additional capital — optional, e.g. inheritance, home sale, 401(k) rollover
Assumes the amount is already tax-effected when it arrives (e.g. inherited assets get a stepped-up basis, sale proceeds are net) — no additional tax is applied on receipt.
Before you retire
$/mo
$
%
After you retire
$/mo
%
$/yr
Used by the "fill bracket" strategy only
Common exceptions to the 10% early-withdrawal penalty: substantially equal periodic payments (72(t)/SEPP), permanent disability, unreimbursed medical expenses over 7.5% of income, up to $10K toward a first home (IRAs only), or leaving your job in the year you turn 55+ (401k/403b only). Only check this if one applies to you.
What if the market doesn't cooperate?
The numbers above assume the same steady growth rate every single year — real markets don't work that way. This instead runs your plan through 1,000 different simulated market histories (some strong, some weak, most in between) and checks, in each one, whether your money actually lasted. One strategy at a time, since this is meaningfully heavier to compute than the numbers above.
Charitable giving optimizer
Donating appreciated securities directly to a Donor-Advised Fund (DAF) or charity
eliminates capital gains tax entirely AND generates a deduction for the full market value —
significantly more efficient than selling first and donating cash.
% of portfolio
Adjustable — default 1%
%
For deduction value
%
20% + 3.8% NIIT
Fund overlap analysis — holdings redundancy between your funds
Overlap % = share of holdings weight that two funds have in common. Higher = more redundant. Hover any cell for shared companies.
0% no overlap50%100% identical
Correlation heatmap — top 30 holdings
Correlations based on 2-year rolling daily returns · hover a cell for details
−1.0 perfect inverse0 uncorrelated+1.0 perfect
Portfolio growth projection — future value based on historical returns
Each position is projected using its own verified historical CAGR. The portfolio total is the weighted sum of all individual projections.
Use Custom Rate to override with your own assumed growth rate.
Past performance does not guarantee future results.
Based on historical performance
Weighted portfolio CAGR: —
⚠ 1-year returns are highly volatile (FSELX +174%, NVDA +72%) and produce unrealistic long-term projections. Projection capped at 10 years. Use 10yr or 15yr basis for realistic long-term estimates.
Project forward
25 years
1yr10yr25yr50yr75yr100yr
Monthly DCA contribution
$/month
e.g. $1,000/day = $22,000/mo
✏️ Custom Growth Rate Override— bypasses historical CAGR, applies a single flat rate to the entire portfolio
Annual growth rate12.0%
1%10%19%28%50%
Rate context
vs historical benchmarks
Starting value
$0
→
Projected value
$0
Total gain
+$0
0×
DCA contribution
$0
All positions — projected individual value (click any column to sort)
Symbol ↕
Description ↕
Current Value ↕
CAGR ↕
Projected Value ↕
Multiple ↕
⚠ Projections use historical CAGR compounded annually. Returns are not guaranteed. 1yr CAGR figures are highly volatile and not recommended for long-term projection.
Sources: financecharts.com, averageannualreturn.com, portfolioslab — verified June 2026.
Monte Carlo simulation — 1,000 scenarios
Samples annual returns from a normal distribution to show the realistic range of outcomes — not a single line, but a probability fan. Adjust the expected return and volatility to match your assumptions.
Whose historical return/risk to simulate with
Longer basis smooths out recent volatility
%
Portfolio weighted CAGR
%
S&P 500 avg: ~15% · Growth-tilt: 18–22%
ⓘ How is this calculated?
$
yrs
How the default volatility is calculated
Instead of a flat assumption, this is estimated from your actual holdings:
Every dollar you hold — including fund look-through — is bucketed into one of 9 style-box cells (Large/Mid/Small × Value/Blend/Growth), the same classification used by the Style Box and Ratings features.
Each cell has a standard equity beta assigned to it (below).
Your portfolio beta = the dollar-weighted average beta across all 9 cells.
Run the analysis to see your own cell-by-cell weighting here.
You can always type over the default with your own assumption — this is just a starting point grounded in what you actually hold, not a fixed rule.
Goal calculator
Probability of reaching
$
by year
yr
Goal calculator — what does it take?
Enter a target and timeline. The tool works backwards across three levers — returns, savings, and time — to show exactly what each path requires. Reuses your portfolio's current CAGR and Monte Carlo volatility estimate.
$
$
%
Portfolio weighted 5yr
%
Starting from: current portfolio value
Stress test simulator — estimate portfolio impact under shock scenarios
〰️ Rate Change Scenario
Slide right for a rate hike · slide left for a rate cut · each step = 25 bps · max ±400 bps
✂️ Rate Cut
0 bps
Move the slider to set a rate change
📈 Rate Hike
−400−2000+200+400
Estimated sector impact:
🛢️ Oil Price Sensitivity
Drag to set WTI crude price per barrel · Base: $92/bbl (Jun 2026) ·
Historical range: $10–$147 · Slider: $10–$150
$92
per barrel · base price
$10$40$92↑base$107$150
Historical reference prices — click to jump
💵 U.S. Dollar Index (DXY)
Slide right = stronger dollar ·
slide left = weaker dollar ·
Base: 99.2 (Jun 2026) ·
Range: 70–130
99.2
base value · no change
709099↑base110130
Historical reference levels — click to jump
🥇 Gold Price Sensitivity
Drag to set gold price per troy ounce ·
Base: $4,517/oz (Jun 2026) ·
Range: $500–$8,000
$4,517
per troy ounce · base price
$500$2K$3.5K$4.5K↑base$6K$8K
Historical reference prices — click to jump
📊 Inflation Rate (CPI) Sensitivity
Slide to set annual CPI rate ·
Base: 3.8% (Apr 2026 — BLS) ·
Range: 0%–15% · Step: 0.1%
3.8%
annual CPI · base rate
0%2% ▼ Fed target3.8%↑ base6%9%12%15%
Historical reference levels — click to jump
🏭 Producer Price Index (PPI) Sensitivity
Annual PPI rate ·
Base: 6.0% (Apr 2026 YoY — BLS) ·
Range: 0%–20% · Step: 0.1% ·
PPI leads CPI by ~2–3 months — a margin compression indicator
6.0%
annual PPI · base rate
0%5%6%↑base10%15%20%
Historical reference levels — click to jump
📈 GDP Growth Rate Sensitivity
Slide to set annualized real GDP growth rate ·
Base: 1.6% (Q1 2026 — BEA) ·
Range: −4% to +8% · Step: 0.1%
1.6%
annualized real GDP · base rate
−4%0%1.6%↑base3%+8%
Historical reference levels — click to jump
Custom scenario — set shocks per sector or company
Drag sliders to apply a % change. Positive = gain, negative = loss.
−$0
Dampener: 65% · Min correlation: 0.45
Impact breakdown by position
⚠ Estimates assume linear price movements. Options impact uses net delta × price change (first-order approximation — ignores gamma, theta, vega). Fund impacts are calculated only on tracked top holdings; actual fund NAV changes may differ. Not financial advice.
Top 20 exposures by total dollar value
Direct stock
Via fund / ETF
Options net MV
Spread P&L tracker — net cost, current value, and return multiple per position
Underlying ⇕
Structure ⇕
Contracts ⇕
DTE ⇕
Cost basis ⇕
Current value ⇕
P&L $ ↓
Current × ⇕
Max $ (at expiry) ⇕
Max × ⇕
% of max ⇕
Breakeven ⇕
Naked / single-leg positions — includes legs that couldn't auto-pair into a clean two-leg spread, shown individually
Underlying
Leg
Contracts
DTE
Premium / cost basis
Current value
P&L $
% of max
⚠ Cost basis and P&L are computed from each leg's own broker-reported cost basis and gain/loss — not estimated.
Max $ and breakeven assume the position is held to expiration and apply only to clean two-leg vertical spreads.
Spreads are paired when contract counts match exactly between a long and short leg in the same underlying/expiry/type, or
when the remaining legs on one side sum exactly to a single leg on the other — brokers report one row per contract, not
per trade, so a strike sold as the hedge for two separate spreads shows up as one combined row; that row is split
proportionally by contracts to recover each spread. Anything that still can't be paired is shown individually below
instead of guessed at. Click any row to see its legs. Options parsing currently covers Fidelity exports only — Schwab
option positions are detected but not yet included here.
Finnhub APIClick Refresh to fetch live data
Dividend & income tracker — estimated annual income
Database vintage: ·
fund yields via look-through · use ↻ Refresh Live for current Finnhub data ·
📦 Rebuild DB quarterly
⏰ Consider refreshing — click 📦 Rebuild DB in the controls bar.
Annual dividend income
—
fetch live data to calculate
Monthly income
—
average monthly run rate
Portfolio yield
—
weighted avg yield
Positions paying
—
of total positions
Symbol ⇕
Description ⇕
Market Value ⇕
Annual Yield % ↓
Est. Annual Income ⇕
Est. Monthly Income ⇕
Frequency ⇕
Click ⚡ Fetch Income Data to load dividend yields from Finnhub
Italic rows = fund look-through estimates (weighted avg of constituent yields). Coverage % = fraction of fund weight mapped. Stock yields live from Finnhub.
Fee drag analyzer — annual cost of fund expense ratios
Shows the annual dollar cost of expense ratios across all your fund holdings and estimates
the 10-year compounded opportunity cost — what those fees could have grown to if invested instead.
Direct stocks have zero expense ratio. Data pre-built; refresh annually as expense ratios change.
%
Used to compute 10yr opportunity cost
XRay Score — style-aware fundamental rating
A 0–100 composite score covering valuation, profitability, financial health, and risk —
compared against peers in the same market-cap × style category, not the whole market.
A high-P/E growth stock isn't automatically penalized for being growth; it's judged against other growth names,
and where trailing growth data is available, valuation also factors a PEG-style check (P/E ÷ growth rate) —
so a 30%-grower at a premium multiple isn't scored the same as a flat-growth stock at the same P/E.
Click any row to see the four sub-scores that make up the total.
Finnhub APIFetches fundamentals (P/E, P/B, ROE, debt/equity, beta, growth) per position
Symbol ↕
Description ↕
Style Box ↕
Market Value ↕
XRay Score ↕
Rating
Click ⭐ Fetch Ratings to load fundamentals from Finnhub
⚠ XRay Score is a transparent, rules-based composite — not a recommendation to buy or sell.
Benchmarks are derived from approximate 2026 market data by style-box category (Russell 1000 Growth/Value spreads,
sector P/E surveys) and are themselves approximations, not live peer medians.
Score components: Valuation 25pts · Profitability 25pts · Financial Health 25pts · Risk Profile 25pts.
Funds/ETFs are scored as the weighted average of their tracked underlying holdings.
📦 Rebuilding yield database
Fetching dividend yields from Finnhub for all tickers…
✓ Complete — new yields applied to this session.
Click below to download an updated db.js with the new yields baked in. Upload it to Cloudflare Pages (alongside the unchanged app.html) to make it permanent.
Teach this fund —
Add its top holdings (from the fund's own factsheet) so it shows up in company & sector look-through. Doesn't need to add up to 100% — just the names that matter most.
Sign up free to unlock this
Company Exposure is free forever. Everything else needs a free account.
No password. We'll only use this to send you a sign-in link — see our privacy policy.
📬
Check your email
We sent a sign-in link to . Click it from this same browser to pick up right where you left off — no need to re-upload your CSV.
🔌
If this keeps happening, try disabling extensions for this site, or open it in a private window.