Impact-Site-Verification: 0eedbe8d-4e05-4893-8456-85377301e322

Data Sources

  • Crypto prices: CoinGecko (USD spot prices). Historical backfill via CoinMarketCap CSV exports for some pre-2023 series.
  • Equities/ETFs: Tiingo (daily close and adjusted close, split/dividend adjusted).
  • NSE-listed Indian equities and USD/INR: Yahoo Finance through the pinned open-source yfinance adapter. We retain adjusted close and corporate-action evidence; Gale publishes calculated metrics and normalized analytical paths, not a downloadable redistribution of raw Yahoo histories. For a reviewed NSE session Yahoo omits, a fail-closed exception may preserve official NSE bhavcopy raw OHLCV only after adjacent Yahoo reconciliation; any adjusted close is explicitly derived, not an official NSE field. Yahoo provider tickers such as RELIANCE.NS are mappings, not Gale identities or public URLs.
  • Precious metals (spot): Stooq historical data for XAU, XAG, XPT (gold, silver, platinum).
  • Risk-free rate: FRED 3‑Month Treasury (DGS3MO). DuckDB retains FRED’s raw percentage-point observations; calculations convert each finite quote to an annual decimal rate by dividing by 100 before averaging available values over the analysis window.

We store at most one row per asset per date. If data is re-ingested, the newer value overwrites the older value for that date.

Price Series & Adjustments

For equities and ETFs, we use adjusted close when available to reflect dividends and splits. For crypto assets, we use a daily USD spot series from CoinGecko and treat the last observed price for each UTC date as that day’s “close”. All returns are computed from daily closing prices.

Crypto markets trade 24×7, while equities trade on exchange business days. This shows up in both “how we align dates” and “how we annualize risk”.

The MVP reporting currency is USD. We divide an NSE adjusted INR close by USDINR (INR per USD), prefer the exact calendar date, and only use an earlier FX quote for at most five calendar days—never a future quote. Provider mappings are separate from Gale asset identities, so a later provider swap does not change a canonical Gale symbol or URL.

USD-normalized Indian equity metrics use the same DGS3MO risk-free series and 252-trading-day equity annualization as other trading-day equities. Yahoo/yfinance data can be delayed, revised, incomplete, or omit special-session observations; availability is not a substitute for the official NSE session calendar.

Calendars, Alignment & Coverage

Different assets have different trading calendars. We use two approaches depending on the metric:

  • Comparison headline metrics: Returns, volatility, Sharpe, Sortino, drawdown, Calmar, Sterling, Ulcer Index, tail-risk visuals, and rolling-return rows use the intersection of dates (shared timestamps); we do not forward-fill missing prices. For crypto vs. trading-day assets, weekend moves are carried into the next shared-date return (Friday → Monday). The DGS3MO risk-free-rate window uses those same shared bounds.
  • Standalone asset metrics: We use each asset’s native series. This avoids forcing crypto onto a 252‑day calendar (which would smooth away weekend moves).

NSE equity observations use the reviewed official cash-equity session date in Asia/Kolkata, including Muhurat, Budget, and other declared special sessions; dates outside the reviewed calendar fail closed. A missing reviewed Yahoo session is never treated as a holiday or forward-filled: an official NSE daily-file exception is accepted only after two reviewed Yahoo sessions on each side match raw OHLCV and show an unchanged, action-free adjustment factor. Pairwise calculations convert to USD and inner-join shared price dates before returns. There is no stock-price forward fill or arbitrary India/U.S. date shift, and same-session-date closes are not simultaneous.

Compare Lab Methodology

Gale Compare Lab powers the English calculator at /calculator/. It lets a user compare the same hypothetical USD amount across two supported assets over a requested start and end date. This section applies to Compare Lab only; other Gale comparison pages may use rolling or trailing-window metrics described elsewhere on this page.

Current Compare Lab methodology version: compare-lab-v1.0.0. Contract hash: a1210831553b4d3bb0ab81b3cdce7fe44717a3b5d9a847a85fa3199eacee0fb5.

