aether-quant 4.12.3__tar.gz → 5.4.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aether_quant-5.4.8/.devcontainer/README.md +12 -0
- aether_quant-5.4.8/.githooks/README.md +14 -0
- aether_quant-5.4.8/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
- aether_quant-5.4.8/.github/ISSUE_TEMPLATE/config.yml +8 -0
- aether_quant-5.4.8/.github/ISSUE_TEMPLATE/feature_request.md +32 -0
- aether_quant-5.4.8/.github/PULL_REQUEST_TEMPLATE.md +37 -0
- aether_quant-5.4.8/.github/workflows/ci.yml +158 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.github/workflows/release.yml +45 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.gitignore +29 -0
- aether_quant-5.4.8/AGENTS.md +144 -0
- aether_quant-5.4.8/CODE_OF_CONDUCT.md +56 -0
- aether_quant-5.4.8/CONTRIBUTING.md +167 -0
- aether_quant-5.4.8/Dockerfile.lean +14 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/PKG-INFO +1 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/README.md +545 -218
- aether_quant-5.4.8/REPRODUCIBILITY.md +65 -0
- aether_quant-5.4.8/RUNBOOK.md +122 -0
- aether_quant-5.4.8/SECURITY.md +64 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/aether_quant.egg-info/PKG-INFO +1 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/aether_quant.egg-info/SOURCES.txt +178 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/aether_quant.egg-info/scm_file_list.json +486 -309
- aether_quant-5.4.8/aether_quant.egg-info/scm_version.json +8 -0
- aether_quant-5.4.8/aether_quant.egg-info/top_level.txt +13 -0
- aether_quant-5.4.8/analyzer/README.md +69 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/analyzer/__init__.py +2 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/analyzer/market_analyzer.py +167 -5
- aether_quant-5.4.8/aq_cli.py +3633 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/audit/README.md +4 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/audit/postgres_worker.py +73 -7
- {aether_quant-4.12.3 → aether_quant-5.4.8}/audit/redis_queue.py +3 -2
- {aether_quant-4.12.3 → aether_quant-5.4.8}/audit/status_export.py +6 -3
- aether_quant-5.4.8/config.json +2333 -0
- aether_quant-5.4.8/data/reference/sector_mapping.json +106 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/README.md +38 -12
- aether_quant-5.4.8/data_pipeline/bar_synthesis.py +97 -0
- aether_quant-5.4.8/data_pipeline/factor_file_backfill.py +276 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/fetch.py +10 -2
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/fred_backfill.py +84 -16
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/yfinance_backfill.py +41 -7
- aether_quant-5.4.8/development/Changelog.md +1888 -0
- aether_quant-5.4.8/development/Problems.md +1646 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/development/README.md +16 -7
- {aether_quant-4.12.3 → aether_quant-5.4.8}/development/architecture.md +202 -37
- {aether_quant-4.12.3 → aether_quant-5.4.8}/development/asset_universe.md +11 -18
- aether_quant-5.4.8/development/backtest_equity_chart.png +0 -0
- aether_quant-4.12.3/development/Changelog.md → aether_quant-5.4.8/development/backups/Changelog.md.bak_pre_condense +753 -0
- aether_quant-5.4.8/development/backups/Changelog.md.bak_pre_condense_v54 +1395 -0
- aether_quant-4.12.3/development/Problems.md → aether_quant-5.4.8/development/backups/Problems.md.bak_pre_condense +536 -0
- aether_quant-5.4.8/development/backups/Problems.md.bak_pre_condense_v54 +1524 -0
- aether_quant-5.4.8/development/backups/README.md +22 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/development/infrastructure.md +86 -1
- aether_quant-5.4.8/development/monte_carlo_equity_curves.png +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/development/project_structure.md +17 -4
- aether_quant-5.4.8/evaluation/README.md +152 -0
- aether_quant-5.4.8/evaluation/__init__.py +73 -0
- aether_quant-5.4.8/evaluation/ablation.py +310 -0
- aether_quant-5.4.8/evaluation/benchmark_comparison.py +195 -0
- aether_quant-5.4.8/evaluation/confidence_threshold_calibration.py +157 -0
- aether_quant-5.4.8/evaluation/factor_neutralization_check.py +94 -0
- aether_quant-5.4.8/evaluation/feature_parity.py +321 -0
- aether_quant-5.4.8/evaluation/feature_reconciliation.py +286 -0
- aether_quant-5.4.8/evaluation/impact_model.py +77 -0
- aether_quant-5.4.8/evaluation/kill_switch_replay.py +186 -0
- aether_quant-5.4.8/evaluation/limit_fill_simulator.py +152 -0
- aether_quant-5.4.8/evaluation/model_predictions.py +192 -0
- aether_quant-5.4.8/evaluation/monte_carlo.py +161 -0
- aether_quant-5.4.8/evaluation/public_benchmarks.py +117 -0
- aether_quant-5.4.8/evaluation/rank_book_simulator.py +494 -0
- aether_quant-5.4.8/evaluation/rank_ic_core.py +204 -0
- aether_quant-5.4.8/evaluation/rank_signal_calibration.py +690 -0
- aether_quant-5.4.8/evaluation/rolling_ic_gate_calibration.py +190 -0
- aether_quant-5.4.8/evaluation/rolling_ic_gate_replay.py +138 -0
- aether_quant-5.4.8/execution/README.md +281 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/__init__.py +17 -0
- aether_quant-5.4.8/execution/cost_model.py +213 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/order_gate.py +102 -7
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/paper_readiness_report.py +6 -2
- aether_quant-5.4.8/execution/reconciliation.py +160 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experience/README.md +6 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experience/postgres_worker.py +62 -6
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experience/redis_queue.py +7 -2
- aether_quant-5.4.8/experts/README.md +37 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/README.md +16 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/__init__.py +18 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/alt_data_features.py +44 -0
- aether_quant-5.4.8/features/cross_asset_sensitivity.py +79 -0
- aether_quant-5.4.8/features/sector_map.py +53 -0
- aether_quant-5.4.8/generate_evaluation_report.py +712 -0
- aether_quant-5.4.8/inference/README.md +105 -0
- aether_quant-5.4.8/json_safety.py +130 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/lean.json +1 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/liquidity/README.md +33 -36
- aether_quant-5.4.8/liquidity/__init__.py +15 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/liquidity/market_liquidity.py +123 -8
- {aether_quant-4.12.3 → aether_quant-5.4.8}/main.py +1801 -193
- {aether_quant-4.12.3 → aether_quant-5.4.8}/ml/README.md +32 -5
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bearish/metrics.json +314 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bearish/model.pt +0 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bearish/model_weights.json +1900 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bearish/multitask_model.json +1954 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bearish/multitask_training_metrics.json +202 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bullish/metrics.json +308 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bullish/model.pt +0 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bullish/model_weights.json +1902 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bullish/multitask_model.json +1954 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/bullish/multitask_training_metrics.json +227 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/sideways/metrics.json +325 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/sideways/model.pt +0 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/sideways/model_weights.json +1901 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/sideways/multitask_model.json +1954 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/sideways/multitask_training_metrics.json +192 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/volatility/metrics.json +295 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/volatility/model.pt +0 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/volatility/model_weights.json +1901 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/volatility/multitask_model.json +1954 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/expert_models/volatility/multitask_training_metrics.json +232 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/feature_schema.json +2378 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/gating_feature_schema.json +30 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/gating_model.json +570 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/gating_training_metrics.json +262 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/model.pt +0 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/model_weights.json +11017 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/multitask_feature_schema.json +70 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/multitask_model.json +7448 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/multitask_training_metrics.json +11852 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/scaler.pkl +0 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/scaler_stats.json +156 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/sequence_feature_schema.json +71 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/sequence_model.json +16695 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/sequence_training_metrics.json +11872 -0
- aether_quant-5.4.8/ml/_backup_pre_v537/training_metrics.json +633 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/moe/README.md +16 -35
- {aether_quant-4.12.3 → aether_quant-5.4.8}/moe/gating.py +25 -5
- aether_quant-5.4.8/monitoring/README.md +23 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/monitoring/api_server.py +27 -13
- {aether_quant-4.12.3 → aether_quant-5.4.8}/monitoring/assets_status.py +7 -2
- aether_quant-5.4.8/monitoring/evaluation_state.py +127 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/monitoring/neural_network_state.py +55 -9
- {aether_quant-4.12.3 → aether_quant-5.4.8}/notifications/README.md +3 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/notifications/telegram_alerts.py +26 -8
- {aether_quant-4.12.3 → aether_quant-5.4.8}/notifications/telegram_worker.py +13 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/performance/README.md +22 -19
- aether_quant-5.4.8/performance/rank_ic_monitor.py +56 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/portfolio/README.md +59 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/portfolio/__init__.py +18 -0
- aether_quant-5.4.8/portfolio/book_construction.py +786 -0
- aether_quant-5.4.8/portfolio/book_neutrality.py +178 -0
- aether_quant-5.4.8/portfolio/hrp_allocation.py +159 -0
- aether_quant-5.4.8/portfolio/rank_signal.py +219 -0
- aether_quant-5.4.8/portfolio/rolling_ic_gate.py +183 -0
- aether_quant-5.4.8/pyproject.toml +123 -0
- aether_quant-5.4.8/regime/README.md +53 -0
- aether_quant-5.4.8/requirements/README.md +28 -0
- aether_quant-5.4.8/requirements/lean-runtime.txt +12 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/requirements/requirements-dev.txt +6 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/requirements/requirements.txt +6 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/README.md +49 -11
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/artifacts.py +45 -0
- aether_quant-5.4.8/retraining/auto_rollback.py +109 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/backtest_gate.py +16 -2
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/orchestrator.py +101 -1
- aether_quant-5.4.8/retraining/rollback_hardening.py +42 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/status_export.py +64 -2
- aether_quant-5.4.8/retraining/validation_gate.py +339 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/worker.py +118 -1
- aether_quant-5.4.8/risk/README.md +275 -0
- aether_quant-5.4.8/risk/kill_switch.py +261 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/risk/manual_override.py +49 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/risk/position_sizing.py +41 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/risk/rl_sizing.py +6 -0
- aether_quant-5.4.8/risk_controls.py +386 -0
- aether_quant-5.4.8/scripts/README.md +66 -0
- aether_quant-5.4.8/scripts/feature_parity_audit.py +390 -0
- aether_quant-5.4.8/scripts/gate_sweep.py +234 -0
- aether_quant-5.4.8/scripts/gate_sweep_score_stage.py +73 -0
- aether_quant-5.4.8/scripts/order_events_audit.py +205 -0
- aether_quant-5.4.8/scripts/overlap_vs_sharpe_analysis.py +82 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/scripts/profile_subsystems.py +1 -2
- aether_quant-5.4.8/scripts/promotion_gate_null_calibration.py +153 -0
- aether_quant-5.4.8/scripts/promotion_gate_null_gate_scheme.py +133 -0
- aether_quant-5.4.8/scripts/run_lean_cli_windows.py +49 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/README.md +3 -2
- aether_quant-5.4.8/tests/test_ablation.py +287 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_alt_data_features.py +42 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_api_server.py +66 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_aq_cli.py +1664 -42
- aether_quant-5.4.8/tests/test_aq_test_ruff_flag.py +67 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_audit_postgres_worker.py +78 -0
- aether_quant-5.4.8/tests/test_auto_rollback.py +186 -0
- aether_quant-5.4.8/tests/test_bar_synthesis_parity.py +58 -0
- aether_quant-5.4.8/tests/test_book_neutrality.py +215 -0
- aether_quant-5.4.8/tests/test_ci_workflows.py +138 -0
- aether_quant-5.4.8/tests/test_cli_help_surface.py +142 -0
- aether_quant-5.4.8/tests/test_confidence_threshold_calibration.py +119 -0
- aether_quant-5.4.8/tests/test_cost_model.py +246 -0
- aether_quant-5.4.8/tests/test_cross_asset_sensitivity.py +106 -0
- aether_quant-5.4.8/tests/test_evaluation_state.py +175 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_exported_model.py +30 -0
- aether_quant-5.4.8/tests/test_factor_file_backfill.py +224 -0
- aether_quant-5.4.8/tests/test_feature_parity.py +125 -0
- aether_quant-5.4.8/tests/test_feature_reconciliation.py +233 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_fred_backfill.py +75 -22
- aether_quant-5.4.8/tests/test_generate_evaluation_report.py +561 -0
- aether_quant-5.4.8/tests/test_hrp_book_sizing.py +243 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_ib_backfill.py +0 -1
- aether_quant-5.4.8/tests/test_impact_model.py +67 -0
- aether_quant-5.4.8/tests/test_json_safety.py +95 -0
- aether_quant-5.4.8/tests/test_kill_switch.py +406 -0
- aether_quant-5.4.8/tests/test_kill_switch_replay.py +215 -0
- aether_quant-5.4.8/tests/test_lean_runtime_imports.py +89 -0
- aether_quant-5.4.8/tests/test_limit_fill_simulator.py +155 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_manual_override.py +77 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_market_analyzer.py +227 -3
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_market_liquidity.py +53 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_market_topology.py +49 -0
- aether_quant-5.4.8/tests/test_model_predictions.py +252 -0
- aether_quant-5.4.8/tests/test_monte_carlo.py +120 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_neural_network_state.py +8 -2
- aether_quant-5.4.8/tests/test_order_events_audit.py +135 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_order_gate.py +114 -0
- aether_quant-5.4.8/tests/test_portfolio_book_construction.py +1105 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_position_sizing.py +30 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_postgres_worker.py +74 -0
- aether_quant-5.4.8/tests/test_promotion_gate_era_rule.py +94 -0
- aether_quant-5.4.8/tests/test_public_benchmarks.py +194 -0
- aether_quant-5.4.8/tests/test_rank_book_simulator.py +375 -0
- aether_quant-5.4.8/tests/test_rank_ic_core.py +156 -0
- aether_quant-5.4.8/tests/test_rank_signal.py +242 -0
- aether_quant-5.4.8/tests/test_rank_signal_calibration.py +664 -0
- aether_quant-5.4.8/tests/test_reconciliation.py +223 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_retraining_orchestrator.py +150 -2
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_retraining_worker.py +156 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_risk_controls.py +244 -0
- aether_quant-5.4.8/tests/test_rl_sizing_v541.py +83 -0
- aether_quant-5.4.8/tests/test_rollback_hardening.py +53 -0
- aether_quant-5.4.8/tests/test_rolling_ic_gate.py +165 -0
- aether_quant-5.4.8/tests/test_rolling_ic_gate_calibration.py +138 -0
- aether_quant-5.4.8/tests/test_rolling_ic_gate_replay.py +153 -0
- aether_quant-5.4.8/tests/test_sector_map.py +66 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_status_export.py +71 -0
- aether_quant-5.4.8/tests/test_train_cross_asset_sensitivity.py +136 -0
- aether_quant-5.4.8/tests/test_train_cross_sectional_batching.py +162 -0
- aether_quant-5.4.8/tests/test_train_gate_friendliness.py +141 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_indicators.py +42 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_multitask.py +82 -0
- aether_quant-5.4.8/tests/test_train_optimizer_and_swa.py +171 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_pipeline.py +86 -0
- aether_quant-5.4.8/tests/test_train_ranking_loss.py +418 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_ranking_validation.py +175 -0
- aether_quant-5.4.8/tests/test_train_residual_rank_targets.py +266 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_rl_sizing.py +75 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_sequence.py +15 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_sequence_architecture.py +60 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_threshold_and_early_stop.py +2 -2
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_walk_forward_windows.py +47 -2
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_trigger_worker.py +9 -1
- aether_quant-5.4.8/tests/test_v543_new_features.py +169 -0
- aether_quant-5.4.8/tests/test_v547_bug_hunt.py +497 -0
- aether_quant-5.4.8/tests/test_validation_gate.py +323 -0
- aether_quant-5.4.8/tests/test_walk_forward_multimodel.py +225 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_yfinance_backfill.py +0 -1
- aether_quant-5.4.8/topology/README.md +122 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/topology/__init__.py +2 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/topology/market_topology.py +14 -2
- {aether_quant-4.12.3 → aether_quant-5.4.8}/train.py +1620 -155
- {aether_quant-4.12.3 → aether_quant-5.4.8}/train_multitask.py +274 -30
- {aether_quant-4.12.3 → aether_quant-5.4.8}/train_rl_sizing.py +42 -10
- {aether_quant-4.12.3 → aether_quant-5.4.8}/train_sequence.py +259 -32
- {aether_quant-4.12.3 → aether_quant-5.4.8}/train_strategy_selector.py +0 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/visualization/README.md +24 -0
- aether_quant-5.4.8/visualization/forex_order_sizing.jsonl +991 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/README.md +36 -16
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/App.tsx +6 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/api/client.ts +3 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/api/hooks.ts +13 -0
- aether_quant-5.4.8/webui/src/components/evaluation/AblationPanel.test.tsx +82 -0
- aether_quant-5.4.8/webui/src/components/evaluation/AblationPanel.tsx +103 -0
- aether_quant-5.4.8/webui/src/components/evaluation/BenchmarkPanel.test.tsx +71 -0
- aether_quant-5.4.8/webui/src/components/evaluation/BenchmarkPanel.tsx +99 -0
- aether_quant-5.4.8/webui/src/components/evaluation/BookHistoryReconciliationPanel.test.tsx +79 -0
- aether_quant-5.4.8/webui/src/components/evaluation/BookHistoryReconciliationPanel.tsx +129 -0
- aether_quant-5.4.8/webui/src/components/evaluation/BookSpreadCalibrationPanel.test.tsx +39 -0
- aether_quant-5.4.8/webui/src/components/evaluation/BookSpreadCalibrationPanel.tsx +66 -0
- aether_quant-5.4.8/webui/src/components/evaluation/CapacityStressPanel.tsx +99 -0
- aether_quant-5.4.8/webui/src/components/evaluation/MonteCarloPanel.test.tsx +81 -0
- aether_quant-5.4.8/webui/src/components/evaluation/MonteCarloPanel.tsx +100 -0
- aether_quant-5.4.8/webui/src/components/evaluation/RankBookPerformancePanel.test.tsx +60 -0
- aether_quant-5.4.8/webui/src/components/evaluation/RankBookPerformancePanel.tsx +66 -0
- aether_quant-5.4.8/webui/src/components/evaluation/WalkForwardStabilityPanel.test.tsx +93 -0
- aether_quant-5.4.8/webui/src/components/evaluation/WalkForwardStabilityPanel.tsx +132 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/layout/AppShell.tsx +1 -0
- aether_quant-5.4.8/webui/src/components/monitoring/KillSwitchPanel.test.tsx +54 -0
- aether_quant-5.4.8/webui/src/components/monitoring/KillSwitchPanel.tsx +77 -0
- aether_quant-5.4.8/webui/src/components/monitoring/ReconciliationPanel.test.tsx +55 -0
- aether_quant-5.4.8/webui/src/components/monitoring/ReconciliationPanel.tsx +75 -0
- aether_quant-5.4.8/webui/src/components/monitoring/RetrainingStatusPanel.test.tsx +76 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/RetrainingStatusPanel.tsx +22 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.test.tsx +22 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +49 -2
- aether_quant-5.4.8/webui/src/components/neuralnet/TrainingRecipePanel.test.tsx +63 -0
- aether_quant-5.4.8/webui/src/components/neuralnet/TrainingRecipePanel.tsx +68 -0
- aether_quant-5.4.8/webui/src/components/portfolio/BookNeutralityPanel.test.tsx +28 -0
- aether_quant-5.4.8/webui/src/components/portfolio/BookNeutralityPanel.tsx +57 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/AssetSizingTable.tsx +4 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/MacroSnapshotPanel.test.tsx +11 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/MacroSnapshotPanel.tsx +9 -1
- aether_quant-5.4.8/webui/src/components/risk/NetEdgePanel.test.tsx +54 -0
- aether_quant-5.4.8/webui/src/components/risk/NetEdgePanel.tsx +74 -0
- aether_quant-5.4.8/webui/src/components/risk/SensitivityPanel.test.tsx +37 -0
- aether_quant-5.4.8/webui/src/components/risk/SensitivityPanel.tsx +75 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/signals/Badge.tsx +3 -0
- aether_quant-5.4.8/webui/src/components/signals/RankSignalPanel.test.tsx +43 -0
- aether_quant-5.4.8/webui/src/components/signals/RankSignalPanel.tsx +50 -0
- aether_quant-5.4.8/webui/src/pages/EvaluationPage.tsx +36 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/NeuralNetworkPage.tsx +5 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/OperationsPage.tsx +7 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/Overview.tsx +2 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/RiskPage.tsx +6 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/pages.test.tsx +51 -1
- aether_quant-5.4.8/webui/src/types/evaluation.ts +284 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/types/state.ts +224 -0
- aether_quant-4.12.3/.github/workflows/ci.yml +0 -49
- aether_quant-4.12.3/aether_quant.egg-info/scm_version.json +0 -8
- aether_quant-4.12.3/aether_quant.egg-info/top_level.txt +0 -5
- aether_quant-4.12.3/analyzer/README.md +0 -116
- aether_quant-4.12.3/aq_cli.py +0 -1610
- aether_quant-4.12.3/config.json +0 -2001
- aether_quant-4.12.3/data/reference/sector_mapping.json +0 -32
- aether_quant-4.12.3/development/backtest_equity_chart.png +0 -0
- aether_quant-4.12.3/execution/README.md +0 -339
- aether_quant-4.12.3/experts/README.md +0 -34
- aether_quant-4.12.3/inference/README.md +0 -279
- aether_quant-4.12.3/liquidity/__init__.py +0 -8
- aether_quant-4.12.3/monitoring/README.md +0 -21
- aether_quant-4.12.3/performance/rank_ic_monitor.py +0 -122
- aether_quant-4.12.3/portfolio/book_construction.py +0 -257
- aether_quant-4.12.3/pyproject.toml +0 -49
- aether_quant-4.12.3/regime/README.md +0 -68
- aether_quant-4.12.3/requirements/README.md +0 -63
- aether_quant-4.12.3/requirements.txt +0 -15
- aether_quant-4.12.3/retraining/validation_gate.py +0 -164
- aether_quant-4.12.3/risk/README.md +0 -598
- aether_quant-4.12.3/risk_controls.py +0 -178
- aether_quant-4.12.3/scripts/README.md +0 -43
- aether_quant-4.12.3/tests/test_portfolio_book_construction.py +0 -429
- aether_quant-4.12.3/tests/test_validation_gate.py +0 -150
- aether_quant-4.12.3/topology/README.md +0 -250
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.devcontainer/devcontainer.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.devcontainer/dind-v1-test/devcontainer.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.dockerignore +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.env.compose.example +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.env.live.example +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.gitattributes +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/.githooks/pre-commit +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/Dockerfile +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/LICENSE +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/aether_quant.egg-info/dependency_links.txt +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/aether_quant.egg-info/entry_points.txt +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/audit/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/audit/hash_chain.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/audit/postgres_audit.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/backtests/.gitkeep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/cpp_inference_ext/README.md +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/cpp_inference_ext/pyproject.toml +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/cpp_inference_ext/setup.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/cpp_inference_ext/src/linear_batched.cpp +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/estimize/consensus/aapl/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/estimize/estimate/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/estimize/release/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/sec/aapl/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/trading-economics/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/trading-economics/calendar/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/trading-economics/earnings/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/alternative/trading-economics/indicator/.keep +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/reference/forex_pair_specs.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data/reference/futures_contract_specs.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/dividend_backfill.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/ib_backfill.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/data_pipeline/v2_manifest.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/development/logo.png +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/docker-compose.yml +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/config_cache.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/lean_config_render.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/live_credentials.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/live_credentials_io.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/paper_readiness.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/paper_readiness_io.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/paper_readiness_scheduler.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/runtime_config_io.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/execution/secret_scan.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experience/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experience/observation_metrics.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experience/simulated_portfolio.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experts/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/experts/expert_datasets.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/bond_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/derivatives_macro_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/macro_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/options_greeks.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/features/technical_indicators.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/generate_backtest_report.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/inference/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/inference/exported_model.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/inference/parallel_inference.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/inference/strategy_selector_inference.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/moe/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/monitoring/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/monitoring/strategy_catalog.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/notifications/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/notifications/postgres_telegram.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/notifications/telegram_client.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/performance/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/performance/postgres_triggers.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/performance/trigger_worker.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/performance/triggers.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/portfolio/options_arbitrage_detector.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/portfolio/options_assignment_risk.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/portfolio/options_margin_sizing.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/portfolio/options_strategy.py +1 -1
- {aether_quant-4.12.3 → aether_quant-5.4.8}/regime/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/regime/market_regime.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/lean_backtest.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/planning.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/postgres_registry.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/vault_client.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/retraining/vault_commands.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/risk/__init__.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/risk/asset_class_router.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/risk/forex_risk.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/risk/futures_risk.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/scripts/profile_inference.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/scripts/render_lean_credentials.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/setup.cfg +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_asset_class_router.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_assets_status.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_audit_queue.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_audit_status_export.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_backtest_gate.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_bond_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_config_cache.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_derivatives_macro_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_dividend_backfill.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_dockerignore_secrets.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_experience_queue.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_expert_datasets.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_expert_models.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_fetch.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_forex_risk.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_futures_risk.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_gating_network.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_generate_backtest_report.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_hash_chain.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_lean_backtest.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_lean_backtest_ml_coverage.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_lean_config_render.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_learned_topology.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_live_credentials.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_live_credentials_io.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_macro_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_market_regime.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_observation_metrics.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_options_arbitrage_detector.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_options_assignment_risk.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_options_greeks.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_options_margin_sizing.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_options_strategy.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_options_strategy_multileg.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_paper_readiness.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_paper_readiness_io.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_paper_readiness_report.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_paper_readiness_scheduler.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_parallel_inference.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_postgres_audit.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_postgres_telegram.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_postgres_triggers.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_profile_inference.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_profile_subsystems.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_rank_ic_monitor.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_retraining_artifacts.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_retraining_planning.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_retraining_postgres_registry.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_rl_sizing.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_runtime_config_io.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_secret_scan.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_simulated_portfolio.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_strategy_catalog.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_strategy_selector_inference.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_technical_indicators.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_telegram_alerts.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_telegram_client.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_telegram_worker.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_alt_data_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_asset_class_context_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_bond_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_cross_sectional_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_derivatives_macro_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_gating.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_macro_features.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_multitask_architecture.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_select_model_context_columns.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_strategy_selector.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_train_topology.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_triggers.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_v2_pipeline_manifest.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_vault_client.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/tests/test_vault_commands.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/topology/learned_topology.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/train_gating.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/train_topology.py +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/.gitignore +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/.oxlintrc.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/index.html +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/overview_v2_12.png +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/package-lock.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/package.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/public/favicon.svg +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/public/icons.svg +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/risk_v2_12.png +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/heatmap/AssetHeatmap.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/layout/Panel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/AssetsStatusPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/AuditLogPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/CountTable.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/MonitoringFeeds.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/ObservationPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/PaperReadinessPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/monitoring/RawStateViewer.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/optionsstrategy/CorporateActionsPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/optionsstrategy/DividendScheduleSummaryPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/optionsstrategy/ForexPairDetailPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/optionsstrategy/HeldMultiLegPositionsPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/optionsstrategy/StrategyCatalogBrowser.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/optionsstrategy/StrategySelectorScoresPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/AssetSizingTable.test.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/DerivativesMacroPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/LiquidityTable.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/RiskBar.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/RiskCore.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/risk/StrategyRiskCards.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/scene3d/Scene3D.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/scorecards/Scorecards.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/signals/PositionsList.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/signals/SignalBoard.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/topology/ClusterList.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/topology/TopologyLearningPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/topology/TopologyScene3D.test.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/topology/TopologyScene3D.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/AssetPerformancePanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/BacktestEquityPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/DivergingBarChart.test.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/DivergingBarChart.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/LineChart.test.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/LineChart.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/MetricsSnapshotPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/components/tracing/ObservationEquityPanel.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/index.css +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/lib/downsample.ts +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/lib/format.test.ts +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/lib/format.ts +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/main.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/OptionsStrategyPage.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/TopologyPage.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/pages/TracingPage.tsx +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/test/setup.ts +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/types/audit.ts +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/src/types/tracing.ts +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/tsconfig.app.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/tsconfig.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/tsconfig.node.json +0 -0
- {aether_quant-4.12.3 → aether_quant-5.4.8}/webui/vite.config.ts +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# .devcontainer
|
|
2
|
+
|
|
3
|
+
GitHub Codespaces / VS Code Dev Container definition for Aether Quant
|
|
4
|
+
(`devcontainer.json`), plus a `dind-v1-test/` variant used to test
|
|
5
|
+
Docker-in-Docker setups.
|
|
6
|
+
|
|
7
|
+
The container is the `mcr.microsoft.com/devcontainers/python:3.11` image with
|
|
8
|
+
an sshd feature (Codespaces training access) and a post-create command that
|
|
9
|
+
installs the CPU PyTorch build plus both requirements files. This is the
|
|
10
|
+
environment behind this project's own "train in the cloud" convention — see
|
|
11
|
+
[`RUNBOOK.md`](../RUNBOOK.md) and
|
|
12
|
+
[`development/infrastructure.md`](../development/infrastructure.md).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# .githooks
|
|
2
|
+
|
|
3
|
+
Optional git hooks, opt-in per clone (never auto-installed on a fresh
|
|
4
|
+
checkout):
|
|
5
|
+
|
|
6
|
+
```powershell
|
|
7
|
+
git config core.hooksPath .githooks
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Currently one hook: `pre-commit`, which invokes `aq secrets-check`
|
|
11
|
+
(`execution/secret_scan.py`) and blocks the commit if a populated secret
|
|
12
|
+
field is about to land in the tracked `lean.json` or a real `.env` file is
|
|
13
|
+
tracked by git. This is what actually stops a secret from being committed —
|
|
14
|
+
see [`SECURITY.md`](../SECURITY.md) for the reporting policy.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Something is broken, wrong, or behaves differently than documented.
|
|
4
|
+
title: "[bug] "
|
|
5
|
+
labels: ["bug"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## What happened
|
|
9
|
+
|
|
10
|
+
<!-- One or two sentences. Lead with the observable failure. -->
|
|
11
|
+
|
|
12
|
+
## Where
|
|
13
|
+
|
|
14
|
+
<!-- File(s)/module(s)/CLI command(s) involved, e.g. `aq evaluate --rank-book`, portfolio/book_construction.py -->
|
|
15
|
+
|
|
16
|
+
## Expected vs actual
|
|
17
|
+
|
|
18
|
+
- **Expected:**
|
|
19
|
+
- **Actual:**
|
|
20
|
+
|
|
21
|
+
## Reproduction
|
|
22
|
+
|
|
23
|
+
<!--
|
|
24
|
+
Minimal steps from a clean clone. Include the exact command(s) and any
|
|
25
|
+
config.json keys involved (`aq config get <dotted.key>` output helps).
|
|
26
|
+
-->
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
<commands / steps>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Evidence
|
|
33
|
+
|
|
34
|
+
<!-- Test output, log excerpt, or backtest artifact reference. Paste the
|
|
35
|
+
smallest relevant slice; link large files instead of pasting them. -->
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
<output>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Environment
|
|
42
|
+
|
|
43
|
+
- OS:
|
|
44
|
+
- Python version:
|
|
45
|
+
- Commit / tag:
|
|
46
|
+
|
|
47
|
+
## Checklist
|
|
48
|
+
|
|
49
|
+
- [ ] I ran `aq test` and can name the failing/passing state
|
|
50
|
+
- [ ] I checked `development/Problems.md` for a known entry covering this
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Question / usage help
|
|
4
|
+
url: https://github.com/leon1706-lol/Aether-quant/discussions
|
|
5
|
+
about: Ask here before opening an issue — most setup questions are answered in README.md, development/infrastructure.md, or CONTRIBUTING.md.
|
|
6
|
+
- name: Security vulnerability
|
|
7
|
+
url: https://github.com/leon1706-lol/Aether-quant/security/advisories/new
|
|
8
|
+
about: Report privately via GitHub Security Advisories — do NOT open a public issue (see SECURITY.md).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: A new subsystem, module, CLI capability, or behavioral improvement.
|
|
4
|
+
title: "[feature] "
|
|
5
|
+
labels: ["enhancement"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Problem to solve
|
|
9
|
+
|
|
10
|
+
<!-- What can't you do today? Describe the user-facing need, not the implementation. -->
|
|
11
|
+
|
|
12
|
+
## Proposed behavior
|
|
13
|
+
|
|
14
|
+
<!-- What should exist after this ships? Include the intended CLI/config surface if any:
|
|
15
|
+
new `aq` command/flag? new `phase_v2.*` config block (remember: flags ship `false`
|
|
16
|
+
until verified)? new output artifact? -->
|
|
17
|
+
|
|
18
|
+
## Scope guardrails
|
|
19
|
+
|
|
20
|
+
<!-- This repo's conventions shape every feature. Confirm how yours fits: -->
|
|
21
|
+
|
|
22
|
+
- [ ] Ships backward-compatible: additive `None`-default parameters / default-off config keys; an unmodified `config.json` reproduces today's behavior exactly.
|
|
23
|
+
- [ ] Testable without Lean: pure logic lives in a package module, not `main.py`; tests planned/attached.
|
|
24
|
+
- [ ] Docs plan: README/sub-readmes + `development/Changelog.md` entry (and `development/architecture.md` when it changes system structure).
|
|
25
|
+
|
|
26
|
+
## Alternatives considered
|
|
27
|
+
|
|
28
|
+
<!-- What did you rule out and why? -->
|
|
29
|
+
|
|
30
|
+
## Extra context
|
|
31
|
+
|
|
32
|
+
<!-- Related Problems.md entries (#N), prior Changelog rounds, or backtest evidence. -->
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<!-- Title style: `V<version> <short what-and-why>` for release-bound PRs,
|
|
2
|
+
matching the repo's commit history; otherwise a plain descriptive title. -->
|
|
3
|
+
|
|
4
|
+
## What & why
|
|
5
|
+
|
|
6
|
+
<!-- One paragraph: what changed and the problem/round it belongs to.
|
|
7
|
+
Reference development/Problems.md entries (#N) where applicable. -->
|
|
8
|
+
|
|
9
|
+
## Changes
|
|
10
|
+
|
|
11
|
+
-
|
|
12
|
+
-
|
|
13
|
+
|
|
14
|
+
## Behavior contract
|
|
15
|
+
|
|
16
|
+
<!-- This repo's hard rule: prove what changed and for whom. -->
|
|
17
|
+
|
|
18
|
+
- [ ] Default behavior is byte-identical when new flags/params are absent (`None`-default / default-off convention), **or** the behavior change is intentional and listed below:
|
|
19
|
+
- <!-- intentional changes here -->
|
|
20
|
+
- New config keys: <!-- `phase_v2.*` keys + defaults, or "none" -->
|
|
21
|
+
|
|
22
|
+
## Verification
|
|
23
|
+
|
|
24
|
+
<!-- How was this confirmed? The suite must be green before review. -->
|
|
25
|
+
|
|
26
|
+
- [ ] `aq test` green (N passed): <!-- paste count -->
|
|
27
|
+
- New tests: <!-- files + what they pin down -->
|
|
28
|
+
- Manual checks: <!-- CLI dry-runs, real-data spot checks -->
|
|
29
|
+
- Real Lean backtest: <!-- not run in PRs by convention; note if one is required before merge -->
|
|
30
|
+
|
|
31
|
+
## Docs updated
|
|
32
|
+
|
|
33
|
+
- [ ] README / sub-package README
|
|
34
|
+
- [ ] `development/Changelog.md` (append-only entry)
|
|
35
|
+
- [ ] `development/Problems.md` (if a bug was found/fixed)
|
|
36
|
+
- [ ] `development/architecture.md` / `development/infrastructure.md` (if structure/services changed)
|
|
37
|
+
- [ ] Obsidian vault regenerated (`generate_code_graph.py` → `regenerate_vault.py --append-handoff`)
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
# V5.3.9 - deep CI suite: windows+ubuntu pytest matrix with a calibrated
|
|
4
|
+
# coverage fail-under gate (82% measured - 2), ruff lint, the full webui
|
|
5
|
+
# vitest suite, an offline CLI smoke battery, and workflow self-validation.
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [main]
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
# V5.4.2 - cancel superseded runs on rapid-fire pushes (ported from Aether-Vault)
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
python-tests:
|
|
18
|
+
runs-on: ${{ matrix.os }}
|
|
19
|
+
timeout-minutes: 30
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
os: [ubuntu-latest, windows-latest]
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
|
|
27
|
+
- uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: "3.11"
|
|
30
|
+
cache: "pip"
|
|
31
|
+
|
|
32
|
+
- name: Syntax-check main.py (no Lean runtime available in CI - see development/Problems.md #69)
|
|
33
|
+
run: python -m py_compile main.py
|
|
34
|
+
|
|
35
|
+
- name: Install dependencies
|
|
36
|
+
run: |
|
|
37
|
+
pip install -r requirements/requirements.txt -r requirements/requirements-dev.txt
|
|
38
|
+
pip install pytest-cov
|
|
39
|
+
|
|
40
|
+
- name: Run full test suite with coverage gate
|
|
41
|
+
run: >
|
|
42
|
+
pytest -m "not lean_backtest" -ra
|
|
43
|
+
--cov --cov-report=term-missing --cov-report=xml
|
|
44
|
+
--cov-fail-under=80
|
|
45
|
+
|
|
46
|
+
- name: Upload coverage artifact
|
|
47
|
+
if: matrix.os == 'ubuntu-latest'
|
|
48
|
+
uses: actions/upload-artifact@v4
|
|
49
|
+
with:
|
|
50
|
+
name: coverage-xml
|
|
51
|
+
path: coverage.xml
|
|
52
|
+
|
|
53
|
+
python-lint:
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v4
|
|
57
|
+
|
|
58
|
+
- uses: actions/setup-python@v5
|
|
59
|
+
with:
|
|
60
|
+
python-version: "3.11"
|
|
61
|
+
|
|
62
|
+
# V5.3.11 FIX: bare `ruff check .` — NOT `aq test --ruff` (which
|
|
63
|
+
# requires importing aq_cli → pandas via the full package chain, but
|
|
64
|
+
# this job intentionally has a minimal environment). Local devs use
|
|
65
|
+
# `aq test --ruff`; CI uses bare ruff for speed.
|
|
66
|
+
# V5.4.7: ruff is PINNED - the previous unbounded range let new ruff
|
|
67
|
+
# releases add rules and break CI independently of any repo change.
|
|
68
|
+
- name: Install ruff
|
|
69
|
+
run: pip install "ruff==0.16.4"
|
|
70
|
+
|
|
71
|
+
- name: Ruff check (E/F ruleset calibrated in pyproject.toml)
|
|
72
|
+
run: ruff check .
|
|
73
|
+
|
|
74
|
+
- name: Syntax-check main.py
|
|
75
|
+
run: python -m py_compile main.py
|
|
76
|
+
|
|
77
|
+
dependency-audit:
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
timeout-minutes: 15
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/checkout@v4
|
|
82
|
+
|
|
83
|
+
- uses: actions/setup-python@v5
|
|
84
|
+
with:
|
|
85
|
+
python-version: "3.11"
|
|
86
|
+
|
|
87
|
+
- name: Install pip-audit
|
|
88
|
+
run: pip install pip-audit
|
|
89
|
+
|
|
90
|
+
- name: Audit runtime dependencies for known CVEs
|
|
91
|
+
run: |
|
|
92
|
+
pip install -r requirements/requirements.txt
|
|
93
|
+
pip-audit --requirement requirements/requirements.txt --desc
|
|
94
|
+
|
|
95
|
+
- name: Audit dev dependencies for known CVEs
|
|
96
|
+
run: |
|
|
97
|
+
pip-audit --requirement requirements/requirements-dev.txt --desc
|
|
98
|
+
|
|
99
|
+
webui-tests:
|
|
100
|
+
runs-on: ubuntu-latest
|
|
101
|
+
timeout-minutes: 20
|
|
102
|
+
defaults:
|
|
103
|
+
run:
|
|
104
|
+
working-directory: webui
|
|
105
|
+
steps:
|
|
106
|
+
- uses: actions/checkout@v4
|
|
107
|
+
|
|
108
|
+
- uses: actions/setup-node@v4
|
|
109
|
+
with:
|
|
110
|
+
node-version: "20"
|
|
111
|
+
cache: "npm"
|
|
112
|
+
cache-dependency-path: webui/package-lock.json
|
|
113
|
+
|
|
114
|
+
- run: npm ci
|
|
115
|
+
- run: npx tsc -b
|
|
116
|
+
- run: npx oxlint
|
|
117
|
+
# V5.3.9 - the full frontend suite finally runs in CI too.
|
|
118
|
+
- run: npx vitest run --pool=threads
|
|
119
|
+
- run: npm run build
|
|
120
|
+
|
|
121
|
+
cli-smoke:
|
|
122
|
+
runs-on: ubuntu-latest
|
|
123
|
+
timeout-minutes: 15
|
|
124
|
+
steps:
|
|
125
|
+
- uses: actions/checkout@v4
|
|
126
|
+
|
|
127
|
+
- uses: actions/setup-python@v5
|
|
128
|
+
with:
|
|
129
|
+
python-version: "3.11"
|
|
130
|
+
|
|
131
|
+
- name: Install package editable
|
|
132
|
+
run: |
|
|
133
|
+
pip install -r requirements/requirements.txt
|
|
134
|
+
pip install -e .
|
|
135
|
+
|
|
136
|
+
- name: CLI smoke battery (offline, deterministic)
|
|
137
|
+
run: |
|
|
138
|
+
aq --help > /dev/null
|
|
139
|
+
aq evaluate --help > /dev/null
|
|
140
|
+
aq config get phase1.universe.name
|
|
141
|
+
aq secrets-check
|
|
142
|
+
|
|
143
|
+
workflows-lint:
|
|
144
|
+
runs-on: ubuntu-latest
|
|
145
|
+
timeout-minutes: 10
|
|
146
|
+
steps:
|
|
147
|
+
- uses: actions/checkout@v4
|
|
148
|
+
|
|
149
|
+
# V5.3.10 - single-step pinned install + validate: the previous two-step
|
|
150
|
+
# pattern (PATH append, then bare `actionlint`) failed with
|
|
151
|
+
# "command not found" on the runner. Pinned to v1.7.7 for
|
|
152
|
+
# reproducibility (meta-tested in tests/test_ci_workflows.py).
|
|
153
|
+
- name: Validate workflow files (actionlint v1.7.7)
|
|
154
|
+
run: |
|
|
155
|
+
curl -sSL -o actionlint.tar.gz \
|
|
156
|
+
https://github.com/rhysd/actionlint/releases/download/v1.7.7/actionlint_1.7.7_linux_amd64.tar.gz
|
|
157
|
+
tar -xzf actionlint.tar.gz actionlint
|
|
158
|
+
./actionlint -no-color -verbose
|
|
@@ -9,6 +9,28 @@ on:
|
|
|
9
9
|
tags: ["v*.*.*"]
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
|
+
# V5.3.9 - NON-BLOCKING visibility job: runs the full offline suite on the
|
|
13
|
+
# tagged commit so release-time gaps are visible right next to the
|
|
14
|
+
# artifacts. Deliberately NOT wired into `needs:` of the publish jobs
|
|
15
|
+
# (user decision): releases proceed regardless; read this job's result to
|
|
16
|
+
# see where the gaps are.
|
|
17
|
+
tag-tests:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.11"
|
|
25
|
+
cache: "pip"
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: |
|
|
29
|
+
pip install -r requirements/requirements.txt -r requirements/requirements-dev.txt
|
|
30
|
+
|
|
31
|
+
- name: Run full offline suite (visibility only - does not gate the release)
|
|
32
|
+
run: pytest -m "not lean_backtest" -ra
|
|
33
|
+
|
|
12
34
|
publish-pypi:
|
|
13
35
|
runs-on: ubuntu-latest
|
|
14
36
|
environment: pypi # must match the Environment name configured in PyPI's Trusted Publisher setup
|
|
@@ -78,3 +100,26 @@ jobs:
|
|
|
78
100
|
# image, so the npm ci/pip install layers survive between runs.
|
|
79
101
|
cache-from: type=gha
|
|
80
102
|
cache-to: type=gha,mode=max
|
|
103
|
+
|
|
104
|
+
# Creates the GitHub Release itself, once per tag. Notes are auto-generated
|
|
105
|
+
# (commit list since the previous tag); the body additionally points at the
|
|
106
|
+
# matching development/Changelog.md entry, which is this repo's canonical
|
|
107
|
+
# per-version record (see CONTRIBUTING.md's versioning section).
|
|
108
|
+
github-release:
|
|
109
|
+
runs-on: ubuntu-latest
|
|
110
|
+
permissions:
|
|
111
|
+
contents: write
|
|
112
|
+
steps:
|
|
113
|
+
- uses: actions/checkout@v4
|
|
114
|
+
|
|
115
|
+
- name: Create GitHub Release with changelog link
|
|
116
|
+
env:
|
|
117
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
118
|
+
run: |
|
|
119
|
+
TAG="${GITHUB_REF_NAME}"
|
|
120
|
+
VERSION="${TAG#v}"
|
|
121
|
+
BODY="See [development/Changelog.md](https://github.com/${GITHUB_REPOSITORY}/blob/main/development/Changelog.md) for the full entry for \`V${VERSION}\` and every prior release."
|
|
122
|
+
gh release create "$TAG" \
|
|
123
|
+
--title "Aether Quant ${TAG}" \
|
|
124
|
+
--notes "$BODY" \
|
|
125
|
+
--generate-notes
|
|
@@ -73,6 +73,14 @@ ml/versions/
|
|
|
73
73
|
# rank-pivot roadmap work, development/Problems.md#43) - a local backup,
|
|
74
74
|
# never meant to be committed.
|
|
75
75
|
ml/_backup_pre_rank_pivot/
|
|
76
|
+
# Manual pre-smoke-test snapshot (rollback point before the V5.2.8
|
|
77
|
+
# gate_aware_ranking_weights Codespace smoke test, development/Problems.md#94)
|
|
78
|
+
# - a local backup, never meant to be committed.
|
|
79
|
+
ml/_backup_pre_v528_gate_aware_smoke_test/
|
|
80
|
+
# Manual pre-full-retrain snapshot (rollback point before the V5.2.9
|
|
81
|
+
# full production retrain with gate_aware_ranking_weights enabled) - a
|
|
82
|
+
# local backup, never meant to be committed.
|
|
83
|
+
ml/_backup_pre_v529_full_retrain/
|
|
76
84
|
ml/model.pt
|
|
77
85
|
ml/scaler.pkl
|
|
78
86
|
ml/*.pkl
|
|
@@ -119,6 +127,24 @@ visualization/state.json
|
|
|
119
127
|
visualization/scene.json
|
|
120
128
|
visualization/topology_state.json
|
|
121
129
|
visualization/grafana/
|
|
130
|
+
# V5.2.2 book-history diagnostic log - per-date live book selections
|
|
131
|
+
# (roles/raw scores/weights) from a real backtest. Off by default
|
|
132
|
+
# (phase_v2.diagnostics.book_history.enabled), but gitignored regardless
|
|
133
|
+
# so an accidental enable+commit can't leak it - same rationale as the
|
|
134
|
+
# ml/evaluation/ reports below. Wildcarded (not just the exact filename) so
|
|
135
|
+
# the per-run isolated extracts used for reconciliation (e.g.
|
|
136
|
+
# book_history_v524_only.jsonl, book_history_v525_only.jsonl - see
|
|
137
|
+
# development/Problems.md #91) are covered too; book_history_v524_only.jsonl
|
|
138
|
+
# was committed in V5.2.4's commit before this gap was caught, untracked
|
|
139
|
+
# alongside this fix (V5.2.5).
|
|
140
|
+
visualization/book_history*.jsonl
|
|
141
|
+
|
|
142
|
+
# Generated evaluation reports (aq evaluate --...) - reveal historical
|
|
143
|
+
# model selections/scores (book composition by date, rank scores,
|
|
144
|
+
# calibrated thresholds), effectively derived model IP, not source - same
|
|
145
|
+
# rationale as the ml/*_model.json weight-artifact rules above.
|
|
146
|
+
# Regenerable by re-running the command that wrote them.
|
|
147
|
+
ml/evaluation/
|
|
122
148
|
|
|
123
149
|
# Logs and temporary files
|
|
124
150
|
.coverage
|
|
@@ -142,6 +168,9 @@ webui/dist/
|
|
|
142
168
|
# scripts/profile_inference.py's pstats dump - regenerable output, not source
|
|
143
169
|
scripts/profile_inference_output*.txt
|
|
144
170
|
scripts/profile_subsystems_output*.txt
|
|
171
|
+
# scripts/order_events_audit.py's output dump (V5.3.1) - regenerable
|
|
172
|
+
# diagnostic output, not source.
|
|
173
|
+
scripts/order_events_audit_output*.txt
|
|
145
174
|
|
|
146
175
|
# cpp_inference_ext/'s compiled build artifacts - regenerable via
|
|
147
176
|
# `pip install -e cpp_inference_ext/`, never source. The .pyd itself is
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Aether Quant — Agent Instructions
|
|
2
|
+
|
|
3
|
+
## What this project is
|
|
4
|
+
|
|
5
|
+
Aether Quant is a dynamic, self-adapting algorithmic trading system built on
|
|
6
|
+
QuantConnect Lean and PyTorch. An ensemble of neural models predicts direction,
|
|
7
|
+
return magnitude, volatility, and cross-sectional rank for every asset every
|
|
8
|
+
day, driving a market-neutral long/short book validated end-to-end inside Lean,
|
|
9
|
+
with a kill switch, position reconciliation, and controlled retraining in front
|
|
10
|
+
of live trading.
|
|
11
|
+
|
|
12
|
+
## Essential commands
|
|
13
|
+
|
|
14
|
+
```powershell
|
|
15
|
+
pip install -e . # register `aq` CLI from source (pyproject.toml)
|
|
16
|
+
aq test # full pytest suite (~2929 tests), refreshes badge
|
|
17
|
+
aq test --risk # risk subsystem only (subsystem filtered)
|
|
18
|
+
aq evaluate # offline rank evaluation
|
|
19
|
+
aq backtest # real Lean backtest (requires Docker, ~1hr+)
|
|
20
|
+
ruff check . # linter (must pass before commit)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## File layout
|
|
24
|
+
|
|
25
|
+
| Path | What lives here |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `main.py` | Lean algorithm entry point — **zero unit test coverage by design**, only runs inside Lean |
|
|
28
|
+
| `risk/` | Position sizing, portfolio slicing, kill switch, correlation |
|
|
29
|
+
| `portfolio/` | Book construction, book neutrality, HRP, risk parity, options strategies |
|
|
30
|
+
| `execution/` | Order gate, cost model, reconciliation |
|
|
31
|
+
| `features/` | Pure feature functions (technical, macro, alt data, options greeks) |
|
|
32
|
+
| `inference/` | Model loading, exported model reader, batch inference |
|
|
33
|
+
| `moe/` | Mixture-of-experts gating and routing |
|
|
34
|
+
| `train.py` | Core training loop (dataset, ranking losses, walk-forward, export) |
|
|
35
|
+
| `train_*.py` | Specialized trainers (multitask, sequence, gating, topology, strategy selector) |
|
|
36
|
+
| `evaluation/` | Offline evaluation: rank book simulator, Monte Carlo, calibration tools |
|
|
37
|
+
| `retraining/` | Candidate promotion: validation gate, backtest gate, artifact versioning |
|
|
38
|
+
| `experience/` | Experience pipeline: Redis queue, Postgres worker, session summaries |
|
|
39
|
+
| `audit/` | Tamper-evident audit log (hash-chained) |
|
|
40
|
+
| `monitoring/` | FastAPI server, neural network state, evaluation state, Grafana dashboards |
|
|
41
|
+
| `notifications/` | Telegram alerts (pure/format/worker split) |
|
|
42
|
+
| `data_pipeline/` | Yahoo backfill, FRED backfill, bar synthesis, fetching |
|
|
43
|
+
| `regime/` | Market regime detection |
|
|
44
|
+
| `topology/` | Market topology overlay |
|
|
45
|
+
| `json_safety.py` | Shared JSON-safety helpers (finite-safe, atomic writes) |
|
|
46
|
+
| `aq_cli.py` | CLI entry point: all `aq` subcommands, subsystem test routing |
|
|
47
|
+
| `tests/` | pytest suite — one file per module, round files for cross-module regressions |
|
|
48
|
+
| `development/` | Architecture docs, Changelog, Problems.md, backups |
|
|
49
|
+
| `webui/` | React dashboard (TypeScript) |
|
|
50
|
+
|
|
51
|
+
## Code conventions
|
|
52
|
+
|
|
53
|
+
- **Pure, testable modules over `main.py` logic.** Anything needing tests must
|
|
54
|
+
be a pure function importable by both `main.py` and `tests/`.
|
|
55
|
+
- **One test file per source module.** Cross-module regressions go in round
|
|
56
|
+
files: `test_v543_new_features.py`, `test_rl_sizing_v541.py`, etc.
|
|
57
|
+
- **Register every new test file** in `aq_cli.py`'s `_SUBSYSTEM_TEST_FILES`
|
|
58
|
+
dict immediately when you create it — otherwise it is silently skipped by
|
|
59
|
+
subsystem-filtered runs (`aq test --risk`, `--portfolio`, etc.).
|
|
60
|
+
- **Never commit changes that break the full test suite.** Run `aq test` after
|
|
61
|
+
every code change; ruff must also be clean.
|
|
62
|
+
- **Round files at the same commit as their fixes.** Test + fix together, never
|
|
63
|
+
separately.
|
|
64
|
+
- **`aq test` only, never bare `pytest` from root** — see `development/Problems.md`
|
|
65
|
+
#8 and `tests/README.md`.
|
|
66
|
+
|
|
67
|
+
## Code context
|
|
68
|
+
|
|
69
|
+
- **README + sub-readmes:** every folder has a short sub-readme for introduction
|
|
70
|
+
and overview. Always read the relevant sub-readme before editing a module.
|
|
71
|
+
- **`development/` folder:** read every `.md` file — they hold important context
|
|
72
|
+
for project structure, plan, and known problems.
|
|
73
|
+
- **Obsidian vault** (`Aether-quant-Obsidian-Vault`): generated graph of all
|
|
74
|
+
dependencies and functions. Use for general overview, but always verify
|
|
75
|
+
against source — it can be outdated.
|
|
76
|
+
|
|
77
|
+
## Verification tasks
|
|
78
|
+
|
|
79
|
+
After every code change, complete ALL of the following:
|
|
80
|
+
|
|
81
|
+
1. **Add tests** for everything you added/changed.
|
|
82
|
+
2. **Run them** (`aq test` — no Lean backtest in the test suite) and debug if
|
|
83
|
+
needed. Also do manual debugging where unit tests don't cover.
|
|
84
|
+
3. **Update documentation:**
|
|
85
|
+
- README.md + sub-readmes (if module docs changed)
|
|
86
|
+
- Test suite badge (`aq test` auto-refreshes)
|
|
87
|
+
- `development/` folder: Problems.md, Changelog.md, architecture.md,
|
|
88
|
+
infrastructure.md
|
|
89
|
+
- `aq --help` surfaces if new/changed flags
|
|
90
|
+
4. **AQ Vault:** run `generate_code_graph.py` + `regenerate_vault.py
|
|
91
|
+
--append-handoff` (see Vault section below).
|
|
92
|
+
5. **Report to user:** say whether Docker image should be updated and/or git
|
|
93
|
+
commit saved. Say if `aq backtest` is needed — user runs backtests
|
|
94
|
+
themselves, never run them in the agent session.
|
|
95
|
+
|
|
96
|
+
## Model training
|
|
97
|
+
|
|
98
|
+
- **Always train models on the Codespace**, not locally. Use the CLI.
|
|
99
|
+
- **Sync codespace with local project** including all gitignored and normal
|
|
100
|
+
files before training.
|
|
101
|
+
- **Training codespace:** `aq-Training-Ground-Fixed` — keep it OFF when not in
|
|
102
|
+
active use to reduce costs.
|
|
103
|
+
- **After training finishes:** bring the entire model, data, and any extra files
|
|
104
|
+
back to the local machine for testing.
|
|
105
|
+
|
|
106
|
+
## Problems.md status markers
|
|
107
|
+
|
|
108
|
+
Every entry in `development/Problems.md` uses the established color scheme:
|
|
109
|
+
|
|
110
|
+
| Marker | Meaning |
|
|
111
|
+
|--------|---------|
|
|
112
|
+
| 🟢 `fixed` | Code changed + verified, nothing pending |
|
|
113
|
+
| 🟡 `partial` | Fix shipped but verification incomplete (needs backtest, live deploy, or user confirmation) |
|
|
114
|
+
| 🔴 `closed` | No code fix: declined/won't-fix/moot/superseded |
|
|
115
|
+
|
|
116
|
+
Always update the status marker when closing a problem entry.
|
|
117
|
+
|
|
118
|
+
## CI (`.github/workflows/ci.yml`)
|
|
119
|
+
|
|
120
|
+
Single job: checkout → setup-python 3.10 → install → ruff → `aq test` → badge refresh.
|
|
121
|
+
No Docker/Lean backtests in CI. Docker rebuild is required before any paper/live
|
|
122
|
+
deploy whenever material code changes land.
|
|
123
|
+
|
|
124
|
+
## Vault (Aether-quant-Obsidian-Vault)
|
|
125
|
+
|
|
126
|
+
The Obsidian vault tracks code graphs and agent handoffs:
|
|
127
|
+
|
|
128
|
+
```powershell
|
|
129
|
+
cd Aether-quant-Obsidian-Vault
|
|
130
|
+
python scripts/generate_code_graph.py --repo-root .. --vault .
|
|
131
|
+
python scripts/regenerate_vault.py --repo-root .. --vault . --append-handoff \
|
|
132
|
+
--agent ox-alpha --action completed --summary "..." --files file1.py file2.py
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Don'ts
|
|
136
|
+
|
|
137
|
+
- Never commit secrets, API keys, or credentials
|
|
138
|
+
- Never run `aq backtest` as part of an automated PR gate
|
|
139
|
+
- Never add new top-level `.py` modules without updating `pyproject.toml`
|
|
140
|
+
`py-modules` and re-installing with `pip install -e .`
|
|
141
|
+
- Never let NaN / inf / None silently pass through feature pipelines — use
|
|
142
|
+
`json_safety` helpers and explicit guards
|
|
143
|
+
- Never assume a Redis / Postgres / IB connection is available — always
|
|
144
|
+
degrade gracefully (the test suite runs without any of them)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our standard
|
|
4
|
+
|
|
5
|
+
This project is a research codebase worked on by people with very different
|
|
6
|
+
backgrounds. Participate in good faith: be respectful, be direct without
|
|
7
|
+
being hostile, and assume competence in others. Harassment, personal
|
|
8
|
+
attacks, and demeaning conduct are not acceptable anywhere in this
|
|
9
|
+
project's spaces.
|
|
10
|
+
|
|
11
|
+
## Expected behavior
|
|
12
|
+
|
|
13
|
+
- Critique code, data, and claims — not people.
|
|
14
|
+
- Keep discussions technical; this repo's tone is direct and evidence-first.
|
|
15
|
+
- Accept that backtest results, signal quality, and design choices get
|
|
16
|
+
challenged, sometimes bluntly. Disagreement about the work is normal and
|
|
17
|
+
welcome.
|
|
18
|
+
|
|
19
|
+
## Unacceptable behavior
|
|
20
|
+
|
|
21
|
+
- Harassment, discrimination, or personal attacks of any kind.
|
|
22
|
+
- Trolling, insulting or derogatory comments, and deliberate intimidation.
|
|
23
|
+
- Publishing others' private information (doxxing) without consent.
|
|
24
|
+
- Sexualized language or imagery, unwelcome attention of any kind.
|
|
25
|
+
- Sustained disruption of discussions after being asked to stop.
|
|
26
|
+
|
|
27
|
+
## Scope
|
|
28
|
+
|
|
29
|
+
This policy applies within the repository (issues, PRs, code review,
|
|
30
|
+
commit messages) and in all project community spaces: the GitHub
|
|
31
|
+
organization, discussions, chat channels, and any event or space claiming
|
|
32
|
+
to represent the project. It also applies when representing the project
|
|
33
|
+
externally.
|
|
34
|
+
|
|
35
|
+
## Enforcement
|
|
36
|
+
|
|
37
|
+
Maintainers enforce this policy and may edit or remove comments, commits,
|
|
38
|
+
code, issues, and PRs that violate it, up to and including temporarily or
|
|
39
|
+
permanently banning a contributor.
|
|
40
|
+
|
|
41
|
+
Report violations privately to the maintainers via
|
|
42
|
+
[GitHub report/flag mechanisms](https://docs.github.com/en/communities/moderating-comments-and-conversations/reporting-abuse-or-spam)
|
|
43
|
+
or a direct message to a maintainer. Do not escalate harassment in public
|
|
44
|
+
threads.
|
|
45
|
+
|
|
46
|
+
Reports are handled confidentially to the extent possible; information is
|
|
47
|
+
shared only with maintainers who need it to investigate and act. Retaliation
|
|
48
|
+
against anyone reporting in good faith is itself a violation.
|
|
49
|
+
|
|
50
|
+
Maintainers respond on a best-effort basis and will state an outcome to the
|
|
51
|
+
reporter where appropriate. Repeated or severe violations lead to permanent
|
|
52
|
+
removal from all project spaces.
|
|
53
|
+
|
|
54
|
+
## Attribution
|
|
55
|
+
|
|
56
|
+
Adapted for this project; not bound to any single template.
|