Skip to content
Informed Portfolio logoInformed Portfolio

Trust layer

Methodology

Every formula, convention, and limitation behind the numbers — in plain language first, precise detail second. The code is the source of truth; this page tracks it, and corrections are dated in the change log.

Enginev2026.07.1Page updated2026-07-23

Data sources & universe

Prices come from Twelve Data; macroeconomic series come from FRED. Around 190 commonly held US-listed ETFs and stocks are kept continuously updated, and any other US-listed ticker is backfilled on demand the first time someone analyzes it. Everything is priced and computed in US dollars.

Technical detail
  • Equity and ETF daily bars from Twelve Data, split-adjusted at source; dividends arrive on a separate feed and are applied on their ex-date.
  • Coverage: US-listed ETFs and common stocks only. ~190 seeded tickers stay continuously updated; other US listings backfill on demand back to first listing.
  • Macro from FRED: the 3-month Treasury constant-maturity yield (series DGS3MO — not a Treasury-bill rate) as the risk-free rate, and CPIAUCSL (inflation).
  • Ingestion: a nightly incremental update, plus a weekly full re-ingestion that re-applies split adjustments across entire histories.
  • All series are stored and computed in USD — the portfolio currency label is display-only, and no FX conversion is performed anywhere.

Known limitations

  • No international listings (UCITS, TSX, LSE, etc.) — the most-requested gap. Unsupported searches are logged so demand steers the roadmap.
  • Delisted and merged securities are not in the search universe, so historical category comparisons are flattered (survivorship bias — see “Backtesting limitations”).
  • A vendor outage can delay the nightly update by up to a trading day.

Return calculations

Everything starts from monthly total returns — the price change plus any dividend that went ex-dividend that month. Longer-period figures compound those months; CAGR is the smoothed annual rate that summarizes the whole window.

Technical detail
  • Monthly total return: r_t = (close_t + div_t) / close_(t−1) − 1, with dividends counted on their ex-date.
  • Total return over a window compounds the months: Π(1 + r_t) − 1.
  • CAGR = (1 + total return)^(12/n) − 1, where n is the number of months in the window.
  • Prices are split-adjusted (not dividend-adjusted); total return is reconstructed from split-adjusted prices plus ex-date dividends, so no adjusted/unadjusted mixing occurs.

Known limitations

  • The first month of a window can be partial (window start to the first trading day) and slightly understates that month’s return.
  • Monthly granularity hides intra-month swings — a portfolio can look calm month-to-month and be violent day-to-day.

Dividends

With dividend reinvestment (DRIP) on — the default — each dividend buys more of the same asset on its ex-date. With DRIP off, dividends accumulate as uninvested cash.

Technical detail
  • Dividends come from a feed separate from the price bars and are matched to tickers by ex-date.
  • Reinvestment executes at the ex-date close with no fractional-share restriction.

Known limitations

  • The dividend feed is separate from prices: if it returns nothing for a window, returns can fall back to price-only and understate the true total return. Warning-on-outage for tickers with a known dividend history is on the near-term roadmap.

Rebalancing & costs

Rebalancing resets holdings to their target weights on a schedule. We rebalance at month-end. Trading is free by default — but you can switch on a per-rebalance transaction cost (and a per-switch cost on the tactical tool), and when you do it is applied to the results, not just estimated — an all-in proxy for spreads, commissions, and slippage. Taxes are never modeled.

Technical detail
  • Rebalances execute at month-end closes; the periodic schedule follows the (i + 1) % period convention (for annual, every 12th month from the start).
  • Threshold rebalancing triggers when any asset drifts more than 5 percentage points from target (configurable per analysis).
  • Optional rebalance cost (basis points): at each rebalance we charge cost = ½·Σ|wᵢ − targetᵢ| (one-way turnover) × bps, deduct it from the portfolio, and fold it into that month's time-weighted return so every net-of-cost metric reflects it. Default is 0 (off) — the default result is unchanged.
  • Advisory fees, when entered, are also modeled: an annual percentage converted to a monthly drag and applied to the whole portfolio.
  • Taxes are not modeled; with the optional cost off, no trading friction is modeled at all — that assumption is flagged on results that involve trading.

Known limitations

  • With costs off, the zero-cost assumption flatters frequent rebalancing and high-turnover tactical rules — turn costs on to compare fairly.
  • The cost model is a simple turnover × bps charge; it does not model market impact, spreads that widen with size, or taxes.
  • Month-end execution ignores what happens to weights between month-ends.

Inflation (nominal vs real)

