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.
Files changed (214) hide show
  1. aetherion_ai-0.1.0/PKG-INFO +406 -0
  2. aetherion_ai-0.1.0/README.md +345 -0
  3. aetherion_ai-0.1.0/aetherion/__init__.py +13 -0
  4. aetherion_ai-0.1.0/aetherion/__main__.py +76 -0
  5. aetherion_ai-0.1.0/aetherion/aetherion_live.py +172 -0
  6. aetherion_ai-0.1.0/aetherion/analytics/__init__.py +0 -0
  7. aetherion_ai-0.1.0/aetherion/analytics/calibration.py +153 -0
  8. aetherion_ai-0.1.0/aetherion/analytics/correlation.py +362 -0
  9. aetherion_ai-0.1.0/aetherion/analytics/evidence.py +82 -0
  10. aetherion_ai-0.1.0/aetherion/analytics/expectancy.py +226 -0
  11. aetherion_ai-0.1.0/aetherion/analytics/forecasting.py +116 -0
  12. aetherion_ai-0.1.0/aetherion/analytics/live_ta.py +140 -0
  13. aetherion_ai-0.1.0/aetherion/analytics/meta_label.py +213 -0
  14. aetherion_ai-0.1.0/aetherion/analytics/mtf.py +226 -0
  15. aetherion_ai-0.1.0/aetherion/analytics/neural_network.py +195 -0
  16. aetherion_ai-0.1.0/aetherion/analytics/patterns.py +543 -0
  17. aetherion_ai-0.1.0/aetherion/analytics/performance.py +964 -0
  18. aetherion_ai-0.1.0/aetherion/analytics/regime.py +884 -0
  19. aetherion_ai-0.1.0/aetherion/analytics/shock.py +89 -0
  20. aetherion_ai-0.1.0/aetherion/backend/__init__.py +0 -0
  21. aetherion_ai-0.1.0/aetherion/backend/insights.py +262 -0
  22. aetherion_ai-0.1.0/aetherion/backend/main.py +1869 -0
  23. aetherion_ai-0.1.0/aetherion/cli.py +551 -0
  24. aetherion_ai-0.1.0/aetherion/config/costs.yaml +222 -0
  25. aetherion_ai-0.1.0/aetherion/config/risk.yaml +125 -0
  26. aetherion_ai-0.1.0/aetherion/config/settings.yaml +253 -0
  27. aetherion_ai-0.1.0/aetherion/core/__init__.py +2 -0
  28. aetherion_ai-0.1.0/aetherion/core/brand.py +51 -0
  29. aetherion_ai-0.1.0/aetherion/core/symbol_kinds.py +63 -0
  30. aetherion_ai-0.1.0/aetherion/core/types.py +181 -0
  31. aetherion_ai-0.1.0/aetherion/crew/__init__.py +61 -0
  32. aetherion_ai-0.1.0/aetherion/crew/asset_picker.py +315 -0
  33. aetherion_ai-0.1.0/aetherion/crew/fast.py +217 -0
  34. aetherion_ai-0.1.0/aetherion/crew/templates/crew_config.json +36 -0
  35. aetherion_ai-0.1.0/aetherion/crew/trading_flow.py +569 -0
  36. aetherion_ai-0.1.0/aetherion/crew/trading_system.py +337 -0
  37. aetherion_ai-0.1.0/aetherion/data/__init__.py +0 -0
  38. aetherion_ai-0.1.0/aetherion/data/fetcher.py +581 -0
  39. aetherion_ai-0.1.0/aetherion/data/macro_feed.py +182 -0
  40. aetherion_ai-0.1.0/aetherion/data/pipeline.py +781 -0
  41. aetherion_ai-0.1.0/aetherion/data/providers/__init__.py +8 -0
  42. aetherion_ai-0.1.0/aetherion/data/providers/base.py +51 -0
  43. aetherion_ai-0.1.0/aetherion/data/providers/binance.py +124 -0
  44. aetherion_ai-0.1.0/aetherion/data/providers/cache.py +102 -0
  45. aetherion_ai-0.1.0/aetherion/data/providers/coingecko.py +128 -0
  46. aetherion_ai-0.1.0/aetherion/data/providers/dhan.py +253 -0
  47. aetherion_ai-0.1.0/aetherion/data/providers/fred.py +67 -0
  48. aetherion_ai-0.1.0/aetherion/data/providers/local_csv.py +69 -0
  49. aetherion_ai-0.1.0/aetherion/data/providers/yfinance.py +92 -0
  50. aetherion_ai-0.1.0/aetherion/data/quality.py +122 -0
  51. aetherion_ai-0.1.0/aetherion/data/social.py +228 -0
  52. aetherion_ai-0.1.0/aetherion/execution/__init__.py +23 -0
  53. aetherion_ai-0.1.0/aetherion/execution/base.py +39 -0
  54. aetherion_ai-0.1.0/aetherion/execution/binance_stream.py +206 -0
  55. aetherion_ai-0.1.0/aetherion/execution/dhan_broker.py +353 -0
  56. aetherion_ai-0.1.0/aetherion/execution/engine.py +23 -0
  57. aetherion_ai-0.1.0/aetherion/execution/engine_state.py +203 -0
  58. aetherion_ai-0.1.0/aetherion/execution/feed_status.py +37 -0
  59. aetherion_ai-0.1.0/aetherion/execution/live_stream.py +56 -0
  60. aetherion_ai-0.1.0/aetherion/execution/live_ticks.py +84 -0
  61. aetherion_ai-0.1.0/aetherion/execution/market_hours.py +63 -0
  62. aetherion_ai-0.1.0/aetherion/execution/paper.py +673 -0
  63. aetherion_ai-0.1.0/aetherion/execution/position_manager.py +314 -0
  64. aetherion_ai-0.1.0/aetherion/execution/risk_guard.py +199 -0
  65. aetherion_ai-0.1.0/aetherion/execution/yahoo_stream.py +203 -0
  66. aetherion_ai-0.1.0/aetherion/graph/__init__.py +4 -0
  67. aetherion_ai-0.1.0/aetherion/graph/audit.py +154 -0
  68. aetherion_ai-0.1.0/aetherion/graph/build.py +166 -0
  69. aetherion_ai-0.1.0/aetherion/graph/checkpoint.py +36 -0
  70. aetherion_ai-0.1.0/aetherion/graph/errors.py +25 -0
  71. aetherion_ai-0.1.0/aetherion/graph/llm_budget.py +100 -0
  72. aetherion_ai-0.1.0/aetherion/graph/logging_setup.py +116 -0
  73. aetherion_ai-0.1.0/aetherion/graph/memory.py +82 -0
  74. aetherion_ai-0.1.0/aetherion/graph/models.py +103 -0
  75. aetherion_ai-0.1.0/aetherion/graph/nodes/__init__.py +46 -0
  76. aetherion_ai-0.1.0/aetherion/graph/nodes/baseline.py +195 -0
  77. aetherion_ai-0.1.0/aetherion/graph/nodes/bear.py +245 -0
  78. aetherion_ai-0.1.0/aetherion/graph/nodes/bull.py +244 -0
  79. aetherion_ai-0.1.0/aetherion/graph/nodes/execution.py +317 -0
  80. aetherion_ai-0.1.0/aetherion/graph/nodes/fundamental.py +200 -0
  81. aetherion_ai-0.1.0/aetherion/graph/nodes/human_approval.py +74 -0
  82. aetherion_ai-0.1.0/aetherion/graph/nodes/macro.py +185 -0
  83. aetherion_ai-0.1.0/aetherion/graph/nodes/market_data.py +135 -0
  84. aetherion_ai-0.1.0/aetherion/graph/nodes/memory.py +37 -0
  85. aetherion_ai-0.1.0/aetherion/graph/nodes/portfolio_manager.py +273 -0
  86. aetherion_ai-0.1.0/aetherion/graph/nodes/reflection.py +230 -0
  87. aetherion_ai-0.1.0/aetherion/graph/nodes/regime.py +136 -0
  88. aetherion_ai-0.1.0/aetherion/graph/nodes/research_manager.py +354 -0
  89. aetherion_ai-0.1.0/aetherion/graph/nodes/risk_aggressive.py +41 -0
  90. aetherion_ai-0.1.0/aetherion/graph/nodes/risk_conservative.py +29 -0
  91. aetherion_ai-0.1.0/aetherion/graph/nodes/risk_manager.py +207 -0
  92. aetherion_ai-0.1.0/aetherion/graph/nodes/risk_neutral.py +38 -0
  93. aetherion_ai-0.1.0/aetherion/graph/nodes/sentiment.py +418 -0
  94. aetherion_ai-0.1.0/aetherion/graph/nodes/technical.py +343 -0
  95. aetherion_ai-0.1.0/aetherion/graph/nodes/trader.py +414 -0
  96. aetherion_ai-0.1.0/aetherion/graph/nodes/universe.py +292 -0
  97. aetherion_ai-0.1.0/aetherion/graph/outcome_loop.py +149 -0
  98. aetherion_ai-0.1.0/aetherion/graph/outcome_memory.py +263 -0
  99. aetherion_ai-0.1.0/aetherion/graph/prompt.py +352 -0
  100. aetherion_ai-0.1.0/aetherion/graph/risk/__init__.py +1 -0
  101. aetherion_ai-0.1.0/aetherion/graph/risk/gates.py +410 -0
  102. aetherion_ai-0.1.0/aetherion/graph/risk/helpers.py +147 -0
  103. aetherion_ai-0.1.0/aetherion/graph/sanitize.py +108 -0
  104. aetherion_ai-0.1.0/aetherion/graph/state.py +136 -0
  105. aetherion_ai-0.1.0/aetherion/graph/token_utils.py +213 -0
  106. aetherion_ai-0.1.0/aetherion/graph/utils/__init__.py +0 -0
  107. aetherion_ai-0.1.0/aetherion/graph/utils/data_fetchers.py +269 -0
  108. aetherion_ai-0.1.0/aetherion/graph/validators.py +302 -0
  109. aetherion_ai-0.1.0/aetherion/hermes_client.py +707 -0
  110. aetherion_ai-0.1.0/aetherion/llm_config.py +174 -0
  111. aetherion_ai-0.1.0/aetherion/llm_rotation.py +254 -0
  112. aetherion_ai-0.1.0/aetherion/llm_settings.py +312 -0
  113. aetherion_ai-0.1.0/aetherion/observability/__init__.py +0 -0
  114. aetherion_ai-0.1.0/aetherion/observability/bus.py +96 -0
  115. aetherion_ai-0.1.0/aetherion/observability/events.py +113 -0
  116. aetherion_ai-0.1.0/aetherion/observability/humanize.py +239 -0
  117. aetherion_ai-0.1.0/aetherion/observability/instrument.py +120 -0
  118. aetherion_ai-0.1.0/aetherion/portfolio/__init__.py +4 -0
  119. aetherion_ai-0.1.0/aetherion/portfolio/covariance.py +34 -0
  120. aetherion_ai-0.1.0/aetherion/portfolio/optimizer.py +226 -0
  121. aetherion_ai-0.1.0/aetherion/portfolio/risk_manager.py +37 -0
  122. aetherion_ai-0.1.0/aetherion/portfolio/risk_models.py +93 -0
  123. aetherion_ai-0.1.0/aetherion/skills/agent-trading-predictor/SKILL.md +18 -0
  124. aetherion_ai-0.1.0/aetherion/skills/algorithmic-trading/SKILL.md +18 -0
  125. aetherion_ai-0.1.0/aetherion/skills/analysis/SKILL.md +22 -0
  126. aetherion_ai-0.1.0/aetherion/skills/backtest/SKILL.md +12 -0
  127. aetherion_ai-0.1.0/aetherion/skills/backtest-expert/SKILL.md +17 -0
  128. aetherion_ai-0.1.0/aetherion/skills/chart-patterns/SKILL.md +53 -0
  129. aetherion_ai-0.1.0/aetherion/skills/correlation-analysis/SKILL.md +43 -0
  130. aetherion_ai-0.1.0/aetherion/skills/cross-asset-scan/SKILL.md +19 -0
  131. aetherion_ai-0.1.0/aetherion/skills/daily-ai-news/SKILL.md +22 -0
  132. aetherion_ai-0.1.0/aetherion/skills/daily-hot-news/SKILL.md +21 -0
  133. aetherion_ai-0.1.0/aetherion/skills/execution-planning/SKILL.md +18 -0
  134. aetherion_ai-0.1.0/aetherion/skills/financial-news/SKILL.md +42 -0
  135. aetherion_ai-0.1.0/aetherion/skills/macro-analysis/SKILL.md +45 -0
  136. aetherion_ai-0.1.0/aetherion/skills/market-opportunity-selection/SKILL.md +25 -0
  137. aetherion_ai-0.1.0/aetherion/skills/market-regime-analysis/SKILL.md +21 -0
  138. aetherion_ai-0.1.0/aetherion/skills/multi-timeframe-analysis/SKILL.md +22 -0
  139. aetherion_ai-0.1.0/aetherion/skills/nansen-perp-screener/SKILL.md +18 -0
  140. aetherion_ai-0.1.0/aetherion/skills/portfolio-construction/SKILL.md +25 -0
  141. aetherion_ai-0.1.0/aetherion/skills/portfolio-risk-management/SKILL.md +25 -0
  142. aetherion_ai-0.1.0/aetherion/skills/position-sizing/SKILL.md +25 -0
  143. aetherion_ai-0.1.0/aetherion/skills/price-action/SKILL.md +23 -0
  144. aetherion_ai-0.1.0/aetherion/skills/quantitative-trading-system-development/SKILL.md +18 -0
  145. aetherion_ai-0.1.0/aetherion/skills/relative-strength-ranking/SKILL.md +25 -0
  146. aetherion_ai-0.1.0/aetherion/skills/social-sentiment/SKILL.md +49 -0
  147. aetherion_ai-0.1.0/aetherion/skills/technical-analysis/SKILL.md +28 -0
  148. aetherion_ai-0.1.0/aetherion/skills/trade-setup-design/SKILL.md +32 -0
  149. aetherion_ai-0.1.0/aetherion/skills/trade-synthesis/SKILL.md +31 -0
  150. aetherion_ai-0.1.0/aetherion/skills/trading-research/SKILL.md +47 -0
  151. aetherion_ai-0.1.0/aetherion/strategies/__init__.py +3 -0
  152. aetherion_ai-0.1.0/aetherion/strategies/backtest.py +356 -0
  153. aetherion_ai-0.1.0/aetherion/strategies/base.py +81 -0
  154. aetherion_ai-0.1.0/aetherion/strategies/governance.py +94 -0
  155. aetherion_ai-0.1.0/aetherion/strategies/implementations/__init__.py +0 -0
  156. aetherion_ai-0.1.0/aetherion/strategies/implementations/chart_patterns.py +141 -0
  157. aetherion_ai-0.1.0/aetherion/strategies/implementations/mean_reversion.py +64 -0
  158. aetherion_ai-0.1.0/aetherion/strategies/implementations/neural_network.py +145 -0
  159. aetherion_ai-0.1.0/aetherion/strategies/implementations/quantum_resonance.py +337 -0
  160. aetherion_ai-0.1.0/aetherion/strategies/implementations/smart_money.py +246 -0
  161. aetherion_ai-0.1.0/aetherion/strategies/implementations/trend_following.py +76 -0
  162. aetherion_ai-0.1.0/aetherion/strategies/implementations/tsmom.py +93 -0
  163. aetherion_ai-0.1.0/aetherion/strategies/nn_overlay.py +184 -0
  164. aetherion_ai-0.1.0/aetherion/strategies/registry.py +38 -0
  165. aetherion_ai-0.1.0/aetherion/terminal/__init__.py +0 -0
  166. aetherion_ai-0.1.0/aetherion/terminal/__main__.py +48 -0
  167. aetherion_ai-0.1.0/aetherion/terminal/app.py +296 -0
  168. aetherion_ai-0.1.0/aetherion/terminal/backend_proc.py +73 -0
  169. aetherion_ai-0.1.0/aetherion/terminal/client.py +262 -0
  170. aetherion_ai-0.1.0/aetherion/terminal/demo.py +346 -0
  171. aetherion_ai-0.1.0/aetherion/terminal/launch.py +425 -0
  172. aetherion_ai-0.1.0/aetherion/terminal/palette.py +181 -0
  173. aetherion_ai-0.1.0/aetherion/terminal/store.py +666 -0
  174. aetherion_ai-0.1.0/aetherion/terminal/theme.tcss +130 -0
  175. aetherion_ai-0.1.0/aetherion/terminal/widgets/__init__.py +1 -0
  176. aetherion_ai-0.1.0/aetherion/terminal/widgets/anim.py +117 -0
  177. aetherion_ai-0.1.0/aetherion/terminal/widgets/base.py +103 -0
  178. aetherion_ai-0.1.0/aetherion/terminal/widgets/cards.py +450 -0
  179. aetherion_ai-0.1.0/aetherion/terminal/widgets/feed.py +75 -0
  180. aetherion_ai-0.1.0/aetherion/terminal/widgets/gauges.py +128 -0
  181. aetherion_ai-0.1.0/aetherion/terminal/widgets/header.py +122 -0
  182. aetherion_ai-0.1.0/aetherion/terminal/widgets/inputs.py +122 -0
  183. aetherion_ai-0.1.0/aetherion/terminal/widgets/llm.py +63 -0
  184. aetherion_ai-0.1.0/aetherion/terminal/widgets/mission.py +646 -0
  185. aetherion_ai-0.1.0/aetherion/terminal/widgets/neural.py +510 -0
  186. aetherion_ai-0.1.0/aetherion/terminal/widgets/portfolio.py +70 -0
  187. aetherion_ai-0.1.0/aetherion/terminal/widgets/recommendations.py +66 -0
  188. aetherion_ai-0.1.0/aetherion/terminal/widgets/research.py +116 -0
  189. aetherion_ai-0.1.0/aetherion/terminal/widgets/risk.py +113 -0
  190. aetherion_ai-0.1.0/aetherion/terminal/widgets/technical.py +52 -0
  191. aetherion_ai-0.1.0/aetherion/terminal/widgets/thinking.py +186 -0
  192. aetherion_ai-0.1.0/aetherion/terminal/widgets/timeline.py +225 -0
  193. aetherion_ai-0.1.0/aetherion/terminal/widgets/tree.py +341 -0
  194. aetherion_ai-0.1.0/aetherion/terminal/widgets/watchlist.py +63 -0
  195. aetherion_ai-0.1.0/aetherion/validation/__init__.py +0 -0
  196. aetherion_ai-0.1.0/aetherion/validation/walk_forward.py +1228 -0
  197. aetherion_ai-0.1.0/aetherion/web/assets/index-BAGNP01x.js +308 -0
  198. aetherion_ai-0.1.0/aetherion/web/assets/index-DkTiDX7x.css +1 -0
  199. aetherion_ai-0.1.0/aetherion/web/index.html +16 -0
  200. aetherion_ai-0.1.0/aetherion_ai.egg-info/PKG-INFO +406 -0
  201. aetherion_ai-0.1.0/aetherion_ai.egg-info/SOURCES.txt +212 -0
  202. aetherion_ai-0.1.0/aetherion_ai.egg-info/dependency_links.txt +1 -0
  203. aetherion_ai-0.1.0/aetherion_ai.egg-info/entry_points.txt +2 -0
  204. aetherion_ai-0.1.0/aetherion_ai.egg-info/requires.txt +45 -0
  205. aetherion_ai-0.1.0/aetherion_ai.egg-info/top_level.txt +1 -0
  206. aetherion_ai-0.1.0/pyproject.toml +100 -0
  207. aetherion_ai-0.1.0/setup.cfg +4 -0
  208. aetherion_ai-0.1.0/tests/test_chart_plan_and_market_gate.py +110 -0
  209. aetherion_ai-0.1.0/tests/test_correlation.py +157 -0
  210. aetherion_ai-0.1.0/tests/test_evidence.py +67 -0
  211. aetherion_ai-0.1.0/tests/test_insights.py +108 -0
  212. aetherion_ai-0.1.0/tests/test_nn_overlay.py +147 -0
  213. aetherion_ai-0.1.0/tests/test_outcome_memory.py +198 -0
  214. 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.