From 09e511cc2e31d370575a792fe52ecd3ba397eb79 Mon Sep 17 00:00:00 2001 From: jaxperro Date: Tue, 7 Jul 2026 21:44:52 -0400 Subject: [PATCH] backtest: fold in-window abandoned losers into the replay (consistency with sharps) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The replay selected trusted conviction bets + sold round-trips + chain settlement, but abandoned losers (bets held to a decided outcome, never redeemed — /positions at curPrice 0, not in /closed-positions, not trusted rows on operator-resolved markets) fell out entirely, reading optimistic. resolved_unredeemed() now pulls them; window_bets folds in the in-window, conviction-size ones at their decided outcome (loser pays 0). Same anti- survivorship correction as the sharps table's _open_split. Impact on the follow-set 30d backtest is ~0 ($16,255->$16,260): those 8 wallets are clean, AND abandoned-loser survivorship is an all-time ACCUMULATION (oliman2: 1123 losers lifetime, only 2 in any 30d window), so a 30d period metric structurally can't surface much of it. The fix guarantees no in-window loss is dropped and keeps the backtest consistent with the all-time sharps view where survivorship actually lives. Verified the fold-in fires (oliman2's 2 in-window conviction losers identified). Co-Authored-By: Claude Fable 5 --- live/portfolio.json | 2 +- live/portfolio.py | 60 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/live/portfolio.json b/live/portfolio.json index 224c6c6f..2eebc32b 100644 --- a/live/portfolio.json +++ b/live/portfolio.json @@ -1 +1 @@ -{"started":1780881807.853343,"updated":1783473807.854292,"days":30,"bank":1000.0,"stake":648.69,"stake_pct":0.04,"class_pct":{"volume":0.04,"whale":0.12},"event_cap":0,"hwm":16217.27,"dd_threshold":0.8,"capped_count":0,"max_entry":0.95,"fee_rate":0.03,"slip":0.005,"lag_est_s":90,"fees_paid":2149.82,"equity":16254.8,"liquid":14204.88,"invested":2049.92,"reserve":0.0,"realized":15217.27,"pnl":15254.8,"unreal":37.53,"resolved_count":626,"wins":252,"losses":79,"refunds":29,"sold":266,"open_count":4,"missed_count":1,"wallets":[{"name":"Kruto2027","wallet":"0xe8ca3f758c93f44f3ec210542ab78afb7c0bcccb","bets":43,"won":9,"lost":5,"ref":1,"sold":28,"class":"volume","invested":0.0,"realized":1843.96,"conv_thr":108},{"name":"fortuneking","wallet":"0x86c878cde72660ec52f5e6f0f0438b76de8fc867","bets":87,"won":19,"lost":16,"ref":0,"sold":52,"class":"volume","invested":0.0,"realized":-2105.91,"conv_thr":892},{"name":"LSB1","wallet":"0x41558102a796ba971c7567cad41c307e59f8fa41","bets":192,"won":143,"lost":18,"ref":0,"sold":31,"class":"volume","invested":0.0,"realized":8598.86,"conv_thr":200},{"name":"imwalkinghere","wallet":"0xd96750bf8d941a8186e592b0ae6e096da66aa266","bets":139,"won":73,"lost":37,"ref":0,"sold":29,"class":"volume","invested":0.0,"realized":6364.81,"conv_thr":98},{"name":"iohihoo","wallet":"0xfc81760d44a21acc9fd4b749a5bf9a9b2eeae072","bets":27,"won":6,"lost":3,"ref":3,"sold":15,"class":"volume","invested":0.0,"realized":-324.94,"conv_thr":55},{"name":"Stavenson","wallet":"0xf5fe759cece500f58a431ef8dacea321f6e3e23d","bets":4,"won":0,"lost":0,"ref":0,"sold":4,"class":"volume","invested":0.0,"realized":219.84,"conv_thr":5130},{"name":"0x4bFb-whale","wallet":"0x73afc8160c17830c0c7281a7bf570c871455b880","bets":41,"won":2,"lost":0,"ref":0,"sold":39,"class":"volume","invested":0.0,"realized":829.7,"conv_thr":1089},{"name":"ArbTrader","wallet":"0x72e1597864456eda62878413cf3e60c332e4a45d","bets":97,"won":0,"lost":0,"ref":25,"sold":68,"class":"volume","invested":2049.92,"realized":-209.04,"conv_thr":99}],"current":[{"title":"Hanyi Liu vs. Aoran Wang: Total Sets O/U 2.5","name":"ArbTrader","outcome":"Over 2.5","stake":648.69,"val":652.05,"pnl":-6.52,"end":"2026-07-15"},{"title":"Liu vs. Wang: Set 1 Games O/U 10.5","name":"ArbTrader","outcome":"Over","stake":648.69,"val":704.53,"pnl":45.25,"end":"2026-07-15"},{"title":"Liu vs. Wang: Match O/U 23.5","name":"ArbTrader","outcome":"Over","stake":436.99,"val":439.26,"pnl":-4.39,"end":"2026-07-15"},{"title":"Liu vs. Wang: Set 1 Games O/U 8.5","name":"ArbTrader","outcome":"Under","stake":247.05,"val":254.09,"pnl":3.19,"end":"2026-07-15"}],"resolved":[{"title":"Exact Score: Any Other Score?","name":"LSB1","won":null,"status":"sold","stake":589.03,"pnl":644.18,"date":1783390478},{"title":"United States to score first vs. Belgium?","name":"LSB1","won":null,"status":"sold","stake":589.03,"pnl":74.57,"date":1783390477},{"title":"United States vs. Belgium: United States 1st Half O/U 0.5","name":"LSB1","won":null,"status":"sold","stake":217.48,"pnl":74.3,"date":1783390471},{"title":"United States vs. Belgium: 1st Half O/U 2.5","name":"LSB1","won":null,"status":"sold","stake":264.43,"pnl":50.35,"date":1783390471},{"title":"Will Belgium win on 2026-07-06?","name":"LSB1","won":null,"status":"sold","stake":589.03,"pnl":297.14,"date":1783390468},{"title":"Belgium leading at halftime?","name":"LSB1","won":null,"status":"sold","stake":224.25,"pnl":63.09,"date":1783390447},{"title":"United States vs. Belgium: Team to Advance","name":"LSB1","won":null,"status":"sold","stake":589.03,"pnl":215.37,"date":1783390348},{"title":"Exact Score: United States 2 - 1 Belgium?","name":"LSB1","won":null,"status":"sold","stake":589.03,"pnl":29.65,"date":1783390280},{"title":"Exact Score: United States 1 - 2 Belgium?","name":"LSB1","won":null,"status":"sold","stake":589.03,"pnl":42.77,"date":1783390258},{"title":"BK Hacken vs. Djurgardens IF: O/U 5.5","name":"LSB1","won":true,"status":"won","stake":569.91,"pnl":110.43,"date":1783310400},{"title":"Portugal vs. Spain: Will the Match Go to Extra Time?","name":"LSB1","won":true,"status":"won","stake":453.15,"pnl":367.58,"date":1783310400},{"title":"England to score first vs. Mexico?","name":"LSB1","won":null,"status":"sold","stake":556.91,"pnl":154.71,"date":1783308220},{"title":"Mexico vs. England: Both Teams to Score in First Half","name":"LSB1","won":null,"status":"sold","stake":556.91,"pnl":170.4,"date":1783307888},{"title":"IFK Goteborg vs. AIK: 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":201.22,"pnl":18.28,"date":1783224000},{"title":"Will US Yacoub El Mansour win on 2026-07-05?","name":"LSB1","won":true,"status":"won","stake":549.91,"pnl":91.46,"date":1783224000},{"title":"Exact Score: Brazil 0 - 0 Norway?","name":"LSB1","won":true,"status":"won","stake":553.57,"pnl":83.46,"date":1783224000},{"title":"Washington Spirit vs. Houston Dash: 2nd Half O/U 1.5","name":"Kruto2027","won":true,"status":"won","stake":126.02,"pnl":200.09,"date":1783137600},{"title":"Exact Score: Daejeon Hana Citizen FC 0 - 1 Bucheon FC 1995?","name":"LSB1","won":true,"status":"won","stake":541.88,"pnl":51.79,"date":1783137600},{"title":"Degerfors IF vs. Malmo FF: O/U 0.5","name":"LSB1","won":true,"status":"won","stake":543.95,"pnl":32.88,"date":1783137600},{"title":"Exact Score: Canada 0 - 2 Morocco?","name":"LSB1","won":true,"status":"won","stake":545.27,"pnl":97.83,"date":1783137600},{"title":"Washington Spirit vs. Houston Dash: Washington Spirit 2nd Half O/U 0.5","name":"Kruto2027","won":null,"status":"sold","stake":160.65,"pnl":41.47,"date":1783120436},{"title":"Exact Score: Australia 1 - 0 Egypt?","name":"LSB1","won":true,"status":"won","stake":517.71,"pnl":35.74,"date":1783051200},{"title":"Argentina vs. Cabo Verde: Will the Match Go to a Penalty Shootout?","name":"LSB1","won":false,"status":"lost","stake":454.18,"pnl":-462.92,"date":1783051200},{"title":"ITF Elvas: Elena Micic vs Han Shi","name":"fortuneking","won":null,"status":"sold","stake":579.6,"pnl":-590.41,"date":1783025933},{"title":"ITF Skopje: Nikola Kolyachev vs Vladyslav Orlov","name":"fortuneking","won":null,"status":"sold","stake":537.74,"pnl":239.15,"date":1783020142},{"title":"ITF Ajaccio: Robin Catry vs Clement Lemire","name":"fortuneking","won":null,"status":"sold","stake":537.74,"pnl":356.98,"date":1783010944},{"title":"Cary: Rei Sakamoto vs Timo Legout","name":"fortuneking","won":null,"status":"sold","stake":537.74,"pnl":458.04,"date":1783004962},{"title":"Bitcoin Up or Down - July 2, 1:10AM-1:15AM ET","name":"imwalkinghere","won":true,"status":"won","stake":237.67,"pnl":110.08,"date":1782964800},{"title":"Counter-Strike: Atreides vs Subtop De France (BO3) - CCT Europe Challengers Series Playoffs","name":"ArbTrader","won":false,"status":"refund","stake":537.74,"pnl":0.06,"date":1782964800},{"title":"Will COD Mekn\u00e8s win on 2026-07-02?","name":"LSB1","won":true,"status":"won","stake":570.34,"pnl":231.42,"date":1782964800},{"title":"Portugal to score first vs. Croatia?","name":"LSB1","won":true,"status":"won","stake":565.55,"pnl":72.02,"date":1782964800},{"title":"Exact Score: Portugal 1 - 1 Croatia?","name":"LSB1","won":true,"status":"won","stake":568.43,"pnl":84.58,"date":1782964800},{"title":"Exact Score: Portugal 1 - 2 Croatia?","name":"LSB1","won":true,"status":"won","stake":284.98,"pnl":13.12,"date":1782964800},{"title":"Exact Score: Portugal 2 - 1 Croatia?","name":"LSB1","won":false,"status":"lost","stake":572.34,"pnl":-575.73,"date":1782964800},{"title":"United States leading at halftime?","name":"LSB1","won":null,"status":"sold","stake":509.27,"pnl":601.5,"date":1782959318},{"title":"Rinderknech vs. Damm: Match O/U 40.5","name":"fortuneking","won":null,"status":"sold","stake":457.34,"pnl":802.79,"date":1782922660},{"title":"ITF Rabat: Florian Broska vs Matthieu Chambonniere","name":"fortuneking","won":null,"status":"sold","stake":457.34,"pnl":33.21,"date":1782918067},{"title":"Ecuador to score first vs. Mexico?","name":"LSB1","won":true,"status":"won","stake":447.18,"pnl":56.9,"date":1782878400},{"title":"Juli\u00e1n Qui\u00f1ones: 1+ goals","name":"LSB1","won":true,"status":"won","stake":345.87,"pnl":122.74,"date":1782878400},{"title":"Exact Score: Mexico 1 - 1 Ecuador?","name":"LSB1","won":true,"status":"won","stake":447.18,"pnl":74.34,"date":1782878400},{"title":"England vs. DR Congo: DR Congo 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":273.14,"pnl":50.92,"date":1782878400},{"title":"England vs. DR Congo: DR Congo O/U 0.5","name":"LSB1","won":true,"status":"won","stake":460.71,"pnl":236.23,"date":1782878400},{"title":"England to score first vs. DR Congo?","name":"LSB1","won":true,"status":"won","stake":470.16,"pnl":93.35,"date":1782878400},{"title":"England vs. DR Congo: Will the Match Go to Extra Time?","name":"LSB1","won":true,"status":"won","stake":280.74,"pnl":63.85,"date":1782878400},{"title":"Bitcoin Up or Down - July 1, 6:50PM-6:55PM ET","name":"imwalkinghere","won":true,"status":"won","stake":110.9,"pnl":17.98,"date":1782878400},{"title":"Bitcoin Up or Down - June 30, 7:55PM-8:00PM ET","name":"imwalkinghere","won":null,"status":"sold","stake":300.0,"pnl":210.44,"date":1782864046},{"title":"ITF Ajaccio: Louis Larue vs Laurent Lokoli","name":"fortuneking","won":null,"status":"sold","stake":456.66,"pnl":33.16,"date":1782852070},{"title":"Quito: Mwendwa Mbithi vs Matias Soto","name":"fortuneking","won":null,"status":"sold","stake":459.07,"pnl":-464.55,"date":1782851602},{"title":"Wimbledon ATP: Vit Kopriva vs Jan Choinski","name":"fortuneking","won":null,"status":"sold","stake":456.66,"pnl":-464.85,"date":1782849367},{"title":"Sonego vs. Etcheverry: Match O/U 40.5","name":"Kruto2027","won":null,"status":"sold","stake":165.69,"pnl":53.39,"date":1782845197},{"title":"ITF Nivelles: Eric Vanshelboim vs Niklas Schell","name":"ArbTrader","won":null,"status":"sold","stake":205.27,"pnl":17.93,"date":1782818348},{"title":"ITF Aix-Les-Bains: Yelyzaveta Kotliar vs Iva Ivanova","name":"ArbTrader","won":null,"status":"sold","stake":427.92,"pnl":35.13,"date":1782793576},{"title":"ITF Nivelles: Kimmer Coppejans vs Louis Wessels","name":"ArbTrader","won":null,"status":"sold","stake":205.27,"pnl":68.24,"date":1782793576},{"title":"Will Tesla deliver between 450000 and 475000 vehicles in Q2 2026","name":"iohihoo","won":true,"status":"won","stake":90.0,"pnl":6.37,"date":1782792000},{"title":"Will Tesla deliver 475000 or more vehicles in Q2 2026","name":"iohihoo","won":false,"status":"lost","stake":180.0,"pnl":-180.48,"date":1782792000},{"title":"Will Tesla deliver between 400000 and 425000 vehicles in Q2 2026","name":"iohihoo","won":false,"status":"lost","stake":54.69,"pnl":-55.26,"date":1782792000},{"title":"Will Claude Mythos 5 be restored for US customers by June 30?","name":"iohihoo","won":true,"status":"won","stake":128.35,"pnl":22.74,"date":1782792000},{"title":"Aleksandar Vu\u010di\u0107 out as Serbian President by June 30, 2026?","name":"iohihoo","won":true,"status":"won","stake":90.0,"pnl":10.55,"date":1782792000},{"title":"Will Morocco win on 2026-06-29?","name":"imwalkinghere","won":false,"status":"lost","stake":463.76,"pnl":-474.18,"date":1782792000},{"title":"Netherlands vs. Morocco: Both Teams to Score in Second Half","name":"LSB1","won":true,"status":"won","stake":471.25,"pnl":121.02,"date":1782792000}],"missed":[{"title":"Lyon: Nikolas Sanchez Izquierdo vs Luca Van Assche","name":"fortuneking","won":null,"status":"sold","stake":38.95,"capped":false,"pnl":86.06,"date":1781131560}],"missed_pnl":86.06} \ No newline at end of file +{"started":1780882666.183836,"updated":1783474666.184835,"days":30,"bank":1000.0,"stake":648.92,"stake_pct":0.04,"class_pct":{"volume":0.04,"whale":0.12},"event_cap":0,"hwm":16222.91,"dd_threshold":0.8,"capped_count":0,"max_entry":0.95,"fee_rate":0.03,"slip":0.005,"lag_est_s":90,"fees_paid":2150.4,"equity":16260.45,"liquid":14210.06,"invested":2050.4,"reserve":0.0,"realized":15222.91,"pnl":15260.45,"unreal":37.54,"resolved_count":626,"wins":252,"losses":79,"refunds":29,"sold":266,"open_count":4,"missed_count":1,"wallets":[{"name":"Kruto2027","wallet":"0xe8ca3f758c93f44f3ec210542ab78afb7c0bcccb","bets":43,"won":9,"lost":5,"ref":1,"sold":28,"class":"volume","invested":0.0,"realized":1843.99,"conv_thr":108},{"name":"fortuneking","wallet":"0x86c878cde72660ec52f5e6f0f0438b76de8fc867","bets":87,"won":19,"lost":16,"ref":0,"sold":52,"class":"volume","invested":0.0,"realized":-2107.27,"conv_thr":892},{"name":"LSB1","wallet":"0x41558102a796ba971c7567cad41c307e59f8fa41","bets":192,"won":143,"lost":18,"ref":0,"sold":31,"class":"volume","invested":0.0,"realized":8605.9,"conv_thr":200},{"name":"imwalkinghere","wallet":"0xd96750bf8d941a8186e592b0ae6e096da66aa266","bets":139,"won":73,"lost":37,"ref":0,"sold":29,"class":"volume","invested":0.0,"realized":6364.65,"conv_thr":98},{"name":"iohihoo","wallet":"0xfc81760d44a21acc9fd4b749a5bf9a9b2eeae072","bets":27,"won":6,"lost":3,"ref":3,"sold":15,"class":"volume","invested":0.0,"realized":-324.94,"conv_thr":55},{"name":"Stavenson","wallet":"0xf5fe759cece500f58a431ef8dacea321f6e3e23d","bets":4,"won":0,"lost":0,"ref":0,"sold":4,"class":"volume","invested":0.0,"realized":219.87,"conv_thr":5103},{"name":"0x4bFb-whale","wallet":"0x73afc8160c17830c0c7281a7bf570c871455b880","bets":41,"won":2,"lost":0,"ref":0,"sold":39,"class":"volume","invested":0.0,"realized":829.72,"conv_thr":1089},{"name":"ArbTrader","wallet":"0x72e1597864456eda62878413cf3e60c332e4a45d","bets":97,"won":0,"lost":0,"ref":25,"sold":68,"class":"volume","invested":2050.4,"realized":-209.0,"conv_thr":99}],"current":[{"title":"Hanyi Liu vs. Aoran Wang: Total Sets O/U 2.5","name":"ArbTrader","outcome":"Over 2.5","stake":648.92,"val":652.28,"pnl":-6.52,"end":"2026-07-15"},{"title":"Liu vs. Wang: Set 1 Games O/U 10.5","name":"ArbTrader","outcome":"Over","stake":648.92,"val":704.78,"pnl":45.26,"end":"2026-07-15"},{"title":"Liu vs. Wang: Match O/U 23.5","name":"ArbTrader","outcome":"Over","stake":436.99,"val":439.26,"pnl":-4.39,"end":"2026-07-15"},{"title":"Liu vs. Wang: Set 1 Games O/U 8.5","name":"ArbTrader","outcome":"Under","stake":247.05,"val":254.09,"pnl":3.19,"end":"2026-07-15"}],"resolved":[{"title":"Exact Score: Any Other Score?","name":"LSB1","won":null,"status":"sold","stake":589.24,"pnl":644.4,"date":1783390478},{"title":"United States to score first vs. Belgium?","name":"LSB1","won":null,"status":"sold","stake":589.24,"pnl":74.6,"date":1783390477},{"title":"United States vs. Belgium: United States 1st Half O/U 0.5","name":"LSB1","won":null,"status":"sold","stake":217.48,"pnl":74.3,"date":1783390471},{"title":"United States vs. Belgium: 1st Half O/U 2.5","name":"LSB1","won":null,"status":"sold","stake":264.43,"pnl":50.35,"date":1783390471},{"title":"Will Belgium win on 2026-07-06?","name":"LSB1","won":null,"status":"sold","stake":589.24,"pnl":297.24,"date":1783390468},{"title":"Belgium leading at halftime?","name":"LSB1","won":null,"status":"sold","stake":224.25,"pnl":63.09,"date":1783390447},{"title":"United States vs. Belgium: Team to Advance","name":"LSB1","won":null,"status":"sold","stake":589.24,"pnl":215.44,"date":1783390348},{"title":"Exact Score: United States 2 - 1 Belgium?","name":"LSB1","won":null,"status":"sold","stake":589.24,"pnl":29.66,"date":1783390280},{"title":"Exact Score: United States 1 - 2 Belgium?","name":"LSB1","won":null,"status":"sold","stake":589.24,"pnl":42.78,"date":1783390258},{"title":"BK Hacken vs. Djurgardens IF: O/U 5.5","name":"LSB1","won":true,"status":"won","stake":570.12,"pnl":110.47,"date":1783310400},{"title":"Portugal vs. Spain: Will the Match Go to Extra Time?","name":"LSB1","won":true,"status":"won","stake":453.15,"pnl":367.58,"date":1783310400},{"title":"England to score first vs. Mexico?","name":"LSB1","won":null,"status":"sold","stake":557.11,"pnl":154.76,"date":1783308220},{"title":"Mexico vs. England: Both Teams to Score in First Half","name":"LSB1","won":null,"status":"sold","stake":557.11,"pnl":170.46,"date":1783307888},{"title":"IFK Goteborg vs. AIK: 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":201.22,"pnl":18.28,"date":1783224000},{"title":"Will US Yacoub El Mansour win on 2026-07-05?","name":"LSB1","won":true,"status":"won","stake":550.11,"pnl":91.5,"date":1783224000},{"title":"Exact Score: Brazil 0 - 0 Norway?","name":"LSB1","won":true,"status":"won","stake":553.77,"pnl":83.49,"date":1783224000},{"title":"Washington Spirit vs. Houston Dash: 2nd Half O/U 1.5","name":"Kruto2027","won":true,"status":"won","stake":126.02,"pnl":200.09,"date":1783137600},{"title":"Exact Score: Daejeon Hana Citizen FC 0 - 1 Bucheon FC 1995?","name":"LSB1","won":true,"status":"won","stake":542.08,"pnl":51.81,"date":1783137600},{"title":"Degerfors IF vs. Malmo FF: O/U 0.5","name":"LSB1","won":true,"status":"won","stake":544.15,"pnl":32.89,"date":1783137600},{"title":"Exact Score: Canada 0 - 2 Morocco?","name":"LSB1","won":true,"status":"won","stake":545.47,"pnl":97.86,"date":1783137600},{"title":"Washington Spirit vs. Houston Dash: Washington Spirit 2nd Half O/U 0.5","name":"Kruto2027","won":null,"status":"sold","stake":160.65,"pnl":41.47,"date":1783120436},{"title":"Exact Score: Australia 1 - 0 Egypt?","name":"LSB1","won":true,"status":"won","stake":517.71,"pnl":35.74,"date":1783051200},{"title":"Argentina vs. Cabo Verde: Will the Match Go to a Penalty Shootout?","name":"LSB1","won":false,"status":"lost","stake":454.18,"pnl":-462.92,"date":1783051200},{"title":"ITF Elvas: Elena Micic vs Han Shi","name":"fortuneking","won":null,"status":"sold","stake":579.8,"pnl":-590.62,"date":1783025933},{"title":"ITF Skopje: Nikola Kolyachev vs Vladyslav Orlov","name":"fortuneking","won":null,"status":"sold","stake":537.93,"pnl":239.24,"date":1783020142},{"title":"ITF Ajaccio: Robin Catry vs Clement Lemire","name":"fortuneking","won":null,"status":"sold","stake":537.93,"pnl":357.11,"date":1783010944},{"title":"Cary: Rei Sakamoto vs Timo Legout","name":"fortuneking","won":null,"status":"sold","stake":537.93,"pnl":458.21,"date":1783004962},{"title":"Bitcoin Up or Down - July 2, 1:10AM-1:15AM ET","name":"imwalkinghere","won":true,"status":"won","stake":237.67,"pnl":110.08,"date":1782964800},{"title":"Counter-Strike: Atreides vs Subtop De France (BO3) - CCT Europe Challengers Series Playoffs","name":"ArbTrader","won":false,"status":"refund","stake":537.93,"pnl":0.06,"date":1782964800},{"title":"Will COD Mekn\u00e8s win on 2026-07-02?","name":"LSB1","won":true,"status":"won","stake":570.54,"pnl":231.5,"date":1782964800},{"title":"Portugal to score first vs. Croatia?","name":"LSB1","won":true,"status":"won","stake":565.75,"pnl":72.04,"date":1782964800},{"title":"Exact Score: Portugal 1 - 1 Croatia?","name":"LSB1","won":true,"status":"won","stake":568.63,"pnl":84.61,"date":1782964800},{"title":"Exact Score: Portugal 1 - 2 Croatia?","name":"LSB1","won":true,"status":"won","stake":284.98,"pnl":13.12,"date":1782964800},{"title":"Exact Score: Portugal 2 - 1 Croatia?","name":"LSB1","won":false,"status":"lost","stake":572.54,"pnl":-575.94,"date":1782964800},{"title":"United States leading at halftime?","name":"LSB1","won":null,"status":"sold","stake":509.46,"pnl":601.71,"date":1782959318},{"title":"Rinderknech vs. Damm: Match O/U 40.5","name":"fortuneking","won":null,"status":"sold","stake":457.55,"pnl":803.15,"date":1782922660},{"title":"ITF Rabat: Florian Broska vs Matthieu Chambonniere","name":"fortuneking","won":null,"status":"sold","stake":457.55,"pnl":33.22,"date":1782918067},{"title":"Ecuador to score first vs. Mexico?","name":"LSB1","won":true,"status":"won","stake":447.38,"pnl":56.93,"date":1782878400},{"title":"Juli\u00e1n Qui\u00f1ones: 1+ goals","name":"LSB1","won":true,"status":"won","stake":345.87,"pnl":122.74,"date":1782878400},{"title":"Exact Score: Mexico 1 - 1 Ecuador?","name":"LSB1","won":true,"status":"won","stake":447.38,"pnl":74.38,"date":1782878400},{"title":"England vs. DR Congo: DR Congo O/U 0.5","name":"LSB1","won":true,"status":"won","stake":458.87,"pnl":235.29,"date":1782878400},{"title":"England vs. DR Congo: DR Congo 1st Half O/U 0.5","name":"LSB1","won":true,"status":"won","stake":273.14,"pnl":50.92,"date":1782878400},{"title":"England to score first vs. DR Congo?","name":"LSB1","won":true,"status":"won","stake":470.32,"pnl":93.39,"date":1782878400},{"title":"England vs. DR Congo: Will the Match Go to Extra Time?","name":"LSB1","won":true,"status":"won","stake":280.74,"pnl":63.85,"date":1782878400},{"title":"Bitcoin Up or Down - July 1, 6:50PM-6:55PM ET","name":"imwalkinghere","won":true,"status":"won","stake":110.9,"pnl":17.98,"date":1782878400},{"title":"Bitcoin Up or Down - June 30, 7:55PM-8:00PM ET","name":"imwalkinghere","won":null,"status":"sold","stake":300.0,"pnl":210.44,"date":1782864046},{"title":"ITF Ajaccio: Louis Larue vs Laurent Lokoli","name":"fortuneking","won":null,"status":"sold","stake":456.87,"pnl":33.17,"date":1782852070},{"title":"Quito: Mwendwa Mbithi vs Matias Soto","name":"fortuneking","won":null,"status":"sold","stake":459.29,"pnl":-464.77,"date":1782851602},{"title":"Wimbledon ATP: Vit Kopriva vs Jan Choinski","name":"fortuneking","won":null,"status":"sold","stake":456.87,"pnl":-465.06,"date":1782849367},{"title":"Sonego vs. Etcheverry: Match O/U 40.5","name":"Kruto2027","won":null,"status":"sold","stake":165.69,"pnl":53.39,"date":1782845197},{"title":"ITF Nivelles: Eric Vanshelboim vs Niklas Schell","name":"ArbTrader","won":null,"status":"sold","stake":205.38,"pnl":17.94,"date":1782818348},{"title":"ITF Aix-Les-Bains: Yelyzaveta Kotliar vs Iva Ivanova","name":"ArbTrader","won":null,"status":"sold","stake":428.13,"pnl":35.15,"date":1782793576},{"title":"ITF Nivelles: Kimmer Coppejans vs Louis Wessels","name":"ArbTrader","won":null,"status":"sold","stake":205.38,"pnl":68.27,"date":1782793576},{"title":"Will Tesla deliver between 450000 and 475000 vehicles in Q2 2026","name":"iohihoo","won":true,"status":"won","stake":90.0,"pnl":6.37,"date":1782792000},{"title":"Will Tesla deliver 475000 or more vehicles in Q2 2026","name":"iohihoo","won":false,"status":"lost","stake":180.0,"pnl":-180.48,"date":1782792000},{"title":"Will Tesla deliver between 400000 and 425000 vehicles in Q2 2026","name":"iohihoo","won":false,"status":"lost","stake":54.69,"pnl":-55.26,"date":1782792000},{"title":"Will Claude Mythos 5 be restored for US customers by June 30?","name":"iohihoo","won":true,"status":"won","stake":128.35,"pnl":22.74,"date":1782792000},{"title":"Aleksandar Vu\u010di\u0107 out as Serbian President by June 30, 2026?","name":"iohihoo","won":true,"status":"won","stake":90.0,"pnl":10.55,"date":1782792000},{"title":"Will Morocco win on 2026-06-29?","name":"imwalkinghere","won":false,"status":"lost","stake":463.97,"pnl":-474.4,"date":1782792000},{"title":"Netherlands vs. Morocco: Both Teams to Score in Second Half","name":"LSB1","won":true,"status":"won","stake":471.47,"pnl":121.08,"date":1782792000}],"missed":[{"title":"Lyon: Nikolas Sanchez Izquierdo vs Luca Van Assche","name":"fortuneking","won":null,"status":"sold","stake":38.95,"capped":false,"pnl":86.06,"date":1781131560}],"missed_pnl":86.06} \ No newline at end of file diff --git a/live/portfolio.py b/live/portfolio.py index 84a957b6..c50156d6 100644 --- a/live/portfolio.py +++ b/live/portfolio.py @@ -235,6 +235,25 @@ def window_bets(): "won": None, "res_t": 0, "exit_t": cx["ts"], "exit_p": cx["exit_p"], "title": cx.get("title") or ""}) + # abandoned losers/winners: conviction bets entered in-window that the + # signal held to a decided outcome and never redeemed (curPrice 0/1 in + # /positions). Not trusted rows, not in /closed-positions -> the replay + # missed them and read optimistic. Settle at the decided outcome (a loser + # pays 0 = full loss), same fold-in as the sharps table. + for asset, r in resolved_unredeemed(w["wallet"]).items(): + cond = r["cond"] + if cond in best or not cond: + continue # already a trusted row / round trip + if (r["iv"] or 0) < thr or r["p"] > MAX_ENTRY: + continue + et = ent.get(cond) + if not et or et < START: + continue + best[cond] = None + out.append({"wallet": w["wallet"], "name": w["name"], "cond": cond, + "asset": asset, "cls": w.get("class", "volume"), + "their": r["iv"], "entry_t": et, "p": r["p"], + "won": r["curp"] >= 0.5, "res_t": r["res_t"]}) # chain-truth payouts for the replayed markets: refunds pay 0.5/share, and # a cache `won` mark can be wrong on operator-resolved markets — the # replay must settle at what a redeem actually pays (see payouts.py) @@ -251,6 +270,47 @@ def closed_positions(wallet): return cache.closed_exits(wallet) +def _end_ts(s): + if not s: + return 0 + s = s.replace("Z", "") + for fmt in ("%Y-%m-%dT%H:%M:%S", "%Y-%m-%d"): + try: + return int(time.mktime(time.strptime(s, fmt))) + except ValueError: + continue + return 0 + + +def resolved_unredeemed(wallet): + """Conviction bets the signal LOST (or won) and never redeemed — they sit in + /positions at curPrice pinned 0/1, are NOT in /closed-positions, and for + operator-resolved markets are NOT trusted rows either, so the replay never + saw them. Mostly ABANDONED LOSERS. Folding them in is the same anti- + survivorship correction the sharps table uses (_open_split) — without it the + backtest silently drops these losses and reads optimistic. + {asset: {cond, iv, p, curp, res_t}}.""" + out = {} + for off in range(0, 100000, 50): + pg = sm.get_json("/positions", {"user": wallet, "limit": 50, "offset": off, + "sizeThreshold": 0}) + if not pg: + break + for pos in pg: + cp = pos.get("curPrice", 0) or 0 + asset = pos.get("asset") + if not asset or 0.001 < cp < 0.999: # genuinely open -> not decided + continue + out[asset] = {"cond": pos.get("conditionId"), + "iv": pos.get("initialValue") or 0, + "p": max(0.001, min(0.999, pos.get("avgPrice") or 0)), + "curp": cp, + "res_t": _end_ts(pos.get("endDate")) or int(time.time())} + if len(pg) < 50: + break + return out + + def open_bets(): """Currently-held conviction positions (live /positions pull, small) for the 'current bets' panel — the cache only has resolved bets."""