# Backtest and Tuning Protocol

## Build NPZ

Inspect `pool_metadata.json` first. Do not assume token0 is stable.

Example if token0 is USDC and token1 is WETH:

```bash
python3 dex_platform/data_collectors/build_cl_fee_replay_npz_v2.py \
  --events DEX_DATA/<POOL_DIR>/events_all.parquet \
  --out-npz DEX_DATA/fast_npz/<POOL_NAME>_fee_replay_v2.npz \
  --pool-name <POOL_NAME> \
  --token0 USDC \
  --token1 WETH \
  --dec0 6 \
  --dec1 18 \
  --quote-token token0 \
  --fee-rate <FEE_RATE>
```

## Capacity tune

If v3 tuner exists:

```bash
python3 dex_platform/backtest/cl_fee_replay_fast_npz_v3.py \
  --npz DEX_DATA/fast_npz/<POOL_NAME>_fee_replay_v2.npz \
  --out-dir DEX_REPORTS/<POOL_NAME>_capacity_tune_april_v3 \
  --fee-rates real_fee:<FEE_RATE> \
  --time-from 2026-04-01T00:00:00Z \
  --time-to   2026-05-01T00:00:00Z \
  --capital-mode grid \
  --capital-grid 25,50,75,100,125,150,175,200,250,300,400,500,600 \
  --grid-lower 50,60,70,80,85,90,95 \
  --grid-upper 1,2,3,5,8,10,15,20 \
  --target-mdd-pct 20 \
  --max-avg-liquidity-share-pct 3 \
  --max-p95-liquidity-share-pct 5 \
  --max-p99-liquidity-share-pct 10 \
  --max-liquidity-share-pct 25 \
  --plots
```

## Tranche-DCA tune

```bash
python3 dex_platform/backtest/cl_fee_replay_tranche_dca_v1.py \
  --npz DEX_DATA/fast_npz/<POOL_NAME>_fee_replay_v2.npz \
  --out-dir DEX_REPORTS/<POOL_NAME>_tranche_dca_april_v1 \
  --time-from 2026-04-01T00:00:00Z \
  --time-to   2026-05-01T00:00:00Z \
  --fee-rate <FEE_RATE> \
  --total-capital-grid 50,75,100,150,200,300,600 \
  --parts-grid 3,4,5,6 \
  --lower-grid 35,40,45,50,55,60,70,80 \
  --upper-grid 5,10,15,20,25,30 \
  --add-mode equal,double_base,double_once,progressive \
  --max-reentries-grid 1,2,3,4 \
  --min-reentry-hours-grid 0,6,12,24 \
  --anchor-mode current_price,rolling_low \
  --support-lookback-hours 6,12,24 \
  --support-offset-pct 0,2,5
```

## Monthly validation

Test all promising configs:

```text
Feb: 2026-02-01 -> 2026-03-01
Mar: 2026-03-01 -> 2026-04-01
Apr: 2026-04-01 -> 2026-05-01
Quarter: 2026-02-01 -> 2026-05-01
```

Do not recommend April-only winners.
