Commit Graph

12 Commits

Author SHA1 Message Date
TPTBusiness 0651faed92 feat: unified backtest engine, LLM error handling, strategy refactor
- Add vbt_backtest.py as single source of truth for all metric formulas
  (Sharpe, drawdown, IC, transaction costs) — backtest_engine.py and
  strategy_orchestrator.py now delegate to it
- Add LLMUnavailableError to exception.py; rd_loop.py catches it at the
  proposal stage and raises LoopResumeError to avoid corrupting trace
  history with None hypotheses
- Guard record() against None exp/hypothesis so loop resets leave
  trace.hist in a consistent state
- Refactor strategy_orchestrator and optuna_optimizer to use unified
  backtest path; remove duplicate metric calculation code
- Add predix_rebacktest_unified.py script for offline re-evaluation
- Update tests and README

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 22:52:07 +02:00
TPTBusiness c78ecd3b6a feat: add daily log rotation, llama health wait, factor auto-fixer, and README updates
- Add rdagent/log/daily_log.py: daily-rotating structured logs per command
  (fin_quant, strategies, evaluate, parallel) with loguru; all.log combined sink
- predix.py: route TeeWriter output to logs/YYYY-MM-DD/ instead of root dir;
  wrap quant() and evaluate() in daily_log.session() for start/stop/duration tracking
- rdagent/app/cli.py: fin_quant_cli waits for llama.cpp /health endpoint before
  starting pipeline (up to 300 s); daily_log integration for fin_quant,
  generate_strategies, eval_all, parallel commands
- scripts/predix_gen_strategies_real_bt.py: daily_log integration with
  per-strategy ACCEPTED/REJECTED entries and summary on completion
- rdagent/components/coder/factor_coder/auto_fixer.py: new module that patches
  common LLM-generated factor issues (min_periods, inf/NaN, groupby.transform,
  MultiIndex corrections)
- rdagent/components/coder/factor_coder/prompts.yaml: add critical rules for
  EURUSD 1-min intraday factors (min_periods, inf handling, groupby, date range)
- README.md: document --reasoning off and --n-gpu-layers 28 for llama-server;
  explain VRAM constraints when Ollama is running alongside llama.cpp
- .bandit.yml: suppress B615 (HuggingFace unsafe download) for RL benchmark files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 07:20:08 +02:00
TPTBusiness 144311f6ec fix(strategy): Re-evaluate Optuna-optimized strategies with full OHLCV backtest
- Add _patch_strategy_code() to inject Optuna's best parameters into
  LLM-generated strategy code (handles window, entry_thresh, exit_thresh,
  signal_window, and .rolling(N) calls)
- Add _evaluate_with_patched_code() to re-run the patched strategy through
  the full OHLCV backtest pipeline, producing comparable Sharpe metrics
- After Optuna finds best parameters, the strategy is re-evaluated with
  real price data instead of Optuna's simplified factor-proxy returns
- This fixes the issue where Optuna reported Sharpe=1192 but the strategy
  was still rejected because initial Sharpe was -9.82 (different calculation)
- Now strategies can be rescued if Optuna finds parameters that produce
  positive Sharpe in the real backtest
2026-04-13 15:52:03 +02:00
TPTBusiness df61b90464 feat(strategy): Continuous optimization with Optuna parameter injection
- Optuna now runs for ALL strategies (accepted AND rejected)
- Fix critical bug: Optuna parameters are now injected into LLM-generated
  code via regex patching (entry_thresh, exit_thresh, window, signal_window)
  Previously all 30 trials executed identical code producing the same Sharpe
- Add continuous optimization loop (--max-iterations) for repeated
  strategy generation and optimization cycles
- Improve prompt v5 with better IC-inversion examples and realistic
  code templates
- Expand Optuna search space: zscore_window, signal_bias, max_hold_bars
- CLI: add --continuous, --max-iterations, --optuna-trials flags
- Show best strategy with optimized parameters in summary output
2026-04-12 20:06:13 +02:00
TPTBusiness d6c41c096d fix(strategy): Fix template variables, APIBackend import, and JSON extraction
- Fix {{ ic_values }} template variable not being replaced in prompts
- Fix APIBackend abstract class import (use factory from llm_utils)
- Add robust JSON extraction with python code block fallback
- Add response_format json_object to LLM payload
- Add detailed debug logging for LLM responses
- Simplify prompt variable replacement for readability

Files:
  rdagent/components/coder/strategy_orchestrator.py
  rdagent/components/prompt_loader.py
  rdagent/app/cli.py
  prompts/strategy_generation_v4.yaml
2026-04-12 14:47:25 +02:00
TPTBusiness 12f345f594 feat: Diverse factor selection + improved prompt v3
Factor Selection:
- Select by TYPE (momentum, divergence, volatility, session, etc.)
- Ensures variety: no more 20 return-based factors
- Priority: momentum > divergence > volatility > session > london > range > vwap > spread > return