“Real” figures answer: what would this be worth in today’s purchasing power? We deflate nominal results by the US Consumer Price Index. Every tool states whether its figures are nominal or real — it is never left implicit.

Technical detail
  • CPI series: CPIAUCSL from FRED, monthly, forward-filled to bridge the publication lag.
  • Real value_t = nominal value_t × (CPI_start / CPI_t); real returns derive from the deflated series.

Known limitations

  • The last one to two months use the latest available CPI print because of publication lag.
  • Headline CPI is not your personal inflation rate.

Risk metrics

Risk numbers describe how bumpy the ride was — not whether it was good. Volatility measures spread; Sharpe and Sortino measure return earned per unit of risk; max drawdown measures the worst peak-to-trough loss; beta and alpha relate the portfolio to its benchmark.

Technical detail
  • Volatility: sample standard deviation of monthly returns × √12 (annualized). Annualization is √12 everywhere — no mixed-frequency inconsistency.
  • Sharpe: mean(monthly excess) / stdev(monthly excess) × √12, with excess measured over the FRED 3-month Treasury constant-maturity yield (DGS3MO). Factor and tactical analyses subtract each month's own rate (month-end series, gaps carried forward); other summary ratios use the window average.
  • Sortino: same numerator over downside deviation only, with the minimum acceptable return set to the risk-free rate.
  • Max drawdown: largest peak-to-trough decline of the time-weighted return curve.
  • Beta and alpha: OLS regression of portfolio excess returns on benchmark excess returns; CAPM alpha is annualized geometrically.

Known limitations

  • Sample statistics are noisy in short windows — a 3-year Sharpe ratio deserves wide error bars.
  • If the risk-free series is unavailable, Sharpe/Sortino/alpha are shown with an explicit warning rather than silently omitted.

Benchmarks

Benchmarks run through the same engine with the same window, rebalancing, and dividend treatment as your portfolio — otherwise the comparison would be meaningless.

Technical detail
  • The benchmark series is computed with identical window, dividend, and rebalancing assumptions as the portfolio it is compared against.
  • Beta and alpha are only computed on matched samples — months present for both portfolio and benchmark.

Known limitations

  • A mismatched benchmark (say, the S&P 500 against a bond-heavy mix) is allowed — the statistics stay valid but mean less. Results hint when beta is far from 1.

Backtesting limitations

A backtest shows what a strategy would have done in one specific past, under simplifying assumptions. Four caveats matter most, and every result restates the ones that apply.

Technical detail
  • Costs and taxes excluded by default: with trading costs off, no commissions, spreads, market impact, or taxes are modeled — real results would be lower. The optional per-rebalance and per-switch cost models execution costs when enabled; taxes and market impact are never modeled.
  • Window clamping: the window shrinks to where every holding has data; results state the requested vs used window and name the limiting asset.
  • Survivorship: the searchable universe is today’s listings, so funds that closed or delisted are absent — category comparisons are flattered.
  • Look-ahead: none. Signals and statistics use only data available at each point in time, and automated tests guard this property (see “Tactical rules”).

Monte Carlo

Monte Carlo tools generate thousands of possible futures consistent with historical behavior, then report the share of paths that meet your goal. The output is a range with probabilities — never a forecast, and never a guarantee.

Technical detail
  • Three generators: parametric normal via Box-Muller; iid bootstrap resampling of historical monthly returns; block bootstrap with 12-month wrap-around blocks that preserves short-run clustering.
  • Every simulation is seeded and reproducible — the seed is printed on the result.
  • Success rate = share of simulated paths meeting the stated condition, nothing more.
  • Each tool states whether its figures are nominal or real: the Goals planner runs in nominal terms; the Retirement lab runs in real terms — the framing is shown, never assumed.

Known limitations

  • The normal generator has unbounded, thin tails and understates crash risk — prefer the bootstrap generators for tail questions.
  • Bootstraps can only recombine history’s building blocks — genuinely novel regimes are outside the model.

Optimization & the efficient frontier

The optimizer searches for weights that best meet a stated objective under your constraints. It optimizes the historical sample you gave it — small changes in inputs can move the “optimal” answer a lot, so results carry a sensitivity warning. An optimized weight is a candidate to stress, not a recommendation.

