Designing a Signal With Costs In From the Start
A signal researched on frictionless returns and only later checked against costs is a signal designed to fail that check. Building costs into the objective from day one changes which version of the signal you end up with.
Prerequisites: From Raw Data Field to Tradeable Signal
The standard order of operations — build a signal, back-test it gross, check the Sharpe, then subtract trading costs and see what survives — sounds sensible and produces bad signals. It optimises for something you were never going to trade (gross return) and treats costs as an afterthought applied to a design that was never shaped with them in mind. A signal built with costs in the objective from the start ends up structurally different, and structurally more tradeable, than the same idea run gross-first.
Why the order matters
Gross-first optimisation rewards whichever version of a signal has the highest raw return, with no penalty for how often it flips positions. Two versions of the same underlying idea — a fast one that reacts to every daily wiggle and a smoothed one that reacts only to persistent moves — can have near-identical gross Sharpe ratios while differing enormously in turnover. Gross-first research cannot tell them apart; it will happily pick the fast, high-turnover version if it back-tests a hair better, because nothing in the objective punishes trading.
Net-of-cost design puts the trade-off explicitly in front of every choice: signal lag, decay, smoothing, threshold for rebalancing. Each of those choices changes turnover, and turnover has a cost, so the design question becomes "does this refinement earn more than it costs to trade," not "does this refinement earn more."
In words: net return is gross alpha minus a cost coefficient (roughly, cents per dollar traded, including spread and impact) multiplied by turnover — how much of the book gets bought and sold per period. A signal is only worth more if it raises by more than it raises the term.
The question is never "is this signal good." It's "is this signal good after paying to trade it." A refinement that adds 20% to gross Sharpe but doubles turnover can easily be worse, net, than leaving the signal alone.
Two concrete design levers
Smoothing (an EWMA instead of the raw daily value). Averaging a noisy raw signal over several days removes some of the day-to-day flicker that would otherwise force a trade and a re-trade for no persistent reason. This typically costs a small amount of gross alpha — you react a little later to genuine moves — in exchange for a large cut in turnover.
No-trade bands. Rather than rebalancing every name to its exact target weight every period, only trade a name if its current weight has drifted outside a band around the target. This captures almost all of the gross alpha (small deviations from target barely matter to the return) while sharply reducing the number of trades, because most periods no rebalancing trigger is hit at all.
A worked example
A raw daily signal, traded to exact target weights every day, backtests at 14% gross return, 380% annual turnover, and a modelled cost of 35 bps per unit of turnover — net return of roughly 14% − 3.8 × 0.35% ≈ 12.7%. Wait through the arithmetic properly: 380% turnover at 35 bps costs 380% × 0.0035 ≈ 1.33% a year, so net is about 12.7%.
Now apply a 5-day EWMA smoothing and a 15% no-trade band. Gross return drops slightly to 12.5% (some responsiveness lost), but turnover drops to 90% a year. Cost: 90% × 0.35% ≈ 0.32%. Net return: roughly 12.2%.
| Version | Gross return | Turnover | Cost | Net return |
|---|---|---|---|---|
| Raw, daily rebalance | 14.0% | 380%/yr | 1.33% | 12.7% |
| Smoothed + no-trade band | 12.5% | 90%/yr | 0.32% | 12.2% |
The raw version still wins net in this example — but the margin (12.7% vs 12.2%) is far smaller than the gross comparison (14.0% vs 12.5%) suggested, and a slightly higher assumed cost coefficient (say, 60 bps, realistic for a less liquid universe) flips the ranking entirely. Designing with costs in the loop from the start is what lets you see that the answer depends on the cost assumption, instead of discovering it only after the strategy is live and the wrong version was chosen.
Applying a single blended cost estimate to every name understates the effect for illiquid names and overstates it for liquid ones. A cost-aware design needs cost estimated per name (or per liquidity bucket), because the turnover reduction that matters most is concentrated in the names that are expensive to trade, not the ones that are cheap.
Related concepts
Practice in interviews
Further reading
- Grinold & Kahn, Active Portfolio Management (ch. 16)
- Garleanu & Pedersen (2013), Dynamic Trading with Predictable Returns and Transaction Costs