Guest mode: your portfolio is kept in this browser until you connect.

Sys onlineGuest--:-- local

Year-end losses for French residents at a foreign broker: the last day to sell for 2026 is December 29, not the 31st

For a French tax resident, a sale counts for 2026 only if it settles by December 31: the last trade day is Tuesday, December 29 on Euronext and Xetra, and Wednesday, December 30 on the NYSE and Nasdaq. On our demo book, a sale made in time erases €740.16 of flat tax.

Julien Esnault
Julien Esnault

· 9 min read

Grid of the last four trading days of 2026 for a French tax resident: a sale on Euronext or Xetra counts for 2026 if made by Tuesday, December 29, a sale on the NYSE or Nasdaq by Wednesday, December 30; one session later it settles on January 4, 2027 and counts for 2027

Short answer: for a French tax resident, a sale counts for 2026 only if it settles by December 31. The last trade day is Tuesday, December 29, 2026 on Euronext and Xetra, and Wednesday, December 30 on the NYSE and Nasdaq. On our demo book, a sale made in time erases €740.16 of flat tax.

The AMF's mediator published the case of an investor who planned for the 31st: he sold 2,700 shares on December 31, 2019, at a loss of more than €40,000, to set against a €45,000 gain. The trade settled on January 2, 2020. The loss counted for 2020, the gain was taxed in full for 2019, and he put the cost at about €13,000. The mediator found no fault at the broker.

The last day to sell, market by market

MarketSettlementLast trade day for 2026It settles onOne session later settles on
Euronext (Paris, Amsterdam)T+2Tuesday, December 29Thursday, December 31Monday, January 4, 2027
Xetra (Frankfurt)T+2Tuesday, December 29Thursday, December 31Monday, January 4, 2027
NYSE, NasdaqT+1Wednesday, December 30Thursday, December 31Monday, January 4, 2027

T+2 means the shares and the cash change hands two business days after the trade; T+1, the next business day. January 1, 2027 is a Friday, so a sale one session late settles on the Monday.

Euronext trades on December 31 and closes early. An order placed that day fills as usual; it settles in 2027. Xetra does not trade on December 24 or December 31, 2026.

New York is a day later because US trades have settled the next business day since May 28, 2024. That holds for a share sold on a US exchange. The same company sold on Xetra, or through a euro listing, follows the European cycle.

A broker settles on the cycle of the market the order goes to, whether it is Interactive Brokers, Degiro or a French bank. Some publish their own earlier cut-off for the tax year in December: if yours does, that date comes first.

Why the settlement date decides, not the order

French tax dates a sale at the transfer of ownership (BOFiP, BOI-RPPM-PVBMI-30-10-10, § 1). For listed shares, the Code monétaire et financier, article L. 211-17, places that transfer at settlement, the day the shares are entered in the buyer's account, no later than the second business day after the trade. The tax doctrine reads it the same way where it gives a case: for shares tendered to a public offer, « le transfert de propriété intervient à la date du dénouement effectif de la négociation », the day the trade actually settles (§ 50).

It is the reasoning the AMF's mediator applied to the 2019 sale. The date will move: the European Union switches to T+1 on October 11, 2027, so from the 2027 year end the European last day comes one session closer to December 31.

For a US taxpayer the rule is the other way round: the trade date decides, December 31 counts, and the 30-day wash-sale window applies. That side is on the tax-loss harvesting page, with the study of how closely 32 ETF swap pairs moved.

What a sale in time is worth, on the demo book

Our French demo book holds stocks and funds at Interactive Brokers and Trading 212. In 2026 it has one realised gain: 20 Nvidia shares sold on March 16, a gain of €2,357.21 in euros. At the 2026 flat tax of 31.4% (12.8% income tax plus 18.6% social contributions), that is €740.16.

At the closes of November 9, 2026, one line stood under its cost: 25 shares of LVMH, down with the rest of luxury this year, bought at a weighted average of €653.92 and closing at €402.45.

