aether-quant 0.2.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aether_quant-0.3.0/.env.live.example +15 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/.gitignore +1 -0
- aether_quant-0.3.0/Dockerfile.workers +8 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/PKG-INFO +1 -1
- aether_quant-0.3.0/README.md +536 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/aether_quant.egg-info/PKG-INFO +1 -1
- {aether_quant-0.2.0 → aether_quant-0.3.0}/aether_quant.egg-info/SOURCES.txt +25 -6
- {aether_quant-0.2.0 → aether_quant-0.3.0}/aether_quant.egg-info/scm_file_list.json +25 -6
- aether_quant-0.3.0/aether_quant.egg-info/scm_version.json +8 -0
- aether_quant-0.3.0/aether_quant.egg-info/top_level.txt +4 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/aq_cli.py +100 -2
- aether_quant-0.3.0/development/Changelog.md +697 -0
- aether_quant-0.3.0/development/Problems.md +469 -0
- aether_quant-0.3.0/development/backtest_equity_chart.png +0 -0
- aether_quant-0.3.0/development/infrastructure.md +489 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/development/v2_architecture.md +259 -23
- {aether_quant-0.2.0 → aether_quant-0.3.0}/docker-compose.yml +35 -3
- aether_quant-0.3.0/execution/README.md +58 -0
- aether_quant-0.3.0/execution/__init__.py +28 -0
- aether_quant-0.3.0/execution/config_cache.py +48 -0
- aether_quant-0.3.0/execution/live_credentials.py +21 -0
- aether_quant-0.3.0/execution/live_credentials_io.py +42 -0
- aether_quant-0.3.0/execution/paper_readiness.py +163 -0
- aether_quant-0.3.0/execution/paper_readiness_io.py +54 -0
- aether_quant-0.3.0/execution/paper_readiness_report.py +99 -0
- aether_quant-0.3.0/execution/runtime_config_io.py +38 -0
- aether_quant-0.3.0/generate_backtest_report.py +270 -0
- aether_quant-0.3.0/inference/README.md +35 -0
- aether_quant-0.3.0/inference/__init__.py +3 -0
- aether_quant-0.3.0/inference/exported_model.py +68 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/main.py +86 -64
- {aether_quant-0.2.0 → aether_quant-0.3.0}/monitoring/api_server.py +9 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/notifications/README.md +5 -4
- {aether_quant-0.2.0 → aether_quant-0.3.0}/performance/README.md +8 -3
- {aether_quant-0.2.0 → aether_quant-0.3.0}/performance/triggers.py +52 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/pyproject.toml +12 -5
- {aether_quant-0.2.0 → aether_quant-0.3.0}/requirements/README.md +3 -5
- {aether_quant-0.2.0 → aether_quant-0.3.0}/requirements/requirements-dev.txt +4 -0
- aether_quant-0.3.0/requirements/requirements-workers.txt +14 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/README.md +9 -4
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/worker.py +20 -2
- {aether_quant-0.2.0 → aether_quant-0.3.0}/risk/manual_override.py +9 -1
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/README.md +3 -1
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_aq_cli.py +158 -3
- aether_quant-0.3.0/tests/test_config_cache.py +87 -0
- aether_quant-0.3.0/tests/test_exported_model.py +106 -0
- aether_quant-0.3.0/tests/test_generate_backtest_report.py +194 -0
- aether_quant-0.3.0/tests/test_live_credentials.py +38 -0
- aether_quant-0.3.0/tests/test_live_credentials_io.py +53 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_manual_override.py +20 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_market_topology.py +133 -0
- aether_quant-0.3.0/tests/test_paper_readiness.py +233 -0
- aether_quant-0.3.0/tests/test_paper_readiness_io.py +83 -0
- aether_quant-0.3.0/tests/test_paper_readiness_report.py +88 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_retraining_worker.py +57 -0
- aether_quant-0.3.0/tests/test_runtime_config_io.py +54 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_simulated_portfolio.py +17 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_triggers.py +24 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/topology/README.md +46 -11
- {aether_quant-0.2.0 → aether_quant-0.3.0}/topology/market_topology.py +71 -33
- aether_quant-0.3.0/webui/src/components/monitoring/PaperReadinessPanel.tsx +58 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/pages/Overview.tsx +2 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/types/state.ts +16 -0
- aether_quant-0.2.0/Dockerfile.telegram_worker +0 -9
- aether_quant-0.2.0/Dockerfile.trigger_worker +0 -8
- aether_quant-0.2.0/Dockerfile.worker +0 -7
- aether_quant-0.2.0/README.md +0 -409
- aether_quant-0.2.0/aether_quant.egg-info/scm_version.json +0 -8
- aether_quant-0.2.0/aether_quant.egg-info/top_level.txt +0 -2
- aether_quant-0.2.0/development/Changelog.md +0 -482
- aether_quant-0.2.0/development/Problems.md +0 -214
- aether_quant-0.2.0/development/infrastructure.md +0 -366
- aether_quant-0.2.0/execution/README.md +0 -9
- aether_quant-0.2.0/execution/__init__.py +0 -13
- aether_quant-0.2.0/requirements/requirements-telegram-worker.txt +0 -8
- aether_quant-0.2.0/requirements/requirements-trigger-worker.txt +0 -3
- aether_quant-0.2.0/requirements/requirements-worker.txt +0 -4
- {aether_quant-0.2.0 → aether_quant-0.3.0}/.dockerignore +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/.env.compose.example +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/.gitattributes +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/.github/workflows/ci.yml +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/.github/workflows/release.yml +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/Dockerfile +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/Dockerfile.retraining_worker +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/aether_quant.egg-info/dependency_links.txt +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/aether_quant.egg-info/entry_points.txt +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/analyzer/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/analyzer/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/analyzer/market_analyzer.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/backtests/.gitkeep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/estimize/consensus/aapl/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/estimize/estimate/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/estimize/release/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/sec/aapl/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/trading-economics/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/trading-economics/calendar/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/trading-economics/earnings/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data/alternative/trading-economics/indicator/.keep +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data_pipeline/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data_pipeline/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data_pipeline/v2_manifest.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/data_pipeline/yfinance_backfill.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/development/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/execution/order_gate.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experience/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experience/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experience/observation_metrics.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experience/postgres_worker.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experience/redis_queue.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experience/simulated_portfolio.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experts/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experts/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/experts/expert_datasets.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/liquidity/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/liquidity/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/liquidity/market_liquidity.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/ml/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/moe/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/moe/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/moe/gating.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/monitoring/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/monitoring/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/monitoring/neural_network_state.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/notifications/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/notifications/postgres_telegram.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/notifications/telegram_alerts.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/notifications/telegram_client.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/notifications/telegram_worker.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/performance/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/performance/postgres_triggers.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/performance/trigger_worker.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/regime/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/regime/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/regime/market_regime.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/requirements/requirements-retraining-worker.txt +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/requirements/requirements-runtime.txt +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/requirements/requirements.txt +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/artifacts.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/backtest_gate.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/lean_backtest.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/orchestrator.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/planning.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/postgres_registry.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/status_export.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/validation_gate.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/vault_client.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/retraining/vault_commands.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/risk/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/risk/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/risk/position_sizing.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/risk_controls.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/setup.cfg +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_backtest_gate.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_experience_queue.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_expert_datasets.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_expert_models.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_gating_network.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_lean_backtest.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_lean_backtest_ml_coverage.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_learned_topology.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_market_analyzer.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_market_liquidity.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_market_regime.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_neural_network_state.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_observation_metrics.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_order_gate.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_position_sizing.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_postgres_telegram.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_postgres_triggers.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_postgres_worker.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_retraining_artifacts.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_retraining_orchestrator.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_retraining_planning.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_retraining_postgres_registry.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_risk_controls.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_status_export.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_telegram_alerts.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_telegram_client.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_telegram_worker.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_train_pipeline.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_train_topology.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_trigger_worker.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_v2_pipeline_manifest.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_validation_gate.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_vault_client.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_vault_commands.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/tests/test_yfinance_backfill.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/topology/__init__.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/topology/learned_topology.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/train.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/train_topology.py +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/visualization/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/.gitignore +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/.oxlintrc.json +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/README.md +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/index.html +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/overview_v2_12.png +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/package-lock.json +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/package.json +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/public/favicon.svg +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/public/icons.svg +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/risk_v2_12.png +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/App.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/api/client.ts +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/api/hooks.ts +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/heatmap/AssetHeatmap.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/layout/AppShell.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/layout/Panel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/monitoring/CountTable.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/monitoring/MonitoringFeeds.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/monitoring/ObservationPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/monitoring/PerformanceTriggersPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/monitoring/RawStateViewer.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/monitoring/RetrainingStatusPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/neuralnet/NeuralNetworkScene3D.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/neuralnet/NeuralNetworkStatsPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/risk/AssetSizingTable.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/risk/LiquidityTable.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/risk/RiskBar.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/risk/RiskCore.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/risk/StrategyRiskCards.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/scene3d/Scene3D.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/scorecards/Scorecards.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/signals/Badge.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/signals/PositionsList.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/signals/SignalBoard.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/topology/ClusterList.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/topology/TopologyLearningPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/topology/TopologyScene3D.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/tracing/AssetPerformancePanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/tracing/BacktestEquityPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/tracing/DivergingBarChart.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/tracing/LineChart.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/tracing/MetricsSnapshotPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/components/tracing/ObservationEquityPanel.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/index.css +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/lib/downsample.ts +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/lib/format.ts +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/main.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/pages/NeuralNetworkPage.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/pages/RiskPage.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/pages/TopologyPage.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/pages/TracingPage.tsx +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/src/types/tracing.ts +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/tsconfig.app.json +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/tsconfig.json +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/tsconfig.node.json +0 -0
- {aether_quant-0.2.0 → aether_quant-0.3.0}/webui/vite.config.ts +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
# This is read by execution/live_credentials_io.py as a pre-flight
|
|
6
|
+
# credential-presence check only. It does NOT wire Lean itself - Lean's
|
|
7
|
+
# BrokerageSetupHandler reads ib-account/ib-user-name/ib-password/
|
|
8
|
+
# ib-trading-mode directly out of lean.json (also gitignored); populate
|
|
9
|
+
# those fields by hand as a separate step (see development/infrastructure.md's
|
|
10
|
+
# "Live Deployment Betreiben (V2-22)" runbook).
|
|
11
|
+
|
|
12
|
+
AETHER_IB_ACCOUNT=
|
|
13
|
+
AETHER_IB_USER_NAME=
|
|
14
|
+
AETHER_IB_PASSWORD=
|
|
15
|
+
AETHER_IB_TRADING_MODE=paper
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
FROM python:3.11-slim
|
|
2
|
+
WORKDIR /app
|
|
3
|
+
COPY requirements/requirements-workers.txt .
|
|
4
|
+
RUN pip install --no-cache-dir -r requirements-workers.txt
|
|
5
|
+
COPY execution/ ./execution/
|
|
6
|
+
COPY experience/ ./experience/
|
|
7
|
+
COPY performance/ ./performance/
|
|
8
|
+
COPY notifications/ ./notifications/
|
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="development/logo.png" width="220" alt="Aether Quant logo">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">Aether Quant</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>My state-of-the-art flagship trading model — a dynamic, self-adapting algorithmic trading system built on QuantConnect Lean and PyTorch, engineered to prove that dynamic models belong in dynamic markets.</strong>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<img src="https://img.shields.io/badge/python-3.10%2B-FF8C00?style=flat-square&labelColor=1A1A1A&logo=python&logoColor=white" alt="Python 3.10+">
|
|
13
|
+
<!-- AQ:TEST_BADGE_START --><img src="https://img.shields.io/badge/tests-528%2F528%20passing-brightgreen?style=flat-square&labelColor=1A1A1A" alt="528 of 528 tests passing"><!-- AQ:TEST_BADGE_END -->
|
|
14
|
+
<img src="https://img.shields.io/pypi/v/aether-quant?style=flat-square&labelColor=1A1A1A&color=FF8C00" alt="PyPI version">
|
|
15
|
+
<img src="https://img.shields.io/badge/docker-ghcr.io%2Faether--quant-2496ED?style=flat-square&labelColor=1A1A1A&logo=docker&logoColor=white" alt="Docker image on GHCR">
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
Aether Quant is not a single static strategy — it's a **dynamic system**: a
|
|
19
|
+
Mixture-of-Experts ensemble (bullish/bearish/sideways/volatility specialists)
|
|
20
|
+
routed by a learned gating network, a market-regime detector, a 3D market
|
|
21
|
+
topology layer that combines a deterministic correlation embedding with a
|
|
22
|
+
learned probabilistic overlay, a liquidity/market-impact engine that adjusts
|
|
23
|
+
position sizing to real trading conditions, and a controlled retraining loop
|
|
24
|
+
that lets the model itself evolve as markets do — all wired together and
|
|
25
|
+
validated end-to-end inside QuantConnect's Lean engine. The thesis this
|
|
26
|
+
project exists to test is simple to state and hard to prove: **markets are
|
|
27
|
+
non-stationary, so a trading model should be too.** Every subsystem here
|
|
28
|
+
exists to make the model adapt — to regime shifts, to changing correlation
|
|
29
|
+
structure, to liquidity conditions — rather than to fit one historical
|
|
30
|
+
window and hope it generalizes.
|
|
31
|
+
|
|
32
|
+
## Table of Contents
|
|
33
|
+
|
|
34
|
+
- [Download](#download)
|
|
35
|
+
- [Getting Started](#getting-started)
|
|
36
|
+
- [Requirements](#requirements)
|
|
37
|
+
- [Architecture](#architecture)
|
|
38
|
+
- [Project Structure](#project-structure)
|
|
39
|
+
- [Module Documentation](#module-documentation)
|
|
40
|
+
- [Development Documentation](#development-documentation)
|
|
41
|
+
- [Backtest Results](#backtest-results)
|
|
42
|
+
- [Test Suite](#test-suite)
|
|
43
|
+
- [CLI Reference](#cli-reference)
|
|
44
|
+
- [Release Process](#release-process)
|
|
45
|
+
- [Runbook](#runbook)
|
|
46
|
+
- [Roadmap](#roadmap)
|
|
47
|
+
- [Contributing](#contributing)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Download
|
|
52
|
+
|
|
53
|
+
If you just want to use Aether Quant rather than develop on it, no local
|
|
54
|
+
`pip install -e .` or source checkout is needed — the CLI and backend are
|
|
55
|
+
published as ready-to-use releases:
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
pip install aether-quant
|
|
59
|
+
docker pull ghcr.io/leon1706-lol/aether-quant:latest
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`aq --help` is then available immediately (see [CLI Reference](#cli-reference)
|
|
63
|
+
below). `aq` checks PyPI at most once every 24h (short timeout, never
|
|
64
|
+
blocking) for a newer version and prints a one-line notice if one's
|
|
65
|
+
available — disable with `AQ_SKIP_UPDATE_CHECK=1`.
|
|
66
|
+
|
|
67
|
+
The Docker image is the same one `docker-compose.yml`'s `aether-quant`
|
|
68
|
+
service pulls by default (override with the `AETHER_QUANT_IMAGE` env var,
|
|
69
|
+
e.g. to use a locally built image instead).
|
|
70
|
+
|
|
71
|
+
## Getting Started
|
|
72
|
+
|
|
73
|
+
For local development (this repo cloned, a virtual environment active):
|
|
74
|
+
|
|
75
|
+
1. Install dependencies:
|
|
76
|
+
|
|
77
|
+
```powershell
|
|
78
|
+
pip install -r requirements/requirements.txt
|
|
79
|
+
pip install -r requirements/requirements-dev.txt # local dev extras
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
2. Refresh the data inventory only:
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
python train.py --init-only
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
3. Build the dataset and train the model:
|
|
89
|
+
|
|
90
|
+
```powershell
|
|
91
|
+
python train.py
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Or build dataset artifacts only, without training:
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
python train.py --dataset-only
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
4. Start the webui locally (two processes):
|
|
101
|
+
|
|
102
|
+
```powershell
|
|
103
|
+
uvicorn monitoring.api_server:app --port 8001 --reload
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```powershell
|
|
107
|
+
cd webui
|
|
108
|
+
npm install
|
|
109
|
+
npm run dev
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Then open `http://localhost:3002`.
|
|
113
|
+
|
|
114
|
+
5. Run a real backtest and refresh this README's [Backtest Results](#backtest-results):
|
|
115
|
+
|
|
116
|
+
```powershell
|
|
117
|
+
pip install -e . # registers the `aq` command from source
|
|
118
|
+
aq backtest
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Requirements
|
|
122
|
+
|
|
123
|
+
- **Python ≥ 3.10** for the training pipeline, `main.py`'s Lean algorithm, the FastAPI monitoring server, and the `aq` CLI.
|
|
124
|
+
- **QuantConnect Lean CLI** (`pip install lean`) for running backtests and paper/live trading.
|
|
125
|
+
- **Docker & Docker Compose** for the local infrastructure (Redis, PostgreSQL, and the background workers — experience persistence, performance triggers, controlled retraining, Telegram alerts).
|
|
126
|
+
- **Node.js** (for the `webui/` React/Vite dashboard).
|
|
127
|
+
|
|
128
|
+
This repo splits its Python dependencies across several `requirements*.txt`
|
|
129
|
+
files (full training stack vs. minimal per-Docker-image installs vs. local
|
|
130
|
+
dev extras) rather than one monolithic file. See
|
|
131
|
+
**[`requirements/README.md`](requirements/README.md)** for the exact
|
|
132
|
+
`pip install` command for every variant and which Dockerfile consumes each one.
|
|
133
|
+
|
|
134
|
+
## Architecture
|
|
135
|
+
|
|
136
|
+
Aether Quant runs a daily-bar decision pipeline entirely inside Lean's
|
|
137
|
+
`on_data()` callback: features flow through regime detection and 3D topology
|
|
138
|
+
modeling, both feed a gating network that routes across four specialized
|
|
139
|
+
experts, the central market analyzer combines all of that with the liquidity
|
|
140
|
+
engine's sizing input into one categorical action per asset per bar, and
|
|
141
|
+
every decision is persisted through a Redis → PostgreSQL experience pipeline
|
|
142
|
+
that a controlled retraining loop reads from to evolve the model over time.
|
|
143
|
+
|
|
144
|
+
#### System Flow
|
|
145
|
+
|
|
146
|
+
```mermaid
|
|
147
|
+
flowchart LR
|
|
148
|
+
A["Lean data folder<br/>stocks, ETFs, crypto"] --> B["Feature pipeline<br/>train.py"]
|
|
149
|
+
B --> C["Regime detection<br/>trend, volatility, drawdown, correlation"]
|
|
150
|
+
B --> D["3D topology modeling<br/>market structure and clusters"]
|
|
151
|
+
C --> E["Gating network<br/>the manager"]
|
|
152
|
+
D --> E
|
|
153
|
+
E --> F["Expert modules"]
|
|
154
|
+
F --> G["Bullish expert"]
|
|
155
|
+
F --> H["Bearish expert"]
|
|
156
|
+
F --> I["Sideways expert"]
|
|
157
|
+
F --> J["Volatility expert"]
|
|
158
|
+
G --> K["Market analyzer<br/>central decision layer"]
|
|
159
|
+
H --> K
|
|
160
|
+
I --> K
|
|
161
|
+
J --> K
|
|
162
|
+
C --> K
|
|
163
|
+
D --> K
|
|
164
|
+
L["Liquidity engine<br/>DDV, participation rate,<br/>slippage estimate"] --> K
|
|
165
|
+
K --> M["Action categorization<br/>trade / simulate / observe<br/>reduce_risk / retrain_candidate"]
|
|
166
|
+
M --> N["Lean order execution<br/>InteractiveBrokersFeeModel"]
|
|
167
|
+
M --> O["Observation / simulation record"]
|
|
168
|
+
N --> P["Redis event stream<br/>temporary low-latency buffer"]
|
|
169
|
+
O --> P
|
|
170
|
+
P --> Q["Experience worker<br/>async batch persistence"]
|
|
171
|
+
Q --> R["PostgreSQL experience database<br/>single source of truth"]
|
|
172
|
+
R --> S["Performance triggers<br/>100 observations, drawdown, Sharpe, regime shift"]
|
|
173
|
+
S --> T["Controlled retraining<br/>versioned weights and rollback"]
|
|
174
|
+
T --> E
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
#### Tech Stack
|
|
178
|
+
|
|
179
|
+
```mermaid
|
|
180
|
+
flowchart TB
|
|
181
|
+
A["Infrastructure"] --> A1["Docker Compose<br/>(Redis, Postgres, aether-quant app)"]
|
|
182
|
+
A --> A2["Lean CLI<br/>(backtest + paper trading)"]
|
|
183
|
+
A --> A3["30-day observation phase before live mode"]
|
|
184
|
+
B["Development"] --> B1["VS Code + Claude Code"]
|
|
185
|
+
B --> B2["GitHub"]
|
|
186
|
+
C["Data and storage"] --> C1["Lean data folder for training/backtesting"]
|
|
187
|
+
C --> C2["Redis temporary event stream"]
|
|
188
|
+
C --> C3["PostgreSQL permanent experience database"]
|
|
189
|
+
D["AI and modeling"] --> D1["PyTorch"]
|
|
190
|
+
D --> D2["scikit-learn"]
|
|
191
|
+
D --> D3["NumPy / Pandas"]
|
|
192
|
+
D --> D4["MoE experts and gating network"]
|
|
193
|
+
E["Monitoring and UI"] --> E1["React/Vite webui — Tracing dashboard (port 3002 dev / 8001 Docker)"]
|
|
194
|
+
E --> E2["FastAPI JSON API (port 8000)"]
|
|
195
|
+
E --> E3["Telegram alerts (V2-19)<br/>notifications/telegram_worker.py"]
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
These two diagrams are the high-level summary. For the full system —
|
|
199
|
+
every per-phase "contract" (Observation Mode, Performance Triggers,
|
|
200
|
+
Controlled Retraining, 3D Topology, Liquidity Engine, Paper/Live Deployment,
|
|
201
|
+
and more), the module map, and an honest analysis of what would need to
|
|
202
|
+
change for this to become a genuinely low-latency/HFT system — see
|
|
203
|
+
**[`development/v2_architecture.md`](development/v2_architecture.md)**.
|
|
204
|
+
|
|
205
|
+
## Project Structure
|
|
206
|
+
|
|
207
|
+
```text
|
|
208
|
+
aether-quant/
|
|
209
|
+
├── .github/ # CI workflows (tests, webui build, release)
|
|
210
|
+
├── development/ # Architecture docs, changelog, problems log, backtest chart
|
|
211
|
+
├── data/ # Local Lean data folder (equities, crypto)
|
|
212
|
+
├── data_pipeline/ # Lean-data contract + Yahoo Finance historical backfill
|
|
213
|
+
├── analyzer/ # Central market analyzer (final per-asset decision layer)
|
|
214
|
+
├── moe/ # Mixture-of-Experts gating network
|
|
215
|
+
├── experts/ # Bullish / bearish / sideways / volatility expert models
|
|
216
|
+
├── regime/ # Market regime detection
|
|
217
|
+
├── topology/ # 3D market topology (deterministic SMACOF + learned overlay)
|
|
218
|
+
├── liquidity/ # Liquidity / market-impact engine
|
|
219
|
+
├── risk/ # Dynamic position sizing, leverage, drawdown controls
|
|
220
|
+
├── execution/ # Order gating, paper/live broker readiness, config caching
|
|
221
|
+
├── inference/ # Vectorized neural-network forward-pass interpreter
|
|
222
|
+
├── experience/ # Redis -> PostgreSQL observation/decision history pipeline
|
|
223
|
+
├── performance/ # Performance trigger system (drawdown, Sharpe, regime-shift, ...)
|
|
224
|
+
├── retraining/ # Controlled retraining: plan/train/validate/backtest/promote
|
|
225
|
+
├── monitoring/ # FastAPI JSON API serving runtime state to the webui
|
|
226
|
+
├── notifications/ # Telegram alerting worker
|
|
227
|
+
├── visualization/ # Shared runtime-state JSON/CSV exports
|
|
228
|
+
├── webui/ # React/Vite dashboard (Overview, Risk, Topology, Neural Network, Tracing)
|
|
229
|
+
├── ml/ # Model weights, datasets, versioned retraining candidates
|
|
230
|
+
├── storage/ # Reserved for future persistent artifact storage
|
|
231
|
+
├── requirements/ # All requirements*.txt variants
|
|
232
|
+
├── tests/ # Full pytest suite (507 tests)
|
|
233
|
+
├── backtests/ # Lean backtest run outputs (gitignored)
|
|
234
|
+
├── Aether-quant-Obsidian-Vault/ # Auto-generated code-graph / architecture vault
|
|
235
|
+
├── main.py # Lean algorithm: inference, signal engine, risk controls
|
|
236
|
+
├── train.py # Training pipeline: dataset build, model training, validation
|
|
237
|
+
├── train_topology.py # Offline trainer for the learned topology overlay
|
|
238
|
+
├── generate_backtest_report.py # Regenerates this README's Backtest Results section
|
|
239
|
+
├── aq_cli.py # `aq` convenience CLI
|
|
240
|
+
├── config.json # Runtime configuration (phase1 / phase_v2 blocks)
|
|
241
|
+
├── lean.json # Lean engine + brokerage configuration
|
|
242
|
+
├── docker-compose.yml # Local infrastructure (Lean, Redis, PostgreSQL, workers)
|
|
243
|
+
└── pyproject.toml # Package metadata, `aq` entry point, pytest config
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Module Documentation
|
|
247
|
+
|
|
248
|
+
Every package below has its own README with the full detail on what it owns
|
|
249
|
+
and how it's wired in — this table is the index.
|
|
250
|
+
|
|
251
|
+
| Module | What it owns | Docs |
|
|
252
|
+
|---|---|---|
|
|
253
|
+
| `analyzer/` | Central market analyzer — the final per-asset action categorization layer | [README](analyzer/README.md) |
|
|
254
|
+
| `data/` | Local Lean data-folder format documentation | [README](data/README.md) |
|
|
255
|
+
| `data_pipeline/` | Lean-data contract + Yahoo Finance historical backfill | [README](data_pipeline/README.md) |
|
|
256
|
+
| `execution/` | Order gating, paper/live broker readiness, config-read caching | [README](execution/README.md) |
|
|
257
|
+
| `experience/` | Observation/decision history — Redis buffer + PostgreSQL persistence | [README](experience/README.md) |
|
|
258
|
+
| `experts/` | Bullish, bearish, sideways, and volatility expert models | [README](experts/README.md) |
|
|
259
|
+
| `inference/` | Vectorized forward-pass interpreter for the exported neural networks | [README](inference/README.md) |
|
|
260
|
+
| `liquidity/` | Liquidity and market-impact engine | [README](liquidity/README.md) |
|
|
261
|
+
| `ml/` | Model & dataset artifacts, including versioned retraining candidates | [README](ml/README.md) |
|
|
262
|
+
| `moe/` | Mixture-of-Experts gating network | [README](moe/README.md) |
|
|
263
|
+
| `monitoring/` | FastAPI JSON API serving runtime state to the webui | [README](monitoring/README.md) |
|
|
264
|
+
| `notifications/` | Telegram alerting worker | [README](notifications/README.md) |
|
|
265
|
+
| `performance/` | Performance trigger system (14 trigger functions) | [README](performance/README.md) |
|
|
266
|
+
| `regime/` | Market regime detection | [README](regime/README.md) |
|
|
267
|
+
| `requirements/` | All `requirements*.txt` variants and what consumes each | [README](requirements/README.md) |
|
|
268
|
+
| `retraining/` | Controlled retraining — plan/train/validate/backtest/commit/promote/rollback | [README](retraining/README.md) |
|
|
269
|
+
| `risk/` | Dynamic position sizing, leverage caps, drawdown-aware sizing | [README](risk/README.md) |
|
|
270
|
+
| `storage/` | Reserved placeholder for future persistent artifact storage | [README](storage/README.md) |
|
|
271
|
+
| `tests/` | Pytest suite conventions (507 tests) | [README](tests/README.md) |
|
|
272
|
+
| `topology/` | 3D market topology — deterministic SMACOF embedding + learned overlay | [README](topology/README.md) |
|
|
273
|
+
| `visualization/` | Shared runtime-state JSON/CSV exports | [README](visualization/README.md) |
|
|
274
|
+
| `webui/` | React/Vite dashboard (Overview, Risk, Topology, Neural Network, Tracing) | [README](webui/README.md) |
|
|
275
|
+
| `Aether-quant-Obsidian-Vault/` | Auto-generated Obsidian vault mirroring the repo's architecture/code graph | [README](Aether-quant-Obsidian-Vault/README.md) |
|
|
276
|
+
|
|
277
|
+
## Development Documentation
|
|
278
|
+
|
|
279
|
+
| Document | Contents |
|
|
280
|
+
|---|---|
|
|
281
|
+
| [`development/README.md`](development/README.md) | Index of this folder |
|
|
282
|
+
| [`development/v2_architecture.md`](development/v2_architecture.md) | The full V2 system architecture: process-flow and tech-stack diagrams, the module map, per-phase "contract" sections, and the HFT-readiness analysis |
|
|
283
|
+
| [`development/infrastructure.md`](development/infrastructure.md) | Docker Compose runbook — start commands for every service, SQL inspection snippets, port reference |
|
|
284
|
+
| [`development/Changelog.md`](development/Changelog.md) | Detailed, append-only, per-phase build history — what was built, when, and why |
|
|
285
|
+
| [`development/Problems.md`](development/Problems.md) | Append-only audit log of bugs and infrastructure issues, each with a severity rating and fixed/open status |
|
|
286
|
+
|
|
287
|
+
## Backtest Results
|
|
288
|
+
|
|
289
|
+
<!-- AQ:BACKTEST_START -->
|
|
290
|
+

|
|
291
|
+
|
|
292
|
+
| Metric | Value |
|
|
293
|
+
|---|---|
|
|
294
|
+
| Backtest window | 2014-12-01 to 2016-07-06 |
|
|
295
|
+
| Last updated | 2026-07-05 15:37 UTC (auto-generated by `aq backtest`) |
|
|
296
|
+
<!-- AQ:BACKTEST_END -->
|
|
297
|
+
|
|
298
|
+
This section is regenerated automatically every time you run `aq backtest`
|
|
299
|
+
(see [`generate_backtest_report.py`](generate_backtest_report.py)) — it
|
|
300
|
+
always reflects your most recent successful Lean backtest, reading directly
|
|
301
|
+
from Lean's own result JSON (strategy equity curve, its native SPY benchmark
|
|
302
|
+
series, and the full statistics block), so it never goes stale as long as
|
|
303
|
+
you keep backtesting.
|
|
304
|
+
|
|
305
|
+
## Test Suite
|
|
306
|
+
|
|
307
|
+
507 tests, one file per source module, run via:
|
|
308
|
+
|
|
309
|
+
```powershell
|
|
310
|
+
aq test
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
which — like the backtest chart above — automatically keeps the badge at
|
|
314
|
+
the top of this README in sync with the real pass count every time you run
|
|
315
|
+
it. See [`tests/README.md`](tests/README.md) for the suite's conventions.
|
|
316
|
+
|
|
317
|
+
## CLI Reference
|
|
318
|
+
|
|
319
|
+
The easiest way to get the `aq` command is straight from PyPI (see
|
|
320
|
+
[Download](#download) above) — no source checkout needed:
|
|
321
|
+
|
|
322
|
+
```powershell
|
|
323
|
+
pip install aether-quant
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
For local development (this repo cloned, a virtual environment active),
|
|
327
|
+
`pip install -e .` registers the same `aq` command directly from source
|
|
328
|
+
instead, without waiting on a PyPI release:
|
|
329
|
+
|
|
330
|
+
```powershell
|
|
331
|
+
pip install -e .
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Either way, `aq --help` gives the full command list:
|
|
335
|
+
|
|
336
|
+
```text
|
|
337
|
+
aq train [--dataset-only|--init-only|--experts-only]
|
|
338
|
+
aq test
|
|
339
|
+
aq backtest
|
|
340
|
+
aq report <backtest-folder> <result-id>
|
|
341
|
+
aq api
|
|
342
|
+
aq webui
|
|
343
|
+
aq docker up [--lean|--all]
|
|
344
|
+
aq docker build
|
|
345
|
+
aq retrain <plan|train|validate|backtest|commit|promote|rollback|status> [...]
|
|
346
|
+
aq trade-lock --on|--off|--auto|--status
|
|
347
|
+
aq status
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
Every command except `aq trade-lock` is a thin `subprocess` wrapper around a
|
|
351
|
+
command already documented elsewhere in this README:
|
|
352
|
+
|
|
353
|
+
- **`aq train`** — runs `train.py`: builds the dataset and trains the baseline + expert models.
|
|
354
|
+
- **`aq test`** — runs the pytest suite and refreshes this README's test badge.
|
|
355
|
+
- **`aq backtest`** — runs `lean backtest .` and refreshes this README's [Backtest Results](#backtest-results) section.
|
|
356
|
+
- **`aq report <backtest-folder> <result-id>`** — generates Lean's own HTML backtest report (trade blotter, standard Lean charts) at `backtests/<backtest-folder>/report.html`.
|
|
357
|
+
- **`aq api`** — starts the FastAPI monitoring server on `:8001`.
|
|
358
|
+
- **`aq webui`** — starts the webui dev server (`npm run dev`).
|
|
359
|
+
- **`aq docker up [--lean|--all]`** — starts local infrastructure (default: Redis + PostgreSQL only).
|
|
360
|
+
- **`aq docker build`** — rebuilds the `aether-quant` app image.
|
|
361
|
+
- **`aq retrain <stage>`** — dispatches to `python -m retraining.orchestrator <stage> ...` for a single manual pipeline stage.
|
|
362
|
+
- **`aq trade-lock --on|--off|--auto|--status`** — manually overrides `main.py`'s sticky total-drawdown trade lock (see `development/v2_architecture.md`'s Manual Trade-Lock Override Contract). `--off` deliberately clears an otherwise-permanent lock; `--auto` returns to fully automatic behavior.
|
|
363
|
+
- **`aq status`** — shows `git status`.
|
|
364
|
+
|
|
365
|
+
## Release Process
|
|
366
|
+
|
|
367
|
+
A release is exactly one manual step — deliberately no automatic release on
|
|
368
|
+
every push to `main`, only on an explicitly pushed version tag
|
|
369
|
+
(`.github/workflows/release.yml`, triggered on `push: tags: ["v*.*.*"]`):
|
|
370
|
+
|
|
371
|
+
```powershell
|
|
372
|
+
git tag v0.1.0
|
|
373
|
+
git push origin v0.1.0
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
This then automatically runs (no manual version bump anywhere in the repo —
|
|
377
|
+
`pyproject.toml` reads the version straight from the tag via
|
|
378
|
+
`setuptools-scm`):
|
|
379
|
+
|
|
380
|
+
1. The test suite (`pytest`) — a failure blocks the release entirely.
|
|
381
|
+
2. PyPI publishing via Trusted Publishing (OIDC) — no PyPI token is stored as a GitHub secret.
|
|
382
|
+
3. Docker image build and push to `ghcr.io/leon1706-lol/aether-quant`, tagged with the version number and `:latest`.
|
|
383
|
+
|
|
384
|
+
**One-time manual setup, before the first tag is ever pushed** (can't be
|
|
385
|
+
done from here):
|
|
386
|
+
|
|
387
|
+
- Create a "Trusted Publisher" on pypi.org for this project (pointing at `leon1706-lol/Aether-quant` + the `release.yml` workflow file).
|
|
388
|
+
- After the very first tag push: check the **Packages** tab of this repo to see whether the new `aether-quant` package is private, and switch it to public if needed so `docker pull` works for everyone.
|
|
389
|
+
|
|
390
|
+
## Runbook
|
|
391
|
+
|
|
392
|
+
Everyday local commands.
|
|
393
|
+
|
|
394
|
+
Activate the virtual environment:
|
|
395
|
+
|
|
396
|
+
```powershell
|
|
397
|
+
.\.venv\Scripts\Activate.ps1
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Rebuild training artifacts:
|
|
401
|
+
|
|
402
|
+
```powershell
|
|
403
|
+
python train.py
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
Rebuild only the dataset/scaler/manifest:
|
|
407
|
+
|
|
408
|
+
```powershell
|
|
409
|
+
python train.py --dataset-only
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
Run the tests:
|
|
413
|
+
|
|
414
|
+
```powershell
|
|
415
|
+
pytest tests/
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
Recommended full workflow:
|
|
419
|
+
|
|
420
|
+
```powershell
|
|
421
|
+
python train.py
|
|
422
|
+
pytest tests/
|
|
423
|
+
aq backtest
|
|
424
|
+
aq report <backtest-folder> <result-id>
|
|
425
|
+
git status
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
Start a Lean backtest from the project folder:
|
|
429
|
+
|
|
430
|
+
```powershell
|
|
431
|
+
lean backtest .
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Find a finished backtest:
|
|
435
|
+
|
|
436
|
+
```powershell
|
|
437
|
+
Get-ChildItem .\backtests\<backtest-folder>\*-summary.json
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
Generate the official Lean HTML report:
|
|
441
|
+
|
|
442
|
+
```powershell
|
|
443
|
+
lean report --backtest-results .\backtests\<backtest-folder>\<result-id>.json --report-destination .\backtests\<backtest-folder>\report.html --overwrite
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
Start the webui locally (API server and frontend, two terminals):
|
|
447
|
+
|
|
448
|
+
```powershell
|
|
449
|
+
uvicorn monitoring.api_server:app --port 8001 --reload
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
```powershell
|
|
453
|
+
cd webui
|
|
454
|
+
npm run dev
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
Then:
|
|
458
|
+
|
|
459
|
+
```text
|
|
460
|
+
http://localhost:3002 (Overview)
|
|
461
|
+
http://localhost:3002/risk (Risk)
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
Check git status before a commit:
|
|
465
|
+
|
|
466
|
+
```powershell
|
|
467
|
+
git status
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## Roadmap
|
|
471
|
+
|
|
472
|
+
### V1 — ✅ Finished
|
|
473
|
+
|
|
474
|
+
The first universe was deliberately small and mixed:
|
|
475
|
+
|
|
476
|
+
- `AAPL`
|
|
477
|
+
- `SPY`
|
|
478
|
+
- `QQQ`
|
|
479
|
+
- `BTCUSD`
|
|
480
|
+
|
|
481
|
+
Shared V1 data coverage:
|
|
482
|
+
|
|
483
|
+
- Start: `2014-12-01`
|
|
484
|
+
- End: `2018-08-13`
|
|
485
|
+
- Resolution: `Daily`
|
|
486
|
+
|
|
487
|
+
First windows:
|
|
488
|
+
|
|
489
|
+
- Training: `2014-12-01` to `2017-06-30`
|
|
490
|
+
- Validation: `2017-07-01` to `2017-12-31`
|
|
491
|
+
- Backtest: `2018-01-01` to `2018-08-13`
|
|
492
|
+
|
|
493
|
+
First target definition:
|
|
494
|
+
|
|
495
|
+
- Target type: next day's direction
|
|
496
|
+
- Label: `1` if the next close-to-close return is positive, else `0`
|
|
497
|
+
|
|
498
|
+
First feature ideas:
|
|
499
|
+
|
|
500
|
+
- 1d, 5d, and 20d returns
|
|
501
|
+
- 5d and 20d volatility
|
|
502
|
+
- 5d and 20d momentum
|
|
503
|
+
- Daily range and open-close range
|
|
504
|
+
- Volume change
|
|
505
|
+
|
|
506
|
+
Detailed phase results (Phase 2 through Phase 10, Phase V2-1 through Phase
|
|
507
|
+
V2-15, Visualization Unification) live in
|
|
508
|
+
[`development/Changelog.md`](development/Changelog.md) to keep this README short.
|
|
509
|
+
|
|
510
|
+
### V3 — 🔜 Incoming Soon
|
|
511
|
+
|
|
512
|
+
`development/v2_architecture.md`'s own "Why This Is Not HFT, And What It
|
|
513
|
+
Would Take" analysis is the honest starting point for what V3 needs to
|
|
514
|
+
close — not marketing aspiration, but a concrete gap list the system's own
|
|
515
|
+
architecture docs already identify:
|
|
516
|
+
|
|
517
|
+
- **Tick/L1-L2 market data pipeline** — replacing the daily Lean zip files with a genuinely higher-frequency data source and storage layer.
|
|
518
|
+
- **A shorter-horizon model** — a new model operating at sub-second/tick granularity with a much shorter prediction horizon, not a retrained version of today's daily classifier.
|
|
519
|
+
- **Real slippage- and latency-aware execution** — an actual fill simulator and limit-order support, replacing today's `SetHoldings`/`Liquidate` market orders with no slippage model wired to fills.
|
|
520
|
+
- **A low-latency, event-driven runtime** — replacing the daily-bar `on_data()` callback and the 30s+ polling background workers with something closer to a real-time event loop.
|
|
521
|
+
- **Real broker/exchange connectivity beyond paper trading** — building on the credential/readiness groundwork V2-21/V2-22 already laid.
|
|
522
|
+
- **Continuous / online retraining** — moving beyond today's offline, cooldown-gated batch retraining pipeline.
|
|
523
|
+
- Further out: an expanded asset universe, multi-timeframe ensembles, and reinforcement-learning-based position sizing/execution.
|
|
524
|
+
|
|
525
|
+
## Contributing
|
|
526
|
+
|
|
527
|
+
1. Fork the repository
|
|
528
|
+
2. Create a feature branch: `git checkout -b feature/my-feature`
|
|
529
|
+
3. Commit your changes following the existing module structure (see [`development/Changelog.md`](development/Changelog.md) for this project's development history)
|
|
530
|
+
4. Open a Pull Request
|
|
531
|
+
|
|
532
|
+
---
|
|
533
|
+
|
|
534
|
+
<div align="center">
|
|
535
|
+
<sub>Built with Python · PyTorch · QuantConnect Lean · FastAPI · React · Redis · PostgreSQL · Docker</sub>
|
|
536
|
+
</div>
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
.dockerignore
|
|
2
2
|
.env.compose.example
|
|
3
|
+
.env.live.example
|
|
3
4
|
.gitattributes
|
|
4
5
|
.gitignore
|
|
5
6
|
Dockerfile
|
|
6
7
|
Dockerfile.retraining_worker
|
|
7
|
-
Dockerfile.
|
|
8
|
-
Dockerfile.trigger_worker
|
|
9
|
-
Dockerfile.worker
|
|
8
|
+
Dockerfile.workers
|
|
10
9
|
README.md
|
|
11
10
|
aq_cli.py
|
|
12
11
|
docker-compose.yml
|
|
12
|
+
generate_backtest_report.py
|
|
13
13
|
main.py
|
|
14
14
|
pyproject.toml
|
|
15
15
|
risk_controls.py
|
|
@@ -43,11 +43,19 @@ data_pipeline/yfinance_backfill.py
|
|
|
43
43
|
development/Changelog.md
|
|
44
44
|
development/Problems.md
|
|
45
45
|
development/README.md
|
|
46
|
+
development/backtest_equity_chart.png
|
|
46
47
|
development/infrastructure.md
|
|
47
48
|
development/v2_architecture.md
|
|
48
49
|
execution/README.md
|
|
49
50
|
execution/__init__.py
|
|
51
|
+
execution/config_cache.py
|
|
52
|
+
execution/live_credentials.py
|
|
53
|
+
execution/live_credentials_io.py
|
|
50
54
|
execution/order_gate.py
|
|
55
|
+
execution/paper_readiness.py
|
|
56
|
+
execution/paper_readiness_io.py
|
|
57
|
+
execution/paper_readiness_report.py
|
|
58
|
+
execution/runtime_config_io.py
|
|
51
59
|
experience/README.md
|
|
52
60
|
experience/__init__.py
|
|
53
61
|
experience/observation_metrics.py
|
|
@@ -57,6 +65,9 @@ experience/simulated_portfolio.py
|
|
|
57
65
|
experts/README.md
|
|
58
66
|
experts/__init__.py
|
|
59
67
|
experts/expert_datasets.py
|
|
68
|
+
inference/README.md
|
|
69
|
+
inference/__init__.py
|
|
70
|
+
inference/exported_model.py
|
|
60
71
|
liquidity/README.md
|
|
61
72
|
liquidity/__init__.py
|
|
62
73
|
liquidity/market_liquidity.py
|
|
@@ -86,9 +97,7 @@ requirements/README.md
|
|
|
86
97
|
requirements/requirements-dev.txt
|
|
87
98
|
requirements/requirements-retraining-worker.txt
|
|
88
99
|
requirements/requirements-runtime.txt
|
|
89
|
-
requirements/requirements-
|
|
90
|
-
requirements/requirements-trigger-worker.txt
|
|
91
|
-
requirements/requirements-worker.txt
|
|
100
|
+
requirements/requirements-workers.txt
|
|
92
101
|
requirements/requirements.txt
|
|
93
102
|
retraining/README.md
|
|
94
103
|
retraining/__init__.py
|
|
@@ -110,13 +119,18 @@ risk/position_sizing.py
|
|
|
110
119
|
tests/README.md
|
|
111
120
|
tests/test_aq_cli.py
|
|
112
121
|
tests/test_backtest_gate.py
|
|
122
|
+
tests/test_config_cache.py
|
|
113
123
|
tests/test_experience_queue.py
|
|
114
124
|
tests/test_expert_datasets.py
|
|
115
125
|
tests/test_expert_models.py
|
|
126
|
+
tests/test_exported_model.py
|
|
116
127
|
tests/test_gating_network.py
|
|
128
|
+
tests/test_generate_backtest_report.py
|
|
117
129
|
tests/test_lean_backtest.py
|
|
118
130
|
tests/test_lean_backtest_ml_coverage.py
|
|
119
131
|
tests/test_learned_topology.py
|
|
132
|
+
tests/test_live_credentials.py
|
|
133
|
+
tests/test_live_credentials_io.py
|
|
120
134
|
tests/test_manual_override.py
|
|
121
135
|
tests/test_market_analyzer.py
|
|
122
136
|
tests/test_market_liquidity.py
|
|
@@ -125,6 +139,9 @@ tests/test_market_topology.py
|
|
|
125
139
|
tests/test_neural_network_state.py
|
|
126
140
|
tests/test_observation_metrics.py
|
|
127
141
|
tests/test_order_gate.py
|
|
142
|
+
tests/test_paper_readiness.py
|
|
143
|
+
tests/test_paper_readiness_io.py
|
|
144
|
+
tests/test_paper_readiness_report.py
|
|
128
145
|
tests/test_position_sizing.py
|
|
129
146
|
tests/test_postgres_telegram.py
|
|
130
147
|
tests/test_postgres_triggers.py
|
|
@@ -135,6 +152,7 @@ tests/test_retraining_planning.py
|
|
|
135
152
|
tests/test_retraining_postgres_registry.py
|
|
136
153
|
tests/test_retraining_worker.py
|
|
137
154
|
tests/test_risk_controls.py
|
|
155
|
+
tests/test_runtime_config_io.py
|
|
138
156
|
tests/test_simulated_portfolio.py
|
|
139
157
|
tests/test_status_export.py
|
|
140
158
|
tests/test_telegram_alerts.py
|
|
@@ -179,6 +197,7 @@ webui/src/components/layout/Panel.tsx
|
|
|
179
197
|
webui/src/components/monitoring/CountTable.tsx
|
|
180
198
|
webui/src/components/monitoring/MonitoringFeeds.tsx
|
|
181
199
|
webui/src/components/monitoring/ObservationPanel.tsx
|
|
200
|
+
webui/src/components/monitoring/PaperReadinessPanel.tsx
|
|
182
201
|
webui/src/components/monitoring/PerformanceTriggersPanel.tsx
|
|
183
202
|
webui/src/components/monitoring/RawStateViewer.tsx
|
|
184
203
|
webui/src/components/monitoring/RetrainingStatusPanel.tsx
|