Commit Graph

66 Commits

Author SHA1 Message Date
copybot[bot] 35be73fa1c copybot: paper poll [skip ci] 2026-06-27 07:27:36 +00:00
copybot[bot] 8095725765 copybot: paper poll [skip ci] 2026-06-27 04:15:44 +00:00
copybot[bot] 828a17c22c copybot: paper poll [skip ci] 2026-06-27 00:13:58 +00:00
copybot[bot] 0cb1e74227 copybot: paper poll [skip ci] 2026-06-26 23:02:09 +00:00
copybot[bot] 7ae5639e4d copybot: paper poll [skip ci] 2026-06-26 21:58:24 +00:00
copybot[bot] 6240c4c126 copybot: paper poll [skip ci] 2026-06-26 20:54:51 +00:00
copybot[bot] 4f358581ce copybot: paper poll [skip ci] 2026-06-26 19:13:37 +00:00
copybot[bot] aa170cba4a copybot: paper poll [skip ci] 2026-06-26 17:26:12 +00:00
jaxperro ecd629fd5a live: daily refresh — skilled + sharp wallets [skip ci] 2026-06-26 11:21:47 -06:00
copybot[bot] fb070b346a copybot: paper poll [skip ci] 2026-06-26 15:53:54 +00:00
copybot[bot] 9e34356aba copybot: paper poll [skip ci] 2026-06-26 13:34:32 +00:00
copybot[bot] 60e9b76988 copybot: paper poll [skip ci] 2026-06-26 11:35:08 +00:00
copybot[bot] 93dc60796d copybot: paper poll [skip ci] 2026-06-26 08:52:45 +00:00
copybot[bot] 468d4445d1 copybot: paper poll [skip ci] 2026-06-26 05:57:21 +00:00
copybot[bot] 19f2eac444 copybot: paper poll [skip ci] 2026-06-26 01:51:32 +00:00
copybot[bot] a5ed1353d4 copybot: paper poll [skip ci] 2026-06-25 23:40:41 +00:00
copybot[bot] 4fa9fee97e copybot: paper poll [skip ci] 2026-06-25 22:07:44 +00:00
copybot[bot] 7f4e5da098 copybot: paper poll [skip ci] 2026-06-25 20:35:15 +00:00
copybot[bot] a152f0c6fe copybot: paper poll [skip ci] 2026-06-25 18:42:32 +00:00
jaxperro 2946ac9170 copybot: 24/7 paper copy-trade test + live dashboard feed
Push-or-poll copy bot (FollowFilter conviction gate + copytrade engine),
cash-gated $1k book, resolution settling, lag/slippage logging, FOK live
orders, on-chain redeem. Runs free 24/7 via GitHub Actions (--poll-once
cron) and publishes live/copybot_live.json for the trading dashboard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 12:41:56 -06:00
jaxperro 9afa759c2d live: daily refresh — skilled + sharp wallets [skip ci] 2026-06-25 10:12:26 -06:00
jaxperro 7f70cbee06 live: daily refresh — skilled + sharp wallets [skip ci] 2026-06-24 10:30:39 -06:00
jaxperro 92fe276737 live: expose per-wallet conv_thr in portfolio.json (for live current-bets)
Adds each followed wallet's cache p80 conviction threshold so the dashboard
can filter LIVE open positions the same way the server does.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 15:16:13 -06:00
jaxperro 87a956a059 live: reset paper portfolio to a forward test starting 2026-06-23
Set portfolio.py START to today so the $1k book tracks these wallets from
now forward (clean forward test, no in-sample backfill). Equity resets to
~$1,000; the daily run fills it in as bets resolve.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 15:00:11 -06:00
jaxperro 28fdf7f42b docs: document copy-positive selection, Copy P&L, cache-based portfolio
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>
2026-06-23 14:51:04 -06:00
jaxperro 9cbafabfdd live: precompute the $1k paper portfolio off the cache (portfolio.py)
New portfolio.py replays the followed wallets' conviction bets ($1k/$50,
hold-to-resolution) from cache.duckdb — which has res_t, so capital
RECYCLES at the true resolution time (no client-side clob storms, no
phantom-locked capital) and covers the full bet history (~40 pages, not
the browser's 4). Writes portfolio.json (equity, splits, current/
resolved/missed tables, per-wallet); wired into daily.sh + publish. The
dashboard now renders the top page from this feed (1 request) with the
client-side replay kept as a fallback.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 14:43:50 -06:00
jaxperro 4b9488be9d live: select sharps by copyability, not lead time (surfaces new holders)
Replace the blunt 24h lead gate with a copy-replay selection run on EVERY
conviction wallet: keep only those that are copy-positive AND have a
genuine hold-to-resolution edge (held_pnl>0, held win-rate>=55% over >=8
resolved held bets), active in 30d, with a light >=1h lead floor vs true
snipers. display_stats now splits copy P&L into scalp vs held legs and
uses fresh-positions resolution (clob fallback) so it's cheap enough to
run on all ~229 wallets.

