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.09.2Page updated2026-09-29

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 (or a Canadian listing entered with its venue suffix, like SHOP.TO, or a London listing like VOD.L) is backfilled on demand the first time someone analyzes it. The Portfolio Backtest can compute in US dollars, Canadian dollars or British pounds. The Check-in and monitors report in the saved portfolio's own currency, and Growth Replay uses the listing currency when every holding shares one. Every other analysis tool works in US dollars, and says so when the portfolio was set up in another currency. All of them convert each asset from its listing currency with historical exchange rates.

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.
  • History depth: up to 30 years, starting January 1 thirty years before the current year; older prices and dividends are neither fetched nor stored. A fund younger than that starts at its first trading day.
  • Coverage: US-listed ETFs and common stocks, plus Canadian listings on the TSX, TSX Venture, CSE and Cboe Canada (.TO, .V, .CN, .NE) and London Stock Exchange listings including AIM (.L), each entered with its venue suffix; a bare ticker always means the US listing. ~190 seeded tickers stay continuously updated; other permitted 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, CPIAUCSL (inflation), and the H.10 noon reference rates DEXCAUS (USD/CAD) and DEXUSUK (USD/GBP) for currency conversion.
  • Ingestion: every night, the latest prices of every stored instrument, and the dividends of the seventh read longest ago, so each instrument's dividends are refreshed at least weekly and a payout from the last few days can take up to a week to appear; a full re-ingestion that re-applies split adjustments across entire histories a small batch at a time (cycling the whole universe about monthly); and on-demand backfill the first time an analysis touches a symbol, or when its prices have fallen more than five days behind.
  • Each price series is stored in its listing currency (USD, CAD for Canadian venues, or GBP for London, with pence quotes normalized to pounds at ingestion so nothing downstream sees a minor unit). The Portfolio Backtest and the comparison pages convert every asset's monthly returns into the base currency per asset, before aggregation: r_base = (1 + r_local) × (fx_t / fx_(t-1)) - 1, from month-end reference levels (units of the currency per USD; a GBP and CAD cross pivots through USD). Each month converted needs an observed level for itself and the month before; only the month in progress may use the previous month's level. Every other tool converts each close and dividend at that day's rate (at most 10 days old) before any return is built. A portfolio with no cross-currency asset needs no conversion.

Known limitations

  • Canada and the London Stock Exchange are the supported non-US markets; UCITS listings on other European venues and other international exchanges remain unsupported. Unsupported searches are logged so demand steers the roadmap.
  • London listings are supported when they quote in the pound family (pence or pounds); a small number of LSE lines quoted in USD or euros are not yet supported and are refused rather than shown in the wrong unit.
  • When the exchange rates a result needs are unavailable, it is not computed: the tool says the rates are unavailable (and an anonymous run is not counted) rather than mixing currencies under one label.
  • Conversion uses official noon reference rates (non-tradeable): month-end levels for the Portfolio Backtest and the comparison pages, daily rates elsewhere. No spread or conversion cost is modeled.
  • A backtest asked for in a currency other than US dollars, Canadian dollars or British pounds is shown in US dollars, with a note.
  • Canadian and UK market data is end-of-day only.
  • 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.
  • Whole months: every month runs from the last close of the month before it to its own last close. The first month is measured from the last close before the start date, so a start on or before a month's first trading day covers that whole month, and a start inside a month begins with the next one. A fund launched inside the window starts at its first whole month, and the same rule sets the first week of weekly series.

