Problem:
- All 50 parallel runs failed with: AttributeError: 'QuantTrace' object has no attribute 'get_factor_count'
- The _build_strategies_with_ai() method calls self.trace.get_factor_count()
- This method didn't exist in the QuantTrace class
Fix:
- Add get_factor_count() method to QuantTrace class
- Add increment_factor_count() method to track factor generation
- Call increment_factor_count() in running() step when factors are generated
- _build_strategies_with_ai() is already wrapped in try/except for safety
Now the parallel runs will work correctly.
Problem:
- Portfolio selection failed with 'Not enough valid overlapping data'
- Factors produce mostly NaN values or fail execution
- No diagnostics shown to user about why factors failed
Solution:
- Add detailed error tracking for each factor (timeout, no result, low values)
- Show summary of skipped factors with reasons
- Increase timeout to 2 minutes per factor
- Add fallback to show top factors by IC if portfolio fails
- Better progress messages showing valid value counts
- Handle symlink failures by copying data file instead
- Minimum 1000 non-NaN values required for factor to be included
Usage:
predix portfolio # Select top 10 from top 50
predix portfolio -n 100 # Select from top 100 candidates
predix portfolio -c 0.5 # Allow higher correlation (0.5)
New CLI commands:
- predix top [-n 20] [-m ic|sharpe]: Show top factors by IC/Sharpe
- predix evaluate [--top N] [--all] [--force]: Evaluate factors
Why 100 new factors mostly failed:
- 56 factors have IC=None (factor values are all NaN or constant)
- LLM generates code that doesn't work with EURUSD 1min data
- Common issues: volume=0 causes division by zero, wrong MultiIndex handling
- Only 346 of 501 factors have valid IC values
Working factors (Top 5):
1. daily_close_open_mom IC=0.255
2. daily_ret_log_1d IC=0.255
3. daily_ret_close_1d IC=0.255
4. daily_close_to_close_ret IC=0.255
5. daily_ret_vol_adj_1d IC=0.235
Usage:
predix top # Show top 20 by IC
predix top -n 50 # Show top 50
predix top -m sharpe # Sort by Sharpe
predix evaluate --all # Evaluate all NEW factors
predix evaluate --force # Re-evaluate ALL
Integrated predix_full_eval.py into the main Predix CLI.
New command:
predix evaluate [--top N] [--all] [--parallel P] [--force]
Features:
- Evaluates factors with full 1min data (2020-2026)
- Computes IC, Sharpe, Max DD, Win Rate
- Automatically skips already evaluated factors
- --force flag to re-evaluate all factors
- Add predix_parallel.py: Run multiple factor experiments concurrently
* python predix_parallel.py --runs 5 --api-keys 2 -m openrouter
* Round-robin API key distribution across available keys
* Rich live dashboard with per-run status, elapsed time, exit codes
* Graceful shutdown (Ctrl+C kills all children cleanly)
- Add --run-id parameter to predix.py for isolated single runs
* Separate log files: fin_quant_run{N}.log
* Separate results: results/runs/run{N}/
* Separate workspace: RD-Agent_workspace_run{N}/
* Separate databases per run
- Modify CoSTEER and FactorRunner for PARALLEL_RUN_ID isolation
* _save_intermediate_results uses run-specific directories
* _save_result_to_database and _write_run_log isolated per run
* _ensure_results_dirs creates run-specific paths
- Reduce max_loop from 10 to 3 for faster iterations
- Add docs/parallel_runs.md with full documentation
Tests: 103 passed
- TestCLIModelSelection: 8 tests for predix.py CLI
* predix module imports
* fin_quant --model option
* predix quant --model and --log-file options
* OpenRouter API key validation
* TeeWriter existence check
* health and status commands
- TestLoggingTeeWriter: 2 tests for TeeWriter
* Multi-stream writing
* Broken stream handling
All 103 integration tests pass (93 + 10 new).
Also fix predix.py logging:
- Add --log-file flag (default: fin_quant.log)
- TeeWriter writes to both console AND file
- Works for both local and openrouter backends
- Add --model/-m flag to select LLM backend
* local: llama.cpp on localhost (default)
* openrouter: Cloud models via OpenRouter API
- Create predix.py as new CLI entry point with model selection
- Add OPENROUTER_API_KEY and OPENROUTER_MODEL to .env
- Add health and status commands to CLI
- Update rdagent/app/cli.py with model selection logic
Usage:
predix quant # Local (default)
predix quant -m openrouter # OpenRouter cloud
predix quant -m local -d # Local + dashboard
Tests: 93 passed