NBP Exchange Rate Rules for USD Futures Profits in PLN
Your futures account pays in dollars and your PIT-38 is filed in zlotys. The NBP rule decides which rate, from which day, for every single fill, and the error compounds all year.
General information about tax rules, not tax or legal advice. Rules change and every situation is different: check with a qualified adviser in your country before you file.
You closed forty MNQ trades last quarter on a US broker, the account is denominated in dollars, and now someone has to turn that into a number in zlotys. That is where most Polish futures traders lose an afternoon, and where a surprising number of them file a PIT-38 that the tax office can pull apart in ten minutes.
The rate is not the difficult bit. Nineteen percent on capital income is easy to remember. The difficult bit is that Polish law does not let you pick a sensible looking exchange rate and move on. It tells you precisely which rate, from precisely which day, applied to precisely which amount. Miss that across two hundred fills and your return is wrong by a number you cannot reconstruct, which is a far worse meeting than simply owing tax.
The rule, in one sentence
Article 11a of the Polish personal income tax act (ustawa o podatku dochodowym od osób fizycznych, the 1991 act still in force and consolidated again in 2026) says revenue in a foreign currency is converted into zlotys at the average exchange rate announced by Narodowy Bank Polski for the last business day preceding the day the revenue arose. The same article says costs incurred in a foreign currency are converted at the NBP average rate for the last business day preceding the day the cost was incurred.
Read it twice, because three separate things are hiding in there.
- The rate is the average rate (kurs średni), table A. Not your broker's conversion rate. Not the rate your bank gave you when you withdrew. Not the interbank mid you saw on a chart.
- The day is the business day before, not the day itself. This is the single most common error, and it is the one that produces a small, systematic drift across an entire year.
- Revenue and cost each get their own date. They are not converted together at one rate just because they sit on the same line of a statement.
You can read the act on the Sejm's legal database at ISAP, which carries the original text and every consolidation, including the one published in 2026.
Which day counts for a futures trade
For derivatives, the revenue is not the day the money leaves the exchange, nor the day you wire it to your Polish bank. Polish law treats income from derivative financial instruments as arising when the rights under the instrument are realised or the instrument is disposed of. In trading terms, that is the day you close the position.
So each closed trade is its own event with its own date, and therefore its own NBP rate. A round turn in MNQ opened on Tuesday and closed on Thursday takes Wednesday's table A. A scalp opened and closed inside the same Tuesday session also takes Monday's table A, because the relevant day is the day of closing and the rate is the one from the business day before it.
This is why converting the monthly profit and loss total at a single monthly rate is not a shortcut, it is a different calculation. If your month contains a 4 percent swing in USD/PLN, and most months in the last few years have, the two numbers will not agree and only one of them is the one the law describes.
Weekends, holidays and the CME calendar
NBP publishes table A every business day, between 11:45 and 12:15. Table C, the buy and sell rates, goes out earlier, between 7:45 and 8:15. The exact schedule is published by the bank itself on its page on exchange rate publication times, and the full archive of table A sits in the NBP archive.
Here is where a futures trader gets a problem that a Polish equity investor never gets: the CME calendar and the NBP calendar do not overlap. Globex runs on days when Warsaw is shut, and Warsaw is open on days when the US is shut.
- You close a trade on 3 May, or on 15 August, or on 11 November. NBP published nothing that day, and possibly nothing the day before either. You go back to the last business day that actually has a table, and use that one.
- You close a trade on Monday. The relevant day is Friday, not Sunday, because Sunday has no table.
- Globex opens at 23:00 Warsaw time on Sunday. A trade you close at 00:40 on Monday night is, in calendar terms, a Monday trade, and takes Friday's rate.
- You close a trade on a US holiday when the CME had a shortened session but Warsaw was fully open. Nothing special happens: NBP published normally, so the previous business day's table is the one you use.
None of this requires judgement. It requires a calendar. But it does mean that a formula which says "take the rate of the trade date minus one calendar day" will be wrong roughly a fifth of the time.
Costs convert on their own day
Commissions, exchange fees, NFA fees, clearing fees, data subscriptions, platform licences: all of these are costs in a foreign currency and all of them convert at the NBP average rate for the business day before the day the cost was incurred.
In practice this splits into two habits. Per trade commissions are incurred on the day of the trade, so they ride along with the fill and take the same table. Monthly charges, a data feed billed on the 1st or a platform licence billed on the 15th, are incurred on their own billing date and take the rate from the business day before that date.
Two consequences that people miss. First, you cannot net the commission against the gross result in dollars and convert the net figure once, because revenue and cost may legitimately sit on different tables. Second, a cost incurred in a year when you had no revenue is still a cost of that year, and the conversion date does not move just because you would prefer it to.
A worked example, in numbers
Take a simple month with three closes. The rates below are illustrative round numbers, not real published tables: look up the real ones in the NBP archive when you do this for yourself.
| Closed on | Result (USD) | Rate date (last business day before) | NBP table A rate | Amount in PLN |
|---|---|---|---|---|
| Monday 5th | +1,200 | Friday 2nd | 4.00 | +4,800 |
| Wednesday 14th | -450 | Tuesday 13th | 4.05 | -1,822.50 |
| Tuesday 27th | +2,000 | Monday 26th | 3.95 | +7,900 |
| Commissions (per trade, same dates) | -85 | each trade's own date | mixed | -341 |
Total in dollars: 2,665. Total in zlotys done properly: 10,536.50. Total in zlotys if you had converted 2,665 at a single month end rate of 3.95: 10,526.75. A difference of under ten zlotys, which sounds like nothing until you realise that the discrepancy scales with volume and with volatility, and that the tax office does not care whether the error was small, only whether the method was the one in the act.
Now imagine the same month with a hundred trades and a 5 grosz range in the rate. The gap stops being rounding noise and starts being a number you have to defend.
What your broker will not do for you
A Polish brokerage house issues a PIT-8C. It knows the rules, it does the conversion, and by February you have a document with a number on it. Twój e-PIT then shows you a prefilled PIT-38 and you mostly click accept.
A US broker issues nothing of the kind. There is no PIT-8C, there will never be a PIT-8C, and the prefilled PIT-38 waiting for you in the Ministry of Finance e-filing service will simply not contain your futures result. That is not a bug. The Polish system prefills what Polish payers report to it, and a Chicago clearing firm reports to nobody in Warsaw.
Two things follow. One, the prefilled return being empty is not permission to leave it empty: the obligation to report is yours regardless of whether anyone told the tax office about you. Two, PIT-37 and PIT-38 are auto accepted if you do nothing by the deadline, which means an untouched, incomplete PIT-38 can become your filed return by default. That is the worst possible outcome of doing nothing.
For the 2025 tax year the filing window ran from 15 February to 30 April 2026, and 30 April is the standing deadline for PIT-38 and for paying the tax due.
A workflow that survives an inspection
The goal is not elegance. The goal is that in three years, when someone asks where a number came from, you can produce it without reopening a trading platform.
- Export fills, not summaries. Whatever your platform is, pull a trade level export with entry time, exit time, instrument, quantity and result in dollars. Summaries are the enemy here because they have already netted things that must not be netted.
- Add a rate date column. One formula: the last NBP business day strictly before the close date. Keep a list of Polish public holidays in the same sheet so the formula is not guessing.
- Pull the rates from the source. NBP publishes a free web API that returns table A rates as JSON for any date back to 2 January 2002. A request for a date with no table returns a 404, which is a feature: it tells you your date logic is wrong rather than silently handing you a number. Single queries are capped at 93 day ranges, so a year takes four or five calls.
- Convert line by line. Each fill, each commission, each fee, at its own rate. Sum the zloty column, never the dollar column.
- Keep the evidence. The broker statements, the export, the sheet, and ideally a saved copy of the rate table you used. Polish tax records are generally kept for five years counted from the end of the year the tax was due, so plan on holding everything for six.
If you would rather not build this, any Polish accountant who handles foreign brokerage accounts has a version of it already. What you should not accept is an accountant who asks you for one dollar figure for the whole year, because that number cannot be converted correctly by anyone.
Losses, and the year after a bad year
Capital income sits in its own silo. A loss on futures does not reduce your salary, your rental income or your business profit. It reduces future capital income, and it does so on a schedule: the loss can be settled against income from the same source over the next five consecutive tax years, with a cap of 50 percent of the loss in any single one of those years. There is also a one off route allowing a larger single year deduction up to a statutory ceiling, with anything above it falling back to the 50 percent rule.
The practical implication for a futures trader is uncomfortable but simple. A year that ends flat in dollars can still end with tax to pay if your winners closed on strong zloty days and your losers on weak ones, because the netting happens in zlotys after conversion and not in dollars before it. That is not a loophole and it is not a trap, it is the arithmetic of reporting in a currency you do not trade in.
It also means the conversion discipline is worth something to you, not just to the office. Done correctly, every loss is recorded at a real, defensible zloty value that you can carry forward. Done sloppily, you are carrying forward a number you would struggle to justify if it were ever challenged.
The errors that keep repeating
- Using the rate of the trade day itself. Small, systematic, and present on every single line.
- Using the broker's FX rate. Understandable, because it is printed right there on the statement, and wrong, because the act names NBP.
- Converting the withdrawal instead of the trades. The day you move dollars to your Polish bank is a banking event, not a tax event. Your revenue arose when you closed the positions, sometimes months earlier.
- Converting the year end account balance. An account balance is not revenue and never was.
- Netting in dollars first. Feels efficient, destroys the per event dating that the whole method rests on.
- Assuming the empty prefilled return is the final word. It is a starting point built from Polish reporting only.
Every one of these is fixable with a spreadsheet column and a calendar. None of them is fixable after the fact with a good explanation.
Where to check when you are not sure
Three places, and none of them is a forum. The text of the income tax act on ISAP for what the rule actually says. The NBP table A archive for the numbers themselves. The Ministry of Finance's tax portal for filing dates and the state of the e-filing service in the current season.
If a specific case is genuinely unclear, and cross border derivative income produces plenty of those, Poland has a formal mechanism for it: you can apply to the head of the national tax information service for an individual interpretation of the law as it applies to your facts. It costs a modest fee, it takes months, and it is binding protection if you follow it. For a trader with real volume and an unusual structure, that is cheaper than the alternative.
This article is general information about how the Polish conversion rule works, not tax or legal advice, and it does not take account of your particular situation. Rules, rates and deadlines change, so confirm the current position with a Polish tax adviser or with the tax authority before you file.
Educational content, not investment advice. Trading futures involves substantial risk of loss and is not suitable for every investor. Any reference to Algomyth results is hypothetical, simulated over historical data, and shown in full on the performance page; past performance does not guarantee future results.
Take the seat: watch the engines live
Three specialist engines on Nasdaq, S&P and Gold, every signal streamed the moment it happens, with the stop and the target written before the trade. From $149 a month per market.