GUIDES

How to model trading fees in a backtest, and why a flat percentage is wrong

Contents
Almost every backtest models trading cost as a single percentage. Subtract 0.1% per round trip, move on. It is the most common shortcut in the whole discipline, and it is wrong in a way that does not average out — it is wrong in different directions depending on your order size, your broker, and the calendar year of your data. This guide is about building a fee model that is actually right, and what it changes when you do. The measurement behind it is our own: we priced [36,947 real round trips at four US brokers](/research/how-much-do-day-trading-commissions-cost-four-us-brokers-36-947-real-t) using each broker's published schedule on the actual date of the trade.

1. Why a flat percentage cannot be right

A percentage assumes cost scales with the money you trade. Most of the real components do not. Take the most common US retail schedule that is not free: **$0.005 per share, with a $1.00 minimum per order and a cap of 1% of trade value.** Three different rules, and which one binds depends entirely on your order. A $1,000 order in a $26 stock is 38 shares. At $0.005 per share that is 19 cents — but the minimum is $1.00, so you pay $1.00. Each side, so $2.00 round trip. As a percentage that is **24 basis points. The same schedule on a $5,000 order works out near 11bp**, because the minimum has stopped binding. One schedule, one broker, and the percentage moved by more than a factor of two purely from order size. No single number can represent that. If you pick one, you are choosing which order size to be correct about.

2. The four things you are actually paying

A fee model that behaves correctly needs these as separate terms, each computed in dollars per trade, not as a blended percentage. Commission. Per share, or per order, or zero. If per share, it needs the minimum and the cap: clamp(rate x shares, minimum, cap x notional). Commission-free brokers make this term zero, which is why they are worth checking before anything else. SEC Section 31 fee. Charged on sale proceeds only, not on buys. A rate per million dollars. FINRA Trading Activity Fee. Charged per share sold, with a maximum per order. Also sells only. Rounding. Regulatory fees are rounded up to the nearest cent. That sounds too small to model until you have a lot of small orders: 38 shares of TAF is well under a cent of true cost and still bills a full cent. Skipping the rounding understates cost on exactly the trades where cost matters most. Note what is missing from that list. Nothing here is a percentage of the trade except one small term, which is why the flat-percentage shortcut breaks.

3. Regulatory fees change with the date

This is the part that surprises people, and it is easy to get wrong in a backtest because the code usually has one constant in it. SEC Section 31, on sale proceeds:
PeriodRate
2024-08-05 to 2025-05-13$27.80 per $1M
2025-05-14 to 2026-04-03$0
2026-04-04 onward$20.60 per $1M
FINRA TAF, per share sold, capped per order:
YearPer shareCap per order
2024-2025$0.000166$8.30
2026$0.000195$9.79
Read the middle row of the first table again. The SEC fee was zero for nearly eleven months. 57.2% of the trades in our sample fell inside that window. So if you backtested over that period with a hardcoded SEC fee, you charged your strategy for something nobody collected. And if you built your model during that window and are still running it, you are now under-charging, because the fee came back in April 2026. A fee model needs the date of the trade, not a constant.

4. Order type changes fees on crypto, not on US stocks

A reasonable assumption imported from crypto: limit orders are cheaper because they add liquidity. On crypto exchanges that is true — maker and taker rates differ and your order type decides which you pay. Your model needs both rates and needs to know which side of the book each fill landed on. On US stocks, for commission-free brokers and the fixed per-share plan, **the commission is the same either way**. Order type changes what you pay the market, not what you pay the broker. The exception is plans that pass exchange fees and rebates through to you, where adding or removing liquidity does change the bill — if you are on one of those, check your own schedule rather than assuming. Getting this backwards in either direction is a real error: modelling maker/taker on US equities invents a discount that does not exist, and ignoring it on crypto understates cost on every taker fill.

5. What this actually changes

Until version 1.2.4, our own app used a single fixed number for US stock fees: roughly **0.13% per round trip, regardless of broker. On a commission-free broker the true figure is about 0.004%**. That is not a rounding difference. Backtests were overstating costs by more than 30x, which means every strategy that failed a cost test in the app may have failed against a bill nobody was sending. We wrote that number ourselves and it was wrong, so this is not a hypothetical failure mode. The direction matters too. Overstating cost kills real edges quietly; understating it ships strategies that lose money live. A wrong fee model does not produce noise, it produces a consistent bias in one direction, and you cannot tell which until you check.

6. Setting it up in the app

In Settings, selecting your exchange now loads that broker's real schedule: per-share commission with order minimums and caps for US stocks, SEC and FINRA TAF on sells, and maker/taker rates for crypto. Every value is editable, and what you save applies identically to backtesting and to paper and live trading — one number, not two that drift apart. If you have results from before 1.2.4 that you were relying on, they used the old fixed rate. Re-run them.

7. What a fee model still does not cover

Fees are the part with a published schedule. They are not the whole cost, and they are usually not the biggest part. The spread is not a fee and it is generally larger. A $5,000 market order in a $5-20 stock pays about 38 basis points one way against the mid — an order of magnitude more than commission-free fees. Depth is not a fee either. Beyond the size resting at the quote you pay worse prices, and no fee schedule describes that. Price improvement and rebates run the other way and we do not model them, which makes our figures slightly pessimistic for brokers that pass them back. Get the fees exactly right anyway. They are the one component you can compute to the cent, and being precise about the knowable part is what lets you see the size of the parts you have to estimate.

Related reading

← All guides

Originally published by TraderWe on August 23, 2026. You may quote and link to this page. Republishing the full text without a link back to the original is not permitted.

3 replies

F
FiveMinFiona· 27d ago
The per-order minimum is the piece I never accounted for. My 5m entries are small and frequent, so the minimum probably binds on almost every fill, meaning my per-trade drag is way higher than the flat number I'd been plugging in. Going to rerun last quarter's backtest with a share-count based cost and see what survives.
G
GapHunterMike· 27d ago
min per order kills small size. knew that from scalping days, nice to see it written down
I
So my strategy was profitable in a spreadsheet that assumed cost behaves like a tax. Cool. Cool cool cool.
Sign in to reply →