Three timeframes, 231 rules, and no edge worth trading
Every TA-Lib indicator variant, applied as a standalone long/flat/short rule to
twenty of the most liquid US equities, on daily, hourly and five-minute bars —
scored against simply buying and holding the same stock, after costs.
The result does not depend on which cost you believe
A rule only matters if it beats holding the stock. Ranking on raw Sharpe would
mostly rank how long-biased each rule is, which in a rising market flatters
anything that stays invested — so every figure here is excess over
buy-and-hold on the same ticker, over the same bars. Zero is parity. Above
zero is an edge.
The chart below tracks the single best rule at each cost level. If technical signal
existed and costs were merely eating it, the lines would start above zero and fall
through it. Instead they start at or below zero and go down — the signal is
not there to be eaten.
Best available edge, by trading cost
The leaderboards, in full
Ranked by average excess Sharpe across the twenty stocks at
per unit of position change. Bars run left from
the zero line, so a longer bar is a worse rule. Beat rate is the share of
the twenty stocks where the rule actually finished ahead of buy-and-hold.
What this means for the machine-learning step
The useful part of a null result is that it narrows the search. These rules failed in
a specific way, and that shape is what the next stage should be built around.
don'tFeed a model these 231 signals and ask it to
pick winners. There is nothing to pick — the best rule at every timeframe and every
cost level is at or below parity, so a selector trained on this space learns noise.
doTreat the indicators as features, not
strategies. A rule that is flat on average can still carry conditional information;
that is a different question than the one tested here, and it is the one worth
asking a model.
doPredict something other than direction.
Volatility, drawdown risk and position sizing are more learnable than sign, and they
are where a model can add value on top of a buy-and-hold core.
watchTurnover is the binding constraint. Any
candidate that trades more than a few dozen times a year has to clear a cost bar that
killed everything on this page — check it before, not after, the modelling.