Data basis and public bundles

  • Equities and ETFs normally use adjusted close when available. That makes the normalized path adjustment-aware, but Gale does not claim every series is a complete dividend-reinvested total-return series.
  • Crypto and spot-metal series use close-price indexes. They can have different calendars from exchange-traded assets.
  • The public calculator bundle exposes normalized growth-index paths, not original raw price levels. Relative returns and the successive return path remain observable.
  • Each selected asset carries its own source/basis label, price basis, data dates, and observation count for Gale's computed growth index.
  • Artifact generation time, latest asset observation, and the effective scenario end date are separate concepts.

Date alignment

  • Requested start dates move forward to the first shared observation for both selected assets.
  • Requested end dates move backward to the last shared observation for both selected assets.
  • Compare Lab does not forward-fill missing dates.
  • Ending values and the chart use the shared effective window so both assets start and end on comparable dates.
  • Compare Lab uses its own calculator contract. Published comparison-page headline risk metrics use shared-date returns only.
  • For a 24/7 asset versus a trading-day asset, weekend movement appears in the next shared return.

Return and growth calculations

Ending value is the starting amount multiplied by the endpoint normalized-index ratio:

Ending Value=Starting Amount×IendIstart\text{Ending Value} = \text{Starting Amount} \times \frac{I_{\text{end}}}{I_{\text{start}}}

Total return uses the same endpoint ratio:

Total Return=IendIstart1\text{Total Return} = \frac{I_{\text{end}}}{I_{\text{start}}} - 1

CAGR uses elapsed calendar days and is unavailable for windows shorter than 30 days:

CAGR=(IendIstart)365.25/days1\text{CAGR} = \left(\frac{I_{\text{end}}}{I_{\text{start}}}\right)^{365.25 / \text{days}} - 1

Risk metrics

  • Realized volatility: sample standard deviation of native simple returns, annualized with 252 for trading-day assets and 365 for daily assets.
  • Maximum drawdown: deepest peak-to-trough decline on the native path inside the effective window. Compare Lab uses the frozen first-trough and last-prior-peak tie rule from the V1 engine.
  • Recovery: whether and when the asset reaches or exceeds the prior peak again before the selected end date. A zero-drawdown path has no peak, trough, or recovery date.
  • Calmar ratio: CAGR divided by absolute maximum drawdown. It is unavailable before the first calendar anniversary and when drawdown is below one basis point.
  • Correlation: full-window Pearson correlation of shared-date simple returns. It requires at least 30 shared returns and nonzero usable variance. This is not the rolling correlation described in the general correlation section below.

Rounding, unavailable states, and limits

  • The engine does not round intermediate calculations. Display values are rounded only at the final presentation boundary using engine-provided cents, basis points, and fixed integer display units.
  • When the selected data is too short, has zero variance, has no overlap, or fails a methodology/version check, Compare Lab shows the metric or scenario as unavailable rather than approximating it.
  • The comparison excludes fees, taxes, spreads, slippage, custody costs, execution timing, FX, and inflation.
  • Historical results are not forecasts. Correlation is not causation or a complete diversification assessment.
  • Compare Lab is informational and educational. It is not investment advice, and past performance does not guarantee future results.

Privacy and sharing

Compare Lab calculations run in the browser. Gale does not save exact V1 scenarios in a Gale account or scenario database. Basic analytics may record selected asset pair, locale, entry surface, and coarse timeframe; events do not include investment amount, exact dates, result values, full scenario URL or fragment, or free text. Shared links intentionally encode selected assets, amount, and requested dates in the URL fragment. Fragments are not sent to Gale in ordinary HTTP requests, but anyone or any software receiving the shared URL can read that fragment state.

Returns

For “simple returns” we use percent changes:

rt=PtPt11r_t = \frac{P_t}{P_{t-1}} - 1

Total return is the percentage change from the first to the last available price in the window. We also compute trailing returns for standard lookbacks: 30, 90, 180, and 365 calendar days.

Trailing returns use the closest available price on or before the lookback date. If an asset does not have enough data for a lookback window, the return is shown as N/A.

For distribution and tail-risk analysis, we use log returns:

t=ln(PtPt1)\ell_t = \ln\left(\frac{P_t}{P_{t-1}}\right)

