I spent eleven months building an optimal-stopping pairs strategy on crypto. The math worked, the pipeline worked, and the edge turned out to live exactly where it cannot be harvested. On failure, fees, and what survived.
In August 2025 I started where every self-taught quant starts: notebooks. First simulated mean-reverting processes, then rolling cointegration tests on real crypto pairs, then a spread z-score with thresholds I picked by eyeball (enter above 3, exit back under 1, and I could not have defended either number). Every choice felt arbitrary because it was.
The difference was that I already knew roughly where a better answer lived: I'd been circling Tim Leung's work on mean-reversion trading almost from the start. The paper that ended up taking over the project was Leung & Li's Optimal Mean Reversion Trading with Transaction Costs and Stop-Loss Exit (arXiv:1411.5062). If your spread follows an Ornstein–Uhlenbeck process,
dXt=μ(θ−Xt)dt+σdWt,
then the right moment to enter and the right moment to exit aren't judgment calls. They're the solution to an optimal double-stopping problem, and the solution is exact. There is one optimal entry level d∗ and one optimal exit level b∗, and they fall out of two functions F and G that solve the process's differential equation. After the eyeballed thresholds, closed-form optimality felt like being handed a superpower.
I decided to build it properly. Not notebook-properly. Properly.
The paper gives you F and G as integrals (here r is the discount rate):
Everything optimal comes out as roots of these two functions. The optimal exit level b∗ is the unique root of the smooth-pasting condition
F(b)=(b−c)F′(b),
with c the transaction cost. The value of holding a position is then
V(x)=(b∗−c)F(b
and the optimal entry level d∗ is the unique root of
G(d)(V′(d)−1)=G
That is the paper's entire prescription: two integrals, two root-finding problems, exact. What it isn't is computable at scale. You can quadrature those integrals once. You cannot quadrature them ten million times, which is roughly what screening 4,950 pairs over a year of one-minute bars requires. So the first real work was reformulation. That integral is a parabolic cylinder function in disguise, a closed form that's classical in the OU literature (it's in Borodin & Salminen's Handbook of Brownian Motion; I claim zero credit for it):
F(x)=Γ(a)eβ2/4
which SciPy will evaluate for you. Except it won't, not on real data. That eβ2/4 factor overflows double precision once ∣β∣≳5353 is where exp(beta^2/4) passes the largest double. The underflow edge sits closer in, at -41, because the cylinder function is itself decaying there, so the product hits the smallest normal double before the exponential hits the largest. Hence the asymmetric wall in the figure below., and on microcap spreads β at the optimal levels routinely reaches the hundreds.
The way out is one of those tricks that looks obvious only after you've found it: the optimal-stopping conditions never need F itself, only ratios like F′/F, and in a ratio the overflow factor cancels exactly. One recurrence identity later, the whole thing collapses to a single special-function call:
ratio_trick.py
def F_prime_over_F(x, mu, sigma, theta, r): """Leung-Li F'/F without the exp(beta^2/4) overflow.""" a = r / mu kappa = np.sqrt(2 * mu) / sigma beta = kappa * (x - theta) D, D_prime = pbdv(-a, -beta) # one call: value and derivative return kappa * (beta / 2 -
Now divide the paper's two conditions through by F and G, and they collapse into equations built entirely from those overflow-free ratios. The exit condition becomes
(x−c)F(x)F′(x)−1=
and the entry condition, using V′(x)=V(x)F′(x)/F(x), becomes
G(x)G′(x)
The one piece that isn't a pure ratio, V(x)=(b∗−c)F(x)/F(b∗), is evaluated in log space, where the leftover exponent is a modest number whenever both points sit inside the trading range, even though each factor alone would overflow. Same roots as the paper's conditions, but every term is now a single stable special-function call, findable by a vectorized bracketing solver across thousands of parameter sets at once. For the extreme tails where even that kernel gives up, Watson's lemma supplies the asymptotics.
Deriving this (filling the gap between "a paper says it's optimal" and "my machine computes it in bulk") is the part of the project I would do again for free.
Around the math grew a system. Rolling OLS for hedge ratios. A hand-rolled rolling cointegration test: rolling Engle–Granger with a proper ADF on the residuals, because nothing off the shelf would do it fast enough. OU parameters re-estimated on every window using the exact discrete transition, not the Euler approximation. A Numba state machine simulating execution delays, volume caps, borrow costs, stops.
The first version ran on Dask over a Postgres feature store, with a cloud cluster for scale-out. It spent most of its life managing connections and serializing dataframes. The rewrite deleted all of it: a DuckDB-queried Parquet lake and a local process pool turned out to be dramatically faster for the per-pair work than the distributed architecture I'd been proud of. That deletion was its own education.
Top 100 USD pairs on Kraken by volume. Every pair of them: 4,950 combinations. A year of one-minute bars. 38,241 simulated round trips.
The backtest came back at a $1,896 profit on an 81% win rate, with a per-trade Sharpe that annualized to double digits. For a while, the project felt finished. I had taken a paper, made the math computable, industrialized it, and it worked.
Then I checked my fee assumption against Kraken's published schedule. That one check turned into a two-day audit, and by the end of it the profit was gone.
Here's where it stops being a story about my mistakes and becomes a finding, because after fixing all three, the mean reversion is still there. The spreads really do revert. The machinery really does harvest them: $2,414 gross. The effect is real.
Then you sort the profits by the liquidity of each pair's worse leg:
The gross edge doesn't just shrink as pairs get more liquid: it vanishes, and then goes slightly negative. Among the top-15 assets, where you could actually trade size, there is nothing. Just over 75% of the entire edge sits in pairs whose worse leg ranks 51–100 by volume: assets with 25–100 bps half-spreads, unreliable or absent borrow, and a median trade size, in my own backtest, of $18, against maybe $14k of total capacity.
And at the taker fee my volume tier actually pays, every bucket is negative, including the tail. The edge exists only where it cannot be harvested, and even there it doesn't clear its own collection costs.
That's not a bug. That's the market working. Shleifer and Vishny called it the limits of arbitrage: mispricings persist in proportion to the frictions that stop arbitrageurs from correcting them. Where institutions can trade, the inefficiency is gone. Where they can't, where the fees, spreads, and borrow costs exceed the prize, a small, real, untouchable anomaly survives, like moss growing where the mowers can't reach. I hadn't discovered an edge. I had measured a friction.
I didn't accept that gracefully. Four salvage attempts, in escalating order of desperation:
Hypothesis
Result
Verdict
Cheaper venue (full re-run on Binance, honest fees + live spreads)
−$71/yr vs Kraken's −$88
dead
Cross-exchange basis (Kraken vs Binance, same asset)
real & fast-reverting, but 6–12 bps of basis vs ~68 bps of cost
dead
ML meta-labeling (LightGBM, 35 features, purged walk-forward)
out-of-sample R² negative in 13/14 folds, deflated Sharpe 0.000
dead
Cost-aware optimal bands (re-solve levels with the true per-pair cost)
win rate 49% → 77%, and still net-negative in every configuration
dead
The machine-learning one stung the most, because meta-labeling is the literature's officially recommended rescue for exactly this situation. Under strict leakage control it has no predictive power at all. You cannot filter your way to an edge that isn't there.
The venue experiment mattered for a different reason: Binance's fees are less than half of Kraken's, and the strategy still loses. The binding constraint was never the fee schedule. The gross edge itself is structurally too thin.
I was gutted. Eleven months (the MLE study notebooks, the derivations, the pipeline, the rewrite, the 186 tests), and the honest answer at the end of it is: this does not work, and no adjacent version of it works either. There was an afternoon, right after the fee repricing flipped the sign, where I just sat with it. I'd told myself a story for most of a year, and the story had a spreadsheet error in the second act.
I'm not going to dress that up. Watching a year of work resolve to a negative number is a specific kind of grief, and pretending otherwise would be one more way of lying to myself, which is the exact habit this project beat out of me.
And since this section is called what it's called: a lot of this project was built by directing Claude: much of the code, and candidate steps in some of the derivations, came out of long sessions of me setting the problem, steering, and choosing between its attempts. (The derivative extension of the closed form I worked out by hand, and the idea of canceling the overflow in ratios was mine too; Claude helped me push the algebra through from there. Those I'm keeping.) The judgment calls, the mistakes, and the verification are mine; I checked every derivation against direct computation. But I didn't type most of it alone, and I want that on the record for the same reason I want the fee schedule on the record.
But here is what I keep coming back to. The strategy died. Almost nothing else did.
The math survived: the parabolic-cylinder reformulation and the overflow-free ratios apply to any OU optimal-stopping problem, and they're now numerically verified against direct quadrature (done in log space at the extremes, since out there the raw integrand overflows before the closed form does). The pipeline survived: the lake, the rolling estimators, the leak-free evaluation harness with purged cross-validation and deflated Sharpe. The discipline survived, and it turned out to be the real asset: fees from the venue's live API instead of a config constant; daily portfolio Sharpe instead of per-trade fantasy; deflated Sharpe as the gate every result must pass.
Two weeks after shelving this strategy, I pointed the same harness at a different edge source: funding-rate carry. One configuration passed the same deflated-Sharpe gate that had just executed my pairs strategy (DSR 0.994, though it hasn't been validated out-of-sample yet0.994 is the probability the true Sharpe clears zero once the search is discounted. It is a gate the result passed, not a forecast of what it will do next., and the harness that killed this strategy has earned the right to kill that one too). Without this failure, I'd have had no harness, no gate, and no reason to trust any number the next backtest showed me.
I set out to extract alpha from mean reversion. What I actually built was the ability to find out, quickly, honestly, and at scale, whether any strategy is real. It took losing one I loved to learn that the second thing is worth more.
The full derivations, tables, and robustness checks are in the paper below.
Every representation checked against an overflow-free quadrature reference. The exact kernel is good to reference precision until SciPy's pbdv dies (asymmetrically: +53 by overflow, -41 by underflow); the asymptotic fallbacks take over from there.
Show dataHide data
beta
Representation
Relative error
-60
Exact kernel ratio (Prop. 2)
-59.5
Exact kernel ratio (Prop. 2)
-59
Exact kernel ratio (Prop. 2)
-58.5
Exact kernel ratio (Prop. 2)
-58
Exact kernel ratio (Prop. 2)
-57.5
Exact kernel ratio (Prop. 2)
-57
Exact kernel ratio (Prop. 2)
-56.5
Exact kernel ratio (Prop. 2)
-56
Exact kernel ratio (Prop. 2)
-55.5
Exact kernel ratio (Prop. 2)
-55
Exact kernel ratio (Prop. 2)
-54.5
Exact kernel ratio (Prop. 2)
-54
Exact kernel ratio (Prop. 2)
-53.5
Exact kernel ratio (Prop. 2)
-53
Exact kernel ratio (Prop. 2)
-52.5
Exact kernel ratio (Prop. 2)
-52
Exact kernel ratio (Prop. 2)
-51.5
Exact kernel ratio (Prop. 2)
-51
Exact kernel ratio (Prop. 2)
-50.5
Exact kernel ratio (Prop. 2)
-50
Exact kernel ratio (Prop. 2)
-49.5
Exact kernel ratio (Prop. 2)
-49
Exact kernel ratio (Prop. 2)
-48.5
Exact kernel ratio (Prop. 2)
-48
Exact kernel ratio (Prop. 2)
-47.5
Exact kernel ratio (Prop. 2)
-47
Exact kernel ratio (Prop. 2)
-46.5
Exact kernel ratio (Prop. 2)
-46
Exact kernel ratio (Prop. 2)
-45.5
Exact kernel ratio (Prop. 2)
-45
Exact kernel ratio (Prop. 2)
-44.5
Exact kernel ratio (Prop. 2)
-44
Exact kernel ratio (Prop. 2)
-43.5
Exact kernel ratio (Prop. 2)
-43
Exact kernel ratio (Prop. 2)
-42.5
Exact kernel ratio (Prop. 2)
-42
Exact kernel ratio (Prop. 2)
-41.5
Exact kernel ratio (Prop. 2)
-41
Exact kernel ratio (Prop. 2)
1e-10
-40.5
Exact kernel ratio (Prop. 2)
1e-10
-40
Exact kernel ratio (Prop. 2)
1e-10
-39.5
Exact kernel ratio (Prop. 2)
1e-10
-39
Exact kernel ratio (Prop. 2)
1e-10
-38.5
Exact kernel ratio (Prop. 2)
1e-10
-38
Exact kernel ratio (Prop. 2)
1e-10
-37.5
Exact kernel ratio (Prop. 2)
1e-10
-37
Exact kernel ratio (Prop. 2)
1e-10
-36.5
Exact kernel ratio (Prop. 2)
1e-10
-36
Exact kernel ratio (Prop. 2)
1e-10
-35.5
Exact kernel ratio (Prop. 2)
1e-10
-35
Exact kernel ratio (Prop. 2)
1e-10
-34.5
Exact kernel ratio (Prop. 2)
1e-10
-34
Exact kernel ratio (Prop. 2)
1e-10
-33.5
Exact kernel ratio (Prop. 2)
1e-10
-33
Exact kernel ratio (Prop. 2)
1e-10
-32.5
Exact kernel ratio (Prop. 2)
1e-10
-32
Exact kernel ratio (Prop. 2)
1e-10
-31.5
Exact kernel ratio (Prop. 2)
1e-10
-31
Exact kernel ratio (Prop. 2)
1e-10
-30.5
Exact kernel ratio (Prop. 2)
1e-10
-30
Exact kernel ratio (Prop. 2)
1e-10
-29.5
Exact kernel ratio (Prop. 2)
1e-10
-29
Exact kernel ratio (Prop. 2)
1e-10
-28.5
Exact kernel ratio (Prop. 2)
1e-10
-28
Exact kernel ratio (Prop. 2)
1e-10
-27.5
Exact kernel ratio (Prop. 2)
1e-10
-27
Exact kernel ratio (Prop. 2)
1e-10
-26.5
Exact kernel ratio (Prop. 2)
1e-10
-26
Exact kernel ratio (Prop. 2)
1e-10
-25.5
Exact kernel ratio (Prop. 2)
1e-10
-25
Exact kernel ratio (Prop. 2)
1e-10
-24.5
Exact kernel ratio (Prop. 2)
1e-10
-24
Exact kernel ratio (Prop. 2)
1e-10
-23.5
Exact kernel ratio (Prop. 2)
1e-10
-23
Exact kernel ratio (Prop. 2)
1e-10
-22.5
Exact kernel ratio (Prop. 2)
1e-10
-22
Exact kernel ratio (Prop. 2)
1e-10
-21.5
Exact kernel ratio (Prop. 2)
1e-10
-21
Exact kernel ratio (Prop. 2)
1e-10
-20.5
Exact kernel ratio (Prop. 2)
1e-10
-20
Exact kernel ratio (Prop. 2)
1e-10
-19.5
Exact kernel ratio (Prop. 2)
1e-10
-19
Exact kernel ratio (Prop. 2)
1e-10
-18.5
Exact kernel ratio (Prop. 2)
1e-10
-18
Exact kernel ratio (Prop. 2)
1e-10
-17.5
Exact kernel ratio (Prop. 2)
1e-10
-17
Exact kernel ratio (Prop. 2)
1e-10
-16.5
Exact kernel ratio (Prop. 2)
1e-10
-16
Exact kernel ratio (Prop. 2)
1e-10
-15.5
Exact kernel ratio (Prop. 2)
1e-10
-15
Exact kernel ratio (Prop. 2)
1e-10
-14.5
Exact kernel ratio (Prop. 2)
1e-10
-14
Exact kernel ratio (Prop. 2)
1e-10
-13.5
Exact kernel ratio (Prop. 2)
1e-10
-13
Exact kernel ratio (Prop. 2)
1e-10
-12.5
Exact kernel ratio (Prop. 2)
1e-10
-12
Exact kernel ratio (Prop. 2)
1e-10
-11.5
Exact kernel ratio (Prop. 2)
1e-10
-11
Exact kernel ratio (Prop. 2)
1e-10
-10.5
Exact kernel ratio (Prop. 2)
1e-10
-10
Exact kernel ratio (Prop. 2)
1e-10
-9.5
Exact kernel ratio (Prop. 2)
1e-10
-9
Exact kernel ratio (Prop. 2)
1e-10
-8.5
Exact kernel ratio (Prop. 2)
1e-10
-8
Exact kernel ratio (Prop. 2)
1e-10
-7.5
Exact kernel ratio (Prop. 2)
1e-11
-7
Exact kernel ratio (Prop. 2)
1e-11
-6.5
Exact kernel ratio (Prop. 2)
1e-11
-6
Exact kernel ratio (Prop. 2)
1e-11
-5.5
Exact kernel ratio (Prop. 2)
1e-11
-5
Exact kernel ratio (Prop. 2)
1e-11
-4.5
Exact kernel ratio (Prop. 2)
1e-11
-4
Exact kernel ratio (Prop. 2)
1e-11
-3.5
Exact kernel ratio (Prop. 2)
1e-11
-3
Exact kernel ratio (Prop. 2)
1e-11
-2.5
Exact kernel ratio (Prop. 2)
1e-11
-2
Exact kernel ratio (Prop. 2)
1e-11
-1.5
Exact kernel ratio (Prop. 2)
1e-11
-1
Exact kernel ratio (Prop. 2)
1e-11
-0.5
Exact kernel ratio (Prop. 2)
1e-11
0
Exact kernel ratio (Prop. 2)
1e-11
0.5
Exact kernel ratio (Prop. 2)
1e-11
1
Exact kernel ratio (Prop. 2)
1e-12
1.5
Exact kernel ratio (Prop. 2)
1e-11
2
Exact kernel ratio (Prop. 2)
1e-12
2.5
Exact kernel ratio (Prop. 2)
1e-11
3
Exact kernel ratio (Prop. 2)
1e-10
3.5
Exact kernel ratio (Prop. 2)
1e-11
4
Exact kernel ratio (Prop. 2)
1e-12
4.5
Exact kernel ratio (Prop. 2)
1e-9
5
Exact kernel ratio (Prop. 2)
1e-10
5.5
Exact kernel ratio (Prop. 2)
1e-12
6
Exact kernel ratio (Prop. 2)
1e-11
6.5
Exact kernel ratio (Prop. 2)
1e-12
7
Exact kernel ratio (Prop. 2)
1e-13
7.5
Exact kernel ratio (Prop. 2)
1e-13
8
Exact kernel ratio (Prop. 2)
1e-13
8.5
Exact kernel ratio (Prop. 2)
1e-13
9
Exact kernel ratio (Prop. 2)
1e-13
9.5
Exact kernel ratio (Prop. 2)
1e-13
10
Exact kernel ratio (Prop. 2)
1e-13
10.5
Exact kernel ratio (Prop. 2)
1e-13
11
Exact kernel ratio (Prop. 2)
1e-13
11.5
Exact kernel ratio (Prop. 2)
1e-13
12
Exact kernel ratio (Prop. 2)
1e-13
12.5
Exact kernel ratio (Prop. 2)
1e-13
13
Exact kernel ratio (Prop. 2)
1e-13
13.5
Exact kernel ratio (Prop. 2)
1e-13
14
Exact kernel ratio (Prop. 2)
1e-13
14.5
Exact kernel ratio (Prop. 2)
1e-13
15
Exact kernel ratio (Prop. 2)
1e-13
15.5
Exact kernel ratio (Prop. 2)
1e-13
16
Exact kernel ratio (Prop. 2)
1e-13
16.5
Exact kernel ratio (Prop. 2)
1e-13
17
Exact kernel ratio (Prop. 2)
1e-13
17.5
Exact kernel ratio (Prop. 2)
1e-13
18
Exact kernel ratio (Prop. 2)
1e-13
18.5
Exact kernel ratio (Prop. 2)
1e-13
19
Exact kernel ratio (Prop. 2)
1e-13
19.5
Exact kernel ratio (Prop. 2)
1e-13
20
Exact kernel ratio (Prop. 2)
1e-13
20.5
Exact kernel ratio (Prop. 2)
1e-13
21
Exact kernel ratio (Prop. 2)
1e-13
21.5
Exact kernel ratio (Prop. 2)
1e-13
22
Exact kernel ratio (Prop. 2)
1e-13
22.5
Exact kernel ratio (Prop. 2)
1e-13
23
Exact kernel ratio (Prop. 2)
1e-13
23.5
Exact kernel ratio (Prop. 2)
1e-13
24
Exact kernel ratio (Prop. 2)
1e-13
24.5
Exact kernel ratio (Prop. 2)
1e-13
25
Exact kernel ratio (Prop. 2)
1e-13
25.5
Exact kernel ratio (Prop. 2)
1e-13
26
Exact kernel ratio (Prop. 2)
1e-13
26.5
Exact kernel ratio (Prop. 2)
1e-13
27
Exact kernel ratio (Prop. 2)
1e-13
27.5
Exact kernel ratio (Prop. 2)
1e-13
28
Exact kernel ratio (Prop. 2)
1e-13
28.5
Exact kernel ratio (Prop. 2)
1e-13
29
Exact kernel ratio (Prop. 2)
1e-13
29.5
Exact kernel ratio (Prop. 2)
1e-13
30
Exact kernel ratio (Prop. 2)
1e-13
30.5
Exact kernel ratio (Prop. 2)
1e-13
31
Exact kernel ratio (Prop. 2)
1e-13
31.5
Exact kernel ratio (Prop. 2)
1e-13
32
Exact kernel ratio (Prop. 2)
1e-13
32.5
Exact kernel ratio (Prop. 2)
1e-13
33
Exact kernel ratio (Prop. 2)
1e-13
33.5
Exact kernel ratio (Prop. 2)
1e-13
34
Exact kernel ratio (Prop. 2)
1e-13
34.5
Exact kernel ratio (Prop. 2)
1e-13
35
Exact kernel ratio (Prop. 2)
1e-13
35.5
Exact kernel ratio (Prop. 2)
1e-13
36
Exact kernel ratio (Prop. 2)
1e-13
36.5
Exact kernel ratio (Prop. 2)
1e-13
37
Exact kernel ratio (Prop. 2)
1e-13
37.5
Exact kernel ratio (Prop. 2)
1e-13
38
Exact kernel ratio (Prop. 2)
1e-13
38.5
Exact kernel ratio (Prop. 2)
1e-13
39
Exact kernel ratio (Prop. 2)
1e-13
39.5
Exact kernel ratio (Prop. 2)
1e-13
Showing the first 200 of 556 rows.
Source: verify_math.py quadrature reference, a = 1.5
Cumulative net PnL
net
$1,896
win
80.8%
break-even
14.3 bps
The same 38,241 trades, priced at whatever fee you choose. The strategy I thought I had is the one at 2 bps.
Show dataHide data
Fee
Net PnL
Win rate
0 bps
$2,205
81.3%
2 bps
$1,896
80.8%
5 bps
$1,434
80.2%
10 bps
$663
78.5%
14 bps
$46
76.7%
20 bps
-$879
72.1%
24 bps
-$1,496
68.3%
30 bps
-$2,421
62.4%
Source: Kraken spot, 1-min bars, Dec 2024 – Dec 2025
One round trip at the Leung-Li optimal levels
One real round trip at the computed optimal levels. LINKUSD - 0.41 x ZECUSD, January 2025: entry below d*, sixty hours of noise, exit above b*.
Show dataHide data
Hours
Spread
0
0.222
0.417
0.215
0.5
0.348
0.583
0.328
0.667
0.259
0.75
0.02
0.833
0.153
0.917
0.189
1
0.139
1.25
0.134
1.333
0.177
1.667
0.08
1.833
-0.02
1.917
0.065
2.167
0.023
2.25
0.077
2.333
0.107
2.5
0.168
2.583
0.117
2.667
0.089
2.75
0.162
2.833
0.182
2.917
0.135
3
0.137
3.083
0.129
3.25
0.174
3.5
0.163
3.75
0.231
3.833
0.232
4.25
0.169
4.5
0.24
4.833
0.09
5.5
0.134
5.583
0.022
5.667
0.089
5.833
0.197
6.083
0.159
6.333
0.113
6.5
0.188
6.583
0.199
6.667
0.191
6.75
0.173
6.833
0.15
6.917
0.28
7.417
0.199
7.833
0.12
8
0.137
8.083
0.149
8.167
0.038
8.25
0.027
8.333
0.119
8.417
0.138
8.917
0.086
9.083
0.145
9.417
0.086
9.5
0.083
9.583
0.161
9.667
0.158
9.75
0.092
9.833
0.099
10
0.153
10.167
0.184
10.333
0.1
10.417
0.057
10.5
0.193
10.583
0.151
10.667
0.061
10.75
0.055
10.833
0.131
10.917
0.135
11.083
0.157
11.167
0.119
11.25
0.128
11.333
0.169
11.417
0.107
11.5
0.073
11.583
0.155
11.667
0.154
11.75
0.202
11.833
0.106
12
0.126
12.083
0.141
12.167
0.031
12.25
0.163
12.5
0.109
12.583
0.148
12.667
0.11
12.75
0.068
13.083
-0.209
13.167
-0.317
13.25
-0.646
13.333
-1.017
13.417
-0.515
13.5
-0.358
13.583
-0.397
13.667
-0.419
13.75
-0.22
13.833
-0.404
13.917
-0.533
14
-0.51
14.083
-0.417
14.417
-0.402
14.5
-0.41
14.583
-0.965
14.667
-0.479
14.75
-0.584
14.833
-0.54
14.917
-0.682
15
-0.95
15.083
-0.854
15.167
-0.844
15.25
-0.788
15.333
-0.605
15.417
-0.872
15.5
-0.594
15.583
-0.771
15.667
-0.546
15.833
-0.627
15.917
-0.607
16
-0.612
16.083
-0.5
16.25
-0.553
16.333
-0.534
16.417
-0.506
16.667
-0.512
16.75
-0.542
16.833
-0.55
16.917
-0.541
17
-0.51
17.167
-0.494
17.25
-0.439
17.333
-0.347
17.417
-0.423
17.5
-0.405
17.583
-0.481
17.667
-0.472
17.75
-0.47
18.083
-0.43
18.25
-0.469
18.333
-0.532
18.417
-0.583
18.5
-0.523
18.583
-0.484
18.667
-0.593
18.75
-0.619
18.833
-0.746
18.917
-0.602
19
-0.546
19.167
-0.639
19.25
-0.612
19.333
-0.585
19.417
-0.63
19.5
-0.598
19.583
-0.652
19.667
-0.712
19.75
-0.646
19.833
-0.658
20
-0.671
20.083
-0.635
20.25
-0.613
20.5
-0.634
20.583
-0.62
20.667
-0.582
20.75
-0.709
20.833
-0.73
20.917
-0.786
21
-0.638
21.083
-0.627
21.167
-0.549
21.5
-0.578
21.583
-0.522
21.667
-0.533
21.75
-0.612
21.833
-0.558
21.917
-0.556
22
-0.528
22.083
-0.36
22.167
-0.35
22.25
-0.458
22.333
-0.476
22.417
-0.441
22.583
-0.447
22.75
-0.348
23.083
-0.35
23.417
-0.343
23.5
-0.335
23.583
-0.317
24
-0.444
24.333
-0.433
24.5
-0.511
24.833
-0.552
25
-0.547
25.083
-0.496
25.167
-0.518
25.333
-0.443
25.417
-0.487
25.5
-0.422
25.75
-0.427
26.25
-0.411
26.333
-0.478
Showing the first 200 of 647 rows.
Source: Kraken spot, 1-min bars resampled to 5 min
Gross edge lives exactly where it cannot be traded
Gross PnL by the less-liquid leg's volume rank. Negative in the majors. Just over 75% of the edge sits in the illiquid tail.
Show dataHide data
Volume rank
Gross PnL
Net PnL at 2 bps
Trades
2–10 (majors)
-$4
-$8
175
11-15
-$6
-$14
344
16-25
$112
$87
1,771
26-50
$489
$383
7,261
51–100 (illiquid tail)
$1,823
$1,448
28,690
Source: Kraken spot, 1-min bars, Dec 2024 – Dec 2025
0 comments
Sign in to join the discussion