mirror of
https://github.com/jaxperro/winning-wallet-finder.git
synced 2026-08-05 04:07:46 +00:00
2ee8e79d00
The lead-time gate in validate_timing.py is a COPYABILITY heuristic, not proof of inside information: a short entry->resolution lead can be a genuine insider OR just someone who trades fast-resolving markets (live sports, hourly) well — indistinguishable, and irrelevant for copy purposes since either way the window is too tight to mirror. Rename the verdict accordingly. Gate unchanged (median lead >=24h to count as a copyable sharp; 50 sharps). Docs updated to current p80 numbers (218 profile matches, 62/83 forward-profitable, 50 sharps). The genuine insider-detection scanner (insider.py, z-score / Bubblemaps fingerprint) keeps its name — that's a different, correctly-named thing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
77 lines
3.2 KiB
Python
77 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Last-minute-vs-sharp check on the standout conviction wallets.
|
|
|
|
This is a COPYABILITY heuristic, not proof of inside information: a near-100%
|
|
win rate is only useful to us if we can actually mirror it. The tell is entry->
|
|
resolution lead time on their WINNING conviction bets:
|
|
* mostly < 1h before resolution -> last-minute, you can't follow it in time
|
|
* hours-to-days of lead -> a sharp you could actually mirror
|
|
A short lead can mean a genuine insider OR just someone who trades fast-resolving
|
|
markets (live sports, hourly) well — we can't tell which, and for copy purposes
|
|
it doesn't matter: either way the window is too tight to mirror.
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import statistics as st
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
|
import cache
|
|
|
|
HERE = os.path.dirname(__file__)
|
|
COPYABLE_MED_LEAD = 24.0 # median lead (h) on winning conviction bets to count as copyable
|
|
|
|
|
|
def lead_profile(w):
|
|
ent = cache.get_entries(w)
|
|
bets = cache.get_bets(w)
|
|
cut = cache.conv_cutoff(b["size"] for b in bets) # this wallet's top-20% stake cutoff
|
|
leads = [(b["res_t"] - ent[b["cond"]]) / 3600.0 for b in bets
|
|
if b["won"] and (b["size"] or 0) >= cut and b["cond"] in ent
|
|
and b["res_t"] and b["res_t"] >= ent[b["cond"]]]
|
|
if not leads:
|
|
return None
|
|
med = st.median(leads)
|
|
u6 = sum(1 for l in leads if l < 6) / len(leads)
|
|
verdict = ("last-minute" if (med < 6 or sum(1 for l in leads if l < 1) / len(leads) > 0.5)
|
|
else "borderline" if med < COPYABLE_MED_LEAD else "sharp")
|
|
return dict(n=len(leads), med=med, u6=u6, verdict=verdict)
|
|
|
|
|
|
def main():
|
|
conv = json.load(open(os.path.join(HERE, "conviction_wallets.json")))
|
|
print(f"validating timing on {len(conv)} conviction wallets…\n", flush=True)
|
|
with ThreadPoolExecutor(max_workers=10) as ex:
|
|
profs = list(ex.map(lambda c: (c, lead_profile(c["wallet"])), conv))
|
|
|
|
sharps = []
|
|
for c, p in profs:
|
|
if p:
|
|
c["med_lead_h"] = round(p["med"], 1)
|
|
c["timing"] = p["verdict"]
|
|
if p["verdict"] == "sharp":
|
|
sharps.append(c)
|
|
sharps.sort(key=lambda c: (c["fwd_conv_roi"] is not None, c.get("fwd_conv_roi") or -9,
|
|
c["train_conv_roi"]), reverse=True)
|
|
|
|
counts = {}
|
|
for c, p in profs:
|
|
counts[p["verdict"] if p else "no-data"] = counts.get(p["verdict"] if p else "no-data", 0) + 1
|
|
print(f"timing breakdown: {counts}")
|
|
print(f"COPYABLE SHARPS (median lead >= {COPYABLE_MED_LEAD:.0f}h): {len(sharps)}\n")
|
|
|
|
h = (f"{'tr_win':>7}{'tr_roi':>7}{'medLeadH':>9}{'fw_win':>7}{'fw_roi':>7}{'fw_n':>5} wallet")
|
|
print(h); print("-" * len(h))
|
|
for c in sharps[:30]:
|
|
fw = f"{c['fwd_win']:.0f}%" if c["fwd_win"] is not None else "—"
|
|
fr = f"{c['fwd_conv_roi']:+.0%}" if c["fwd_conv_roi"] is not None else "—"
|
|
print(f"{c['train_win']:>6.0f}%{c['train_conv_roi']:>+6.0%}{c['med_lead_h']:>9.0f}"
|
|
f"{fw:>7}{fr:>7}{c['fwd_n']:>5} {c['wallet']}")
|
|
|
|
json.dump(sharps, open(os.path.join(HERE, "watch_sharps.json"), "w"), indent=2)
|
|
print(f"\n-> watch_sharps.json ({len(sharps)} copyable sharps, last-minute wallets filtered out)")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|