live: add 30-day conviction stats to the sharp feed

display_stats now emits conv30_win/won/lost/pnl — conviction (top-20%)
bets resolved in the last 30 days — for a new "30 Day Conv Record" column
on the dashboard alongside the lifetime record.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jaxperro
2026-06-23 10:57:22 -06:00
parent 09cea51974
commit 8dc00e44b3
2 changed files with 175 additions and 4 deletions
+7
View File
@@ -14,6 +14,7 @@ it doesn't matter: either way the window is too tight to mirror.
import json
import os
import statistics as st
import time
from concurrent.futures import ThreadPoolExecutor
import cache
@@ -46,10 +47,16 @@ def display_stats(w):
conv = [b for b in bets if b["size"] >= thr] # ALL conviction bets
won = sum(1 for b in conv if b["won"])
recent = sorted(bets, key=lambda b: b["res_t"] or 0, reverse=True)[:500] # last 500 resolved
cut30 = time.time() - 30 * 86400
conv30 = [b for b in conv if (b["res_t"] or 0) >= cut30] # conviction bets resolved in last 30d
won30 = sum(1 for b in conv30 if b["won"])
out = {
"conv_win": round(100 * won / len(conv), 1) if conv else None,
"conv_won": won, "conv_lost": len(conv) - won,
"conv_pnl": round(sum(_bet_pnl(b) for b in conv)),
"conv30_win": round(100 * won30 / len(conv30), 1) if conv30 else None,
"conv30_won": won30, "conv30_lost": len(conv30) - won30,
"conv30_pnl": round(sum(_bet_pnl(b) for b in conv30)),
"realized_pnl": round(sum(_bet_pnl(b) for b in recent)),
"avg_bet": round(sum(b["size"] for b in conv) / len(conv)) if conv else 0, # avg conviction stake
"name": None, "last_trade": 0, "last_conv_bet": 0,
+168 -4
View File
@@ -16,6 +16,10 @@
"conv_won": 91,
"conv_lost": 24,
"conv_pnl": 1422,
"conv30_win": 66.7,
"conv30_won": 4,
"conv30_lost": 2,
"conv30_pnl": 460,
"realized_pnl": 1091,
"avg_bet": 37,
"last_trade": 1782086444,
@@ -38,6 +42,10 @@
"conv_won": 398,
"conv_lost": 2,
"conv_pnl": 410412,
"conv30_win": 100.0,
"conv30_won": 138,
"conv30_lost": 0,
"conv30_pnl": 163104,
"realized_pnl": 234921,
"avg_bet": 1044,
"last_trade": 1782231248,
@@ -60,6 +68,10 @@
"conv_won": 38,
"conv_lost": 1,
"conv_pnl": 452,
"conv30_win": 100.0,
"conv30_won": 8,
"conv30_lost": 0,
"conv30_pnl": 109,
"realized_pnl": 754,
"avg_bet": 17,
"last_trade": 1782074558,
@@ -82,6 +94,10 @@
"conv_won": 196,
"conv_lost": 25,
"conv_pnl": 14270,
"conv30_win": 88.0,
"conv30_won": 66,
"conv30_lost": 9,
"conv30_pnl": 5061,
"realized_pnl": 11965,
"avg_bet": 116,
"last_trade": 1782219238,
@@ -104,6 +120,10 @@
"conv_won": 208,
"conv_lost": 78,
"conv_pnl": 109204,
"conv30_win": 75.5,
"conv30_won": 37,
"conv30_lost": 12,
"conv30_pnl": 28179,
"realized_pnl": 41615,
"avg_bet": 772,
"last_trade": 1782200713,
@@ -126,6 +146,10 @@
"conv_won": 21,
"conv_lost": 7,
"conv_pnl": 28463,
"conv30_win": 71.4,
"conv30_won": 5,
"conv30_lost": 2,
"conv30_pnl": 381,
"realized_pnl": 28463,
"avg_bet": 143,
"last_trade": 1781425081,
@@ -148,6 +172,10 @@
"conv_won": 104,
"conv_lost": 42,
"conv_pnl": 49192,
"conv30_win": 86.7,
"conv30_won": 13,
"conv30_lost": 2,
"conv30_pnl": 10357,
"realized_pnl": 39533,
"avg_bet": 1485,
"last_trade": 1782206200,
@@ -170,9 +198,13 @@
"conv_won": 454,
"conv_lost": 110,
"conv_pnl": 8422,
"conv30_win": 82.7,
"conv30_won": 163,
"conv30_lost": 34,
"conv30_pnl": 4413,
"realized_pnl": 4261,
"avg_bet": 83,
"last_trade": 1782231833,
"last_trade": 1782233780,
"last_conv_bet": 1782228299
},
{
@@ -192,6 +224,10 @@
"conv_won": 286,
"conv_lost": 88,
"conv_pnl": 116332,
"conv30_win": 77.3,
"conv30_won": 75,
"conv30_lost": 22,
"conv30_pnl": 72324,
"realized_pnl": 105542,
"avg_bet": 2704,
"last_trade": 1782227731,
@@ -214,6 +250,10 @@
"conv_won": 235,
"conv_lost": 101,
"conv_pnl": 217800,
"conv30_win": 72.4,
"conv30_won": 97,
"conv30_lost": 37,
"conv30_pnl": 161996,
"realized_pnl": 148652,
"avg_bet": 3408,
"last_trade": 1782232124,
@@ -236,9 +276,13 @@
"conv_won": 368,
"conv_lost": 128,
"conv_pnl": 177827,
"conv30_win": 72.5,
"conv30_won": 219,
"conv30_lost": 83,
"conv30_pnl": 138747,
"realized_pnl": 52510,
"avg_bet": 1225,
"last_trade": 1782232162,
"last_trade": 1782233770,
"last_conv_bet": 1782218009
},
{
@@ -258,6 +302,10 @@
"conv_won": 521,
"conv_lost": 211,
"conv_pnl": 1324,
"conv30_win": 68.4,
"conv30_won": 154,
"conv30_lost": 71,
"conv30_pnl": 826,
"realized_pnl": 365,
"avg_bet": 18,
"last_trade": 1782184066,
@@ -280,6 +328,10 @@
"conv_won": 245,
"conv_lost": 33,
"conv_pnl": 7969,
"conv30_win": 89.7,
"conv30_won": 52,
"conv30_lost": 6,
"conv30_pnl": 1772,
"realized_pnl": -526,
"avg_bet": 113,
"last_trade": 1782066605,
@@ -302,6 +354,10 @@
"conv_won": 340,
"conv_lost": 118,
"conv_pnl": 82671,
"conv30_win": 69.8,
"conv30_won": 60,
"conv30_lost": 26,
"conv30_pnl": 8580,
"realized_pnl": 15558,
"avg_bet": 962,
"last_trade": 1782229096,
@@ -324,6 +380,10 @@
"conv_won": 286,
"conv_lost": 117,
"conv_pnl": 13089,
"conv30_win": 81.0,
"conv30_won": 64,
"conv30_lost": 15,
"conv30_pnl": 2269,
"realized_pnl": 8234,
"avg_bet": 219,
"last_trade": 1782218036,
@@ -346,6 +406,10 @@
"conv_won": 132,
"conv_lost": 26,
"conv_pnl": 10296,
"conv30_win": 88.0,
"conv30_won": 66,
"conv30_lost": 9,
"conv30_pnl": 4685,
"realized_pnl": 12076,
"avg_bet": 391,
"last_trade": 1782229109,
@@ -368,6 +432,10 @@
"conv_won": 88,
"conv_lost": 26,
"conv_pnl": 366,
"conv30_win": 76.4,
"conv30_won": 42,
"conv30_lost": 13,
"conv30_pnl": 192,
"realized_pnl": 299,
"avg_bet": 18,
"last_trade": 1782188413,
@@ -390,6 +458,10 @@
"conv_won": 303,
"conv_lost": 116,
"conv_pnl": 273,
"conv30_win": 60.4,
"conv30_won": 29,
"conv30_lost": 19,
"conv30_pnl": 1,
"realized_pnl": 70,
"avg_bet": 2,
"last_trade": 1781678395,
@@ -412,6 +484,10 @@
"conv_won": 542,
"conv_lost": 245,
"conv_pnl": 3164,
"conv30_win": 68.1,
"conv30_won": 237,
"conv30_lost": 111,
"conv30_pnl": 2381,
"realized_pnl": 1576,
"avg_bet": 40,
"last_trade": 1781962112,
@@ -434,6 +510,10 @@
"conv_won": 258,
"conv_lost": 141,
"conv_pnl": 6916,
"conv30_win": 64.4,
"conv30_won": 38,
"conv30_lost": 21,
"conv30_pnl": 886,
"realized_pnl": 1147,
"avg_bet": 150,
"last_trade": 1782224383,
@@ -456,6 +536,10 @@
"conv_won": 357,
"conv_lost": 101,
"conv_pnl": 674,
"conv30_win": 76.4,
"conv30_won": 133,
"conv30_lost": 41,
"conv30_pnl": 68,
"realized_pnl": -128,
"avg_bet": 26,
"last_trade": 1782184708,
@@ -478,10 +562,14 @@
"conv_won": 263,
"conv_lost": 82,
"conv_pnl": 138225,
"conv30_win": 70.2,
"conv30_won": 85,
"conv30_lost": 36,
"conv30_pnl": 35454,
"realized_pnl": 37451,
"avg_bet": 2484,
"last_trade": 1782232316,
"last_conv_bet": 1782230615
"last_trade": 1782233554,
"last_conv_bet": 1782233554
},
{
"wallet": "0x3f3f747bbabb6eb97174c687f2a89ea32dd9c912",
@@ -500,6 +588,10 @@
"conv_won": 59,
"conv_lost": 28,
"conv_pnl": 278,
"conv30_win": 36.4,
"conv30_won": 4,
"conv30_lost": 7,
"conv30_pnl": 87,
"realized_pnl": 198,
"avg_bet": 20,
"last_trade": 1782094532,
@@ -522,6 +614,10 @@
"conv_won": 149,
"conv_lost": 53,
"conv_pnl": 1361,
"conv30_win": 56.4,
"conv30_won": 22,
"conv30_lost": 17,
"conv30_pnl": -135,
"realized_pnl": 273,
"avg_bet": 30,
"last_trade": 1776841226,
@@ -544,6 +640,10 @@
"conv_won": 264,
"conv_lost": 149,
"conv_pnl": 1197,
"conv30_win": 53.5,
"conv30_won": 54,
"conv30_lost": 47,
"conv30_pnl": 137,
"realized_pnl": 602,
"avg_bet": 30,
"last_trade": 1781181048,
@@ -566,6 +666,10 @@
"conv_won": 97,
"conv_lost": 42,
"conv_pnl": 439,
"conv30_win": 57.1,
"conv30_won": 28,
"conv30_lost": 21,
"conv30_pnl": 206,
"realized_pnl": 480,
"avg_bet": 26,
"last_trade": 1780942468,
@@ -588,6 +692,10 @@
"conv_won": 23,
"conv_lost": 9,
"conv_pnl": 6482,
"conv30_win": 77.8,
"conv30_won": 7,
"conv30_lost": 2,
"conv30_pnl": -493,
"realized_pnl": 6481,
"avg_bet": 105,
"last_trade": 1781273640,
@@ -610,6 +718,10 @@
"conv_won": 32,
"conv_lost": 23,
"conv_pnl": 54,
"conv30_win": 42.1,
"conv30_won": 8,
"conv30_lost": 11,
"conv30_pnl": -195,
"realized_pnl": 164,
"avg_bet": 18,
"last_trade": 1782041146,
@@ -632,6 +744,10 @@
"conv_won": 20,
"conv_lost": 16,
"conv_pnl": 52,
"conv30_win": 46.7,
"conv30_won": 7,
"conv30_lost": 8,
"conv30_pnl": -29,
"realized_pnl": -5,
"avg_bet": 11,
"last_trade": 1782218137,
@@ -654,6 +770,10 @@
"conv_won": 13,
"conv_lost": 2,
"conv_pnl": 16,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 2,
"avg_bet": 2,
"last_trade": 1777296238,
@@ -676,6 +796,10 @@
"conv_won": 57,
"conv_lost": 8,
"conv_pnl": 30,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": -28,
"avg_bet": 1,
"last_trade": 1773803415,
@@ -698,6 +822,10 @@
"conv_won": 55,
"conv_lost": 14,
"conv_pnl": 97,
"conv30_win": 100.0,
"conv30_won": 1,
"conv30_lost": 0,
"conv30_pnl": 2,
"realized_pnl": 37,
"avg_bet": 9,
"last_trade": 1779366328,
@@ -720,6 +848,10 @@
"conv_won": 37,
"conv_lost": 6,
"conv_pnl": 13,
"conv30_win": 100.0,
"conv30_won": 3,
"conv30_lost": 0,
"conv30_pnl": 4,
"realized_pnl": 0,
"avg_bet": 1,
"last_trade": 1781567076,
@@ -742,6 +874,10 @@
"conv_won": 66,
"conv_lost": 31,
"conv_pnl": 1178,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 1003,
"avg_bet": 54,
"last_trade": 1776356722,
@@ -764,6 +900,10 @@
"conv_won": 662,
"conv_lost": 230,
"conv_pnl": 230,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 169,
"avg_bet": 1,
"last_trade": 1776542460,
@@ -786,6 +926,10 @@
"conv_won": 113,
"conv_lost": 31,
"conv_pnl": 318,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 79,
"avg_bet": 14,
"last_trade": 1774991519,
@@ -808,6 +952,10 @@
"conv_won": 434,
"conv_lost": 68,
"conv_pnl": 11348,
"conv30_win": 85.7,
"conv30_won": 12,
"conv30_lost": 2,
"conv30_pnl": 235,
"realized_pnl": 407,
"avg_bet": 155,
"last_trade": 1779471986,
@@ -830,6 +978,10 @@
"conv_won": 295,
"conv_lost": 132,
"conv_pnl": 9894,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 1065,
"avg_bet": 218,
"last_trade": 1775772965,
@@ -852,6 +1004,10 @@
"conv_won": 435,
"conv_lost": 219,
"conv_pnl": 17481,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 2094,
"avg_bet": 406,
"last_trade": 1772982581,
@@ -874,6 +1030,10 @@
"conv_won": 259,
"conv_lost": 124,
"conv_pnl": 4147,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 1540,
"avg_bet": 76,
"last_trade": 1780485735,
@@ -896,6 +1056,10 @@
"conv_won": 421,
"conv_lost": 169,
"conv_pnl": 41548,
"conv30_win": null,
"conv30_won": 0,
"conv30_lost": 0,
"conv30_pnl": 0,
"realized_pnl": 10278,
"avg_bet": 936,
"last_trade": 1781531343,