Receipts & Failures
I shuffled the market into noise. It looked exactly the same — so I shut the bot down.
Three weeks ago I published a crypto trading bot that an agent and I had built together, and I ended that post with a promise:
If it becomes a genuinely passive, around-the-clock engine that trades while I sleep, you’ll see it. If it becomes the most rigorously-documented way I’ve ever lost a grand, you’ll see that too. Either outcome is content. That’s the deal.
This is the either-way. It’s the third thing, which I didn’t have on the list: it became the most rigorously-documented way I’ve ever not lost a grand. I shut it down today, before the thousand real dollars ever went in.
I want to walk through exactly how I got there, because the reasoning is the part that’s worth anything. Anyone can quit a project. What I want to show you is the specific set of tests that turned “I have a bad feeling about this” into “here is the number that ends it,” and one technique in particular that I’m going to use on everything I build from now on.
The thing that broke the thesis
The whole reason I looked at crypto again was that it runs 24/7. My dividend portfolio, oppenfolio, sleeps nights and weekends. A crypto bot doesn’t. More at-bats, faster compounding, same edge. That was the entire argument.
Then I watched the bot sit for days and take zero trades.
It wasn’t broken. It was doing exactly what I’d built it to do — the drawdown brake had engaged, and I had the backtests proving that turning that brake off costs 185 percentage points of return. The sitting-still was correct. But it detonated the premise anyway. A bot that’s idle four days out of five isn’t exploiting a 24/7 market. It’s a stock strategy with worse hours and no dividends.
So I stopped trying to fix the bot and asked the actual question: is there any strategy at all that trades constantly in crypto and clears 1% a month, every month? That’s the bar, because that’s what oppenfolio does without me touching it. Anything less and I’m taking on wild risk to underperform a boring machine I already own.
First: the strategy zoo is smaller than it looks
If you browse freqtrade repos you’ll find what appear to be hundreds of strategies. There aren’t. There are about four ideas — trend-following, mean-reversion, breakout, and grid/scalping — wearing hundreds of different parameter sets. The largest and most famous one is around 8,000 lines expressing one idea (buy dips, many conditions) in many variations.
We’d already measured all four against real Kraken fees. So I went after the one major family we’d never tested: funding carry. It’s structurally always-on — you get paid every hour just for holding a position, no prediction required. Exactly the shape I wanted.
It failed, and it failed in an interesting way. On Kraken, perpetual funding is net negative across the universe — mean −7.6% a year, with only 14 of 50 pairs positive. On most alts, shorts pay longs, which is backwards from the textbook. Every configuration of the classic cash-and-carry trade lost money, between −8% and −24% a year.
So I tried the mirror: long the most-negative-funding contracts, short the most-positive ones. Both legs collect. Dollar-neutral. It printed +110% a year.
Which is when I went looking for the bug, and found it:
FLOW -82.5%/yr funding $0/day volume top LONG pick 54% of the time
AXS -79.8%/yr $42,883/day top LONG pick 60%
THETA +19.3%/yr $8,357/day top SHORT pick 54%
89% of the book sat in contracts under $2M/day
The single largest position in my beautiful market-neutral strategy was a contract with zero dollars of daily volume. The extreme funding rates weren’t an opportunity — they were the illiquidity. A funding rate on a contract nobody trades is a quote, not a fill. Put a realistic liquidity floor on it and the carry collapses from +95% a year to +10%.
The test I’ll use on everything from now on
Here’s the part I actually want you to take away.
I kept looking at charts and seeing obvious money. Everyone does this. You open any pair at any time and there’s a big dip right there and a huge spike right there — 3-8% swings, several a day, on every pair, forever. It doesn’t take a quant to see them. It takes a cat. And if the moves are real, and they’re visible, surely something can be fitted to them?
The moves are real. I measured it: 3.48 swings of 1% or more, per pair, per day. A perfect-hindsight strategy that caught every one of them, net of fees, would make about 4,000% a year. The gold in the river is genuinely there.
So I did this. I took the real price history and shuffled it — kept every single return, the exact volatility, the fat tails, the wick structure, and destroyed only the order they happened in. That turns a real market into a pure random walk with identical statistics. Then I ran the same perfect-hindsight oracle on both.
swing REAL market RANDOM WALK ratio
1% +3,995%/yr +4,096%/yr 0.98x
2% +3,128%/yr +3,263%/yr 0.96x
3% +2,539%/yr +2,694%/yr 0.94x
The noise offers slightly more visible opportunity than the real market.
Every obvious dip you can point to in a real chart, you can point to just as easily in a series that was generated by shuffling. Pure noise at crypto’s volatility looks exactly like that — it has to, because that texture is simply what volatility is. The visibility of a swing carries zero information about whether it can be predicted.
I built an interactive version of this — four candlestick charts, one real, three shuffled. Try to pick the real one before you hit reveal. I can’t, and I’ve been staring at these for weeks.
The near-miss that teaches the real lesson
While measuring this I found something that looked like an actual edge. Buying after a down candle wins 51.5% of the time, and it holds on every single pair I tested. That’s a real, consistent, statistically solid directional bias. Free money?
Win rate 51.5%
Average win +0.654%
Average loss -0.690%
Net expectancy per trade +0.0019%
Required to break even +0.12%
You win slightly more often, and you lose slightly more when you’re wrong. The two cancel to within a rounding error, and what’s left is 2% of what you’d need to cover costs. Hold longer and it gets worse. Run the same test on shuffled prices and you get +0.0001% — statistically the same thing.
That’s the bid-ask spread appearing as a pattern. The cost wall wearing the costume of a signal. And it is the exact shape of every “obviously profitable” strategy I’ve ever seen posted: a genuine statistical bias, annihilated by the fact that being right slightly more often is not the same as being paid.
Where I was wrong
At this point I told myself the case was closed, and I got pushed back on with a good argument: so what if it looks like noise? Noise has structure too. The flat parts of a chart look different from the about-to-move parts. And a cancer-screening algorithm would probably find “tumors” in a noise image too — that doesn’t make it pointless, because it still works on real images and saves lives.
That’s a genuinely strong objection, and it exposed a hole in what I’d tested. Correlation checks only find linear, single-lag structure. A complicated multi-bar nonlinear shape would be invisible to them.
So I ran the radiology protocol properly: trained a real gradient-boosted classifier on 30 shape features, tested it out-of-sample on data it had never seen, and ran the identical pipeline on the shuffled series as a control arm. Two different questions, because they turn out not to be the same question at all:
DIRECTION (which way) VOLATILITY (how much)
real shuffled real shuffled
BTC 0.4937 0.5028 0.7001 0.5180
ETH 0.5062 0.5120 0.6733 0.4813
MEAN 0.5042 0.5053 0.6373 0.5020
That’s AUC — 0.50 is a coin flip.
Direction: 0.504 real, 0.505 shuffled. The model does no better on the real market than on noise.
Volatility: 0.637 real, 0.502 shuffled. Strong, and consistent across every pair.
So the objection was right. The chart does have learnable mathematical structure, and “the flat parts look different from the about-to-move parts” is literally true and measures at 0.64. I just had the wrong label. You can predict how much it will move. You cannot predict which way.
And to kill the last excuse — maybe direction only fails because of fees? I ran the direction model at literally zero cost. No fees, no slippage, no spread. It still loses, at a 50.09% hit rate. For predicting direction from price history, fees were never the binding constraint. Information was.
The last door: market making
There was one family left. Market makers don’t predict direction at all — they quote both sides and earn the spread. It’s the one strategy whose economics improve at better fee tiers instead of degrading. I’d been holding out hope for it for weeks.
I found actual tick-level data — 180,000 Kraken trades with the aggressor side marked — and ran the decomposition that decides it.
Kraken BTC/USD quoted spread median 0.76 bps
Maker round trip, FUTURES 4 bps
Maker round trip, SPOT 50 bps
The spread is one fifth of the fee you’d pay to capture it. A flawless market maker with perfect inventory control and zero adverse selection still loses about 3.2 bps per round trip. That’s a negative constant. No skill moves it.
And then the part that’s worse:
horizon effective adverse sel REALIZED
1s 0.63b 0.64b -0.01b
10s 0.63b 1.31b -0.68b
300s 0.63b 1.56b -0.93b
You earn 0.63 bps the instant you fill. Within one second, the price has already moved 0.64 bps against you. What you actually keep is negative at every horizon. That’s the signature of a book already efficiently made by faster participants: you don’t get filled at random, you get filled precisely when you’re wrong. Even at zero fees, this loses.
What actually survived
Two things, and neither one is reachable from where I’m standing.
Volatility is genuinely predictable. That’s real and I’m not walking it back. But monetizing a magnitude forecast requires an instrument whose payoff doesn’t depend on direction — an option. That’s what my dividend portfolio’s funds are actually doing when they sell covered calls, and it’s why they do best in choppy markets. freqtrade supports spot, margin, and futures. No options. Kraken lists 1,513 spot markets and 274 perpetuals and zero options.
The basis trade works — on venues where funding is persistently positive. My “carry is dead” finding was Kraken-specific and I over-generalized it at first; on other exchanges the same trade has the opposite sign.
Then I checked whether I could actually get to either one, and found the wall behind the wall:
- Options live on Deribit, which holds ~85% of the market. Deribit blocks all US persons.
- The positive-funding venues for the basis trade are also US-restricted.
That’s not a coincidence. Part of why those edges persist there is regulatory arbitrage. The jurisdictions where the yield lives are the ones I’m fenced out of, and the fence is a large part of what keeps the yield there.
So I’m calling it
Not because it’s impossible. I want to be careful here, because “I couldn’t find it” and “it doesn’t exist” are very different claims and only one of them is honest.
People do make money in crypto consistently. Market-making firms do it — and their revenue is the spread I kept getting charged. But look at how they actually do it: they negotiate zero or reduced trading fees as a term of business, they get paid in call options by token projects for providing liquidity, they colocate hardware. Not one of those is a better price forecast. Every one of them is getting paid rent for providing a service, or privileged access.
That’s the real answer to my original question. The 24/7 market doesn’t get exploited by predicting it. It gets exploited by charging rent on it. And I can’t charge rent — I’m the tenant.
What I can say precisely is this: every strategy family reachable from a retail Kraken account is now measured, and they’re all negative. The two that survived require a change of venue, instrument, or fee tier — not a change of strategy. That’s a business decision about jurisdictions and brokers, not a research question, and it’s a much bigger commitment than “keep tuning the bot.”
The receipt
Cost: $0. The bot ran in paper mode from the first day to the last. The thousand real dollars I’d earmarked never moved. The strategy that spent three weeks looking like it was up 5.5% never got the chance to find out what it was actually worth.
I’m counting that as the win, and I want to be specific about why. The version of me from fifteen years ago funds this. He puts in the grand, watches it work for two months, adds more because it’s working, and finds out about adverse selection with real money in the middle of a squeeze. The rigor isn’t academic decoration. The rigor is what the thousand dollars bought instead of tuition.
The server’s been torn down — services stopped and disabled, the hourly data cron switched off. The code stays in the repo. If US access to regulated crypto derivatives opens up for retail, there’s a volatility model sitting in that repo at 0.64 AUC that would suddenly have somewhere to go.
Until then, oppenfolio keeps doing its boring 1% a month, and I’ve got the more valuable thing anyway: I know why this doesn’t work, with numbers, instead of suspecting it forever and quietly wondering if I just wasn’t clever enough.
The artifacts
Last time I shipped the strategy. This time the strategy isn’t the valuable part — the measurements are. All three run against freqtrade’s own data directory, and all three are short enough to read in one sitting:
⬇ oraclelab.py — the shuffle test. Perfect-hindsight oracle on real
price versus the same returns in random order, plus break-even hit rates. This is the one to steal.
⬇ shapelab.py — the radiology protocol. Trains a classifier on shape
features, scores it out-of-sample against a shuffled control, and reports direction and volatility
separately. Swap the target and it’ll tell you whether any signal you care about is real.
⬇ mmlab.py — the market-making decomposition. Splits the spread into what
you keep and what adverse selection takes, from tick data with the aggressor side.
Usual warning, and I mean it: these tell you what didn’t work on my venue with my fees over my sample. Point them at your own data before you believe anything. That’s the entire point of them.