SPB Git

spb/wp46_uqo

Public
2.3 KB · 50 lines python
1#!/usr/bin/env python32"""Synthetic fixture (licence-free): two simulated instruments with GJR-GARCH-t returns and a noisy realized proxy, written3in the panel format so that the whole pipeline (forecasts -> losses -> analysis -> exhibits) runs without FinData access.4usage: make_synthetic.py [--out data/synthetic] ; then WP46_PANELS=data/synthetic scripts/run_benchmark.py ...5"""6from __future__ import annotations78import argparse9import json10from pathlib import Path1112import numpy as np13import pandas as pd1415ROOT = Path(__file__).resolve().parents[1]161718def simulate(T: int, seed: int, om=0.03, al=0.03, ga=0.08, be=0.90, nu=6.0) -> pd.DataFrame:19    rng = np.random.default_rng(seed)20    z = rng.standard_t(nu, T) * np.sqrt((nu - 2) / nu)21    s = np.empty(T); e = np.empty(T); s[0] = om / (1 - al - be - ga / 2)22    for t in range(T):23        if t > 0:24            s[t] = om + al * e[t - 1] ** 2 + ga * e[t - 1] ** 2 * (e[t - 1] < 0) + be * s[t - 1]25        e[t] = np.sqrt(s[t]) * z[t]26    r = 0.02 + e27    rv = s * rng.lognormal(-0.05, 0.3, T) * 0.7     # intraday part (70 % of the daily variance on average)28    on = np.sqrt(0.3 * s) * rng.standard_normal(T)   # overnight return29    dates = pd.bdate_range("2004-01-02", periods=T)30    return pd.DataFrame({"session": dates, "close": 100 * np.exp(np.cumsum(r) / 100), "open": np.nan, "r": r, "r_on": on, "r_oc": r - on,31                         "valid_rm": True, "expected_bars": 391, "rv_1m": rv * 1.1, "rv_5m": rv, "rv_5m_ss": rv, "bv_5m": rv * 0.95,32                         "rsv_pos_5m": rv / 2, "rsv_neg_5m": rv / 2, "medrv_5m": rv * 0.9, "n_bars": 391, "n_5m": 78})333435def main() -> None:36    ap = argparse.ArgumentParser(); ap.add_argument("--out", default=str(ROOT / "data" / "synthetic")); ap.add_argument("--T", type=int, default=5500)37    a = ap.parse_args()38    out = Path(a.out); out.mkdir(parents=True, exist_ok=True)39    man = {}40    for i, sym in enumerate(["SYN1", "SYN2"]):41        df = simulate(a.T, 100 + i)42        df.to_parquet(out / f"{sym}.parquet", index=False)43        man[sym] = {"asset_class": "synthetic", "symbol": sym, "rows": int(len(df)), "first": str(df.session.min().date()), "last": str(df.session.max().date()), "seed": 100 + i}44    (out / "manifest.json").write_text(json.dumps(man, indent=1))45    print("synthetic panels:", list(man))464748if __name__ == "__main__":49    main()50
Files · main
Menu

Theme