Technical detail
  • Mean-variance optimization by projected gradient descent on the capped simplex (weights ≥ 0, summing to 1, per-asset min/max boxes).
  • Expected returns: arithmetic mean of monthly returns × 12 by default; a CAGR-based option is available.
  • Covariance: sample covariance by default (no shrinkage) — estimates are sensitive to the window, and the result says so. An opt-in Ledoit-Wolf estimator shrinks the sample matrix toward a constant-correlation target by a data-fitted intensity δ (variances preserved; only co-movements shrink), which tames extreme corner solutions on short or collinear histories. Off by default — the default result is unchanged.
  • “Max Sharpe” means the best Sharpe among the tested candidate set — not a proven global optimum.
  • Risk parity uses the Spinu formulation and solves for equal risk contributions only; it ignores per-asset boxes (the result warns when non-default limits are set).
  • Constraint status: each optimized weight is labeled where it sits on your min/max box — a weight pinned to a bound is set by the limit you imposed, not by the data.
  • Stability check: the monthly-return history is bootstrap-resampled (≈40 draws) and re-optimized by the same objective; we report how much each weight moves and the average share of the portfolio that shifts (turnover). High turnover means the exact weights are an artifact of this sample.

Known limitations

  • Optimizing on a sample overfits that sample; treat outputs as candidates to stress, not answers.
  • No shrinkage means extreme corner solutions can appear on short or collinear histories.

Black-Litterman

Black-Litterman blends a starting allocation with your own views on specific assets, weighted by how confident you are. It is an advanced tool: the “prior” it starts from is your baseline portfolio, not the whole market.

Technical detail
  • Posterior E[R] = Π + τΣPᵀ(PτΣPᵀ + Ω)⁻¹(Q − PΠ), with τ = 0.05 and Ω a diagonal built from your stated confidences.
  • The risk-aversion δ is derived from the baseline portfolio’s (return − rf)/variance, clamped to a sensible range.
  • Views are absolute single-asset views; the posterior updates the expected return only — the covariance stays the raw sample estimate.

Known limitations

  • The prior is baseline-implied (your own weights), not market-cap implied — so it reflects your starting point, not a market consensus.

Correlations

Correlation measures how much two assets moved together, from −1 (opposite) to +1 (lockstep). Diversification comes from low or negative correlations — but correlations are not stable, and they tend to rise exactly when markets fall.

Technical detail
  • Pearson correlation on date-aligned total returns at the chosen frequency (daily, weekly, or monthly).
  • The matrix is computed on the common-history intersection of all selected assets — the youngest asset sets the sample for every pair, and the number of months used is shown.
  • Rolling-correlation views expose instability over time.

Known limitations

  • One young asset can shrink the whole matrix’s sample dramatically.
  • Crisis correlations differ from calm-period correlations; a single full-window number hides that.

Tactical rules

Tactical tools test rules like “hold stocks above their 10-month average, otherwise cash.” Signals use only information available at the time. Because the whole point is trading, you can apply a per-switch trading cost directly — when you do, the headline is net of it — and a comparison table still shows what other cost levels would do.

Technical detail
  • Signals are computed point-in-time at month-end; an automated mutation test changes future returns and asserts the weights don’t move — guarding against accidental look-ahead.
  • Execution is modeled at the close of the signal month.
  • Optional per-switch cost (basis points): at each allocation change we charge cost = Σ|wₜ − wₜ₋₁| (the full traded notional — both the dollars sold and the dollars bought) × bps and fold it into that period’s return, so every net metric reflects it. The initial establishment of the position is not charged. Default 0 (off).
  • When a cost is applied, the before/after table explores additional per-trade levels around it; when it is off, the table estimates costs from the strategy’s measured turnover.

Known limitations

  • With costs off, gross-of-cost headlines flatter high-turnover rules — apply a per-switch cost to compare fairly.
  • Volatility-targeting can imply leverage; exposure above 100% is charged the risk-free financing rate.
  • Monthly signals miss intra-month whipsaws entirely.

Factor analysis

Factor analysis explains why a portfolio behaved as it did by regressing its returns on market, size, value, momentum, and quality factors — using investable ETF spreads as the factor proxies, not the academic research series.

Technical detail
  • OLS of portfolio excess returns on investable proxies: market (VTI − rf), size (IWM − SPY), value (IWD − IWF), momentum (MTUM − SPY), and quality (QUAL − SPY).
  • Newey–West (HAC) standard errors with the automatic lag ⌊4·(T/100)^(2/9)⌋ make t-statistics robust to the autocorrelation and volatility clustering typical of monthly returns; significance uses a df-aware Student-t critical value, and a multicollinearity guard warns when the factor set is too correlated to trust the loadings.

Known limitations

  • ETF-proxy factors are not the academic Fama-French factors — loadings are directional, not definitive.
  • Robust standard errors widen honestly for serially correlated residuals, but no correction rescues inference from a genuinely short sample.

