Do Funding Rate and Open Interest Filters Improve a Crypto Bot?
Exchange data is sold as the missing ingredient for crypto bots. Funding rate, open interest, the long/short account ratio, the perp premium: add one as an entry filter, the pitch goes, and your signal starts skipping the bad trades.
We tested that claim properly and the answer was mostly no. Out of 60 filter-and-dataset combinations, one cleared the bar that separates a real effect from the best of sixty coin flips. This guide shows the test, the numbers, and the reason the result is so one-sided.
What we tested
Five trade lists, all on 15 USDT perpetual contracts on Bybit:
| Dataset | What it is | Trades | Baseline mean R per trade | |---|---|---|---| | 15m | a 20-indicator voting scalp signal | 113,013 | -0.188R | | 30m | the same signal on 30-minute bars | 62,585 | -0.151R | | 4h (all) | a 4-hour mean-reversion bot's full ledger | 6,159 | -0.111R | | 4h (subset) | the part that bot actually trades | 424 | +0.101R | | 1D | a Donchian-20 daily breakout, 2 ATR stop | 886 | +0.205R |
R is the result of a trade measured in units of its own risk: risk 1% of the account, make 2%, that is +2R. Every R above is after costs — taker fee 0.055% per side, slippage measured by walking a real order book for the trade size, and average funding multiplied by holding time.
Twelve filters, each with fixed rules taken from tools that already existed, nothing tuned for this test:
- Price and trend: BTC daily regime against its 200-day EMA, multi-timeframe EMA agreement on 4h, the Ichimoku cloud, Supertrend, ADX between 20 and 35, position in the 20-day Donchian range, Choppiness below 55.
- Exchange data: funding not crowded on our side of the trade, open interest rising with price over 24 hours, no open-interest spike above 8% in 4 hours, the long/short account ratio contrarian against its 30-day median, the perp premium contrarian against its 7-day mean.
How we avoided fooling ourselves
Three decisions did most of the work.
Every data point carries the moment it became knowable. Funding is stamped at its settlement time, open interest and the long/short ratio at the end of their hour, candle-derived values at candle close. A trade may only read rows that were available strictly before its entry. We re-checked a random sample of 48 trades against the live exchange API and they matched. Without this rule, a filter that quietly reads the current hour's open interest will look brilliant and be worthless.
The split is by time, not at random. The oldest 60% of entries are the training period, the newest 40% the test period. A filter counts as helping only if the trades it agrees with beat the baseline in both periods, with at least 30 agreeing trades in each. Random splits leak: a trade from June sitting in training while its neighbour from the same June afternoon sits in test is not an out-of-sample test of anything.
We counted our own attempts. Twelve filters across five datasets is 60 trials. If all 60 were pure noise, the largest t-statistic you would expect to see by chance is roughly the square root of twice the natural log of 60, about 2.86. That is the bar. A filter scoring t = 2.0 in a 60-trial study has not found anything; it is simply the luckiest of sixty.
Because trades opened on the same day share the same market, we also computed a daily-clustered statistic: the average of each day's agree-minus-disagree difference, rather than treating every trade as independent. This matters more than most people expect. A filter that tags 400 trades across 30 days has roughly 30 independent observations, not 400.
What came back
One combination cleared 2.86. Multi-timeframe EMA agreement on the 4-hour bot: both the fast pair and the slow pair pointing the same way as the trade. It helped in training, it helped in test, and it cleared the noise bar. Everything else either failed one period, or beat the baseline by less than the study's own luck threshold.
The funding and open-interest guardrails almost never disagree. Across all ten cells where they applied, they agreed with 84% to 100% of trades, and in six of those ten they were effectively constant — they say "fine, go ahead" nearly every time. That is a useful property for a risk check, which should only ever stop you in a genuinely extreme state. It is a useless property for a signal, because a filter that never says no cannot improve anything.
The long/short ratio changed its mind by dataset. It helped on 15m, on 30m and on the 4-hour ledger, overfit on the 4-hour subset, and did nothing on the daily. A filter whose direction depends on which dataset you show it is describing the dataset, not the market.
The reason, which is simpler than the statistics
Look at the fee arithmetic on the 15-minute signal. Fees alone are 0.055% twice, so 0.11% per round trip, before slippage and before funding. The minimum stop is 0.6%. So 0.11 divided by 0.6 is about 0.18R of pure cost per trade — almost exactly the size of that signal's loss per trade of -0.188R.
The 15-minute signal does not have a filtering problem. It has a cost problem. No entry filter can rescue an edge smaller than the cost of taking it; the best a filter can do is make you lose more slowly by trading less.
On the daily breakout, with a stop measured in multiples of ATR, the same 0.11% is a rounding error. This is why the same filter can look useless on one timeframe and plausible on another: the thing that changed was the denominator.
What this means for your own bot
- Check costs before you check filters. Divide your round-trip cost by your typical stop distance. If the answer is a meaningful fraction of your expected edge per trade, no filter will save the strategy.
- Count every variant you tried, including the ones you abandoned, and raise your evidence bar accordingly. The honest number is almost always larger than the one you remember.
- Treat exchange data as a guardrail, not as alpha. Funding and open-interest extremes are good reasons to stand aside. They are poor reasons to enter.
- Check how often your filter disagrees. If it agrees with 95% of your trades, it cannot be doing much, however good its numbers look.
What we are not claiming
The 60-trial count covers this study alone. These five datasets came from strategies that were themselves selected after earlier experiments, so the true number of attempts behind them is larger and every figure here is, if anything, flattering. The 15m and 30m lists are backtests of our own scalp signal rather than live bots. The order-book slippage uses a recent snapshot, which understates the cost of trading in thinner past markets. And the split is a single cut in time, not a walk-forward.
The one surviving result is a reason to keep testing multi-timeframe trend agreement on new trades. It is not a reason to trade it.
Run the numbers yourself
The statistics behind all of this — the probabilistic and deflated Sharpe ratios, the minimum track record length, the six readiness gates, the cost model and the look-ahead audit — are MIT-licensed Python at github.com/botlabtrade/botlab-oss. Point it at your own trade list and you can reproduce the method on your own data. There is also a browser version that needs no install.
More guides
- Deflated Sharpe Ratio Explained: Why Your Backtest Looks Better Than It Is
- Is a Trading Bot Profitable? How to Test One Honestly
- Profit Factor vs Win Rate for Trading Bots
- How Many Trades Does a Backtest Need? A Practical Guide
Check your bot free