# Alpha Robustness Runner This runner is intentionally isolated from the stable backtest path. Use: - [deploy/v2/jsonl_alpha_robustness.py](/Users/giaphu/Documents/Pylab/AAE-new/deploy/v2/jsonl_alpha_robustness.py) - [backtest/robust_factor_executor.py](/Users/giaphu/Documents/Pylab/AAE-new/backtest/robust_factor_executor.py) - [backtest/robust_qlib_backtester.py](/Users/giaphu/Documents/Pylab/AAE-new/backtest/robust_qlib_backtester.py) Do **not** modify the production backtest flow when running robustness experiments. ## Purpose Run robustness backtests for a fixed alpha pack, for example the top 10 alphas, while varying assumptions such as: - `TOP_K` - `rebalance_freq` - `buy/sell fee` - weighting mode - score transform - liquidity-derived universe filter - execution limits ## Input format Pass a JSONL file where each row is at least: ```json {"name":"ALPHA_001","expr":"RANK($close)"} ``` Optional fields such as `seed_name`, `factor_name`, `factor_expr`, `candidate_scope`, `proposal_rank`, `turn`, and `call_index` are also accepted. ## Minimal example ```bash python deploy/v2/jsonl_alpha_robustness.py \ --jsonl data/top10_alphas.jsonl \ --period test \ --backtest-engine custom \ --top-k 5 \ --rebalance-freq 5 \ --custom-weight-mode alpha_score \ --max-pos-each-stock 0.2 \ --enforce-cash-limit \ --capture-detail-artifacts \ --output-dir outputs/robust/top10_baseline ``` ## Common robustness sweeps ### 1. `TOP_K` sensitivity Run the same pack with: - `--top-k 3` - `--top-k 5` - `--top-k 10` ### 2. Rebalance sensitivity Run the same pack with: - `--rebalance-freq 5` - `--rebalance-freq 10` - `--rebalance-freq 20` ### 3. Fee sensitivity Run the same pack with: - `--buy-fee 0.0013 --sell-fee 0.0013` - `--buy-fee 0.0020 --sell-fee 0.0020` - `--buy-fee 0.0030 --sell-fee 0.0030` ### 4. Weighting robustness Examples: - `--custom-weight-mode equal --max-pos-each-stock 0.2` - `--custom-weight-mode alpha_score --max-pos-each-stock 0.2` - `--custom-weight-mode alpha_score --max-pos-each-stock 1.0` ### 5. Score-transform robustness Examples: - `--score-transform identity` - `--score-transform rank` - `--score-transform zscore` - `--score-transform rank_zscore` - `--score-transform clip_zscore --score-clip 3.0` ### 6. Liquidity-derived universe robustness Examples: - `--universe-filter top_amount --universe-top-n 70 --universe-lookback-days 20` - `--universe-filter top_amount --universe-top-n 90 --universe-lookback-days 20` - `--universe-filter top_volume --universe-top-n 70 --universe-lookback-days 20` This is an internal proxy universe derived from `daily_pv.h5`. It is **not** the same as an external market-cap or index-membership universe. ## Outputs The runner writes the same main artifacts as the standalone backtest runner, plus a robustness manifest: - `summary.csv` - `summary_yearly.csv` - `trials.csv` - `trials_yearly.csv` - `aggregate.json` - `aggregate_yearly.csv` - `portfolio_daily.csv` - `trade_log.csv` - `holdings_daily.csv` - `signal_selection_daily.csv` - `rebalance_plan.csv` - `rebalance_window_returns.csv` - `data_quality_report.json` - `robust_manifest.json` (or the custom name from `--manifest-name`) ## Recommended workflow for 10 alphas 1. Prepare a `top10_alphas.jsonl` 2. Run one baseline bundle 3. Run one axis at a time: - `top_k` - `rebalance_freq` - fee - weighting - score transform - universe filter 4. Compare each bundle using: - `summary.csv` - `aggregate.json` - `portfolio_daily.csv` - `trade_log.csv` - `signal_selection_daily.csv` - `rebalance_plan.csv` ## Important note This path is separate on purpose. If a robustness experiment fails or needs extra knobs, patch the robust files above instead of the stable production backtest path.