aether-quant 0.9.0__tar.gz → 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aether_quant-1.0.0/.devcontainer/devcontainer.json +14 -0
- aether_quant-1.0.0/.devcontainer/dind-v1-test/devcontainer.json +14 -0
- aether_quant-1.0.0/.dockerignore +39 -0
- aether_quant-1.0.0/.env.live.example +33 -0
- aether_quant-1.0.0/.githooks/pre-commit +29 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/.github/workflows/ci.yml +5 -2
- aether_quant-1.0.0/.gitignore +153 -0
- aether_quant-1.0.0/Dockerfile +29 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/PKG-INFO +1 -1
- aether_quant-1.0.0/README.md +844 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/PKG-INFO +1 -1
- {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/SOURCES.txt +40 -53
- {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/scm_file_list.json +268 -281
- aether_quant-1.0.0/aether_quant.egg-info/scm_version.json +8 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/analyzer/market_analyzer.py +36 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/aq_cli.py +336 -12
- aether_quant-1.0.0/audit/README.md +44 -0
- aether_quant-1.0.0/audit/__init__.py +38 -0
- aether_quant-1.0.0/audit/hash_chain.py +52 -0
- aether_quant-1.0.0/audit/postgres_audit.py +61 -0
- aether_quant-1.0.0/audit/postgres_worker.py +336 -0
- aether_quant-1.0.0/audit/redis_queue.py +123 -0
- aether_quant-1.0.0/audit/status_export.py +59 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/config.json +756 -28
- aether_quant-1.0.0/cpp_inference_ext/README.md +60 -0
- aether_quant-1.0.0/cpp_inference_ext/pyproject.toml +3 -0
- aether_quant-1.0.0/cpp_inference_ext/setup.py +31 -0
- aether_quant-1.0.0/cpp_inference_ext/src/linear_batched.cpp +62 -0
- aether_quant-1.0.0/data/reference/futures_contract_specs.json +45 -0
- aether_quant-1.0.0/data/reference/sector_mapping.json +32 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/README.md +2 -1
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/yfinance_backfill.py +12 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/development/Changelog.md +1100 -0
- aether_quant-1.0.0/development/Problems.md +3289 -0
- aether_quant-1.0.0/development/asset_universe.md +143 -0
- aether_quant-1.0.0/development/backtest_equity_chart.png +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/development/infrastructure.md +151 -11
- aether_quant-1.0.0/development/project_structure.md +56 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/development/v2_architecture.md +90 -8
- {aether_quant-0.9.0 → aether_quant-1.0.0}/docker-compose.yml +76 -32
- aether_quant-1.0.0/execution/README.md +339 -0
- aether_quant-1.0.0/execution/__init__.py +63 -0
- aether_quant-1.0.0/execution/lean_config_render.py +131 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/live_credentials.py +17 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/live_credentials_io.py +16 -6
- aether_quant-1.0.0/execution/order_gate.py +266 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness.py +20 -2
- aether_quant-1.0.0/execution/secret_scan.py +73 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/postgres_worker.py +3 -1
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/simulated_portfolio.py +27 -2
- {aether_quant-0.9.0 → aether_quant-1.0.0}/features/bond_features.py +10 -1
- {aether_quant-0.9.0 → aether_quant-1.0.0}/inference/README.md +51 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/inference/__init__.py +13 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/inference/exported_model.py +233 -14
- aether_quant-1.0.0/inference/parallel_inference.py +138 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/lean.json +1 -1
- {aether_quant-0.9.0 → aether_quant-1.0.0}/liquidity/README.md +9 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/main.py +1318 -139
- {aether_quant-0.9.0 → aether_quant-1.0.0}/moe/gating.py +16 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/api_server.py +10 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/assets_status.py +14 -2
- {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/README.md +5 -5
- {aether_quant-0.9.0 → aether_quant-1.0.0}/portfolio/README.md +39 -20
- {aether_quant-0.9.0 → aether_quant-1.0.0}/portfolio/__init__.py +8 -1
- aether_quant-1.0.0/portfolio/book_construction.py +257 -0
- aether_quant-1.0.0/portfolio/options_strategy.py +349 -0
- aether_quant-1.0.0/requirements/README.md +63 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/requirements/requirements-dev.txt +10 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/requirements/requirements.txt +1 -0
- aether_quant-1.0.0/requirements.txt +15 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/__init__.py +2 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/orchestrator.py +71 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/postgres_registry.py +18 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/validation_gate.py +30 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/worker.py +9 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/README.md +65 -2
- {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/asset_class_router.py +114 -5
- aether_quant-1.0.0/scripts/README.md +42 -0
- aether_quant-1.0.0/scripts/profile_inference.py +327 -0
- aether_quant-1.0.0/scripts/profile_subsystems.py +500 -0
- aether_quant-1.0.0/scripts/render_lean_credentials.py +47 -0
- aether_quant-1.0.0/tests/test_api_server.py +39 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_aq_cli.py +481 -6
- aether_quant-1.0.0/tests/test_asset_class_router.py +235 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_assets_status.py +21 -1
- aether_quant-1.0.0/tests/test_audit_postgres_worker.py +196 -0
- aether_quant-1.0.0/tests/test_audit_queue.py +85 -0
- aether_quant-1.0.0/tests/test_audit_status_export.py +66 -0
- aether_quant-1.0.0/tests/test_dockerignore_secrets.py +104 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_expert_models.py +33 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_exported_model.py +251 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_gating_network.py +67 -1
- aether_quant-1.0.0/tests/test_hash_chain.py +85 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_lean_backtest_ml_coverage.py +108 -25
- aether_quant-1.0.0/tests/test_lean_config_render.py +109 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_live_credentials.py +26 -1
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_live_credentials_io.py +15 -1
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_analyzer.py +81 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_topology.py +145 -0
- aether_quant-1.0.0/tests/test_options_strategy.py +418 -0
- aether_quant-1.0.0/tests/test_order_gate.py +375 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness.py +33 -0
- aether_quant-1.0.0/tests/test_parallel_inference.py +256 -0
- aether_quant-1.0.0/tests/test_portfolio_book_construction.py +429 -0
- aether_quant-1.0.0/tests/test_postgres_audit.py +83 -0
- aether_quant-1.0.0/tests/test_profile_inference.py +134 -0
- aether_quant-1.0.0/tests/test_profile_subsystems.py +109 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_orchestrator.py +82 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_postgres_registry.py +27 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_worker.py +17 -0
- aether_quant-1.0.0/tests/test_secret_scan.py +63 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_simulated_portfolio.py +64 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_multitask.py +207 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_ranking_validation.py +211 -0
- aether_quant-1.0.0/tests/test_train_select_model_context_columns.py +33 -0
- aether_quant-1.0.0/tests/test_train_threshold_and_early_stop.py +94 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_validation_gate.py +39 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_yfinance_backfill.py +79 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/README.md +34 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/market_topology.py +74 -27
- {aether_quant-0.9.0 → aether_quant-1.0.0}/train.py +364 -21
- {aether_quant-0.9.0 → aether_quant-1.0.0}/train_gating.py +11 -4
- {aether_quant-0.9.0 → aether_quant-1.0.0}/train_multitask.py +115 -12
- {aether_quant-0.9.0 → aether_quant-1.0.0}/train_sequence.py +107 -12
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/README.md +2 -2
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/api/client.ts +5 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/api/hooks.ts +9 -0
- aether_quant-1.0.0/webui/src/components/monitoring/AuditLogPanel.tsx +49 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/Overview.tsx +4 -1
- aether_quant-1.0.0/webui/src/types/audit.ts +20 -0
- aether_quant-0.9.0/.dockerignore +0 -16
- aether_quant-0.9.0/.env.live.example +0 -15
- aether_quant-0.9.0/.gitignore +0 -102
- aether_quant-0.9.0/Dockerfile +0 -18
- aether_quant-0.9.0/Dockerfile.retraining_worker +0 -23
- aether_quant-0.9.0/Dockerfile.workers +0 -8
- aether_quant-0.9.0/README.md +0 -1036
- aether_quant-0.9.0/aether_quant.egg-info/scm_version.json +0 -8
- aether_quant-0.9.0/development/Problems.md +0 -1189
- aether_quant-0.9.0/development/backtest_equity_chart.png +0 -0
- aether_quant-0.9.0/execution/README.md +0 -109
- aether_quant-0.9.0/execution/__init__.py +0 -28
- aether_quant-0.9.0/execution/order_gate.py +0 -75
- aether_quant-0.9.0/ml/gating_feature_schema.json +0 -30
- aether_quant-0.9.0/ml/gating_model.json +0 -570
- aether_quant-0.9.0/ml/gating_training_metrics.json +0 -130
- aether_quant-0.9.0/ml/multitask_feature_schema.json +0 -89
- aether_quant-0.9.0/ml/multitask_model.json +0 -8548
- aether_quant-0.9.0/ml/multitask_training_metrics.json +0 -6316
- aether_quant-0.9.0/ml/sequence_feature_schema.json +0 -90
- aether_quant-0.9.0/ml/sequence_model.json +0 -19470
- aether_quant-0.9.0/ml/sequence_training_metrics.json +0 -6278
- aether_quant-0.9.0/ml/versions/gating-only-05c572c8-9566-4152-805c-fa57142a3f8c/gating_feature_schema.json +0 -30
- aether_quant-0.9.0/ml/versions/gating-only-05c572c8-9566-4152-805c-fa57142a3f8c/gating_model.json +0 -570
- aether_quant-0.9.0/ml/versions/gating-only-05c572c8-9566-4152-805c-fa57142a3f8c/gating_training_metrics.json +0 -130
- aether_quant-0.9.0/ml/versions/gating-only-0cb50d98-39c9-4cde-bcdd-c174bf126426/gating_feature_schema.json +0 -30
- aether_quant-0.9.0/ml/versions/gating-only-0cb50d98-39c9-4cde-bcdd-c174bf126426/gating_model.json +0 -570
- aether_quant-0.9.0/ml/versions/gating-only-0cb50d98-39c9-4cde-bcdd-c174bf126426/gating_training_metrics.json +0 -130
- aether_quant-0.9.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_feature_schema.json +0 -30
- aether_quant-0.9.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_model.json +0 -570
- aether_quant-0.9.0/ml/versions/gating-only-26218402-34d9-4a0a-add8-ee5d50dd0459/gating_training_metrics.json +0 -190
- aether_quant-0.9.0/ml/versions/multitask-only-8c59799d-c7f1-40be-9c76-8f5eefdac6d9/multitask_feature_schema.json +0 -89
- aether_quant-0.9.0/ml/versions/multitask-only-8c59799d-c7f1-40be-9c76-8f5eefdac6d9/multitask_model.json +0 -8548
- aether_quant-0.9.0/ml/versions/multitask-only-8c59799d-c7f1-40be-9c76-8f5eefdac6d9/multitask_training_metrics.json +0 -6316
- aether_quant-0.9.0/ml/versions/multitask-only-f5708084-512b-4484-a47b-0720f9c1460c/multitask_feature_schema.json +0 -76
- aether_quant-0.9.0/ml/versions/multitask-only-f5708084-512b-4484-a47b-0720f9c1460c/multitask_model.json +0 -7703
- aether_quant-0.9.0/ml/versions/multitask-only-f5708084-512b-4484-a47b-0720f9c1460c/multitask_training_metrics.json +0 -6320
- aether_quant-0.9.0/ml/versions/sequence-only-d649549b-9527-4e55-b61e-cd1e26cf8ca6/sequence_feature_schema.json +0 -90
- aether_quant-0.9.0/ml/versions/sequence-only-d649549b-9527-4e55-b61e-cd1e26cf8ca6/sequence_model.json +0 -19470
- aether_quant-0.9.0/ml/versions/sequence-only-d649549b-9527-4e55-b61e-cd1e26cf8ca6/sequence_training_metrics.json +0 -6278
- aether_quant-0.9.0/ml/versions/stage123-1783709428/gating_feature_schema.json +0 -30
- aether_quant-0.9.0/ml/versions/stage123-1783709428/gating_model.json +0 -570
- aether_quant-0.9.0/ml/versions/stage123-1783709428/gating_training_metrics.json +0 -190
- aether_quant-0.9.0/ml/versions/stage123-1783709428/multitask_feature_schema.json +0 -52
- aether_quant-0.9.0/ml/versions/stage123-1783709428/multitask_model.json +0 -5888
- aether_quant-0.9.0/ml/versions/stage123-1783709428/multitask_training_metrics.json +0 -248
- aether_quant-0.9.0/ml/versions/stage4-1783711025/gating_feature_schema.json +0 -30
- aether_quant-0.9.0/ml/versions/stage4-1783711025/gating_model.json +0 -570
- aether_quant-0.9.0/ml/versions/stage4-1783711025/gating_training_metrics.json +0 -190
- aether_quant-0.9.0/ml/versions/stage4-1783711025/multitask_feature_schema.json +0 -52
- aether_quant-0.9.0/ml/versions/stage4-1783711025/multitask_model.json +0 -5888
- aether_quant-0.9.0/ml/versions/stage4-1783711025/multitask_training_metrics.json +0 -248
- aether_quant-0.9.0/ml/versions/stage5-1783715333/sequence_feature_schema.json +0 -53
- aether_quant-0.9.0/ml/versions/stage5-1783715333/sequence_model.json +0 -13258
- aether_quant-0.9.0/ml/versions/stage5-1783715333/sequence_training_metrics.json +0 -209
- aether_quant-0.9.0/ml/versions/v1/multitask_feature_schema.json +0 -52
- aether_quant-0.9.0/ml/versions/v1/multitask_model.json +0 -5888
- aether_quant-0.9.0/ml/versions/v1/multitask_training_metrics.json +0 -284
- aether_quant-0.9.0/ml/versions/v1/sequence_feature_schema.json +0 -53
- aether_quant-0.9.0/ml/versions/v1/sequence_model.json +0 -13258
- aether_quant-0.9.0/ml/versions/v1/sequence_training_metrics.json +0 -248
- aether_quant-0.9.0/portfolio/book_construction.py +0 -137
- aether_quant-0.9.0/portfolio/options_strategy.py +0 -157
- aether_quant-0.9.0/requirements/README.md +0 -24
- aether_quant-0.9.0/requirements/requirements-retraining-worker.txt +0 -15
- aether_quant-0.9.0/requirements/requirements-runtime.txt +0 -3
- aether_quant-0.9.0/requirements/requirements-workers.txt +0 -14
- aether_quant-0.9.0/scripts/README.md +0 -32
- aether_quant-0.9.0/scripts/profile_inference.py +0 -165
- aether_quant-0.9.0/tests/test_asset_class_router.py +0 -117
- aether_quant-0.9.0/tests/test_options_strategy.py +0 -201
- aether_quant-0.9.0/tests/test_order_gate.py +0 -124
- aether_quant-0.9.0/tests/test_portfolio_book_construction.py +0 -175
- {aether_quant-0.9.0 → aether_quant-1.0.0}/.env.compose.example +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/.gitattributes +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/.github/workflows/release.yml +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/LICENSE +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/dependency_links.txt +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/entry_points.txt +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/aether_quant.egg-info/top_level.txt +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/analyzer/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/analyzer/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/backtests/.gitkeep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/estimize/consensus/aapl/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/estimize/estimate/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/estimize/release/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/sec/aapl/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/calendar/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/earnings/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data/alternative/trading-economics/indicator/.keep +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/fetch.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/fred_backfill.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/ib_backfill.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/data_pipeline/v2_manifest.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/development/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/development/logo.png +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/config_cache.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness_io.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness_report.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/paper_readiness_scheduler.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/execution/runtime_config_io.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/observation_metrics.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experience/redis_queue.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experts/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experts/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/experts/expert_datasets.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/features/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/features/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/features/derivatives_macro_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/features/macro_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/features/options_greeks.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/features/technical_indicators.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/generate_backtest_report.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/liquidity/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/liquidity/market_liquidity.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/ml/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/moe/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/moe/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/monitoring/neural_network_state.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/postgres_telegram.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/telegram_alerts.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/telegram_client.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/notifications/telegram_worker.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/postgres_triggers.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/rank_ic_monitor.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/trigger_worker.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/performance/triggers.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/pyproject.toml +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/regime/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/regime/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/regime/market_regime.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/artifacts.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/backtest_gate.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/lean_backtest.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/planning.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/status_export.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/vault_client.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/retraining/vault_commands.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/futures_risk.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/manual_override.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/risk/position_sizing.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/risk_controls.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/setup.cfg +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_backtest_gate.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_bond_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_config_cache.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_derivatives_macro_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_experience_queue.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_expert_datasets.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_fetch.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_fred_backfill.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_futures_risk.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_generate_backtest_report.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_ib_backfill.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_lean_backtest.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_learned_topology.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_macro_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_manual_override.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_liquidity.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_market_regime.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_neural_network_state.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_observation_metrics.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_options_greeks.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness_io.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness_report.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_paper_readiness_scheduler.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_position_sizing.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_postgres_telegram.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_postgres_triggers.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_postgres_worker.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_rank_ic_monitor.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_artifacts.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_retraining_planning.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_risk_controls.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_runtime_config_io.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_status_export.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_technical_indicators.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_telegram_alerts.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_telegram_client.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_telegram_worker.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_asset_class_context_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_bond_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_cross_sectional_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_derivatives_macro_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_gating.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_indicators.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_macro_features.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_multitask_architecture.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_pipeline.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_sequence.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_sequence_architecture.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_topology.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_train_walk_forward_windows.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_trigger_worker.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_triggers.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_v2_pipeline_manifest.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_vault_client.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/tests/test_vault_commands.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/__init__.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/topology/learned_topology.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/train_topology.py +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/visualization/README.md +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/.gitignore +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/.oxlintrc.json +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/index.html +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/overview_v2_12.png +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/package-lock.json +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/package.json +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/public/favicon.svg +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/public/icons.svg +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/risk_v2_12.png +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/App.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/heatmap/AssetHeatmap.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/layout/AppShell.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/layout/Panel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/AssetsStatusPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/CountTable.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/MonitoringFeeds.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/ObservationPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/PaperReadinessPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/RawStateViewer.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/monitoring/RetrainingStatusPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/AssetSizingTable.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/DerivativesMacroPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/LiquidityTable.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/RiskBar.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/RiskCore.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/risk/StrategyRiskCards.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/scene3d/Scene3D.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/scorecards/Scorecards.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/signals/Badge.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/signals/PositionsList.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/signals/SignalBoard.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/topology/ClusterList.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/topology/TopologyLearningPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/topology/TopologyScene3D.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/AssetPerformancePanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/BacktestEquityPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/DivergingBarChart.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/LineChart.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/MetricsSnapshotPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/components/tracing/ObservationEquityPanel.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/index.css +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/lib/downsample.ts +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/lib/format.ts +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/main.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/NeuralNetworkPage.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/RiskPage.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/TopologyPage.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/pages/TracingPage.tsx +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/types/state.ts +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/src/types/tracing.ts +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/tsconfig.app.json +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/tsconfig.json +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/tsconfig.node.json +0 -0
- {aether_quant-0.9.0 → aether_quant-1.0.0}/webui/vite.config.ts +0 -0
|
@@ -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,39 @@
|
|
|
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
|
|
@@ -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,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
|
|
@@ -20,8 +20,11 @@ jobs:
|
|
|
20
20
|
|
|
21
21
|
- name: Run tests
|
|
22
22
|
run: pytest
|
|
23
|
-
# tests/test_lean_backtest_ml_coverage.py self-skips:
|
|
24
|
-
#
|
|
23
|
+
# tests/test_lean_backtest_ml_coverage.py self-skips: this runner
|
|
24
|
+
# does have the `lean` binary (installed via requirements-dev.txt),
|
|
25
|
+
# but not a usable local Lean Data folder (data/** is gitignored -
|
|
26
|
+
# see .gitignore) that a real `lean backtest .` needs just to boot,
|
|
27
|
+
# regardless of universe/config. See development/Problems.md#10.
|
|
25
28
|
|
|
26
29
|
webui:
|
|
27
30
|
runs-on: ubuntu-latest
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Python cache and virtual environments
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
.pytest_cache/
|
|
6
|
+
.mypy_cache/
|
|
7
|
+
.ruff_cache/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
env/
|
|
11
|
+
*.egg-info/
|
|
12
|
+
/dist/
|
|
13
|
+
/build/
|
|
14
|
+
|
|
15
|
+
# Local secrets and broker/API credentials
|
|
16
|
+
.env
|
|
17
|
+
.env.*
|
|
18
|
+
!.env.compose.example
|
|
19
|
+
!.env.live.example
|
|
20
|
+
ib_config.py
|
|
21
|
+
*_config.local.py
|
|
22
|
+
config.local.json
|
|
23
|
+
lean.local.json
|
|
24
|
+
# Rendered, secret-bearing Lean config produced by
|
|
25
|
+
# scripts/render_lean_credentials.py / `aq render-lean-config` from .env.live.
|
|
26
|
+
# The tracked lean.json stays all-empty; this is the copy with real keys filled.
|
|
27
|
+
lean.live.json
|
|
28
|
+
|
|
29
|
+
*.key
|
|
30
|
+
*.pem
|
|
31
|
+
|
|
32
|
+
# OS/editor noise
|
|
33
|
+
.DS_Store
|
|
34
|
+
Thumbs.db
|
|
35
|
+
.idea/
|
|
36
|
+
.vscode/
|
|
37
|
+
.claude/
|
|
38
|
+
docker-compose.override.yml
|
|
39
|
+
postgres-data/
|
|
40
|
+
redis-data/
|
|
41
|
+
grafana-data/
|
|
42
|
+
pgdata/
|
|
43
|
+
|
|
44
|
+
# Lean market data: too large for a public GitHub repo
|
|
45
|
+
data/**
|
|
46
|
+
!data/**/
|
|
47
|
+
!data/**/.keep
|
|
48
|
+
!data/**/.gitkeep
|
|
49
|
+
|
|
50
|
+
# Exception: small, hand-authored reference/config JSON files that this
|
|
51
|
+
# codebase documents as "checked in" and reads at runtime/test time (not
|
|
52
|
+
# bulk market data) - see tests/test_futures_risk.py, tests/test_ib_backfill.py,
|
|
53
|
+
# tests/test_train_cross_sectional_features.py, and development/Problems.md#10.
|
|
54
|
+
# The blanket data/** rule above silently excluded these from every fresh
|
|
55
|
+
# clone (including CI), which is why the tests reading them failed there.
|
|
56
|
+
!data/reference/*.json
|
|
57
|
+
|
|
58
|
+
# Lean object store / local runtime output
|
|
59
|
+
storage/
|
|
60
|
+
objectstore/
|
|
61
|
+
|
|
62
|
+
# Backtest results and generated reports
|
|
63
|
+
backtests/**
|
|
64
|
+
!backtests/
|
|
65
|
+
!backtests/.gitkeep
|
|
66
|
+
|
|
67
|
+
# Generated ML datasets and binary artifacts
|
|
68
|
+
ml/datasets/
|
|
69
|
+
ml/expert_datasets/
|
|
70
|
+
ml/expert_models/
|
|
71
|
+
ml/versions/
|
|
72
|
+
# Manual pre-rank-pivot snapshot (rollback point for the Stage 1-5
|
|
73
|
+
# rank-pivot roadmap work, development/Problems.md#43) - a local backup,
|
|
74
|
+
# never meant to be committed.
|
|
75
|
+
ml/_backup_pre_rank_pivot/
|
|
76
|
+
ml/model.pt
|
|
77
|
+
ml/scaler.pkl
|
|
78
|
+
ml/*.pkl
|
|
79
|
+
ml/*.pt
|
|
80
|
+
ml/*.pth
|
|
81
|
+
ml/*.onnx
|
|
82
|
+
|
|
83
|
+
# Generated ML/runtime JSON artifacts
|
|
84
|
+
ml/dataset_inventory.json
|
|
85
|
+
ml/dataset_manifest.json
|
|
86
|
+
ml/expert_dataset_manifest.json
|
|
87
|
+
ml/feature_schema.json
|
|
88
|
+
ml/model_weights.json
|
|
89
|
+
ml/scaler_stats.json
|
|
90
|
+
ml/training_metrics.json
|
|
91
|
+
ml/expert_training_metrics.json
|
|
92
|
+
# Multitask/sequence/gating model artifacts - these were previously tracked
|
|
93
|
+
# (an inconsistency with every other generated model artifact above, which
|
|
94
|
+
# was already gitignored), so a real trained model's weights could end up
|
|
95
|
+
# committed to the public repo. Untracked via `git rm --cached` alongside
|
|
96
|
+
# this rule so it's actually impossible, not just something to remember.
|
|
97
|
+
ml/multitask_model.json
|
|
98
|
+
ml/multitask_feature_schema.json
|
|
99
|
+
ml/multitask_training_metrics.json
|
|
100
|
+
ml/sequence_model.json
|
|
101
|
+
ml/sequence_feature_schema.json
|
|
102
|
+
ml/sequence_training_metrics.json
|
|
103
|
+
ml/gating_model.json
|
|
104
|
+
ml/gating_feature_schema.json
|
|
105
|
+
ml/gating_training_metrics.json
|
|
106
|
+
|
|
107
|
+
# Generated visualization/runtime feeds
|
|
108
|
+
visualization/state.json
|
|
109
|
+
visualization/scene.json
|
|
110
|
+
visualization/topology_state.json
|
|
111
|
+
visualization/grafana/
|
|
112
|
+
|
|
113
|
+
# Logs and temporary files
|
|
114
|
+
.coverage
|
|
115
|
+
coverage.xml
|
|
116
|
+
htmlcov/
|
|
117
|
+
*.log
|
|
118
|
+
*.tmp
|
|
119
|
+
*.bak
|
|
120
|
+
# Obsidian vault for project graphs and AI handoffs
|
|
121
|
+
Aether-quant-Obsidian-Vault/
|
|
122
|
+
|
|
123
|
+
# Webui (React/Vite) build artifacts and dependencies
|
|
124
|
+
webui/node_modules/
|
|
125
|
+
webui/dist/
|
|
126
|
+
|
|
127
|
+
# Matplotlib font cache, redirected here by main.py so it persists across
|
|
128
|
+
# Lean CLI's ephemeral per-backtest Docker containers instead of rebuilding
|
|
129
|
+
# every run (see Problems.md)
|
|
130
|
+
.matplotlib_cache/
|
|
131
|
+
|
|
132
|
+
# scripts/profile_inference.py's pstats dump - regenerable output, not source
|
|
133
|
+
scripts/profile_inference_output*.txt
|
|
134
|
+
scripts/profile_subsystems_output*.txt
|
|
135
|
+
|
|
136
|
+
# cpp_inference_ext/'s compiled build artifacts - regenerable via
|
|
137
|
+
# `pip install -e cpp_inference_ext/`, never source. The .pyd itself is
|
|
138
|
+
# also gitignored (never a hard dependency - the whole point is that
|
|
139
|
+
# most checkouts run without it, falling back to NumPy).
|
|
140
|
+
cpp_inference_ext/build/
|
|
141
|
+
cpp_inference_ext/*.egg-info/
|
|
142
|
+
cpp_inference_ext/*.pyd
|
|
143
|
+
cpp_inference_ext/*.so
|
|
144
|
+
cpp_inference_ext/install_log*.txt
|
|
145
|
+
|
|
146
|
+
# Aether-Vault (`av` CLI) local repo bootstrap - machine-local tool state
|
|
147
|
+
# (retraining/vault_client.py's commit target), not project source.
|
|
148
|
+
.av/
|
|
149
|
+
|
|
150
|
+
# scripts/profile_subsystems.py's main.py::_build_model_input() profiling
|
|
151
|
+
# side-channel log (development/Problems.md #36) - regenerable diagnostic
|
|
152
|
+
# output, not source.
|
|
153
|
+
model_input_timing.log
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Stage 1: build webui
|
|
2
|
+
FROM node:20-alpine AS webui-builder
|
|
3
|
+
WORKDIR /app/webui
|
|
4
|
+
COPY webui/package*.json ./
|
|
5
|
+
RUN npm ci
|
|
6
|
+
COPY webui/ .
|
|
7
|
+
RUN npm run build
|
|
8
|
+
|
|
9
|
+
# Stage 2: consolidated engine image - serves the FastAPI app AND every
|
|
10
|
+
# worker (experience/performance-trigger/telegram/paper-readiness/
|
|
11
|
+
# retraining). One image, one COPY of the whole source tree (respecting
|
|
12
|
+
# .dockerignore's exclusions - .venv/, node_modules/, data/, ml/,
|
|
13
|
+
# backtests/, etc., which arrive at runtime via compose volume mounts
|
|
14
|
+
# instead) rather than a hand-maintained per-worker COPY allow-list.
|
|
15
|
+
# This is the direct fix for development/Problems.md #1/#2/#20/#30 - four
|
|
16
|
+
# separate incidents where a per-worker Dockerfile's COPY list drifted out
|
|
17
|
+
# of sync with that worker's actual import graph and crash-looped on
|
|
18
|
+
# ModuleNotFoundError. With one image copying everything, that whole bug
|
|
19
|
+
# class is structurally impossible now. Each service's actual entrypoint
|
|
20
|
+
# is selected via docker-compose.yml's per-service `command:` override
|
|
21
|
+
# (CMD below is just the default/app entrypoint).
|
|
22
|
+
FROM python:3.11-slim
|
|
23
|
+
WORKDIR /app
|
|
24
|
+
COPY requirements/requirements.txt ./requirements/
|
|
25
|
+
RUN pip install --no-cache-dir -r requirements/requirements.txt
|
|
26
|
+
COPY . .
|
|
27
|
+
COPY --from=webui-builder /app/webui/dist ./webui/dist
|
|
28
|
+
EXPOSE 8000
|
|
29
|
+
CMD ["uvicorn", "monitoring.api_server:app", "--host", "0.0.0.0", "--port", "8000"]
|