Returns and figures
Why your two returns disagree
Time-weighted return measures the portfolio. Money-weighted return measures you. Put 10,000 EUR in before a good year and 40,000 EUR in before a bad one, and the same three years read as 5.9 % a year or 1.3 % a year, depending on which question you asked.
Here is a portfolio that made money and lost it at the same time.
| Date | What happened | Value after |
|---|---|---|
| 2 Jan 2023 | Paid in 10,000 EUR | 10,000 EUR |
| 31 Dec 2023 | The holdings rose 20 % | 12,000 EUR |
| 2 Jan 2024 | Paid in 40,000 EUR | 52,000 EUR |
| 31 Dec 2024 | The holdings fell 10 % | 46,800 EUR |
| 31 Dec 2025 | The holdings rose 10 % | 51,480 EUR |
Three years, 50,000 EUR paid in, 51,480 EUR at the end. The time-weighted return is +18.8 % over the period, which is 5.91 % a year. The money-weighted return is 1.34 % a year. Nothing is broken. The two figures answer different questions, and the 4.6 percentage points between them are entirely the timing of that second deposit.
Both figures above are made up, computed from the five rows in the table and nothing else. You can rerun them in any spreadsheet.
Time-weighted return measures the investments
TWR cuts the period at every deposit and withdrawal, works out the return of each piece, and multiplies the pieces together. In the example that is three pieces, one per year:
1.20 × 0.90 × 1.10 = 1.188 → +18.8 % over three years
1.188 ^ (1/3) − 1 → +5.91 % a year
The 40,000 EUR that arrived in January 2024 never enters the arithmetic. That is the point: a factsheet reports time-weighted return, as the GIPS standards require of one, because a fund cannot be blamed or credited for when its investors send money, and an index has no deposits at all. If you want to compare yourself with the MSCI World, this is the only figure that compares like with like.
Returns chain by multiplication, never by addition. Three months of +10 % are +33.1 %, not +30 %.
Money-weighted return measures you
XIRR is the one annual rate that turns every payment, on the date it actually happened, into what the portfolio is worth today. The example has three flows:
2023-01-02 −10,000
2024-01-02 −40,000
2025-12-31 +51,480 → XIRR = 1.34 % a year
Most of the money was only in the portfolio for the two years that contained the fall. The small early deposit got the good year; the large late one got the bad one. XIRR says so. Paste those three rows into a spreadsheet and its own XIRR function gives the same 1.34 %.
Over any window longer than a year, both figures are annualised. A three-year number is per year, not the total, which is worth knowing before comparing it with anything.
When the app shows no return at all
This is the part most trackers do not tell you about. A return can be missing, and missing is not zero.
XIRR needs money crossing the portfolio boundary. For a window with no deposit and no withdrawal there is no rate to solve for, so Stonqs says the figure is unavailable rather than printing one.
Time-weighted return can be absent too, for a reason you will meet on your very first import: the file you exported contains trades but no deposits, because the money that paid for the trades sits in a bank statement nobody exported. The cash balance then goes below zero, and a stretch where the portfolio had no capital at work has no return to measure. Those stretches are left out of the chain. If the whole window is one of them, the app reports the return as absent, because 0 % would claim the portfolio went nowhere when in truth nothing could be measured. Import the account the money came from, or add the deposits by hand, and the figure appears.
For the same reason time-weighted return never drops below −100 %. A portfolio that owes more than it holds is a ledger with rows missing, not a loss of more than everything.
Which figure answers which question
| Question | Figure |
|---|---|
| How did my investments do? | Time-weighted |
| How did I do? | Money-weighted |
| Am I ahead of an index? | Time-weighted, always |
| Did my timing help? | The gap between the two |
A benchmark is only ever compared against the time-weighted figure. The index has no contributions, so it has no timing to be judged on, and the comparison is narrowed to the window both sides actually cover: a fund listed two years ago against a ten-year portfolio is compared over those two years, and Stonqs names the window it used.
Checking the number instead of believing it
Stonqs writes the period out row by row: opening value, money in and out, what the market did, income, costs, closing value. The opening value of each row is the closing value of the row above, so the rows chain, and the last chained return is the one printed at the top of the screen. Splitting the same period by day, month or year gives the same closing value and the same return. Only the rows differ. The sheet exports to CSV, which is the point of it.
Two traps live in that sheet. A rising value is not a result: look at the flows column first when a value and a return disagree. And costs there are wider than on the charges screen, because a purchase commission is part of what the shares cost, not a standalone fee.
Sources
- Stonqs: returns, time-weighted and money-weighted · The rules the app computes both figures by.
- Stonqs: the calculation sheet
- GIPS Standards, CFA Institute · Why fund factsheets report a time-weighted figure.