1"""Export 1-minute continuous Treasury futures (raw, i.e. unadjusted front-contract splice) to data/cache/futures_1m/.23One Parquet file per root × block of years. Also exports the daily ratio-adjusted continuous series (for roll checks).4Run on M3U96a: .venv/bin/python scripts/01_extract_futures.py5"""6from __future__ import annotations7import json, sys, time8from pathlib import Path9sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))10from wp47.findata import export1112ROOTS = ["ZT", "ZF", "ZN", "TN", "US", "UB"]13BLOCKS = [("2008-01-01", "2013-12-31"), ("2014-01-01", "2019-12-31"), ("2020-01-01", "2026-12-31")]14CACHE = Path(__file__).resolve().parents[1] / "data" / "cache"15log = []16for root in ROOTS:17 for a, b in BLOCKS:18 dest = CACHE / "futures_1m" / f"{root}_{a[:4]}_{b[:4]}.parquet"19 if dest.exists():20 continue21 t0 = time.time()22 info = export("market_bars.futures.1m.continuous_raw", [root], a, b, dest)23 info.update(root=root, start=a, end=b, seconds=round(time.time() - t0, 1), file=str(dest.name))24 print(json.dumps(info), flush=True)25 log.append(info)26for ds in ("market_bars.futures.1d.continuous_raw", "market_bars.futures.1d.continuous_ratio"):27 for a, b in (("2008-01-01", "2017-12-31"), ("2018-01-01", "2026-12-31")):28 dest = CACHE / "futures_1d" / f"{ds.split('.')[-1]}_{a[:4]}_{b[:4]}.parquet"29 if not dest.exists():30 info = export(ds, ROOTS, a, b, dest)31 info.update(dataset=ds, file=dest.name)32 print(json.dumps(info), flush=True)33 log.append(info)34(CACHE / "extract_log.jsonl").open("a").write("".join(json.dumps(x) + "\n" for x in log))35print("done")36