On the demo bookAmount
2026 gain, 20 Nvidia sold March 16€2,357.21
Flat tax on it, at 31.4%€740.16
LVMH, loss a share (€653.92 less €402.45)€251.47
Loss on 10 shares€2,514.70
Loss on all 25 shares€6,286.75
Tax erased by either sale, settled in 2026€740.16
Loss left to carry, 10 shares sold€157.49
Loss left to carry, 25 shares sold€3,929.54
Bar chart of Portfolio Terminal's French demo book at the closes of November 9, 2026: a 2026 gain of €2,357.21 on Nvidia, against a loss of €2,514.70 on 10 LVMH shares and €6,286.75 on all 25; either sale erases €740.16 of flat tax
Source: Portfolio Terminal demo book, ECB reference rates, Yahoo Finance closes of November 9, 2026

10 shares are the fewest whose loss covers the gain: 9 would give €2,263.23, short of it. A loss first comes off the gains of the same year. What is left carries to the gains of the next 10 years, 2027 to 2036 here, provided the loss is declared the year it is realised (article 150-0 D, 11 of the tax code).

Now place the same order one session late, on December 30. It fills, settles on January 4, and counts for 2027. The €740.16 is due for 2026. The loss is not gone: it waits for a 2027 gain. Being late costs a year's wait on €740.16, or longer if 2027 brings no gain.

Three limits. The figures move with LVMH's price every day until the sale. The estimate leaves out the sale's own fee. And a loss that offsets a gain defers tax more often than it removes it: if you buy the shares back at €402.45, that becomes their cost, and the gain you skipped this year shows up when you sell them. We found no waiting period in the French tax code before a buy-back, unlike the 30 days of the US wash-sale rule. The tax office can still challenge a sale and an immediate buy-back made only to save tax, under its abuse-of-law procedure: that is a question for an adviser. This is arithmetic on an example book, not a suggestion to sell LVMH or anything else.

At a foreign broker, the euro gain is yours to compute

A bank in France computes each client's gains and reports them on a yearly tax statement, the IFU. Brokers outside France such as Interactive Brokers or Degiro send none. The gain that goes on form 2074, where a French return computes gains sale by sale, is yours to compute, and two French rules make it differ from the figure on a broker statement.

The cost is the weighted average purchase price, the PMP: every share of the security you hold outside a PEA, fees included, averaged. Many broker statements cost a sale first in, first out instead: the oldest shares are the ones sold.

Every amount is in euros at the rate of its own date. The demo's Nvidia sale, step by step:

StepDollarsECB rate, dollars per euroEuros
Buy 40 at $28.91, May 1, 2023, $5 fee$1,161.401.0981 (fixing of April 28)€1,057.65
Buy 20 at $76.20, April 19, 2024, $5 fee$1,529.001.0653€1,435.28
Average cost a share (PMP)$44.84€41.55
Sell 20 at $183.22, March 16, 2026, $5 fee$3,659.401.1478€3,188.19
Gain on the 20 shares$2,762.60€2,357.21

The shortcut is to take the $2,762.60 and convert it once, at the sale-day rate: €2,406.87. That is €49.66 more gain than the French method, and €15.59 of flat tax. The dollar was dearer when the shares were bought than when they were sold, so their cost in euros was higher than the shortcut assumes. With a dollar that rose instead, the shortcut would understate the gain. Either way it is not the figure the return asks for.

Bar chart of the gain on 20 Nvidia shares sold on March 16, 2026, in euros: €2,357.21 with each buy and the sale converted at its own ECB rate, €2,406.87 when the broker's dollar gain is converted once at the sale-day rate, a gap of €49.66
Source: ECB euro reference rates for the US dollar, Portfolio Terminal demo book

Three ways the date gets missed

  • The order of December 30 or 31 on a European market. It fills, and the confirmation is dated 2026. The settlement, and the tax year, are 2027.
  • The limit order that does not fill. An order placed on the 29th at a price the market never reaches is not a sale. A day of margin leaves room for a second try.
  • A market that is not in the table. A fund bought through London, Zurich or Milan follows that exchange's own calendar and settlement cycle. Read it before counting on the 29th.