Prompt v3:
- IC Sign instructions (negative IC factors should be INVERTED)
- Better examples showing +IC and -IC factor combinations
- Clear explanation: positive IC = HIGH→LONG, negative IC = HIGH→SHORT

Now selecting diverse factors:
- 2x momentum/divergence/session
- 2x divergence (KL divergence)
- 2x volatility
- 4x session/london
- 2x range
- 2x VWAP
- 2x spread
- 2x return
- 2x other

Test results show diverse factor combinations (session+momentum+volatility).
2026-04-09 16:37:38 +02:00
TPTBusiness 199818cc94 feat: Improved LLM prompt + Optuna integration (Step 3+5)
Step 3 - LLM Prompt verbessert:
- Created prompts/strategy_generation_v2.yaml
- IC-guided factor selection instructions
- |IC| > 0.10: PRIORITIZE, |IC| > 0.05: USE, |IC| < 0.05: AVOID
- IC-weighted factor combinations
- Better examples with IC weights
- Added 'close' Series to available scope

Step 5 - Optuna-Optimierung aktiviert:
- Added use_optuna=True, optuna_trials=20 to __init__
- Integrated OptunaOptimizer in _generate_and_evaluate_single
- Added _prepare_factor_values method for Optuna
- Auto-optimizes accepted strategies with 20 trials
- Updates results if Optuna improves Sharpe

Test results (MomentumDivergenceZScore with forward-fill):
- Status: accepted
- Sharpe: 6.04
- Max DD: -1.57%
- Win Rate: 49.19%
- Ann Return: 21.88%
- Periods: 823,450 (2.27 years)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-04-09 14:06:15 +02:00
TPTBusiness 5fb6893933 fix: Forward-fill daily factors to 1-min frequency
Problem:
- daily_session_momentum_divergence_1d: 259 values (daily data)
- DailyTrendStrength_Raw: 314 values (daily data)
- Combined with 1-min data → only 259 overlapping rows

Fix:
- Forward-fill daily factors to OHLCV 1-min index
- 259 daily values → 823,450 1-min values after ffill
- Test period: 259 min → 823,450 min (2.27 years)

Results (MomentumDivergenceZScore):
- Before: Sharpe=3.59, Periods=259 (4.3 hours)
- After: Sharpe=6.04, Periods=823,450 (2.27 years)
- Ann Return: 21.88% (realistic)
- Max DD: -1.57%

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-04-09 13:43:24 +02:00
TPTBusiness bed75b0a95 feat: Fix realistic backtesting (Step 1+2)
Step 1 - Evaluierung bekannter Strategien:
- Added 'close' to exec context for existing strategies
- Strategies can now use close.index for signal creation
- MomentumDivergenceZScore evaluates correctly: Sharpe=3.59, DD=-0.22%

Step 2 - Annualisierungsfaktor korrigiert:
- Fixed: sqrt(252*1440/96) → sqrt(252*1440) for 1-min data
- Added minimum 0.1 years to avoid extreme values for short periods
- Linear scaling for <1 year, compound for >=1 year

Test results (MomentumDivergenceZScore):
- Status: accepted
- Sharpe: 3.59 (realistic)
- Max DD: -0.22%
- Win Rate: 49.46%
- Ann Return: 543.75% (linear scaled for 259 min period)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-04-09 13:39:18 +02:00
TPTBusiness 85cd753c85 feat: Realistic backtesting with OHLCV data (P5 continued)
Implemented realistic backtesting:
- Load real OHLCV close prices from intraday_pv.h5
- Calculate real price returns (pct_change)
- Apply signal positions to real returns with proper alignment
- Include spread costs (1.5 bps per trade)
- Fallback to factor proxy if OHLCV unavailable

Note: Sharpe values now realistic (~0 for random strategies).
Strategies need LLM to select predictive factors for positive Sharpe.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-04-09 13:20:12 +02:00
TPTBusiness 038b5568aa feat: Realistic backtesting with OHLCV data and spread costs
Implemented realistic backtesting in StrategyOrchestrator:
- Load real OHLCV close prices from intraday_pv.h5
- Calculate real price returns (pct_change)
- Apply signal positions to real returns
- Include spread costs (1.5 bps per trade)
- Fallback to factor proxy if OHLCV unavailable

Strategies now evaluated with actual market conditions.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-04-09 13:08:57 +02:00
TPTBusiness ab3748fbfe feat: Strategy Generator working with local LLM (P0-P4)
Integrated strategy generation into fin_quant loop:
- Fixed LLM code extraction from JSON responses
- Fixed factor loading (MultiIndex parquet handling)
- Fixed return calculation (realistic proxy)
- Fixed max drawdown (NaN/inf handling)
- Added llama.cpp --reasoning off support
- Strategy orchestrator with LLM + evaluation
- Optuna optimizer integration

100% acceptance rate on test run (2/2 strategies).
Total changes: +2006 lines, -129 lines across 8 files.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-04-09 12:55:04 +02:00