jgrusewski
b5301a0fff
feat(carry): 1m worst_basis ingest (binance.vision) + intraday-liquidation charge in carry accounting (Parquet side-store)
Charges the carry book's INTRADAY basis-squeeze / liquidation tail that the
daily-close basis accounting was blind to (probed: LUNAUSDT 2022-05-12 intraday
worst_basis ≈ −163% vs daily-close −0.7%).
- application/worst_basis.py — PURE cumulative-MAE: {epoch_day: worst_basis} =
min over the day's aligned minutes of Σ(spot_1m_ret − perp_1m_ret).
- adapters/data/binance_vision_klines.py — resumable/cached 1m monthly-kline
fetch+parse → {epoch_ms: close}; µs→ms, missing month = empty (no crash),
injectable fetch (no network in tests).
- adapters/persistence/worst_basis_store.py — Parquet SIDE-STORE (duckdb I/O,
NOT the warehouse → no single-writer contention) with load/write round-trip.
- paper_book.carry_return_by_symbol — optional worst_basis_by_symbol overrides
the daily-close basis with max(worst_basis, −1.0) (capped at total leg loss);
absent → daily-close basis, bit-identical. Threaded through paper_backfill
(worst_basis_by_date) + paper_snapshot (worst_basis) + assets, live==replay.
- CLI: fxhnt ingest-worst-basis --symbols <list|@file> --from --to (resumable).
- TDD: LUNA-pattern fixture, parquet round-trip, charge+cap+fallback, absent=
bit-identical backfill curve. Full suite 812 passed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:38:51 +02:00
..
2026-06-14 21:44:16 +02:00
2026-06-18 09:09:01 +02:00
2026-06-18 23:54:17 +02:00
2026-06-18 18:39:24 +02:00
2026-06-18 18:39:24 +02:00
2026-06-19 00:22:46 +02:00
2026-06-19 00:18:14 +02:00
2026-06-19 08:12:51 +02:00
2026-06-19 23:16:17 +02:00
2026-06-15 11:16:25 +02:00
2026-06-14 17:39:29 +02:00
2026-06-19 19:38:19 +02:00
2026-06-22 12:23:33 +02:00
2026-06-18 23:02:00 +02:00
2026-06-22 15:00:00 +02:00
2026-06-20 22:53:03 +02:00
2026-06-23 10:53:15 +02:00
2026-06-13 09:35:18 +02:00
2026-06-14 23:40:56 +02:00
2026-06-18 10:16:27 +02:00
2026-06-18 18:48:41 +02:00
2026-06-16 22:27:26 +02:00
2026-06-09 13:52:32 +02:00
2026-06-14 21:27:23 +02:00
2026-06-14 20:24:50 +02:00
2026-06-14 20:24:50 +02:00
2026-06-13 02:01:04 +02:00
2026-06-14 12:30:07 +02:00
2026-06-09 19:28:08 +02:00
2026-06-20 22:27:19 +02:00
2026-06-14 11:56:01 +02:00
2026-06-19 23:22:15 +02:00
2026-06-14 20:54:16 +02:00
2026-06-19 20:11:02 +02:00
2026-06-22 12:31:37 +02:00
2026-06-14 20:54:16 +02:00
2026-06-17 01:37:29 +02:00
2026-06-23 13:38:51 +02:00
2026-06-16 08:38:29 +02:00
2026-06-15 11:40:39 +02:00
2026-06-22 15:00:00 +02:00
2026-06-23 10:16:45 +02:00
2026-06-23 13:38:51 +02:00
2026-06-22 10:17:46 +02:00
2026-06-22 10:05:21 +02:00
2026-06-22 22:11:11 +02:00
2026-06-22 17:00:42 +02:00
2026-06-22 09:59:02 +02:00
2026-06-21 21:24:18 +02:00
2026-06-21 21:06:51 +02:00
2026-06-21 21:19:59 +02:00
2026-06-22 08:15:31 +02:00
2026-06-21 23:39:40 +02:00
2026-06-23 13:38:51 +02:00
2026-06-23 10:53:15 +02:00
2026-06-18 20:56:50 +02:00
2026-06-22 10:11:39 +02:00
2026-06-21 19:49:36 +02:00
2026-06-09 16:22:59 +02:00
2026-06-14 21:27:23 +02:00
2026-06-09 12:21:47 +02:00
2026-06-13 01:20:53 +02:00
2026-06-22 15:25:22 +02:00
2026-06-23 01:17:38 +02:00
2026-06-21 10:22:43 +02:00
2026-06-09 19:24:07 +02:00
2026-06-16 08:50:25 +02:00
2026-06-16 17:35:51 +02:00
2026-06-16 17:45:46 +02:00
2026-06-19 20:11:02 +02:00
2026-06-23 01:17:38 +02:00
2026-06-21 00:38:12 +02:00
2026-06-20 20:21:20 +02:00
2026-06-21 22:23:51 +02:00
2026-06-15 19:20:30 +02:00
2026-06-15 00:34:55 +02:00
2026-06-15 11:11:57 +02:00
2026-06-14 20:37:54 +02:00
2026-06-20 22:53:03 +02:00
2026-06-22 12:37:37 +02:00
2026-06-19 07:45:45 +02:00