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.
Files changed (292) hide show
  1. {aether_quant-0.5.0 → aether_quant-0.7.0}/.gitignore +0 -2
  2. {aether_quant-0.5.0 → aether_quant-0.7.0}/Dockerfile.retraining_worker +3 -0
  3. {aether_quant-0.5.0 → aether_quant-0.7.0}/PKG-INFO +1 -1
  4. {aether_quant-0.5.0 → aether_quant-0.7.0}/README.md +209 -55
  5. {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/PKG-INFO +1 -1
  6. {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/SOURCES.txt +35 -0
  7. {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/scm_file_list.json +35 -0
  8. aether_quant-0.7.0/aether_quant.egg-info/scm_version.json +8 -0
  9. {aether_quant-0.5.0 → aether_quant-0.7.0}/analyzer/README.md +41 -0
  10. {aether_quant-0.5.0 → aether_quant-0.7.0}/analyzer/__init__.py +2 -0
  11. {aether_quant-0.5.0 → aether_quant-0.7.0}/analyzer/market_analyzer.py +101 -2
  12. {aether_quant-0.5.0 → aether_quant-0.7.0}/aq_cli.py +221 -1
  13. aether_quant-0.7.0/config.json +617 -0
  14. {aether_quant-0.5.0 → aether_quant-0.7.0}/development/Changelog.md +609 -0
  15. {aether_quant-0.5.0 → aether_quant-0.7.0}/development/Problems.md +72 -0
  16. aether_quant-0.7.0/development/backtest_equity_chart.png +0 -0
  17. {aether_quant-0.5.0 → aether_quant-0.7.0}/development/infrastructure.md +24 -1
  18. {aether_quant-0.5.0 → aether_quant-0.7.0}/development/v2_architecture.md +144 -23
  19. {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/redis_queue.py +9 -0
  20. aether_quant-0.7.0/inference/README.md +125 -0
  21. aether_quant-0.7.0/inference/__init__.py +11 -0
  22. aether_quant-0.7.0/inference/exported_model.py +306 -0
  23. aether_quant-0.7.0/lean.json +649 -0
  24. {aether_quant-0.5.0 → aether_quant-0.7.0}/liquidity/README.md +34 -0
  25. aether_quant-0.7.0/liquidity/__init__.py +8 -0
  26. {aether_quant-0.5.0 → aether_quant-0.7.0}/main.py +301 -19
  27. aether_quant-0.7.0/ml/gating_model.json +570 -0
  28. aether_quant-0.7.0/ml/gating_training_metrics.json +190 -0
  29. aether_quant-0.7.0/ml/multitask_feature_schema.json +52 -0
  30. aether_quant-0.7.0/ml/multitask_model.json +5888 -0
  31. aether_quant-0.7.0/ml/multitask_training_metrics.json +248 -0
  32. aether_quant-0.7.0/ml/sequence_feature_schema.json +53 -0
  33. aether_quant-0.7.0/ml/sequence_model.json +13258 -0
  34. aether_quant-0.7.0/ml/sequence_training_metrics.json +209 -0
  35. aether_quant-0.7.0/ml/versions/stage123-1783709428/gating_feature_schema.json +30 -0
  36. aether_quant-0.7.0/ml/versions/stage123-1783709428/gating_model.json +570 -0
  37. aether_quant-0.7.0/ml/versions/stage123-1783709428/gating_training_metrics.json +190 -0
  38. aether_quant-0.7.0/ml/versions/stage123-1783709428/multitask_feature_schema.json +52 -0
  39. aether_quant-0.7.0/ml/versions/stage123-1783709428/multitask_model.json +5888 -0
  40. aether_quant-0.7.0/ml/versions/stage123-1783709428/multitask_training_metrics.json +248 -0
  41. aether_quant-0.7.0/ml/versions/stage4-1783711025/gating_feature_schema.json +30 -0
  42. aether_quant-0.7.0/ml/versions/stage4-1783711025/gating_model.json +570 -0
  43. aether_quant-0.7.0/ml/versions/stage4-1783711025/gating_training_metrics.json +190 -0
  44. aether_quant-0.7.0/ml/versions/stage4-1783711025/multitask_feature_schema.json +52 -0
  45. aether_quant-0.7.0/ml/versions/stage4-1783711025/multitask_model.json +5888 -0
  46. aether_quant-0.7.0/ml/versions/stage4-1783711025/multitask_training_metrics.json +248 -0
  47. aether_quant-0.7.0/ml/versions/stage5-1783715333/sequence_feature_schema.json +53 -0
  48. aether_quant-0.7.0/ml/versions/stage5-1783715333/sequence_model.json +13258 -0
  49. aether_quant-0.7.0/ml/versions/stage5-1783715333/sequence_training_metrics.json +209 -0
  50. aether_quant-0.7.0/ml/versions/v1/multitask_feature_schema.json +52 -0
  51. aether_quant-0.7.0/ml/versions/v1/multitask_model.json +5888 -0
  52. aether_quant-0.7.0/ml/versions/v1/multitask_training_metrics.json +248 -0
  53. aether_quant-0.7.0/ml/versions/v1/sequence_feature_schema.json +53 -0
  54. aether_quant-0.7.0/ml/versions/v1/sequence_model.json +13258 -0
  55. aether_quant-0.7.0/ml/versions/v1/sequence_training_metrics.json +209 -0
  56. {aether_quant-0.5.0 → aether_quant-0.7.0}/moe/README.md +43 -0
  57. {aether_quant-0.5.0 → aether_quant-0.7.0}/moe/gating.py +64 -1
  58. {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/neural_network_state.py +149 -13
  59. aether_quant-0.7.0/regime/README.md +57 -0
  60. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/README.md +15 -4
  61. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/__init__.py +8 -0
  62. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/artifacts.py +40 -5
  63. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/orchestrator.py +108 -0
  64. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/worker.py +14 -0
  65. {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/README.md +32 -0
  66. {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/position_sizing.py +25 -1
  67. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_aq_cli.py +329 -0
  68. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_experience_queue.py +19 -2
  69. aether_quant-0.7.0/tests/test_exported_model.py +464 -0
  70. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_gating_network.py +127 -0
  71. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_lean_backtest_ml_coverage.py +46 -0
  72. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_analyzer.py +118 -1
  73. aether_quant-0.7.0/tests/test_neural_network_state.py +311 -0
  74. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_artifacts.py +136 -1
  75. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_orchestrator.py +149 -0
  76. aether_quant-0.7.0/tests/test_train_cross_sectional_features.py +243 -0
  77. aether_quant-0.7.0/tests/test_train_multitask.py +113 -0
  78. aether_quant-0.7.0/tests/test_train_multitask_architecture.py +189 -0
  79. aether_quant-0.7.0/tests/test_train_sequence_architecture.py +196 -0
  80. {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/README.md +34 -0
  81. {aether_quant-0.5.0 → aether_quant-0.7.0}/train.py +840 -17
  82. aether_quant-0.7.0/train_multitask.py +403 -0
  83. aether_quant-0.7.0/train_sequence.py +403 -0
  84. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +60 -7
  85. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/types/state.ts +9 -1
  86. aether_quant-0.5.0/aether_quant.egg-info/scm_version.json +0 -8
  87. aether_quant-0.5.0/development/backtest_equity_chart.png +0 -0
  88. aether_quant-0.5.0/inference/README.md +0 -35
  89. aether_quant-0.5.0/inference/__init__.py +0 -3
  90. aether_quant-0.5.0/inference/exported_model.py +0 -68
  91. aether_quant-0.5.0/liquidity/__init__.py +0 -3
  92. aether_quant-0.5.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_model.json +0 -570
  93. aether_quant-0.5.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_training_metrics.json +0 -190
  94. aether_quant-0.5.0/regime/README.md +0 -18
  95. aether_quant-0.5.0/tests/test_exported_model.py +0 -106
  96. aether_quant-0.5.0/tests/test_neural_network_state.py +0 -148
  97. {aether_quant-0.5.0 → aether_quant-0.7.0}/.dockerignore +0 -0
  98. {aether_quant-0.5.0 → aether_quant-0.7.0}/.env.compose.example +0 -0
  99. {aether_quant-0.5.0 → aether_quant-0.7.0}/.env.live.example +0 -0
  100. {aether_quant-0.5.0 → aether_quant-0.7.0}/.gitattributes +0 -0
  101. {aether_quant-0.5.0 → aether_quant-0.7.0}/.github/workflows/ci.yml +0 -0
  102. {aether_quant-0.5.0 → aether_quant-0.7.0}/.github/workflows/release.yml +0 -0
  103. {aether_quant-0.5.0 → aether_quant-0.7.0}/Dockerfile +0 -0
  104. {aether_quant-0.5.0 → aether_quant-0.7.0}/Dockerfile.workers +0 -0
  105. {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/dependency_links.txt +0 -0
  106. {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/entry_points.txt +0 -0
  107. {aether_quant-0.5.0 → aether_quant-0.7.0}/aether_quant.egg-info/top_level.txt +0 -0
  108. {aether_quant-0.5.0 → aether_quant-0.7.0}/backtests/.gitkeep +0 -0
  109. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/estimize/consensus/aapl/.keep +0 -0
  110. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/estimize/estimate/.keep +0 -0
  111. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/estimize/release/.keep +0 -0
  112. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/sec/aapl/.keep +0 -0
  113. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/.keep +0 -0
  114. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/calendar/.keep +0 -0
  115. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/earnings/.keep +0 -0
  116. {aether_quant-0.5.0 → aether_quant-0.7.0}/data/alternative/trading-economics/indicator/.keep +0 -0
  117. {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/README.md +0 -0
  118. {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/__init__.py +0 -0
  119. {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/fetch.py +0 -0
  120. {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/v2_manifest.py +0 -0
  121. {aether_quant-0.5.0 → aether_quant-0.7.0}/data_pipeline/yfinance_backfill.py +0 -0
  122. {aether_quant-0.5.0 → aether_quant-0.7.0}/development/README.md +0 -0
  123. {aether_quant-0.5.0 → aether_quant-0.7.0}/development/logo.png +0 -0
  124. {aether_quant-0.5.0 → aether_quant-0.7.0}/docker-compose.yml +0 -0
  125. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/README.md +0 -0
  126. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/__init__.py +0 -0
  127. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/config_cache.py +0 -0
  128. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/live_credentials.py +0 -0
  129. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/live_credentials_io.py +0 -0
  130. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/order_gate.py +0 -0
  131. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/paper_readiness.py +0 -0
  132. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/paper_readiness_io.py +0 -0
  133. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/paper_readiness_report.py +0 -0
  134. {aether_quant-0.5.0 → aether_quant-0.7.0}/execution/runtime_config_io.py +0 -0
  135. {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/README.md +0 -0
  136. {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/__init__.py +0 -0
  137. {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/observation_metrics.py +0 -0
  138. {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/postgres_worker.py +0 -0
  139. {aether_quant-0.5.0 → aether_quant-0.7.0}/experience/simulated_portfolio.py +0 -0
  140. {aether_quant-0.5.0 → aether_quant-0.7.0}/experts/README.md +0 -0
  141. {aether_quant-0.5.0 → aether_quant-0.7.0}/experts/__init__.py +0 -0
  142. {aether_quant-0.5.0 → aether_quant-0.7.0}/experts/expert_datasets.py +0 -0
  143. {aether_quant-0.5.0 → aether_quant-0.7.0}/generate_backtest_report.py +0 -0
  144. {aether_quant-0.5.0 → aether_quant-0.7.0}/liquidity/market_liquidity.py +0 -0
  145. {aether_quant-0.5.0 → aether_quant-0.7.0}/ml/README.md +0 -0
  146. {aether_quant-0.5.0 → aether_quant-0.7.0}/ml/gating_feature_schema.json +0 -0
  147. {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
  148. {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
  149. {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
  150. {aether_quant-0.5.0 → aether_quant-0.7.0}/moe/__init__.py +0 -0
  151. {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/README.md +0 -0
  152. {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/__init__.py +0 -0
  153. {aether_quant-0.5.0 → aether_quant-0.7.0}/monitoring/api_server.py +0 -0
  154. {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/README.md +0 -0
  155. {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/__init__.py +0 -0
  156. {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/postgres_telegram.py +0 -0
  157. {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/telegram_alerts.py +0 -0
  158. {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/telegram_client.py +0 -0
  159. {aether_quant-0.5.0 → aether_quant-0.7.0}/notifications/telegram_worker.py +0 -0
  160. {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/README.md +0 -0
  161. {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/__init__.py +0 -0
  162. {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/postgres_triggers.py +0 -0
  163. {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/trigger_worker.py +0 -0
  164. {aether_quant-0.5.0 → aether_quant-0.7.0}/performance/triggers.py +0 -0
  165. {aether_quant-0.5.0 → aether_quant-0.7.0}/pyproject.toml +0 -0
  166. {aether_quant-0.5.0 → aether_quant-0.7.0}/regime/__init__.py +0 -0
  167. {aether_quant-0.5.0 → aether_quant-0.7.0}/regime/market_regime.py +0 -0
  168. {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/README.md +0 -0
  169. {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-dev.txt +0 -0
  170. {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-retraining-worker.txt +0 -0
  171. {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-runtime.txt +0 -0
  172. {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements-workers.txt +0 -0
  173. {aether_quant-0.5.0 → aether_quant-0.7.0}/requirements/requirements.txt +0 -0
  174. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/backtest_gate.py +0 -0
  175. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/lean_backtest.py +0 -0
  176. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/planning.py +0 -0
  177. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/postgres_registry.py +0 -0
  178. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/status_export.py +0 -0
  179. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/validation_gate.py +0 -0
  180. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/vault_client.py +0 -0
  181. {aether_quant-0.5.0 → aether_quant-0.7.0}/retraining/vault_commands.py +0 -0
  182. {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/__init__.py +0 -0
  183. {aether_quant-0.5.0 → aether_quant-0.7.0}/risk/manual_override.py +0 -0
  184. {aether_quant-0.5.0 → aether_quant-0.7.0}/risk_controls.py +0 -0
  185. {aether_quant-0.5.0 → aether_quant-0.7.0}/setup.cfg +0 -0
  186. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/README.md +0 -0
  187. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_backtest_gate.py +0 -0
  188. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_config_cache.py +0 -0
  189. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_expert_datasets.py +0 -0
  190. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_expert_models.py +0 -0
  191. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_fetch.py +0 -0
  192. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_generate_backtest_report.py +0 -0
  193. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_lean_backtest.py +0 -0
  194. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_learned_topology.py +0 -0
  195. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_live_credentials.py +0 -0
  196. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_live_credentials_io.py +0 -0
  197. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_manual_override.py +0 -0
  198. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_liquidity.py +0 -0
  199. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_regime.py +0 -0
  200. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_market_topology.py +0 -0
  201. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_observation_metrics.py +0 -0
  202. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_order_gate.py +0 -0
  203. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_paper_readiness.py +0 -0
  204. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_paper_readiness_io.py +0 -0
  205. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_paper_readiness_report.py +0 -0
  206. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_position_sizing.py +0 -0
  207. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_postgres_telegram.py +0 -0
  208. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_postgres_triggers.py +0 -0
  209. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_postgres_worker.py +0 -0
  210. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_planning.py +0 -0
  211. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_postgres_registry.py +0 -0
  212. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_retraining_worker.py +0 -0
  213. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_risk_controls.py +0 -0
  214. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_runtime_config_io.py +0 -0
  215. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_simulated_portfolio.py +0 -0
  216. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_status_export.py +0 -0
  217. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_telegram_alerts.py +0 -0
  218. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_telegram_client.py +0 -0
  219. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_telegram_worker.py +0 -0
  220. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_train_gating.py +0 -0
  221. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_train_pipeline.py +0 -0
  222. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_train_topology.py +0 -0
  223. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_trigger_worker.py +0 -0
  224. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_triggers.py +0 -0
  225. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_v2_pipeline_manifest.py +0 -0
  226. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_validation_gate.py +0 -0
  227. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_vault_client.py +0 -0
  228. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_vault_commands.py +0 -0
  229. {aether_quant-0.5.0 → aether_quant-0.7.0}/tests/test_yfinance_backfill.py +0 -0
  230. {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/__init__.py +0 -0
  231. {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/learned_topology.py +0 -0
  232. {aether_quant-0.5.0 → aether_quant-0.7.0}/topology/market_topology.py +0 -0
  233. {aether_quant-0.5.0 → aether_quant-0.7.0}/train_gating.py +0 -0
  234. {aether_quant-0.5.0 → aether_quant-0.7.0}/train_topology.py +0 -0
  235. {aether_quant-0.5.0 → aether_quant-0.7.0}/visualization/README.md +0 -0
  236. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/.gitignore +0 -0
  237. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/.oxlintrc.json +0 -0
  238. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/README.md +0 -0
  239. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/index.html +0 -0
  240. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/overview_v2_12.png +0 -0
  241. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/package-lock.json +0 -0
  242. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/package.json +0 -0
  243. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/public/favicon.svg +0 -0
  244. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/public/icons.svg +0 -0
  245. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/risk_v2_12.png +0 -0
  246. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/App.tsx +0 -0
  247. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/api/client.ts +0 -0
  248. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/api/hooks.ts +0 -0
  249. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/heatmap/AssetHeatmap.tsx +0 -0
  250. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/layout/AppShell.tsx +0 -0
  251. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/layout/Panel.tsx +0 -0
  252. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/CountTable.tsx +0 -0
  253. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/MonitoringFeeds.tsx +0 -0
  254. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/ObservationPanel.tsx +0 -0
  255. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/PaperReadinessPanel.tsx +0 -0
  256. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +0 -0
  257. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/RawStateViewer.tsx +0 -0
  258. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/monitoring/RetrainingStatusPanel.tsx +0 -0
  259. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +0 -0
  260. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/AssetSizingTable.tsx +0 -0
  261. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/LiquidityTable.tsx +0 -0
  262. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/RiskBar.tsx +0 -0
  263. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/RiskCore.tsx +0 -0
  264. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/risk/StrategyRiskCards.tsx +0 -0
  265. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/scene3d/Scene3D.tsx +0 -0
  266. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/scorecards/Scorecards.tsx +0 -0
  267. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/signals/Badge.tsx +0 -0
  268. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/signals/PositionsList.tsx +0 -0
  269. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/signals/SignalBoard.tsx +0 -0
  270. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/topology/ClusterList.tsx +0 -0
  271. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/topology/TopologyLearningPanel.tsx +0 -0
  272. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/topology/TopologyScene3D.tsx +0 -0
  273. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/AssetPerformancePanel.tsx +0 -0
  274. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/BacktestEquityPanel.tsx +0 -0
  275. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/DivergingBarChart.tsx +0 -0
  276. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/LineChart.tsx +0 -0
  277. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/MetricsSnapshotPanel.tsx +0 -0
  278. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/components/tracing/ObservationEquityPanel.tsx +0 -0
  279. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/index.css +0 -0
  280. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/lib/downsample.ts +0 -0
  281. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/lib/format.ts +0 -0
  282. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/main.tsx +0 -0
  283. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/NeuralNetworkPage.tsx +0 -0
  284. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/Overview.tsx +0 -0
  285. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/RiskPage.tsx +0 -0
  286. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/TopologyPage.tsx +0 -0
  287. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/pages/TracingPage.tsx +0 -0
  288. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/src/types/tracing.ts +0 -0
  289. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/tsconfig.app.json +0 -0
  290. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/tsconfig.json +0 -0
  291. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/tsconfig.node.json +0 -0
  292. {aether_quant-0.5.0 → aether_quant-0.7.0}/webui/vite.config.ts +0 -0
@@ -19,9 +19,7 @@ env/
19
19
  !.env.live.example
20
20
  ib_config.py
21
21
  *_config.local.py
22
- config.json
23
22
  config.local.json
24
- lean.json
25
23
  lean.local.json
26
24
 
27
25
  *.key
@@ -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"]
@@ -1,5 +1,5 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aether-quant
3
- Version: 0.5.0
3
+ Version: 0.7.0
4
4
  Summary: Aether Quant convenience CLI
5
5
  Requires-Python: >=3.10
@@ -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-583%2F583%20passing-brightgreen?style=flat-square&labelColor=1A1A1A" alt="583 of 583 tests passing"><!-- AQ:TEST_BADGE_END -->
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
- C --> E["Gating network<br/>the manager"]
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.71 |
396
- | Net Profit | -8.069% |
397
- | Compounding Annual Return | -2.761% |
398
- | Drawdown | 12.500% |
399
- | Total Orders | 27 |
400
- | Win Rate | 17% |
401
- | Last updated | 2026-07-06 17:20 UTC (auto-generated by `aq backtest`) |
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 | 27 |
411
- | Average Win | 0.18% |
412
- | Average Loss | -1.70% |
413
- | Compounding Annual Return | -2.761% |
414
- | Drawdown | 12.500% |
415
- | Expectancy | -0.816 |
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 | 91930.60 |
418
- | Net Profit | -8.069% |
419
- | Sharpe Ratio | -0.71 |
420
- | Sortino Ratio | -0.471 |
421
- | Probabilistic Sharpe Ratio | 0.171% |
422
- | Loss Rate | 83% |
423
- | Win Rate | 17% |
424
- | Profit-Loss Ratio | 0.11 |
425
- | Alpha | -0.058 |
426
- | Beta | 0.195 |
427
- | Annual Standard Deviation | 0.051 |
428
- | Annual Variance | 0.003 |
429
- | Information Ratio | -0.972 |
430
- | Tracking Error | 0.155 |
431
- | Treynor Ratio | -0.184 |
432
- | Total Fees | $12.00 |
433
- | Estimated Strategy Capacity | $210000000.00 |
434
- | Lowest Capacity Asset | IBM R735QTJ8XC9X |
435
- | Portfolio Turnover | 0.07% |
436
- | Drawdown Recovery | 503 |
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>Built with Python · PyTorch · QuantConnect Lean · FastAPI · React · Redis · PostgreSQL · Docker</sub>
863
+ <sub>Aether Quant</sub>
710
864
  </div>
@@ -1,5 +1,5 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aether-quant
3
- Version: 0.5.0
3
+ Version: 0.7.0
4
4
  Summary: Aether Quant convenience CLI
5
5
  Requires-Python: >=3.10
@@ -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
  ]
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.7.0",
3
+ "distance": 0,
4
+ "node": "gd20060c9112a861a4ff09903fa8bcdb2d01cfb93",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-10"
8
+ }
@@ -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
  ]