Methodology
"Never a black box" only means something if the box is open. This page is the box.
The hold counterfactual
"Vs holding" compares your LP value (principal + uncollected fees + harvested fees) against the exact token amounts you deposited, carried forward at current prices. Not a 50/50 dollar split at entry price — the actual deposit-time token mix. Multiple deposits each contribute their own amounts. This is the strictest honest benchmark: it's literally what your wallet would hold if you had done nothing.
Fee-switch netting
Uniswap governance activated protocol fees on 2025-12-28 (UNIfication): 25% of LP fees on 0.01%/0.05% tiers, 16.7% on 0.3%/1% tiers. We verified the flag on-chain (slot0.feeProtocol) and net every fee estimate accordingly — pool subgraphs report gross fees, so tools that read them raw overstate LP income by 17–25%.
Harvest attribution
Fee-collect events on the subgraph don't say which position they came from. When one wallet has overlapping positions in a pool, we resolve the ambiguity from the transaction receipt: the position manager's Collect log carries the exact position id, and subtracting the principal amounts in the same receipt isolates the fee portion. Anything that still can't be attributed is shown as unattributed — flagged, never fabricated.
Backtest accounting
The backtester replays real pool history — hourly on Base (since Sep 2023), daily on mainnet (since May 2021), from Uniswap's official subgraph. Fees use the liquidity-share method: your simulated liquidity divided by the pool's actual active liquidity in each period, times the period's actual fees, net of the fee switch — never APR × concentration. Costs include gas and the swap cost of rebuilding a range (fee tier + slippage on half the value). Impermanent loss is measured against the deploy-time token basket. Validation: a replay of a real position's 27-day fee history landed within 4% of what the wallet actually collected.
Timing-gate calibration
The deploy signal's timing verdict is fit to measured history, not theory: 402 rolling 30-day windows (mainnet 2021–2026, Base 2023–2026), split chronologically 60/40 into train and test sets. The rule that survived out-of-sample — deploy after a strong trailing 30-day trend, sit out after quiet chop — held on both chains at 66–80% hit-rates and was stable to ±20% perturbation of its threshold. The closed-form fee/IL ratio failed out-of-sample as a timing signal and is used only to rank range widths. Every live verdict displays the measured hit-rate.
Planner odds
The one-sided range planner quotes touch and fill probabilities from a driftless reflection-principle model on the pair's own volatility. Validated against history (141 rolling 30-day windows on Base hourly data, barriers from ±1% to ±12%, both directions): predicted probabilities land within ~5 percentage points of realized frequencies on average, with a mild uniform over-prediction of touches. Odds are approximations, not promises.
Volatility model
Two volatilities are used deliberately. The timing gate and in-range odds use trailing 30-day volatility — the window the gate was calibrated on. Impermanent-loss magnitude uses a longer ~120-day window: in an out-of-sample test on both chains we compared trailing 30-day volatility, EWMA, and GARCH at forecasting the next month's realized volatility and IL, and a plain longer window beat all of them — including GARCH, whose entire edge turned out to be its long-run variance target. We tested the fancy models; the boring one won; we shipped the boring one. The same test showed our previous IL estimate ran systematically low (about $16–23 per $1,000/month at ±15%), so the regime scaling was recalibrated to bring the bias near zero — estimates got slightly more conservative, which is the direction we prefer to err.
A later correction (July 2026) fixed the trend side of that regime scaling. The old multiplier raised the IL estimate after a strong trailing trend — a momentum assumption. Measured against realized outcomes on both chains, the opposite is true: months following a trailing trend realized the lowest IL (markets consolidate after a move — the same mean reversion the timing gate exploits), and the old multiplier over-forecast trending-pool IL several-fold out-of-sample. The multiplier now declines after a trailing trend. The direction and rough size of that correction hold out-of-sample on both chains; the exact declining curve we ship was fit on the training slice only. It substantially reduces the over-forecast rather than eliminating it — a residual over-forecast remains on the trending regime, larger on Base than on mainnet — so treat trending-pool IL as improved but still conservative-leaning. This is why the timing verdict and the IL estimate no longer pull in opposite directions on trending pools.
Known limitations
- Volatility and fee projections assume the recent past persists; regime changes break them (that's partly what the timing gate is for).
- Hourly granularity understates loss-versus-rebalancing from intra-hour moves.
- Position-fee forecasts run conservative for wider ranges: trend-driven fee surges are collected disproportionately by ranges that stay in through them (measured at ~15–40% median under-forecast beyond ±15%). A fitted correction failed out-of-sample validation, so we disclose the bias rather than model it.
- Overlap between rolling backtest windows means effective sample sizes are smaller than raw counts.
- Receipt-attributed harvests in rare ambiguous cases are valued at current, not at-collect, prices.
Historical simulation — past performance does not predict future results. Not financial advice.