The early crypto quant trading landscape from 2020–2023
Why start a quant trading firm?
By 2021 I had done alpha research for WorldQuant and spent a year managing a portfolio at a crypto fund. Both jobs pointed at the same idea: markets are full of small, repeatable inefficiencies, and a machine can harvest them while you sleep. I wanted to build that machine myself, so I started ROC Trading, a one-person shop trading my own book.
The honest version is that I underestimated how hard it would be. Everyone I asked gave me the same warning. One person with a laptop and a few scripts is not going to out-trade Jump, Jane Street or Wintermute on their home turf. They were right about the home turf. They were wrong that it was the only place to trade.
The early days
My first mental model was a textbook one: build a model, find a pattern, execute, collect. I tried the whole catalogue.
Triangular arbitrage on centralised exchanges, e.g. BTC/USDT → ETH/BTC → ETH/USDT. Taker fees of roughly 0.1% per leg meant a loop had to be mispriced by more than 0.3% before it paid, and anything that large was gone within milliseconds of appearing to firms colocated in the same AWS region as the matching engine.
Funding and basis trades. Perpetual futures pay funding between longs and shorts, usually every eight hours. In bull runs funding sat far above zero, so long spot and short perp earned the carry while staying delta-neutral. It worked, but it was a crowded trade, and the real risk was not price. It was margin: a violent move could liquidate the short leg on one exchange while the spot sat idle on another.
Statistical arbitrage and machine learning. Pairs trades on cointegrated alts, and a few gradient-boosted and LSTM price predictors on order-book features. They looked great in backtests. Live, after fees, slippage and the latency between signal and fill, they did nothing.
Most of it failed, and it failed for the same reason. Trading is a zero-sum game after fees. If enough people are already playing a game better than you, there is nothing left for you to take.
Table selection
The turning point was accepting that picking the table matters as much as playing the hand. Instead of competing on latency against the best-capitalised firms on Binance and Coinbase, I looked for venues they had not yet taken seriously.
In mid-2020 that venue was obvious in hindsight: decentralised exchanges. “DeFi summer” turned automated market makers like Uniswap, SushiSwap and Curve into real liquidity. Liquidity mining programmes were paying people to provide it. BSC, Polygon, Avalanche and Fantom each launched their own DEX ecosystems through 2021, and most of that liquidity sat in passive pools that nobody actively managed.
The big trading firms were cautious here, for good reasons. Smart-contract risk, unfamiliar tooling and small individual opportunities did not fit their model. That caution was my opening. A single trader who could read Solidity and think like a market maker could compete.
Finding an edge
The cleanest opportunity was CEX–DEX arbitrage. It comes from a structural mismatch between the two venues.
A Uniswap v2-style pool holds reserves x of token A and y of token B and enforces x · y = k. Its price is simply y / x, and it only moves when someone trades against it. A centralised order book, by contrast, updates on every tick. Ethereum produced a block roughly every 13 seconds before the Merge, BSC every 3 and Polygon every 2. Every time the centralised price moved, the pool was stale until the next block, and whoever traded it back into line captured the difference.
The 0.3% pool fee creates a no-trade band. If the external price is p and the fee multiplier is γ = 0.997, there is only an opportunity when the pool price sits outside roughly [γ·p, p/γ]. Inside the band, you lose money trading. Outside it, the profit-maximising trade size has a closed form. Buying token A from the pool with Δy of token B, the optimum is:
Δy* = ( √(γ · p · x · y) − y ) / γ
Trading exactly this amount pushes the pool’s marginal price, net of fees, to p. Any more and you are paying the curve for the privilege of moving the price against yourself.
I tested the idea with a rough prototype: subscribe to the order-book websocket, recompute Δy* for a handful of pools on every tick, submit the on-chain leg when expected profit cleared gas, and hedge the inventory change on the centralised side with a taker order. It was crude, but it was profitable after gas and fees. After months of strategies that went nowhere, that was the signal I needed.
Improving and monetising an edge
Once something works, the job changes from discovery to engineering. I rewrote the system for speed and reliability, added more pools and chains, and pushed volume through my centralised venues to move into better fee tiers. Each improvement was small. Together they compounded.
Evolving competition
The edge did not stay private for long. Through 2021 more bots showed up on the same pools and spreads compressed. The competition moved from finding the trade to getting included in the block first.
On Ethereum that first meant priority gas auctions. Bots watching the public mempool would see a competing arb and resubmit the same transaction with the same nonce and a higher fee. Geth only accepts a replacement if it bumps the price by at least 10%, so auctions escalated in 10% steps until someone’s profit ran out. Losing bots still paid gas on reverted transactions, which made the game expensive to play badly.
Flashbots changed the rules in 2021. Searchers could send a bundle privately to miners with a direct payment to block.coinbase instead of a high gas price, and a bundle that would revert was simply not included. Failed attempts became free, bidding moved off the public mempool, and the winning margin went increasingly to the block producer. After EIP-1559 went live in August 2021, every transaction carried a burned base fee plus a priority tip, which made cost estimation cleaner but did nothing to soften the competition.
On the faster, cheaper chains the fight was about latency instead: running your own nodes, peering close to validators, and spamming several transactions per opportunity when gas was cheap enough to make that rational.
Gas optimisation
On-chain, execution cost is part of your edge. Every unit of gas saved narrows the smallest discrepancy you can profitably close, which means more opportunities that competitors cannot touch. After the Berlin upgrade in April 2021 the numbers that mattered were:
base transaction 21,000 gas
cold SLOAD 2,100 gas (warm: 100)
SSTORE, zero → non-zero 20,000 gas
SSTORE, non-zero → non-zero 2,900 gas (+2,100 if cold)
calldata 16 gas / non-zero byte, 4 / zero byte
So the contract work was mostly about touching as little storage as possible:
Skipping the router. The Uniswap router is convenient but does extra work. Transferring tokens straight to the pair and calling swap() on it directly, with the output amount computed off-chain, saves a meaningful chunk of gas per hop.
Packing storage. The EVM stores data in 32-byte slots. Variables declared next to each other that fit in one slot share it, so a single SLOAD reads all of them:
// three slots: three cold SLOADs on every call
address owner; // 20 bytes
uint256 minProfit; // 32 bytes
uint256 lastBlock; // 32 bytes
// one slot: one SLOAD
address owner; // 20 bytes
uint64 minProfit; // 8 bytes
uint32 lastBlock; // 4 bytes
Compact calldata. Since zero bytes cost a quarter of non-zero ones, I encoded pool addresses, directions and amounts into tightly packed bytes and parsed them in a fallback function rather than using ABI-encoded arguments. Keeping balances of every traded token above zero in the contract also meant transfers updated existing storage instead of paying the 20,000 gas to create it.
None of this is glamorous. It was the difference between winning and losing a lot of marginal trades.
Capital efficiency
Arbitrage needs inventory on both sides, spread across chains and venues, and it is always in the wrong place when volatility hits. Bridging inventory around was slow and, in those years, genuinely risky; several major bridges were exploited in 2022 alone.
The better answer was to use DeFi itself. Lending protocols like Aave let a contract post collateral and borrow the asset it needs in the same transaction as the trade, which works like on-chain spot margin. Flash loans went further: borrow, trade and repay inside a single transaction for a 0.09% fee on Aave v2, with no inventory at all. That kept the strategy running through exactly the volatile periods when it earned the most.
2022: the table resets
2022 ended the easy era. Terra collapsed in May, and a chain of lenders and funds that had borrowed against each other failed in the months after. In November FTX went down. The trading lesson was not about strategy at all. It was about counterparty risk. Balances on an exchange, loans to a desk and collateral in a protocol are only as good as whoever holds them.
The market structure changed as well. Uniswap v3’s concentrated liquidity, live since May 2021, meant pools had far more depth near the current price, so each mispricing was smaller and tick crossings made trades more expensive to compute and execute. The Merge in September 2022 fixed Ethereum’s block time at 12 seconds and moved block building to a proposer-builder market, where searchers competed on bids to specialised builders.
The traders who came through were the ones that sized their exposure to every venue as if it could disappear, moved to self-custody wherever they could, and treated operational risk as part of the strategy rather than an afterthought.
2023: the game moves on-chain, and the flow goes private
2023 was quieter in price and busier in structure. Three shifts stood out.
Order flow went private. Intent-based designs like CoW Swap and UniswapX, announced in July 2023, let users sign an order and have competing solvers fill it, rather than sending a swap to a public pool. MEV-Share and private RPCs let wallets auction their own transactions to searchers and take a rebate. The naive flow that CEX–DEX arbitrage fed on was increasingly being routed around the public mempool entirely.
L2s turned into latency races. Arbitrum and Optimism order transactions through a single sequencer on a first-come, first-served basis, with no gas auction. The edge moved back to where it started on centralised exchanges: network proximity to the sequencer and how fast your code reacts. Fees were low enough that sending several attempts per opportunity was rational.
On-chain perps got real. After FTX, traders wanted derivatives venues where they held their own keys. Hyperliquid launched its own chain with a fully on-chain central limit order book, and dYdX moved to its own Cosmos app-chain in October 2023. For the first time a trader could run proper order-book strategies such as quoting, basis and funding capture with self-custody and a public, verifiable ledger. That is where I spent most of my time from then on, and it is how ROC Trading ended up in the top 20 of the Hyperliquid leaderboard in 2024.
Reflection and the life cycle of alpha
Looking back, three things mattered more than any single model.
First, table selection is as important as execution. I did not beat the best firms at their own game. I found a game they were not yet playing.
Second, no single optimisation was a breakthrough. What made the difference was trading live and fast. Every day of real fills taught me more than a month of backtests, and the feedback loop compounded.
Third, every edge decays. CEX–DEX arbitrage today is a crowded, low-margin business run by specialists who pay most of their profit to block builders. That is fine. A stable, well-understood strategy pays for the research that finds the next one, and knowing when an edge is dying is as valuable as finding it in the first place.
Pick the table first. Then get very, very good at the hand.