Historical Return Comparison

Pick up to 5 tickers and a custom date range. All series are rebased to 100% on the start date, so you can compare cumulative returns directly. End-of-period returns are labeled on the chart.

1. Add Tickers (up to 5)

Tip — cross-rates & ratios: use * to multiply or / to divide two series. Examples: BTC-USD*IDR=X (BTC in IDR), AAPL*IDR=X (AAPL in IDR), BTC-USD/ETH-USD (BTC/ETH ratio), ^GSPC/GLD (S&P 500 in gold).

2. Pick Date Range

What This Tool Does

Comparing the absolute price of, say, Berkshire Hathaway ($700,000) against Tesla ($300) tells you nothing useful — the price levels were set by historical share-issuance accidents. What matters is relative performance: how many percent has each asset gained or lost since you started watching them?

This calculator solves that problem by rebasing every ticker. On your chosen start date, each line begins at exactly 100. Every subsequent point shows that ticker's value as a percentage of its starting price. A line ending at 130 = +30%; a line ending at 85 = −15%. The end-of-period return is labeled directly on the chart for instant readability.

How "Rebase to 100" Works

The mathematics is intentionally simple. For each ticker:

Rebased_t = (Price_t / Price_start) × 100

Where Price_start is the first available closing price on or after your selected start date, and Price_t is the closing price on day t. This is the same methodology used by Bloomberg's PEER function, Morningstar's growth-of-$10,000 chart, and most institutional research platforms.

Outlier Filter — Spike-and-Revert Detection

Free price feeds (Yahoo Finance especially) occasionally publish obviously wrong bars — a single day where the price jumps by 50–80% and then snaps back the next day to where it was before. These are upstream data-vendor glitches, not real market events. Left untreated, one bad bar can dominate a 3-year rebased chart and make a 30% gainer look like a 130% rocket-ship.

The Outlier filter (%) applies a smart deviate-and-return check. It tracks the last good price level and only clips bars that jump away from it and then come back — the signature of a feed error:

  1. Step 1 — Measure deviation. For each bar, compute how far it sits from the last good level: deviation = |close − lastGood| / lastGood. If deviation ≤ threshold, the bar is accepted and becomes the new lastGood.
  2. Step 2 — On a spike, scan ahead. If a bar deviates by more than the threshold, look forward up to 5 bars for the first one that returns — defined as sitting proportionally closer to lastGood than to the spike value. (This test is deliberately independent of the threshold: at a tight 1% setting, FX legitimately drifts more than 1% across a 1–3 day glitch window, so a strict "back within 1%" rule would never fire and the glitch would survive. A real ÷10 glitch sits ~90% away from the good level, so any normal bar afterward is overwhelmingly closer to lastGood than to the glitch.)
    • Return found → every bar in the run between the spike and the return is a glitch. They are flattened to lastGood (a straight segment through the bad data). This correctly handles multi-day glitches — e.g. Yahoo's notorious ÷10 scaling errors that span 2–3 consecutive days.
    • No return within 5 bars → the price stayed at the new level, so it's a real, sustained move (a true crash, an earnings gap, an unadjusted stock split). The bar is kept exactly as-is, even though it exceeds the threshold.
  3. The tail of the series (a spike near the end with no later bar to confirm a return) is kept raw — we never invent a reversion.

This means the filter preserves genuine large moves — a real 30% earnings gap, a crypto crash that stays down, a stock split — while removing obvious 1-to-5-day feed glitches that snap back to where the price was before. A real example we caught: AUDIDR=X on Yahoo had three consecutive days at ~1,120 (a ÷10 error) sandwiched between normal values of ~11,200 — the filter flattens the three bad bars back to ~11,200.

Pilot values:

  • 5–10% (default 10) — tight, recommended for FX pairs and equity baskets. Real daily FX moves rarely exceed 5%, and the 1987 Black Monday on S&P was −22.6% (still rare).
  • 15–25% — moderate, for mixed portfolios including small-caps or emerging-market equities.
  • 40–50% — loose, use only when comparing crypto which legitimately can move 20–40% in a day.
  • 0 — disable filtering entirely (show raw data).

Remember: a high threshold only loosens the trigger. The spike-and-revert verification still has to confirm a glitch before clipping — so even with a tight 10% threshold, legitimate large moves that stay at the new level (real crashes, splits, earnings gaps) are preserved.

The filter is applied before rebasing, so the start price, end price, and CAGR columns in the table reflect the cleaned series. Change the threshold and the chart re-renders instantly — no re-fetch needed.

