Methodology
Last updated: September 24, 2026
Metron computes the figures documented here deterministically, from the holdings, transactions, and prices of the accounts you connect or import. No language model is involved in computing them. This page states how each one is computed. The implementation is open source (AGPL-3.0), so each definition here can be checked against the code that produces it.
A figure that cannot be computed from the available data is shown as a dash or an explanatory note. Where a figure rests on incomplete data, the page says so: for example, reconstructed NAV history is labeled as estimated when lot data is incomplete (see Performance).
Valuation and data
Current holdings are valued as follows:
- Price. A holding is priced at the latest cached daily closing price. When no close is cached, the price reported by the broker for that position is used.
- Scale cross-check. When the broker also reports a total market value for the position and the computed value (price × quantity) differs from it by more than a factor of two, the broker’s total is used. This catches a price series and a share count that disagree on scale, for example after a split or an ADR ratio change.
- Currency. Values are converted to the portfolio’s base currency at a cached exchange rate. A holding whose currency has no cached rate is left out of base-currency totals rather than converted at 1:1. Historical figures (realized gains, dividends, reconstructed NAV) use the rate as of the event or valuation date; reconstructed NAV falls back to the most recent cached rate when no dated rate is available.
- Settled data. Performance, Attribution, Risk, Diagnostics, and Tax are computed from closing prices; the first four show the close date their data runs through. Intraday prices appear only on the live Overview and Holdings views.
- Scope. Selecting accounts in the account panel restricts each computation to those accounts.
Performance: TWR and MWR
NAV series. Each day, Metron records one NAV snapshot: the sum of the base-currency market values of the portfolio’s priced holdings. Alongside it, the snapshot records the day’s external flow F: capital that entered or left the valued holdings since the previous snapshot, measured as the amount of purchases minus the proceeds of sales. With flows recorded, a contribution reads as capital in, not as investment return.
Time-weighted return (TWR). Snapshots are recorded after the day’s flows, so each sub-period return removes the flow before comparing to the prior NAV. The sub-period returns are linked geometrically:
rt = (NAVt − Ft) / NAVt−1 − 1 · TWR = ∏ (1 + rt) − 1
If a sub-period starts from a non-positive NAV, the headline TWR is not shown, and the cumulative figure and risk measures skip that sub-period. The “Cumulative” figure on the Performance page is this same geometric link over the full history.
Money-weighted return (MWR). MWR is the internal rate of return (XIRR) of the investor’s cash flows over the window, built from the same flow series as TWR: the starting NAV as an outflow on the first date, each later snapshot’s net flow as an outflow (or inflow, for net sales), and the ending NAV as a final inflow. The rate is solved on an actual/365 day count (Newton’s method with a bisection fallback). When the flows never change sign, or the solver does not converge, MWR is not shown. The window figure is the annual rate compounded over the window’s length:
MWRwindow = (1 + XIRR)days / 365 − 1
TWR removes the effect of when and how much capital was added. MWR includes it. The two differ whenever flows occur during the window.
Annualization. Annualized TWR and MWR use (1 + R)365 / days − 1 and are shown only once the window spans at least 30 days. Shorter windows show the window return only, because annualizing a few days of return produces extreme figures.
Overview period tiles. Today, YTD, and LTM each take a window of snapshots and report the dollar gain (ending NAV − starting NAV − the flows inside the window), TWR, and MWR over it.
- Today is the change from the previous NYSE session’s snapshot to the last closed session’s snapshot. Snapshots stamped on weekends or holidays are skipped. When the last closed session is not the current calendar day, the tile is labeled “as of” that date.
- YTD starts at the last snapshot of the prior calendar year; LTM at the last snapshot on or before the date 365 days ago.
- Where benchmark prices are available, each tile also shows the price return of SPY, QQQ, and IWM (the ETFs used as proxies for the S&P 500, Nasdaq-100, and Russell 2000) between the same two dates, and the difference between the portfolio’s TWR and each one.
Difference vs SPY. The Performance page’s “Alpha vs SPY” is the portfolio’s TWR minus SPY’s price return between the first and last snapshot. It is a simple difference of two returns, not a regression alpha.
Building history from past prices. NAV snapshots accumulate forward, one per day. Earlier history can be reconstructed from tax lots and the transaction ledger: the portfolio is valued at every month-end and on every date a flow occurs, using the closing price on or before that date. For accounts rebuilt from broker lots, a lot opening counts as capital in and a lot closing as capital out, each valued at that day’s price exactly as NAV values it, so a change in composition does not register as a return. A holding with no lot or transaction history cannot be placed on past dates, so it is carried at its current value across the whole history rather than dropped. When the open lots of any current holding do not reconcile to its position quantity (within 1%), the Performance page labels the history as estimated and names the affected holdings.
Data guards. A new snapshot is not recorded when its NAV is more than 3× or less than one-third of the median of up to seven prior snapshots plus the day’s flow, a move no recorded flow explains. A snapshot taken while a mutual fund’s closing NAV has not yet been published is marked provisional and restated, within seven days, once that NAV is available.
Metrics are shown only once there are at least two snapshots. Scoped to a subset of accounts, the series uses those accounts’ own daily snapshots and starts on the first date every selected account has one.
Return-series risk measures
The risk statistics on the Performance page are computed on the flow-adjusted sub-period returns rt defined above, so a contribution never registers as volatility.
Periods per year. Snapshots do not necessarily fall on every trading day, so annualization uses the observed sampling rate instead of assuming 252: periods per year = (number of returns) / (days elapsed / 365.25).
- Volatility: the sample standard deviation of rt × √(periods per year).
- Sharpe ratio: mean(rt) / standard deviation(rt) × √(periods per year), with a 0% risk-free rate.
- Sortino ratio: mean(rt) / downside deviation × √(periods per year). Downside deviation is the root mean square of min(0, rt) over all observations, with a 0% target.
- PSR (Probabilistic Sharpe Ratio, Bailey & López de Prado 2012): the estimated probability that the true Sharpe ratio of the observed return series is above zero, adjusting for the sample’s length, skewness, and kurtosis. Requires at least 30 returns.
- Max drawdown: the largest peak-to-trough decline of the growth index ∏(1 + rt), expressed as a negative percentage.
- CVaR (95%): the historical conditional value at risk: the mean of the losses at or beyond the 95th-percentile historical loss, shown as a negative return.
Volatility, Sharpe, Sortino, and PSR are shown only once the history spans at least 30 days. Max drawdown and CVaR do not depend on annualization and are shown at any length.
Risk over time. The rolling chart recomputes the same measures over a trailing window of up to 63 returns (about three months of trading days). A point appears once the window holds at least 20 returns spanning at least 30 days.
Sector attribution
The Attribution page splits the difference between the portfolio’s return and SPY’s return over the trailing 90 days into three sector-level effects, using the Brinson-Fachler method. For each sector i:
Allocationi = (wp,i − wb,i) × (rb,i − Rb)
Selectioni = wb,i × (rp,i − rb,i)
Interactioni = (wp,i − wb,i) × (rp,i − rb,i)
where Rp = Σ wp,i rp,i and Rb = Σ wb,i rb,i. Summed over sectors, the three effects equal Rp − Rb.
- Portfolio weights wp,i: each GICS sector’s share of the market value of holdings that have a resolved sector. The share of market value that is covered this way is shown as coverage; holdings without a sector are reported, not assigned to one.
- Portfolio sector returns rp,i: the market-value-weighted average of each holding’s price return over the window, from the first close on or after the window start to the latest close.
- Benchmark weights wb,i: the benchmark ETF’s published sector weights, restricted to the eleven GICS sectors and rescaled to sum to 1.
- Benchmark sector returns rb,i: the price return over the same window of each sector’s Select Sector SPDR ETF (XLK, XLF, XLV, XLY, XLP, XLE, XLI, XLB, XLU, XLRE, XLC).
What this approximation does and does not capture. Weights are the holdings’ current market-value weights, held constant over the window, so trades made during the window are not reflected. The calculation is single-period over the whole window, not a chain of linked daily periods. Rb is built from sector ETF returns at the benchmark’s sector weights, so it can differ slightly from the benchmark ETF’s own return. A sector the portfolio does not hold has zero selection effect; a sector the benchmark does not hold takes Rb as its benchmark return.
Factor risk model
What the model is. The Risk page uses a time-series regression of each holding’s daily returns on six factor return series built from exchange-traded funds. It is not a Barra-style fundamental risk model and not a Fama-French model. The factors are:
- Market: SPY’s daily return.
- Five style factors: the daily return of an iShares MSCI USA factor ETF minus SPY’s return on the same day: Momentum (MTUM), Quality (QUAL), Low volatility (USMV), Value (VLUE), and Size (SIZE). Subtracting SPY separates each style tilt from market exposure. The factors inherit these funds’ index construction. A style factor whose ETF history is missing is left out of the model.
Estimation. Daily returns come from the cached closing prices of the holdings and the factor ETFs; computing risk first fetches the last 403 calendar days of them (roughly one year of trading sessions), and the Risk page shows how many daily observations were used. The model uses the dates on which every factor series has a return, trimmed at the end to the last date that at least 80% of holdings also have. A holding is modeled only if it has a return on every one of those dates and at least 11 observations; the rest are listed as excluded. Then:
- Each holding’s returns are regressed on the factors by ordinary least squares with an intercept, giving factor loadings (the matrix B) and a residual variance (the diagonal matrix D, with n − k − 1 degrees of freedom).
- The factor covariance matrix F is the Ledoit-Wolf shrinkage estimate: the sample covariance of the factor returns shrunk toward a scaled identity matrix, with shrinkage intensity estimated from the data.
- The holdings’ covariance is modeled as Σ = B F Bᵀ + D.
Outputs. Weights w are the modeled holdings’ current market-value weights, rescaled to sum to 1. With x = Bᵀw (the portfolio’s net factor exposure), daily variances are annualized by 252 trading days:
factor vol = √(252 × xᵀ F x) · idiosyncratic vol = √(252 × Σ wi2 Di) · total vol = √(252 × (xᵀ F x + Σ wi2 Di))
- Factor exposures are the entries of x.
- Variance contribution of factor k is xk (F x)k divided by total variance; the idiosyncratic share is the remainder.
- Tracking error vs SPY: SPY’s own returns are regressed on the same factors to get its exposure xb. Active exposure a = x − xb, and tracking error = √(252 × (aᵀ F a + Σ wi2 Di)). The portfolio’s idiosyncratic variance counts as fully active.
“Ex-ante” here means the current weights applied to covariances estimated from past daily returns. The figures describe how the current holdings varied together over the sample. They are not a projection of future volatility.
Concentration diagnostics
The Diagnostics page measures portfolio structure from settled market values. Cash, unpriced holdings, and holdings without a base-currency value are left out, and watchlist entries are never included.
- HHI (Herfindahl-Hirschman index): Σ wi2 over position weights. It equals 1/N for N equal positions and 1 for a single position.
- Effective number of positions: 1 / HHI, the number of equal-weight positions with the same concentration.
- Top-5 and top-10 share: the combined weight of the five and ten largest positions; and the largest single position with its weight.
- Sector weights vs SPY: each sector’s share of included market value next to SPY’s sector weight, and the difference. Unheld benchmark sectors appear at 0%; holdings without a sector appear as Unclassified.
- Geography: US, International, or Unclassified, by the country of domicile of each holding.
- Your stated targets: where you have entered targets, each is compared mechanically with the measured value (“you set X; actual is Y”): a US/International allocation, a maximum single-position weight, and sectors you listed to avoid. A target Metron cannot measure is reported as not measurable.
Realized income
The Tax page’s income table sums, per calendar year, the following. Gains, dividends, and interest cover taxable accounts only.
- Realized short-term and long-term gains from closed lots (see Tax lots), assigned to the year of the closing date. For accounts where the broker reports closed lots itself, those lots are used instead of replaying the transactions, so no disposal is counted twice.
- Dividends and interest: the dividend and interest cash transactions, assigned to the year of their trade date.
- Distributions: withdrawals from tax-deferred accounts (for example a traditional IRA or 401(k)), shown as a separate column when present.
Each amount is converted to the base currency at the exchange rate on its own event date; an amount with no available rate is left out. The current year is year-to-date. These are totals of what the account data shows. They are not a tax form, and the dividend line does not separate qualified from non-qualified dividends.
Tax lots
Lot ledger. Transactions are replayed in date order, separately for each account and security, into tax lots:
- A purchase opens a lot at its price; fees are added to the cost basis. When the price is missing (common for money-market sweeps), cost per share is the transaction amount divided by quantity.
- A sale closes lots first-in, first-out (FIFO), within the same account only. Fees reduce the proceeds. Each closed lot, or part of one, becomes a realized-gain record with its proceeds, cost basis, and holding period.
- A split multiplies each open lot’s shares by the ratio and divides its cost per share by it.
- A sale larger than the shares the history shows, which happens when a broker’s activity feed starts partway through a position, means that security’s lots cannot be reconstructed. That security’s history in that account is left out of the lot view and named on the page.
Holding period. A lot held more than 365 days is long-term; otherwise short-term. A lot with no determinable holding period is grouped with short-term.
Unrealized gain for an open lot = quantity × latest close × exchange rate − cost basis in the base currency. A lot without a cached price or rate shows its cost basis and term but no market value. Harvestable loss for a lot is the size of its unrealized loss when it is below cost, and zero otherwise. The page total is the sum over lots.
Reconciliation. “Total unrealized” is computed from current positions (the same values as the Accounts table), so it includes positions whose lots could not be reconstructed. The lot-classified short- and long-term figures cover only reconstructable lots; the page shows the difference and names the positions it comes from.
Realized lots are converted to the base currency at the exchange rate on the closing date. Tax-advantaged accounts (IRA, 401(k), Roth) are excluded from the Tax page, and the number excluded is shown.
Technical rating
The technical rating shown on Holdings and security pages is a signed score from −1 to +1 with a five-step label. It is a composite vote across moving-average and oscillator indicators; the moving-average and oscillator sub-scores appear on each security’s page. The score is computed from price history by Metron’s market-data pipeline and read as published; the analytics service does not adjust it.
- Timing. An intraday rating, computed from delayed intraday prices, is used for a security only while the published intraday ratings are no more than 20 minutes old. Otherwise the end-of-day rating is used. The basis (intraday or end-of-day) is shown with the rating.
- What it is. The rating is descriptive: it summarizes where each indicator stands on the current price history. It makes no claim about future returns.
- Track record. Where available, the Diagnostics page shows the rating’s measured track record: realized forward returns for each label, at several horizons, with the information coefficient shown next to its noise floor. The backfill segment is simulated on today’s set of securities, so it carries survivorship bias. Only the live segment is out-of-sample.
This page documents the calculations as implemented. Figures depend on the completeness and accuracy of the account data and prices they are computed from; see the Terms for the Service’s descriptive-only scope.