Effect: drops scalper-traps whose win% looked great but lose copied
(ArbTrader, iohihoo, S888, ttj01) and the old lead gate's discards;
surfaces fast-resolving copy-positive holders it used to throw away
(raid3r, 0x6d1A94f4, 0xec1d07e5, mantaray, earthisgood, shisan...).
14 copy-positive holders now in watch_sharps.json.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:31:41 -06:00
jaxperro 8b1ccb93fc live: commit dashboard.html each daily run (keep tree clean)
The daily run regenerates dashboard.html but the publish step never
committed it, leaving it perpetually modified. Add it to the publish git
add list and commit the current snapshot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:46:20 -06:00
jaxperro 0bb3192321 docs: document Copy P&L finding (position win% != copyability)
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>
2026-06-23 12:45:29 -06:00
jaxperro 66f4229e3d live: add authoritative Copy P&L to the sharp feed
display_stats now computes copy_pnl: what a flat-$50 copier of a wallet's
conviction bets ACTUALLY realizes since Jun 1 — replays their entries,
mirrors their exits, and settles held bets at AUTHORITATIVE clob
resolution (winner by token_id). This is the truth for copyability and
exposes scalpers whose position win% looks great but lose when copied
(ArbTrader 99.5% conv win but -$793 copy; iohihoo 88.7% but -$749).

Position win%/record/P&L stay on the cache (large 180d sample). Added a
clob resolver (_clob_winner) + activity-replay; only Kruto2027 (+1184),
S888, oliman2, fortuneking (+430) etc. are positive to copy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:13:42 -06:00
jaxperro 8a07d0d365 live: drop sharps inactive >30d from the feed
validate_timing now filters the sharp list to wallets that have traded in
the last 30 days (last_trade from the /activity pull), so watch_sharps.json
only lists currently-active sharps — not just hidden client-side. Dropped
10 of 41 on this run (-> 31 active). The dashboard keeps its own 30d filter
as a safety net for daily-stale feeds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 11:18:41 -06:00
jaxperro 8dc00e44b3 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>
2026-06-23 10:57:22 -06:00
jaxperro 09cea51974 live: ping Discord when the daily pipeline finishes
daily.sh now POSTs a summary (finish time, sharp count, push status) to a
Discord webhook after the publish step. The webhook URL is read from the
gitignored config.json (daily_webhook key) so it never lands in the public
repo; the ping is skipped if the key is absent. Sends a browser User-Agent
(Discord 403s requests without one).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 10:51:31 -06:00
jaxperro 902fcc525a live: daily refresh — skilled + sharp wallets [skip ci] 2026-06-23 10:33:29 -06:00
jaxperro 3fe29a63aa live: daily refresh — skilled + sharp wallets [skip ci] 2026-06-22 21:56:32 -06:00
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