mirror of
https://github.com/NicolasBohn/NexQuant.git
synced 2026-07-27 23:47:46 +00:00
dd7cfae685
Add automatic dashboard launch options for trading loop: 1. CLI extension (rdagent/app/cli.py) --with-dashboard/-d: Automatically starts dashboard --dashboard-port: Dashboard port (default: 5000) Usage: rdagent fin_quant --with-dashboard rdagent fin_quant -d --dashboard-port 5001 2. Start script (start_trading.sh) - Activates Conda environment - Starts dashboard in background - Starts fin_quant - Cleanup on exit Usage: ./start_trading.sh Dashboard is now accessible at http://localhost:5000/dashboard.html once fin_quant is running.
234 lines
7.0 KiB
Python
234 lines
7.0 KiB
Python
"""
|
|
CLI entrance for all rdagent application.
|
|
|
|
This will
|
|
- make rdagent a nice entry and
|
|
- autoamtically load dotenv
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv(".env")
|
|
# 1) Make sure it is at the beginning of the script so that it will load dotenv before initializing BaseSettings.
|
|
# 2) The ".env" argument is necessary to make sure it loads `.env` from the current directory.
|
|
|
|
import subprocess
|
|
from importlib.resources import path as rpath
|
|
from typing import Optional
|
|
|
|
import typer
|
|
from typing_extensions import Annotated
|
|
|
|
from rdagent.app.data_science.loop import main as data_science
|
|
from rdagent.app.finetune.llm.loop import main as llm_finetune
|
|
from rdagent.app.general_model.general_model import (
|
|
extract_models_and_implement as general_model,
|
|
)
|
|
from rdagent.app.qlib_rd_loop.factor import main as fin_factor
|
|
from rdagent.app.qlib_rd_loop.factor_from_report import main as fin_factor_report
|
|
from rdagent.app.qlib_rd_loop.model import main as fin_model
|
|
from rdagent.app.qlib_rd_loop.quant import main as fin_quant
|
|
from rdagent.app.utils.health_check import health_check
|
|
from rdagent.app.utils.info import collect_info
|
|
from rdagent.log.mle_summary import grade_summary as grade_summary
|
|
|
|
app = typer.Typer()
|
|
|
|
CheckoutOption = Annotated[bool, typer.Option("--checkout/--no-checkout", "-c/-C")]
|
|
CheckEnvOption = Annotated[bool, typer.Option("--check-env/--no-check-env", "-e/-E")]
|
|
CheckDockerOption = Annotated[bool, typer.Option("--check-docker/--no-check-docker", "-d/-D")]
|
|
CheckPortsOption = Annotated[bool, typer.Option("--check-ports/--no-check-ports", "-p/-P")]
|
|
|
|
|
|
def ui(port=19899, log_dir="", debug: bool = False, data_science: bool = False):
|
|
"""
|
|
start web app to show the log traces.
|
|
"""
|
|
if data_science:
|
|
with rpath("rdagent.log.ui", "dsapp.py") as app_path:
|
|
cmds = ["streamlit", "run", app_path, f"--server.port={port}"]
|
|
subprocess.run(cmds)
|
|
return
|
|
with rpath("rdagent.log.ui", "app.py") as app_path:
|
|
cmds = ["streamlit", "run", app_path, f"--server.port={port}"]
|
|
if log_dir or debug:
|
|
cmds.append("--")
|
|
if log_dir:
|
|
cmds.append(f"--log_dir={log_dir}")
|
|
if debug:
|
|
cmds.append("--debug")
|
|
subprocess.run(cmds)
|
|
|
|
|
|
def server_ui(port=19899):
|
|
"""
|
|
start the Flask log server in real time
|
|
"""
|
|
from rdagent.log.server.app import main as log_server_main
|
|
|
|
log_server_main(port=port)
|
|
|
|
|
|
def ds_user_interact(port=19900):
|
|
"""
|
|
start web app to show the log traces in real time
|
|
"""
|
|
commands = ["streamlit", "run", "rdagent/log/ui/ds_user_interact.py", f"--server.port={port}"]
|
|
subprocess.run(commands)
|
|
|
|
|
|
@app.command(name="fin_factor")
|
|
def fin_factor_cli(
|
|
path: Optional[str] = None,
|
|
step_n: Optional[int] = None,
|
|
loop_n: Optional[int] = None,
|
|
all_duration: Optional[str] = None,
|
|
checkout: CheckoutOption = True,
|
|
):
|
|
fin_factor(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout)
|
|
|
|
|
|
@app.command(name="fin_model")
|
|
def fin_model_cli(
|
|
path: Optional[str] = None,
|
|
step_n: Optional[int] = None,
|
|
loop_n: Optional[int] = None,
|
|
all_duration: Optional[str] = None,
|
|
checkout: CheckoutOption = True,
|
|
):
|
|
fin_model(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout)
|
|
|
|
|
|
@app.command(name="fin_quant")
|
|
def fin_quant_cli(
|
|
path: Optional[str] = None,
|
|
step_n: Optional[int] = None,
|
|
loop_n: Optional[int] = None,
|
|
all_duration: Optional[str] = None,
|
|
checkout: CheckoutOption = True,
|
|
with_dashboard: bool = typer.Option(False, "--with-dashboard/-d", help="Start dashboard automatically"),
|
|
dashboard_port: int = typer.Option(5000, "--dashboard-port", help="Dashboard port"),
|
|
):
|
|
"""
|
|
Start EURUSD quantitative trading loop.
|
|
|
|
Use --with-dashboard to automatically start the web dashboard.
|
|
"""
|
|
import subprocess
|
|
import threading
|
|
import time
|
|
|
|
# Start Dashboard wenn gewünscht
|
|
if with_dashboard:
|
|
def start_dashboard():
|
|
print(f"\n🚀 Starting Dashboard on http://localhost:{dashboard_port}...")
|
|
print(f" Open: http://localhost:{dashboard_port}/dashboard.html\n")
|
|
subprocess.run(
|
|
["python", "web/dashboard_api.py"],
|
|
cwd=str(Path(__file__).parent.parent.parent),
|
|
env={**os.environ, "FLASK_ENV": "development"}
|
|
)
|
|
|
|
# Dashboard im Hintergrund starten
|
|
dashboard_thread = threading.Thread(target=start_dashboard, daemon=True)
|
|
dashboard_thread.start()
|
|
time.sleep(2) # Kurze Verzögerung damit Dashboard starten kann
|
|
|
|
# Fin Quant starten
|
|
fin_quant(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout)
|
|
|
|
|
|
@app.command(name="fin_factor_report")
|
|
def fin_factor_report_cli(
|
|
report_folder: Optional[str] = None,
|
|
path: Optional[str] = None,
|
|
all_duration: Optional[str] = None,
|
|
checkout: CheckoutOption = True,
|
|
):
|
|
fin_factor_report(report_folder=report_folder, path=path, all_duration=all_duration, checkout=checkout)
|
|
|
|
|
|
@app.command(name="general_model")
|
|
def general_model_cli(report_file_path: str):
|
|
general_model(report_file_path)
|
|
|
|
|
|
@app.command(name="data_science")
|
|
def data_science_cli(
|
|
path: Optional[str] = None,
|
|
checkout: CheckoutOption = True,
|
|
step_n: Optional[int] = None,
|
|
loop_n: Optional[int] = None,
|
|
timeout: Optional[str] = None,
|
|
competition: Optional[str] = None,
|
|
):
|
|
data_science(
|
|
path=path,
|
|
checkout=checkout,
|
|
step_n=step_n,
|
|
loop_n=loop_n,
|
|
timeout=timeout,
|
|
competition=competition,
|
|
)
|
|
|
|
|
|
@app.command(name="llm_finetune")
|
|
def llm_finetune_cli(
|
|
path: Optional[str] = None,
|
|
checkout: CheckoutOption = True,
|
|
benchmark: Optional[str] = None,
|
|
benchmark_description: Optional[str] = None,
|
|
dataset: Optional[str] = None,
|
|
base_model: Optional[str] = None,
|
|
upper_data_size_limit: Optional[int] = None,
|
|
step_n: Optional[int] = None,
|
|
loop_n: Optional[int] = None,
|
|
timeout: Optional[str] = None,
|
|
):
|
|
llm_finetune(
|
|
path=path,
|
|
checkout=checkout,
|
|
benchmark=benchmark,
|
|
benchmark_description=benchmark_description,
|
|
dataset=dataset,
|
|
base_model=base_model,
|
|
upper_data_size_limit=upper_data_size_limit,
|
|
step_n=step_n,
|
|
loop_n=loop_n,
|
|
timeout=timeout,
|
|
)
|
|
|
|
|
|
@app.command(name="grade_summary")
|
|
def grade_summary_cli(log_folder: str):
|
|
grade_summary(log_folder)
|
|
|
|
|
|
app.command(name="ui")(ui)
|
|
app.command(name="server_ui")(server_ui)
|
|
|
|
|
|
@app.command(name="health_check")
|
|
def health_check_cli(
|
|
check_env: CheckEnvOption = True,
|
|
check_docker: CheckDockerOption = True,
|
|
check_ports: CheckPortsOption = True,
|
|
):
|
|
health_check(check_env=check_env, check_docker=check_docker, check_ports=check_ports)
|
|
|
|
|
|
@app.command(name="collect_info")
|
|
def collect_info_cli():
|
|
collect_info()
|
|
|
|
|
|
app.command(name="ds_user_interact")(ds_user_interact)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app()
|