3631 Commits

Author SHA1 Message Date
jaxperro ee3d3d1e9a live: add avg_bet (mean conviction stake) to the sharp feed
display_stats now emits avg_bet = average stake of the wallet's
conviction (top-20%) bets, for a new dashboard column after the P&L
columns.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 21:19:34 -06:00
jaxperro 37817d380a live: precompute all sharp-table stats into watch_sharps.json
validate_timing.py now writes name, conv_win, conv_won/lost, conv_pnl,
realized_pnl, last_conv_bet and last_trade per sharp, so the dashboard
reads everything from the feed in ONE request instead of 3 data-api
calls per wallet (no more rate-limit storms). Stats come from the cache
(survivorship-correct): conviction win%/record/P&L over ALL of the
wallet's top-20%-stake bets; realized P&L over the last 500 resolved
bets. Resolved P&L per bet = stake*(1-p)/p if won else -stake.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:51:18 -06:00
jaxperro 6cde76768e live: fix enumerate.py infinite loop past gamma's offset cap
recent_markets() only stopped on end-of-data (page <100) or MAX_SCAN.
When gamma 422s past its max offset, every page in a wave returns "ERR"
and is skipped — so `scanned` never grows and `ended` never trips,
spinning forever. This wedged every daily.sh run at "scanned 2,100…"
(step 1/6), so the cron never actually completed. Now bail after a
second consecutive all-error wave (one is tolerated; _page already
retries transient errors).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:25:44 -06:00
jaxperro 3190dee803 live: daily.sh regenerates + publishes the sharp list
Add the sharps pipeline (conviction_scan.py + validate_timing.py) to the
daily run so watch_sharps.json self-updates, and a publish step that
commits + pushes the refreshed outputs (watch_skilled / watch_sharps /
conviction_wallets) so the live dashboard at jaxperro.com/trading picks
up the new set. Also force-refresh the sharps watchlist (not just
skilled) before the cache top-up for accurate forward stats. Publish
does pull --rebase before push so a diverged remote can't wedge it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:09:23 -06:00
jaxperro 2ee8e79d00 rename timing "insider" verdict -> "last-minute" (honest label)
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>
2026-06-22 14:55:43 -06:00
jaxperro 1cbe1a67b9 conviction = per-wallet top-20% stake (p80), not flat $200
Swap the flat $200 conviction cutoff for a per-wallet percentile (top
20% of each wallet's own stake sizes) everywhere it was used:

- cache.py: canonical CONV_PCTILE=0.80 + conv_cutoff() helper (matches
  the dashboard's pctl: filter >0, sort, linear interp)
- conviction_scan.py: per-wallet quantile_cont(size,0.8) in SQL, was
  `size >= 200`
- validate_timing.py, pnl_focused.py: use cache.conv_cutoff

Rationale + validation: p80 reproduces flat-$200's win-rate lift on the
sharps while adapting to scale (a whale's $200 isn't conviction, a
minnow's is). Re-running the pipeline under p80: scan finds 218 profile
wallets (was 69), forward 62/83 profitable (p~0), +16% pooled ROI — edge
persists out-of-sample. Regenerated conviction_wallets.json /
watch_sharps.json; docs updated. skill.py/strategy.py/insider.py
untouched (score over all bets / size as copyability heuristic only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:47:39 -06:00
jaxperro dc5195e373 docs: document conviction-profile scan + timing gate + 23 copyable sharps
README/FINDINGS/live-README now cover the repeatable find: score high-conviction
(>=$200) bets, validate forward (25/37 profitable, p=0.024), then a lead-time
gate drops uncopyable insiders -> 23 validated copyable sharps shown live on
jaxperro.com/trading.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 09:43:27 -06:00
jaxperro d116b25d52 live: conviction-profile scan + insider-vs-sharp timing validation
conviction_scan.py finds wallets whose high-conviction (>=$200) bets win on
uncertain (~0.4-0.6) markets — real edge, not favorite-riding — trained pre-June
and validated June (25/37 stayed profitable forward, p=0.024). validate_timing.py
applies the entry->resolution lead-time gate that separates copyable sharps from
uncopyable insiders: of 69 matches, 21 were insiders (lead <6h), leaving 23
validated copyable sharps (watch_sharps.json) now shown on jaxperro.com/trading.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:22:50 -06:00
jaxperro 0c7d97c5d0 live: train/test wallet-selection study + capital-constrained copy sims
strategy.py (train pre-May-30 / test June1+ on copy-ROI + z + consistency +
diversification) and followability.py (entry-time/lead-time/cadence filter)
surface wallets with real, copyable, out-of-sample edge (49/77 profitable
forward, p=0.011, +23.4% pooled).

pnl_basket.py / pnl_focused.py add $1000 capital-constrained copy sims with
missed-trade accounting: the broad basket loses (can't follow 1,200 trades on
$1k), but 1-2 wallets + a conviction (bet-size) filter clears out-of-sample.
cache.py gains entry-time caching. Findings documented.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 16:38:41 -06:00
jaxperro 3d0bc7f001 Add live/ skilled-wallet scanner + cache; document clean OOS finding
live/: operationalizes the LBS/Yale "skilled ~3%" result against the live
data-api. Enumerate recent liquid markets -> top traders -> candidate pool;
cache every wallet's resolved bets once in DuckDB (~26k wallets / 12.5M bets,
keyed by per-bet resolution time so any cutoff re-scores in seconds); 5-gate
skill funnel (n>=15, z>0, BH-FDR, split-half OOS, MM/bot cap); dashboard +
daily refresh.

Key finding: copying the high-win-rate "favorite-rider" cohort looks +23.6%
in-sample but loses -7.4% once selected on pre-June-1 data only (99% -> 68%
win rate) — selection bias, reproducing the paper's "lucky winners revert"
result on live data. Win rate != edge, again.

wide/: bulk subgraph->DuckDB scanner (survivorship-bias-free over all wallets),
but the public subgraph is frozen at Jan 2026 -> historical tool only.

Large local data (*.duckdb, candidates.json, *_scored.json, history/) gitignored.
README + FINDINGS updated with the current logic and the clean result.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:16:20 -06:00
jaxperro 413e8eeb6c README: document the full live system (Discord watcher + paper tracker)
Brings the README current with the deployed pieces: the push-based Discord
watcher and the live $1,000 client-side paper portfolio at jaxperro.com/trading
(enter-on-entry, hold-to-resolution, Liquid/Invested/Realized/Missed). Updates
the pipeline diagram and tools table; notes the capital-constraint finding the
tracker surfaced.
2026-06-13 21:16:10 -04:00
jaxperro 0ac6b9be7c watch.json: trim to 4 sharpest wallets (Famecesgoal, JAMJAMJAM4, Domerina, MyLastStand), re-weighted by z
Drops the market-maker bots (paspor, donthackme), the longshot lottery
(qqqq88888), and the un-followable in-game trader (Xixihaha008). Concentrates
on high-z, followable, non-bot wallets.
2026-06-13 21:10:56 -04:00
jaxperro 3e57588c38 watch.json: add edge-weights (z x copyability) used by the /trading tracker 2026-06-13 17:33:41 -04:00
jaxperro 41f422ab17 Add Railway/Nixpacks build config (requirements.txt, nixpacks.toml, runtime.txt)
Pure-stdlib repo had no language signal, so Nixpacks failed to build an image.
requirements.txt (empty) triggers Python detection; nixpacks.toml pins python311
and sets the start command to the webhook receiver.
2026-06-13 17:01:43 -04:00
jaxperro bc09a8231f gitignore generated scan outputs (huntwide.csv, logs) 2026-06-13 16:59:30 -04:00
jaxperro f176ba134a Rebrand to Winning Wallet Finder; commit validation scripts; dev-friendly docs
- Add copyback.py (in-sample copy backtest), oos.py (out-of-sample test),
  huntwide.py (wide insider sweep) — completes the detect→hunt→validate→watch
  pipeline.
- Rewrite README around Winning Wallet Finder: the z-score idea explained, how
  the pieces fit, quickstart, data sources, live-watcher setup, honest verdict.
- Extend FINDINGS with the insider-detection results and the in-sample vs
  out-of-sample copy verdict (+545% in-sample collapsed to one-wallet variance
  out-of-sample).
- Refresh config.example.json to the current schema (discord/alchemy/watch).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:59:18 -04:00
jaxperro 2a30975325 webhook_receiver: add User-Agent to Discord POST (Discord 403s default urllib UA) 2026-06-13 16:52:03 -04:00
jaxperro 079fbf1787 Add push-based wallet trade watcher (Alchemy webhook -> Discord)
webhook_receiver.py: zero-dep stdlib HTTP server that receives Alchemy
Address-Activity webhook POSTs, confirms/enriches the trade via Polymarket
data-API, and pushes a Discord alert — fires only on a real trade, no polling.
Cloud-ready: secrets via env (DISCORD_WEBHOOK, ALCHEMY_SIGNING_KEY), non-secret
watch list in committed watch.json, binds to $PORT, /health endpoint,
optional HMAC signature verification, in-memory dedup. Procfile for one-command
deploy. config.json (secrets) stays gitignored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:49:55 -04:00
jaxperro c1265c5461 Add ring-hunt sweep (hunt.py) over news-driven event markets
Sweeps a list of insider-prone markets, scores each market's top traders with
insider.analyze, and runs funding-cluster ring detection. First real hunt
flagged DREAMBIG. (z=8.9, p~2e-19) and qcp14 (z=5.3, p~4e-8) on the Iran
ceasefire-extension market — insider-grade improbability — with no operator
rings (all independently/exchange-funded; exchange-funded wallets aren't
linkable, a known limit).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 13:15:09 -04:00
jaxperro 34d02956d8 Archive dead-end strategies; add FINDINGS.md write-up
Moved the 8 tested-and-failed strategy tools into archive/ (copytrade, backtest,
edge_research, lookback, table_77, lp_screener, lp_paper, xarb) with an
archive/README explaining each. Root now holds the keepers: insider.py (made
self-sufficient — dropped the copytrade load_json dependency) and smart_money.py
(data foundation). New FINDINGS.md is the honest scorecard: six systematic
public-data edges all efficient/illusory, the win-rate survivorship-bias
finding, and the one real signal (z-score improbability + funding clustering).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 13:09:56 -04:00
jaxperro 93b0c8c94e insider.py: implement funding-cluster ring detection via Alchemy
Pulls each wallet's USDC funding history (alchemy_getAssetTransfers, full
history, no 10k-block cap) and links wallets sharing a funder = likely same
operator. Critical refinement: a shared funder only counts if its OWN outbound
degree is small (personal hub <=15 recipients); exchanges/bridges fan out to
hundreds and must be excluded or everything false-links. Verified: the 10
watchlist wallets shared 11 infra funders (Coinbase-style) and looked like one
ring until the degree filter correctly cleared them to independent.

Runs automatically after --market/--scan when alchemy_key is in config.json
(gitignored). README updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 13:05:57 -04:00
jaxperro e1ee7d13e7 Add insider/sharp detector (insider.py) — the one real edge signal
Replicates the Bubblemaps / 60 Minutes per-wallet insider methodology on the
public data API:
- Improbability z-score / p-value: wins vs the wins entry odds imply (beating
  the market's own pricing) — the rigorous edge metric the project was after,
  unlike biased win-rate or variance-driven PnL
- Pre-resolution timing, fresh-wallet (/traded count), sizing signals
- Scoring GATED by improbability so losing sports bettors (entering <24h before
  a game is normal) no longer false-flag
- Modes: --scan leaderboard, --market <conditionId|slug> (score a market's
  traders, the Bubblemaps approach), --wallet deep profile

Findings: leaderboard has no extreme insiders (max z~2.3, high-vol sharps);
scanning a market's traders surfaces real edges (e.g. arimnestos z=4.0 p~3e-5
over 2205 bets). Funding-cluster linking needs a Polygonscan/Alchemy key
(public RPC getLogs capped at 10k blocks). README documents methodology +
the project-wide conclusion.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 12:51:28 -04:00
jaxperro 7536379023 Add cross-venue scanner (xarb.py); verdict: PM<->Kalshi is efficient
xarb.py pulls Polymarket (Gamma) + Kalshi (elections API, ~65k markets),
matches the same contract (token overlap + same resolution month + exact
numeric match on thresholds/scores/dates), and computes both arb directions
with Kalshi's 0.07*P*(1-P) taker fee.

Verified verdict: no retail cross-venue arb. On liquid, identical, cleanly-
matched contracts the venues agree to ~1c and locking both sides costs >$1
after fees (worked example: Brazil-Morocco BTTS, PM 0.46/0.47 vs Kalshi
0.47/0.48 -> every direction negative). The big apparent edges are false
matches, illiquid wide-spread markets, or stale snapshot timing.

README now records the full project conclusion: six systematic public-data
edges tested, all efficient/illusory. Durable edge needs speed/infra, private
information, or liquidity provision -- not a turnkey public-data scanner.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 12:31:34 -04:00
jaxperro 63ed98912f lp_paper: harden reward/fill modeling and long-run robustness
Fixes that removed optimistic bias and fragility before extended runs:
- enforce min_size: only accrue rewards (and only screen markets) where our
  per-side size actually qualifies — at $1k split many ways, the fattest
  pools are unreachable, which the screen now reflects honestly
- handle Polymarket's Q_min: skip markets priced outside 0.10-0.90, and score
  single-sided quoting at 1/3 share
- price-aware inventory cap + capped fills so one fill at a low price can't
  overshoot the intended position and distort the bleed
- cap dt per poll so a stall/sleep can't over-credit rewards
- wrap the periodic re-screen in try/except so a network blip can't kill an
  overnight run

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 11:40:45 -04:00
jaxperro e1b6e2f2ae lp_paper: rotate markets on re-screen, bank rotated-out P&L
The loop screened once and quoted the same markets forever; short-lived
prop markets would resolve and silently stop earning. Now it re-screens every
--refresh seconds, drops markets that fell out of the fresh set (banking their
rewards+inventory into a retired accumulator), and adds fresh ones — so
cumulative net survives rotation over multi-day runs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 11:29:48 -04:00
jaxperro a410845fd5 Add paper liquidity-provision loop (lp_paper.py)
Simulates two-sided quoting on the screener's top low-vol markets against the
live order book, tracking net = rewards accrued - adverse-selection bleed.
Clean cash + mark-to-market accounting; fills modeled when midpoint crosses a
resting quote (slightly pessimistic on fill rate); rewards accrue by
score-share of each pool. Discord summaries + state persistence so it can run
for days. This is the decisive, no-money test before any funded/hosted bot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 11:21:21 -04:00
jaxperro d1ca52a33f Add liquidity-rewards market screener (lp_screener.py)
Ranks Polymarket's ~8000 reward-eligible markets by risk-adjusted LP yield:
reward pool / order-book competition near mid (gross APR for a $1000
two-sided position), penalized by 24h midpoint volatility (adverse-selection
proxy) and time-to-resolution. One-shot snapshot -> lp_markets.csv. README
documents the rewards mechanics, the screener, and the open caveats before
the paper LP loop. Generated data files gitignored.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 11:01:26 -04:00
jaxperro 34b39fa1ba Add edge-research tooling and document the full research log
Adds edge_research.py (scan ~2000 wallets for reliable/copyable weekly edge),
lookback.py (long-window half-split out-of-sample read), and table_77.py
(aggregate a wallet set to CSV). README now leads with a research log
capturing the key findings: win-rate survivorship bias, win-rate != EV,
flat-size copying is -EV, the reliable edge is rare and skews to young
accounts, and ROI is inversely related to bet size. Generated data files are
gitignored.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 00:22:10 -04:00
jaxperro a426b8bb05 Fix survivorship-biased win rate; add backtest, per-position cap, Discord alerts
The scanner measured win rate over /closed-positions only, but Polymarket
only redeems winning shares — losers sit unredeemed in /positions at
curPrice 0 and never enter closed-positions. That made win rates wildly
inflated (e.g. 90.6% vs a true 48.3%). Win rate now unions both endpoints
over a 90-day window. With the honest metric, ~no top wallet exceeds ~60%;
true rates cluster near 50%.

Also:
- backtest.py: replay a watchlist over a recent window, fill at historical
  price, mark outcomes from resolution. A 7d run of 4 top wallets returned
  -48%, confirming flat-size entry-copying is -EV at ~50% hit rates.
- copytrade.py: add max_position_usd cap (proportional adds could otherwise
  balloon one position to the whole exposure limit) and Discord webhook
  alerts on every would-be trade.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 23:25:59 -04:00
jaxperro 8bc0a5c85b Add copy-trade engine: mirror watched wallets' entries and exits
Watches a wallet list and copies trades onto your account: % -of-bankroll
sizing, proportional entry/exit mirroring, 5% price guard, and a no-backfill
rule for positions held before start. Paper mode by default; live trading is
gated behind config + --live + a typed confirmation, with hard risk caps
(per-trade, daily, total exposure, open positions, price bounds). Live
execution via py-clob-client (lazy import). Credentials/state gitignored.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 22:36:22 -04:00
jaxperro 5ed55009b5 Polymarket smart money tracker: find >75% win-rate wallets betting weekly
Dashboard + terminal tool that pulls the 7d/30d/all leaderboards, measures
each wallet's win rate over its most recent resolved bets, and its distinct
markets traded per week. Zero dependencies (Python 3 stdlib only).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 22:03:00 -04:00