aether-quant 0.5.0__tar.gz → 0.7.0__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-0.5.0 → aether_quant-0.7.0}/.gitignore +0 -2
- {aether_quant-0.5.0 → aether_quant-0.7.0}/Dockerfile.retraining_worker +3 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/PKG-INFO +1 -1
- {aether_quant-0.5.0 → aether_quant-0.7.0}/README.md +209 -55
- {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/PKG-INFO +1 -1
- {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/SOURCES.txt +35 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/scm_file_list.json +35 -0
- aether_quant-0.7.0/aether_quant.egg-info/scm_version.json +8 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/analyzer/README.md +41 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/analyzer/__init__.py +2 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/analyzer/market_analyzer.py +101 -2
- {aether_quant-0.5.0 → aether_quant-0.7.0}/aq_cli.py +221 -1
- aether_quant-0.7.0/config.json +617 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/development/Changelog.md +609 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/development/Problems.md +72 -0
- aether_quant-0.7.0/development/backtest_equity_chart.png +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/development/infrastructure.md +24 -1
- {aether_quant-0.5.0 → aether_quant-0.7.0}/development/v2_architecture.md +144 -23
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/redis_queue.py +9 -0
- aether_quant-0.7.0/inference/README.md +125 -0
- aether_quant-0.7.0/inference/__init__.py +11 -0
- aether_quant-0.7.0/inference/exported_model.py +306 -0
- aether_quant-0.7.0/lean.json +649 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/liquidity/README.md +34 -0
- aether_quant-0.7.0/liquidity/__init__.py +8 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/main.py +301 -19
- aether_quant-0.7.0/ml/gating_model.json +570 -0
- aether_quant-0.7.0/ml/gating_training_metrics.json +190 -0
- aether_quant-0.7.0/ml/multitask_feature_schema.json +52 -0
- aether_quant-0.7.0/ml/multitask_model.json +5888 -0
- aether_quant-0.7.0/ml/multitask_training_metrics.json +248 -0
- aether_quant-0.7.0/ml/sequence_feature_schema.json +53 -0
- aether_quant-0.7.0/ml/sequence_model.json +13258 -0
- aether_quant-0.7.0/ml/sequence_training_metrics.json +209 -0
- aether_quant-0.7.0/ml/versions/stage123-1783709428/gating_feature_schema.json +30 -0
- aether_quant-0.7.0/ml/versions/stage123-1783709428/gating_model.json +570 -0
- aether_quant-0.7.0/ml/versions/stage123-1783709428/gating_training_metrics.json +190 -0
- aether_quant-0.7.0/ml/versions/stage123-1783709428/multitask_feature_schema.json +52 -0
- aether_quant-0.7.0/ml/versions/stage123-1783709428/multitask_model.json +5888 -0
- aether_quant-0.7.0/ml/versions/stage123-1783709428/multitask_training_metrics.json +248 -0
- aether_quant-0.7.0/ml/versions/stage4-1783711025/gating_feature_schema.json +30 -0
- aether_quant-0.7.0/ml/versions/stage4-1783711025/gating_model.json +570 -0
- aether_quant-0.7.0/ml/versions/stage4-1783711025/gating_training_metrics.json +190 -0
- aether_quant-0.7.0/ml/versions/stage4-1783711025/multitask_feature_schema.json +52 -0
- aether_quant-0.7.0/ml/versions/stage4-1783711025/multitask_model.json +5888 -0
- aether_quant-0.7.0/ml/versions/stage4-1783711025/multitask_training_metrics.json +248 -0
- aether_quant-0.7.0/ml/versions/stage5-1783715333/sequence_feature_schema.json +53 -0
- aether_quant-0.7.0/ml/versions/stage5-1783715333/sequence_model.json +13258 -0
- aether_quant-0.7.0/ml/versions/stage5-1783715333/sequence_training_metrics.json +209 -0
- aether_quant-0.7.0/ml/versions/v1/multitask_feature_schema.json +52 -0
- aether_quant-0.7.0/ml/versions/v1/multitask_model.json +5888 -0
- aether_quant-0.7.0/ml/versions/v1/multitask_training_metrics.json +248 -0
- aether_quant-0.7.0/ml/versions/v1/sequence_feature_schema.json +53 -0
- aether_quant-0.7.0/ml/versions/v1/sequence_model.json +13258 -0
- aether_quant-0.7.0/ml/versions/v1/sequence_training_metrics.json +209 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/moe/README.md +43 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/moe/gating.py +64 -1
- {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/neural_network_state.py +149 -13
- aether_quant-0.7.0/regime/README.md +57 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/README.md +15 -4
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/__init__.py +8 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/artifacts.py +40 -5
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/orchestrator.py +108 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/worker.py +14 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/README.md +32 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/position_sizing.py +25 -1
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_aq_cli.py +329 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_experience_queue.py +19 -2
- aether_quant-0.7.0/tests/test_exported_model.py +464 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_gating_network.py +127 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_lean_backtest_ml_coverage.py +46 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_analyzer.py +118 -1
- aether_quant-0.7.0/tests/test_neural_network_state.py +311 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_artifacts.py +136 -1
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_orchestrator.py +149 -0
- aether_quant-0.7.0/tests/test_train_cross_sectional_features.py +243 -0
- aether_quant-0.7.0/tests/test_train_multitask.py +113 -0
- aether_quant-0.7.0/tests/test_train_multitask_architecture.py +189 -0
- aether_quant-0.7.0/tests/test_train_sequence_architecture.py +196 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/README.md +34 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/train.py +840 -17
- aether_quant-0.7.0/train_multitask.py +403 -0
- aether_quant-0.7.0/train_sequence.py +403 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +60 -7
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/types/state.ts +9 -1
- aether_quant-0.5.0/aether_quant.egg-info/scm_version.json +0 -8
- aether_quant-0.5.0/development/backtest_equity_chart.png +0 -0
- aether_quant-0.5.0/inference/README.md +0 -35
- aether_quant-0.5.0/inference/__init__.py +0 -3
- aether_quant-0.5.0/inference/exported_model.py +0 -68
- aether_quant-0.5.0/liquidity/__init__.py +0 -3
- aether_quant-0.5.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_model.json +0 -570
- aether_quant-0.5.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_training_metrics.json +0 -190
- aether_quant-0.5.0/regime/README.md +0 -18
- aether_quant-0.5.0/tests/test_exported_model.py +0 -106
- aether_quant-0.5.0/tests/test_neural_network_state.py +0 -148
- {aether_quant-0.5.0 → aether_quant-0.7.0}/.dockerignore +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/.env.compose.example +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/.env.live.example +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/.gitattributes +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/.github/workflows/ci.yml +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/.github/workflows/release.yml +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/Dockerfile +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/Dockerfile.workers +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/dependency_links.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/entry_points.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/top_level.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/backtests/.gitkeep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/estimize/consensus/aapl/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/estimize/estimate/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/estimize/release/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/sec/aapl/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/calendar/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/earnings/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/indicator/.keep +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/fetch.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/v2_manifest.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/yfinance_backfill.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/development/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/development/logo.png +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/docker-compose.yml +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/config_cache.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/live_credentials.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/live_credentials_io.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/order_gate.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/paper_readiness.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/paper_readiness_io.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/paper_readiness_report.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/runtime_config_io.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/observation_metrics.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/postgres_worker.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/simulated_portfolio.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experts/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experts/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/experts/expert_datasets.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/generate_backtest_report.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/liquidity/market_liquidity.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/ml/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/ml/gating_feature_schema.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_feature_schema.json +0 -0
- {aether_quant-0.5.0/ml → aether_quant-0.7.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459}/gating_model.json +0 -0
- {aether_quant-0.5.0/ml → aether_quant-0.7.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459}/gating_training_metrics.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/moe/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/api_server.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/postgres_telegram.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/telegram_alerts.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/telegram_client.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/telegram_worker.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/postgres_triggers.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/trigger_worker.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/triggers.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/pyproject.toml +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/regime/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/regime/market_regime.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-dev.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-retraining-worker.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-runtime.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-workers.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements.txt +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/backtest_gate.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/lean_backtest.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/planning.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/postgres_registry.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/status_export.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/validation_gate.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/vault_client.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/vault_commands.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/manual_override.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/risk_controls.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/setup.cfg +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_backtest_gate.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_config_cache.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_expert_datasets.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_expert_models.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_fetch.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_generate_backtest_report.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_lean_backtest.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_learned_topology.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_live_credentials.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_live_credentials_io.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_manual_override.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_liquidity.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_regime.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_topology.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_observation_metrics.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_order_gate.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_paper_readiness.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_paper_readiness_io.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_paper_readiness_report.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_position_sizing.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_postgres_telegram.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_postgres_triggers.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_postgres_worker.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_planning.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_postgres_registry.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_worker.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_risk_controls.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_runtime_config_io.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_simulated_portfolio.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_status_export.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_telegram_alerts.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_telegram_client.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_telegram_worker.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_train_gating.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_train_pipeline.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_train_topology.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_trigger_worker.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_triggers.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_v2_pipeline_manifest.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_validation_gate.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_vault_client.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_vault_commands.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_yfinance_backfill.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/__init__.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/learned_topology.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/market_topology.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/train_gating.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/train_topology.py +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/visualization/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/.gitignore +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/.oxlintrc.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/README.md +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/index.html +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/overview_v2_12.png +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/package-lock.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/package.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/public/favicon.svg +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/public/icons.svg +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/risk_v2_12.png +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/App.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/api/client.ts +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/api/hooks.ts +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/heatmap/AssetHeatmap.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/layout/AppShell.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/layout/Panel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/CountTable.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/MonitoringFeeds.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/ObservationPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/PaperReadinessPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/RawStateViewer.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/RetrainingStatusPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/AssetSizingTable.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/LiquidityTable.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/RiskBar.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/RiskCore.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/StrategyRiskCards.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/scene3d/Scene3D.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/scorecards/Scorecards.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/signals/Badge.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/signals/PositionsList.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/signals/SignalBoard.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/topology/ClusterList.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/topology/TopologyLearningPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/topology/TopologyScene3D.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/AssetPerformancePanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/BacktestEquityPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/DivergingBarChart.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/LineChart.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/MetricsSnapshotPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/ObservationEquityPanel.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/index.css +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/lib/downsample.ts +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/lib/format.ts +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/main.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/NeuralNetworkPage.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/Overview.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/RiskPage.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/TopologyPage.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/TracingPage.tsx +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/types/tracing.ts +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/tsconfig.app.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/tsconfig.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/tsconfig.node.json +0 -0
- {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/vite.config.ts +0 -0
|
@@ -10,8 +10,11 @@ COPY experts/ ./experts/
|
|
|
10
10
|
COPY topology/ ./topology/
|
|
11
11
|
COPY moe/ ./moe/
|
|
12
12
|
COPY inference/ ./inference/
|
|
13
|
+
COPY risk/ ./risk/
|
|
13
14
|
COPY retraining/ ./retraining/
|
|
14
15
|
COPY train.py .
|
|
15
16
|
COPY train_topology.py .
|
|
16
17
|
COPY train_gating.py .
|
|
18
|
+
COPY train_multitask.py .
|
|
19
|
+
COPY train_sequence.py .
|
|
17
20
|
CMD ["python", "-m", "retraining.worker"]
|
|
@@ -10,11 +10,23 @@
|
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
12
|
<img src="https://img.shields.io/badge/python-3.10%2B-FF8C00?style=flat-square&labelColor=1A1A1A&logo=python&logoColor=white" alt="Python 3.10+">
|
|
13
|
-
<!-- AQ:TEST_BADGE_START --><img src="https://img.shields.io/badge/tests-
|
|
13
|
+
<!-- AQ:TEST_BADGE_START --><img src="https://img.shields.io/badge/tests-642%2F642%20passing-brightgreen?style=flat-square&labelColor=1A1A1A" alt="642 of 642 tests passing"><!-- AQ:TEST_BADGE_END -->
|
|
14
14
|
<img src="https://img.shields.io/pypi/v/aether-quant?style=flat-square&labelColor=1A1A1A&color=FF8C00" alt="PyPI version">
|
|
15
15
|
<img src="https://img.shields.io/badge/docker-ghcr.io%2Faether--quant-2496ED?style=flat-square&labelColor=1A1A1A&logo=docker&logoColor=white" alt="Docker image on GHCR">
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
|
+
<p align="center">
|
|
19
|
+
<img src="https://img.shields.io/badge/PyTorch-4B5563?style=flat-square&labelColor=1A1A1A&logo=pytorch&logoColor=white" alt="PyTorch">
|
|
20
|
+
<img src="https://img.shields.io/badge/scikit--learn-4B5563?style=flat-square&labelColor=1A1A1A&logo=scikitlearn&logoColor=white" alt="scikit-learn">
|
|
21
|
+
<img src="https://img.shields.io/badge/QuantConnect%20Lean-4B5563?style=flat-square&labelColor=1A1A1A" alt="QuantConnect Lean">
|
|
22
|
+
<img src="https://img.shields.io/badge/FastAPI-4B5563?style=flat-square&labelColor=1A1A1A&logo=fastapi&logoColor=white" alt="FastAPI">
|
|
23
|
+
<img src="https://img.shields.io/badge/React-4B5563?style=flat-square&labelColor=1A1A1A&logo=react&logoColor=white" alt="React">
|
|
24
|
+
<img src="https://img.shields.io/badge/TypeScript-4B5563?style=flat-square&labelColor=1A1A1A&logo=typescript&logoColor=white" alt="TypeScript">
|
|
25
|
+
<img src="https://img.shields.io/badge/Redis-4B5563?style=flat-square&labelColor=1A1A1A&logo=redis&logoColor=white" alt="Redis">
|
|
26
|
+
<img src="https://img.shields.io/badge/PostgreSQL-4B5563?style=flat-square&labelColor=1A1A1A&logo=postgresql&logoColor=white" alt="PostgreSQL">
|
|
27
|
+
<img src="https://img.shields.io/badge/GitHub%20Actions-4B5563?style=flat-square&labelColor=1A1A1A&logo=githubactions&logoColor=white" alt="GitHub Actions">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
18
30
|
Aether Quant is not a single static strategy — it's a **dynamic system**: a
|
|
19
31
|
Mixture-of-Experts ensemble (bullish/bearish/sideways/volatility specialists)
|
|
20
32
|
routed by a learned gating network, a market-regime detector, a 3D market
|
|
@@ -146,11 +158,14 @@ that a controlled retraining loop reads from to evolve the model over time.
|
|
|
146
158
|
|
|
147
159
|
```mermaid
|
|
148
160
|
flowchart LR
|
|
149
|
-
A["Lean data folder<br/>stocks, ETFs, crypto"] --> B["Feature pipeline<br/>train.py"]
|
|
161
|
+
A["Lean data folder<br/>stocks, ETFs, crypto"] --> B["Feature pipeline<br/>train.py<br/>48-dim: price/volume +<br/>regime + liquidity + topology"]
|
|
150
162
|
B --> C["Regime detection<br/>trend, volatility, drawdown, correlation"]
|
|
151
163
|
B --> D["3D topology modeling<br/>market structure and clusters"]
|
|
152
|
-
|
|
164
|
+
B -.-> U["Sequence encoder (Phase 2)<br/>causal-TCN, 30-bar window<br/>informational only"]
|
|
165
|
+
B --> V["Multitask heads<br/>baseline + 4 experts<br/>direction + magnitude + volatility"]
|
|
166
|
+
C --> E["Gating network<br/>the manager<br/>blends probability + magnitude/volatility"]
|
|
153
167
|
D --> E
|
|
168
|
+
V --> E
|
|
154
169
|
E --> F["Expert modules"]
|
|
155
170
|
F --> G["Bullish expert"]
|
|
156
171
|
F --> H["Bearish expert"]
|
|
@@ -168,6 +183,7 @@ flowchart LR
|
|
|
168
183
|
M --> O["Observation / simulation record"]
|
|
169
184
|
N --> P["Redis event stream<br/>temporary low-latency buffer"]
|
|
170
185
|
O --> P
|
|
186
|
+
U -.-> P
|
|
171
187
|
P --> Q["Experience worker<br/>async batch persistence"]
|
|
172
188
|
Q --> R["PostgreSQL experience database<br/>single source of truth"]
|
|
173
189
|
R --> S["Performance triggers<br/>100 observations, drawdown, Sharpe, regime shift"]
|
|
@@ -175,6 +191,11 @@ flowchart LR
|
|
|
175
191
|
T --> E
|
|
176
192
|
```
|
|
177
193
|
|
|
194
|
+
Dashed edges mark the Phase 2 sequence encoder's **informational-only**
|
|
195
|
+
path — it's computed every bar and reaches the experience log, but never
|
|
196
|
+
the gating network, market analyzer, or position sizing (see
|
|
197
|
+
`inference/README.md`'s Phase 2 section).
|
|
198
|
+
|
|
178
199
|
#### Tech Stack
|
|
179
200
|
|
|
180
201
|
```mermaid
|
|
@@ -191,6 +212,7 @@ flowchart TB
|
|
|
191
212
|
D --> D2["scikit-learn"]
|
|
192
213
|
D --> D3["NumPy / Pandas"]
|
|
193
214
|
D --> D4["MoE experts and gating network"]
|
|
215
|
+
D --> D5["Multitask heads (direction/magnitude/<br/>volatility) + causal-TCN sequence encoder"]
|
|
194
216
|
E["Monitoring and UI"] --> E1["React/Vite webui — Tracing dashboard (port 3002 dev / 8001 Docker)"]
|
|
195
217
|
E --> E2["FastAPI JSON API (port 8000)"]
|
|
196
218
|
E --> E3["Telegram alerts (V2-19)<br/>notifications/telegram_worker.py"]
|
|
@@ -203,6 +225,48 @@ and more), the module map, and an honest analysis of what would need to
|
|
|
203
225
|
change for this to become a genuinely low-latency/HFT system — see
|
|
204
226
|
**[`development/v2_architecture.md`](development/v2_architecture.md)**.
|
|
205
227
|
|
|
228
|
+
**The baseline model can now predict more than direction.** An optional
|
|
229
|
+
multi-task model (`train.py::AetherNetMultiTask`, trained by
|
|
230
|
+
`train_multitask.py`) predicts next-day direction, return magnitude and
|
|
231
|
+
volatility jointly from one shared trunk — the direction-only baseline and
|
|
232
|
+
experts are unchanged and still ship independently. All 4 experts also
|
|
233
|
+
have their own optional multitask heads (`train.py::_train_expert_multitask()`),
|
|
234
|
+
so `moe/gating.py` blends per-expert magnitude/volatility with a
|
|
235
|
+
baseline-scale anchor the same weighted-average way it already blends
|
|
236
|
+
direction. `main.py` threads the resulting `predicted_return_magnitude`/
|
|
237
|
+
`predicted_volatility` through the market analyzer (informational only,
|
|
238
|
+
never changes routing) and, opt-in via
|
|
239
|
+
`phase_v2.dynamic_risk.use_predicted_volatility`, into position sizing —
|
|
240
|
+
replacing the backward-looking `rolling_volatility_20d` average with an
|
|
241
|
+
actual forward-looking forecast for that one calculation.
|
|
242
|
+
|
|
243
|
+
**Regime, liquidity and topology are now genuine model input features,
|
|
244
|
+
not just downstream consumers of its output.** Model input dimensionality
|
|
245
|
+
grew from 30 to 48: regime one-hot/confidence/trend/risk score, an
|
|
246
|
+
asset-intrinsic liquidity spread/dollar-volume estimate, and cross-asset
|
|
247
|
+
topology correlation/risk state are all computed offline
|
|
248
|
+
(`train.py::add_regime_features()`/`add_liquidity_features()`/
|
|
249
|
+
`build_topology_features_by_date()`) and at runtime
|
|
250
|
+
(`main.py::_build_model_input()`, reordered so regime is computed
|
|
251
|
+
*before* the model runs) with verified train/runtime parity.
|
|
252
|
+
|
|
253
|
+
**A causal-TCN sequence encoder (Phase 2) now exists alongside the
|
|
254
|
+
flat-MLP trunk**, replacing the "zero temporal structure" limitation the
|
|
255
|
+
original root-cause investigation flagged — `train.py::AetherNetSequenceMultiTask`,
|
|
256
|
+
trained by `train_sequence.py`, over a rolling 30-bar window of
|
|
257
|
+
already-computed model inputs. Informational only this pass
|
|
258
|
+
(`main.py::_run_sequence_model()` — not yet wired into any trading
|
|
259
|
+
decision); see `inference/README.md`'s Phase 2 section for the new
|
|
260
|
+
`_conv1d_causal`/`_multihead_attention`/`_softmax`/`_layernorm_axis`
|
|
261
|
+
interpreter primitives (each independently verified against real PyTorch
|
|
262
|
+
modules).
|
|
263
|
+
|
|
264
|
+
See `inference/README.md`, `moe/README.md`, `risk/README.md`,
|
|
265
|
+
`regime/README.md`, `liquidity/README.md` and `topology/README.md` for
|
|
266
|
+
the full contracts, and `development/Changelog.md`'s "Multi-task
|
|
267
|
+
prediction" and "Phase 1 remainder + Phase 2" entries for the complete
|
|
268
|
+
writeup.
|
|
269
|
+
|
|
206
270
|
## Universe Size
|
|
207
271
|
|
|
208
272
|
The trading universe currently spans **20 assets** — 15 equities and 5
|
|
@@ -335,6 +399,9 @@ aether-quant/
|
|
|
335
399
|
├── main.py # Lean algorithm: inference, signal engine, risk controls
|
|
336
400
|
├── train.py # Training pipeline: dataset build, model training, validation
|
|
337
401
|
├── train_topology.py # Offline trainer for the learned topology overlay
|
|
402
|
+
├── train_gating.py # Offline trainer for the learned gating blend
|
|
403
|
+
├── train_multitask.py # Offline trainer for the joint direction+magnitude+volatility model
|
|
404
|
+
├── train_sequence.py # Offline trainer for the Phase 2 causal-TCN sequence encoder
|
|
338
405
|
├── generate_backtest_report.py # Regenerates this README's Backtest Results section
|
|
339
406
|
├── aq_cli.py # `aq` convenience CLI
|
|
340
407
|
├── config.json # Runtime configuration (phase1 / phase_v2 blocks)
|
|
@@ -392,13 +459,13 @@ and how it's wired in — this table is the index.
|
|
|
392
459
|
| Metric | Value |
|
|
393
460
|
|---|---|
|
|
394
461
|
| Backtest window | 2018-04-01 to 2021-04-02 |
|
|
395
|
-
| Sharpe Ratio | -0.
|
|
396
|
-
| Net Profit | -
|
|
397
|
-
| Compounding Annual Return | -
|
|
398
|
-
| Drawdown | 12.
|
|
399
|
-
| Total Orders |
|
|
400
|
-
| Win Rate |
|
|
401
|
-
| Last updated | 2026-07-
|
|
462
|
+
| Sharpe Ratio | -0.758 |
|
|
463
|
+
| Net Profit | -4.847% |
|
|
464
|
+
| Compounding Annual Return | -1.640% |
|
|
465
|
+
| Drawdown | 12.300% |
|
|
466
|
+
| Total Orders | 36 |
|
|
467
|
+
| Win Rate | 25% |
|
|
468
|
+
| Last updated | 2026-07-08 13:10 UTC (auto-generated by `aq backtest`) |
|
|
402
469
|
<!-- AQ:BACKTEST_END -->
|
|
403
470
|
|
|
404
471
|
<details>
|
|
@@ -407,33 +474,33 @@ and how it's wired in — this table is the index.
|
|
|
407
474
|
<!-- AQ:BACKTEST_FULL_STATS_START -->
|
|
408
475
|
| Metric | Value |
|
|
409
476
|
|---|---|
|
|
410
|
-
| Total Orders |
|
|
411
|
-
| Average Win | 0.
|
|
412
|
-
| Average Loss | -
|
|
413
|
-
| Compounding Annual Return | -
|
|
414
|
-
| Drawdown | 12.
|
|
415
|
-
| Expectancy | -0.
|
|
477
|
+
| Total Orders | 36 |
|
|
478
|
+
| Average Win | 0.38% |
|
|
479
|
+
| Average Loss | -0.67% |
|
|
480
|
+
| Compounding Annual Return | -1.640% |
|
|
481
|
+
| Drawdown | 12.300% |
|
|
482
|
+
| Expectancy | -0.609 |
|
|
416
483
|
| Start Equity | 100000.00 |
|
|
417
|
-
| End Equity |
|
|
418
|
-
| Net Profit | -
|
|
419
|
-
| Sharpe Ratio | -0.
|
|
420
|
-
| Sortino Ratio | -0.
|
|
421
|
-
| Probabilistic Sharpe Ratio | 0.
|
|
422
|
-
| Loss Rate |
|
|
423
|
-
| Win Rate |
|
|
424
|
-
| Profit-Loss Ratio | 0.
|
|
425
|
-
| Alpha | -0.
|
|
426
|
-
| Beta | 0.
|
|
427
|
-
| Annual Standard Deviation | 0.
|
|
428
|
-
| Annual Variance | 0.
|
|
429
|
-
| Information Ratio | -0.
|
|
430
|
-
| Tracking Error | 0.
|
|
431
|
-
| Treynor Ratio | -0.
|
|
432
|
-
| Total Fees | $
|
|
433
|
-
| Estimated Strategy Capacity | $
|
|
434
|
-
| Lowest Capacity Asset |
|
|
435
|
-
| Portfolio Turnover | 0.
|
|
436
|
-
| Drawdown Recovery |
|
|
484
|
+
| End Equity | 95153.40 |
|
|
485
|
+
| Net Profit | -4.847% |
|
|
486
|
+
| Sharpe Ratio | -0.758 |
|
|
487
|
+
| Sortino Ratio | -0.363 |
|
|
488
|
+
| Probabilistic Sharpe Ratio | 0.006% |
|
|
489
|
+
| Loss Rate | 75% |
|
|
490
|
+
| Win Rate | 25% |
|
|
491
|
+
| Profit-Loss Ratio | 0.56 |
|
|
492
|
+
| Alpha | -0.034 |
|
|
493
|
+
| Beta | 0.047 |
|
|
494
|
+
| Annual Standard Deviation | 0.038 |
|
|
495
|
+
| Annual Variance | 0.001 |
|
|
496
|
+
| Information Ratio | -0.786 |
|
|
497
|
+
| Tracking Error | 0.182 |
|
|
498
|
+
| Treynor Ratio | -0.603 |
|
|
499
|
+
| Total Fees | $25.59 |
|
|
500
|
+
| Estimated Strategy Capacity | $2300000.00 |
|
|
501
|
+
| Lowest Capacity Asset | BNO UN3IMQ2JU1YD |
|
|
502
|
+
| Portfolio Turnover | 0.14% |
|
|
503
|
+
| Drawdown Recovery | 32 |
|
|
437
504
|
<!-- AQ:BACKTEST_FULL_STATS_END -->
|
|
438
505
|
|
|
439
506
|
</details>
|
|
@@ -503,38 +570,125 @@ instead, without waiting on a PyPI release:
|
|
|
503
570
|
pip install -e .
|
|
504
571
|
```
|
|
505
572
|
|
|
506
|
-
Either way, `aq --help` gives the full command list
|
|
573
|
+
Either way, `aq --help` gives the full command list. Every command except
|
|
574
|
+
`aq trade-lock` and `aq fetch` is a thin `subprocess` wrapper around a
|
|
575
|
+
command already documented elsewhere in this README:
|
|
507
576
|
|
|
577
|
+
#### `aq train`
|
|
578
|
+
```text
|
|
579
|
+
aq train [--dataset-only|--init-only|--experts-only|--gating-only|--multitask-only|--sequence-only]
|
|
580
|
+
```
|
|
581
|
+
Runs `train.py`: builds the dataset and trains the baseline + expert
|
|
582
|
+
models. `--gating-only` trains just the learned gating blend
|
|
583
|
+
(`train_gating.py`) and installs it straight into active `ml/`,
|
|
584
|
+
mirroring what `--experts-only` already does for the expert models — see
|
|
585
|
+
`moe/README.md`. `--multitask-only` does the same for the joint
|
|
586
|
+
direction+magnitude+volatility model (`train_multitask.py`) — see
|
|
587
|
+
`inference/README.md`/`risk/README.md`. `--sequence-only` does the same
|
|
588
|
+
for the Phase 2 causal-TCN sequence encoder (`train_sequence.py`) — see
|
|
589
|
+
`inference/README.md`.
|
|
590
|
+
|
|
591
|
+
#### `aq test`
|
|
508
592
|
```text
|
|
509
|
-
aq train [--dataset-only|--init-only|--experts-only|--gating-only]
|
|
510
593
|
aq test
|
|
594
|
+
```
|
|
595
|
+
Runs the pytest suite and refreshes this README's test badge.
|
|
596
|
+
|
|
597
|
+
#### `aq backtest`
|
|
598
|
+
```text
|
|
511
599
|
aq backtest
|
|
600
|
+
```
|
|
601
|
+
Runs `lean backtest .` and refreshes this README's [Backtest Results](#backtest-results) section.
|
|
602
|
+
|
|
603
|
+
#### `aq report`
|
|
604
|
+
```text
|
|
512
605
|
aq report <backtest-folder> <result-id>
|
|
606
|
+
```
|
|
607
|
+
Generates Lean's own HTML backtest report (trade blotter, standard Lean
|
|
608
|
+
charts) at `backtests/<backtest-folder>/report.html`.
|
|
609
|
+
|
|
610
|
+
#### `aq api`
|
|
611
|
+
```text
|
|
513
612
|
aq api
|
|
613
|
+
```
|
|
614
|
+
Starts the FastAPI monitoring server on `:8001`.
|
|
615
|
+
|
|
616
|
+
#### `aq webui`
|
|
617
|
+
```text
|
|
514
618
|
aq webui
|
|
619
|
+
```
|
|
620
|
+
Starts the webui dev server (`npm run dev`).
|
|
621
|
+
|
|
622
|
+
#### `aq docker`
|
|
623
|
+
```text
|
|
515
624
|
aq docker up [--lean|--all]
|
|
516
625
|
aq docker build
|
|
626
|
+
```
|
|
627
|
+
`up` starts local infrastructure (default: Redis + PostgreSQL only).
|
|
628
|
+
`build` rebuilds the `aether-quant` app image.
|
|
629
|
+
|
|
630
|
+
#### `aq config`
|
|
631
|
+
```text
|
|
632
|
+
aq config [get <dotted.key>|set <dotted.key> <value>|keys [<dotted.prefix>]]
|
|
633
|
+
```
|
|
634
|
+
Reads or edits `config.json` directly, no manual file editing needed.
|
|
635
|
+
Bare `aq config` pretty-prints the whole file; `aq config keys
|
|
636
|
+
[<dotted.prefix>]` lists every leaf key path (handy for finding the right
|
|
637
|
+
key in a deeply nested file); `aq config get <dotted.key>` prints one
|
|
638
|
+
value (scalar, or a whole nested section as JSON); `aq config set
|
|
639
|
+
<dotted.key> <value>` writes it — the value is parsed as JSON first (so
|
|
640
|
+
`true`/`123`/`0.5`/`["a","b"]` become their real types automatically),
|
|
641
|
+
falling back to a plain string otherwise. Every `set` backs up the
|
|
642
|
+
previous file to `config.json.bak` first and prints old → new so a
|
|
643
|
+
mistake is immediately visible; changing a value's type (e.g. bool →
|
|
644
|
+
string) prints a warning but still writes it, since this command
|
|
645
|
+
intentionally gives full access to every key, not just a safe subset.
|
|
646
|
+
|
|
647
|
+
#### `aq lean`
|
|
648
|
+
```text
|
|
649
|
+
aq lean [get <dotted.key>|set <dotted.key> <value>|keys [<dotted.prefix>]]
|
|
650
|
+
```
|
|
651
|
+
The exact same `get`/`set`/`keys` tool as `aq config`, just pointed at
|
|
652
|
+
`lean.json` (the QuantConnect Lean CLI's own config file — broker
|
|
653
|
+
credentials, environments, data providers) instead. `aq lean set
|
|
654
|
+
ib-trading-mode live`, `aq lean keys environments.live-paper`, etc.
|
|
655
|
+
|
|
656
|
+
#### `aq retrain`
|
|
657
|
+
```text
|
|
517
658
|
aq retrain <plan|train|validate|backtest|commit|promote|rollback|status> [...]
|
|
659
|
+
```
|
|
660
|
+
Dispatches to `python -m retraining.orchestrator <stage> ...` for a
|
|
661
|
+
single manual pipeline stage.
|
|
662
|
+
|
|
663
|
+
#### `aq trade-lock`
|
|
664
|
+
```text
|
|
518
665
|
aq trade-lock --on|--off|--auto|--status
|
|
666
|
+
```
|
|
667
|
+
Manually overrides `main.py`'s sticky total-drawdown trade lock (see
|
|
668
|
+
`development/v2_architecture.md`'s Manual Trade-Lock Override Contract).
|
|
669
|
+
`--off` deliberately clears an otherwise-permanent lock; `--auto` returns
|
|
670
|
+
to fully automatic behavior.
|
|
671
|
+
|
|
672
|
+
#### `aq fetch`
|
|
673
|
+
```text
|
|
519
674
|
aq fetch <crypto|stock> --ticker <TICKER> --start <YYYY-MM-DD> --end <YYYY-MM-DD> [--apply]
|
|
675
|
+
```
|
|
676
|
+
Fetches historical OHLCV from Yahoo Finance for a ticker that isn't in
|
|
677
|
+
`config.json` yet, formats it into Lean's zip/CSV convention, and writes
|
|
678
|
+
it to the right spot under `data/` (`data/crypto/coinbase/daily/<ticker>_trade.zip`
|
|
679
|
+
or `data/equity/usa/daily/<ticker>.zip`). On `--apply`, it also appends a
|
|
680
|
+
new asset block to `config.json`'s `phase1.universe.assets[]` — no manual
|
|
681
|
+
editing needed. Dry run by default (no `--apply`): reports what would
|
|
682
|
+
happen, writes nothing. Never runs `train.py` itself — once applied, run
|
|
683
|
+
`python train.py --dataset-only` (then `python train.py` when ready)
|
|
684
|
+
yourself to actually train on the new ticker. `crypto`/`stock` today; a
|
|
685
|
+
`derivative` asset class is planned for V3.
|
|
686
|
+
|
|
687
|
+
#### `aq status`
|
|
688
|
+
```text
|
|
520
689
|
aq status
|
|
521
690
|
```
|
|
522
|
-
|
|
523
|
-
Every command except `aq trade-lock` and `aq fetch` is a thin `subprocess`
|
|
524
|
-
wrapper around a command already documented elsewhere in this README:
|
|
525
|
-
|
|
526
|
-
- **`aq train`** — runs `train.py`: builds the dataset and trains the baseline + expert models. `--gating-only` trains just the learned gating blend (`train_gating.py`) and installs it straight into active `ml/`, mirroring what `--experts-only` already does for the expert models — see `moe/README.md`.
|
|
527
|
-
- **`aq test`** — runs the pytest suite and refreshes this README's test badge.
|
|
528
|
-
- **`aq backtest`** — runs `lean backtest .` and refreshes this README's [Backtest Results](#backtest-results) section.
|
|
529
|
-
- **`aq report <backtest-folder> <result-id>`** — generates Lean's own HTML backtest report (trade blotter, standard Lean charts) at `backtests/<backtest-folder>/report.html`.
|
|
530
|
-
- **`aq api`** — starts the FastAPI monitoring server on `:8001`.
|
|
531
|
-
- **`aq webui`** — starts the webui dev server (`npm run dev`).
|
|
532
|
-
- **`aq docker up [--lean|--all]`** — starts local infrastructure (default: Redis + PostgreSQL only).
|
|
533
|
-
- **`aq docker build`** — rebuilds the `aether-quant` app image.
|
|
534
|
-
- **`aq retrain <stage>`** — dispatches to `python -m retraining.orchestrator <stage> ...` for a single manual pipeline stage.
|
|
535
|
-
- **`aq trade-lock --on|--off|--auto|--status`** — manually overrides `main.py`'s sticky total-drawdown trade lock (see `development/v2_architecture.md`'s Manual Trade-Lock Override Contract). `--off` deliberately clears an otherwise-permanent lock; `--auto` returns to fully automatic behavior.
|
|
536
|
-
- **`aq fetch <crypto|stock> --ticker <TICKER> --start <YYYY-MM-DD> --end <YYYY-MM-DD> [--apply]`** — fetches historical OHLCV from Yahoo Finance for a ticker that isn't in `config.json` yet, formats it into Lean's zip/CSV convention, and writes it to the right spot under `data/` (`data/crypto/coinbase/daily/<ticker>_trade.zip` or `data/equity/usa/daily/<ticker>.zip`). On `--apply`, it also appends a new asset block to `config.json`'s `phase1.universe.assets[]` — no manual editing needed. Dry run by default (no `--apply`): reports what would happen, writes nothing. Never runs `train.py` itself — once applied, run `python train.py --dataset-only` (then `python train.py` when ready) yourself to actually train on the new ticker. `crypto`/`stock` today; a `derivative` asset class is planned for V3.
|
|
537
|
-
- **`aq status`** — shows `git status`.
|
|
691
|
+
Shows `git status`.
|
|
538
692
|
|
|
539
693
|
## Release Process
|
|
540
694
|
|
|
@@ -706,5 +860,5 @@ architecture docs already identify:
|
|
|
706
860
|
---
|
|
707
861
|
|
|
708
862
|
<div align="center">
|
|
709
|
-
<sub>
|
|
863
|
+
<sub>Aether Quant</sub>
|
|
710
864
|
</div>
|
|
@@ -8,13 +8,17 @@ Dockerfile.retraining_worker
|
|
|
8
8
|
Dockerfile.workers
|
|
9
9
|
README.md
|
|
10
10
|
aq_cli.py
|
|
11
|
+
config.json
|
|
11
12
|
docker-compose.yml
|
|
12
13
|
generate_backtest_report.py
|
|
14
|
+
lean.json
|
|
13
15
|
main.py
|
|
14
16
|
pyproject.toml
|
|
15
17
|
risk_controls.py
|
|
16
18
|
train.py
|
|
17
19
|
train_gating.py
|
|
20
|
+
train_multitask.py
|
|
21
|
+
train_sequence.py
|
|
18
22
|
train_topology.py
|
|
19
23
|
.github/workflows/ci.yml
|
|
20
24
|
.github/workflows/release.yml
|
|
@@ -78,9 +82,36 @@ ml/README.md
|
|
|
78
82
|
ml/gating_feature_schema.json
|
|
79
83
|
ml/gating_model.json
|
|
80
84
|
ml/gating_training_metrics.json
|
|
85
|
+
ml/multitask_feature_schema.json
|
|
86
|
+
ml/multitask_model.json
|
|
87
|
+
ml/multitask_training_metrics.json
|
|
88
|
+
ml/sequence_feature_schema.json
|
|
89
|
+
ml/sequence_model.json
|
|
90
|
+
ml/sequence_training_metrics.json
|
|
81
91
|
ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_feature_schema.json
|
|
82
92
|
ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_model.json
|
|
83
93
|
ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_training_metrics.json
|
|
94
|
+
ml/versions/stage123-1783709428/gating_feature_schema.json
|
|
95
|
+
ml/versions/stage123-1783709428/gating_model.json
|
|
96
|
+
ml/versions/stage123-1783709428/gating_training_metrics.json
|
|
97
|
+
ml/versions/stage123-1783709428/multitask_feature_schema.json
|
|
98
|
+
ml/versions/stage123-1783709428/multitask_model.json
|
|
99
|
+
ml/versions/stage123-1783709428/multitask_training_metrics.json
|
|
100
|
+
ml/versions/stage4-1783711025/gating_feature_schema.json
|
|
101
|
+
ml/versions/stage4-1783711025/gating_model.json
|
|
102
|
+
ml/versions/stage4-1783711025/gating_training_metrics.json
|
|
103
|
+
ml/versions/stage4-1783711025/multitask_feature_schema.json
|
|
104
|
+
ml/versions/stage4-1783711025/multitask_model.json
|
|
105
|
+
ml/versions/stage4-1783711025/multitask_training_metrics.json
|
|
106
|
+
ml/versions/stage5-1783715333/sequence_feature_schema.json
|
|
107
|
+
ml/versions/stage5-1783715333/sequence_model.json
|
|
108
|
+
ml/versions/stage5-1783715333/sequence_training_metrics.json
|
|
109
|
+
ml/versions/v1/multitask_feature_schema.json
|
|
110
|
+
ml/versions/v1/multitask_model.json
|
|
111
|
+
ml/versions/v1/multitask_training_metrics.json
|
|
112
|
+
ml/versions/v1/sequence_feature_schema.json
|
|
113
|
+
ml/versions/v1/sequence_model.json
|
|
114
|
+
ml/versions/v1/sequence_training_metrics.json
|
|
84
115
|
moe/README.md
|
|
85
116
|
moe/__init__.py
|
|
86
117
|
moe/gating.py
|
|
@@ -168,8 +199,12 @@ tests/test_status_export.py
|
|
|
168
199
|
tests/test_telegram_alerts.py
|
|
169
200
|
tests/test_telegram_client.py
|
|
170
201
|
tests/test_telegram_worker.py
|
|
202
|
+
tests/test_train_cross_sectional_features.py
|
|
171
203
|
tests/test_train_gating.py
|
|
204
|
+
tests/test_train_multitask.py
|
|
205
|
+
tests/test_train_multitask_architecture.py
|
|
172
206
|
tests/test_train_pipeline.py
|
|
207
|
+
tests/test_train_sequence_architecture.py
|
|
173
208
|
tests/test_train_topology.py
|
|
174
209
|
tests/test_trigger_worker.py
|
|
175
210
|
tests/test_triggers.py
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": [
|
|
3
3
|
"README.md",
|
|
4
|
+
"train_multitask.py",
|
|
4
5
|
"train_gating.py",
|
|
5
6
|
"Dockerfile.workers",
|
|
6
7
|
"aq_cli.py",
|
|
7
8
|
"Dockerfile",
|
|
8
9
|
"pyproject.toml",
|
|
10
|
+
"train_sequence.py",
|
|
9
11
|
".env.compose.example",
|
|
10
12
|
"Dockerfile.retraining_worker",
|
|
11
13
|
"train_topology.py",
|
|
14
|
+
"config.json",
|
|
12
15
|
"train.py",
|
|
13
16
|
".env.live.example",
|
|
17
|
+
"lean.json",
|
|
14
18
|
".dockerignore",
|
|
15
19
|
"generate_backtest_report.py",
|
|
16
20
|
".gitattributes",
|
|
@@ -163,6 +167,7 @@
|
|
|
163
167
|
"development/infrastructure.md",
|
|
164
168
|
"tests/test_order_gate.py",
|
|
165
169
|
"tests/test_config_cache.py",
|
|
170
|
+
"tests/test_train_sequence_architecture.py",
|
|
166
171
|
"tests/test_telegram_alerts.py",
|
|
167
172
|
"tests/test_trigger_worker.py",
|
|
168
173
|
"tests/test_v2_pipeline_manifest.py",
|
|
@@ -185,12 +190,14 @@
|
|
|
185
190
|
"tests/test_market_regime.py",
|
|
186
191
|
"tests/test_vault_client.py",
|
|
187
192
|
"tests/test_validation_gate.py",
|
|
193
|
+
"tests/test_train_multitask.py",
|
|
188
194
|
"tests/test_observation_metrics.py",
|
|
189
195
|
"tests/test_paper_readiness_io.py",
|
|
190
196
|
"tests/test_exported_model.py",
|
|
191
197
|
"tests/test_train_topology.py",
|
|
192
198
|
"tests/test_telegram_worker.py",
|
|
193
199
|
"tests/test_paper_readiness.py",
|
|
200
|
+
"tests/test_train_multitask_architecture.py",
|
|
194
201
|
"tests/test_triggers.py",
|
|
195
202
|
"tests/test_simulated_portfolio.py",
|
|
196
203
|
"tests/test_position_sizing.py",
|
|
@@ -199,6 +206,7 @@
|
|
|
199
206
|
"tests/test_live_credentials_io.py",
|
|
200
207
|
"tests/test_market_analyzer.py",
|
|
201
208
|
"tests/test_generate_backtest_report.py",
|
|
209
|
+
"tests/test_train_cross_sectional_features.py",
|
|
202
210
|
"tests/test_lean_backtest.py",
|
|
203
211
|
"tests/test_retraining_planning.py",
|
|
204
212
|
"tests/test_market_topology.py",
|
|
@@ -228,13 +236,40 @@
|
|
|
228
236
|
"requirements/requirements-dev.txt",
|
|
229
237
|
"requirements/requirements-workers.txt",
|
|
230
238
|
"requirements/requirements-retraining-worker.txt",
|
|
239
|
+
"ml/sequence_feature_schema.json",
|
|
231
240
|
"ml/README.md",
|
|
232
241
|
"ml/gating_model.json",
|
|
242
|
+
"ml/multitask_feature_schema.json",
|
|
243
|
+
"ml/multitask_model.json",
|
|
244
|
+
"ml/multitask_training_metrics.json",
|
|
233
245
|
"ml/gating_feature_schema.json",
|
|
234
246
|
"ml/gating_training_metrics.json",
|
|
247
|
+
"ml/sequence_model.json",
|
|
248
|
+
"ml/sequence_training_metrics.json",
|
|
249
|
+
"ml/versions/stage5-1783715333/sequence_feature_schema.json",
|
|
250
|
+
"ml/versions/stage5-1783715333/sequence_model.json",
|
|
251
|
+
"ml/versions/stage5-1783715333/sequence_training_metrics.json",
|
|
252
|
+
"ml/versions/v1/sequence_feature_schema.json",
|
|
253
|
+
"ml/versions/v1/multitask_feature_schema.json",
|
|
254
|
+
"ml/versions/v1/multitask_model.json",
|
|
255
|
+
"ml/versions/v1/multitask_training_metrics.json",
|
|
256
|
+
"ml/versions/v1/sequence_model.json",
|
|
257
|
+
"ml/versions/v1/sequence_training_metrics.json",
|
|
258
|
+
"ml/versions/stage4-1783711025/gating_model.json",
|
|
259
|
+
"ml/versions/stage4-1783711025/multitask_feature_schema.json",
|
|
260
|
+
"ml/versions/stage4-1783711025/multitask_model.json",
|
|
261
|
+
"ml/versions/stage4-1783711025/multitask_training_metrics.json",
|
|
262
|
+
"ml/versions/stage4-1783711025/gating_feature_schema.json",
|
|
263
|
+
"ml/versions/stage4-1783711025/gating_training_metrics.json",
|
|
235
264
|
"ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_model.json",
|
|
236
265
|
"ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_feature_schema.json",
|
|
237
266
|
"ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_training_metrics.json",
|
|
267
|
+
"ml/versions/stage123-1783709428/gating_model.json",
|
|
268
|
+
"ml/versions/stage123-1783709428/multitask_feature_schema.json",
|
|
269
|
+
"ml/versions/stage123-1783709428/multitask_model.json",
|
|
270
|
+
"ml/versions/stage123-1783709428/multitask_training_metrics.json",
|
|
271
|
+
"ml/versions/stage123-1783709428/gating_feature_schema.json",
|
|
272
|
+
"ml/versions/stage123-1783709428/gating_training_metrics.json",
|
|
238
273
|
".github/workflows/release.yml",
|
|
239
274
|
".github/workflows/ci.yml"
|
|
240
275
|
]
|
|
@@ -53,3 +53,44 @@ risk engine, and before action categorization / Lean order placement.
|
|
|
53
53
|
actions are written into the per-asset `signal_payload` for
|
|
54
54
|
dashboard/Grafana visibility regardless of whether a real order is
|
|
55
55
|
placed.
|
|
56
|
+
- **Real composite scoring (additive, config-gated).** Until now, every
|
|
57
|
+
priority tier here checked exactly one raw field in isolation against a
|
|
58
|
+
fixed threshold (confidence alone, `topology_risk` alone,
|
|
59
|
+
`liquidity_action` alone) — pure if/elif routing, no aggregation. New
|
|
60
|
+
`compute_signal_quality_score(confidence, regime_confidence, topology,
|
|
61
|
+
liquidity)` computes a real bounded `[0,1]` composite — a small,
|
|
62
|
+
hand-tuned weighted blend of raw model confidence (0.45), regime
|
|
63
|
+
confidence (0.20), topology peer-support (0.20, penalized when
|
|
64
|
+
`topology_risk` is `isolated`/`elevated`), and liquidity friction (0.15,
|
|
65
|
+
penalized by `participation_rate`) — mirroring `moe/gating.py`'s
|
|
66
|
+
`_quality_multiplier`/`_performance_score` style: real math over
|
|
67
|
+
already-available fields, not a trained model. `MarketAnalysisDecision`
|
|
68
|
+
gains `signal_quality_score`/`signal_quality_breakdown` fields that are
|
|
69
|
+
**always** computed and populated on every decision, regardless of any
|
|
70
|
+
flag — visible in `visualization/state.json` immediately for dashboard
|
|
71
|
+
use. It only ever changes routing when
|
|
72
|
+
`phase_v2.market_analyzer.use_composite_signal_score` is explicitly
|
|
73
|
+
`true` (default `false`) — in that case it replaces raw `confidence`
|
|
74
|
+
with the composite score in the `trade` gate (priority 7) and the
|
|
75
|
+
`simulate`-vs-`observe` split (priority 8) only. The hard safety-override
|
|
76
|
+
tiers (trade-lock, `risk_off` regime, elevated topology, liquidity
|
|
77
|
+
blocked — priorities 1-6) are **never** affected by this flag, regardless
|
|
78
|
+
of its value — they stay simple categorical gates on purpose, same
|
|
79
|
+
reasoning as the topology-elevated/isolated rules above. Default `false`
|
|
80
|
+
means output is byte-identical to pre-this-change behavior everywhere
|
|
81
|
+
the flag isn't explicitly turned on.
|
|
82
|
+
- **Multi-task prediction fields (additive, never change routing).**
|
|
83
|
+
`MarketAnalysisDecision` gains `predicted_return_magnitude`/
|
|
84
|
+
`predicted_volatility` (both `float | None`, default `None`), threaded
|
|
85
|
+
straight through from `main.py`'s optional multi-task model call
|
|
86
|
+
(`train_multitask.py`/`AetherNetMultiTask`, see `inference/README.md`)
|
|
87
|
+
into every one of this module's 8 return statements via two new
|
|
88
|
+
`build_market_analysis_decision(..., predicted_return_magnitude=None,
|
|
89
|
+
predicted_volatility=None)` parameters. Purely informational here — this
|
|
90
|
+
module's `trade`/`simulate`/`observe`/`reduce_risk` categorization does
|
|
91
|
+
not read either field; `predicted_volatility` only ever changes anything
|
|
92
|
+
downstream in `risk/position_sizing.py` (see `risk/README.md`), and only
|
|
93
|
+
when `phase_v2.dynamic_risk.use_predicted_volatility` is explicitly
|
|
94
|
+
enabled. Always `None` when no multitask model is loaded (or the model
|
|
95
|
+
call failed), matching every other optional-model fallback contract in
|
|
96
|
+
this codebase.
|
|
@@ -4,10 +4,12 @@ from .market_analyzer import (
|
|
|
4
4
|
ACTIONS,
|
|
5
5
|
MarketAnalysisDecision,
|
|
6
6
|
build_market_analysis_decision,
|
|
7
|
+
compute_signal_quality_score,
|
|
7
8
|
)
|
|
8
9
|
|
|
9
10
|
__all__ = [
|
|
10
11
|
"ACTIONS",
|
|
11
12
|
"MarketAnalysisDecision",
|
|
12
13
|
"build_market_analysis_decision",
|
|
14
|
+
"compute_signal_quality_score",
|
|
13
15
|
]
|