mirror of
https://github.com/NicolasBohn/NexQuant.git
synced 2026-07-27 23:47:46 +00:00
feat: zentrale data_config.yaml + apply_config.py für dynamische Datenkonfiguration
This commit is contained in:
Executable
+91
@@ -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']}")
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user