Calculate your DeGiro TWR and XIRR yourself, in a spreadsheet
You don't need this tracker to get a real return — a spreadsheet and your account statement will do. Here is exactly how, with a worked example you can type in and check.
What you need from the export
Only a few rows of Account.csv matter: the deposits from your bank and the withdrawals back to it, each with its date and amount. In an English export they are described with “Deposit” and “Withdrawal” (“Storting” and “Opname” in Dutch); the account statement guide lists the look-alike rows — reservations and transfers between balances — that should be left out.
You also need what the whole account is worth today — positions plus cash, the total DeGiro shows on its portfolio screen. For a time-weighted return you need one more thing: what the account was worth just before each deposit or withdrawal. That last part is the hard bit by hand, and there's a fallback for it below.
XIRR in three columns
Put the dates in column A and the amounts in column B, from your point of view: money going into the account is negative (it left your pocket), money coming out is positive, and the last row is today's value as a positive amount — as if you sold everything today. An example:
| A: date | B: amount | what it is |
|---|---|---|
| 15 Jan 2024 | −5,000 | deposit |
| 3 Jun 2024 | −3,000 | deposit |
| 20 Nov 2024 | 2,000 | withdrawal |
| 10 Mar 2025 | −4,000 | deposit |
| 31 Dec 2025 | 11,800 | value today |
Then =XIRR(B2:B6, A2:A6) — the same in Excel, Google Sheets and LibreOffice Calc — returns 11.1%: the annual rate your money earned, given exactly when it went in and came out. The function counts time in days ÷ 365, which is also how this tracker computes it, so the two should agree to the decimal when the inputs do.
If XIRR returns an error, the usual cause is the signs: it needs at least one negative and one positive amount. If it returns something absurd for a short history, that is annualising at work — a 5% gain over three months is a 21.6% annual rate. Some spreadsheets also accept a starting guess as a third argument, which helps when the true rate is far from 10%.
Time-weighted return, by hand
Pick a period — say calendar year 2025 in the example. You need the value at the start (31 December 2024: €6,900), the value just before the one deposit in the period (9 March 2025: €7,200), and the value at the end (€11,800). The €4,000 deposit on 10 March splits the year in two:
- 1 January to 9 March: 7,200 ÷ 6,900 = 1.0435
- 10 March to 31 December: 11,800 ÷ (7,200 + 4,000) = 1.0536
- Chained: 1.0435 × 1.0536 − 1 = 9.9%
In a sheet, that is one row per period with =end_value / (start_value + deposit) in a column, and =PRODUCT(C2:C3) - 1 underneath. Every extra deposit or withdrawal adds one row. A withdrawal is a negative deposit: the next period starts from the value after the money left.
No values on the deposit dates? The Modified Dietz shortcut
DeGiro doesn't show what the account was worth on an arbitrary past day, so the values just before each deposit are often what's missing. The Modified Dietz method needs only the start and end values and the flows, each weighted by how much of the period it was in the account:
- Return = (end value − start value − net deposits) ÷ (start value + Σ weight × deposit)
- Weight = days from the deposit to the end of the period ÷ days in the period. The 10 March deposit was in for 296 of 365 days: 0.811.
- (11,800 − 6,900 − 4,000) ÷ (6,900 + 0.811 × 4,000) = 900 ÷ 10,144 = 8.9%
Notice that this is not the 9.9% above. Modified Dietz is an approximation of the money-weighted return for the period — an XIRR for 2025 alone, starting from the €6,900 already invested, comes out at 8.9% too. The gap to the time-weighted 9.9% is the timing effect the TWR vs XIRR guide explains: the €4,000 arrived after the account had already gained, so it missed that part of the year.
Mistakes that quietly break both
- Counting trades as cash flows. Buying a share moves money inside the account; only deposits and withdrawals count. A sheet built from Transactions.csv instead of the account statement makes this mistake on every row.
- Leaving out withdrawals. Every euro you took out is a positive amount on its own date. Dropping one makes the return look worse by exactly that much.
- Forgetting cash in the end value. Uninvested cash, including dividends that were never reinvested, is part of what the account is worth today.
- Treating dividends as deposits. They are the account earning, already inside today's value.
- Mixing currencies. All amounts in one currency, each converted at its own date's rate — see the currency guide.
Checking your sheet against the tracker
The tracker values the account every day, so its time-weighted return is chained daily rather than at each deposit — which, when the values are exact, gives the same number: chaining the days between two deposits multiplies out to the single period you'd compute by hand. Small differences usually come from the values themselves — a closing price or an exchange rate taken at a slightly different moment — rather than from the method. The methodology page gives the exact formulas and a worked example of each.