Date range: 2024-01-01 → 2026-02-23 (784 days) · Generated: 2026-02-22 21:19 UTC
| Tier | n | Median P&L | Mean maker_pct | Mean fills/day |
|---|---|---|---|---|
| A — Professional | 8 | $22,370.74 | 0.911 | 15,611 |
| B — Serious | 20 | $4,561.65 | 0.906 | 2,574 |
| C — Active | 80 | $7.68 | 0.899 | 1,280 |
| D — Casual | 8,368 | $-1,444.47 | 0.577 | 392 |
n=8,476 wallets total · 2024-01-01 → 2026-02-23 (784 days)
The P&L gradient is the headline result: A ($22,370.74) and B ($4,561.65) are consistently profitable; C ($7.68) is effectively breakeven over 2 years; D bottom candidates ($-1,444.47) are net negative. A/B/C mean maker_pct (~0.90) is dramatically higher than D (0.58) — passive order posting is the primary behavioral separator.
Median P&L from FIFO over each wallet's top-50 tokens. D_casual median reflects the 192 bottom candidates (ranked 109–300); the remaining n=8,176 wallets have no FIFO computation.
Scoring approach: Two-pass. All n=8,476 screened wallets are ranked on 6 activity/quality features. The top 300 by that preliminary score proceed to FIFO P&L computation. A+B+C tiers (108 slots) are assigned from the final 7-feature score on that candidate pool. The bottom 192 candidates plus the 8,176 wallets outside the FIFO pool all receive D_casual (n=8,368 total).
Trade data is drawn from Polymarket's on-chain Polygon transaction log, filtered to the 2024-01-01 window below. The features query ran once and results are cached — re-runs are free.
Maker rate data is drawn from the CTF exchange's order-filled event log, same timestamp window. Scanned once; also cached.
| Dataset | n | Date range | Days |
|---|---|---|---|
| features (wallet activity) | 394,737 wallets with ≥ 100 fills | 2024-01-01 → 2026-01-01 | 731 |
| maker_pct (order_filled) | 1,776,182 wallets | 2024-01-01 → 2026-02-23 | 784 |
| trade tape (FIFO candidates) | 20,509,699 fills · 300 wallets | 2024-01-05 → 2026-01-01 (727 days) | |
| bilateral screened | 8,476 wallets | — | — |
| FIFO candidates | 300 wallets | — | — |
Note: the features cache ends 2026-01-01; maker_pct extends 53 days further to 2026-02-23. maker_pct is a slow-moving behavioral signal — the gap does not materially affect scoring.
Raw features — n=394,737 wallets with ≥ 100 fills · 2024-01-01 → 2026-01-01 (731 days)
| stat | n_fills | n_tokens | duration_days | trades_per_day | buy_sell_balance | maker_pct |
|---|---|---|---|---|---|---|
| count | 394,737 | 394,737 | 394,737 | 394,737 | 394,737 | 394,737 |
| mean | 1,343.511 | 137.674 | 180.740 | 33.718 | 0.854 | 0.534 |
| std | 138,982 | 813.176 | 166.344 | 499.950 | 0.157 | 0.134 |
| min | 100 | 1 | 1 | 0.140 | 0 | 0 |
| 25% | 128 | 35 | 26 | 0.610 | 0.794 | 0.476 |
| 50% | 181 | 57 | 121 | 2.072 | 0.907 | 0.500 |
| 75% | 315 | 97 | 341 | 12.188 | 0.966 | 0.607 |
| max | 69,468,280 | 285,091 | 732 | 111,929 | 1 | 1 |
Bilateral screening gate — n=394,737 input wallets · 2024-01-01 → 2026-01-01 (731 days)
| Criterion | n wallets passing | Rationale |
|---|---|---|
| buy_sell_balance > 0.5 | 380,042 | minority side ≥ 25% |
| n_fills ≥ 1,000 | 29,378 | sustained activity |
| n_tokens ≥ 10 | 372,867 | diversified |
| duration ≥ 7 days | 349,481 | not a one-off |
| fills/day ≥ 50 | 44,656 | regular cadence |
| ALL criteria combined | 8,476 | final screened set |
The fills/day ≥ 50 floor is the tightest single criterion
(leaves 44,656 of 394,737).
In combination, all five criteria yield n=8,476 wallets with
systematic, persistent, two-sided presence over 2024-01-01 → 2026-02-23 (784 days).
n=8,476 wallets · 2024-01-01 → 2026-02-23 (784 days)
Equal-weight min-max combination across:
maker_pct · trades_per_day · buy_sell_balance · n_tokens ·
total_notional_usdc · hhi_inv
No P&L in Pass 1. This narrows 8,476 screened wallets to the 300 most likely A/B/C candidates — a 28x scope reduction — before pulling the expensive trade tape.
n=300 candidates · 2024-01-05 → 2026-01-01 (727 days)
The top 300 wallets by Pass-1 score proceed to FIFO computation. Trade tape restricted to each wallet's top-50 tokens by fill count (SQL-side filter). Trade tape cached after initial scan — never re-queried.
| Metric | Value |
|---|---|
| Fills fetched | 20,509,699 |
| Wallets | 300 |
| Mean fills/wallet | 68,365 |
| Date range | 2024-01-05 → 2026-01-01 (727 days) |
FIFO matches each SELL against the chronologically prior BUY on the same outcome token per wallet. P&L = Σ (sell_price − buy_price) × token_qty. e.g. BUY 100 tokens @ $0.42, then SELL those 100 @ $0.57 → P&L = (0.57 − 0.42) × 100 = +$15.00
SELL size normalization: On-chain SELL records store size as USDC received
(not token quantity). Normalized: token_qty = size / price for every SELL before matching.
e.g. SELL size=9.50 USDC @ price=$0.95 → token_qty = 9.50 / 0.95 = 10 tokens.
n=300 FIFO-scored wallets · 2024-01-05 → 2026-01-01 (727 days)
| Metric | Value |
|---|---|
| Positive P&L | 69 (23.0%) |
| Negative P&L | 231 (77.0%) |
| Median | $-501.99 |
| p75 | $-8.01 |
| p90 | $1,230.99 |
| p99 | $58,534.97 |
| Best | $109,540.26 |
| Worst | $-18,136,416.35 |
The 231 negative-P&L wallets (77.0%) were selected on activity features (fills/day, maker_pct, breadth) not P&L — so a majority negative is expected. The P&L rank component is what distinguishes A/B from the rest; all 8 A-tier wallets have positive realized P&L.
The $-18,136,416.35 worst case is an extreme outlier — likely a large directional player that passes the bilateral gate but concentrates on outcome resolution and loses heavily. P&L enters the score as a percentile rank, so this outlier does not distort tier assignments.
maker_pct = fills on the passive (maker) side / total fills, derived from the CTF exchange's order-filled event log. The maker/taker side is an explicit on-chain field — no heuristic required.
n=8,476 screened wallets · 2024-01-01 → 2026-02-23 (784 days)
| Metric | Value |
|---|---|
| Mean | 0.581 |
| Median | 0.541 |
| p25 / p75 | 0.466 / 0.680 |
| Pure makers (≥ 0.90) | 708 |
| Near-balanced (0.40–0.60) | 3,906 |
| Pure takers (≤ 0.10) | 7 |
The distribution has a sharp primary mode around 0.45–0.50 (the largest bin, ~21% of screened wallets): bots that mix maker and taker roles roughly equally — likely TWAP-style, hedging, or accumulation strategies that alternate sides. A secondary cluster around 0.65–0.70 represents passive-leaning systematic traders. The right tail (≥ 0.90: 708 wallets) is pure resting-order market makers who rarely cross the spread.
A passive MM posts resting orders → maker_pct high. An accumulator crosses
the spread → maker_pct low. Both can satisfy the bilateral gate criteria;
maker_pct is what separates them cleanly.
For a concrete contrast: rank 2 (maker_pct=0.989) posts resting limits almost exclusively; rank 51 (maker_pct=0.444) crosses the spread on the majority of its 32,835 fills/day. Same tier, fundamentally different strategy archetype.
The final score combines 7 components, min-max scaled jointly across all candidates and summed with fixed weights (see Part 9). Tiers are assigned by rank from the n=300-candidate pool. D_casual (n=8,368) covers the 192 bottom candidates (ranked 109–300) plus 8,176 wallets that never entered the FIFO pool.
n=300 candidates · 2024-01-05 → 2026-01-01 (727 days)
A_professional (n=8) · p25=0.6324 · p50=0.6402 · p75=0.6499 · max=0.6580
B_serious (n=20) · p25=0.6055 · p50=0.6122 · p75=0.6196 · max=0.6231
C_active (n=80) · p25=0.5526 · p50=0.5659 · p75=0.5832 · max=0.5991
Tier boundaries are rank-based (not score-gap driven). The score distribution across the candidate pool is relatively continuous — the gaps between tiers are small: A/B boundary: 0.6247 vs 0.6231 (gap=0.0016) · B/C boundary: 0.6027 vs 0.5991 (gap=0.0036). Wallets near the tier boundary are exchangeable in quality; the tier labels are a practical convenience, not a hard categorical split.
Tier A_professional — n=8 · 2024-01-05 → 2026-01-01 (727 days)
| rank | wallet | mm_score | realized_pnl | maker_pct | fills/day | n_tokens |
|---|---|---|---|---|---|---|
| 1 | 0x51373c6B56… | 0.658 | $47,998.38 | 0.844 | 8,570 | 50,005 |
| 2 | 0x1cFC260BfA… | 0.6523 | $12,623.72 | 0.989 | 802 | 24,537 |
| 3 | 0x7F69983eB2… | 0.649 | $25,857.57 | 0.704 | 111,929 | 17,188 |
| 4 | 0xC8ab97a908… | 0.6419 | $18,883.91 | 0.93 | 1,385 | 24,698 |
| 5 | 0x8e8D8163c3… | 0.6386 | $1,228.35 | 0.991 | 639 | 18,700 |
| 6 | 0x2370d48501… | 0.6333 | $48,233.79 | 0.943 | 648 | 4,239 |
| 7 | 0x2104D2eB66… | 0.6297 | $11,490.77 | 0.98 | 854 | 1,598 |
| 8 | 0x9e41715A30… | 0.6247 | $109,540.26 | 0.912 | 59 | 953 |
Rank 8 (0x9e41715A30…) stands out: only 59 fills/day (barely above the 50/day gate) yet the highest P&L in the entire dataset ($109,540.26). High P&L at very low fill rate points to concentrated directional bets rather than passive spread capture.
Tier B_serious — n=20 · 2024-01-05 → 2026-01-01 (727 days)
| rank | wallet | mm_score | realized_pnl | maker_pct | fills/day | n_tokens |
|---|---|---|---|---|---|---|
| 9 | 0xD9093fF2E1… | 0.6231 | $7,741.29 | 0.997 | 1,325 | 313 |
| 10 | 0x6550ff2e1e… | 0.6223 | $108,616.21 | 0.95 | 312 | 491 |
| 11 | 0x20235f3a93… | 0.6213 | $1,685.91 | 0.965 | 785 | 705 |
| 12 | 0x8c104bB4AD… | 0.62 | $4,879.36 | 0.95 | 173 | 305 |
| 13 | 0xdCc9d68a4B… | 0.6198 | $13,674.72 | 0.902 | 92 | 2,613 |
| 14 | 0xA20b482F97… | 0.6195 | $4,243.94 | 0.77 | 15,116 | 26,650 |
| 15 | 0x6b7Ec4ba07… | 0.618 | $10,157.01 | 0.887 | 225 | 9,695 |
| 16 | 0x6cff256159… | 0.6145 | $58,213.71 | 0.844 | 124 | 4,922 |
| 17 | 0x203f6F1fA0… | 0.6142 | $1,996.15 | 0.813 | 16,083 | 10,825 |
| 18 | 0x0a7eD19909… | 0.6133 | $2,109.19 | 0.913 | 216 | 3,514 |
| 19 | 0x30E443872d… | 0.6112 | $90,339.68 | 0.823 | 163 | 3,584 |
| 20 | 0x4A49b47b69… | 0.6094 | $800.99 | 0.946 | 52 | 588 |
| 21 | 0xe0AAA89D43… | 0.6086 | $8,267.17 | 0.916 | 462 | 789 |
| 22 | 0x1DA35a47Ce… | 0.6073 | $22,558.80 | 0.845 | 250 | 567 |
| 23 | 0x2b19bEAaaE… | 0.6056 | $1,254.70 | 0.907 | 14,979 | 1,567 |
| 24 | 0xFbF3512A06… | 0.6053 | $51,794.05 | 0.934 | 63 | 60 |
| 25 | 0xBed17750E6… | 0.6051 | $912.49 | 0.962 | 238 | 270 |
| 26 | 0xa3e22cd32A… | 0.6047 | $724.46 | 0.976 | 612 | 35,694 |
| 27 | 0x386849A339… | 0.603 | $1,412.21 | 0.893 | 85 | 278 |
| 28 | 0xbBa783BFE4… | 0.6027 | $1,550.14 | 0.915 | 118 | 137 |
Tier C_active — top 30 of n=80 · 2024-01-05 → 2026-01-01 (727 days)
| rank | wallet | mm_score | realized_pnl | maker_pct | fills/day | n_tokens |
|---|---|---|---|---|---|---|
| 29 | 0x8053925555… | 0.5991 | $504.65 | 0.973 | 413 | 212 |
| 30 | 0xd2B51D9aCc… | 0.5964 | $6,213.85 | 0.692 | 25,222 | 12,298 |
| 31 | 0xe4fC1041eD… | 0.5951 | $554.36 | 0.909 | 446 | 515 |
| 32 | 0x59247A7213… | 0.5946 | $560.40 | 0.915 | 133 | 590 |
| 33 | 0xfc892E3E39… | 0.5944 | $140.89 | 0.947 | 134 | 1,170 |
| 34 | 0x792481D0D0… | 0.5928 | $5,374.14 | 0.781 | 267 | 4,005 |
| 35 | 0x719DEEF5E2… | 0.5925 | $671.71 | 0.928 | 118 | 1,139 |
| 36 | 0x0C9f372EBF… | 0.5912 | $202.53 | 0.962 | 138 | 251 |
| 37 | 0x600B771B20… | 0.5905 | $742.31 | 0.967 | 71 | 67 |
| 38 | 0x2021aeDd6D… | 0.5903 | $1,991.80 | 0.817 | 67 | 572 |
| 39 | 0x5796881fC3… | 0.5892 | $287.13 | 0.934 | 156 | 142 |
| 40 | 0xf86c606c8a… | 0.5873 | $23.26 | 0.937 | 100 | 6,371 |
| 41 | 0x3c2A504656… | 0.5873 | $594.22 | 0.973 | 288 | 107 |
| 42 | 0x96E9eDF0E2… | 0.5871 | $423.08 | 0.979 | 132 | 780 |
| 43 | 0x11899A5a28… | 0.5863 | $1,351.80 | 0.896 | 446 | 265 |
| 44 | 0xB2aD7cd5bC… | 0.5859 | $1,317.85 | 0.76 | 4,641 | 5,280 |
| 45 | 0xDaeFe62bC5… | 0.5857 | $976.66 | 0.855 | 82 | 806 |
| 46 | 0x26aEbc7cA7… | 0.5844 | $77.03 | 0.938 | 104 | 3,349 |
| 47 | 0x37eED0985F… | 0.5841 | $730.15 | 0.834 | 759 | 310 |
| 48 | 0xbAcE19B995… | 0.5836 | $766.81 | 0.82 | 7,102 | 8,174 |
| 49 | 0xC8b2b62e9a… | 0.583 | $35.25 | 0.958 | 163 | 2,026 |
| 50 | 0xf8c860fB13… | 0.5824 | $15.07 | 0.963 | 199 | 2,596 |
| 51 | 0x2150455145… | 0.5821 | $25,118.83 | 0.444 | 32,835 | 14,963 |
| 52 | 0x18345B6921… | 0.5813 | $133.11 | 0.972 | 83 | 291 |
| 53 | 0xbcE2a42663… | 0.5809 | $205.69 | 0.895 | 182 | 626 |
| 54 | 0xB818b62D3d… | 0.5793 | $64.93 | 0.962 | 708 | 888 |
| 55 | 0xFab2260cB5… | 0.5784 | $32.45 | 0.966 | 213 | 343 |
| 56 | 0x2aF4C4E28b… | 0.5773 | $22.46 | 0.978 | 235 | 181 |
| 57 | 0x88EC5ba618… | 0.5756 | $-1.66 | 0.916 | 448 | 2,391 |
| 58 | 0xAC71D9d21d… | 0.5748 | $214.27 | 0.878 | 136 | 104 |
Rank 51 (0x2150455145…) is the anomalous C-tier entry: maker_pct=0.444 (taker-dominant, vs ~0.90 for the rest of C), 32,835 fills/day, P&L $25,118.83. This wallet's score is driven by volume and breadth rather than passive posting — included on activity merits, not MM archetype.
v3 identified 8 elite wallets via manual review against data predating 2024. Checking their v5 rank validates generalization — or, as observed here, confirms the cohort has turned over entirely.
n=8 reference wallets · v3 data period (pre-2024) vs v5 window 2024-01-01 → 2026-02-23 (784 days)
v3 known elite wallets in v5 roster — 0/8 found · 2024-01-01 → 2026-02-23 (784 days)
| label | wallet | rank | tier | mm_score | realized_pnl | maker_pct |
|---|---|---|---|---|---|---|
| a42f_acc | 0xa42f127d7e… | not in screened | — | — | — | — |
| e007_acc | 0xe00740bce9… | not in screened | — | — | — | — |
| 4ffe_acc | 0x4ffe49ba2a… | not in screened | — | — | — | — |
| b548_acc | 0xb548b896c7… | not in screened | — | — | — | — |
| 5f6a_acc | 0x5f6aedef48… | not in screened | — | — | — | — |
| 330e_acc | 0x330efa1eae… | not in screened | — | — | — | — |
| e041_MM | 0xe041d09715… | not in screened | — | — | — | — |
| fdb8_MM | 0xfdb826a0fb… | not in screened | — | — | — | — |
0/8 v3 wallets active in the v5 window.
All 8 fall below the 100-fill threshold in 2024-01-01–2026-02-23, likely inactive or operating under different wallet addresses by now. Polymarket's MM cohort has fully turned over; v5 is mapping the current generation, which has no overlap with v3.
Maker rate signal v3 compared each fill price to the token VWAP; below-VWAP buys and above-VWAP sells were labeled "maker fills". This proxy is noisy for thin markets and boundary prices. v5 uses an explicit on-chain field from the CTF exchange's order-filled event log to identify the passive side. Zero ambiguity, no heuristic.
SELL size normalization
On-chain SELL records store size as USDC received, not token quantity.
FIFO requires consistent units: v5 normalizes token_qty = size / price for every
SELL fill before queuing. v3's parquet had this pre-normalized.
Two-pass architecture v3 ran FIFO on ~400 screened wallets (~22 M fills). v5 screens n=8,476 wallets. Running FIFO on all of them would be prohibitively expensive. Two-pass restricts the tape query to n=300 candidates (20,509,699 fills). Everything is cached — re-runs are free.
Score weights
| Component | Weight | Rationale |
|---|---|---|
| pnl_rank | 25% | Percentile rank of FIFO realized P&L — the ultimate quality signal |
| maker_pct | 20% | True passive rate — cleanest strategy-archetype separator |
| trades_per_day | 15% | Sustained daily cadence, not sporadic spikes |
| buy_sell_balance | 10% | Consistently makes both sides, not a net directional player |
| n_tokens | 10% | Active across many outcome tokens, not concentrated on one event |
| total_notional_usdc | 10% | Absolute capital deployed — separates retail from institutional scale |
| hhi_inv | 10% | Inverse HHI; high = diverse token footprint, low = concentrated book |
01_mm_scoring.py · 2026-02-22 21:19 UTC
n=8,476 wallets total · FIFO candidates: n=300 · 2024-01-01 → 2026-02-23 (784 days)