Commit Graph

109 Commits

Author SHA1 Message Date
TPTBusiness dc2a1a41f4 test: add 16 tests for eurusd, rl env, and all 379 tests now pass (0 failures) 2026-05-03 11:39:24 +02:00
TPTBusiness 1a530440c1 test: add 42 tests for remaining modules (conf, kb, interactor, fmt, llm_utils, graph) 2026-05-03 11:31:28 +02:00
TPTBusiness 13dbf27457 test: add 28 tests for LLM components, RL indicators, and model evaluators 2026-05-03 11:24:28 +02:00
TPTBusiness 49ebc19fd0 test: add 39 tests for fx_config, utils, predix_full_eval, exceptions, and log 2026-05-03 11:18:27 +02:00
TPTBusiness 58eb551898 test: add 4 tests for QuantTrace and QlibQuantHypothesis 2026-05-03 11:14:33 +02:00
TPTBusiness 2e18b7c104 test: add 24 tests for factor/model scenarios and experiments 2026-05-03 11:12:23 +02:00
TPTBusiness 28743eb043 test: add 33 tests for app config, strategy builder, and quant scenario 2026-05-03 11:09:55 +02:00
TPTBusiness a4d4266295 test: add 129 tests for critical untested code (core, CoSTEER, factor_coder, model_coder, qlib pipeline) 2026-05-03 10:59:24 +02:00
TPTBusiness 8f2ed4185f fix: add missing sys import and fix undefined acc_rate in factor eval 2026-05-03 10:19:59 +02:00
TPTBusiness aba88dd090 fix: 15 bug fixes across orchestrator, runner, backtest, and infrastructure
Critical:
- strategy_orchestrator: fix IndentationError that prevented import (line 764)
- factor_runner: fix literal 'sys.executable' string → variable (line 966)

High (path bugs causing wrong directories):
- backtest_engine: fix results_path depth (3→4 .parent hops)
- results_db: fix factors_dir/failed_dir depth (3→4 .parent hops)
- factor_runner: eliminate run_id variable shadowing (parallel_run_id/db_run_id)
- model_runner: fix DB connection leak on add_backtest exception
- optuna_optimizer: fix imported logger shadowed by module-level reassignment

Medium:
- env: handle non-UTF-8 Docker build output with errors='replace'
- env: guard conda env list parsing against empty lines
- factor_runner: add check=False + stderr logging for full-data subprocess
- strategy_orchestrator: log exec() exceptions at ERROR level with traceback
- strategy_orchestrator: warn on unreplaced {{template}} variables in prompts

Low:
- factor_runner: guard IC_max.index access against scalar (AttributeError)
- predix_parallel: close log file handle on Popen failure
- predix_rebacktest_strategies: replace 4 bare except: with except Exception:
2026-05-03 09:37:00 +02:00
TPTBusiness 28766c932e test: add regression tests for background task path and env bugs
- Verify parallel runner project_root is repo root, not scripts/
- Verify .env loading from correct path
- Verify API key distribution (single key, multi-key comma-separated)
- Verify CLI project_root depth (3 .parent hops, not 4)
- Verify start_loop uses sys.executable and child_proc, not pkill
- Verify parallel_cli does not hardcode model=local
- Verify all referenced scripts exist at resolved paths
2026-05-03 08:57:56 +02:00
TPTBusiness 02ac3f7aae test: add direct unit tests for _apply_riskmgmt_mask, safe_resolve_path, import_class, and _add_column_if_not_exists 2026-05-03 00:35:57 +02:00
TPTBusiness 2de7275b8f fix(auto-fixer): replace zero \$volume with price-range proxy for FX data
EUR/USD synthetic data has \$volume=0 for all rows, causing any VWAP or
volume-weighted factor to produce all-NaN output. Insert a guard after
pd.read_hdf() that replaces zero volume with (\$high - \$low) range proxy
so volume-dependent factors produce meaningful signals.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 16:07:06 +02:00
TPTBusiness 9691b64938 fix(auto-fixer): strip spurious .reset_index() after .transform() calls
LLM sometimes copies the .reset_index(level=N, drop=True) suffix from
groupby().rolling().method() patterns and adds it after .transform(),
but transform() already preserves the original index. The extra
reset_index() drops an index level and causes ValueError: 'cannot reindex
on an axis with duplicate labels' or shape mismatch on assignment.

