Late April, one day before the deadline. Anna has a spreadsheet with well over a thousand closed positions from a foreign account, two columns denominated in dollars, and not a single form from her broker. Four hours in, she realises she does not know which exchange rate to apply, or whether she is even adding up the right numbers. Filing forex taxes in Poland really can be done on your own — below I break it into seven steps, from the platform statement to the submitted PIT-38.

Step 1: check whether you will receive a PIT-8C

PIT-8C is an information return issued by a Polish entity that maintains your account — a brokerage house such as XTB or TMS Brokers. The deadline for delivering it to the taxpayer falls at the end of February of the year following the tax year. It shows total revenue, costs, and any loss on the account, already converted into zloty.

A foreign broker — IC Markets, Pepperstone, Interactive Brokers — will not issue a PIT-8C, because Polish law does not oblige it to. That does not make the income exempt; it only means the whole calculation is yours to do. The reverse holds as well: receiving a PIT-8C settles nothing on its own. You still file the return yourself, and if you hold several accounts you add them all up in a single PIT-38.

Step 2: pull the transaction history from the foreign account

You need a complete statement for the calendar year, from 1 January to 31 December. On most platforms it sits under Account Statement or Transaction History; a CSV export is the most convenient, because everything downstream happens in a spreadsheet anyway. A usable statement gives you, for every position, the open and close dates, the instrument, the size in lots, the entry and exit prices, the result in the account currency, and the commissions and swap points.

Step 3: convert the amounts into zloty at the correct rate

This is where mistakes are easiest, and where even experienced investors slip. You do not use the rate from the day of the trade, and you do not use the broker's rate. The statute is precise here:

“Revenue in foreign currencies is converted into zloty at the average exchange rate announced by the National Bank of Poland for the last business day preceding the day on which the revenue arose.” — Personal Income Tax Act of Poland, art. 11a(1), Journal of Laws 1991 no. 80 item 350 (translation of the statutory wording).

The same logic applies to costs: they are converted at the average NBP rate from the last business day preceding the day the cost was incurred. In practice, for a position closed on a Monday you take Friday's rate, not Monday's. You use table A (average rates), never table B, and never a bank's buy or sell quote.

  1. Download the archived table A rates for the whole tax year from the NBP website in spreadsheet form.
  2. Add a column to your own sheet holding the date that governs the rate — the last business day before the date of the revenue or the cost.
  3. Pull the rate in with a lookup formula and convert every position separately; averaging by month has no basis in the rules.
  4. Check a handful of rows by hand, especially around public holidays and long weekends — that is where the wrong date creeps in.

Step 4: establish revenue, costs, and income

PIT-38 does not ask for a single “net profit” figure. You report revenue and the costs of earning it separately, and the difference is your income or your loss. Under article 30b of the Personal Income Tax Act, the costs here are the expenses of acquiring and disposing of financial instruments — above all the commissions and transaction fees charged by the broker.

What does not belong in this source of income is everything a trader would happily push into it: a computer, a second monitor, a VPS, a charting subscription, courses, or books. That mistake is common and expensive — I unpack it in the piece on what really counts as a deductible cost in forex. If you are wondering about other levies, it is also worth checking whether forex attracts transaction tax (PCC) or anything beyond PIT-38.

Step 5: complete the PIT-38, and PIT/ZG for a foreign account

PIT-38 is the return for income from capital sources, including derivative financial instruments. CFDs belong in the derivatives part of the form, not in the part for the sale of securities — putting them in the wrong place is one of the more common filing errors. The rate is flat: 19 percent of the taxable base, with no tax-free allowance and no brackets.

If the income comes from an account held abroad, you attach the PIT/ZG schedule, naming the source country and the income reported there. Disposal of virtual currencies is a separate, self-contained part of the same form — crypto results do not offset your forex result, even though both land on one return.

Step 6: use up losses from earlier years

A loss from capital sources can be set off only against income from the same source, over the five following tax years. In any one year you may deduct at most half of that year's loss — or, for losses arising from 2019 onwards, settle it in one go up to 5 million PLN, with the excess handled under the general rule. A forex loss will not reduce tax on your salary or on rental income. The mechanics and the usual traps are covered in the article on how to settle a forex loss on PIT-38.

Step 7: file by 30 April

The deadline for PIT-38 falls on 30 April of the year following the tax year, and the tax is payable on the same date. The form is made available through the Twój e-PIT service on podatki.gov.pl, partly pre-filled from the PIT-8C information the office has received. One caveat decides everything: data from a foreign account will not appear there by itself. Accept the pre-filled form without completing it and you have filed an incomplete return.

After submission, keep the official confirmation of receipt together with your calculation sheet and statements. Those are your evidence if the office asks questions, and the duty to keep documentation runs until the liability becomes time-barred. If the deadline has already passed, it is worth considering filing together with a statement of active regret (czynny żal) and paying the arrears with interest — that instrument comes from the Fiscal Penal Code, but its effectiveness depends on the circumstances, so with larger amounts ask an adviser first.

How long it takes in practice

Indicative workload for an annual filing
One account at a Polish brokerage house, PIT-8C in handhalf an hour
One foreign account, around a hundred closed positions2–4 hours
One foreign account, several hundred positions4–8 hours
Several accounts and short-term tradingone to two days
Handing it to an accounting officepriced by transaction count — ask for a quote

Those ranges describe the first year. Once you have built a sheet with the rate table and the formulas in place, the next filing takes a fraction of the time — you simply swap in new data.

What to do tomorrow

  1. Export the transaction history for the last full year. Open your broker's panel, select the transaction report for the period from 1 January to 31 December, and save it as CSV. Do it now rather than in April — access to archived data is often restricted after an account is closed or a platform is changed.
  2. Download the archived NBP table A rates for the same year. Drop them into a separate tab of your sheet and build a helper column that returns, for any given date, the last business day preceding it. That single formula removes the most common error in the whole filing.
  3. Separate commissions from the result on positions. Keep two independent columns — revenue and transaction costs — instead of one net figure. PIT-38 needs both numbers separately, and pulling them apart again in April costs hours of wasted work.
  4. Check whether you are carrying an unused loss from earlier years. Open your returns from the last five years and write down the capital-source losses and how much of each you have already deducted. If you have income this year, that is where the simplest lawful reduction of your tax bill is sitting.