All portfoliosEURREAD-ONLY

Methodology

Every number in this app is derived, and every derivation is inspectable. The pages here are the whole pipeline, the exact math, the cash and currency rules, the assumptions behind it, and what the terms mean.

These pages reflect the demo account's settings — risk-free rate 2.0%, VaR confidence 95%, rebalancing band ±20%, reporting currency EUR, region —. In your own account they are yours to set, and every formula below re-substitutes to match.

Metrics & formulas

Every formula the app computes from, with your own settings substituted in — not generic placeholders.

Foundations

the daily return series everything is built on

Let be the portfolio's gross value on trading day (priced holdings + cash) and the net external cash flow (deposits positive, withdrawals negative) attributed to that day. The daily time-weighted return removes the flow before comparing to the prior day:

Flows dated on a weekend or holiday are snapped forward to the next date the series actually has, so every flow still counts toward that day's return. A day only counts once is material capital, which stops a tiny seed balance from producing thousand-percent spikes. The formulas below use , the default for a Mon–Fri business-day sub-portfolio — a sub-portfolio declared 24/7 (crypto) annualises on instead, chosen per sub-portfolio when it's created and editable from its rename dialog. Every ratio on this page is computed with whichever value the scope you're viewing actually uses.

The cumulative performance index (base 100) chains these returns:

Returns

Annualised return is the arithmetic mean daily return scaled to a year:

CAGR is the geometric (compound) growth rate — what a single sum would have grown at:

The two differ on purpose: the arithmetic figure is the average year, the geometric (CAGR) is the realised compound path (always ≤ arithmetic when returns vary). The arithmetic form is used in Sharpe below so the ratio reduces exactly to its textbook definition.

Total return vs. Invested return

one account, two denominators

Total return is measured on , gross value including cash — every euro ever committed to this scope, whether currently at market risk or sitting uninvested. Invested return excludes cash entirely: it applies the same time-weighted formula to securities value alone,

using a flow series scoped to the securities sleeve rather than the whole account. A dividend counts as leaving the sleeve — the payment moves value out of securities and into cash, so omitting it would understate the sleeve's return by roughly the yield. A fee, a trade or a transfer counts at its gross amount: a fee never touches market value, so netting it into the flow would manufacture a return that never happened.

The two are a hierarchy, not a disagreement — Total return is the account's headline figure, uninvested cash and all; Invested return decomposes the part of it that came from what was actually at market risk. The gap between them, the cash effect, is the plain difference:

