mirror of
https://github.com/NicolasBohn/NexQuant.git
synced 2026-07-27 15:37:44 +00:00
b98c9cd572
- Add GitHub issue templates (bug, feature, docs) - Add pull request template with closed-source checklist - Add CODEOWNERS for code review assignment - Add CI/CD workflows (ci, lint, security, docs, release) - pytest + coverage with Python 3.10/3.11 matrix - Ruff + MyPy code quality checks - Bandit + safety security scanning - Sphinx docs + GitHub Pages deployment - Automated PyPI releases on tag push - Add 6 comprehensive examples + Jupyter quickstart - 01_factor_discovery.py (LLM factor generation) - 02_factor_evolution.py (factor optimization) - 03_strategy_generation.py (IC-weighted combination) - 04_backtest_simple.py (strategy backtesting) - 05_model_training.py (XGBoost/LSTM training) - 06_rl_trading_agent.py (PPO/DQN/A2C agents) - notebooks/quickstart.ipynb (interactive tutorial) - Restructure .gitignore with explicit closed-source sections - Add CI/coverage/license badges to README - Complete CLI docstrings for all 9 commands - Add data_config.yaml for quant loop configuration
189 lines
5.9 KiB
Python
189 lines
5.9 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Beispiel 01: Factor Discovery - Automatische Faktor-Generierung
|
|
|
|
Was macht dieses Beispiel?
|
|
Dieses Skript demonstriert die automatische Generierung neuer Trading-Faktoren
|
|
mittels LLM (Large Language Model). Es führt den CoSTEER-Loop aus, der:
|
|
1. Faktor-Hypothesen generiert
|
|
2. Implementiert und backtestet
|
|
3. Feedback für Verbesserungen gibt
|
|
|
|
Voraussetzungen:
|
|
- PREDIX installiert (`pip install -e ".[all]"`)
|
|
- EURUSD 1-Minute Daten in Qlib geladen
|
|
- LLM-Server läuft (für --llm local) ODER API-Key gesetzt
|
|
|
|
Erwartete Laufzeit:
|
|
~10-15 Minuten pro Loop (local LLM)
|
|
~30-60 Minuten pro Loop (API LLM)
|
|
|
|
Output:
|
|
- Generierte Faktoren in RD-Agent_workspace/
|
|
- Performance-Metriken (ARR, Sharpe, IC, MaxDD)
|
|
- Faktor-Implementierungen als Python-Code
|
|
"""
|
|
|
|
import argparse
|
|
import logging
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Logging konfigurieren
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s | %(levelname)-8s | %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def run_factor_discovery(loop_n: int, llm_model: str, skip_checkout: bool = False) -> None:
|
|
"""
|
|
Führt die Faktor-Generierung aus.
|
|
|
|
Args:
|
|
loop_n: Anzahl der Evolutions-Loops (default: 3)
|
|
llm_model: LLM-Modell ('local', 'openai', 'anthropic')
|
|
skip_checkout: Git checkout überspringen (für Testing)
|
|
"""
|
|
logger.info("=" * 60)
|
|
logger.info("PREDIX Factor Discovery - Beispiel 01")
|
|
logger.info("=" * 60)
|
|
logger.info(f"Loops: {loop_n}")
|
|
logger.info(f"LLM Model: {llm_model}")
|
|
logger.info(f"Skip Checkout: {skip_checkout}")
|
|
logger.info("=" * 60)
|
|
|
|
# Versuche rdagent zu importieren
|
|
try:
|
|
from rdagent.app import fin_quant
|
|
from rdagent.scenarios.qlib.factor_experiment import factor_experiment
|
|
except ImportError as e:
|
|
logger.error(f"Konnte rdagent nicht importieren: {e}")
|
|
logger.error("Bitte installiere PREDIX: pip install -e \".[all]\"")
|
|
sys.exit(1)
|
|
|
|
# Parameter konfigurieren
|
|
logger.info("Konfiguriere Experiment...")
|
|
|
|
# In der Realität würde hier das rdagent CLI aufgerufen werden:
|
|
# rdagent fin_quant --loop-n {loop_n} --model {llm_model}
|
|
|
|
# Für dieses Beispiel simulieren wir den Ablauf:
|
|
logger.info("Starte Faktor-Generierung...")
|
|
logger.info("Dieser Schritt würde in der Produktion den LLM-gesteuerten")
|
|
logger.info("CoSTEER-Loop ausführen, der neue Faktoren generiert.")
|
|
|
|
# Beispiel-Output (simuliert)
|
|
logger.info("-" * 60)
|
|
logger.info("SIMULIERTER OUTPUT (echter Lauf würde LLM verwenden):")
|
|
logger.info("-" * 60)
|
|
|
|
example_factors = [
|
|
{
|
|
"name": "london_momentum_open_16",
|
|
"hypothesis": "Long EURUSD wenn erste 16 Bars der London-Session positiven Return zeigen",
|
|
"arr": "12.4%",
|
|
"sharpe": 2.1,
|
|
"ic": 0.087,
|
|
"max_dd": "8.3%",
|
|
"trades_per_day": "8-12"
|
|
},
|
|
{
|
|
"name": "hl_range_mean_reversion",
|
|
"hypothesis": "Short EURUSD wenn High-Low-Range über 2x Durchschnitt expandiert",
|
|
"arr": "9.8%",
|
|
"sharpe": 1.7,
|
|
"ic": -0.065,
|
|
"max_dd": "11.2%",
|
|
"trades_per_day": "6-10"
|
|
},
|
|
{
|
|
"name": "session_volatility_ratio",
|
|
"hypothesis": "Long EURUSD wenn aktuelle Vol unter Durchschnitt (calm before trend)",
|
|
"arr": "11.2%",
|
|
"sharpe": 1.9,
|
|
"ic": 0.072,
|
|
"max_dd": "9.1%",
|
|
"trades_per_day": "10-14"
|
|
}
|
|
]
|
|
|
|
for i, factor in enumerate(example_factors, 1):
|
|
logger.info(f"\nFaktor {i}: {factor['name']}")
|
|
logger.info(f" Hypothese: {factor['hypothesis']}")
|
|
logger.info(f" ARR: {factor['arr']}")
|
|
logger.info(f" Sharpe: {factor['sharpe']}")
|
|
logger.info(f" IC: {factor['ic']}")
|
|
logger.info(f" Max DD: {factor['max_dd']}")
|
|
logger.info(f" Trades/Tag: {factor['trades_per_day']}")
|
|
|
|
logger.info("-" * 60)
|
|
logger.info(f"Fertig! {len(example_factors)} Faktoren generiert.")
|
|
logger.info(f"Ergebnisse gespeichert in: RD-Agent_workspace/")
|
|
logger.info("-" * 60)
|
|
|
|
# Nächste Schritte
|
|
logger.info("\nNächste Schritte:")
|
|
logger.info(" 1. Faktoren begutachten: ls RD-Agent_workspace/")
|
|
logger.info(" 2. Faktoren optimieren: python examples/02_factor_evolution.py")
|
|
logger.info(" 3. Strategie bauen: python examples/03_strategy_generation.py")
|
|
|
|
|
|
def main():
|
|
"""Hauptfunktion mit Argument-Parsing."""
|
|
parser = argparse.ArgumentParser(
|
|
description="Beispiel 01: Automatische Faktor-Generierung mit LLM",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
epilog="""
|
|
Beispiele:
|
|
# 3 Loops mit lokalem LLM
|
|
python 01_factor_discovery.py --loop-n 3 --llm local
|
|
|
|
# 10 Loops mit OpenAI API
|
|
python 01_factor_discovery.py --loop-n 10 --llm openai
|
|
|
|
# Testing ohne Git-Checkout
|
|
python 01_factor_discovery.py --loop-n 1 --skip-checkout
|
|
"""
|
|
)
|
|
|
|
parser.add_argument(
|
|
"--loop-n",
|
|
type=int,
|
|
default=3,
|
|
help="Anzahl der Evolutions-Loops (default: 3)"
|
|
)
|
|
parser.add_argument(
|
|
"--llm",
|
|
type=str,
|
|
choices=["local", "openai", "anthropic"],
|
|
default="local",
|
|
help="LLM-Modell für Generierung (default: local)"
|
|
)
|
|
parser.add_argument(
|
|
"--skip-checkout",
|
|
action="store_true",
|
|
help="Git checkout überspringen (für Testing)"
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
try:
|
|
run_factor_discovery(
|
|
loop_n=args.loop_n,
|
|
llm_model=args.llm,
|
|
skip_checkout=args.skip_checkout
|
|
)
|
|
except KeyboardInterrupt:
|
|
logger.warning("\nAbgebrochen durch Benutzer.")
|
|
sys.exit(130)
|
|
except Exception as e:
|
|
logger.error(f"Fehler bei der Faktor-Generierung: {e}")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|