Stress testing

Stress tests replay real historical crises on today’s weights, and apply hypothetical shocks. When a holding is too young to have lived through a crisis, we say so rather than inventing data.

Technical detail
  • Historical replays over fixed crisis windows (2008–09, COVID, 2022, and others), with careful handling of missing/young holdings: a scenario is marked unavailable rather than silently dropping assets below a coverage threshold.
  • Hypothetical shocks use a two-factor linear model (equity beta + 10-year-rate beta) fit on recent history.

Known limitations

  • The hypothetical shock is first-order and linear — it does not model convexity or correlations spiking in a panic.

Stock fundamentals

The fundamentals tool builds trailing-twelve-month figures from reported statements and computes margins, returns, valuation multiples, and dividend-growth history.

Technical detail
  • Trailing-twelve-month construction from the last four quarters (annual as fallback); margins, ROE/ROA, current ratio, and valuation multiples (P/E only when EPS > 0).
  • The “debt-to-equity” figure is total liabilities ÷ equity (labeled accordingly).

Known limitations

  • ROE/ROA use period-end (not average) denominators; growth rates assume contiguous fiscal years.

Risk profile questionnaire

The questionnaire estimates risk capacity and willingness from ten questions and maps the lower of the two to one of five educational bands. The band’s guardrail numbers are editorial reference points — not personalized advice.

Technical detail
  • Weighted scoring → capacity and willingness scores → the more conservative of the two selects the band. Answers are processed in your browser and are not stored.

Known limitations

  • The guardrail ranges are curated education, not a computed recommendation for your situation.

Portfolio Check-in

The Portfolio Check-in reports where a portfolio sits against limits its owner set — the tolerance band around their target weights, and the volatility range of the risk band they chose — plus neutral observations (historical co-movement, ongoing fund costs, a goal scenario) with their exact figures and sources. The headline is one of three states: “Within your plan” when every user-set limit that could be evaluated holds, “Review suggested” when at least one is crossed, and “Incomplete” when none could be evaluated. It deliberately awards no composite grade: the five measurements are different kinds of fact (adherence, co-movement, cost, historical risk, feasibility), and a weighted average of unlike constructs would be an editorial opinion presented as a measurement. Missing evidence reduces the stated completeness (“3 of 5 observations available”); it can never improve the headline.

Technical detail
  • Boundary observations (can trigger “Review suggested”): allocation vs targets — the largest |current − target| weight against the plan's band, with current weights rescaled to 100% first so a holdings list summing to 98% is not read as universal drift; and historical risk — the mix's measured annualized volatility against the volatility range of the risk band on the plan. Only these two compare against limits the owner chose.
  • Neutral observations (reported with figures, never graded): historical co-movement — average pairwise correlation of the holdings' monthly total returns over up to 10 years, CASH excluded (a constant 0% series has no correlation); ongoing fund costs — the weighted expense ratio with coverage and sources, published only at ≥95% coverage by weight; and the goal scenario — the annualized return the goal requires (the Goals planner's deterministic solver, from the value the owner stated) alongside the mix's historical CAGR less a fixed 1 percentage-point haircut, floored at zero. The comparison is stated arithmetic under stated assumptions, not a forecast and not an “on track” verdict.
  • Estimates need at least 36 overlapping monthly observations; below that, co-movement and historical risk are not evaluated and the completeness count says so.
  • The underlying measurement function is pure and versioned, and every stored snapshot records the version that produced it, so a later formula change cannot silently redefine an older state in a trend. Trends are described in boundary terms (“1 setting outside your range, was 0”) and only between snapshots of the same version.
  • Fees, co-movement and the goal scenario cannot trigger “Review suggested” by design: the product does not decide on the owner's behalf that a cost or a correlation is too high. They become boundary checks only if the owner explicitly sets such a limit (a possible future setting).

Known limitations

  • Correlation and volatility are backward-looking estimates over the sampled window; both move with the regime, and a portfolio can sit inside every range on history it will not repeat.
  • The goal scenario's expected-return input is a haircut historical figure, not a forecast. Past performance does not necessarily predict future results.
  • Average pairwise correlation ignores holding weights and concentration; it is reported as a neutral observation, not a diversification grade, for exactly that reason.
  • The check-in says nothing about whether the plan itself is sensible — only where the portfolio sits against it.

Fee X-Ray