stated as a difference rather than as a product of weight and return, because chaining daily contributions across a window leaves an interaction term no simple multiplication captures. It splits into three parts that sum to it exactly: dilution (capital sitting in cash earns nothing while it sits there), interest (what that cash actually paid), and currency (the daily revaluation of any cash balance held in a currency other than the account's base currency — exactly zero when nothing foreign is held).

Period profit and loss reads as an income statement over the same securities value. Price movement is what changed that trading does not explain:

and the period closes with no unexplained remainder:

Transfers is value that arrived as securities with no cash movement and no external flow — without its own line it would read as market profit the day it landed. Other is any cash movement in no other category; on an account where every row classifies, it is zero. FXcash is the translation of a foreign cash balance.

A foreign SECURITY's price is already converted to base currency before valuation, so its currency move sits inside Price movement rather than beside it — but it decomposes further, into what a holding earned in ITS OWN currency and what that currency did against the account's own one:

Currency effect is defined as the remainder of Local price movement against Price movement, per day, before the two are summed across the window — never independently measured and then checked against the total, the same honesty every other decomposition on this page carries. Zero on a window with nothing held outside the account's own currency.

Contribution to return

which components produced the window

Contribution decomposes a return the portfolio actually earned across the things it held. It is not benchmark attribution: nothing here compares you to an index or to a factor model. For component on day , with its share of the scope's value at that close:

The weight is yesterday's: a position is exposed to a day's move at the size it closed the previous day at, not at the size it ends up with once that move has happened. is the growth already compounded before day , and it is what makes the parts sum to the whole — without it the rows add to the arithmetic sum of daily returns while the total beside them is a compounded one, and the gap widens the longer the window. With it:

Trading and income is defined as what the components leave over, which is what closes that identity exactly instead of approximately. It is real, not rounding: a position bought or sold during a day was not held at the weight the previous close implies, income credited to cash leaves the securities sleeve, and a holding that could not be priced has no return to contribute. Charging those to the holdings would make every row slightly wrong with nothing on screen to say so.

Two columns sit beside each contribution and neither reproduces it. Average weight, held is the mean size across the days that component existed, so a position opened mid-window is averaged over its own life rather than over the window; the column can therefore exceed 100%. Own return is the component's own compounded return over the days it was exposed — the day it was bought is excluded, because the move that happened before you owned it was not yours. Multiplying the two will not give the contribution: those are window aggregates and a contribution is a daily sum.

Which components appear follows the scope. One portfolio decomposes into its instruments; an account decomposes into its sub-portfolios, each as its securities sleeve, with the account's uninvested cash as one row of its own. Cash carries a weight and no return — it has a balance, not a price — so what it earns arrives under Trading and income with the rest of the income. On the invested basis cash is not a component at all, and the rows sum to Invested return instead of Total return.

Each row's own contribution splits further, into Local and Currency: what a holding earned in its own trading currency, and what that currency did against this scope's own one. With its return in its native currency:

The currency term is deliberately not a separate, third-way split of the day's move. Local and currency returns interact — a holding that is up in its own currency AND helped by a stronger exchange rate earns slightly more than the sum of the two effects taken alone, and that cross term has to land somewhere. It is allocated to Currency wholesale rather than given a named row of its own: an exact accounting either way, but a third column named Interaction would be one more thing to explain for a term nobody has asked about. Local plus Currency equals the ordinary Contribution exactly, for every row, before Trading and income is added.

The cumulative performance chart's third panel regroups the same terms by currency instead of by holding, and links them the same way above is linked: two USD holdings' currency contributions land on one USD line, plotted day by day across the window. Its last point equals the sum of every row's Currency figure that shares that currency, exactly — a different view of the same numbers, never a separately measured one.

Risk

Annualised volatility — standard deviation of daily returns, scaled by :

Downside deviation — the root-mean-square of the daily excess returns that fall short of your risk-free target (), scored at zero for every day that met it:

Value at Risk (VaR) at your 95% confidence is the -quantile of daily returns (the daily loss exceeded only 5% of the time). CVaR / Expected Shortfall is the average return in that tail:

Skew and kurtosis (3rd/4th moments) describe asymmetry and tail-fatness of the daily-return distribution.

Risk-adjusted return

Sharpe ratio — excess return per unit of total risk, at your :

Because the annualised return is arithmetic, this is identically the standard mean-excess-over-std Sharpe — a geometric annualisation would inflate it.

Sortino ratio — same idea, but only downside deviation in the denominator:

Calmar ratio — compound growth per unit of worst drawdown:

Drawdown

The drawdown at is the drop from the running peak of the performance index; Max Drawdown is its worst point:

Every figure here is measured on that index, not on your balance. Deposits and withdrawals are already removed from it, so paying money in cannot end a drawdown and taking money out cannot cause one: your portfolio can sit at an all-time high in value while this reads as still running. Max drawdown duration is how long that one worst episode lasted, peak to recovery (or to today, if it hasn’t recovered). Longest time underwater is a different figure — the longest unbroken stretch ever spent below a prior peak, whichever episode that was, often shallower than the deepest one. The two coincide when the deepest drawdown also happens to be the longest (common at account scope, where one dominant episode swamps the rest); on most single portfolios they don’t. Average drawdown and average drawdown duration are the mean depth and mean duration ACROSS EVERY drawdown episode in the period, each episode weighted equally regardless of how long it ran — a two-week dip and a two-year slump each count once, matching the reference QuantStats report rather than a day-by-day average that would over-weight whichever episode happened to run longest.

Benchmark-relative & trade-level

Rolling beta vs a benchmark over a window :

Rolling correlation vs the same benchmark, over the same window — the other rolling measure of the same relationship, so beta factors into it directly:

Win rate = share of positive days. Payoff ratio = average up-day ÷ |average down-day|. Profit factor = sum of gains ÷ |sum of losses|. Rolling Sharpe, rolling volatility, rolling beta and rolling correlation all use a window that scales with the lookback (about a quarter of it, snapped to whole months, capped at 252 days).

Excess return is the portfolio's cumulative return relative to a benchmark, chained day by day rather than subtracted — the geometric form compounds back to the two totals it's built from, where the arithmetic difference of two return series would not:

is the same date the portfolio's own cumulative index is anchored at — its first day actually invested, not the window's calendar start. A benchmark closed on a day the portfolio traded (a holiday on its own exchange, or a weekend under a 24/7 sub-portfolio) counts as a zero return for the benchmark that day, never a gap. It is never rescaled by the Vol-scaled switch: that control adjusts the cumulative-performance chart's benchmark lines, and applying it here too would mix a real cumulative fact with a hypothetical one on the same axis.

Risk / return scatter & the efficient frontier

mean-variance analysis of your individual holdings

For a set of holdings with weight vector , expected-return vector (historical daily means, annualised ×252) and annualised covariance matrix (daily covariance ×252, converted to your base currency before this step), the portfolio moments are:

The efficient frontier traces the weight vectors that minimise for every achievable target return . At each point, this long-only quadratic programme is solved:

The constraint rules out short positions and makes the closed-form Lagrangian solution unavailable, so each point is solved by sequential least-squares programming (SLSQP), warm-started from the previous point, tracing 80 points from the minimum-variance portfolio up to the single best historical performer.

Two special portfolios are marked on the curve — min variance, solved with no return constraint (), and max Sharpe, the tangency portfolio at your own risk-free rate ().

A short-history instrument is dropped and named rather than forward-filled — forward-filling would enter the optimiser as a near-riskless asset paying whatever its brief real history earned. Your portfolio sitting below the frontier means the same return is theoretically reachable with less volatility, or more return at the same volatility, by redistributing among your current holdings — the frontier is backward-looking and sensitive to estimation error; treat it as a diagnostic, not a prescription.

Your own scope appears on this chart up to three times, each answering a different question. Account is realised NAV including cash — what actually happened, cash and all. Sleeve is realised securities value alone — the Invested return above, plotted rather than only stated as a number. Model is today's holding weights combined over the assets' own return histories across the same window — never traded, and carrying no transaction cost or entry timing of any kind. Account to Sleeve is the cash effect made visible as a distance between two real points; Sleeve to Model is everything actual trading and rebalancing changed that holding today's mix throughout the window would not have.

Money-weighted return (XIRR)

The rate that makes the net present value of every dated cash flow (deposits as outflows, current value as a final inflow) zero, solved numerically:

Inflation-adjusted (real) return

Nominal returns are deflated by the inflation actually experienced over the window — the ratio of the consumer price index between the period's endpoints, not a single year of it:

Set your region in Account to enable real returns — the source is Eurostat HICP for the euro area and World Bank CPI (FP.CPI.TOTL) for named single countries.