Operating cheat-sheet (add/remove live wallets, backtest, promote, logs,
deploys, digest, real-money); 8am schedule; follow set points at
copybot.paper.json as source of truth; diagram gains trust.py + rolling
replay; sizing docs reflect the their-bet ceiling (cap/reserve retired);
auto p80 floors; gotcha 9 (endDate rewrites + invalidate deletion);
research numbers updated to the trusted-row era.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* per-trade Discord pings removed everywhere: copybot placement/settle/startup
alerts silenced (engine.webhook forced off), webhook_receiver.py archived,
Procfile removed. The ONLY Discord output is now live/discord_daily.py at the
end of the daily pipeline: one embed listing every watch_sharps wallet with a
Polymarket profile link + 30D conviction win% / record / P&L.
* trust.py fixes found on the first scheduled run (sharp list collapsed 25->7):
- Polymarket rewrites endDate after resolution, so freshly re-pulled wallets'
corrected res_t stopped matching the stale cross-wallet consensus
(374/454 of iohihoo's rows wrongly distrusted). v2 rows with resolved=TRUE
are now self-certifying (resolved=TRUE implies endDate-based res_t observed
post-end) — consensus only gates legacy rows.
- daily.sh invalidates watchlist wallets by DELETING their pulled row; a
transiently failed re-pull then dropped the wallet's entire history from
the trusted set (the 0x73afc816 whale vanished). Legacy rows of wallets
missing from pulled now fall back to trusting markets resolved >=14d ago.
Re-run: 85 conviction wallets, 34 copy-positive sharps — whale/iohihoo/
Stavenson/LSB1/Kruto all recovered.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two data bugs were hiding the best copy targets (FINDINGS 'The holder
blind spot'):
* live/trust.py (new): only score rows whose res_t matches the market's
consensus resolution time across >=2 wallets, pulled after resolution,
resolved != False. Kills the res_t=ts fallback poison that let scalpers
masquerade as 99%-win holders (ArbTraderRookie's rows were 100% this).
* conviction_scan.py: trusted rows only; p80 conviction cutoff from the
train window only (look-ahead leak); new gates z_all>2 (whole-book z,
~doubles pooled forward copy-ROI) and median conviction stake >=$50
(dust filter). 55 wallets selected, forward 30/38 profitable, +21.4%
pooled (was 284 selected, +16.0%).
* validate_timing.py: the held-edge gates now read the trailing-90d
trusted conviction record via trust.conviction_record instead of the
replay's held leg, which is structurally ~all-unresolved for week-lead
holders (whale 0x73afc816 showed 'held 0-0, 21 unresolved' and was
rejected at 100% fwd win). 25 copy-positive holders now, including
Stavenson (51-0), the whale (112-4) and iohihoo (98-10).
* cache.py: query() helper so trust.py shares the single in-process
connection instead of fighting the single-writer lock.
* README: gotcha 8 (fake res_t/won) + candidate next data sources
(Goldsky pipelines, PolymarketData order books, Pinnacle CLV,
Polysights); FINDINGS: dated section correcting the iohihoo/ArbTrader
scalper-trap verdicts as winner=False-bug artifacts.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Proportional add-mirroring was unbounded after max_position_usd was lifted -
fortuneking doubling into his own bet took one game to $90 on a $42-stake
book (2.15 stakes). Adds now only top a position up to stake_usd(); the
backtest was already one-market-one-stake, so bot and model agree again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Realism section updated (0.95 entry cap, asymmetric guard, measured lag);
new gotchas list leads with the CLOB winner=False semantics that caused the
2026-07-02 settle bug.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root README now leads with what actually runs (Mac daily pipeline, Railway
copybot worker, Discord watcher, static dashboard), the July live test, the
realism model (fees/lag/dynamic sizing/missed-bet ledger), a new-developer
quickstart, secrets map, and file map; research story condensed with current
numbers (12 fee-aware sharps, +531% in-sample backfill clearly labeled).
live/README: fee-aware selection, dynamic-sizing portfolio, three dashboard
feeds, copybot now 24/7 on Railway (was "in progress").
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Update the dev-facing docs so others can follow the current system:
- live/README: copy-positive-holder selection (replaces lead-time gate),
Copy P&L as the copyability metric, new Paper portfolio (portfolio.py)
+ Dashboard feeds (watch_sharps.json / portfolio.json) sections, the
full 8-step daily flow, the cache rolling-180d/replace retention gotcha,
and a Copy execution (copybot/sync_floors, separate WIP) note.
- README: top portfolio is now precomputed off the cache (correct
recycling), judge by Copy P&L not win%, copy execution is separate.
- FINDINGS: capital-recycling / $1k-book section + repo-layout refresh.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
README/FINDINGS/live/README updated for today's discovery: the sharps
win% is a position snapshot that over-counts scalpers; copy_pnl (flat-$50
replay, authoritative clob resolution) is the real copyability signal.
Most "sharps" lose copied; only Kruto2027 + fortuneking are copy-positive
(now the tracked pair). Refreshed stale counts (50 -> ~31 after the
30d-active filter) and noted position-level conviction.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
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>
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>
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>
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.
- 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>