The weighted expense ratio of a set of holdings, what it costs per year, and which holdings account for that cost. Two rules govern it: nothing appears without the source it came from and the date it was read, and no portfolio-level figure is published unless at least 95% of the portfolio by weight can be priced. Below that we list what we do know and name the gap, because an average over part of a portfolio is not that portfolio's cost.

Technical detail
  • Weights are rescaled to 100% before anything is computed, so a holdings list that sums to 98% does not understate each contribution.
  • A holding's contribution is weight × expense ratio. The portfolio's weighted ratio normalizes the contribution sum over the KNOWN weight, not over 100 — at 96% coverage, dividing by 100 would understate the priced part's cost by 4%.
  • Coverage is measured by weight, and the portfolio-level headline is withheld entirely below 95%.
  • Cash carries no fund and therefore a genuine 0% ratio; it is not treated as an unpriced gap, which would otherwise suppress the headline for any portfolio holding a cash sleeve.
  • A ratio you enter yourself always overrides reference data and is labelled as yours — you know which share class you hold.
  • Reference rows are validated on load: a row without a source or a valid as-of date, or with an implausible ratio, is dropped rather than counted toward coverage. Coverage is a claim about evidence.
  • The horizon comparison compounds (1 + gross return) × (1 − expense ratio) per year for each of two ratios over the chosen horizons, with the SAME gross return — a figure the reader supplies — so the only difference between the columns is the fee.
  • The oldest as-of date behind any figure shown is displayed, so staleness is judged on the worst row rather than the best.

Known limitations

  • The reference table is intentionally incomplete: each row must be read off a fund provider's own page, and an unverified number would defeat the coverage rule it feeds. Until it is populated, most portfolios show per-holding gaps and no portfolio headline — which is the designed behaviour, not a fault. Entering your own ratios works today and takes priority over ours.
  • Ratios are net expense ratios as published. They exclude bid-ask spreads, brokerage commissions, securities-lending revenue and any platform or advisory fee you pay separately.
  • The horizon comparison is arithmetic under an assumption you supply. It is not a forecast, and it says nothing about which fund will perform better — only what the fee difference does when everything else is held equal.

Data freshness

Every result states the analysis window it used, including the last trading day included in the calculation, so you always know how fresh the numbers are. When an upstream source fails, tools degrade explicitly instead of quietly computing on stale or partial data.

Technical detail
  • “Data through” on a result is the newest date common to all assets in that analysis; the requested-vs-used window is shown when they differ.
  • Explicit degradations: if the risk-free series is unavailable, risk-adjusted metrics render with a warning.

Known limitations

  • A vendor outage can delay data by up to a trading day before detection triggers.

Change log

Methodology changes are dated here. When a fix changes previously shown numbers, the entry says so explicitly.

Methodology change log
DateChangeImpact on numbers
2026-07Replaced the Health Score's /100 composite with the Portfolio Check-in: three non-numeric states anchored to owner-set limits, plus neutral observations with exact figures. The composite mixed unlike constructs under editorial weights and renormalized over missing components, so two equal headlines could rest on different evidence; the check-in reports boundary facts and completeness instead. The underlying measurements are unchanged.Presentation integrity
2026-07Added the vigilance layer: Health Score history with a same-version-only trend, plan-band breach alerts with a rebalance table, Contribution Coach (allocations that sum exactly to the deposit and never suggest selling), Fee X-Ray with a 95%-coverage rule, and the decision log.New capability
2026-07Added the Portfolio Plan (owner-set target weights, tolerance band, risk band and goal) and Health Score v1, which measures a portfolio against that plan. Components with missing inputs are marked not assessed and the score is renormalized over the rest.New capability
2026-07Engine 2026.07 → 2026.07.1: tactical trading cost now charges the full traded notional (both the dollars sold and bought) plus risk-free financing on leverage above 100%; Monte Carlo ruin is absorbing; Ledoit–Wolf shrinkage rescaled to preserve variances; Black–Litterman post-exclusion weight bounds; contiguous-quarter TTM for fundamentals.Numbers changed for the affected tools
2026-07Published this methodology centre and linked it from every tool and the site footer.Display only — no numbers changed
2026-07Added a net-of-cost estimate (from measured turnover) alongside the before-costs headline on Tactical results.Display only — no numbers changed
2026-07AI Insights extended to explain the results of every analysis tool.New capability
2026-06CASH pseudo-ticker (0% nominal return) supported across all engines.New capability
2026-06Retirement guardrails withdrawal method added to the Withdrawal Lab.New capability

Spotted something that looks wrong? Email methodology@informedportfolio.com — corrections are versioned in the change log above.

Methodology — how every number is calculated | Informed Portfolio