Log returns are additive across time (multi-day log return is a sum), and they line up with the common “lognormal prices” baseline model. For small day-to-day moves, log returns and simple returns are very close.

Average Daily Move

Average Daily Move is the arithmetic mean of absolute close-to-close daily returns. It answers the practical reader question: “how much did this asset’s closing price move on an average day, regardless of direction?”

Average Daily Move=1Tt=1Trt\text{Average Daily Move} = \frac{1}{T}\sum_{t=1}^{T}|r_t|

A +2% day and a -2% day both count as 2%. We use an arithmetic mean because the metric is measuring the average size of one-day moves, not compounded growth. A geometric mean would be appropriate for compounding returns, but not for averaging absolute movement magnitudes.

We use the mean, not the median, as the primary version because large jump days are part of the experienced price path and should affect the average movement number. A median daily move can be useful as a companion “typical day” statistic, but it is less sensitive to outliers.

Average Daily Move is not volatility. Volatility is the standard deviation of signed returns around their mean; Average Daily Move is the mean absolute size of daily close-to-close moves. It is also not Average True Range (ATR), which requires high/low/close data and measures trading range rather than close-to-close movement.

Because this metric uses closing prices only, it ignores intraday highs and lows. It is also a historical period statistic, not a forecast of tomorrow’s move.

Volatility

Volatility is the annualized standard deviation of daily simple returns:

σannual=std(rt)×N\sigma_{\text{annual}} = \text{std}(r_t) \times \sqrt{N}

Standalone assets use their own calendar: 252 for trading-day assets (equities/ETFs) and 365 for daily assets (crypto and stablecoins). Comparison headlines use one shared-path convention for both assets: 252 if either asset is trading-session based, and 365 only when both are crypto or stablecoins.

Daily volatility is derived by dividing annualized volatility by the square root of the annualization factor. This avoids applying a 365-day convention to a crypto series after its weekend observations have been removed by a stock/crypto shared-date join. For the simpler “how much did it move per day on average?” question, use Average Daily Move instead.

Sharpe Ratio

Sharpe ratio is return per unit of total risk:

Sharpe=E[r]rfσ\text{Sharpe} = \frac{E[r] - r_f}{\sigma}

We annualize expected return using the arithmetic mean of daily simple returns (mean(r_t) × N) and annualize volatility using the same N. This “expected return” input is not the same thing as CAGR (compound annual growth rate).

The risk-free rate is the average 3-month Treasury rate (FRED series DGS3MO) over the analysis period. FRED values are stored as percentage points and converted to an annual decimal by dividing by 100 before use, expressed as an annual rate. For example, if the average rate during the period was 4.5%, we use 0.045.

Max Drawdown & Recovery

Max drawdown is the largest peak-to-trough percentage decline during the analysis window. Recovery time is the number of days from the trough until the price reaches or exceeds the prior peak.

Drawdown is computed from the price series (not returns). On compare pages, we compute drawdowns over the shared date range (same start/end dates) so both assets are evaluated over the same window.

Correlation

Correlation is computed using Pearson correlation on daily simple returns with a rolling window of 30 days. We report:

  • Current: The most recent 30-day rolling correlation value.
  • Average: The mean of all 30-day rolling correlation values across the full analysis period.
  • Min/Max: The historical range of the 30-day rolling correlation.

Correlation calculations use shared dates for the two assets (no forward filling). The interpretation (strongly/moderately/weakly correlated) is based on the average rolling correlation over the full period.

When one asset trades 24×7 and the other doesn’t, a “daily” return here is the move from one shared close to the next (so Friday → Monday includes weekend volatility).

For S&P 500 correlations shown in the comparison table, we use a variable window (30-90 days depending on data availability) and report the average correlation over the overlapping period.

Sortino Ratio

Sortino ratio is similar to Sharpe but only penalizes downside volatility, not upside gains. It is calculated as (annualized return minus risk-free rate) divided by downside deviation.

Sortino=E[r]rfσdown\text{Sortino} = \frac{E[r] - r_f}{\sigma_{\text{down}}}

