P&L: fold abandoned losers into realized (anti-survivorship) — All-Time is the truth, not PM

Resolved-but-unredeemed positions (bets that lost, went to $0, never
redeemed) were sitting in Open P&L, breaking the All-Time+Open=PM reconcile
and — worse — hiding real losses. _open_split now routes decided positions
(curPrice pinned 0/1) into the REALIZED total at their outcome, leaving only
genuinely in-flight positions in Open P&L. This is the project's founding
survivorship insight applied to P&L: PM /profit under-counts abandoned
losers unevenly, so where our All-Time reads lower than PM, PM is biased and
ours is honest. oliman2 $181k->$20k (walked from $161k of losers),
JuiceFarm $380k->$32k; clean wallets unchanged (ewww1 $409k, KBO30 ~PM).
Win% now counts abandoned losers too. Verified: Coteykens/imwalkinghere/KBO30
now ~PM; oliman2/JuiceFarm correctly far below their flattering PM.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jaxperro
2026-07-07 21:19:06 -04:00
parent c3e1c36562
commit c6ca8ad82c
2 changed files with 54 additions and 28 deletions
+19 -15
View File
@@ -290,21 +290,25 @@ runner is retired (GitHub throttled `*/5` to ~2h in practice — it copied 1 of
location doesn't relocate *you* (trade live from Colombia months, paper
from US months).
11. **All-Time / Conv P&L is the wallet's REALIZED track record** — the sum of
Polymarket's own `realizedPnl` per closed position over the wallet's full
history (`cache.closed_exits`, the incremental `/closed-positions` cache).
It's what a copier mirroring their buy/sell/hold actually banks, and it
equals the profile's **PM P&L** except for unrealized marks on positions
still open. This *replaced* the old hold-to-resolution reconstruction
(`won × entry × size`), which diverged from PM by up to 10× and even
flipped signs — four bugs: a 2,000-row pull cap (fixed: full history),
both-sides positions double-dropped by one-per-market dedup (fixed: each
asset is its own realized row), `initialValue = 0` mis-sizing (moot —
realized P&L needs no size), and corrupt near-epoch `res_t` (moot —
realized cash is timestamp-independent). Win % is now the share of closed
positions that *made money*, the mirror lens. (For wallets holding a large
losing open book, realized > PM because PM marks the open losers in;
that gap is unrealized, not an error.)
11. **All-Time / Conv P&L is the wallet's ANTI-SURVIVORSHIP realized track
record.** Every DECIDED position at its actual result: redeemed/sold closed
positions (Polymarket's own `realizedPnl`, `cache.closed_exits`) PLUS
resolved-but-unredeemed positions still sitting in `/positions` — bets that
already won/lost and the wallet never redeemed (mostly **abandoned losers**
at $0). `_open_split` in validate_timing pulls current positions and routes
those decided ones into the realized total (`cashPnl` = their outcome),
leaving only genuinely in-flight positions in the **Open P&L** column. This
is the whole point of the project surfacing: PM `/profit` **under-counts
abandoned losers**, unevenly — Coteykens' PM subtracts them (realized $66k
$52k walked-away = $14k = PM), oliman2's does not ($181k $161k = $20k
true, yet PM says $112k). So where our All-Time reads **lower** than PM, PM
is the survivorship-biased number and **ours is the truth** (oliman2 and
JuiceFarm look elite on redeemed-only P&L, ~$20k/$32k once the losers they
walked from are counted). This *replaced* the old hold-to-resolution
reconstruction (`won × entry × size`), which diverged by up to 10× and
flipped signs — four bugs killed with it: the 2,000-row pull cap, both-sides
double-drop, `initialValue = 0` mis-sizing, and corrupt near-epoch `res_t`.
Win % is the share of decided positions that *made money*.
---