Files
winning-wallet-finder_github/research/copy_age_slices.py
T

77 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()