We use the canonical LPM2 (“semi-deviation”) definition of downside deviation. The target return (MAR) is the daily risk-free rate, MAR=rf/N\text{MAR} = r_f / N , where NN is 365 for crypto and ~252 for trading-day assets. Days above the target contribute 0 shortfall; days below contribute their squared shortfall.

σdown,annual=1Tt=1Tmin(0,  rtMAR)2  ×N\sigma_{\text{down,annual}} = \sqrt{\frac{1}{T}\sum_{t=1}^{T} \min\left(0,\; r_t - \text{MAR}\right)^2}\;\times\sqrt{N}

Calmar Ratio

Calmar ratio is CAGR divided by maximum drawdown. It summarizes how much compounded return you earned per unit of worst drawdown.

Calmar=CAGRMax Drawdown\text{Calmar} = \frac{\text{CAGR}}{|\text{Max Drawdown}|}

We compute CAGR and max drawdown on the same window. Higher Calmar means more return per drawdown pain.

Sterling Ratio

Sterling ratio measures excess return per unit of average drawdown. It is similar to Calmar but uses the average of drawdown events.

Sterling=CAGRrfAvg Drawdown\text{Sterling} = \frac{\text{CAGR} - r_f}{\text{Avg Drawdown}}

We average drawdown events deeper than 10% and subtract the average risk-free rate to keep the ratio on an excess-return basis.

Treynor Ratio

Treynor ratio uses market risk (beta) instead of total volatility. It is useful when you only want to penalize systematic risk.

Treynor=E[r]rfβ\text{Treynor} = \frac{E[r] - r_f}{\beta}

We estimate beta versus the S&P 500 (SPY) on shared dates and use the same annualized return convention as Sharpe.

Ulcer Index

Ulcer Index measures the depth and duration of drawdowns. It focuses only on downside pain rather than total volatility.

UI=1Tt=1TDDt2\text{UI} = \sqrt{\frac{1}{T}\sum_{t=1}^{T} \text{DD}_t^2}

Drawdown is measured from prior peaks. Lower Ulcer Index values indicate shallower or shorter drawdowns.

Tail Risk & Distribution Shape

Some compare pages include an extra “tail risk” section based on daily log returns. This is aimed at questions like: “How fat are the tails?”, “Are extreme days mostly down or up?”, and “Do big downside days co-occur?”

We only show these tail-risk metrics when there are at least 60 daily return observations in the window (and at least 60 shared-date returns for the co-move calculation).

  • Skew: whether the distribution leans toward bigger up days (positive skew) or bigger down days (negative skew).
  • Excess kurtosis: how fat the tails are versus a normal distribution (0 means “normal-like” tails).
  • Historical VaR (5%): the 5th percentile of daily log returns (a “loss threshold” on a bad day).
  • Expected Shortfall / CVaR (5%): the average daily log return on the worst 5% of days (what bad days look like on average, not just the cutoff).
  • Tail co-moves (2σ downside): conditional probability of a big down move in one asset given a big down move in the other. Thresholding is done on shared-close log returns (z-scores), while we display simple returns (%) for readability.

These metrics are noisy in short samples. When we show conditional tail probabilities, we include counts/denominators so you can see how much data is driving the estimate. For pairwise “co-move” analysis, returns are computed between consecutive shared dates (for example, a Friday-to-Monday return includes weekend moves).

Data Quality & Limitations

  • Data can be delayed, revised, or re-stated by upstream providers.
  • Crypto trades 24×7; equities/ETFs do not. Pairwise metrics use shared dates to avoid inventing data.
  • Adjusted close is used for equities/ETFs when available; crypto has no dividends or corporate actions.
  • Yahoo/yfinance is an MVP provider, not a permanent data guarantee. Its provider symbols remain separate from Gale identities, and we can replace the provider without changing canonical symbols or URLs.
  • We do not model transaction costs, taxes, funding rates, borrow costs, or slippage.
  • Gale Finance is for informational purposes only and does not provide investment advice.

Explore the Analysis

Start with our asset comparisons to see these metrics in action. Each comparison page includes correlation, returns, volatility, Sharpe, Sortino, Calmar, Sterling, Treynor, Ulcer Index, and drawdown data.