aetherion-ai 0.1.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.
- aetherion_ai-0.1.0/PKG-INFO +406 -0
- aetherion_ai-0.1.0/README.md +345 -0
- aetherion_ai-0.1.0/aetherion/__init__.py +13 -0
- aetherion_ai-0.1.0/aetherion/__main__.py +76 -0
- aetherion_ai-0.1.0/aetherion/aetherion_live.py +172 -0
- aetherion_ai-0.1.0/aetherion/analytics/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/analytics/calibration.py +153 -0
- aetherion_ai-0.1.0/aetherion/analytics/correlation.py +362 -0
- aetherion_ai-0.1.0/aetherion/analytics/evidence.py +82 -0
- aetherion_ai-0.1.0/aetherion/analytics/expectancy.py +226 -0
- aetherion_ai-0.1.0/aetherion/analytics/forecasting.py +116 -0
- aetherion_ai-0.1.0/aetherion/analytics/live_ta.py +140 -0
- aetherion_ai-0.1.0/aetherion/analytics/meta_label.py +213 -0
- aetherion_ai-0.1.0/aetherion/analytics/mtf.py +226 -0
- aetherion_ai-0.1.0/aetherion/analytics/neural_network.py +195 -0
- aetherion_ai-0.1.0/aetherion/analytics/patterns.py +543 -0
- aetherion_ai-0.1.0/aetherion/analytics/performance.py +964 -0
- aetherion_ai-0.1.0/aetherion/analytics/regime.py +884 -0
- aetherion_ai-0.1.0/aetherion/analytics/shock.py +89 -0
- aetherion_ai-0.1.0/aetherion/backend/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/backend/insights.py +262 -0
- aetherion_ai-0.1.0/aetherion/backend/main.py +1869 -0
- aetherion_ai-0.1.0/aetherion/cli.py +551 -0
- aetherion_ai-0.1.0/aetherion/config/costs.yaml +222 -0
- aetherion_ai-0.1.0/aetherion/config/risk.yaml +125 -0
- aetherion_ai-0.1.0/aetherion/config/settings.yaml +253 -0
- aetherion_ai-0.1.0/aetherion/core/__init__.py +2 -0
- aetherion_ai-0.1.0/aetherion/core/brand.py +51 -0
- aetherion_ai-0.1.0/aetherion/core/symbol_kinds.py +63 -0
- aetherion_ai-0.1.0/aetherion/core/types.py +181 -0
- aetherion_ai-0.1.0/aetherion/crew/__init__.py +61 -0
- aetherion_ai-0.1.0/aetherion/crew/asset_picker.py +315 -0
- aetherion_ai-0.1.0/aetherion/crew/fast.py +217 -0
- aetherion_ai-0.1.0/aetherion/crew/templates/crew_config.json +36 -0
- aetherion_ai-0.1.0/aetherion/crew/trading_flow.py +569 -0
- aetherion_ai-0.1.0/aetherion/crew/trading_system.py +337 -0
- aetherion_ai-0.1.0/aetherion/data/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/data/fetcher.py +581 -0
- aetherion_ai-0.1.0/aetherion/data/macro_feed.py +182 -0
- aetherion_ai-0.1.0/aetherion/data/pipeline.py +781 -0
- aetherion_ai-0.1.0/aetherion/data/providers/__init__.py +8 -0
- aetherion_ai-0.1.0/aetherion/data/providers/base.py +51 -0
- aetherion_ai-0.1.0/aetherion/data/providers/binance.py +124 -0
- aetherion_ai-0.1.0/aetherion/data/providers/cache.py +102 -0
- aetherion_ai-0.1.0/aetherion/data/providers/coingecko.py +128 -0
- aetherion_ai-0.1.0/aetherion/data/providers/dhan.py +253 -0
- aetherion_ai-0.1.0/aetherion/data/providers/fred.py +67 -0
- aetherion_ai-0.1.0/aetherion/data/providers/local_csv.py +69 -0
- aetherion_ai-0.1.0/aetherion/data/providers/yfinance.py +92 -0
- aetherion_ai-0.1.0/aetherion/data/quality.py +122 -0
- aetherion_ai-0.1.0/aetherion/data/social.py +228 -0
- aetherion_ai-0.1.0/aetherion/execution/__init__.py +23 -0
- aetherion_ai-0.1.0/aetherion/execution/base.py +39 -0
- aetherion_ai-0.1.0/aetherion/execution/binance_stream.py +206 -0
- aetherion_ai-0.1.0/aetherion/execution/dhan_broker.py +353 -0
- aetherion_ai-0.1.0/aetherion/execution/engine.py +23 -0
- aetherion_ai-0.1.0/aetherion/execution/engine_state.py +203 -0
- aetherion_ai-0.1.0/aetherion/execution/feed_status.py +37 -0
- aetherion_ai-0.1.0/aetherion/execution/live_stream.py +56 -0
- aetherion_ai-0.1.0/aetherion/execution/live_ticks.py +84 -0
- aetherion_ai-0.1.0/aetherion/execution/market_hours.py +63 -0
- aetherion_ai-0.1.0/aetherion/execution/paper.py +673 -0
- aetherion_ai-0.1.0/aetherion/execution/position_manager.py +314 -0
- aetherion_ai-0.1.0/aetherion/execution/risk_guard.py +199 -0
- aetherion_ai-0.1.0/aetherion/execution/yahoo_stream.py +203 -0
- aetherion_ai-0.1.0/aetherion/graph/__init__.py +4 -0
- aetherion_ai-0.1.0/aetherion/graph/audit.py +154 -0
- aetherion_ai-0.1.0/aetherion/graph/build.py +166 -0
- aetherion_ai-0.1.0/aetherion/graph/checkpoint.py +36 -0
- aetherion_ai-0.1.0/aetherion/graph/errors.py +25 -0
- aetherion_ai-0.1.0/aetherion/graph/llm_budget.py +100 -0
- aetherion_ai-0.1.0/aetherion/graph/logging_setup.py +116 -0
- aetherion_ai-0.1.0/aetherion/graph/memory.py +82 -0
- aetherion_ai-0.1.0/aetherion/graph/models.py +103 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/__init__.py +46 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/baseline.py +195 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/bear.py +245 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/bull.py +244 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/execution.py +317 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/fundamental.py +200 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/human_approval.py +74 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/macro.py +185 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/market_data.py +135 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/memory.py +37 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/portfolio_manager.py +273 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/reflection.py +230 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/regime.py +136 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/research_manager.py +354 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/risk_aggressive.py +41 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/risk_conservative.py +29 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/risk_manager.py +207 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/risk_neutral.py +38 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/sentiment.py +418 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/technical.py +343 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/trader.py +414 -0
- aetherion_ai-0.1.0/aetherion/graph/nodes/universe.py +292 -0
- aetherion_ai-0.1.0/aetherion/graph/outcome_loop.py +149 -0
- aetherion_ai-0.1.0/aetherion/graph/outcome_memory.py +263 -0
- aetherion_ai-0.1.0/aetherion/graph/prompt.py +352 -0
- aetherion_ai-0.1.0/aetherion/graph/risk/__init__.py +1 -0
- aetherion_ai-0.1.0/aetherion/graph/risk/gates.py +410 -0
- aetherion_ai-0.1.0/aetherion/graph/risk/helpers.py +147 -0
- aetherion_ai-0.1.0/aetherion/graph/sanitize.py +108 -0
- aetherion_ai-0.1.0/aetherion/graph/state.py +136 -0
- aetherion_ai-0.1.0/aetherion/graph/token_utils.py +213 -0
- aetherion_ai-0.1.0/aetherion/graph/utils/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/graph/utils/data_fetchers.py +269 -0
- aetherion_ai-0.1.0/aetherion/graph/validators.py +302 -0
- aetherion_ai-0.1.0/aetherion/hermes_client.py +707 -0
- aetherion_ai-0.1.0/aetherion/llm_config.py +174 -0
- aetherion_ai-0.1.0/aetherion/llm_rotation.py +254 -0
- aetherion_ai-0.1.0/aetherion/llm_settings.py +312 -0
- aetherion_ai-0.1.0/aetherion/observability/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/observability/bus.py +96 -0
- aetherion_ai-0.1.0/aetherion/observability/events.py +113 -0
- aetherion_ai-0.1.0/aetherion/observability/humanize.py +239 -0
- aetherion_ai-0.1.0/aetherion/observability/instrument.py +120 -0
- aetherion_ai-0.1.0/aetherion/portfolio/__init__.py +4 -0
- aetherion_ai-0.1.0/aetherion/portfolio/covariance.py +34 -0
- aetherion_ai-0.1.0/aetherion/portfolio/optimizer.py +226 -0
- aetherion_ai-0.1.0/aetherion/portfolio/risk_manager.py +37 -0
- aetherion_ai-0.1.0/aetherion/portfolio/risk_models.py +93 -0
- aetherion_ai-0.1.0/aetherion/skills/agent-trading-predictor/SKILL.md +18 -0
- aetherion_ai-0.1.0/aetherion/skills/algorithmic-trading/SKILL.md +18 -0
- aetherion_ai-0.1.0/aetherion/skills/analysis/SKILL.md +22 -0
- aetherion_ai-0.1.0/aetherion/skills/backtest/SKILL.md +12 -0
- aetherion_ai-0.1.0/aetherion/skills/backtest-expert/SKILL.md +17 -0
- aetherion_ai-0.1.0/aetherion/skills/chart-patterns/SKILL.md +53 -0
- aetherion_ai-0.1.0/aetherion/skills/correlation-analysis/SKILL.md +43 -0
- aetherion_ai-0.1.0/aetherion/skills/cross-asset-scan/SKILL.md +19 -0
- aetherion_ai-0.1.0/aetherion/skills/daily-ai-news/SKILL.md +22 -0
- aetherion_ai-0.1.0/aetherion/skills/daily-hot-news/SKILL.md +21 -0
- aetherion_ai-0.1.0/aetherion/skills/execution-planning/SKILL.md +18 -0
- aetherion_ai-0.1.0/aetherion/skills/financial-news/SKILL.md +42 -0
- aetherion_ai-0.1.0/aetherion/skills/macro-analysis/SKILL.md +45 -0
- aetherion_ai-0.1.0/aetherion/skills/market-opportunity-selection/SKILL.md +25 -0
- aetherion_ai-0.1.0/aetherion/skills/market-regime-analysis/SKILL.md +21 -0
- aetherion_ai-0.1.0/aetherion/skills/multi-timeframe-analysis/SKILL.md +22 -0
- aetherion_ai-0.1.0/aetherion/skills/nansen-perp-screener/SKILL.md +18 -0
- aetherion_ai-0.1.0/aetherion/skills/portfolio-construction/SKILL.md +25 -0
- aetherion_ai-0.1.0/aetherion/skills/portfolio-risk-management/SKILL.md +25 -0
- aetherion_ai-0.1.0/aetherion/skills/position-sizing/SKILL.md +25 -0
- aetherion_ai-0.1.0/aetherion/skills/price-action/SKILL.md +23 -0
- aetherion_ai-0.1.0/aetherion/skills/quantitative-trading-system-development/SKILL.md +18 -0
- aetherion_ai-0.1.0/aetherion/skills/relative-strength-ranking/SKILL.md +25 -0
- aetherion_ai-0.1.0/aetherion/skills/social-sentiment/SKILL.md +49 -0
- aetherion_ai-0.1.0/aetherion/skills/technical-analysis/SKILL.md +28 -0
- aetherion_ai-0.1.0/aetherion/skills/trade-setup-design/SKILL.md +32 -0
- aetherion_ai-0.1.0/aetherion/skills/trade-synthesis/SKILL.md +31 -0
- aetherion_ai-0.1.0/aetherion/skills/trading-research/SKILL.md +47 -0
- aetherion_ai-0.1.0/aetherion/strategies/__init__.py +3 -0
- aetherion_ai-0.1.0/aetherion/strategies/backtest.py +356 -0
- aetherion_ai-0.1.0/aetherion/strategies/base.py +81 -0
- aetherion_ai-0.1.0/aetherion/strategies/governance.py +94 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/chart_patterns.py +141 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/mean_reversion.py +64 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/neural_network.py +145 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/quantum_resonance.py +337 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/smart_money.py +246 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/trend_following.py +76 -0
- aetherion_ai-0.1.0/aetherion/strategies/implementations/tsmom.py +93 -0
- aetherion_ai-0.1.0/aetherion/strategies/nn_overlay.py +184 -0
- aetherion_ai-0.1.0/aetherion/strategies/registry.py +38 -0
- aetherion_ai-0.1.0/aetherion/terminal/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/terminal/__main__.py +48 -0
- aetherion_ai-0.1.0/aetherion/terminal/app.py +296 -0
- aetherion_ai-0.1.0/aetherion/terminal/backend_proc.py +73 -0
- aetherion_ai-0.1.0/aetherion/terminal/client.py +262 -0
- aetherion_ai-0.1.0/aetherion/terminal/demo.py +346 -0
- aetherion_ai-0.1.0/aetherion/terminal/launch.py +425 -0
- aetherion_ai-0.1.0/aetherion/terminal/palette.py +181 -0
- aetherion_ai-0.1.0/aetherion/terminal/store.py +666 -0
- aetherion_ai-0.1.0/aetherion/terminal/theme.tcss +130 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/__init__.py +1 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/anim.py +117 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/base.py +103 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/cards.py +450 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/feed.py +75 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/gauges.py +128 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/header.py +122 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/inputs.py +122 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/llm.py +63 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/mission.py +646 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/neural.py +510 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/portfolio.py +70 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/recommendations.py +66 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/research.py +116 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/risk.py +113 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/technical.py +52 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/thinking.py +186 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/timeline.py +225 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/tree.py +341 -0
- aetherion_ai-0.1.0/aetherion/terminal/widgets/watchlist.py +63 -0
- aetherion_ai-0.1.0/aetherion/validation/__init__.py +0 -0
- aetherion_ai-0.1.0/aetherion/validation/walk_forward.py +1228 -0
- aetherion_ai-0.1.0/aetherion/web/assets/index-BAGNP01x.js +308 -0
- aetherion_ai-0.1.0/aetherion/web/assets/index-DkTiDX7x.css +1 -0
- aetherion_ai-0.1.0/aetherion/web/index.html +16 -0
- aetherion_ai-0.1.0/aetherion_ai.egg-info/PKG-INFO +406 -0
- aetherion_ai-0.1.0/aetherion_ai.egg-info/SOURCES.txt +212 -0
- aetherion_ai-0.1.0/aetherion_ai.egg-info/dependency_links.txt +1 -0
- aetherion_ai-0.1.0/aetherion_ai.egg-info/entry_points.txt +2 -0
- aetherion_ai-0.1.0/aetherion_ai.egg-info/requires.txt +45 -0
- aetherion_ai-0.1.0/aetherion_ai.egg-info/top_level.txt +1 -0
- aetherion_ai-0.1.0/pyproject.toml +100 -0
- aetherion_ai-0.1.0/setup.cfg +4 -0
- aetherion_ai-0.1.0/tests/test_chart_plan_and_market_gate.py +110 -0
- aetherion_ai-0.1.0/tests/test_correlation.py +157 -0
- aetherion_ai-0.1.0/tests/test_evidence.py +67 -0
- aetherion_ai-0.1.0/tests/test_insights.py +108 -0
- aetherion_ai-0.1.0/tests/test_nn_overlay.py +147 -0
- aetherion_ai-0.1.0/tests/test_outcome_memory.py +198 -0
- aetherion_ai-0.1.0/tests/test_social_macro_feed.py +131 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: aetherion-ai
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Aetherion - autonomous market intelligence: a multi-agent research, risk-controlled paper-trading system with a terminal UI and web dashboard.
|
|
5
|
+
Author: Amit Singh
|
|
6
|
+
License: All rights reserved
|
|
7
|
+
Project-URL: Homepage, https://github.com/Amits64/aetherion
|
|
8
|
+
Project-URL: Repository, https://github.com/Amits64/aetherion
|
|
9
|
+
Project-URL: Issues, https://github.com/Amits64/aetherion/issues
|
|
10
|
+
Keywords: trading,agents,llm,langgraph,quantitative,paper-trading,terminal-ui
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Financial and Insurance Industry
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Requires-Dist: numpy>=1.24
|
|
23
|
+
Requires-Dist: pandas>=2.0
|
|
24
|
+
Requires-Dist: scipy>=1.10
|
|
25
|
+
Requires-Dist: scikit-learn>=1.3
|
|
26
|
+
Requires-Dist: matplotlib>=3.7
|
|
27
|
+
Requires-Dist: seaborn>=0.12
|
|
28
|
+
Requires-Dist: pyyaml>=6.0
|
|
29
|
+
Requires-Dist: requests>=2.31
|
|
30
|
+
Requires-Dist: httpx>=0.27
|
|
31
|
+
Requires-Dist: python-dotenv>=1.0
|
|
32
|
+
Requires-Dist: yfinance>=0.2.40
|
|
33
|
+
Requires-Dist: backtrader>=1.9.78
|
|
34
|
+
Requires-Dist: rich>=13.4
|
|
35
|
+
Requires-Dist: textual>=0.80
|
|
36
|
+
Requires-Dist: fastapi>=0.100
|
|
37
|
+
Requires-Dist: uvicorn>=0.23
|
|
38
|
+
Requires-Dist: websockets>=12.0
|
|
39
|
+
Requires-Dist: pydantic>=2.0
|
|
40
|
+
Requires-Dist: langgraph>=1.2.6
|
|
41
|
+
Requires-Dist: langchain-core>=1.4.8
|
|
42
|
+
Requires-Dist: litellm>=1.0
|
|
43
|
+
Provides-Extra: crypto
|
|
44
|
+
Requires-Dist: python-binance>=1.0; extra == "crypto"
|
|
45
|
+
Requires-Dist: pycoingecko>=3.1; extra == "crypto"
|
|
46
|
+
Provides-Extra: india
|
|
47
|
+
Requires-Dist: dhanhq>=2.0; extra == "india"
|
|
48
|
+
Provides-Extra: cache
|
|
49
|
+
Requires-Dist: redis>=4.5; extra == "cache"
|
|
50
|
+
Provides-Extra: analytics
|
|
51
|
+
Requires-Dist: empyrical>=0.5.5; extra == "analytics"
|
|
52
|
+
Provides-Extra: crew
|
|
53
|
+
Requires-Dist: crewai>=0.30; extra == "crew"
|
|
54
|
+
Provides-Extra: dev
|
|
55
|
+
Requires-Dist: pytest>=7.4; extra == "dev"
|
|
56
|
+
Requires-Dist: pytest-cov>=4.1; extra == "dev"
|
|
57
|
+
Requires-Dist: pytest-mock>=3.11; extra == "dev"
|
|
58
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
59
|
+
Requires-Dist: build>=1.0; extra == "dev"
|
|
60
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
61
|
+
|
|
62
|
+
<p align="center">
|
|
63
|
+
<img src="https://raw.githubusercontent.com/Amits64/aetherion/main/docs/assets/aetherion-icon.svg" width="96" alt="AETHERION brand icon">
|
|
64
|
+
</p>
|
|
65
|
+
|
|
66
|
+
<div align="center">
|
|
67
|
+
|
|
68
|
+
# AETHERION — Autonomous Market Intelligence
|
|
69
|
+
|
|
70
|
+
**Observe. Debate. Quantify. Protect.**
|
|
71
|
+
|
|
72
|
+
An evidence-driven, multi-agent market intelligence system built around quantitative research, disciplined risk controls, and continuous reflection.
|
|
73
|
+
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
An agentic trading research and **paper-trading** platform. A LangGraph pipeline runs an
|
|
77
|
+
analyst → bull/bear debate → risk committee → execution cycle over a screened universe
|
|
78
|
+
(crypto, US/India equities, commodity futures), with LLM agents kept **advisory** behind
|
|
79
|
+
deterministic risk controls. A rule-based, validated baseline strategy (time-series
|
|
80
|
+
momentum) runs alongside the agents. A FastAPI backend streams everything to a React
|
|
81
|
+
dashboard.
|
|
82
|
+
|
|
83
|
+
> **Status: research / paper trading.** Nothing here is financial advice, and nothing is
|
|
84
|
+
> wired to trade real money by default. Most of what the research in this repo found is
|
|
85
|
+
> *negative* (see [Research findings](#research-findings)) — the value of the system is
|
|
86
|
+
> measurement honesty and risk control, not a claimed edge.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## How a cycle works
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
memory → universe (screener) → market_data → regime
|
|
94
|
+
→ technical ┐
|
|
95
|
+
→ fundamental├→ bull → bear → research_manager → trader ┐
|
|
96
|
+
→ sentiment │ ├→ risk committee
|
|
97
|
+
→ macro ┘ baseline (TSMOM) ┘ (aggressive / neutral / conservative)
|
|
98
|
+
→ risk_manager → portfolio_manager → human_approval → execution → reflection
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- **Agents are advisory.** Every LLM/skill call has a deterministic fallback, and a per-cycle
|
|
102
|
+
wall-clock budget (`llm_time_budget_s`, default 270 s) bounds latency when providers degrade.
|
|
103
|
+
- **Hard limits are deterministic.** The risk manager, execution node and position manager
|
|
104
|
+
enforce limits regardless of what an agent says.
|
|
105
|
+
- **Two LLM paths.** The real Hermes Agent CLI (tools: web,
|
|
106
|
+
Yahoo Finance MCP, …) when available, falling back to an in-process call to the
|
|
107
|
+
`aetherion/skills/*/SKILL.md` prompts through OpenRouter (free-model pool) → Ollama cloud → local Ollama.
|
|
108
|
+
|
|
109
|
+
## Real-time layer
|
|
110
|
+
|
|
111
|
+
The LLM cycle runs every ~30 minutes (it takes minutes per pass), but everything deterministic follows the
|
|
112
|
+
tape in seconds over the shared `/ws/live` WebSocket:
|
|
113
|
+
|
|
114
|
+
| Event | Cadence | What it carries |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| `price_tick` | 2 s | Latest tick per watched symbol (Binance WSS for crypto, Yahoo WSS for equities/futures) |
|
|
117
|
+
| `feed_status` | 2 s | `live` / `closed` / `stalled` / `polling` per symbol, so a quiet chart is never ambiguous |
|
|
118
|
+
| `ta_update` | 5 s | Technical read recomputed against the forming bar — same scoring as the agent cycle (`aetherion/graph/nodes/technical.technical_score`) |
|
|
119
|
+
| `pnl_update` + exits | 5 s with live ticks, else 30 s | Position marks and stop/target/trailing exits |
|
|
120
|
+
|
|
121
|
+
The chart keeps a forming candle (running high/low, new bar on rollover) and survives the 60 s refetch
|
|
122
|
+
without snapping back. **A closed market cannot tick:** gold, silver and crude (CME futures) are closed
|
|
123
|
+
from Friday 17:00 ET to Sunday 18:00 ET (and 17:00–18:00 ET daily), US equities outside 09:30–16:00 ET;
|
|
124
|
+
the dashboard shows `MARKET CLOSED` instead of a frozen chart. Calendars live in `aetherion/execution/market_hours.py`
|
|
125
|
+
(exchange holidays are not modelled; a holiday shows as `FEED STALLED`, which is accurate).
|
|
126
|
+
|
|
127
|
+
### Multi-timeframe context
|
|
128
|
+
|
|
129
|
+
`aetherion/analytics/mtf.py` builds one per-timeframe view (5m, 15m, 1h, 4h, 1d: direction, EMA trend, RSI/ADX, MACD,
|
|
130
|
+
swing structure, and the patterns detected on that timeframe's own candles) and a weighted alignment
|
|
131
|
+
(5m 0.5 · 15m 0.75 · 1h 1 · 4h 1.5 · 1d 2). The agent cycle, the real-time loop and the chart read the same
|
|
132
|
+
builder, and the bull/bear/research/trade-synthesis agents receive its compact summary through `slim_tech`.
|
|
133
|
+
`GraphConfig.mtf_timeframes` selects which timeframes vote in the technical score (a code-level field;
|
|
134
|
+
there is no API or env setting yet). `["1h","4h","1d"]` reproduces the pre-5m/15m technical score exactly:
|
|
135
|
+
count-vote alignment, the legacy (unscaled) pattern tilt and trader geometry, and the legacy 4h/1d row counts
|
|
136
|
+
(200/60). Volatility-scaled patterns appear only in the MTF context, the chart and the agents' summary. Pattern tolerances scale with each timeframe's own volatility;
|
|
137
|
+
calibration and before/after density are in `docs/research/pattern-calibration.md`
|
|
138
|
+
(`python scripts/calibrate_patterns.py --check` re-verifies it).
|
|
139
|
+
|
|
140
|
+
## Risk and reliability controls
|
|
141
|
+
|
|
142
|
+
| Control | Where | Behavior |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| Daily-loss kill switch | `aetherion/graph/nodes/execution.py` | Halts all orders when daily loss ≥ `max_daily_loss_pct`; optional book flatten |
|
|
145
|
+
| **Drawdown guard** | `aetherion/execution/risk_guard.py` | Persisted peak-to-trough halt of *new entries*, restart-proof daily baseline, loss-streak breaker, de-risk ladder (size only ever scaled down). Every halt has a cooldown and auto-resets; fails closed on bad data |
|
|
146
|
+
| **Extreme-shock gate** | `aetherion/analytics/shock.py` | Lagged-window return z-score + volatility expansion (+ volume confirmation): warning → half size, critical → block new entries. Closes are never blocked |
|
|
147
|
+
| Stale-data gate | `aetherion/graph/nodes/market_data.py` | Analysis-only when bars are stale (e.g. market closed) |
|
|
148
|
+
| Stale-entry guard | `aetherion/graph/nodes/execution.py` | Rejects an entry if live price drifted > `max_entry_deviation_pct` from the analyzed price |
|
|
149
|
+
| Position manager | `aetherion/execution/position_manager.py` | Stop/target, breakeven + trailing stop, time stop, flatten-all |
|
|
150
|
+
| Expectancy throttle | `aetherion/analytics/expectancy.py` | Halves size for setup buckets with ≥10 closed trades and negative mean R |
|
|
151
|
+
| Re-entry cooldown | `aetherion/graph/nodes/risk_manager.py` | Blocks immediate re-entry after a close |
|
|
152
|
+
| Strategy governance | `aetherion/strategies/governance.py` | Strategies must be registered/approved before live use |
|
|
153
|
+
| Calibration report | `scripts/calibration_report.py` | Tests whether stated trade confidence carries information (AUC permutation test, Brier skill, ECE) |
|
|
154
|
+
|
|
155
|
+
## Quick start
|
|
156
|
+
|
|
157
|
+
Requirements: Python ≥ 3.11. Optional: [Ollama](https://ollama.com) and the Hermes Agent CLI for the CLI LLM tier;
|
|
158
|
+
Node.js only if you work on the web dashboard.
|
|
159
|
+
|
|
160
|
+
### Install from PyPI
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
pip install aetherion-ai # the command it installs is `aetherion`
|
|
164
|
+
aetherion # opens the terminal: pick symbols, press START
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`aetherion` starts the backend for you, shows a symbol selector, and fades into **Mission Control** once trading
|
|
168
|
+
begins. Everything else:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
aetherion --demo # synthetic engine: no backend, no API keys, nothing to configure
|
|
172
|
+
aetherion --attach # skip the selector, watch an engine that is already running
|
|
173
|
+
aetherion serve [--port 8001] # only the API + web dashboard (http://127.0.0.1:8001)
|
|
174
|
+
aetherion doctor # check the installation, LLM keys and data folder
|
|
175
|
+
aetherion pipeline --help # research / backtest command line
|
|
176
|
+
pip install "aetherion-ai[crypto,india,cache,analytics,crew]" # optional integrations
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Choosing your model.** The launch screen has a *Provider / Model / API key* row (OpenRouter, Anthropic, OpenAI,
|
|
180
|
+
Gemini, Groq, DeepSeek, Mistral, local Ollama, or any OpenAI-compatible endpoint). Pick a provider, type or keep the
|
|
181
|
+
suggested model id (any [litellm](https://docs.litellm.ai/docs/providers) model works), paste your key, press
|
|
182
|
+
**TEST KEY** to check it, then START. The choice is saved: next time the screen opens on the same model with your
|
|
183
|
+
key shown masked, and you can switch to another provider whenever you like (each provider remembers its own model).
|
|
184
|
+
Keys are stored in `~/.aetherion/.env` (owner-only permissions) and the chosen default in `~/.aetherion/llm.json`; keys
|
|
185
|
+
are never logged, never put in `llm.json`, and only sent to a backend running on your own machine.
|
|
186
|
+
|
|
187
|
+
Configuration: environment variables, or a `.env` in the current folder or in `~/.aetherion/.env` (LLM keys such as
|
|
188
|
+
`OPENROUTER_API_KEY`; all optional for paper mode). State, logs and memory live in `~/.aetherion/`.
|
|
189
|
+
|
|
190
|
+
> The PyPI name `aetherion` belongs to an unrelated project, so the package is published as **`aetherion-ai`**.
|
|
191
|
+
|
|
192
|
+
### From source
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
git clone git@github.com:Amits64/aetherion.git
|
|
196
|
+
cd aetherion
|
|
197
|
+
|
|
198
|
+
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scriptsctivate
|
|
199
|
+
pip install -e ".[dev]"
|
|
200
|
+
|
|
201
|
+
cp .env.example .env # then fill in the keys you need (all optional for paper mode)
|
|
202
|
+
|
|
203
|
+
aetherion # terminal UI (starts the backend itself)
|
|
204
|
+
aetherion serve # or: API only on :8001
|
|
205
|
+
cd frontend && npm install && npm run dev # dashboard with hot reload (separate terminal)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The dashboard is also served by `aetherion serve` at http://127.0.0.1:8001 once built (`python scripts/build_release.py`).
|
|
209
|
+
Pick symbols (or leave empty for the auto-screener) and press **Start**.
|
|
210
|
+
The default broker is an in-memory **paper broker** that restarts at $100,000 each process.
|
|
211
|
+
|
|
212
|
+
If you use the Hermes CLI tier, run `ollama serve` first. When the CLI's provider is
|
|
213
|
+
unreachable the client skips it instantly and uses the in-process fallback.
|
|
214
|
+
|
|
215
|
+
The Hermes CLI runs skills from **its own registry** as `aetherion-<name>`, not from this repo's `aetherion/skills/`
|
|
216
|
+
folder. The repo is the source of truth; register (or refresh) the 13 skills the pipeline uses with:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
python scripts/register_hermes_skills.py --check # is Hermes up to date with aetherion/skills/?
|
|
220
|
+
python scripts/register_hermes_skills.py # write/refresh the aetherion-* copies
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
(`--dest DIR` overrides the Hermes skills directory; other skills there are never touched.)
|
|
224
|
+
|
|
225
|
+
### Command line
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
aetherion pipeline --help # data, strategies, backtest, validate, optimize, regime, paper, performance, live
|
|
229
|
+
aetherion pipeline strategies --help # strategy management
|
|
230
|
+
python scripts/calibration_report.py # is trade confidence informative? (needs closed trades)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Configuration
|
|
234
|
+
|
|
235
|
+
Runtime behavior is controlled by `GraphConfig` (`aetherion/graph/state.py`); the backend builds it from the
|
|
236
|
+
dashboard request. Notable knobs:
|
|
237
|
+
|
|
238
|
+
| Setting | Default | Meaning |
|
|
239
|
+
|---|---|---|
|
|
240
|
+
| `max_daily_loss_pct` | 0.02 | Daily kill-switch threshold (fraction) |
|
|
241
|
+
| `max_drawdown_pct` | 0.10 | Peak-to-trough halt of new entries (fraction) |
|
|
242
|
+
| `max_loss_streak` | 4 | Consecutive losing trades before a cooldown halt |
|
|
243
|
+
| `shock_gate_enabled` | True | Extreme-shock gate on new entries |
|
|
244
|
+
| `risk_per_trade_pct` / `max_position_pct` | 0.01 / 0.20 | Sizing |
|
|
245
|
+
| `baseline_strategies` | `["tsmom"]` | Deterministic baseline layer (empty list disables) |
|
|
246
|
+
| `llm_time_budget_s` | 270 | Per-cycle LLM wall-clock budget |
|
|
247
|
+
| `kill_switch_flatten` | False | Also close the book on a daily-loss breach |
|
|
248
|
+
|
|
249
|
+
Environment variables are listed in [`.env.example`](.env.example) (names only — never commit `.env`).
|
|
250
|
+
Useful switches: `COMMODITY_DATA_SOURCE` (`yfinance` default | `binance`), `HERMES_CLI_CONCURRENCY`,
|
|
251
|
+
`HERMES_CLI_PROVIDER_URL`, `OLLAMA_*`, `OPENROUTER_*`, `TRADING_MODE`.
|
|
252
|
+
|
|
253
|
+
**Data providers** (`aetherion/data/providers/`): Binance, Yahoo Finance, CoinGecko, FRED, Dhan (NSE/BSE),
|
|
254
|
+
local CSV, with an on-disk/in-memory cache and a negative cache for failing symbols. Gold/silver/crude
|
|
255
|
+
futures (`GC=F`, `SI=F`, `CL=F`) use Yahoo (COMEX) by default so analysis, live price patching and the
|
|
256
|
+
stale-entry guard all see one instrument; Binance USDT-M perpetuals (`XAUUSDT`, `XAGUSDT`, `CLUSDT`)
|
|
257
|
+
are available behind `COMMODITY_DATA_SOURCE=binance`.
|
|
258
|
+
|
|
259
|
+
**Sentiment & macro inputs** (no API keys needed): `aetherion/data/social.py` pre-fetches StockTwits (Bullish/Bearish
|
|
260
|
+
tags; GLD/SLV/USO cashtags stand in for gold/silver/crude futures) and Reddit RSS in code and hands them to
|
|
261
|
+
the sentiment skill as data, so a Hermes outage no longer means no social signal. A failed fetch is
|
|
262
|
+
reported as `unavailable`, never as silence. The report carries a six-band `sentiment_band`
|
|
263
|
+
(`Mixed` = sources disagree), a deterministic `divergence` flag, `contrarian_extreme` (>=90/10 crowd) and
|
|
264
|
+
`data_gaps`. `aetherion/data/macro_feed.py` adds FRED rates (10y, real 10y, fed funds, 10y-2y, CPI, broad dollar via
|
|
265
|
+
the keyless `fredgraph.csv`) with a `metals_pressure` read, and Polymarket event odds (Fed cuts, recession,
|
|
266
|
+
gold/oil/bitcoin). The approach follows TauricResearch/TradingAgents' analysts; see
|
|
267
|
+
`docs/research/tradingagents-analyst-comparison.md`.
|
|
268
|
+
|
|
269
|
+
## Terminal UI (replaces raw logs)
|
|
270
|
+
|
|
271
|
+
A Bloomberg-style Textual terminal that shows what the agents are doing instead of Python log lines.
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
aetherion # opens the launcher; the backend is started (and stopped) for you
|
|
275
|
+
aetherion --attach # attach to an engine already running at http://localhost:8001 (--url, --api-key)
|
|
276
|
+
aetherion --demo # no backend at all
|
|
277
|
+
AETHERION_QUIET_LOGS=1 aetherion serve # engine only; console shows warnings, full log -> ~/.aetherion/logs/aetherion.log
|
|
278
|
+
```
|
|
279
|
+
Run the engine and the terminal in two shells; the terminal attaches to a running engine and can be closed and reopened freely.
|
|
280
|
+
|
|
281
|
+
**Mission Control** - six screens (keys `1`-`6`): **1 Mission Control** (8-panel mosaic: Portfolio Command Center,
|
|
282
|
+
Neural Agent Network, Active Agent Grid, AI Thinking Feed, Risk Matrix, Opportunity Scanner, Execution Queue, Reflection
|
|
283
|
+
Memory), **2 Agent Tree** (the cycle as a collapsible tree: cluster → agent → every skill/LLM call, with a detail pane showing the full result text; `x`/`z` expand/collapse all, `s` newest-first; the Mission tab keeps the card grid. Each call is also its own card there: `Research Agent #01, #02, #03` with start time, runtime, tokens,
|
|
284
|
+
symbol, confidence and a result summary; running cards pulse, finished ones show an animated check, failures flash red),
|
|
285
|
+
**3 Timeline** (every execution in chronological order with a Gantt bar, so you see how a decision was formed),
|
|
286
|
+
**4 Neural Net** (Memory, Research, Technical, Risk, Approval, Execution, Reflection as connected nodes; packets travel
|
|
287
|
+
along the links when information flows), **5 Intel**, **6 LLM**, **7 Portfolio & Risk** (the side columns at full size - use it when the window is too narrow to show them on the Mission tab). Keys: `s` sort cards, `f` filter thoughts, `c` clear
|
|
288
|
+
the activity strip, `q` quit. An animation clock (12 Hz) re-renders only the panels that have motion.
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
graph nodes --wrap_node--> EventBus <--publish-- HermesClient.run_skill / maybe_invoke_model
|
|
292
|
+
| (observability/)
|
|
293
|
+
+--> app_state.push_event --> /ws/live --> terminal.client --> terminal.store.reduce --> widgets
|
|
294
|
+
GET /api/events/recent <-- replay buffer (late attach backfill) REST pollers: portfolio, status, risk, llm-health, assets
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
`aetherion/observability/` holds the schema (21-agent registry), the thread-safe bus and the humanizer ("Risk Agent approved 1,
|
|
298
|
+
rejected 3 (confidence x2, shock block)"); every graph node is wrapped once in `aetherion/graph/build.py`. `aetherion/terminal/store.py` is a
|
|
299
|
+
pure reducer, so the whole data layer is unit-tested without a UI.
|
|
300
|
+
|
|
301
|
+
## Multi-asset correlation
|
|
302
|
+
|
|
303
|
+
`aetherion/analytics/correlation.py` + the **Correlation** dashboard page (`/api/correlation`, `/api/correlation/analyze`).
|
|
304
|
+
Correlations are on log *returns* (never price levels) over the timestamps both assets traded, so a crypto Fri->Mon
|
|
305
|
+
move is compared with an equity Fri->Mon move. Per pair: short/mid/long windows with the short-vs-long change
|
|
306
|
+
(regime breaks, sign flips), stress correlation (worst 25% of days), rolling series, lead-lag and beta to SPY.
|
|
307
|
+
Basket level: hierarchical clusters, average pairwise correlation, first-PC share, effective independent bets
|
|
308
|
+
(also for your open positions), and a regime block (rolling mean correlation, correlation entropy, cross-asset
|
|
309
|
+
volatility dispersion, tail kurtosis/skew; adapted from an earlier standalone analyzer). Intervals 1d/4h/1h/15m.
|
|
310
|
+
"Analyze with AI" runs the Hermes `correlation-analysis` skill on a compact numeric digest and falls back to a
|
|
311
|
+
deterministic analysis in the same schema when no LLM answers.
|
|
312
|
+
|
|
313
|
+
## Neural-network signal filter (opt-in)
|
|
314
|
+
|
|
315
|
+
Any strategy can be wrapped with a small NumPy network that scores its BUY signals (meta-labeling): set
|
|
316
|
+
`"nn_filter": true` in the strategy params (API/CLI/`create_strategy`). The strategy still decides *when* a signal
|
|
317
|
+
exists; the network, trained only on that strategy's own past signals and their triple-barrier outcomes, vetoes
|
|
318
|
+
those with P(win) below `nn_min_prob`. It fails open: until it has `nn_min_signals` resolved signals **and** its
|
|
319
|
+
holdout AUC's 95% lower bound exceeds 0.5, the base strategy trades unchanged. SELLs (exits) always pass.
|
|
320
|
+
Code: `aetherion/analytics/meta_label.py`, `aetherion/strategies/nn_overlay.py`; A/B harness: `scripts/eval_nn_overlay.py`.
|
|
321
|
+
**Measured result (BTC/ETH/GC=F 1h, 3000 bars, walk-forward): no reliable improvement** (see
|
|
322
|
+
`docs/research/nn-overlay-ab.md`), so it stays off by default.
|
|
323
|
+
|
|
324
|
+
## Outcome-settled memory
|
|
325
|
+
|
|
326
|
+
Every trade idea (executed or not) is logged as a *pending* decision in `~/.aetherion/memory/decision_outcomes.jsonl`.
|
|
327
|
+
Once `outcome_horizon_hours` (24h) has traded, the next cycle's memory node settles it against realised prices:
|
|
328
|
+
directional return, R-multiple (from the stop) and alpha vs a benchmark (BTC for altcoins, SPY for equities,
|
|
329
|
+
none for BTC/commodities). A two-sentence lesson that cites the number is written (LLM when the budget allows,
|
|
330
|
+
deterministic otherwise) and the per-symbol track record plus recent lessons lead `memory_context`, point-in-time
|
|
331
|
+
(only outcomes already known). Design from TauricResearch/TradingAgents' memory log; code in
|
|
332
|
+
`aetherion/graph/outcome_memory.py` and `aetherion/graph/outcome_loop.py`. Settings: `outcome_memory_enabled`,
|
|
333
|
+
`outcome_memory_path`, `outcome_horizon_hours`, `outcome_max_reflections`.
|
|
334
|
+
|
|
335
|
+
## Strategies
|
|
336
|
+
|
|
337
|
+
Registered in `aetherion/strategies/implementations/`: `tsmom` (deployed baseline), `smart_money`,
|
|
338
|
+
`trend_following`, `mean_reversion`, `chart_patterns`, `neural_network`, `quantum_resonance`.
|
|
339
|
+
The backtest engine (`aetherion/strategies/backtest.py`, Backtrader) and walk-forward tools
|
|
340
|
+
(`aetherion/validation/walk_forward.py`) back the evaluations below.
|
|
341
|
+
|
|
342
|
+
## Research findings
|
|
343
|
+
|
|
344
|
+
Summary of the evaluations behind the design choices (details in
|
|
345
|
+
[`docs/research/strategy-findings.md`](docs/research/strategy-findings.md)):
|
|
346
|
+
|
|
347
|
+
| Question | Result |
|
|
348
|
+
|---|---|
|
|
349
|
+
| Does time-series momentum (long above SMA200) work? | **Yes, as drawdown control** — on a diversified basket Sharpe ≈ buy-and-hold with a 27.7% vs 67% max drawdown. Deployed as the baseline. Single-symbol results are weak; the value is the basket |
|
|
350
|
+
| Do per-symbol tuned strategies hold up out-of-sample? | **No** — full-sample winners collapsed walk-forward (curve-fits) |
|
|
351
|
+
| Gold / silver / crude: any tradeable edge beyond trend risk-reduction? | **No** — shorts lose on every family; long/flat trend never beats buy-and-hold Sharpe; ratio mean-reversion and cross-sectional momentum ≈ 0 |
|
|
352
|
+
| Can neural nets predict daily direction? | **No** — pooled walk-forward AUC ≈ 0.50 for logistic/MLP/gradient boosting |
|
|
353
|
+
| Can ML forecast volatility? | Yes (R² 0.67 vs 0.59 trailing) — but the trading gain is negligible (+0.01–0.03 Sharpe), so it is not deployed |
|
|
354
|
+
| Do chart patterns work standalone? | **No** — kept only as confluence |
|
|
355
|
+
|
|
356
|
+
## Testing
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
pytest # 480 tests
|
|
360
|
+
pytest tests/unit/test_risk_guard.py -v
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
Tests isolate the expectancy ledger and the risk-guard state (`tests/conftest.py`) so they never
|
|
364
|
+
touch `~/.aetherion`. Safety controls are test-driven: each has a test proving it fires, plus mutation
|
|
365
|
+
checks that fail when the control is broken.
|
|
366
|
+
|
|
367
|
+
## Repository layout
|
|
368
|
+
|
|
369
|
+
```
|
|
370
|
+
backend/ FastAPI app (REST + /ws/live), starts/stops the trading loop
|
|
371
|
+
frontend/ React + Vite dashboard (Framer Motion)
|
|
372
|
+
graph/ LangGraph pipeline: build.py, state.py, nodes/ (one module per stage), utils/
|
|
373
|
+
skills/ Agent skill prompts (SKILL.md): source of truth for Hermes (via register_hermes_skills.py) and the in-process fallback
|
|
374
|
+
strategies/ Strategy base/registry/governance, backtest engine, implementations/
|
|
375
|
+
execution/ Brokers (paper, Dhan), position manager, risk_guard, live tick streams
|
|
376
|
+
analytics/ Expectancy ledger, shock gate, calibration, regime, performance, patterns
|
|
377
|
+
portfolio/ Optimizer, covariance estimators, risk models
|
|
378
|
+
validation/ Walk-forward validation, deflated-Sharpe helpers
|
|
379
|
+
data/ Data pipeline + providers + cache
|
|
380
|
+
crew/, miaoxiang/ Auxiliary orchestration and backtest helpers
|
|
381
|
+
config/ costs.yaml, risk.yaml, settings.yaml
|
|
382
|
+
scripts/ calibration_report.py, register_hermes_skills.py, TradingView shortlist, MCP patch helpers
|
|
383
|
+
examples/ Small standalone examples
|
|
384
|
+
docs/ Research findings, design notes, specs/plans, archive/
|
|
385
|
+
tests/ unit/ and integration/
|
|
386
|
+
hermes_client.py Hermes CLI + in-process LLM fallback client
|
|
387
|
+
llm_config.py, llm_rotation.py LLM backends and the free-model rotation pool
|
|
388
|
+
research_*.py Scheduled research briefings (see below)
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### Scheduled research scripts
|
|
392
|
+
|
|
393
|
+
`research_hourly.py` (and the helpers `research_hourly_news.py`, `research_briefing.py`) are run
|
|
394
|
+
hourly by a Windows Task Scheduler job — see
|
|
395
|
+
[`docs/research/HOURLY_RESEARCH_SETUP_SUMMARY.md`](docs/research/HOURLY_RESEARCH_SETUP_SUMMARY.md).
|
|
396
|
+
They stay at the repository root because the scheduled task references that path; moving them
|
|
397
|
+
requires updating the task.
|
|
398
|
+
|
|
399
|
+
## Known limitations
|
|
400
|
+
|
|
401
|
+
- Paper broker state is in-memory and resets per process; the guard's saved state is scoped to the
|
|
402
|
+
broker session so it never mistakes a reset for a drawdown.
|
|
403
|
+
- Free-tier LLM providers are rate-limited; the per-cycle budget and fallbacks exist for that reason.
|
|
404
|
+
- Commodity futures are continuous (unadjusted-roll) series from Yahoo; volume on `GC=F`/`SI=F` is
|
|
405
|
+
noisy around contract rolls, so volume is only used to *confirm* price-based shock signals.
|
|
406
|
+
- No license has been specified.
|