The rule almost nobody is told
A capital gain is computed in the currency you are taxed in, not the currency you traded in. That single sentence produces every surprise below.
Concretely: the purchase is converted at the exchange rate on the day you bought, the sale at the rate on the day you sold, and the taxable gain is the difference between those two converted amounts. Nothing converts the result; the two legs convert separately and the result appears afterwards.
Your broker cannot do this for you. It reports in the account currency and has no idea where you are tax resident. Its profit-and-loss figure is the price move, correctly computed, and irrelevant to your return.
What that does to a real trade
A Polish investor buys 100 shares of a US-listed ETF at $100 when the rate is 3.80 PLN/USD, and sells at $95 when the rate is 4.40 PLN/USD.
| Calculation | Amount | |
|---|---|---|
| Cost | 100 × $100 × 3.80 | 38,000 PLN |
| Proceeds | 100 × $95 × 4.40 | 41,800 PLN |
| Taxable gain | 41,800 − 38,000 | 3,800 PLN |
| Tax at 19 % | 722 PLN |
The broker app shows −$500. The tax return shows +3,800 PLN. Both are right. The position lost money, and it is taxed.
Splitting the asset from the currency
The home-currency gain decomposes exactly:
- Asset part = units × (sell price − buy price) × buy-date rate → 100 × (−5) × 3.80 = −1,900 PLN
- Currency part = units × sell price × (sell-date rate − buy-date rate) → 100 × 95 × 0.60 = +5,700 PLN
They sum to 3,800 PLN with nothing left over. Read plainly: the investment lost 1,900 PLN and the currency made 5,700 PLN, and the tax bill is entirely the currency’s doing.
There is a second consistent reading, which values the currency move against the cost and leaves a cross term to allocate somewhere. Neither is more correct — what matters is stating which one produced the number on your screen. Everything here uses the first.
Which rate, by country
The arithmetic is universal; the rate selection is not.
| Country | Rate to use | Trap |
|---|---|---|
| Poland | NBP average rate, last business day before the transaction | Weekends and Polish holidays push the reference date further back |
| Germany | Rate on the transaction date; ECB reference accepted | A German broker withholds on its own computation, which may not match yours |
| Netherlands | Values on 1 January drive box 3 | The relevant date is the reference date, not your trade dates |
| United States | Spot rate on each transaction date | The yearly average is allowed only where the rules explicitly permit it |
| Switzerland | Year-end rate for wealth tax; transaction rate for income | Two different rates for two different taxes on the same holding |
Poland’s rule catches the most people because it is the least intuitive: not the transaction date, the business day before it.
Why this cannot be reconstructed later
The rate that matters is the one that applied on the day of the trade. That is a historical fact — it either got recorded or it has to be dug out of an archive, one transaction at a time, with holidays handled correctly.
Portfolio tools make this worse rather than better. Nearly all of them convert every holding at today’s rate, because that is what you want when looking at a portfolio’s value this morning. It also means the cost basis changes daily, and no figure on the screen can be carried into a tax return.
Storing the rate alongside the transaction — with the price, the quantity and the fee — is a schema decision made once, at the start. Adding it to a tracker that never had it means backfilling every historical transaction with a rate nobody recorded, which is why so few trackers ever do.
What to keep
- A full transaction export from every broker, taken at least yearly. Summaries are not enough; a summary has already destroyed the per-leg dates.
- The exchange rate for each leg, captured at the time, under your own rule.
- Fees attached to their own leg — a purchase fee converts at the purchase rate, a sale fee at the sale rate.
- Transfer records when you move holdings between brokers, since the receiving broker will not carry your basis.
- Your working. With a foreign broker, the burden of proof is yours, typically for five to seven years.