The cointegration basket with zero trades (and why I'm not touching it)
One of our six strategies has executed 0 trades in 71 days. Here's what that actually means — and why it's the most honest result in the whole track record.
By Li Tan
Cointegration Basket. 71 days. Zero trades. 0.0% return. 0.00 Sharpe.
When I showed this to a friend last week, his reaction was: 'That's embarrassing. Why is it even on the page?'
It's the most interesting result on the page.
What 'zero trades' actually means
The Cointegration Basket strategy uses the Johansen test to find stationary linear combinations of 5 currency pairs (EUR/USD, GBP/USD, USD/JPY, AUD/USD, EUR/JPY). When it finds one, it tracks the spread. When the spread deviates from its mean by more than 2 standard deviations, it opens a position betting on reversion.
Zero trades in 71 days means one of two things: either the Johansen test never found a cointegrating vector stable enough to trade, or the vector was found but the spread never deviated enough to trigger entry. Let me check.
I just ran it locally with verbose logging. The Johansen test IS finding a vector — but the trace statistic is marginal and the resulting spread has a standard deviation so small that 'extreme' moves (|Z| > 2) never materialize in the live window. The spread is behaving like a random walk within a narrow band.
Why this is honest, not broken
A naive response is to 'fix' this by lowering the entry threshold from |Z| > 2 to |Z| > 1. Do that and the strategy will generate trades. They will be low-conviction trades on marginally cointegrated baskets, and they will lose money to noise and transaction costs over any meaningful sample.
The strategy, as written, is doing exactly what it should: when conditions don't meet its criteria, it waits. A strategy that refuses to trade when the signal isn't there is a feature. Most retail quant failures come from the opposite — a trader, frustrated by sideways markets, lowers their bar, takes marginal signals, and watches their P&L bleed out.
The comparison I keep making
A machine that only fires when it's highly confident and sits idle the rest of the time is not a broken machine. It's a disciplined one. The zero in the Trades column is a statement: 'nothing here met the bar I was designed to watch for.' That's more valuable than 7 forced trades would be.
Compare this to what happens in black-box signal services: they ALWAYS have a signal to send you. Every day. Multiple times a day. Because a service with no signals on a given day looks broken, and broken doesn't sell subscriptions. So they generate noise and call it alpha. Look at the difference: we are openly showing you a strategy with zero trades and arguing it's doing its job.
If Cointegration Basket fires its first trade in June, I'll be interested. Until then, I'm going to leave it exactly where it is. Zero is a number.
Like this kind of analysis? Upgrade to Learner for weekly articles, real-time signals, and full educational content.
See Learner plan