- TWO VARIANTS, TWO CAUSES OF DEATH. Scalping = many micro-trades, seconds-to-minutes holding time, each only a few basis points. It splits cleanly into (a) TAKER scalping: you TAKE liquidity (market order) and pay the taker fee - dies at the fee floor; (b) MAKER market-making: you PROVIDE liquidity (limit quotes) and earn the spread + possibly a rebate - dies at adverse selection. Both measured separately.
- TAKER FLOOR (already established, `liquidation_mr_scout`): HL taker ~3.5bps/fill -> ~7bps round-trip. A liquidation mean-reversion scalp across 5,300 cascades / 7 years had a 56% hit rate, gross ~0, but net -7 to -10bps, profitable in 0/7 years. The fee eats exactly the micro-edge that made the signal interesting. This is the death of every retail taker-scalper.
- MAKER FLOOR (newly measured, `spread_capture_scout.py`, BTC/ETH/SOL 1m, 6+ years): symmetric quotes around the open, fills from high/low, each leg marked to close (= adverse selection modeled honestly). At the HL base maker fee (+1bp): deeply negative everywhere, positive in 0/7 years across ALL three assets. At the breakeven tier (0bp): 1-2/7 years. Only with a rebate (-0.5bp) AND the widest quote (delta=21bps, where you only fill 6-22% of bars) does net/bar barely cross zero (+0.008 BTC, +0.002 ETH, SOL stays negative) - and unstably (3-4/7 years).
- THE MECHANISM (two-bucket decomposition). When BOTH quotes are filled ('both fill'), you pocket a clean spread: +2 to +43bps - looks dreamy. But when only ONE side fills ('one-sided', trending bar), you hold inventory that moved against you: -1.3 to -10.4bps. And the one-sided bucket is 3-10x MORE FREQUENT -> it dominates the average. That is adverse selection: your quotes get filled preferentially exactly when the market runs against you.
- THE PRETTIEST FINDING (refutes the naive hope). SOL - the most illiquid, most volatile of the three - is NOT the best MM choice but the WORST (-0.46bps/bar at base fee vs. -0.09 BTC). The wider natural spread of an illiquid alt is eaten EXACTLY by worse adverse selection. Volatility gives you more spread and takes it away in the same breath. 'Illiquid alt = more spread to capture' is therefore measured to be false.
- THE MODEL IS AN UPPER BOUND. Queue position (are we really best-quote or standing at the back of the line?), inventory carry beyond bars, and latency are deliberately abstracted away. In reality maker-MM would be EVEN worse than the already-negative numbers. The only lever that flips the sign at all is a guaranteed maker rebate - and even that is only marginally enough.
- VERDICT: GRAVEYARD. Neither variant is for us: taker at the fee floor, maker at the adverse-selection floor, and the only positive region (rebate + ultra-wide quote) is marginal, unstable, and would require an entirely new machinery chapter (real-time order book, constant re-quoting, inventory management). The structurally clean 'scalping cousin' we already run live is the delta-neutral [[funding_carry_botty]]: directionless, earning from a structural payment instead of micro-forecasts.
What scalping actually is
Scalping = not one big correct forecast, but hundreds of tiny trades, each holding seconds to a few minutes, each capturing only a few basis points. The hope: the statistical edge of many micro-decisions adds up.
The edges scalpers draw from are almost always microstructural - not 'where is BTC going' but order-book mechanics: collecting the spread, reading order flow, fading short momentum bursts or overreactions.
Crucially: scalping splits into two variants with two completely different causes of death. We measured both.
SCALPING
|
+-------------------+-------------------+
| |
(a) TAKER scalping (b) MAKER market-making
you TAKE liquidity you PROVIDE liquidity
(market order) (limit quotes)
pay taker fee (~3.5bps) pay maker fee (~1bp) / rebate
| |
dies at the FEE FLOOR dies at the ADVERSE-SELECTION FLOOR
(measured: liquidation_mr_scout) (measured: spread_capture_scout)
Variant (a): taker scalping - death at the fee floor
You see a micro-signal and fire a market order. You take liquidity and pay the taker fee for it: on Hyperliquid ~3.5bps per fill, i.e. ~7bps round-trip (in + out). A scalp trade would have to earn net more than 7bps - on a move that often has only 5-15bps gross.
We already measured this (liquidation_mr_scout - a genuine taker-scalping strategy: fading liquidation cascades, capturing the rebound):
| Metric | Value |
|---|---|
| Events | 5,300 cascades over 7 years |
| Hit rate | 56 % - looks winnable! |
| gross | ~0 bps |
| net (after ~7bps RT) | -7 to -10 bps |
| Profitable years | 0 / 7 |
The classic scalping trap: the hit rate looks like edge, but the fee eats exactly the micro-advantage that made the signal interesting in the first place. Taker scalping is dead for us before it begins.
Variant (b): maker market-making - the only conceivable way out
The one lever that theoretically flips the math: becoming a maker instead of a taker. Instead of taking liquidity, you provide it. You simultaneously post a buy order below and a sell order above the current price and wait for others to trade against you. Then you don't pay 3.5bps taker - you pay the far smaller maker fee (HL base ~1bp), and in high volume tiers you even get a rebate (negative fee).
How it should work
Price
^
ask ---+ <-- LIMIT SELL (Mid + delta) "I sell delta above market"
|
Mid ---+ <- current price (open of the bar)
|
bid ---+ <-- LIMIT BUY (Mid - delta) "I buy delta below market"
v
delta = half the quoted spread per side (in bps)
Idea: BOTH get filled -> you bought cheap AND sold expensive
-> you pocket the full spread 2*delta, minus 2x maker fee.
If the price drifts calmly around the mid, exactly that happens - a clean spread gain:
GOOD - calm bar, price oscillates ("both fill")
ask +====O <- sold @ ask
Mid + / \ / bid +=O \ / -> close ~ Mid
^ bought @ bid
Result: +2*delta - 2*fee OK (you were the calm hand in the market)
Why it dies anyway: adverse selection
The problem: your quotes get filled preferentially exactly when the market runs against you. If the price breaks in one direction, only one of your two orders gets hit - and the price keeps running, leaving you sitting on a losing position:
BAD - trending bar, price breaks out ("one-sided")
ask +====O <- sold @ ask ...
Mid + \
bid + \____ -> close FAR below ask
(bid was never hit - no counter-trade)
Result: you are SHORT @ ask, price fell further -> loss
(reversed on an upward breakout: only bid filled, long into the fall)
That is adverse selection: the calm market in which you pocket the spread cleanly is also the one where there is least to capture; the moving market with lots of spread on the table is exactly the one that runs you over. Whoever provides liquidity sells an option to the market - and it gets exercised against them when they can least defend themselves.
Measured: spread_capture_scout.py
Data-gate trick (as with the liquidation scout - no order book / tick feed needed): we quote each 1m bar symmetrically around the open (causal, known at bar start) and read the fills from high/low: bid fills if low <= bid; ask fills if high >= ask. Each filled leg is marked to close (against the bar's close) - that models adverse selection honestly, because a one-sidedly filled leg in a trending bar automatically lands in the red.
Tested: BTC / ETH / SOL, 6+ years of 1m data each, quote distances delta in {1,2,3,5,8,13,21} bps, in three maker-fee worlds.
Result (best delta per scenario, net/bar in bps)
| Maker fee | BTC | ETH | SOL | Positive years |
|---|---|---|---|---|
| +1.0 bp (HL base) | -0.085 | -0.165 | -0.459 | 0 / 7 everywhere |
| 0 bp (breakeven tier) | -0.023 | -0.054 | -0.112 | 1-2 / 7 |
| -0.5 bp (rebate) | +0.008 | +0.002 | -0.011 | 3-4 / 7 (unstable) |
The positive region exists only with a guaranteed rebate, only at the widest quote (delta=21bps, where you fill a mere 6-22 % of bars at all), and at ~+0.008 bps/bar it is marginal as well as not stable across years.
Where the money is lost - the two-bucket decomposition (BTC, base fee)
delta(bps) both-fill% both-gain one-sided% one-sided-loss -> net/bar
1 40.3 % ~ 0 bps 53.4 % -5.08 bps -2.71
3 15.6 % + 4 bps 58.4 % -4.20 bps -1.83
8 2.6 % +14 bps 30.9 % -3.31 bps -0.65
21 0.2 % +40 bps 5.8 % -2.78 bps -0.09
You can see the conflict directly: the clean both-bucket pays excellently (+4 to +40bps), but it is rare (0.2-16 %). The one-sided bucket (adverse selection) is consistently negative (-2.8 to -5.1bps) and 3-10x more frequent -> it dominates the average. Quoting wider (large delta) reduces the adverse-selection frequency, but then you almost never fill -> the edge goes toward zero instead of into the black.
The twist: illiquid alts are WORSE, not better
The naive hope reads: 'BTC is too efficient, the spread too tight - take an illiquid alt, there's more spread on the table.' Measured false. SOL (most illiquid, most volatile of the three) is the worst choice at -0.459 bps/bar, BTC the least bad at -0.085. The wider natural spread is compensated exactly by worse adverse selection - volatility gives you more spread and runs you over more often. The two forces don't just cancel, volatility wins.
Why this is a graveyard entry (and not a to-do)
It closes the loop cleanly and symmetrically:
- Taker scalping dies at the fee floor (~7bps RT, fixed).
- Maker market-making dies at the adverse-selection floor (structural, not parametrizable away).
A positive edge arises only with a guaranteed rebate + ultra-wide quote + accepting instability - for an amount near zero. For that we would need an entirely new machinery chapter: real-time order-book feed, limit orders with constant re-quoting, inventory-risk management, low latency, queue position. That is a market-making bot, not a signal bot - huge infrastructure effort for a marginal, unstable, rebate-dependent edge. And our model is still an upper bound (queue/carry/latency abstracted away) -> worse in reality.
The silver lining: we've already satisfied the scalping appeal
The structurally clean 'scalping cousin' is the delta-neutral Funding carry at Botty — the first structural edge, and what really defines it live - the slow, safe relative:
| Maker scalping | Funding carry | |
|---|---|---|
| directionless? | ideally, in reality no (adverse selection) | yes, truly delta-neutral |
| earns from | micro-spread (eaten by AS) | structural funding payment |
| frequency | hundreds of trades/day, latency-critical | settled hourly, set-and-forget |
| infra | real-time order-book MM bot | existing signal bot |
| status for us | graveyard | live & healthy on Wallet 3 |
Both are 'earn from market structure instead of forecast' - but the carry pockets a payment the market owes, instead of selling an option that gets exercised against it. That is exactly why one survives our gates and the other does not.
What this teaches in general
Every 'many tiny trades' idea has to clear two floors before it is worth infrastructure: the fee floor (do I pay more fee than the edge is big?) and the adverse-selection floor (do I get filled exactly when it hurts?). Scalping almost always fails at one or the other. Whoever builds it anyway confuses a high hit rate with an edge.