What to do before December 29

  1. Add up the gains you have realised in 2026, in euros, at the PMP, and take off any loss carried from earlier years.
  2. List the lines standing under their cost, with the loss a share.
  3. Compare the two: a loss larger than the year's gains erases no more tax this year, it carries forward.
  4. If you sell, place the order with a day of margin and read your broker's year-end notice.
  5. Keep the trade confirmation, the broker's record of the executed order: it shows the settlement date.

Steps 1 to 3 are what the "Before December 31" panel does on the demo, on a book like this one, and on your own lines once they are in: import them from a broker export or a screenshot, no broker login. The audit described on the pricing page turns them into a dated plan, line by line; it keeps December 29 for every line, US shares included, which leaves a day of margin.

How we measured

The dates come from each market's settlement cycle and its 2026 calendar: two business days for Euronext and Xetra, one for the NYSE and Nasdaq; no trading on Xetra on December 24 and 31; no settlement anywhere on December 25 and January 1. The last trade day is the last session whose settlement day is still in 2026.

The amounts come from Portfolio Terminal's French demo book, a made-up account whose buys are dated and priced at real closes, valued at the Yahoo Finance closes of November 9, 2026. The gain is computed at the weighted average purchase price in euros, each amount at the ECB reference rate of its date, or of the last fixing before it. The flat tax is the 2026 rate, 31.4%. The same figures come out of the site's own tax engine, to the cent; a test holds the two together.

What would change the result: a broker cut-off earlier than the market's, a settlement that fails, a change in the 2026 holiday calendars, LVMH's price on the day of the sale, losses carried from earlier years (they come off the gain first), and the option for the income-tax scale instead of the flat tax. A PEA and crypto follow other rules and are left out.

Reproduce it

The script recomputes the three dates, the demo book's amounts and the two euro gains from the ECB's public rates; we ran it on November 10, 2026.

Show the code78 lines of Python, and what it printed
# Reproduces https://portfolio-terminal.com/blog/moins-values-courtier-etranger-vendre-avant-31-decembre
# pip install requests
# For a French resident at a foreign broker in 2026: (1) by market, the last trade day whose settlement,
# the day ownership passes (CMF art. L211-17; BOFiP BOI-RPPM-PVBMI-30-10-10), still falls in 2026;
# (2) on our French demo book, the flat tax that selling the losing line by that day erases; (3) the
# year's gain in euros at the ECB rate of each buy and of the sale (the PMP the French return asks
# for), against the broker's dollar gain converted once.
import csv, io, json
from datetime import date, timedelta
import requests

YEAR, FLAT_TAX = 2026, 0.128 + 0.186  # income tax 12.8% + social contributions 18.6% (2026)
# Settlement cycle in business days and year-end closures. Euronext: open Dec 31 (early close). Xetra: no trading
# Dec 24 and 31, Clearstream settles Dec 31. US: T+1 since May 28, 2024 (SEC rule 15c6-1). EU: T+2 until Oct 11, 2027.
HOLIDAYS = {"12-25", "01-01"}
MARKETS = {"Euronext (Paris, Amsterdam)": (2, HOLIDAYS), "Xetra (Frankfurt)": (2, HOLIDAYS | {"12-24", "12-31"}), "NYSE / Nasdaq": (1, HOLIDAYS)}
is_open = lambda day, closed: day.weekday() < 5 and day.strftime("%m-%d") not in closed


def settles(trade, cycle):
    day = trade
    while cycle:
        day += timedelta(days=1)
        cycle -= is_open(day, HOLIDAYS)
    return day


dates = {}
for name, (cycle, no_trade) in MARKETS.items():
    last = date(YEAR, 12, 31)
    while not (is_open(last, no_trade) and settles(last, cycle).year == YEAR):
        last -= timedelta(days=1)
    after = last + timedelta(days=1)
    while not is_open(after, no_trade):
        after += timedelta(days=1)
    dates[name] = {"last_trade": str(last), "settles": str(settles(last, cycle)), "next_trade": str(after), "next_trade_settles": str(settles(after, cycle))}
    print(f"{name}: sell by {last:%a %d %b} (settles {settles(last, cycle):%a %d %b}); a sale on {after:%a %d %b} settles {settles(after, cycle):%a %d %b %Y}")

