aether-quant 0.0.1__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 (548) hide show
  1. aether_quant-0.0.1/.devcontainer/README.md +12 -0
  2. aether_quant-0.0.1/.devcontainer/devcontainer.json +14 -0
  3. aether_quant-0.0.1/.devcontainer/dind-v1-test/devcontainer.json +14 -0
  4. aether_quant-0.0.1/.dockerignore +51 -0
  5. aether_quant-0.0.1/.env.compose.example +12 -0
  6. aether_quant-0.0.1/.env.live.example +33 -0
  7. aether_quant-0.0.1/.gitattributes +2 -0
  8. aether_quant-0.0.1/.githooks/README.md +14 -0
  9. aether_quant-0.0.1/.githooks/pre-commit +29 -0
  10. aether_quant-0.0.1/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
  11. aether_quant-0.0.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
  12. aether_quant-0.0.1/.github/ISSUE_TEMPLATE/feature_request.md +32 -0
  13. aether_quant-0.0.1/.github/PULL_REQUEST_TEMPLATE.md +37 -0
  14. aether_quant-0.0.1/.github/workflows/ci.yml +158 -0
  15. aether_quant-0.0.1/.github/workflows/release.yml +130 -0
  16. aether_quant-0.0.1/.gitignore +192 -0
  17. aether_quant-0.0.1/AGENTS.md +144 -0
  18. aether_quant-0.0.1/CODE_OF_CONDUCT.md +56 -0
  19. aether_quant-0.0.1/CONTRIBUTING.md +167 -0
  20. aether_quant-0.0.1/Dockerfile +53 -0
  21. aether_quant-0.0.1/Dockerfile.lean +14 -0
  22. aether_quant-0.0.1/LICENSE +133 -0
  23. aether_quant-0.0.1/PKG-INFO +7 -0
  24. aether_quant-0.0.1/README.md +1231 -0
  25. aether_quant-0.0.1/REPRODUCIBILITY.md +65 -0
  26. aether_quant-0.0.1/RUNBOOK.md +122 -0
  27. aether_quant-0.0.1/SECURITY.md +64 -0
  28. aether_quant-0.0.1/aether_quant.egg-info/PKG-INFO +7 -0
  29. aether_quant-0.0.1/aether_quant.egg-info/SOURCES.txt +546 -0
  30. aether_quant-0.0.1/aether_quant.egg-info/dependency_links.txt +1 -0
  31. aether_quant-0.0.1/aether_quant.egg-info/entry_points.txt +2 -0
  32. aether_quant-0.0.1/aether_quant.egg-info/scm_file_list.json +543 -0
  33. aether_quant-0.0.1/aether_quant.egg-info/scm_version.json +8 -0
  34. aether_quant-0.0.1/aether_quant.egg-info/top_level.txt +13 -0
  35. aether_quant-0.0.1/analyzer/README.md +69 -0
  36. aether_quant-0.0.1/analyzer/__init__.py +17 -0
  37. aether_quant-0.0.1/analyzer/market_analyzer.py +521 -0
  38. aether_quant-0.0.1/aq_cli.py +3633 -0
  39. aether_quant-0.0.1/audit/README.md +47 -0
  40. aether_quant-0.0.1/audit/__init__.py +38 -0
  41. aether_quant-0.0.1/audit/hash_chain.py +52 -0
  42. aether_quant-0.0.1/audit/postgres_audit.py +61 -0
  43. aether_quant-0.0.1/audit/postgres_worker.py +402 -0
  44. aether_quant-0.0.1/audit/redis_queue.py +124 -0
  45. aether_quant-0.0.1/audit/status_export.py +62 -0
  46. aether_quant-0.0.1/backtests/.gitkeep +1 -0
  47. aether_quant-0.0.1/config.json +2333 -0
  48. aether_quant-0.0.1/cpp_inference_ext/README.md +60 -0
  49. aether_quant-0.0.1/cpp_inference_ext/pyproject.toml +3 -0
  50. aether_quant-0.0.1/cpp_inference_ext/setup.py +31 -0
  51. aether_quant-0.0.1/cpp_inference_ext/src/linear_batched.cpp +62 -0
  52. aether_quant-0.0.1/data/alternative/estimize/consensus/aapl/.keep +0 -0
  53. aether_quant-0.0.1/data/alternative/estimize/estimate/.keep +0 -0
  54. aether_quant-0.0.1/data/alternative/estimize/release/.keep +0 -0
  55. aether_quant-0.0.1/data/alternative/sec/aapl/.keep +0 -0
  56. aether_quant-0.0.1/data/alternative/trading-economics/.keep +0 -0
  57. aether_quant-0.0.1/data/alternative/trading-economics/calendar/.keep +0 -0
  58. aether_quant-0.0.1/data/alternative/trading-economics/earnings/.keep +0 -0
  59. aether_quant-0.0.1/data/alternative/trading-economics/indicator/.keep +0 -0
  60. aether_quant-0.0.1/data/reference/forex_pair_specs.json +108 -0
  61. aether_quant-0.0.1/data/reference/futures_contract_specs.json +45 -0
  62. aether_quant-0.0.1/data/reference/sector_mapping.json +106 -0
  63. aether_quant-0.0.1/data_pipeline/README.md +257 -0
  64. aether_quant-0.0.1/data_pipeline/__init__.py +6 -0
  65. aether_quant-0.0.1/data_pipeline/bar_synthesis.py +97 -0
  66. aether_quant-0.0.1/data_pipeline/dividend_backfill.py +243 -0
  67. aether_quant-0.0.1/data_pipeline/factor_file_backfill.py +276 -0
  68. aether_quant-0.0.1/data_pipeline/fetch.py +206 -0
  69. aether_quant-0.0.1/data_pipeline/fred_backfill.py +435 -0
  70. aether_quant-0.0.1/data_pipeline/ib_backfill.py +287 -0
  71. aether_quant-0.0.1/data_pipeline/v2_manifest.py +75 -0
  72. aether_quant-0.0.1/data_pipeline/yfinance_backfill.py +501 -0
  73. aether_quant-0.0.1/development/Changelog.md +1888 -0
  74. aether_quant-0.0.1/development/Problems.md +1646 -0
  75. aether_quant-0.0.1/development/README.md +36 -0
  76. aether_quant-0.0.1/development/architecture.md +2090 -0
  77. aether_quant-0.0.1/development/asset_universe.md +189 -0
  78. aether_quant-0.0.1/development/backtest_equity_chart.png +0 -0
  79. aether_quant-0.0.1/development/backups/Changelog.md.bak_pre_condense +5567 -0
  80. aether_quant-0.0.1/development/backups/Changelog.md.bak_pre_condense_v54 +1395 -0
  81. aether_quant-0.0.1/development/backups/Problems.md.bak_pre_condense +4983 -0
  82. aether_quant-0.0.1/development/backups/Problems.md.bak_pre_condense_v54 +1524 -0
  83. aether_quant-0.0.1/development/backups/README.md +22 -0
  84. aether_quant-0.0.1/development/infrastructure.md +775 -0
  85. aether_quant-0.0.1/development/logo.png +0 -0
  86. aether_quant-0.0.1/development/monte_carlo_equity_curves.png +0 -0
  87. aether_quant-0.0.1/development/project_structure.md +70 -0
  88. aether_quant-0.0.1/docker-compose.yml +292 -0
  89. aether_quant-0.0.1/evaluation/README.md +152 -0
  90. aether_quant-0.0.1/evaluation/__init__.py +73 -0
  91. aether_quant-0.0.1/evaluation/ablation.py +310 -0
  92. aether_quant-0.0.1/evaluation/benchmark_comparison.py +195 -0
  93. aether_quant-0.0.1/evaluation/confidence_threshold_calibration.py +157 -0
  94. aether_quant-0.0.1/evaluation/factor_neutralization_check.py +94 -0
  95. aether_quant-0.0.1/evaluation/feature_parity.py +321 -0
  96. aether_quant-0.0.1/evaluation/feature_reconciliation.py +286 -0
  97. aether_quant-0.0.1/evaluation/impact_model.py +77 -0
  98. aether_quant-0.0.1/evaluation/kill_switch_replay.py +186 -0
  99. aether_quant-0.0.1/evaluation/limit_fill_simulator.py +152 -0
  100. aether_quant-0.0.1/evaluation/model_predictions.py +192 -0
  101. aether_quant-0.0.1/evaluation/monte_carlo.py +161 -0
  102. aether_quant-0.0.1/evaluation/public_benchmarks.py +117 -0
  103. aether_quant-0.0.1/evaluation/rank_book_simulator.py +494 -0
  104. aether_quant-0.0.1/evaluation/rank_ic_core.py +204 -0
  105. aether_quant-0.0.1/evaluation/rank_signal_calibration.py +690 -0
  106. aether_quant-0.0.1/evaluation/rolling_ic_gate_calibration.py +190 -0
  107. aether_quant-0.0.1/evaluation/rolling_ic_gate_replay.py +138 -0
  108. aether_quant-0.0.1/execution/README.md +281 -0
  109. aether_quant-0.0.1/execution/__init__.py +80 -0
  110. aether_quant-0.0.1/execution/config_cache.py +48 -0
  111. aether_quant-0.0.1/execution/cost_model.py +213 -0
  112. aether_quant-0.0.1/execution/lean_config_render.py +131 -0
  113. aether_quant-0.0.1/execution/live_credentials.py +38 -0
  114. aether_quant-0.0.1/execution/live_credentials_io.py +52 -0
  115. aether_quant-0.0.1/execution/order_gate.py +388 -0
  116. aether_quant-0.0.1/execution/paper_readiness.py +181 -0
  117. aether_quant-0.0.1/execution/paper_readiness_io.py +54 -0
  118. aether_quant-0.0.1/execution/paper_readiness_report.py +103 -0
  119. aether_quant-0.0.1/execution/paper_readiness_scheduler.py +137 -0
  120. aether_quant-0.0.1/execution/reconciliation.py +160 -0
  121. aether_quant-0.0.1/execution/runtime_config_io.py +38 -0
  122. aether_quant-0.0.1/execution/secret_scan.py +73 -0
  123. aether_quant-0.0.1/experience/README.md +68 -0
  124. aether_quant-0.0.1/experience/__init__.py +22 -0
  125. aether_quant-0.0.1/experience/observation_metrics.py +124 -0
  126. aether_quant-0.0.1/experience/postgres_worker.py +392 -0
  127. aether_quant-0.0.1/experience/redis_queue.py +374 -0
  128. aether_quant-0.0.1/experience/simulated_portfolio.py +191 -0
  129. aether_quant-0.0.1/experts/README.md +37 -0
  130. aether_quant-0.0.1/experts/__init__.py +17 -0
  131. aether_quant-0.0.1/experts/expert_datasets.py +184 -0
  132. aether_quant-0.0.1/features/README.md +77 -0
  133. aether_quant-0.0.1/features/__init__.py +137 -0
  134. aether_quant-0.0.1/features/alt_data_features.py +154 -0
  135. aether_quant-0.0.1/features/bond_features.py +275 -0
  136. aether_quant-0.0.1/features/cross_asset_sensitivity.py +79 -0
  137. aether_quant-0.0.1/features/derivatives_macro_features.py +72 -0
  138. aether_quant-0.0.1/features/macro_features.py +79 -0
  139. aether_quant-0.0.1/features/options_greeks.py +329 -0
  140. aether_quant-0.0.1/features/sector_map.py +53 -0
  141. aether_quant-0.0.1/features/technical_indicators.py +185 -0
  142. aether_quant-0.0.1/generate_backtest_report.py +311 -0
  143. aether_quant-0.0.1/generate_evaluation_report.py +712 -0
  144. aether_quant-0.0.1/inference/README.md +105 -0
  145. aether_quant-0.0.1/inference/__init__.py +36 -0
  146. aether_quant-0.0.1/inference/exported_model.py +929 -0
  147. aether_quant-0.0.1/inference/parallel_inference.py +160 -0
  148. aether_quant-0.0.1/inference/strategy_selector_inference.py +75 -0
  149. aether_quant-0.0.1/json_safety.py +130 -0
  150. aether_quant-0.0.1/lean.json +649 -0
  151. aether_quant-0.0.1/liquidity/README.md +97 -0
  152. aether_quant-0.0.1/liquidity/__init__.py +15 -0
  153. aether_quant-0.0.1/liquidity/market_liquidity.py +335 -0
  154. aether_quant-0.0.1/main.py +7779 -0
  155. aether_quant-0.0.1/ml/README.md +84 -0
  156. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/metrics.json +314 -0
  157. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/model.pt +0 -0
  158. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/model_weights.json +1900 -0
  159. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/multitask_model.json +1954 -0
  160. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bearish/multitask_training_metrics.json +202 -0
  161. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/metrics.json +308 -0
  162. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/model.pt +0 -0
  163. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/model_weights.json +1902 -0
  164. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/multitask_model.json +1954 -0
  165. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/bullish/multitask_training_metrics.json +227 -0
  166. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/metrics.json +325 -0
  167. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/model.pt +0 -0
  168. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/model_weights.json +1901 -0
  169. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/multitask_model.json +1954 -0
  170. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/sideways/multitask_training_metrics.json +192 -0
  171. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/metrics.json +295 -0
  172. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/model.pt +0 -0
  173. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/model_weights.json +1901 -0
  174. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/multitask_model.json +1954 -0
  175. aether_quant-0.0.1/ml/_backup_pre_v537/expert_models/volatility/multitask_training_metrics.json +232 -0
  176. aether_quant-0.0.1/ml/_backup_pre_v537/feature_schema.json +2378 -0
  177. aether_quant-0.0.1/ml/_backup_pre_v537/gating_feature_schema.json +30 -0
  178. aether_quant-0.0.1/ml/_backup_pre_v537/gating_model.json +570 -0
  179. aether_quant-0.0.1/ml/_backup_pre_v537/gating_training_metrics.json +262 -0
  180. aether_quant-0.0.1/ml/_backup_pre_v537/model.pt +0 -0
  181. aether_quant-0.0.1/ml/_backup_pre_v537/model_weights.json +11017 -0
  182. aether_quant-0.0.1/ml/_backup_pre_v537/multitask_feature_schema.json +70 -0
  183. aether_quant-0.0.1/ml/_backup_pre_v537/multitask_model.json +7448 -0
  184. aether_quant-0.0.1/ml/_backup_pre_v537/multitask_training_metrics.json +11852 -0
  185. aether_quant-0.0.1/ml/_backup_pre_v537/scaler.pkl +0 -0
  186. aether_quant-0.0.1/ml/_backup_pre_v537/scaler_stats.json +156 -0
  187. aether_quant-0.0.1/ml/_backup_pre_v537/sequence_feature_schema.json +71 -0
  188. aether_quant-0.0.1/ml/_backup_pre_v537/sequence_model.json +16695 -0
  189. aether_quant-0.0.1/ml/_backup_pre_v537/sequence_training_metrics.json +11872 -0
  190. aether_quant-0.0.1/ml/_backup_pre_v537/training_metrics.json +633 -0
  191. aether_quant-0.0.1/moe/README.md +147 -0
  192. aether_quant-0.0.1/moe/__init__.py +19 -0
  193. aether_quant-0.0.1/moe/gating.py +414 -0
  194. aether_quant-0.0.1/monitoring/README.md +23 -0
  195. aether_quant-0.0.1/monitoring/__init__.py +2 -0
  196. aether_quant-0.0.1/monitoring/api_server.py +187 -0
  197. aether_quant-0.0.1/monitoring/assets_status.py +90 -0
  198. aether_quant-0.0.1/monitoring/evaluation_state.py +127 -0
  199. aether_quant-0.0.1/monitoring/neural_network_state.py +490 -0
  200. aether_quant-0.0.1/monitoring/strategy_catalog.py +39 -0
  201. aether_quant-0.0.1/notifications/README.md +52 -0
  202. aether_quant-0.0.1/notifications/__init__.py +13 -0
  203. aether_quant-0.0.1/notifications/postgres_telegram.py +99 -0
  204. aether_quant-0.0.1/notifications/telegram_alerts.py +82 -0
  205. aether_quant-0.0.1/notifications/telegram_client.py +79 -0
  206. aether_quant-0.0.1/notifications/telegram_worker.py +215 -0
  207. aether_quant-0.0.1/performance/README.md +79 -0
  208. aether_quant-0.0.1/performance/__init__.py +45 -0
  209. aether_quant-0.0.1/performance/postgres_triggers.py +345 -0
  210. aether_quant-0.0.1/performance/rank_ic_monitor.py +56 -0
  211. aether_quant-0.0.1/performance/trigger_worker.py +189 -0
  212. aether_quant-0.0.1/performance/triggers.py +956 -0
  213. aether_quant-0.0.1/portfolio/README.md +447 -0
  214. aether_quant-0.0.1/portfolio/__init__.py +41 -0
  215. aether_quant-0.0.1/portfolio/book_construction.py +786 -0
  216. aether_quant-0.0.1/portfolio/book_neutrality.py +178 -0
  217. aether_quant-0.0.1/portfolio/hrp_allocation.py +159 -0
  218. aether_quant-0.0.1/portfolio/options_arbitrage_detector.py +232 -0
  219. aether_quant-0.0.1/portfolio/options_assignment_risk.py +119 -0
  220. aether_quant-0.0.1/portfolio/options_margin_sizing.py +333 -0
  221. aether_quant-0.0.1/portfolio/options_strategy.py +1999 -0
  222. aether_quant-0.0.1/portfolio/rank_signal.py +219 -0
  223. aether_quant-0.0.1/portfolio/rolling_ic_gate.py +183 -0
  224. aether_quant-0.0.1/pyproject.toml +123 -0
  225. aether_quant-0.0.1/regime/README.md +53 -0
  226. aether_quant-0.0.1/regime/__init__.py +17 -0
  227. aether_quant-0.0.1/regime/market_regime.py +187 -0
  228. aether_quant-0.0.1/requirements/README.md +28 -0
  229. aether_quant-0.0.1/requirements/lean-runtime.txt +12 -0
  230. aether_quant-0.0.1/requirements/requirements-dev.txt +63 -0
  231. aether_quant-0.0.1/requirements/requirements.txt +44 -0
  232. aether_quant-0.0.1/retraining/README.md +145 -0
  233. aether_quant-0.0.1/retraining/__init__.py +107 -0
  234. aether_quant-0.0.1/retraining/artifacts.py +284 -0
  235. aether_quant-0.0.1/retraining/auto_rollback.py +109 -0
  236. aether_quant-0.0.1/retraining/backtest_gate.py +77 -0
  237. aether_quant-0.0.1/retraining/lean_backtest.py +64 -0
  238. aether_quant-0.0.1/retraining/orchestrator.py +898 -0
  239. aether_quant-0.0.1/retraining/planning.py +246 -0
  240. aether_quant-0.0.1/retraining/postgres_registry.py +385 -0
  241. aether_quant-0.0.1/retraining/rollback_hardening.py +42 -0
  242. aether_quant-0.0.1/retraining/status_export.py +179 -0
  243. aether_quant-0.0.1/retraining/validation_gate.py +339 -0
  244. aether_quant-0.0.1/retraining/vault_client.py +108 -0
  245. aether_quant-0.0.1/retraining/vault_commands.py +52 -0
  246. aether_quant-0.0.1/retraining/worker.py +356 -0
  247. aether_quant-0.0.1/risk/README.md +275 -0
  248. aether_quant-0.0.1/risk/__init__.py +38 -0
  249. aether_quant-0.0.1/risk/asset_class_router.py +584 -0
  250. aether_quant-0.0.1/risk/forex_risk.py +158 -0
  251. aether_quant-0.0.1/risk/futures_risk.py +202 -0
  252. aether_quant-0.0.1/risk/kill_switch.py +261 -0
  253. aether_quant-0.0.1/risk/manual_override.py +118 -0
  254. aether_quant-0.0.1/risk/position_sizing.py +303 -0
  255. aether_quant-0.0.1/risk/rl_sizing.py +189 -0
  256. aether_quant-0.0.1/risk_controls.py +386 -0
  257. aether_quant-0.0.1/scripts/README.md +66 -0
  258. aether_quant-0.0.1/scripts/feature_parity_audit.py +390 -0
  259. aether_quant-0.0.1/scripts/gate_sweep.py +234 -0
  260. aether_quant-0.0.1/scripts/gate_sweep_score_stage.py +73 -0
  261. aether_quant-0.0.1/scripts/order_events_audit.py +205 -0
  262. aether_quant-0.0.1/scripts/overlap_vs_sharpe_analysis.py +82 -0
  263. aether_quant-0.0.1/scripts/profile_inference.py +585 -0
  264. aether_quant-0.0.1/scripts/profile_subsystems.py +616 -0
  265. aether_quant-0.0.1/scripts/promotion_gate_null_calibration.py +153 -0
  266. aether_quant-0.0.1/scripts/promotion_gate_null_gate_scheme.py +133 -0
  267. aether_quant-0.0.1/scripts/render_lean_credentials.py +47 -0
  268. aether_quant-0.0.1/scripts/run_lean_cli_windows.py +49 -0
  269. aether_quant-0.0.1/setup.cfg +4 -0
  270. aether_quant-0.0.1/tests/README.md +45 -0
  271. aether_quant-0.0.1/tests/test_ablation.py +287 -0
  272. aether_quant-0.0.1/tests/test_alt_data_features.py +139 -0
  273. aether_quant-0.0.1/tests/test_api_server.py +180 -0
  274. aether_quant-0.0.1/tests/test_aq_cli.py +3666 -0
  275. aether_quant-0.0.1/tests/test_aq_test_ruff_flag.py +67 -0
  276. aether_quant-0.0.1/tests/test_asset_class_router.py +512 -0
  277. aether_quant-0.0.1/tests/test_assets_status.py +112 -0
  278. aether_quant-0.0.1/tests/test_audit_postgres_worker.py +274 -0
  279. aether_quant-0.0.1/tests/test_audit_queue.py +85 -0
  280. aether_quant-0.0.1/tests/test_audit_status_export.py +66 -0
  281. aether_quant-0.0.1/tests/test_auto_rollback.py +186 -0
  282. aether_quant-0.0.1/tests/test_backtest_gate.py +65 -0
  283. aether_quant-0.0.1/tests/test_bar_synthesis_parity.py +58 -0
  284. aether_quant-0.0.1/tests/test_bond_features.py +220 -0
  285. aether_quant-0.0.1/tests/test_book_neutrality.py +215 -0
  286. aether_quant-0.0.1/tests/test_ci_workflows.py +138 -0
  287. aether_quant-0.0.1/tests/test_cli_help_surface.py +142 -0
  288. aether_quant-0.0.1/tests/test_confidence_threshold_calibration.py +119 -0
  289. aether_quant-0.0.1/tests/test_config_cache.py +87 -0
  290. aether_quant-0.0.1/tests/test_cost_model.py +246 -0
  291. aether_quant-0.0.1/tests/test_cross_asset_sensitivity.py +106 -0
  292. aether_quant-0.0.1/tests/test_derivatives_macro_features.py +100 -0
  293. aether_quant-0.0.1/tests/test_dividend_backfill.py +184 -0
  294. aether_quant-0.0.1/tests/test_dockerignore_secrets.py +104 -0
  295. aether_quant-0.0.1/tests/test_evaluation_state.py +175 -0
  296. aether_quant-0.0.1/tests/test_experience_queue.py +416 -0
  297. aether_quant-0.0.1/tests/test_expert_datasets.py +86 -0
  298. aether_quant-0.0.1/tests/test_expert_models.py +186 -0
  299. aether_quant-0.0.1/tests/test_exported_model.py +1073 -0
  300. aether_quant-0.0.1/tests/test_factor_file_backfill.py +224 -0
  301. aether_quant-0.0.1/tests/test_feature_parity.py +125 -0
  302. aether_quant-0.0.1/tests/test_feature_reconciliation.py +233 -0
  303. aether_quant-0.0.1/tests/test_fetch.py +462 -0
  304. aether_quant-0.0.1/tests/test_forex_risk.py +124 -0
  305. aether_quant-0.0.1/tests/test_fred_backfill.py +350 -0
  306. aether_quant-0.0.1/tests/test_futures_risk.py +211 -0
  307. aether_quant-0.0.1/tests/test_gating_network.py +542 -0
  308. aether_quant-0.0.1/tests/test_generate_backtest_report.py +259 -0
  309. aether_quant-0.0.1/tests/test_generate_evaluation_report.py +561 -0
  310. aether_quant-0.0.1/tests/test_hash_chain.py +85 -0
  311. aether_quant-0.0.1/tests/test_hrp_book_sizing.py +243 -0
  312. aether_quant-0.0.1/tests/test_ib_backfill.py +335 -0
  313. aether_quant-0.0.1/tests/test_impact_model.py +67 -0
  314. aether_quant-0.0.1/tests/test_json_safety.py +95 -0
  315. aether_quant-0.0.1/tests/test_kill_switch.py +406 -0
  316. aether_quant-0.0.1/tests/test_kill_switch_replay.py +215 -0
  317. aether_quant-0.0.1/tests/test_lean_backtest.py +67 -0
  318. aether_quant-0.0.1/tests/test_lean_backtest_ml_coverage.py +300 -0
  319. aether_quant-0.0.1/tests/test_lean_config_render.py +109 -0
  320. aether_quant-0.0.1/tests/test_lean_runtime_imports.py +89 -0
  321. aether_quant-0.0.1/tests/test_learned_topology.py +486 -0
  322. aether_quant-0.0.1/tests/test_limit_fill_simulator.py +155 -0
  323. aether_quant-0.0.1/tests/test_live_credentials.py +63 -0
  324. aether_quant-0.0.1/tests/test_live_credentials_io.py +67 -0
  325. aether_quant-0.0.1/tests/test_macro_features.py +49 -0
  326. aether_quant-0.0.1/tests/test_manual_override.py +171 -0
  327. aether_quant-0.0.1/tests/test_market_analyzer.py +695 -0
  328. aether_quant-0.0.1/tests/test_market_liquidity.py +221 -0
  329. aether_quant-0.0.1/tests/test_market_regime.py +109 -0
  330. aether_quant-0.0.1/tests/test_market_topology.py +902 -0
  331. aether_quant-0.0.1/tests/test_model_predictions.py +252 -0
  332. aether_quant-0.0.1/tests/test_monte_carlo.py +120 -0
  333. aether_quant-0.0.1/tests/test_neural_network_state.py +433 -0
  334. aether_quant-0.0.1/tests/test_observation_metrics.py +181 -0
  335. aether_quant-0.0.1/tests/test_options_arbitrage_detector.py +170 -0
  336. aether_quant-0.0.1/tests/test_options_assignment_risk.py +195 -0
  337. aether_quant-0.0.1/tests/test_options_greeks.py +225 -0
  338. aether_quant-0.0.1/tests/test_options_margin_sizing.py +178 -0
  339. aether_quant-0.0.1/tests/test_options_strategy.py +524 -0
  340. aether_quant-0.0.1/tests/test_options_strategy_multileg.py +572 -0
  341. aether_quant-0.0.1/tests/test_order_events_audit.py +135 -0
  342. aether_quant-0.0.1/tests/test_order_gate.py +563 -0
  343. aether_quant-0.0.1/tests/test_paper_readiness.py +266 -0
  344. aether_quant-0.0.1/tests/test_paper_readiness_io.py +83 -0
  345. aether_quant-0.0.1/tests/test_paper_readiness_report.py +88 -0
  346. aether_quant-0.0.1/tests/test_paper_readiness_scheduler.py +104 -0
  347. aether_quant-0.0.1/tests/test_parallel_inference.py +280 -0
  348. aether_quant-0.0.1/tests/test_portfolio_book_construction.py +1105 -0
  349. aether_quant-0.0.1/tests/test_position_sizing.py +341 -0
  350. aether_quant-0.0.1/tests/test_postgres_audit.py +83 -0
  351. aether_quant-0.0.1/tests/test_postgres_telegram.py +101 -0
  352. aether_quant-0.0.1/tests/test_postgres_triggers.py +244 -0
  353. aether_quant-0.0.1/tests/test_postgres_worker.py +333 -0
  354. aether_quant-0.0.1/tests/test_profile_inference.py +161 -0
  355. aether_quant-0.0.1/tests/test_profile_subsystems.py +134 -0
  356. aether_quant-0.0.1/tests/test_promotion_gate_era_rule.py +94 -0
  357. aether_quant-0.0.1/tests/test_public_benchmarks.py +194 -0
  358. aether_quant-0.0.1/tests/test_rank_book_simulator.py +375 -0
  359. aether_quant-0.0.1/tests/test_rank_ic_core.py +156 -0
  360. aether_quant-0.0.1/tests/test_rank_ic_monitor.py +137 -0
  361. aether_quant-0.0.1/tests/test_rank_signal.py +242 -0
  362. aether_quant-0.0.1/tests/test_rank_signal_calibration.py +664 -0
  363. aether_quant-0.0.1/tests/test_reconciliation.py +223 -0
  364. aether_quant-0.0.1/tests/test_retraining_artifacts.py +465 -0
  365. aether_quant-0.0.1/tests/test_retraining_orchestrator.py +703 -0
  366. aether_quant-0.0.1/tests/test_retraining_planning.py +257 -0
  367. aether_quant-0.0.1/tests/test_retraining_postgres_registry.py +216 -0
  368. aether_quant-0.0.1/tests/test_retraining_worker.py +392 -0
  369. aether_quant-0.0.1/tests/test_risk_controls.py +632 -0
  370. aether_quant-0.0.1/tests/test_rl_sizing.py +193 -0
  371. aether_quant-0.0.1/tests/test_rl_sizing_v541.py +83 -0
  372. aether_quant-0.0.1/tests/test_rollback_hardening.py +53 -0
  373. aether_quant-0.0.1/tests/test_rolling_ic_gate.py +165 -0
  374. aether_quant-0.0.1/tests/test_rolling_ic_gate_calibration.py +138 -0
  375. aether_quant-0.0.1/tests/test_rolling_ic_gate_replay.py +153 -0
  376. aether_quant-0.0.1/tests/test_runtime_config_io.py +54 -0
  377. aether_quant-0.0.1/tests/test_secret_scan.py +63 -0
  378. aether_quant-0.0.1/tests/test_sector_map.py +66 -0
  379. aether_quant-0.0.1/tests/test_simulated_portfolio.py +237 -0
  380. aether_quant-0.0.1/tests/test_status_export.py +138 -0
  381. aether_quant-0.0.1/tests/test_strategy_catalog.py +37 -0
  382. aether_quant-0.0.1/tests/test_strategy_selector_inference.py +83 -0
  383. aether_quant-0.0.1/tests/test_technical_indicators.py +261 -0
  384. aether_quant-0.0.1/tests/test_telegram_alerts.py +77 -0
  385. aether_quant-0.0.1/tests/test_telegram_client.py +66 -0
  386. aether_quant-0.0.1/tests/test_telegram_worker.py +199 -0
  387. aether_quant-0.0.1/tests/test_train_alt_data_features.py +206 -0
  388. aether_quant-0.0.1/tests/test_train_asset_class_context_features.py +87 -0
  389. aether_quant-0.0.1/tests/test_train_bond_features.py +244 -0
  390. aether_quant-0.0.1/tests/test_train_cross_asset_sensitivity.py +136 -0
  391. aether_quant-0.0.1/tests/test_train_cross_sectional_batching.py +162 -0
  392. aether_quant-0.0.1/tests/test_train_cross_sectional_features.py +701 -0
  393. aether_quant-0.0.1/tests/test_train_derivatives_macro_features.py +220 -0
  394. aether_quant-0.0.1/tests/test_train_gate_friendliness.py +141 -0
  395. aether_quant-0.0.1/tests/test_train_gating.py +179 -0
  396. aether_quant-0.0.1/tests/test_train_indicators.py +229 -0
  397. aether_quant-0.0.1/tests/test_train_macro_features.py +157 -0
  398. aether_quant-0.0.1/tests/test_train_multitask.py +567 -0
  399. aether_quant-0.0.1/tests/test_train_multitask_architecture.py +189 -0
  400. aether_quant-0.0.1/tests/test_train_optimizer_and_swa.py +171 -0
  401. aether_quant-0.0.1/tests/test_train_pipeline.py +1017 -0
  402. aether_quant-0.0.1/tests/test_train_ranking_loss.py +418 -0
  403. aether_quant-0.0.1/tests/test_train_ranking_validation.py +907 -0
  404. aether_quant-0.0.1/tests/test_train_residual_rank_targets.py +266 -0
  405. aether_quant-0.0.1/tests/test_train_rl_sizing.py +244 -0
  406. aether_quant-0.0.1/tests/test_train_select_model_context_columns.py +33 -0
  407. aether_quant-0.0.1/tests/test_train_sequence.py +207 -0
  408. aether_quant-0.0.1/tests/test_train_sequence_architecture.py +310 -0
  409. aether_quant-0.0.1/tests/test_train_strategy_selector.py +145 -0
  410. aether_quant-0.0.1/tests/test_train_threshold_and_early_stop.py +94 -0
  411. aether_quant-0.0.1/tests/test_train_topology.py +171 -0
  412. aether_quant-0.0.1/tests/test_train_walk_forward_windows.py +176 -0
  413. aether_quant-0.0.1/tests/test_trigger_worker.py +219 -0
  414. aether_quant-0.0.1/tests/test_triggers.py +646 -0
  415. aether_quant-0.0.1/tests/test_v2_pipeline_manifest.py +41 -0
  416. aether_quant-0.0.1/tests/test_v543_new_features.py +169 -0
  417. aether_quant-0.0.1/tests/test_v547_bug_hunt.py +497 -0
  418. aether_quant-0.0.1/tests/test_validation_gate.py +323 -0
  419. aether_quant-0.0.1/tests/test_vault_client.py +109 -0
  420. aether_quant-0.0.1/tests/test_vault_commands.py +65 -0
  421. aether_quant-0.0.1/tests/test_walk_forward_multimodel.py +225 -0
  422. aether_quant-0.0.1/tests/test_yfinance_backfill.py +416 -0
  423. aether_quant-0.0.1/topology/README.md +122 -0
  424. aether_quant-0.0.1/topology/__init__.py +23 -0
  425. aether_quant-0.0.1/topology/learned_topology.py +301 -0
  426. aether_quant-0.0.1/topology/market_topology.py +710 -0
  427. aether_quant-0.0.1/train.py +7390 -0
  428. aether_quant-0.0.1/train_gating.py +453 -0
  429. aether_quant-0.0.1/train_multitask.py +853 -0
  430. aether_quant-0.0.1/train_rl_sizing.py +461 -0
  431. aether_quant-0.0.1/train_sequence.py +836 -0
  432. aether_quant-0.0.1/train_strategy_selector.py +274 -0
  433. aether_quant-0.0.1/train_topology.py +341 -0
  434. aether_quant-0.0.1/visualization/README.md +68 -0
  435. aether_quant-0.0.1/visualization/forex_order_sizing.jsonl +991 -0
  436. aether_quant-0.0.1/webui/.gitignore +24 -0
  437. aether_quant-0.0.1/webui/.oxlintrc.json +8 -0
  438. aether_quant-0.0.1/webui/README.md +173 -0
  439. aether_quant-0.0.1/webui/index.html +13 -0
  440. aether_quant-0.0.1/webui/overview_v2_12.png +0 -0
  441. aether_quant-0.0.1/webui/package-lock.json +4014 -0
  442. aether_quant-0.0.1/webui/package.json +41 -0
  443. aether_quant-0.0.1/webui/public/favicon.svg +1 -0
  444. aether_quant-0.0.1/webui/public/icons.svg +24 -0
  445. aether_quant-0.0.1/webui/risk_v2_12.png +0 -0
  446. aether_quant-0.0.1/webui/src/App.tsx +58 -0
  447. aether_quant-0.0.1/webui/src/api/client.ts +33 -0
  448. aether_quant-0.0.1/webui/src/api/hooks.ts +123 -0
  449. aether_quant-0.0.1/webui/src/components/evaluation/AblationPanel.test.tsx +82 -0
  450. aether_quant-0.0.1/webui/src/components/evaluation/AblationPanel.tsx +103 -0
  451. aether_quant-0.0.1/webui/src/components/evaluation/BenchmarkPanel.test.tsx +71 -0
  452. aether_quant-0.0.1/webui/src/components/evaluation/BenchmarkPanel.tsx +99 -0
  453. aether_quant-0.0.1/webui/src/components/evaluation/BookHistoryReconciliationPanel.test.tsx +79 -0
  454. aether_quant-0.0.1/webui/src/components/evaluation/BookHistoryReconciliationPanel.tsx +129 -0
  455. aether_quant-0.0.1/webui/src/components/evaluation/BookSpreadCalibrationPanel.test.tsx +39 -0
  456. aether_quant-0.0.1/webui/src/components/evaluation/BookSpreadCalibrationPanel.tsx +66 -0
  457. aether_quant-0.0.1/webui/src/components/evaluation/CapacityStressPanel.tsx +99 -0
  458. aether_quant-0.0.1/webui/src/components/evaluation/MonteCarloPanel.test.tsx +81 -0
  459. aether_quant-0.0.1/webui/src/components/evaluation/MonteCarloPanel.tsx +100 -0
  460. aether_quant-0.0.1/webui/src/components/evaluation/RankBookPerformancePanel.test.tsx +60 -0
  461. aether_quant-0.0.1/webui/src/components/evaluation/RankBookPerformancePanel.tsx +66 -0
  462. aether_quant-0.0.1/webui/src/components/evaluation/WalkForwardStabilityPanel.test.tsx +93 -0
  463. aether_quant-0.0.1/webui/src/components/evaluation/WalkForwardStabilityPanel.tsx +132 -0
  464. aether_quant-0.0.1/webui/src/components/heatmap/AssetHeatmap.tsx +43 -0
  465. aether_quant-0.0.1/webui/src/components/layout/AppShell.tsx +77 -0
  466. aether_quant-0.0.1/webui/src/components/layout/Panel.tsx +13 -0
  467. aether_quant-0.0.1/webui/src/components/monitoring/AssetsStatusPanel.tsx +69 -0
  468. aether_quant-0.0.1/webui/src/components/monitoring/AuditLogPanel.tsx +49 -0
  469. aether_quant-0.0.1/webui/src/components/monitoring/CountTable.tsx +21 -0
  470. aether_quant-0.0.1/webui/src/components/monitoring/KillSwitchPanel.test.tsx +54 -0
  471. aether_quant-0.0.1/webui/src/components/monitoring/KillSwitchPanel.tsx +77 -0
  472. aether_quant-0.0.1/webui/src/components/monitoring/MonitoringFeeds.tsx +35 -0
  473. aether_quant-0.0.1/webui/src/components/monitoring/ObservationPanel.tsx +50 -0
  474. aether_quant-0.0.1/webui/src/components/monitoring/PaperReadinessPanel.tsx +58 -0
  475. aether_quant-0.0.1/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +63 -0
  476. aether_quant-0.0.1/webui/src/components/monitoring/RawStateViewer.tsx +28 -0
  477. aether_quant-0.0.1/webui/src/components/monitoring/ReconciliationPanel.test.tsx +55 -0
  478. aether_quant-0.0.1/webui/src/components/monitoring/ReconciliationPanel.tsx +75 -0
  479. aether_quant-0.0.1/webui/src/components/monitoring/RetrainingStatusPanel.test.tsx +76 -0
  480. aether_quant-0.0.1/webui/src/components/monitoring/RetrainingStatusPanel.tsx +106 -0
  481. aether_quant-0.0.1/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +229 -0
  482. aether_quant-0.0.1/webui/src/components/neuralnet/NeuralNetworkStatsPanel.test.tsx +128 -0
  483. aether_quant-0.0.1/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +253 -0
  484. aether_quant-0.0.1/webui/src/components/neuralnet/TrainingRecipePanel.test.tsx +63 -0
  485. aether_quant-0.0.1/webui/src/components/neuralnet/TrainingRecipePanel.tsx +68 -0
  486. aether_quant-0.0.1/webui/src/components/optionsstrategy/CorporateActionsPanel.tsx +42 -0
  487. aether_quant-0.0.1/webui/src/components/optionsstrategy/DividendScheduleSummaryPanel.tsx +43 -0
  488. aether_quant-0.0.1/webui/src/components/optionsstrategy/ForexPairDetailPanel.tsx +51 -0
  489. aether_quant-0.0.1/webui/src/components/optionsstrategy/HeldMultiLegPositionsPanel.tsx +71 -0
  490. aether_quant-0.0.1/webui/src/components/optionsstrategy/StrategyCatalogBrowser.tsx +48 -0
  491. aether_quant-0.0.1/webui/src/components/optionsstrategy/StrategySelectorScoresPanel.tsx +48 -0
  492. aether_quant-0.0.1/webui/src/components/portfolio/BookNeutralityPanel.test.tsx +28 -0
  493. aether_quant-0.0.1/webui/src/components/portfolio/BookNeutralityPanel.tsx +57 -0
  494. aether_quant-0.0.1/webui/src/components/risk/AssetSizingTable.test.tsx +52 -0
  495. aether_quant-0.0.1/webui/src/components/risk/AssetSizingTable.tsx +211 -0
  496. aether_quant-0.0.1/webui/src/components/risk/DerivativesMacroPanel.tsx +107 -0
  497. aether_quant-0.0.1/webui/src/components/risk/LiquidityTable.tsx +122 -0
  498. aether_quant-0.0.1/webui/src/components/risk/MacroSnapshotPanel.test.tsx +46 -0
  499. aether_quant-0.0.1/webui/src/components/risk/MacroSnapshotPanel.tsx +57 -0
  500. aether_quant-0.0.1/webui/src/components/risk/NetEdgePanel.test.tsx +54 -0
  501. aether_quant-0.0.1/webui/src/components/risk/NetEdgePanel.tsx +74 -0
  502. aether_quant-0.0.1/webui/src/components/risk/RiskBar.tsx +14 -0
  503. aether_quant-0.0.1/webui/src/components/risk/RiskCore.tsx +65 -0
  504. aether_quant-0.0.1/webui/src/components/risk/SensitivityPanel.test.tsx +37 -0
  505. aether_quant-0.0.1/webui/src/components/risk/SensitivityPanel.tsx +75 -0
  506. aether_quant-0.0.1/webui/src/components/risk/StrategyRiskCards.tsx +35 -0
  507. aether_quant-0.0.1/webui/src/components/scene3d/Scene3D.tsx +94 -0
  508. aether_quant-0.0.1/webui/src/components/scorecards/Scorecards.tsx +27 -0
  509. aether_quant-0.0.1/webui/src/components/signals/Badge.tsx +43 -0
  510. aether_quant-0.0.1/webui/src/components/signals/PositionsList.tsx +36 -0
  511. aether_quant-0.0.1/webui/src/components/signals/RankSignalPanel.test.tsx +43 -0
  512. aether_quant-0.0.1/webui/src/components/signals/RankSignalPanel.tsx +50 -0
  513. aether_quant-0.0.1/webui/src/components/signals/SignalBoard.tsx +45 -0
  514. aether_quant-0.0.1/webui/src/components/topology/ClusterList.tsx +45 -0
  515. aether_quant-0.0.1/webui/src/components/topology/TopologyLearningPanel.tsx +93 -0
  516. aether_quant-0.0.1/webui/src/components/topology/TopologyScene3D.test.tsx +51 -0
  517. aether_quant-0.0.1/webui/src/components/topology/TopologyScene3D.tsx +139 -0
  518. aether_quant-0.0.1/webui/src/components/tracing/AssetPerformancePanel.tsx +56 -0
  519. aether_quant-0.0.1/webui/src/components/tracing/BacktestEquityPanel.tsx +93 -0
  520. aether_quant-0.0.1/webui/src/components/tracing/DivergingBarChart.test.tsx +41 -0
  521. aether_quant-0.0.1/webui/src/components/tracing/DivergingBarChart.tsx +49 -0
  522. aether_quant-0.0.1/webui/src/components/tracing/LineChart.test.tsx +73 -0
  523. aether_quant-0.0.1/webui/src/components/tracing/LineChart.tsx +195 -0
  524. aether_quant-0.0.1/webui/src/components/tracing/MetricsSnapshotPanel.tsx +46 -0
  525. aether_quant-0.0.1/webui/src/components/tracing/ObservationEquityPanel.tsx +72 -0
  526. aether_quant-0.0.1/webui/src/index.css +11 -0
  527. aether_quant-0.0.1/webui/src/lib/downsample.ts +13 -0
  528. aether_quant-0.0.1/webui/src/lib/format.test.ts +74 -0
  529. aether_quant-0.0.1/webui/src/lib/format.ts +25 -0
  530. aether_quant-0.0.1/webui/src/main.tsx +18 -0
  531. aether_quant-0.0.1/webui/src/pages/EvaluationPage.tsx +36 -0
  532. aether_quant-0.0.1/webui/src/pages/NeuralNetworkPage.tsx +19 -0
  533. aether_quant-0.0.1/webui/src/pages/OperationsPage.tsx +37 -0
  534. aether_quant-0.0.1/webui/src/pages/OptionsStrategyPage.tsx +27 -0
  535. aether_quant-0.0.1/webui/src/pages/Overview.tsx +28 -0
  536. aether_quant-0.0.1/webui/src/pages/RiskPage.tsx +26 -0
  537. aether_quant-0.0.1/webui/src/pages/TopologyPage.tsx +20 -0
  538. aether_quant-0.0.1/webui/src/pages/TracingPage.tsx +30 -0
  539. aether_quant-0.0.1/webui/src/pages/pages.test.tsx +208 -0
  540. aether_quant-0.0.1/webui/src/test/setup.ts +24 -0
  541. aether_quant-0.0.1/webui/src/types/audit.ts +20 -0
  542. aether_quant-0.0.1/webui/src/types/evaluation.ts +284 -0
  543. aether_quant-0.0.1/webui/src/types/state.ts +954 -0
  544. aether_quant-0.0.1/webui/src/types/tracing.ts +26 -0
  545. aether_quant-0.0.1/webui/tsconfig.app.json +25 -0
  546. aether_quant-0.0.1/webui/tsconfig.json +7 -0
  547. aether_quant-0.0.1/webui/tsconfig.node.json +23 -0
  548. aether_quant-0.0.1/webui/vite.config.ts +25 -0