What Each Metric in the Summary Means

  • Total Return — the simple percentage change from start to end. (End / Start − 1) × 100%.
  • Annualized (CAGR) — Compound Annual Growth Rate. Restates the total return as a constant annual rate. CAGR = (End / Start)^(365 / days) − 1. Useful when comparing periods of different length.
  • Max Drawdown — the largest peak-to-trough decline observed in the period, expressed as a negative percentage. A −30% MDD means at some point in the window, the asset fell 30% from its recent high. This is the standard risk measure for evaluating downside experience.

Use Cases

  • Benchmark check: Compare your portfolio holding against SPY (S&P 500 ETF). If you bought AAPL on 2023-01-01, did you beat the index?
  • Sector pair trade: Plot AAPL, MSFT, GOOGL, META, NVDA over the last 2 years to see which big-tech name has had the smoothest ride.
  • Crypto vs equities: BTC-USD vs SPY vs GLD over 5 years — has Bitcoin actually been a better store of value than gold?
  • Indonesian context: BBCA.JK vs ^JKSE vs USDIDR=X — was holding bank stocks better than holding dollars from 2020?
  • Pre-trade due diligence: Before buying, see how the ticker compares to its peer group over the same period.

Cross-Rates & Ratio Symbols (Synthetic)

You can combine two symbols with * (multiply) or / (divide) to create a synthetic series on the fly. This is most useful when the pair you want isn't directly traded with deep liquidity — or for comparing relative performance.

The math is simple. For each daily bar in the first operand, the engine looks up the latest available value of the second operand on or before that date (forward-fill — handles FX weekends where crypto has bars but forex doesn't), then multiplies or divides:

Synthetic_t = Price_A_t ⊙ Price_B_t′   where t′ ≤ t and ⊙ ∈ {×, ÷}

Common Cross-Rate Recipes

  • BTC priced in Indonesian Rupiah: BTC-USD*IDR=X. Combines deep Binance liquidity for BTC-USD with Yahoo's USD/IDR rate. More reliable than the thin BTC-IDR pair on local exchanges.
  • US stock in your home currency: AAPL*IDR=X shows what Apple's price looked like in IDR over time — useful when comparing against an IDR-denominated benchmark like BBCA.JK.
  • Convert any USD asset to JPY: SPY*JPY=X, GLD*JPY=X, QQQ*JPY=X.
  • Gold in EUR: GC=F*EURUSD=X (GC=F is in USD; multiply by EUR/USD to get EUR per ounce).

Common Ratio Charts

Dividing two series produces a ratio chart — a classic technical-analysis view that strips out market-wide moves and isolates relative strength.

  • BTC vs ETH: BTC-USD/ETH-USD — when rising, BTC is outperforming ETH (the "BTC dominance" view).
  • Stocks vs gold: ^GSPC/GLD — falling = gold winning, e.g. during inflation/risk-off regimes.
  • Tech vs broad market: QQQ/SPY — Nasdaq leadership indicator.
  • Bank A vs Bank B: BBCA.JK/BMRI.JK — relative strength inside the same sector.
  • Yen-adjusted Nikkei: ^N225/JPY=X — shows real (currency-stripped) Japanese equity performance.

Important Caveats

  • One operator only. The parser supports a single * or / per ticker. A*B*C is not supported in v1.
  • Date alignment is forward-fill. If A has a bar on a date where B doesn't, the engine uses B's most recent prior value. For Saturday BTC × USD/IDR, the Friday close of USD/IDR is reused.
  • No overlap = no series. If A starts in 2024 and B ends in 2023, you get an error.
  • Yahoo FX format quirk: IDR=XUSDIDR=X (USD-base implicit). For non-USD-base pairs, use the explicit form: EURIDR=X, JPYIDR=X.

Symbol Format Reference

  • US stocks & ETFs: AAPL, SPY, QQQ, BRK-B
  • Indonesian stocks (IDX): add suffix .JK — e.g. BBCA.JK, TLKM.JK, ASII.JK
  • European stocks: .AS (Amsterdam), .PA (Paris), .L (London) — e.g. ASML.AS
  • Crypto: Yahoo format — BTC-USD, ETH-USD, SOL-USD, BNB-USD
  • Forex pairs: append =XEURUSD=X, USDJPY=X, USDIDR=X
  • Commodities (futures): GC=F (gold), SI=F (silver), CL=F (crude oil)
  • Indices: prefix ^^GSPC (S&P 500), ^IXIC (Nasdaq), ^JKSE (IDX Composite)

Related Tools