mirror of
https://github.com/jaxperro/winning-wallet-finder.git
synced 2026-07-27 15:57:47 +00:00
research: copy_age_slices (T10) — inconclusive at n<=15/cell; 6-24h bucket positive both books (age~market-type confound noted); reruns as fills accrue
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""T10 EXPLORATORY (2026-07-23) — market-age copy weighting: do sharp
|
||||||
|
entries on freshly-listed markets (books young, thin, unopinionated) carry
|
||||||
|
more edge than steady-state copies? Age proxy = signal_ts − first print on
|
||||||
|
the cond in the tape (complete coverage; markets older than the tape era
|
||||||
|
bucket as 'pre-tape'). Chain-true grading; parity-era BUY fills both
|
||||||
|
books. Output: EV by age bucket → a follow-filter weight if a gradient
|
||||||
|
exists (kill: no gradient at n>=30/bucket)."""
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
import tape # noqa: E402
|
||||||
|
import forward as fwd # noqa: E402
|
||||||
|
|
||||||
|
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
PARITY_T0 = 1784260140
|
||||||
|
BUCKETS = [(0, 3600, "<1h"), (3600, 6 * 3600, "1-6h"),
|
||||||
|
(6 * 3600, 86400, "6-24h"), (86400, 3 * 86400, "1-3d"),
|
||||||
|
(3 * 86400, 1e12, ">3d")]
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
db = tape.connect()
|
||||||
|
tape.build_resolved(db)
|
||||||
|
t_lo, = db.execute("SELECT min(ts) FROM trades").fetchone()
|
||||||
|
fills = []
|
||||||
|
for path, book in ((os.path.join(ROOT, "copybot_fills.jsonl"), "paper"),
|
||||||
|
(os.path.join(ROOT, "copybot_fills.live.jsonl"), "live")):
|
||||||
|
for ln in open(path):
|
||||||
|
r = json.loads(ln)
|
||||||
|
if (r.get("side") == "SELL" or r.get("untracked")
|
||||||
|
or r.get("ts", 0) < PARITY_T0 or not r.get("my_price")):
|
||||||
|
continue
|
||||||
|
r["_book"] = book
|
||||||
|
fills.append(r)
|
||||||
|
pays = fwd.payouts_for(db, [str(f["token"]) for f in fills])
|
||||||
|
rows = []
|
||||||
|
for f in fills:
|
||||||
|
pay = pays.get(str(f["token"]))
|
||||||
|
if pay is None or pay == 0.5:
|
||||||
|
continue
|
||||||
|
first, = db.execute(
|
||||||
|
"SELECT min(ts) FROM trades WHERE asset = ?",
|
||||||
|
[str(f["token"])]).fetchone()
|
||||||
|
if first is None:
|
||||||
|
continue
|
||||||
|
age = f["ts"] - first
|
||||||
|
pre_tape = first <= t_lo + 3600 # market predates tape coverage
|
||||||
|
rows.append({"book": f["_book"], "age": age, "pre": pre_tape,
|
||||||
|
"px": f["my_price"],
|
||||||
|
"ev": 100.0 / f["my_price"] * (pay - f["my_price"]),
|
||||||
|
"win": pay == 1.0})
|
||||||
|
print(f"chain-graded parity fills: {len(rows)}")
|
||||||
|
|
||||||
|
def line(tag, rs):
|
||||||
|
if not rs:
|
||||||
|
return
|
||||||
|
n = len(rs)
|
||||||
|
print(f" {tag:<10} n={n:<4} EV/$100 "
|
||||||
|
f"{sum(r['ev'] for r in rs)/n:+7.2f} · hit "
|
||||||
|
f"{sum(r['win'] for r in rs)/n:.2f} · avg px "
|
||||||
|
f"{sum(r['px'] for r in rs)/n:.2f}")
|
||||||
|
|
||||||
|
for book in ("paper", "live"):
|
||||||
|
rs = [r for r in rows if r["book"] == book]
|
||||||
|
print(f"\n== {book.upper()} ==")
|
||||||
|
line("pre-tape", [r for r in rs if r["pre"]])
|
||||||
|
fresh = [r for r in rs if not r["pre"]]
|
||||||
|
for lo, hi, tag in BUCKETS:
|
||||||
|
line(tag, [r for r in fresh if lo <= r["age"] < hi])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user