# The demo book's one line under its cost at Interactive Brokers: LVMH, two buys (shares, price), €5 a trade,
# against its close on Nov 9, 2026 (Euronext Paris). French cost is the weighted average price (PMP), fees in.
BOUGHT, CLOSE = [(10, 728.4), (15, 603.6)], 402.45
held, cost = sum(q for q, _ in BOUGHT), sum(q * p + 5 for q, p in BOUGHT)
loss_a_share = cost / held - CLOSE
loss_total = round(cost - held * CLOSE, 2)

# The year's gain: 20 of 60 Nvidia shares sold at Trading 212 on Mar 16, 2026 at $183.22, $5 a trade.
BUYS, SALE = [("2023-05-01", 40, 28.91), ("2024-04-19", 20, 76.20)], ("2026-03-16", 20, 183.22)
url = "https://data-api.ecb.europa.eu/service/data" + "/EXR/D.USD.EUR.SP00.A?startPeriod=2023-04-20&endPeriod=2026-03-20&format=csvdata"  # the ECB's data API
fixings = {row["TIME_PERIOD"]: float(row["OBS_VALUE"]) for row in csv.DictReader(io.StringIO(requests.get(url, timeout=60).text))}


def ecb(day):  # dollars per euro, the last fixing on or before the day (none on May 1, 2023)
    d = date.fromisoformat(day)
    while str(d) not in fixings:
        d -= timedelta(days=1)
    return fixings[str(d)], str(d)


shares = sum(q for _, q, _ in BUYS)
pmp_eur = sum((q * p + 5) / ecb(d)[0] for d, q, p in BUYS) / shares
pmp_usd = sum(q * p + 5 for _, q, p in BUYS) / shares
sale_rate = ecb(SALE[0])[0]
proceeds_usd = SALE[1] * SALE[2] - 5
gain_eur = round(proceeds_usd / sale_rate - pmp_eur * SALE[1], 2)
gain_usd = round(proceeds_usd - pmp_usd * SALE[1], 2)
gain_usd_in_eur = round(gain_usd / sale_rate, 2)
gap = round(gain_usd_in_eur - gain_eur, 2)
tax_due, erased = round(gain_eur * FLAT_TAX, 2), round(min(loss_total, gain_eur) * FLAT_TAX, 2)
enough = next(n for n in range(1, held + 1) if n * loss_a_share >= gain_eur)  # the fewest shares whose loss covers the gain
print(f"LVMH on Nov 9: {held} shares, PMP €{cost / held:,.2f}, close €{CLOSE:,.2f}, loss €{loss_total:,.2f} (€{loss_a_share:,.2f} a share)")
print(f"2026 gain (Nvidia, PMP €{pmp_eur:,.2f} a share at ECB rates): €{gain_eur:,.2f}; the broker's ${gain_usd:,.2f} at the sale-day rate: €{gain_usd_in_eur:,.2f}, €{gap:,.2f} more (€{gap * FLAT_TAX:,.2f} of tax)")
print(f"flat tax on the gain: €{tax_due:,.2f}; erased by a sale settled in 2026: €{erased:,.2f}; {enough} shares are enough (loss €{enough * loss_a_share:,.2f}); all {held} carry €{loss_total - gain_eur:,.2f} to 2027–2036")
json.dump({"year": YEAR, "flat_tax": round(FLAT_TAX, 4), "markets": dates, "priced": "2026-11-09",
           "lvmh": {"shares": held, "cost": round(cost, 2), "pmp": round(cost / held, 2), "close": CLOSE, "value": round(held * CLOSE, 2), "loss": loss_total, "loss_a_share": round(loss_a_share, 2)},
           "rates": {d: {"rate": ecb(d)[0], "fixing": ecb(d)[1]} for d in [b[0] for b in BUYS] + [SALE[0]]}, "pmp_eur": round(pmp_eur, 2), "pmp_usd": round(pmp_usd, 2),
           "proceeds_eur": round(proceeds_usd / sale_rate, 2), "gain_eur": gain_eur, "gain_usd": gain_usd, "gain_usd_in_eur_at_sale": gain_usd_in_eur, "gap_eur": gap,
           "gap_tax": round(gap * FLAT_TAX, 2), "tax_due": tax_due, "tax_erased": erased, "shares_enough": enough, "loss_enough": round(enough * loss_a_share, 2),
           "carried_enough": round(enough * loss_a_share - gain_eur, 2), "loss_carried": round(loss_total - gain_eur, 2)}, open("results.json", "w"), indent=1)
