File size: 2,167 Bytes
590a501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python3
"""Use QuantaAlpha-compatible LLM API to propose and run a strategy."""

import argparse
import json
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
if str(ROOT) not in sys.path:
    sys.path.insert(0, str(ROOT))

from config.settings import load_settings
from integrations.quantaalpha.llm_strategy import build_llm_strategy_plan, save_strategy_plan
from strategies.runner import run_strategy_backtest, save_backtest_result


def main():
    parser = argparse.ArgumentParser(description="LLM-driven strategy planning + backtest (QuantaAlpha API)")
    parser.add_argument("--library", type=str, default=None, help="QuantaAlpha factor library JSON")
    parser.add_argument("--factor-panel", type=str, default=None, help="Pre-mined factor panel parquet/csv")
    parser.add_argument("--market-context", type=str, default=None)
    parser.add_argument("--dry-run", action="store_true", help="Only generate LLM plan, skip backtest")
    parser.add_argument("--start", type=str, default=None)
    parser.add_argument("--end", type=str, default=None)
    parser.add_argument("--output-dir", type=str, default=None)
    args = parser.parse_args()

    plan = build_llm_strategy_plan(
        library_path=args.library,
        factor_panel_path=args.factor_panel,
        market_context=args.market_context,
    )

    settings = load_settings()
    plan_dir = settings.output_root / "strategies" / "llm_plans"
    plan_path = save_strategy_plan(plan, plan_dir / "latest_plan.json")
    print(f"LLM plan saved: {plan_path}")
    print(json.dumps(plan["llm_plan"], ensure_ascii=False, indent=2))

    if args.dry_run:
        return

    result = run_strategy_backtest(
        strategy_name=plan["strategy"]["name"],
        signal_source=plan["signal_source"],
        strategy_kwargs=plan["strategy"].get("kwargs"),
        start_time=args.start,
        end_time=args.end,
    )
    out_dir = Path(args.output_dir) if args.output_dir else settings.output_root / "backtest" / "llm_strategy"
    save_backtest_result(result, out_dir)
    print(f"Backtest complete: {out_dir}")


if __name__ == "__main__":
    main()