Detect: any line containing both .transform( and .reset_index(level=..., drop=True)
Fix: strip the .reset_index() suffix from those lines.

Adds 1 new test (test_transform_reset_index_stripped) — total 30 tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 15:57:04 +02:00
TPTBusiness d8c0d8865c fix(auto-fixer): fix two assignment-target bugs in instrument column fixers
1. _fix_instrument_column_access: var['instrument'] = EXPR was incorrectly
   converted to var.index.get_level_values(1) = EXPR, producing a SyntaxError
   ('cannot assign to function call'). Added (?!\s*=) negative lookahead to
   skip assignment targets.

2. _fix_groupby_column_on_multiindex: groupby(['instrument','date']) on a
   reset_index() variable was converted to groupby([var.index.get_level_values...])
   but reset_index() produces a plain RangeIndex, not a MultiIndex, causing
   AttributeError: 'RangeIndex' has no attribute 'normalize'. Added reset_vars
   guard to skip variables produced by reset_index().

Adds 1 new test (test_assignment_target_not_touched) — total 29 tests, all passing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 15:55:01 +02:00
TPTBusiness 919a44a4b8 fix(auto-fixer): add five new factor code fixes for groupby/apply errors
1. groupby(level=['instrument','date']) → get_level_values() — string level
   names like 'date' don't exist in the (datetime, instrument) MultiIndex;
   replaced with get_level_values(0).normalize() + get_level_values(1).

2. groupby(level=['date','instrument']) — symmetric fix for reversed order.

3. groupby(level=['instrument']) → groupby(level=1) — single string level.

4. groupby(level=N)['col'].apply(lambda) → transform(lambda) — apply() on a
   grouped Series prepends an extra index level, causing index shape mismatch
   when assigned back; transform() preserves the original index.

5. df.loc[instrument] DateParseError fix (instrument_loc_multiindex) — already
   committed, adding supporting tests for groupby(level=['instrument','date']).

Adds 5 new tests (TestGroupbyLevelStringNames, TestGroupbyApplyToTransform)
— total 28 tests, all passing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 15:40:53 +02:00
TPTBusiness 44f82b13d3 fix(auto-fixer): fix df.loc[instrument] DateParseError on MultiIndex frames
When LLM iterates over instruments via get_level_values('instrument').unique()
and then does df.loc[instrument], pandas tries to parse the instrument string
('EURUSD') as a datetime against level-0 of the (datetime, instrument) index,
raising DateParseError.

Fix: detect loop variables bound to get_level_values(1) or get_level_values('instrument')
and replace DF.loc[loop_var] (read) with DF.xs(loop_var, level=1). Assignment
write-backs are left untouched to avoid complex rewrites.

Adds 4 new tests (TestInstrumentLocMultiindex) — total 23 tests, all passing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 15:31:35 +02:00
TPTBusiness 17a2558339 fix(auto-fixer): fix df['instrument'] KeyError on MultiIndex frames
LLM-generated code often accesses df['instrument'] as a column, but
'instrument' is an index level (level 1) in the MultiIndex DataFrame.
Replace with df.index.get_level_values(1) except when the variable
was created via reset_index() (where the column actually exists).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 21:57:35 +02:00
TPTBusiness ff1c9fc554 fix(auto-fixer): add groupby([level=N,'date']) SyntaxError fix
LLM generates invalid Python by putting keyword args inside lists:
  df.groupby([level=1, 'date'])  ← SyntaxError

Also fixes the regex for the chained groupby Pattern A/B which had
an unescaped ')' causing re.error that silently reverted the fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 21:01:22 +02:00
TPTBusiness ba4d64b434 fix(auto-fixer): disable _fix_min_periods for intraday data
The fixer was raising min_periods to match window size, which causes
all-NaN output for intraday factors with 96 bars/day — window=240 means
zero valid bars per day, window=60 means 61% NaN per day. Critics were
consistently flagging this as incorrect for intraday factors. The LLM
now controls its own min_periods.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 18:59:58 +02:00
TPTBusiness 8aec974702 fix(auto-fixer): fix chained groupby(level=N).groupby('date') pattern
LLM learns from feedback to use groupby(level=1) for instrument, then
chains .groupby('date') to add the date dimension — but DataFrameGroupBy
has no .groupby() method, causing AttributeError at runtime.

Replace the invalid chain with a correct two-level groupby using
index.get_level_values(), consistent with the existing instrument+date fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 15:34:10 +02:00
TPTBusiness f4deda99b5 fix(auto-fixer): preserve date dimension in groupby(['instrument','date']) fix
The previous fixer converted groupby(['instrument','date']) → groupby(level=1),
stripping the date level. This caused intraday calculations (VWAP, rolling-std,
cumsum) to accumulate across trading days instead of resetting daily, producing
all-NaN factor output — causing 100% failure rate on intraday factors.

New behaviour: capture the DataFrame variable name and emit:
  var.groupby([var.index.get_level_values(1),
               var.index.get_level_values(0).normalize()])
which groups by (instrument, day) as originally intended.

Adds test/qlib/test_auto_fixer.py covering all fixer cases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 11:50:52 +02:00
TPTBusiness b0490c5f0d feat(backtest): add rolling walk-forward validation and Monte Carlo trade permutation test
- monte_carlo_trade_pvalue(): shuffles trade P&L N times, returns fraction of
  permuted sequences that beat real total return (p<0.05 = genuine edge)
- walk_forward_rolling(): multiple IS/OOS windows (IS=3yr, OOS=1yr, step=1yr),
  computes wf_oos_sharpe_mean, wf_oos_consistency (% profitable windows)
- backtest_signal_riskmgmt(): new wf_rolling and mc_n_permutations params
- Strategy generator: enables both (200 MC permutations), adds mc_ok and wf_ok
  to acceptance filter (mc_p<0.20, wf_consistency>=50%)
- Rebacktest script: enables both, stores all wf_*/mc_* fields in write-back
- 6 new tests covering MC pvalue, disabled-by-default, zero-trades edge case,
  rolling WF key presence and consistency range

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 18:59:00 +02:00
TPTBusiness 6d514d3ed5 test(backtest): add RiskMgmt and OOS walk-forward validation tests
Covers backtest_signal_riskmgmt leverage caps, zero-signal, IS/OOS split keys,
bar counts, OOS independence from IS losses, and Monte Carlo permutation
tests (marked slow, excluded from default pytest run).

Also excludes slow-marked tests from default addopts in pyproject.toml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 18:26:32 +02:00
TPTBusiness 3f460226f2 feat: add Kronos CLI commands, expand tests, document in README
- predix kronos-factor: generate KronosPredReturn alpha factor via CLI
- predix kronos-eval: evaluate Kronos IC/hit-rate vs LightGBM via CLI
- 19 tests covering adapter, factor builder, model evaluator, CLI (mock-based)
- README: Kronos section in Features + CLI commands table
- Total test suite: 153 passed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 09:53:56 +02:00
TPTBusiness 1f6990d04d feat: integrate Kronos-mini OHLCV foundation model (Option A + B)
Add Kronos-mini (4.1M params, AAAI 2026, MIT) as:
- Option A: predicted-return alpha factor via rolling daily inference
  (kronos_factor_gen.py — stride=96 bars/day, ~2k inference calls)
- Option B: standalone model evaluator alongside LightGBM
  (kronos_model_eval.py — IC / hit-rate vs actual realized returns)

KronosAdapter wraps NeoQuasar/Kronos-mini + Kronos-Tokenizer-2k,
auto-detects GPU, gracefully degrades if ~/Kronos repo is missing.
Factor output: MultiIndex (datetime, instrument) with KronosPredReturn.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 09:49:25 +02:00
TPTBusiness 22e638af86 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 0b168fd3e4 feat: Complete P6-P9 implementation (73 tests)
P6: ML Feedback Integrator (18 tests)
- MLFeedbackMixin for QuantRDLoop
- Auto-trigger ML training every 500 factors
- Feature importance → prompt feedback

P7: Portfolio Optimizer (28 tests)
- Mean-Variance optimization (max Sharpe)
- Risk Parity (equal risk contribution)
- Correlation analysis (max 0.3)
- Portfolio backtest with weighted signals

P8: Integration Tests (27 tests)
- End-to-end pipeline test
- Parallelization test (4 workers)
- RiskMgmt compliance test
- Error handling test

P9: Documentation
- QWEN.md updated with all new modules
- Project status updated
- Architecture diagram expanded

73 tests passing in 0.48s
2026-04-09 10:09:20 +02:00
TPTBusiness d12430427d feat: Add P5 ML Training Pipeline with LightGBM and 46 tests
- MLTrainer class with feature matrix builder from top factors by IC
- LightGBM training with time-series split (80/20) and early stopping
- Feature importance analysis (gain-based) with ranking
- Model persistence: model.txt + metadata.json + feature_importance.json + CSV
- Feedback generation for factor generation loop
- Model loading from disk
- Full pipeline: load factors -> train -> save -> generate feedback
- 46 unit tests covering all features
- lightgbm and scipy added to requirements.txt
2026-04-09 09:46:56 +02:00
TPTBusiness 352dd08514 feat: CLI Commands for strategy generation (P4 complete)
New commands:
- rdagent generate_strategies (parallel LLM + Optuna)
- rdagent optimize_portfolio
- rdagent strategies_report
- rdagent fin_quant --auto-strategies

21 integration tests added.
Rich console output with progress bars and tables.
2026-04-09 09:28:24 +02:00
TPTBusiness 4133d62760 feat: Optuna Parameter Optimizer with 60 tests (P3 complete)
RiskMgmt-compliant parameter optimization:
- Entry/Exit thresholds
- Rolling windows
- Stop Loss (max 2%), Take Profit (2x-3x SL)
- Trailing stop parameters
- Objective: Sharpe × |IC| × √trades
- RiskMgmt penalties for DD > 10%, SL > 2%
- TPESampler + MedianPruner
- 30 trials default

60 tests passing.
2026-04-09 08:56:52 +02:00
TPTBusiness bef1d77ee0 feat: Strategy Orchestrator with 30 tests (P2 complete)
Parallel strategy generation with:
- Multi-Process Pool (4-8 workers)
- File-based LLM Semaphore (max 2 llama.cpp calls)
- Random factor selection for diversity
- SHA-256 deduplication
- Progress tracking every 10 strategies
- Graceful shutdown handling

30 tests passing.
2026-04-09 08:44:10 +02:00
TPTBusiness 6ba2bc0c8f feat: Strategy Worker module with 41 tests (P1 complete)
Created rdagent/scenarios/qlib/local/strategy_worker.py (closed source):
- LLMStrategyGenerator: llama.cpp API calls with retry
- BacktestEngine: isolated subprocess with risk management
- AcceptanceGate: RiskMgmt-compliant validation
- StrategySaver: JSON + metadata persistence
- StrategyWorker: full workflow orchestration

41 tests passing in test/local/test_strategy_worker.py

RiskMgmt rules enforced: SL 2%, max DD 10%, daily loss 5%
2026-04-09 08:28:35 +02:00
TPTBusiness 11d96ec3bd feat: Data Loader module with tests (P0 complete)
Created rdagent/scenarios/qlib/local/data_loader.py:
- OHLCV loading with thread-safe caching
- Factor metadata loading (sorted by IC)
- Factor time-series loading with alignment
- Feature matrix builder
- Randomized factor selection for diverse strategies
- 11 tests passing

Note: data_loader.py is in local/ (closed source)
Test file is public to validate interface.
2026-04-09 08:15:49 +02:00
TPTBusiness 127ee0f44f test: Add CLI model selection and logging tests (10 new tests)
- 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
2026-04-04 08:38:15 +02:00
TPTBusiness 612ed8a802 fix: Ensure backtest results save to DB and JSON files
- Remove duplicate DB save from quant.py (keep only in factor_runner)
- Add explicit DB path creation with mkdir -p
- Add JSON factor summaries to results/factors/
- Add debug logging for result structure
- Fix logger.debug -> logger.info (RDAgentLog compatibility)
- Update tests to match new architecture (240/240 passing)
- Enhance extract_results.py with progress indicators
2026-04-03 15:46:52 +02:00
TPTBusiness 74d5a8234e feat: Integrate critical features into fin_quant workflow (P0+P1)
Connect Protection Manager, Results Database, model_loader, and Technical
Indicators to the main fin_quant trading loop.

P0 - CRITICAL INTEGRATIONS:

1. PROTECTION MANAGER in factor_runner.py
   - Automatic protection check after every backtest
   - Factors with >15% drawdown are rejected
   - Cooldown, stoploss guard, low performance filters active
   - Error handling: workflow continues if protection fails

2. RESULTS DATABASE in quant.py
   - Auto-save experiment results to SQLite after each loop
   - Stores: IC, Sharpe, Max DD, Annualized Return, Win Rate
   - Queryable via ResultsDatabase API
   - Error handling: warning logged, workflow continues

P1 - IMPORTANT INTEGRATIONS:

3. MODEL LOADER in model_coder.py
   - Loads models/local/ as baseline reference for LLM
   - Transformer, TCN, PatchTST, CNN+LSTM now used as starting point
   - LLM can improve upon existing models instead of from scratch

4. TECHNICAL INDICATORS in factor_coder.py
   - RSI, MACD, Bollinger Bands, CCI, ATR available to LLM
   - Import paths and usage examples in prompts
   - Better factor generation with professional indicators

TESTS (32 new, ALL PASS):
- 23 integration tests in test/qlib/test_fin_quant_integration.py
- 9 enhanced integration tests in test/integration/test_all_features.py
- All 183 tests pass (122 backtesting + 29 qlib + 32 new)

Modified files:
- rdagent/app/qlib_rd_loop/quant.py: Results Database integration
- rdagent/scenarios/qlib/developer/factor_runner.py: Protection Manager
- rdagent/scenarios/qlib/developer/model_coder.py: model_loader baseline
- rdagent/scenarios/qlib/developer/factor_coder.py: Technical indicators
- test/qlib/test_fin_quant_integration.py: NEW - 23 integration tests
- test/integration/test_all_features.py: 9 enhanced tests
2026-04-03 14:10:44 +02:00
TPTBusiness 5ce86c824e feat: Full system integration - RL + Protections + Backtesting + CLI
Connect all Predix components into unified trading system:

INTEGRATION (ALL 295 TESTS PASS):
- RL Trading connected with Protection Manager
- RL Trading connected with Backtesting Engine
- CLI command 'rdagent rl_trading' added (train/backtest/live modes)
- Graceful fallback for users without stable-baselines3

OPEN SOURCE COMPATIBILITY:
- System works WITHOUT stable-baselines3 (momentum fallback)
- System works WITHOUT local models/prompts (uses standard)
- Clear warning messages when optional deps missing
- GitHub users get FULLY WORKING system

CLOSED SOURCE PROTECTION:
- models/local/, prompts/local/, .env stay local only
- .gitignore properly configured
- Our alpha (best models/prompts) remains private

DOCUMENTATION:
- QWEN.md: Open/closed source strategy
- QWEN.md: Development guidelines for AI assistant
- QWEN.md: Open source compatibility principle
- README.md: RL Trading CLI commands and examples
- requirements/rl.txt: Optional RL dependencies

Modified files:
- rdagent/app/cli.py: Added rl_trading command
- rdagent/components/backtesting/backtest_engine.py: RL backtest support
- rdagent/components/coder/rl/costeer.py: Protection Manager integration
- rdagent/components/coder/rl/__init__.py: Conditional imports + fallback
- rdagent/components/coder/rl/fallback.py: NEW - Simple momentum fallback
- requirements.txt: Optional RL deps commented
- requirements/rl.txt: NEW - Full RL dependencies
- test/integration/test_all_features.py: 7 new integration tests
- QWEN.md: Open source strategy + development guidelines
- README.md: RL Trading documentation

295 tests pass: 67 integration + 89 RL + 139 backtesting
2026-04-03 13:53:32 +02:00
TPTBusiness 1bbca062af feat: Add RL Trading Agent system with 99 tests
Implement Reinforcement Learning trading system inspired by FinRL concepts
(100% original code, NOT copied from FinRL MIT project):

RL ENVIRONMENT:
- TradingEnv: Gymnasium-compatible environment
- State: price history + indicators + portfolio state
- Action: continuous position [-1, 1] (short to long)
- Reward: return - transaction costs - drawdown penalty

RL AGENT:
- RLTradingAgent: Wrapper for Stable Baselines3
- Supports PPO (stable), A2C (fast), SAC (continuous)
- Methods: create_model(), train(), predict(), save(), load(), evaluate()

COSTEER (fills TODO at costeer.py:112):
- RLCosteer: RL-based trading controller
- Risk-limit enforcement (15% drawdown stops trading)
- Position scaling based on risk appetite
- Trade history tracking

TECHNICAL INDICATORS:
- RSI, MACD, Bollinger Bands, CCI, ATR
- prepare_features() helper for easy integration

TESTS (99 total, ALL PASS):
- 26 env tests
- 16 agent tests
- 19 costeer tests
- 18 indicator tests
- 10 integration tests

Documentation:
- Update QWEN.md with RL system architecture
2026-04-03 13:26:10 +02:00
TPTBusiness bd025e50dc feat: Add Trading Protection System with 4 protections + comprehensive tests
Implement automatic trading protection system to prevent excessive losses:

PROTECTIONS (100% original code, NOT copied from Freqtrade):
- Max Drawdown Protection: Blocks trading when DD > 15% (configurable)
- Cooldown Period: 4h mandatory rest after 5% loss
- Stoploss Guard: Detects stoploss clusters (>5 per day)
- Low Performance Filter: Filters factors with Sharpe < 0.5, Win Rate < 40%

ARCHITECTURE:
- Base protection interface with common utilities
- 4 specialized protection implementations
- ProtectionManager orchestrates all active protections
- Time-based blocking with automatic expiry

TESTS (32 total, ALL PASS):
- 25 unit tests in test/backtesting/test_protections.py
- 7 integration tests in test/integration/test_all_features.py
- Tests cover: normal operation, edge cases, error handling

DOCUMENTATION:
- Update QWEN.md with development guidelines for AI assistant
  * Mandatory rules: Update QWEN.md, README, requirements.txt, tests
  * Pre-commit checklist
  * Example workflow
- Update README.md with protection system features
- Update project structure with new modules

All code is 100% original - NO license issues with Freqtrade GPLv3.
2026-04-03 13:01:56 +02:00
TPTBusiness 2a011d262e chore: Simplify pre-commit to mandatory hooks only
- Remove optional code quality hooks (black, isort, ruff, mypy, toml-sort)
  * These blocked commits when tools not installed
  * Users can run them manually when needed
- Keep only MANDATORY hooks:
  * Integration Tests (60 tests, ~7.5s)
  * Bandit Security Scan
- Both MUST pass before every commit
2026-04-03 12:33:30 +02:00
TPTBusiness edc0d585c3 fix: Remove clear-text storage of API key (CodeQL alert #8)
- Remove api_key parameter from generate_api_config()
- Update API_CONFIG_TEMPLATE to read TEST_API_KEY from environment at runtime
- Pass TEST_API_KEY via Docker env vars instead of writing to config file
- Fixes py/clear-text-storage-sensitive-data vulnerability
- API key is now read from os.environ.get('TEST_API_KEY') at runtime
2026-04-02 23:08:11 +02:00
TPTBusiness 2eced3ca69 fix: Remove API key parameter from generate_api_config()
- Remove api_key parameter from function signature
- API key is now exclusively read from TEST_API_KEY env var
- Complete removal of API key handling from config generation

Security improvements:
- No API key parameters passed through function calls
- Reduces risk of accidental logging or exposure
- Consistent with security best practices
2026-04-02 23:07:56 +02:00
TPTBusiness 15c944efef fix: Remove API key from test_benchmark_api.py config
- Read API key from environment variable instead of config file
- Prevents accidental exposure of API keys in code/config
- Security best practice: secrets should not be stored in files

Security improvements:
- API keys read from TEST_API_KEY environment variable
- Empty string as fallback (will fail gracefully if not set)
- No secrets stored in test configuration files
2026-04-02 23:07:32 +02:00
TPTBusiness 194844a524 test: Fix UI security tests with proper Path mocking
- Fix Path.cwd() mocking to use correct module path
- Add Path.resolve() mocking for proper path validation testing
- Fix PermissionError handling test with proper mock
- All 14 security tests now pass

Fixes broken tests from previous commit that had incorrect mocking.
2026-04-02 22:47:45 +02:00
TPTBusiness a33b29e782 test: Add security tests for GitHub Issue #13 path traversal vulnerability
- Test path traversal prevention with ../ and absolute paths
- Test symlink-based attacks
- Test core security mechanism (Path.relative_to validation)
- Verify fix from commit db5bc6a5 blocks uncontrolled path expressions
- All 14 security tests passing
2026-04-02 22:47:11 +02:00
TPTBusiness e1e86e1bd3 feat: Add advanced ML models (Transformer, TCN, PatchTST, CNN+LSTM)
New models in models/local/:
- transformer_factor.py: Transformer with self-attention
- tcn_factor.py: Temporal Convolutional Network (multi-scale)
- patchtst_factor.py: PatchTST (SOTA for time-series)
- cnn_lstm_hybrid.py: CNN+LSTM with attention

Features:
- All models support sequence and tabular data
- Automatic device selection (CPU/GPU)
- Training with Adam optimizer + LR scheduler
- Save/load functionality
- Production-ready code

Dependencies installed:
- xgboost
- lightgbm
- torch (PyTorch)

Usage:
  from rdagent.components.model_loader import load_model
  model = load_model('transformer_factor')  # Auto-loads your local version!
2026-04-02 22:44:05 +02:00
TPTBusiness c259a01b91 fix: Remove hardcoded credentials from test_benchmark_api.py
- Replace hardcoded API_KEY with os.getenv('TEST_API_KEY')
- Replace hardcoded HF_TOKEN with os.getenv('TEST_HF_TOKEN')
- Replace hardcoded API_BASE with os.getenv('TEST_API_BASE')
- Replace hardcoded MODEL with os.getenv('TEST_MODEL')
- Add test credentials patterns to .gitignore
- Fixes GitHub Security Alert #8 (py/clear-text-storage-sensitive-data)

Sensitive data is now loaded from environment variables instead of clear text.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-04-02 21:56:29 +02:00
TPTBusiness 953fb2d278 test: Add backtesting tests with 98.77% coverage
New test infrastructure:

1. pytest + pytest-cov installed
   - requirements.txt updated
   - pytest.ini configured
   - .coveragerc for coverage

2. Test suite created (97 tests):
   - test_backtest_engine.py (32 tests)
     * BacktestMetrics: IC, Sharpe, Drawdown, Win Rate
     * FactorBacktester: run_backtest, JSON export
     * Edge cases: NaN, empty, insufficient data

   - test_results_db.py (33 tests)
     * ResultsDatabase: CRUD operations
     * Queries: get_top_factors, get_aggregate_stats
     * Database cleanup

   - test_risk_management.py (32 tests)
     * CorrelationAnalyzer: Matrix, uncorrelated factors
     * PortfolioOptimizer: Mean-Variance, Risk Parity
     * AdvancedRiskManager: Limit checks

3. Fixtures (conftest.py):
   - 22 reusable test fixtures
   - Mock data for all scenarios
   - Sample factors, returns, equity curves

4. Coverage: 98.77% (target: >80%)
   - BacktestMetrics: 100%
   - FactorBacktester: 100%
   - ResultsDatabase: 95.92%
   - CorrelationAnalyzer: 100%
   - PortfolioOptimizer: 100%
   - AdvancedRiskManager: 100%

5. Documentation:
   - test/backtesting/README.md
   - How to run tests
   - Generate coverage reports

Run tests:
  pytest test/backtesting/ -v

Coverage report:
  pytest test/backtesting/ --cov=rdagent/components/backtesting --cov-report=html
2026-04-02 19:24:38 +02:00
BarryC 7cd64a26fd feat(rl): add AutoRL-Bench framework and benchmark integrations (#1348)
* feat: rdkit for chemcotbench

* update qwen2.5&llama3.1 context

* fix: force failure on validation error and remove try/except in validator

* feat: unified error sample extraction (with test scripts)

* feat: set conda cache with .env

* feat: skip data eval if data pass in last evo

* fix: rm redundant param

* fix ui bug

* refactor: centralize assign_code_list_to_evo in MultiProcessEvolvingStrategy

* feat: add test_params.yaml generation and workspace cleanup improvements for finetune

* refactor: replace get_clear_ws_cmd with clear_workspace and update prompts for hard check criteria

* add bioprobench dataset

* fix: handle commas in training config extraction and refactor prompt includes

* bioprobench description

* add bioprobench readme

* feat: merge lora adapter for blackwell gpu

* feat: support for multi benchmarks in one job

* change dfficult aware content for training

* update difficulty-aware and logging principles

* fix: resolve variable name conflict in FTRunnerEvaluator

* set job id accuracy to minute

* feat(ui): display one selected metric per benchmark

* feat: store sota exp, and fix ws_ckp bug

* fix: truncate data.json in feedback

* fix: opencompass data for conda env

* fix: save only the last model

* feat: set log path and ws path

* fix: set overwrite_cache to avoid lock contention(through injecting params)

* feat: redirect stdout to file in localenv

* add pickle cache to dataset desc

* fix CI

* fix: remove redundant wrapper

* feat: set python_unbuffered

* move redirect stdout to env run

* fix a small bug

* move model folder

* feat(ui): display benchmark baseline

* fix: enrich scenario and benchmark description

* fix: rewrite runner eval to accept easier

* feat: compare with baseline when no SOTA

* update tablebench readme

* fix: switch back to single benchmark (for baseline)

* feat(ui): add ws path in ui

* refactor: update SOTA tracking to use DAG traversal and parent selection

* fix: prioritize local_selection in trace and refactor sibling retrieval logic

* refactor: unify error handling in feedback generation and update workspace injection

* feat: add skip_loop_error_stepname to control error skip step in LoopBase

* fix: set local_selection to NEW_ROOT for experiments without parent

* feat: set different ports for jobs

* feat: set different ports for jobs

* feat: add upper data size limit for LLM fine-tuning and update related prompts

* fix: replace get_truncated_stdout() with stdout for consistent output handling

* refactor: remove data.json from cache and workspace logic, focus on script-based reuse

* fix: rm target_scenario

* feat: add selective cache extraction and custom cache key for data processing

* fix(ui): bug when displaying tablebench

* fix: filter config in dataset_info.json

* feat: add test set, set valid set

* feat(ui): update test score, and set color for final decision

* feat: add test score for baseline and update ui

* fix: use [-100:] as test range

* feat: update data_stats in runner

* feat: wait for opencompass init when run multi jobs

* fix: adjust test&valid split

* feat: force to generate COT(with <think> token), and add answer format in scenarios.json

* feat: improve ui

* fix: unify benchmark volume mounts and set extra_volumes for conda env

* fix(ui): number color

* fix: update GPU memory handling to use total memory in GB and streamline code

* fix: set use_cot_postprocessor

* feat: add env_dict to config classes and merge env vars in Env run

* fix: let coder obey proposal

* fix(ui): direction bug and update chemcot core metirc

* fix: set consistent benchmark mount points and env vars for docker and conda

* fix: addintional target for LoRA

* feat: workspace dir log for benchmark running

* fix: tableInstruct path bug and update benchmark description

* feat: timeout for whole job

* fix: align FinanceIQ import to opencompass

* feat: use llm_judge for FinanceIQ

* feat: switch to turn on <think> or not

* feat: using scripts to redirect stdout, and run in different windows

* feat: sync litellm log

* fix: gpu memory format

* fix: escape special characters in benchmark desc

* fix: set data processing timeout to 1h

* feat: set valid_loss and save_best_model

* fix: inject timeout and stage

* fix: loss history extract logic

* feat: inject output dir

* feat: inject eval batch size

* feat: inject save_total_limit

* feat: update data prompt

* fix:  escape shell special characters

* fix: tablebench visualization UI

* fix: move implementation validation to coder, and ignore injected params

* docs: add README for RL-PostTraining evaluation system

* Add AutoRL-Bench evaluation framework for RL post-training

* Add architecture documentation

* docs: update architecture and interface documentation for AutoRL-Bench

* improve doc

* fix

* refactor: YAML配置驱动

* feat: add RL Docker env, workspace test, and update project structure

* feat: 重命名 autorl_bench, 新增 RLWorkspace, 配置 Docker extra_volumes

* Add eval-only AutoRL-Bench pipeline

* sturcture clean

* docs: add autorl_bench README

* feat(rl): Implement RL post-training agent scaffold and example

* refactor: simplify RL scenario classes and update RL CoSTEER integration

* feat(rl): 调通 scaffold,mock 数据跑完 5 步循环

* feat(rl): 接入 LLM 生成代码,支持 model_path 传递

* feat(rl): Docker 执行框架,RLWorkspace.run() + RLPostTrainingRunner

* feat(rl): LLM 生成假设/反馈,完整 loop 跑通

* feat: add RL post-training entry point with configurable options

* refactor: simplify RL proposal and trace classes, update config and docs

* Update rl eval autorl_bench layout

* Update RL workflow and evaluation setup

* Integrate AutoRL-Bench evaluation in RL workflow

* feat(rl): 添加 --base-model/--benchmark CLI 参数,简化 RLTask

* feat(rl): Docker 环境动态选择 + example_agent 完整训练评测流程(无llm)

* fix(rl): 修复 feedback 传递 + 添加 verl 依赖

* refactor: remove unused validate in BenchmarkAdapter and add core utils module

* feat(rl): UI

* Refactor autorl_bench layout and docker entrypoint

* autorl_bench: add aider autoloop tool

* feat(rl): environment docker

* refactor: simplify aider autoloop tooling

* chore: update misc files

* feat(rl): yaml-driven dataset download & auto-download on startup

* feat(rl): yaml-driven dataset download & auto-download on startup

* Refactor RL eval runner and clean up

* Simplify RL eval runner and env

* rl: include litellm in RL docker image

* feat(rl): unified resource path & model repo_id structure

* feat(rl): refactor eval with OpenCompass & add training code template

* feat(rl): refactor eval with OpenCompass & add training code template

* feat(rl): delete test bench

* docs: add benchmark interface notes and TODOs for unified evaluation

* feat(rl): unified benchmark eval interface + shared configs

* feat(rl): 优雅

* feat(rl): prompt prososal+coder improve

* feat(rl): fix eval

* fix(rl): docker

* fix(rl): eval

* v 1.0 tmep

* benchmark v1.0

* benchmark v1.1

* benchmark v1.1: grading日志+代码去重

* benchmark v1.1: grading日志+代码去重

* benchmark v1.1: grading日志+代码去重+task description

* benchmark v1.2: fix

* benchmark v1.3: fix,example-agent ok,rdagent test,openhands develop

* benchmark v1.4: fix,example-agent ok,rdagent ok,openhands develop

* benchmark : add alfworld

* benchmark : update readme

* benchmark : update readme

* benchmark :

* chore: add eval bypass block and mark TODO in grading server

* benchmark

* benchmark

* benchmark

* benchmark

* alfworld

* alfworld

* benchmark

* rdagent

* rdagent

* benchmark

* benchmark:ui

* benchmark:delete docker + log

* 1

* alfworld

* ui

* alfworld

* readme

* alfworld

* parallex

* alfworld

* run

* eval gpu

* alfworld

* alfworld

* fix conda init in start.sh for non-interactive shells

Fallback to common miniconda paths when conda is not in PATH.
Fixes B200 pod startup failure (conda: command not found).

Made-with: Cursor

* simplify start.sh: read TRAINING_PYTHON from .env

No more conda detection logic. Just set TRAINING_PYTHON in .env.
Fallback to conda only if not set.

Made-with: Cursor

* use OPENHANDS_PYTHON from .env to run agent

start.sh now uses OPENHANDS_PYTHON for main.py execution,
since the parent process may be in a different conda env.

Made-with: Cursor

* feat: register OpenCode agent into autorl_bench framework

- Add agents/opencode/ with config.yaml, start.sh, README.md
- Include opencode-rl pipeline code (pipeline/, runner_fsm/, benchmarks/)
- Merge opencode-rl dependencies into autorl_bench requirements.txt
- Remove separate venv requirement, share main environment

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update opencode agent, benchmarks, and eval configs

- Sync opencode-rl runner_fsm with latest simplifications
- Add smith benchmarks integration
- Update opencompass configs and server with GPU support + error handling

* Update OpenCode agent docs for external opencode-rl integration

- Document external repo architecture (opencode-rl as independent plugin)
- Add setup instructions for cloning and configuring opencode-rl
- Add architecture diagram showing RD-Agent ↔ opencode-rl interaction
- Document OPENCODE_RL_ROOT for custom paths

* feat: add smith benchmark discovery and per-sample evaluator

- Add smith/ module for dynamic benchmark discovery from rl-smith
- Add PerSampleEvaluator for per-sample scoring via vLLM
- Update utils.py to support script-based data download for smith benchmarks
- Update opencode agent config

* enforce RL-only in instructions.md; remove embedded opencode-rl

- instructions.md: prohibit SFT, require RL (GRPO/PPO) for all benchmarks
- remove agents/opencode/opencode-rl/ (runtime uses external OPENCODE_RL_ROOT)

Made-with: Cursor

* comment out OpenCode-only deps in requirements.txt

openai, httpx, python-dotenv, tenacity are for OpenCode agent's
separate environment. Keep peft and pydantic as shared deps.

Made-with: Cursor

* refactor: extract _kill_process_group, narrow exception catches

- run.py: replace 2x nested 3-level try/except with shared
  _kill_process_group() using loop + specific exceptions
- server.py: except Exception → except (RuntimeError, ValueError, OSError)
- utils.py: except Exception → except requests.ConnectionError

Made-with: Cursor

* move kill_process_group to core/utils for reuse

Extract from run.py into core/utils.py so other runners
can also use it. Exported via core/__init__.py.

Made-with: Cursor

* add comments to run.py for workspace isolation and signal handling

Made-with: Cursor

* remove OpenCode-only deps from requirements.txt entirely

Made-with: Cursor

* allow SFT in instructions, RL as ultimate goal

Made-with: Cursor

* add workspace isolation rules to instructions.md

Use relative paths, forbid cd outside workspace, ignore symlink targets.

Made-with: Cursor

* update opencode start.sh: use OPENCODE_PYTHON, add PATH for opencode CLI, remove unsupported args

Made-with: Cursor

* opencode start.sh: pass --run-dir to use AutoRL-Bench workspace

Ensures OpenCode-FSM-Runner writes outputs into the workspace prepared
by AutoRL-Bench instead of creating its own runs/ directory.

Made-with: Cursor

* opencode start.sh: prepend training env bin to PATH

Ensures LLM agent bash calls (e.g. python3 -c "from trl import ...")
resolve to the correct training environment, instead of relying on
parent shell conda activation.

Made-with: Cursor

* opencode start.sh: restore --max-retries and --eval-timeout for opencode-rl

Made-with: Cursor

* add humaneval benchmark

* Replace import * cleanup hack with explicit imports in OpenCompass config

- Resolve dataset variable names via importlib before generating config,
  so the template uses `from xxx import datasets` instead of `import *`
- Remove the fragile runtime cleanup hack that set leaked modules to None
- Increase OpenCompass timeout from 3600s to 7200s
- Fix score parsing to average across multiple subdatasets

* refine opencompass config file generating

* add humaneval benchmark dependency instructions

human-eval package requires clone from open-compass/human-eval with
a one-line patch to relax assertion for partial evaluation (test split only).

Made-with: Cursor

* fix: sanitize user-provided paths in RL UI (CodeQL)

* fix: resolve user path relative to safe root (CodeQL)

* fix: use Copilot-suggested path sanitization pattern (CodeQL)

* fix: normalize and reject absolute user paths (CodeQL)

* Fix training params, vLLM OOM cleanup, OpenCompass score parsing, and baseline cache logic

* fix: add setuptools<75 to requirements for opencompass pkg_resources dependency

uv venv does not include setuptools by default, causing OpenCompass baseline
evaluation to fail with "No module named 'pkg_resources'".

Made-with: Cursor

* webshop

* feat(autorl_bench): improve smith benchmark integration and evaluator robustness

- Add smith benchmark docs to README: usage examples, discovery mechanism, SMITH_BENCH_DIR
- Improve PerSampleEvaluator: vLLM GPU cleanup, test_range slicing
- Refactor server.py: extract grading server from utils
- Fix OpenCompass score parsing and baseline cache logic

* fix: add smart fallback for OpenCompass dataset variable resolution

When build_dataset_imports_explicit() fails to import an OpenCompass
dataset module (common in grading server subprocess), it now guesses
the correct variable name from the module path convention instead of
falling back to empty names (which causes import * and breaks BBH
due to leaked file handle objects).

* revert: restore opencompass.py to pre-modification state

Revert vLLM pid cleanup, dash-value checks, and metric-based
score parsing added in 31caff2f and bb32e555.

* keep metric-aware score parsing in opencompass; add baseline column to UI

- opencompass.py: retain metric-type filtering (accuracy/score) instead
  of naive averaging, avoids polluting scores with pass/timeout counters
- ui.py: add Baseline column to Agent Summary table

Made-with: Cursor

* fix: handle non-string answers in extract_answer to prevent TypeError

arc_agi and other benchmarks can have non-string answer fields (e.g. lists),
which caused a crash in re.search(). Adding str() coercion fixes this.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* update deepsearch qa tasks

* fix: benchmark evaluation reliability (B1-B4)

- B1: auto-detect LoRA adapters and enable vLLM LoRA mode (read base_model from adapter_config.json)
- B2: serialize evaluations with threading.Lock to prevent GPU contention
- B3: cache eval results by model_path to deduplicate concurrent submissions
- B4: propagate error details from OpenCompass to agent (non-numeric scores, load failures)

Made-with: Cursor

* fix(B1): reject LoRA adapter submissions with clear merge instructions

- opencompass.py: detect adapter_config.json and return error with
  merge_and_unload() instructions instead of broken vLLM LoRA mode
- instructions.md: add requirement to submit full merged models
- opencompass_template.yaml: remove unused is_lora/lora_path params

Made-with: Cursor

* update chat completion

* update

* update deepsearch

* md

* codex + benchmark update

* codex + benchmark update

* codex + benchmark update

* codex

* codex

* fix: grading server cache key includes mtime to detect model overwrites

Previously cache used only resolved_path, so overwritten models at the
same path returned stale scores. Now cache key = path@max_mtime so
re-evaluation is triggered when model files change.

Made-with: Cursor

* feat: add gemini/claude agent scaffolds, fix codex binary path

- codex/start.sh: use CODEX_BIN env var instead of bare 'codex'
- Add gemini/ and claude/ agent directories with config.yaml and start.sh

Made-with: Cursor

* chore: remove copied human_readable_trace.py from PostTrainBench

Made-with: Cursor

* update evaluation

* benchmark

* Fix log cleanup and OpenHands env

* fix: webshop env pth problem

* benchmark alpacaeval

* style(rl): apply auto-lint fixes

* fix(rl): address CI and CodeQL issues

* fix(rl): make autorl bench imports CI-safe

---------

Co-authored-by: Qizheng Li <jenssenlee@163.com>
Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: Bowen Xian <xianbowen@outlook.com>
Co-authored-by: chelsea97 <zhuowbrown@gmail.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: sakura657 <yctangcse@gmail.com>
Co-authored-by: shatianming5 <tianming.sha@stonybrook.edu>
Co-authored-by: Yeyuqing0913 <shatianming4@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 15:49:30 +08:00