Skip to content

How to Test Whether a Significant Signal Survives Costs

Original question

How do I know whether a statistically significant trading signal is actually useful after accounting for transaction costs?
Convert the signal into timestamped positions and measure out-of-sample net P&L after realistic execution, financing, and borrowing costs. Compare the net return with a benchmark, quantify uncertainty and sensitivity to worse fills, and record how many signals and variants you tried. A p-value on a forecast coefficient answers a different question from whether a strategy is implementable.

Translate forecast performance into implementable P&L

Let wtw_t be the exposure held over the next return interval rt+1r_{t+1}, and use ∣wt−wt−1∣|w_t-w_{t-1}| as a simple target-position turnover measure. For a proportional per-unit turnover cost ctc_t and additional cost btb_t,
rt+1net=wtrt+1−ct∣wt−wt−1∣−bt.r^{\mathrm{net}}_{t+1}=w_t r_{t+1}-c_t|w_t-w_{t-1}|-b_t.
A real implementation should derive turnover from trades after accounting for drift in holdings and cash. Separate one-way spread and commission, impact that changes with order size, and financing or borrow that accumulates with holding time. Model fills at prices available after the signal is computed, ideally with liquidity or execution records. In a simple fixed-cost model with positive average turnover, the break-even one-way cost is (rˉgross−bˉ)/∣Δw∣‾(\bar r^{\mathrm{gross}}-\bar b)/\overline{|\Delta w|}.
Evaluate a frozen rule on dates after selection. For mean net return, use uncertainty estimates that account for serial dependence, such as HAC standard errors or a suitable block bootstrap. If many rules compete for selection, track all trials and assess multiple testing as part of the research process.
A daily rule averages 4 basis points gross and changes 60% of its reference capital each day. At 5 basis points per dollar traded, proportional cost averages 3 basis points. Borrow and funding cost another 0.5 basis points, leaving 0.5 basis points net. The break-even proportional cost is (4−0.5)/0.60=5.83(4-0.5)/0.60=5.83 basis points. At 7 basis points per dollar traded, the same strategy averages 4−4.2−0.5=−0.74-4.2-0.5=-0.7 basis points. A confidence interval for the net average that crosses zero would further weaken evidence of a durable edge.

The break-even price for a trade is more useful when paired with a view of when you trade. A strategy may turn over most aggressively on the days with wide spreads and poor depth. Using average turnover times an unconditional average cost misses that dependence. Apply the cost to each dated trade and compare net performance with a benchmark over the same dates. If a few profitable days require sizes you could not execute, a statistically convincing signal can still have little implementable value.

Charge costs at each position change

Use an ordered pandas Series close_signal of target weights known at each close and open_price of executable opens, on the same date index. This toy example enters at the next open and measures the subsequent open-to-open return. An execution study would replace opens with modelled fills and add financing and borrow.
import pandas as pd import statsmodels.api as sm w = close_signal.shift(1).fillna(0.0) next_open_return = open_price.shift(-1) / open_price - 1 turnover = w.diff().fillna(w.abs()).abs() net = pd.concat([w * next_open_return, turnover], axis=1).dropna() net_return = net.iloc[:, 0] - 0.0005 * net.iloc[:, 1] model = sm.OLS(net_return, pd.Series(1.0, index=net_return.index)) fit = model.fit(cov_type="HAC", cov_kwds={"maxlags": 5}) print("Net mean and interval:", fit.params.iloc[0], fit.conf_int().iloc[0].tolist())
The order book tool shows how one market order can pay progressively worse prices as it consumes available depth.

Interactive example

Find the execution cost that consumes a trading edge

A synthetic strategy earns 12 basis points per period before costs. Costs apply to the absolute change in position on each traded side.

Net edge 5.00 bps per period · break-even cost 17.14 bps per unit
Expected net return declines as execution cost rises-10010010203040Cost (bps per unit of turnover)Net edge (bps)
  • Net edge
  • Break-even