diff --git a/apply_config.py b/apply_config.py new file mode 100755 index 00000000..b70c0f9f --- /dev/null +++ b/apply_config.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +""" +Liest data_config.yaml und schreibt alle Werte in: +- .env (Zeiträume, Pfade) +- generate.py (Qlib Datengenerierung) +""" +import yaml +import re +from pathlib import Path + +CONFIG = Path(__file__).parent / "data_config.yaml" +ENV = Path(__file__).parent / ".env" +GENERATE = Path("/home/nico/miniconda3/envs/rdagent/lib/python3.10/site-packages/rdagent/scenarios/qlib/experiment/factor_data_template/generate.py") + +with open(CONFIG) as f: + cfg = yaml.safe_load(f) + +# --- .env updaten --- +env_text = ENV.read_text() + +replacements = { + r"QLIB_DATA_DIR=.*": f"QLIB_DATA_DIR={cfg['data_path'].replace('~', str(Path.home()))}", + r"QLIB_FREQ=.*": f"QLIB_FREQ={cfg['frequency']}", + r"QLIB_FACTOR_TRAIN_START=.*": f"QLIB_FACTOR_TRAIN_START={cfg['train_start']}", + r"QLIB_FACTOR_TRAIN_END=.*": f"QLIB_FACTOR_TRAIN_END={cfg['train_end']}", + r"QLIB_FACTOR_VALID_START=.*": f"QLIB_FACTOR_VALID_START={cfg['valid_start']}", + r"QLIB_FACTOR_VALID_END=.*": f"QLIB_FACTOR_VALID_END={cfg['valid_end']}", + r"QLIB_FACTOR_TEST_START=.*": f"QLIB_FACTOR_TEST_START={cfg['test_start']}", + r"QLIB_FACTOR_TEST_END=.*": f"QLIB_FACTOR_TEST_END={cfg['test_end']}", + r"QLIB_MODEL_TRAIN_START=.*": f"QLIB_MODEL_TRAIN_START={cfg['train_start']}", + r"QLIB_MODEL_TRAIN_END=.*": f"QLIB_MODEL_TRAIN_END={cfg['train_end']}", + r"QLIB_MODEL_VALID_START=.*": f"QLIB_MODEL_VALID_START={cfg['valid_start']}", + r"QLIB_MODEL_VALID_END=.*": f"QLIB_MODEL_VALID_END={cfg['valid_end']}", + r"QLIB_MODEL_TEST_START=.*": f"QLIB_MODEL_TEST_START={cfg['test_start']}", + r"QLIB_MODEL_TEST_END=.*": f"QLIB_MODEL_TEST_END={cfg['test_end']}", + r"QLIB_QUANT_TRAIN_START=.*": f"QLIB_QUANT_TRAIN_START={cfg['train_start']}", + r"QLIB_QUANT_TRAIN_END=.*": f"QLIB_QUANT_TRAIN_END={cfg['train_end']}", + r"QLIB_QUANT_VALID_START=.*": f"QLIB_QUANT_VALID_START={cfg['valid_start']}", + r"QLIB_QUANT_VALID_END=.*": f"QLIB_QUANT_VALID_END={cfg['valid_end']}", + r"QLIB_QUANT_TEST_START=.*": f"QLIB_QUANT_TEST_START={cfg['test_start']}", + r"QLIB_QUANT_TEST_END=.*": f"QLIB_QUANT_TEST_END={cfg['test_end']}", +} + +for pattern, replacement in replacements.items(): + env_text = re.sub(pattern, replacement, env_text) + +ENV.write_text(env_text) +print("✓ .env aktualisiert") + +# --- generate.py updaten --- +data_path = cfg['data_path'] +freq = cfg['frequency'] +train_start = cfg['train_start'] +test_end = cfg['test_end'] +valid_start = cfg['valid_start'] +cols = str(cfg['columns']) + +generate_text = f'''import qlib +import pandas as pd + +qlib.init(provider_uri="{data_path}", freq="{freq}") + +from qlib.data import D + +instruments = D.instruments(market="all") +fields = {cols} + +data = ( + D.features(instruments, fields, freq="{freq}") + .swaplevel() + .sort_index() + .loc["{train_start}":] + .sort_index() +) +data.to_hdf("./daily_pv_all.h5", key="data") + +data_debug = ( + D.features(instruments, fields, start_time="{valid_start}", end_time="{test_end}", freq="{freq}") + .swaplevel() + .sort_index() +) +data_debug.to_hdf("./daily_pv_debug.h5", key="data") +''' + +GENERATE.write_text(generate_text) +print("✓ generate.py aktualisiert") +print(f"\nKonfiguration angewendet:") +print(f" Instrument: {cfg['instrument']}") +print(f" Frequenz: {cfg['frequency']}") +print(f" Train: {cfg['train_start']} → {cfg['train_end']}") +print(f" Test: {cfg['test_start']} → {cfg['test_end']}") diff --git a/data_config.yaml b/data_config.yaml new file mode 100644 index 00000000..bec879c6 --- /dev/null +++ b/data_config.yaml @@ -0,0 +1,44 @@ +# ============================================================ +# Predix Data Configuration +# Ändere hier Instrument, Frequenz und Zeiträume +# Alle anderen Komponenten lesen aus dieser Datei +# ============================================================ + +instrument: EURUSD +frequency: 15min # 1min, 5min, 15min, 1h, 1d +data_path: ~/.qlib/qlib_data/eurusd_data + +# Verfügbare Spalten (keine $factor Spalte!) +columns: + - $open + - $close + - $high + - $low + - $volume + +# Walk-Forward Split +train_start: "2022-03-14" +train_end: "2024-06-30" +valid_start: "2024-07-01" +valid_end: "2024-12-31" +test_start: "2025-01-01" +test_end: "2026-03-20" + +# Markt-Kontext für LLM Prompts +market_context: + spread_bps: 1.5 + sessions: + asian: "00:00-08:00 UTC" + london: "08:00-16:00 UTC" + ny: "13:00-21:00 UTC" + overlap: "13:00-16:00 UTC" + target_arr: 9.62 # % ARR zu schlagen + max_drawdown: 20 # % maximaler Drawdown + +# Lookback Referenz (in Bars) +lookback: + 1h: 4 + 2h: 8 + 4h: 16 + 8h: 32 + 1d: 96