Known limitations

  • The last month of a window can be partial: an end date inside a month, or the month in progress, runs only through that day's close.
  • 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. A failed dividend fetch is never stored as "no dividends", but a feed that answers with an empty list looks the same as a fund that pays nothing, and that would make a return price only. So a result warns when a holding that paid regularly shows no distribution for well past its usual rhythm (two and a half of its usual intervals, and at least 120 days), and when a fund shows none at all over two years or more.

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. It is 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).
  • An annual fee f is charged monthly as 1 - (1 - f)^(1/12) of the value, so twelve months cost exactly f, as in Fee X-Ray.
  • 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.
  • CPI_start is the CPI of the month before the first month shown. When that month's CPI is unavailable the result says so and stays in nominal terms, and inflation-indexed contributions are not indexed.

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, so there is 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 average over the months shown, never over the dates typed, so a fund younger than the requested window is measured against the rate of its own months.
  • 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, so 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, so 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 thin tails and understates crash risk (a month's return is clamped at -100%, since a holding cannot lose more than everything); 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 solved exactly on the capped simplex (weights of at least 0, summing to 1, per-asset min/max boxes) by a primal active-set method, which moves weight until every optimality condition holds; projected gradient descent remains as the fallback beyond 25 assets.
  • Expected returns: arithmetic mean of monthly returns × 12 by default; a CAGR-based option is available.
  • Covariance: sample covariance by default (no shrinkage), so 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 to 2009, 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. A holding with no data in that window takes an equity beta of 1 (cash 0) and a rate beta of 0, and is named; when the 10-year yield is unavailable, equity betas come from the S&P 500 alone and every rate beta is 0, with a note.

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, meaning 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, meaning 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, meaning the 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, meaning the weighted expense ratio with coverage and sources, published only at ≥95% coverage by weight; and the goal scenario, meaning 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, because 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-10Results now warn when a holding's distributions stop well past its usual rhythm, or when a fund shows none over two years or more, since its return may then be price only. Tools that compute in US dollars say so when the portfolio was set up in another currency. Engine 2026.09.2 is unchanged.Display only; no numbers changed
2026-09Data cadence (engine 2026.09.2 unchanged): every stored instrument's prices are refreshed each night, where the nightly update used to reach only the seventh of the store refreshed longest ago, so a price could be up to a week old. Dividends are refreshed on a weekly rotation, each night for the seventh read longest ago, so a payout from the last few days can take up to a week to appear. The status page now counts an instrument as stale after 5 days behind instead of 10.No formula changed; recent prices are fresher
2026-09Engine 2026.09.1 to 2026.09.2 (the ipaudit01 numbers review). Every month runs from the last close before it: a start on or before a month's first trading day covers that whole month, and a start inside a month begins with the next one (a shared partial first month used to count as a whole month, so a backtest from the 1st could differ from the ETF page over the same labelled months). The risk-free rate is averaged over the months a result covers, not the dates typed, and no rate, CPI or exchange rate is read before the 30-year history floor. Month-end exchange rates are no longer forward-filled past a missing month, and a result that needs rates that are unavailable is refused instead of mixing currencies; a backtest in a currency conversion does not support is shown in US dollars. The backtest fee is charged so a year costs exactly the stated fee. A dividend whose ex-date has no trading day counts on the next session. The optimizer solves each frontier point exactly. Stress betas: a holding with no data in the lookback takes a beta of 1 instead of 0, and equity betas are still measured when the Treasury yield is unavailable. Goals, Monte Carlo, retirement and the stress test read today per request. Monitors treat CASH as cash. Growth Replay schedules from the 29th to the 31st no longer skip short months. A 0% holding no longer limits the dates, and a clamp names the holding that set it.Numbers changed for most tools (backtests and every aligned-returns tool, Sharpe ratios, optimizer weights on near-duplicate assets, stress shocks, fees)
2026-09Engine 2026.07.1 to 2026.09.1: the Portfolio Backtest's inflation-adjusted view and inflation-indexed contributions now measure against the CPI of the month before the first month shown. That month's CPI was never fetched, so the real curve matched the nominal one and indexed contributions stayed flat while the result said it was inflation-adjusted. When the base month's CPI is unavailable, the result now says so and shows nominal figures.Numbers changed for inflation-adjusted backtests and inflation-indexed contributions
2026-09Recorded retroactively (2026-09-16): market data is capped at 30 years, from January 1 thirty years before the current year, and older prices and dividends are neither fetched, stored nor served. The dividend feed's 100-row cap had cut long dividend histories short for 97 funds; they were back-filled, so their total returns now include every payout. No engine version was assigned at the time.Numbers changed for windows reaching before the floor, and for the 97 funds' total returns
2026-09Recorded retroactively (2026-09-15): whole months on the comparison and ETF pages, the backtest, the risk profile and the analysis tools (a fund launched inside the window starts at its first whole month); comparisons across currencies in US dollars; and every analysis tool and Growth Replay in one currency, converting each close and dividend at that day's exchange rate. No engine version was assigned at the time.Numbers changed for late-launching funds and for cross-currency portfolios
2026-08Added London Stock Exchange listings, including AIM, via the .L venue suffix (e.g. VOD.L). Pence-quoted prices and dividends are normalized to pounds at ingestion, and British pounds joined US and Canadian dollars as a Portfolio Backtest base currency (FRED DEXUSUK for USD/GBP; a GBP↔CAD conversion pivots through USD). A handful of LSE lines quoted in USD or euros are not yet supported. Existing US and Canadian analyses are unchanged.New capability
2026-08Added Canadian listings (TSX, TSX Venture, CSE, Cboe Canada) via venue-suffixed tickers (e.g. SHOP.TO), with per-asset currency conversion in the Portfolio Backtest: each asset's monthly returns convert from its listing currency into the portfolio's base currency (USD or CAD) using month-end USD/CAD rates (FRED DEXCAUS). Other tools still compute on listing-currency returns. The nightly ingest now refreshes the stalest seventh of the universe per night; on-demand backfill and the weekly full refresh keep worst-case freshness bounded.New capability: existing all-USD analyses are unchanged
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