Euronext (Paris, Amsterdam): sell by Tue 29 Dec (settles Thu 31 Dec); a sale on Wed 30 Dec settles Mon 04 Jan 2027
Xetra (Frankfurt): sell by Tue 29 Dec (settles Thu 31 Dec); a sale on Wed 30 Dec settles Mon 04 Jan 2027
NYSE / Nasdaq: sell by Wed 30 Dec (settles Thu 31 Dec); a sale on Thu 31 Dec settles Mon 04 Jan 2027
LVMH on Nov 9: 25 shares, PMP €653.92, close €402.45, loss €6,286.75 (€251.47 a share)
2026 gain (Nvidia, PMP €41.55 a share at ECB rates): €2,357.21; the broker's $2,762.60 at the sale-day rate: €2,406.87, €49.66 more (€15.59 of tax)
flat tax on the gain: €740.16; erased by a sale settled in 2026: €740.16; 10 shares are enough (loss €2,514.70); all 25 carry €3,929.54 to 2027–2036

This article computes dates and amounts on an example. It is not tax advice and not investment advice; your own return depends on your whole situation.

Sources: BOFiP, BOI-RPPM-PVBMI-30-10-10, the date of the taxable event · AMF mediator, the year-end order case, Dec. 1, 2020 · BOFiP, how losses offset gains · Euronext, trading hours and holidays · Deutsche Börse, Xetra trading calendar · NYSE, hours and calendars · SEC, the move to T+1 · ESMA, the EU's move to T+1 · French economy ministry, the flat tax in 2026 · IRS Publication 550, wash sales and trade dates · ECB, euro reference rates

#research#taxes

Keep reading

10 min readTax-loss harvesting ETF pairs: how closely 32 swaps moved, and why a high correlation is not the same returnWe measured 32 ETF pairs over 261 weeks to Oct. 16, 2026. Same-index pairs never moved more than 1 point apart in a week. Different-index pairs correlated 0.930 to 0.996, yet SMH and SOXX, at 0.987, ended the year 13.82 points apart. Whether a pair is “substantially identical” is a legal question.12 min readWhy are luxury stocks down? LVMH −39.9% and Hermès −39.2% in 2026LVMH (MC.PA) fell 39.9% and Hermès (RMS.PA) 39.2% in 2026 through Oct. 22, 2026, while the S&P 500 rose 11.9%. For Hermès, no year since at least 2001 started this badly; yet in all six S&P 500 declines of 19% or more since 2000, it fell less than the index. We measured why.8 min readHow to Calculate Your Portfolio Return (and Why Your Broker Disagrees)Three formulas for a portfolio return: simple, money-weighted (XIRR) and time-weighted. On one account with $15,000 paid in, they give +1.33%, +1.60% a year and +4.50%. Here is what each one measures, and which one answers your question.

cite: Julien Esnault, “Year-end losses for French residents at a foreign broker: the last day to sell for 2026 is December 29, not the 31st”, Portfolio Terminal, 2026-11-10. plain-text version for AI tools

Try it on your own holdings

portfolio terminal

Measure your own portfolio’s risk, not a textbook one.

Import your positions from any broker and see your volatility, beta, drawdown and correlations every morning.

Wall Street in 60s, every morning. What’s in it

One short email before the open. Unsubscribe anytime.