SPB Git

spb/wp47_uqo

Public
2.2 KB · 28 lines python
1"""Export 1-minute SR3 (3-month SOFR) continuous raw, and build SR3 daily returns on yield days (same conventions as 03)."""2import sys, json3from pathlib import Path4import numpy as np, pandas as pd, polars as pl5ROOT = Path(__file__).resolve().parents[1]; sys.path.insert(0, str(ROOT / "src"))6from wp47.findata import export7from wp47.returns import load_root_1m, roll_days, minute_returns, yield_day_bounds, assign_yield_day8CACHE = ROOT / "data/cache"9for a, b in (("2018-01-01", "2026-12-31"),):10    dest = CACHE / "futures_1m" / f"SR3_{a[:4]}_{b[:4]}.parquet"11    if not dest.exists(): print(json.dumps(export("market_bars.futures.1m.continuous_raw", ["SR3"], a, b, dest)))12for ds in ("market_bars.futures.1d.continuous_raw", "market_bars.futures.1d.continuous_ratio"):13    dest = CACHE / "futures_1d" / f"{ds.split('.')[-1]}_SR3_2018_2026.parquet"14    if not dest.exists(): print(json.dumps(export(ds, ["SR3"], "2018-01-01", "2026-12-31", dest)))15# roll days for SR3 from its own daily files16raw = pl.read_parquet(CACHE / "futures_1d/continuous_raw_SR3_2018_2026.parquet").select(["session_date", "close"]).sort("session_date").to_pandas().set_index("session_date")["close"]17adj = pl.read_parquet(CACHE / "futures_1d/continuous_ratio_SR3_2018_2026.parquet").select(["session_date", "close"]).sort("session_date").to_pandas().set_index("session_date")["close"]18d = (np.log(raw).diff() - np.log(adj).diff().reindex(raw.index)).abs()19rolls = pd.DatetimeIndex(pd.to_datetime(d.index[d > 1e-5]))20df = load_root_1m(CACHE, "SR3")21mr = minute_returns(df, rolls).to_pandas()22F = pd.read_csv(ROOT / "results/metrics/daily_factors_cmt.csv", index_col=0, parse_dates=True).dropna()23mr["yday"] = assign_yield_day(mr["ts"], yield_day_bounds(F.index)).values24mr.set_index("ts")[["r", "vol", "yday"]].rename(columns={"r": "SR3", "vol": "vol_SR3"}).reset_index().to_parquet(CACHE / "returns_1m_SR3.parquet", index=False)25g = mr.groupby("yday"); daily = pd.DataFrame({"SR3": g["r"].sum(min_count=1), "n_SR3": g["r"].count()})26daily.to_parquet(CACHE / "sr3_daily.parquet")27print("SR3 rolls", len(rolls), "yield days", len(daily), "median minutes/day by year", daily.groupby(daily.index.year)["n_SR3"].median().to_dict())28
Files · main
Menu

Theme