@@ -0,0 +1,12 @@
1
+ # .devcontainer
2
+
3
+ GitHub Codespaces / VS Code Dev Container definition for Aether Quant
4
+ (`devcontainer.json`), plus a `dind-v1-test/` variant used to test
5
+ Docker-in-Docker setups.
6
+
7
+ The container is the `mcr.microsoft.com/devcontainers/python:3.11` image with
8
+ an sshd feature (Codespaces training access) and a post-create command that
9
+ installs the CPU PyTorch build plus both requirements files. This is the
10
+ environment behind this project's own "train in the cloud" convention — see
11
+ [`RUNBOOK.md`](../RUNBOOK.md) and
12
+ [`development/infrastructure.md`](../development/infrastructure.md).
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "Aether Quant",
3
+ "image": "mcr.microsoft.com/devcontainers/python:3.11",
4
+ "features": {
5
+ "ghcr.io/devcontainers/features/sshd:1": {
6
+ "version": "latest"
7
+ }
8
+ },
9
+ "hostRequirements": {
10
+ "cpus": 2,
11
+ "memory": "8gb"
12
+ },
13
+ "postCreateCommand": "pip install torch --index-url https://download.pytorch.org/whl/cpu && pip install -r requirements/requirements.txt && pip install -r requirements/requirements-dev.txt"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "Aether Quant DinD v1 Test",
3
+ "image": "mcr.microsoft.com/devcontainers/python:3.11",
4
+ "features": {
5
+ "ghcr.io/devcontainers/features/sshd:1": {
6
+ "version": "latest"
7
+ },
8
+ "ghcr.io/devcontainers/features/docker-in-docker:1": {}
9
+ },
10
+ "hostRequirements": {
11
+ "cpus": 2,
12
+ "memory": "8gb"
13
+ }
14
+ }
@@ -0,0 +1,51 @@
1
+ __pycache__/
2
+ *.pyc
3
+ *.pyo
4
+ .venv/
5
+ node_modules/
6
+ webui/node_modules/
7
+ webui/dist/
8
+ backtests/
9
+ .lean/
10
+ .git/
11
+ .claude/
12
+ Aether-quant-Obsidian-Vault/
13
+ # Large data directories not needed by the FastAPI server
14
+ data/
15
+ ml/
16
+ storage/
17
+
18
+ # Local secrets and broker/API credentials - mirrors .gitignore's own list.
19
+ # Being .gitignore'd does NOT keep a file out of the image: the engine build
20
+ # does `COPY . .`, and that same image is published to ghcr (single fat
21
+ # target, no slim variant), so anything not excluded here is baked into a
22
+ # public registry layer - recoverable via `docker history`/`docker save` even
23
+ # if a later commit removes it. lean.live.json is the rendered, secret-bearing
24
+ # config `aq render-lean-config` produces (execution/lean_config_render.py);
25
+ # lean.json itself is git-tracked with empty placeholders but is excluded too,
26
+ # so a locally-populated copy can never leak. Keep this list in sync with
27
+ # .gitignore's "Local secrets" block.
28
+ .env
29
+ .env.*
30
+ !.env.compose.example
31
+ !.env.live.example
32
+ ib_config.py
33
+ *_config.local.py
34
+ config.local.json
35
+ lean.local.json
36
+ lean.live.json
37
+ lean.json
38
+ *.key
39
+ *.pem
40
+
41
+ # cpp_inference_ext/'s compiled build artifacts - mirrors .gitignore's own
42
+ # exclusion list. Docker now builds this extension fresh for the
43
+ # container's own Python 3.11 (see Dockerfile) - a locally-pre-built
44
+ # stray .pyd/.so from a developer's own (ABI-incompatible) host Python
45
+ # must never leak into the build context and get baked into the image,
46
+ # which is published to a public ghcr registry.
47
+ cpp_inference_ext/build/
48
+ cpp_inference_ext/*.egg-info/
49
+ cpp_inference_ext/*.pyd
50
+ cpp_inference_ext/*.so
51
+ cpp_inference_ext/install_log*.txt
@@ -0,0 +1,12 @@
1
+ # Copy this file to .env (untracked, .gitignore'd) and fill in real values.
2
+ # docker-compose.yml reads .env automatically for ${VAR} substitutions.
3
+
4
+ # PostgreSQL (defaults already work for local dev — override for anything else)
5
+ POSTGRES_DB=aether_quant
6
+ POSTGRES_USER=aether
7
+ POSTGRES_PASSWORD=aether_dev_password
8
+
9
+ # Telegram alerts (V2-19) — required for notifications.telegram_worker to
10
+ # actually send messages; leave blank to run the worker as a safe no-op.
11
+ AETHER_TELEGRAM_BOT_TOKEN=
12
+ AETHER_TELEGRAM_CHAT_ID=
@@ -0,0 +1,33 @@
1
+ # Copy this file to .env.live (untracked, .gitignore'd) and fill in real
2
+ # values before switching phase_v2.runtime.mode to "live" (V2-22). Never
3
+ # commit .env.live.
4
+ #
5
+ # Two consumers read these AETHER_* vars:
6
+ # 1. execution/live_credentials_io.py - a pre-flight credential-presence check.
7
+ # 2. scripts/render_lean_credentials.py (`aq render-lean-config`) - renders a
8
+ # gitignored lean.live.json with these values overlaid onto the empty,
9
+ # tracked lean.json template, which live/paper deployment then uses via
10
+ # `--lean-config lean.live.json`. Lean does NOT expand env vars out of
11
+ # lean.json itself, which is why this render step exists (the tracked
12
+ # lean.json stays all-empty so it is safe to share; see
13
+ # development/infrastructure.md's "Live Deployment Betreiben (V2-22)"
14
+ # runbook and execution/lean_config_render.py).
15
+
16
+ # --- Interactive Brokers live credentials ---
17
+ AETHER_IB_ACCOUNT=
18
+ AETHER_IB_USER_NAME=
19
+ AETHER_IB_PASSWORD=
20
+ AETHER_IB_TRADING_MODE=paper
21
+
22
+ # --- Live market-data provider keys (only the one you actually use) ---
23
+ # Populate whichever feed lean.json's live-paper/live environment is configured
24
+ # for; leave the rest blank. These render into lean.json's matching fields.
25
+ AETHER_POLYGON_API_KEY=
26
+ AETHER_IEX_CLOUD_API_KEY=
27
+
28
+ # --- Database password for live deployments ---
29
+ # The default 'aether_dev_password' is fine for local dev but is published in
30
+ # the repo. Live mode refuses to start while the Postgres DSN still uses that
31
+ # default (execution/live_credentials.py::postgres_dsn_is_live_safe). Set a real
32
+ # one here (and in .env / .env.compose) before going live.
33
+ POSTGRES_PASSWORD=
@@ -0,0 +1,2 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
@@ -0,0 +1,14 @@
1
+ # .githooks
2
+
3
+ Optional git hooks, opt-in per clone (never auto-installed on a fresh
4
+ checkout):
5
+
6
+ ```powershell
7
+ git config core.hooksPath .githooks
8
+ ```
9
+
10
+ Currently one hook: `pre-commit`, which invokes `aq secrets-check`
11
+ (`execution/secret_scan.py`) and blocks the commit if a populated secret
12
+ field is about to land in the tracked `lean.json` or a real `.env` file is
13
+ tracked by git. This is what actually stops a secret from being committed —
14
+ see [`SECURITY.md`](../SECURITY.md) for the reporting policy.
@@ -0,0 +1,29 @@
1
+ #!/bin/sh
2
+ # Aether Quant pre-commit secret guard (Phase V2-22 security).
3
+ #
4
+ # Blocks a commit that would publish a secret: a populated secret field in the
5
+ # tracked lean.json, or a tracked real `.env` file. All detection lives in
6
+ # `aq secrets-check` (execution/secret_scan.py) - this hook just invokes it.
7
+ #
8
+ # Enable once per clone (opt-in, so it never surprises a fresh checkout):
9
+ # git config core.hooksPath .githooks
10
+ #
11
+ # Runs under git's POSIX sh (git-bash on Windows), so keep it portable.
12
+
13
+ set -e
14
+
15
+ repo_root=$(git rev-parse --show-toplevel)
16
+ cd "$repo_root"
17
+
18
+ # Prefer the installed `aq` console script; fall back to running the module
19
+ # directly with whichever Python is on PATH (venv-activated shells get theirs).
20
+ if command -v aq >/dev/null 2>&1; then
21
+ aq secrets-check
22
+ elif command -v python >/dev/null 2>&1; then
23
+ python aq_cli.py secrets-check
24
+ elif command -v python3 >/dev/null 2>&1; then
25
+ python3 aq_cli.py secrets-check
26
+ else
27
+ echo "pre-commit: could not find 'aq' or 'python' to run secrets-check" >&2
28
+ exit 1
29
+ fi
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something is broken, wrong, or behaves differently than documented.
4
+ title: "[bug] "
5
+ labels: ["bug"]
6
+ ---
7
+
8
+ ## What happened
9
+
10
+ <!-- One or two sentences. Lead with the observable failure. -->
11
+
12
+ ## Where
13
+
14
+ <!-- File(s)/module(s)/CLI command(s) involved, e.g. `aq evaluate --rank-book`, portfolio/book_construction.py -->
15
+
16
+ ## Expected vs actual
17
+
18
+ - **Expected:**
19
+ - **Actual:**
20
+
21
+ ## Reproduction
22
+
23
+ <!--
24
+ Minimal steps from a clean clone. Include the exact command(s) and any
25
+ config.json keys involved (`aq config get <dotted.key>` output helps).
26
+ -->
27
+
28
+ ```text
29
+ <commands / steps>
30
+ ```
31
+
32
+ ## Evidence
33
+
34
+ <!-- Test output, log excerpt, or backtest artifact reference. Paste the
35
+ smallest relevant slice; link large files instead of pasting them. -->
36
+
37
+ ```text
38
+ <output>
39
+ ```
40
+
41
+ ## Environment
42
+
43
+ - OS:
44
+ - Python version:
45
+ - Commit / tag:
46
+
47
+ ## Checklist
48
+
49
+ - [ ] I ran `aq test` and can name the failing/passing state
50
+ - [ ] I checked `development/Problems.md` for a known entry covering this
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Question / usage help
4
+ url: https://github.com/leon1706-lol/Aether-quant/discussions
5
+ about: Ask here before opening an issue — most setup questions are answered in README.md, development/infrastructure.md, or CONTRIBUTING.md.
6
+ - name: Security vulnerability
7
+ url: https://github.com/leon1706-lol/Aether-quant/security/advisories/new
8
+ about: Report privately via GitHub Security Advisories — do NOT open a public issue (see SECURITY.md).
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: Feature request
3
+ about: A new subsystem, module, CLI capability, or behavioral improvement.
4
+ title: "[feature] "
5
+ labels: ["enhancement"]
6
+ ---
7
+
8
+ ## Problem to solve
9
+
10
+ <!-- What can't you do today? Describe the user-facing need, not the implementation. -->
11
+
12
+ ## Proposed behavior
13
+
14
+ <!-- What should exist after this ships? Include the intended CLI/config surface if any:
15
+ new `aq` command/flag? new `phase_v2.*` config block (remember: flags ship `false`
16
+ until verified)? new output artifact? -->
17
+
18
+ ## Scope guardrails
19
+
20
+ <!-- This repo's conventions shape every feature. Confirm how yours fits: -->
21
+
22
+ - [ ] Ships backward-compatible: additive `None`-default parameters / default-off config keys; an unmodified `config.json` reproduces today's behavior exactly.
23
+ - [ ] Testable without Lean: pure logic lives in a package module, not `main.py`; tests planned/attached.
24
+ - [ ] Docs plan: README/sub-readmes + `development/Changelog.md` entry (and `development/architecture.md` when it changes system structure).
25
+
26
+ ## Alternatives considered
27
+
28
+ <!-- What did you rule out and why? -->
29
+
30
+ ## Extra context
31
+
32
+ <!-- Related Problems.md entries (#N), prior Changelog rounds, or backtest evidence. -->
@@ -0,0 +1,37 @@
1
+ <!-- Title style: `V<version> <short what-and-why>` for release-bound PRs,
2
+ matching the repo's commit history; otherwise a plain descriptive title. -->
3
+
4
+ ## What & why
5
+
6
+ <!-- One paragraph: what changed and the problem/round it belongs to.
7
+ Reference development/Problems.md entries (#N) where applicable. -->
8
+
9
+ ## Changes
10
+
11
+ -
12
+ -
13
+
14
+ ## Behavior contract
15
+
16
+ <!-- This repo's hard rule: prove what changed and for whom. -->
17
+
18
+ - [ ] Default behavior is byte-identical when new flags/params are absent (`None`-default / default-off convention), **or** the behavior change is intentional and listed below:
19
+ - <!-- intentional changes here -->
20
+ - New config keys: <!-- `phase_v2.*` keys + defaults, or "none" -->
21
+
22
+ ## Verification
23
+
24
+ <!-- How was this confirmed? The suite must be green before review. -->
25
+
26
+ - [ ] `aq test` green (N passed): <!-- paste count -->
27
+ - New tests: <!-- files + what they pin down -->
28
+ - Manual checks: <!-- CLI dry-runs, real-data spot checks -->
29
+ - Real Lean backtest: <!-- not run in PRs by convention; note if one is required before merge -->
30
+
31
+ ## Docs updated
32
+
33
+ - [ ] README / sub-package README
34
+ - [ ] `development/Changelog.md` (append-only entry)
35
+ - [ ] `development/Problems.md` (if a bug was found/fixed)
36
+ - [ ] `development/architecture.md` / `development/infrastructure.md` (if structure/services changed)
37
+ - [ ] Obsidian vault regenerated (`generate_code_graph.py` → `regenerate_vault.py --append-handoff`)
@@ -0,0 +1,158 @@
1
+ name: CI
2
+
3
+ # V5.3.9 - deep CI suite: windows+ubuntu pytest matrix with a calibrated
4
+ # coverage fail-under gate (82% measured - 2), ruff lint, the full webui
5
+ # vitest suite, an offline CLI smoke battery, and workflow self-validation.
6
+ on:
7
+ push:
8
+ branches: [main]
9
+ pull_request:
10
+
11
+ # V5.4.2 - cancel superseded runs on rapid-fire pushes (ported from Aether-Vault)
12
+ concurrency:
13
+ group: ci-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ python-tests:
18
+ runs-on: ${{ matrix.os }}
19
+ timeout-minutes: 30
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ os: [ubuntu-latest, windows-latest]
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: "3.11"
30
+ cache: "pip"
31
+
32
+ - name: Syntax-check main.py (no Lean runtime available in CI - see development/Problems.md #69)
33
+ run: python -m py_compile main.py
34
+
35
+ - name: Install dependencies
36
+ run: |
37
+ pip install -r requirements/requirements.txt -r requirements/requirements-dev.txt
38
+ pip install pytest-cov
39
+
40
+ - name: Run full test suite with coverage gate
41
+ run: >
42
+ pytest -m "not lean_backtest" -ra
43
+ --cov --cov-report=term-missing --cov-report=xml
44
+ --cov-fail-under=80
45
+
46
+ - name: Upload coverage artifact
47
+ if: matrix.os == 'ubuntu-latest'
48
+ uses: actions/upload-artifact@v4
49
+ with:
50
+ name: coverage-xml
51
+ path: coverage.xml
52
+
53
+ python-lint:
54
+ runs-on: ubuntu-latest
55
+ steps:
56
+ - uses: actions/checkout@v4
57
+
58
+ - uses: actions/setup-python@v5
59
+ with:
60
+ python-version: "3.11"
61
+
62
+ # V5.3.11 FIX: bare `ruff check .` — NOT `aq test --ruff` (which
63
+ # requires importing aq_cli → pandas via the full package chain, but
64
+ # this job intentionally has a minimal environment). Local devs use
65
+ # `aq test --ruff`; CI uses bare ruff for speed.
66
+ # V5.4.7: ruff is PINNED - the previous unbounded range let new ruff
67
+ # releases add rules and break CI independently of any repo change.
68
+ - name: Install ruff
69
+ run: pip install "ruff==0.16.4"
70
+
71
+ - name: Ruff check (E/F ruleset calibrated in pyproject.toml)
72
+ run: ruff check .
73
+
74
+ - name: Syntax-check main.py
75
+ run: python -m py_compile main.py
76
+
77
+ dependency-audit:
78
+ runs-on: ubuntu-latest
79
+ timeout-minutes: 15
80
+ steps:
81
+ - uses: actions/checkout@v4
82
+
83
+ - uses: actions/setup-python@v5
84
+ with:
85
+ python-version: "3.11"
86
+
87
+ - name: Install pip-audit
88
+ run: pip install pip-audit
89
+
90
+ - name: Audit runtime dependencies for known CVEs
91
+ run: |
92
+ pip install -r requirements/requirements.txt
93
+ pip-audit --requirement requirements/requirements.txt --desc
94
+
95
+ - name: Audit dev dependencies for known CVEs
96
+ run: |
97
+ pip-audit --requirement requirements/requirements-dev.txt --desc
98
+
99
+ webui-tests:
100
+ runs-on: ubuntu-latest
101
+ timeout-minutes: 20
102
+ defaults:
103
+ run:
104
+ working-directory: webui
105
+ steps:
106
+ - uses: actions/checkout@v4
107
+
108
+ - uses: actions/setup-node@v4
109
+ with:
110
+ node-version: "20"
111
+ cache: "npm"
112
+ cache-dependency-path: webui/package-lock.json
113
+
114
+ - run: npm ci
115
+ - run: npx tsc -b
116
+ - run: npx oxlint
117
+ # V5.3.9 - the full frontend suite finally runs in CI too.
118
+ - run: npx vitest run --pool=threads
119
+ - run: npm run build
120
+
121
+ cli-smoke:
122
+ runs-on: ubuntu-latest
123
+ timeout-minutes: 15
124
+ steps:
125
+ - uses: actions/checkout@v4
126
+
127
+ - uses: actions/setup-python@v5
128
+ with:
129
+ python-version: "3.11"
130
+
131
+ - name: Install package editable
132
+ run: |
133
+ pip install -r requirements/requirements.txt
134
+ pip install -e .
135
+
136
+ - name: CLI smoke battery (offline, deterministic)
137
+ run: |
138
+ aq --help > /dev/null
139
+ aq evaluate --help > /dev/null
140
+ aq config get phase1.universe.name
141
+ aq secrets-check
142
+
143
+ workflows-lint:
144
+ runs-on: ubuntu-latest
145
+ timeout-minutes: 10
146
+ steps:
147
+ - uses: actions/checkout@v4
148
+
149
+ # V5.3.10 - single-step pinned install + validate: the previous two-step
150
+ # pattern (PATH append, then bare `actionlint`) failed with
151
+ # "command not found" on the runner. Pinned to v1.7.7 for
152
+ # reproducibility (meta-tested in tests/test_ci_workflows.py).
153
+ - name: Validate workflow files (actionlint v1.7.7)
154
+ run: |
155
+ curl -sSL -o actionlint.tar.gz \
156
+ https://github.com/rhysd/actionlint/releases/download/v1.7.7/actionlint_1.7.7_linux_amd64.tar.gz
157
+ tar -xzf actionlint.tar.gz actionlint
158
+ ./actionlint -no-color -verbose
@@ -0,0 +1,130 @@
1
+ name: Release
2
+
3
+ # Releasing is a manual, deliberate act: tag a commit on main and push the
4
+ # tag. Nothing else triggers this workflow - matches this project's existing
5
+ # bias toward no uncontrolled automatic actions (see e.g. retraining's
6
+ # manual promote/rollback).
7
+ on:
8
+ push:
9
+ tags: ["v*.*.*"]
10
+
11
+ jobs:
12
+ # V5.3.9 - NON-BLOCKING visibility job: runs the full offline suite on the
13
+ # tagged commit so release-time gaps are visible right next to the
14
+ # artifacts. Deliberately NOT wired into `needs:` of the publish jobs
15
+ # (user decision): releases proceed regardless; read this job's result to
16
+ # see where the gaps are.
17
+ tag-tests:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.11"
25
+ cache: "pip"
26
+
27
+ - name: Install dependencies
28
+ run: |
29
+ pip install -r requirements/requirements.txt -r requirements/requirements-dev.txt
30
+
31
+ - name: Run full offline suite (visibility only - does not gate the release)
32
+ run: pytest -m "not lean_backtest" -ra
33
+
34
+ publish-pypi:
35
+ runs-on: ubuntu-latest
36
+ environment: pypi # must match the Environment name configured in PyPI's Trusted Publisher setup
37
+ permissions:
38
+ # Required for PyPI Trusted Publishing (OIDC) - no PyPI token is ever
39
+ # stored as a secret. Requires a one-time Trusted Publisher setup on
40
+ # the PyPI project page (repo + this workflow filename).
41
+ id-token: write
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+ with:
45
+ fetch-depth: 0 # full history/tags - required for setuptools-scm
46
+
47
+ - uses: actions/setup-python@v5
48
+ with:
49
+ python-version: "3.11"
50
+
51
+ - name: Build sdist and wheel
52
+ run: |
53
+ pip install build
54
+ python -m build
55
+
56
+ - name: Publish to PyPI
57
+ uses: pypa/gh-action-pypi-publish@release/v1
58
+
59
+ publish-docker:
60
+ runs-on: ubuntu-latest
61
+ permissions:
62
+ contents: read
63
+ packages: write
64
+ env:
65
+ # Hardcoded lowercase, not derived from ${{ github.repository }}:
66
+ # the repo is leon1706-lol/Aether-quant (capital A), but Docker image
67
+ # references must be all-lowercase - using github.repository directly
68
+ # would fail with "invalid reference format".
69
+ IMAGE_NAME: ghcr.io/leon1706-lol/aether-quant
70
+ steps:
71
+ - uses: actions/checkout@v4
72
+
73
+ - uses: docker/setup-buildx-action@v3
74
+
75
+ - uses: docker/login-action@v3
76
+ with:
77
+ registry: ghcr.io
78
+ username: ${{ github.actor }}
79
+ password: ${{ secrets.GITHUB_TOKEN }}
80
+
81
+ - id: meta
82
+ uses: docker/metadata-action@v5
83
+ with:
84
+ images: ${{ env.IMAGE_NAME }}
85
+ tags: |
86
+ type=semver,pattern={{version}}
87
+ type=raw,value=latest
88
+
89
+ - uses: docker/build-push-action@v6
90
+ with:
91
+ context: .
92
+ push: true
93
+ tags: ${{ steps.meta.outputs.tags }}
94
+ labels: ${{ steps.meta.outputs.labels }}
95
+ # GitHub Actions cache backend - without this, every release
96
+ # build started cold (no layer reuse across releases) even
97
+ # though the Dockerfile itself is already correctly ordered
98
+ # (deps installed before source COPY, see development/Problems.md).
99
+ # mode=max caches every intermediate layer, not just the final
100
+ # image, so the npm ci/pip install layers survive between runs.
101
+ cache-from: type=gha
102
+ cache-to: type=gha,mode=max
103
+
104
+ # Creates the GitHub Release itself, once per tag. Notes are auto-generated
105
+ # (commit list since the previous tag); the body additionally points at the
106
+ # matching development/Changelog.md entry, which is this repo's canonical
107
+ # per-version record (see CONTRIBUTING.md's versioning section).
108
+ github-release:
109
+ runs-on: ubuntu-latest
110
+ permissions:
111
+ contents: write
112
+ steps:
113
+ - uses: actions/checkout@v4
114
+
115
+ - name: Create GitHub Release with changelog link
116
+ env:
117
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
118
+ run: |
119
+ TAG="${GITHUB_REF_NAME}"
120
+ VERSION="${TAG#v}"
121
+ BODY=$(cat <<EOF
122
+ See [development/Changelog.md](https://github.com/${GITHUB_REPOSITORY}/blob/main/development/Changelog.md) for the full entry for \`V${VERSION}\` and every prior release. This repo keeps its changelog as an append-only historical record; each tagged version corresponds to a \`## V<version>\` section there.
123
+
124
+ ---
125
+ EOF
126
+ )
127
+ gh release create "$TAG" \
128
+ --title "Aether Quant ${TAG}" \
129
+ --notes "$BODY" \
130
+ --generate-notes