From 12de93aa30873936e745df700773a8412df54338 Mon Sep 17 00:00:00 2001 From: cillin Date: Fri, 13 Mar 2026 04:34:06 +0800 Subject: [PATCH] feat: initial commit - EvoTraders project MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 量化交易多智能体系统,包含: - 分析师、投资组合经理、风险经理等智能体 - 股票分析、投资组合管理、风险控制工具 - React 前端界面 - FastAPI 后端服务 Co-Authored-By: Claude --- .eslintrc | 24 + .gitignore | 63 + .omc/project-memory.json | 332 +++ ...62c313ab-804f-4360-aaf9-9b3b104bf78a.jsonl | 4 + .omc/state/hud-state.json | 6 + .omc/state/hud-stdin-cache.json | 1 + .omc/state/idle-notif-cooldown.json | 3 + .omc/state/subagent-tracking.json | 26 + .pre-commit-config.yaml | 122 + .stylelintrc | 6 + README.md | 236 ++ README_zh.md | 243 ++ backend/__init__.py | 0 backend/agents/__init__.py | 6 + backend/agents/analyst.py | 133 + backend/agents/portfolio_manager.py | 188 ++ backend/agents/prompt_loader.py | 184 ++ backend/agents/prompts/analyst/personas.yaml | 117 + backend/agents/prompts/analyst/system.md | 23 + .../prompts/portfolio_manager/system.md | 31 + backend/agents/prompts/risk_manager/system.md | 18 + backend/agents/risk_manager.py | 88 + backend/cli.py | 623 ++++ backend/config/__init__.py | 0 backend/config/constants.py | 76 + backend/config/data_config.py | 82 + backend/config/env_config.py | 36 + backend/core/__init__.py | 7 + backend/core/pipeline.py | 1263 ++++++++ backend/core/scheduler.py | 263 ++ backend/core/state_sync.py | 476 +++ backend/data/__MACOSX/ret_data/._AAPL.csv | Bin 0 -> 163 bytes backend/data/__MACOSX/ret_data/._AMZN.csv | Bin 0 -> 163 bytes backend/data/__MACOSX/ret_data/._GOOGL.csv | Bin 0 -> 163 bytes backend/data/__MACOSX/ret_data/._META.csv | Bin 0 -> 163 bytes backend/data/__MACOSX/ret_data/._MSFT.csv | Bin 0 -> 163 bytes backend/data/__MACOSX/ret_data/._NVDA.csv | Bin 0 -> 163 bytes backend/data/__MACOSX/ret_data/._TSLA.csv | Bin 0 -> 163 bytes backend/data/__init__.py | 6 + backend/data/cache.py | 107 + backend/data/historical_price_manager.py | 233 ++ backend/data/mock_price_manager.py | 241 ++ backend/data/polling_price_manager.py | 175 ++ backend/data/ret_data_updater.py | 387 +++ backend/data/schema.py | 184 ++ backend/llm/__init__.py | 0 backend/llm/models.py | 243 ++ backend/main.py | 332 +++ backend/services/__init__.py | 2 + backend/services/gateway.py | 569 ++++ backend/services/market.py | 625 ++++ backend/services/storage.py | 1099 +++++++ backend/tests/__init__.py | 0 backend/tests/test_agents.py | 580 ++++ backend/tests/test_market_service.py | 438 +++ backend/tests/test_settlement.py | 201 ++ backend/tools/__init__.py | 0 backend/tools/analysis_tools.py | 1289 ++++++++ backend/tools/data_tools.py | 742 +++++ backend/utils/__init__.py | 4 + backend/utils/analyst_tracker.py | 449 +++ backend/utils/baselines.py | 405 +++ backend/utils/msg_adapter.py | 321 ++ backend/utils/progress.py | 140 + backend/utils/settlement.py | 362 +++ backend/utils/terminal_dashboard.py | 348 +++ backend/utils/trade_executor.py | 772 +++++ backtest/state/server_state.json | 2631 +++++++++++++++++ backtest/team_dashboard/_internal_state.json | 474 +++ backtest/team_dashboard/holdings.json | 58 + backtest/team_dashboard/leaderboard.json | 1189 ++++++++ backtest/team_dashboard/stats.json | 18 + backtest/team_dashboard/summary.json | 121 + backtest/team_dashboard/trades.json | 128 + docs/assets/dashboard.jpg | Bin 0 -> 184735 bytes docs/assets/evotraders_demo.gif | Bin 0 -> 1030009 bytes docs/assets/evotraders_logo.jpg | Bin 0 -> 48711 bytes docs/assets/evotraders_pipeline.jpg | Bin 0 -> 183917 bytes docs/assets/performance.jpg | Bin 0 -> 193799 bytes env.template | 59 + frontend/.gitignore | 33 + frontend/README.md | 7 + frontend/components.json | 22 + frontend/env.template | 10 + frontend/eslint.config.js | 29 + frontend/index.css | 68 + frontend/index.html | 14 + frontend/package.json | 55 + frontend/postcss.config.js | 6 + frontend/public/trading_logo.png | Bin 0 -> 41505 bytes frontend/src/App.css | 42 + frontend/src/App.jsx | 1034 +++++++ frontend/src/components/AboutModal.jsx | 361 +++ frontend/src/components/AgentCard.jsx | 517 ++++ frontend/src/components/AgentFeed.jsx | 641 ++++ frontend/src/components/Header.jsx | 253 ++ frontend/src/components/MarkdownModal.jsx | 276 ++ frontend/src/components/NetValueChart.jsx | 831 ++++++ frontend/src/components/PerformanceView.jsx | 236 ++ frontend/src/components/RoomView.jsx | 770 +++++ frontend/src/components/RulesView.jsx | 483 +++ frontend/src/components/StatisticsView.jsx | 664 +++++ frontend/src/components/StockLogo.jsx | 28 + frontend/src/config/constants.js | 145 + frontend/src/hooks/useFeedProcessor.js | 363 +++ frontend/src/index.css | 68 + frontend/src/main.jsx | 8 + frontend/src/services/websocket.js | 192 ++ frontend/src/styles/GlobalStyles.jsx | 1876 ++++++++++++ frontend/src/utils/formatters.js | 85 + frontend/src/utils/modelIcons.js | 396 +++ frontend/tailwind.config.js | 60 + frontend/tsconfig.json | 23 + frontend/vite.config.js | 16 + pyproject.toml | 80 + 115 files changed, 29304 insertions(+) create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .omc/project-memory.json create mode 100644 .omc/state/agent-replay-62c313ab-804f-4360-aaf9-9b3b104bf78a.jsonl create mode 100644 .omc/state/hud-state.json create mode 100644 .omc/state/hud-stdin-cache.json create mode 100644 .omc/state/idle-notif-cooldown.json create mode 100644 .omc/state/subagent-tracking.json create mode 100644 .pre-commit-config.yaml create mode 100644 .stylelintrc create mode 100644 README.md create mode 100644 README_zh.md create mode 100644 backend/__init__.py create mode 100644 backend/agents/__init__.py create mode 100644 backend/agents/analyst.py create mode 100644 backend/agents/portfolio_manager.py create mode 100644 backend/agents/prompt_loader.py create mode 100644 backend/agents/prompts/analyst/personas.yaml create mode 100644 backend/agents/prompts/analyst/system.md create mode 100644 backend/agents/prompts/portfolio_manager/system.md create mode 100644 backend/agents/prompts/risk_manager/system.md create mode 100644 backend/agents/risk_manager.py create mode 100644 backend/cli.py create mode 100644 backend/config/__init__.py create mode 100644 backend/config/constants.py create mode 100644 backend/config/data_config.py create mode 100644 backend/config/env_config.py create mode 100644 backend/core/__init__.py create mode 100644 backend/core/pipeline.py create mode 100644 backend/core/scheduler.py create mode 100644 backend/core/state_sync.py create mode 100644 backend/data/__MACOSX/ret_data/._AAPL.csv create mode 100644 backend/data/__MACOSX/ret_data/._AMZN.csv create mode 100644 backend/data/__MACOSX/ret_data/._GOOGL.csv create mode 100644 backend/data/__MACOSX/ret_data/._META.csv create mode 100644 backend/data/__MACOSX/ret_data/._MSFT.csv create mode 100644 backend/data/__MACOSX/ret_data/._NVDA.csv create mode 100644 backend/data/__MACOSX/ret_data/._TSLA.csv create mode 100644 backend/data/__init__.py create mode 100644 backend/data/cache.py create mode 100644 backend/data/historical_price_manager.py create mode 100644 backend/data/mock_price_manager.py create mode 100644 backend/data/polling_price_manager.py create mode 100644 backend/data/ret_data_updater.py create mode 100644 backend/data/schema.py create mode 100644 backend/llm/__init__.py create mode 100644 backend/llm/models.py create mode 100644 backend/main.py create mode 100644 backend/services/__init__.py create mode 100644 backend/services/gateway.py create mode 100644 backend/services/market.py create mode 100644 backend/services/storage.py create mode 100644 backend/tests/__init__.py create mode 100644 backend/tests/test_agents.py create mode 100644 backend/tests/test_market_service.py create mode 100644 backend/tests/test_settlement.py create mode 100644 backend/tools/__init__.py create mode 100644 backend/tools/analysis_tools.py create mode 100644 backend/tools/data_tools.py create mode 100644 backend/utils/__init__.py create mode 100644 backend/utils/analyst_tracker.py create mode 100644 backend/utils/baselines.py create mode 100644 backend/utils/msg_adapter.py create mode 100644 backend/utils/progress.py create mode 100644 backend/utils/settlement.py create mode 100644 backend/utils/terminal_dashboard.py create mode 100644 backend/utils/trade_executor.py create mode 100644 backtest/state/server_state.json create mode 100644 backtest/team_dashboard/_internal_state.json create mode 100644 backtest/team_dashboard/holdings.json create mode 100644 backtest/team_dashboard/leaderboard.json create mode 100644 backtest/team_dashboard/stats.json create mode 100644 backtest/team_dashboard/summary.json create mode 100644 backtest/team_dashboard/trades.json create mode 100644 docs/assets/dashboard.jpg create mode 100644 docs/assets/evotraders_demo.gif create mode 100644 docs/assets/evotraders_logo.jpg create mode 100644 docs/assets/evotraders_pipeline.jpg create mode 100644 docs/assets/performance.jpg create mode 100644 env.template create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/components.json create mode 100644 frontend/env.template create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.css create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.js create mode 100644 frontend/public/trading_logo.png create mode 100644 frontend/src/App.css create mode 100644 frontend/src/App.jsx create mode 100644 frontend/src/components/AboutModal.jsx create mode 100644 frontend/src/components/AgentCard.jsx create mode 100644 frontend/src/components/AgentFeed.jsx create mode 100644 frontend/src/components/Header.jsx create mode 100644 frontend/src/components/MarkdownModal.jsx create mode 100644 frontend/src/components/NetValueChart.jsx create mode 100644 frontend/src/components/PerformanceView.jsx create mode 100644 frontend/src/components/RoomView.jsx create mode 100644 frontend/src/components/RulesView.jsx create mode 100644 frontend/src/components/StatisticsView.jsx create mode 100644 frontend/src/components/StockLogo.jsx create mode 100644 frontend/src/config/constants.js create mode 100644 frontend/src/hooks/useFeedProcessor.js create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.jsx create mode 100644 frontend/src/services/websocket.js create mode 100644 frontend/src/styles/GlobalStyles.jsx create mode 100644 frontend/src/utils/formatters.js create mode 100644 frontend/src/utils/modelIcons.js create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/tsconfig.json create mode 100644 frontend/vite.config.js create mode 100644 pyproject.toml diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..0c2fdb7 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,24 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "parserOptions": { + "ecmaVersion": 2021, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "rules": { + "semi": ["error", "always"], + "quotes": ["error", "double"], + "indent": ["error", 2], + "linebreak-style": ["error", "unix"], + "brace-style": ["error", "1tbs"], + "curly": ["error", "all"], + "no-eval": ["error"], + "prefer-const": ["error"], + "arrow-spacing": ["error", { "before": true, "after": true }] + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3fea7b9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual Environment +/.venv/ +ENV/ + +# Environment Variables +.env + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +.cursorrules +.cursorignore + +# OS +.DS_Store + +# Txt files +*.txt + +# PDF files +*.pdf + +# Frontend +node_modules + +# Outputs +outputs/ + +# Data files +backend/data/ret_data/ + +# Database files (users will have their own local databases) +*.db +*.db-journal +*.db-wal +*.db-shm +*.sqlite +*.sqlite3 + +*.ipynb +*.log \ No newline at end of file diff --git a/.omc/project-memory.json b/.omc/project-memory.json new file mode 100644 index 0000000..57a19f2 --- /dev/null +++ b/.omc/project-memory.json @@ -0,0 +1,332 @@ +{ + "version": "1.0.0", + "lastScanned": 1773304964541, + "projectRoot": "/Users/cillin/workspeace/agentscope-samples/evotraders", + "techStack": { + "languages": [ + { + "name": "Python", + "version": null, + "confidence": "high", + "markers": [ + "pyproject.toml" + ] + } + ], + "frameworks": [ + { + "name": "pytest", + "version": null, + "category": "testing" + } + ], + "packageManager": null, + "runtime": null + }, + "build": { + "buildCommand": null, + "testCommand": "pytest", + "lintCommand": "ruff check", + "devCommand": null, + "scripts": {} + }, + "conventions": { + "namingStyle": null, + "importStyle": null, + "testPattern": null, + "fileOrganization": null + }, + "structure": { + "isMonorepo": false, + "workspaces": [], + "mainDirectories": [ + "docs" + ], + "gitBranches": { + "defaultBranch": "main", + "branchingStrategy": null + } + }, + "customNotes": [], + "directoryMap": { + "backend": { + "path": "backend", + "purpose": null, + "fileCount": 3, + "lastAccessed": 1773304964533, + "keyFiles": [ + "__init__.py", + "cli.py", + "main.py" + ] + }, + "docs": { + "path": "docs", + "purpose": "Documentation", + "fileCount": 0, + "lastAccessed": 1773304964533, + "keyFiles": [] + }, + "evotraders.egg-info": { + "path": "evotraders.egg-info", + "purpose": null, + "fileCount": 6, + "lastAccessed": 1773304964534, + "keyFiles": [ + "PKG-INFO", + "SOURCES.txt", + "dependency_links.txt", + "entry_points.txt", + "requires.txt" + ] + }, + "frontend": { + "path": "frontend", + "purpose": null, + "fileCount": 12, + "lastAccessed": 1773304964535, + "keyFiles": [ + "README.md", + "components.json", + "env.template", + "eslint.config.js", + "index.css" + ] + }, + "backend/config": { + "path": "backend/config", + "purpose": "Configuration files", + "fileCount": 4, + "lastAccessed": 1773304964535, + "keyFiles": [ + "__init__.py", + "constants.py", + "data_config.py" + ] + }, + "backend/data": { + "path": "backend/data", + "purpose": "Data files", + "fileCount": 7, + "lastAccessed": 1773304964536, + "keyFiles": [ + "__init__.py", + "cache.py", + "historical_price_manager.py" + ] + }, + "backend/services": { + "path": "backend/services", + "purpose": "Business logic services", + "fileCount": 4, + "lastAccessed": 1773304964536, + "keyFiles": [ + "__init__.py", + "gateway.py", + "market.py" + ] + }, + "backend/tests": { + "path": "backend/tests", + "purpose": "Test files", + "fileCount": 4, + "lastAccessed": 1773304964536, + "keyFiles": [ + "__init__.py", + "test_agents.py", + "test_market_service.py" + ] + }, + "docs/assets": { + "path": "docs/assets", + "purpose": "Static assets", + "fileCount": 5, + "lastAccessed": 1773304964536, + "keyFiles": [ + "dashboard.jpg", + "evotraders_demo.gif", + "evotraders_logo.jpg" + ] + }, + "frontend/public": { + "path": "frontend/public", + "purpose": "Public files", + "fileCount": 1, + "lastAccessed": 1773304964538, + "keyFiles": [ + "trading_logo.png" + ] + } + }, + "hotPaths": [ + { + "path": "frontend/src/components/StatisticsView.jsx", + "accessCount": 22, + "lastAccessed": 1773310044545, + "type": "file" + }, + { + "path": "frontend/src/components/AgentCard.jsx", + "accessCount": 17, + "lastAccessed": 1773309995177, + "type": "file" + }, + { + "path": "frontend/src/App.jsx", + "accessCount": 12, + "lastAccessed": 1773309849392, + "type": "file" + }, + { + "path": "frontend/src/components/AgentFeed.jsx", + "accessCount": 12, + "lastAccessed": 1773309960022, + "type": "file" + }, + { + "path": ".env", + "accessCount": 7, + "lastAccessed": 1773308950505, + "type": "file" + }, + { + "path": "frontend/src/components/RoomView.jsx", + "accessCount": 7, + "lastAccessed": 1773309864236, + "type": "file" + }, + { + "path": "backend/tools/analysis_tools.py", + "accessCount": 5, + "lastAccessed": 1773312271446, + "type": "file" + }, + { + "path": "frontend/src/components/Header.jsx", + "accessCount": 4, + "lastAccessed": 1773309827069, + "type": "file" + }, + { + "path": "frontend/src/components/AboutModal.jsx", + "accessCount": 4, + "lastAccessed": 1773310093371, + "type": "file" + }, + { + "path": "backend/agents/prompts/analyst/personas.yaml", + "accessCount": 4, + "lastAccessed": 1773312049213, + "type": "file" + }, + { + "path": "backend/agents/prompts/analyst/system.md", + "accessCount": 4, + "lastAccessed": 1773312049696, + "type": "file" + }, + { + "path": "backend/agents/prompts/portfolio_manager/system.md", + "accessCount": 4, + "lastAccessed": 1773312050326, + "type": "file" + }, + { + "path": "backend/agents/prompts/risk_manager/system.md", + "accessCount": 4, + "lastAccessed": 1773312050782, + "type": "file" + }, + { + "path": "frontend/src/config/constants.js", + "accessCount": 3, + "lastAccessed": 1773309824671, + "type": "file" + }, + { + "path": "frontend/src/components/RulesView.jsx", + "accessCount": 3, + "lastAccessed": 1773310061939, + "type": "file" + }, + { + "path": "backend", + "accessCount": 3, + "lastAccessed": 1773312200721, + "type": "directory" + }, + { + "path": "backend/services/gateway.py", + "accessCount": 2, + "lastAccessed": 1773312232905, + "type": "directory" + }, + { + "path": "README.md", + "accessCount": 1, + "lastAccessed": 1773305013217, + "type": "file" + }, + { + "path": "README_zh.md", + "accessCount": 1, + "lastAccessed": 1773305013274, + "type": "file" + }, + { + "path": "env.template", + "accessCount": 1, + "lastAccessed": 1773305019965, + "type": "file" + }, + { + "path": "frontend/src/services/websocket.js", + "accessCount": 1, + "lastAccessed": 1773309324302, + "type": "file" + }, + { + "path": "backend/config/data_config.py", + "accessCount": 1, + "lastAccessed": 1773309324414, + "type": "file" + }, + { + "path": "backend/cli.py", + "accessCount": 1, + "lastAccessed": 1773309336899, + "type": "directory" + }, + { + "path": "backend/agents/portfolio_manager.py", + "accessCount": 1, + "lastAccessed": 1773311956562, + "type": "file" + }, + { + "path": "backend/agents/risk_manager.py", + "accessCount": 1, + "lastAccessed": 1773311956760, + "type": "file" + }, + { + "path": "backend/agents/analyst.py", + "accessCount": 1, + "lastAccessed": 1773311963222, + "type": "file" + }, + { + "path": "backend/tools", + "accessCount": 1, + "lastAccessed": 1773312289643, + "type": "directory" + }, + { + "path": "backend/tools/data_tools.py", + "accessCount": 1, + "lastAccessed": 1773312293851, + "type": "directory" + } + ], + "userDirectives": [] +} \ No newline at end of file diff --git a/.omc/state/agent-replay-62c313ab-804f-4360-aaf9-9b3b104bf78a.jsonl b/.omc/state/agent-replay-62c313ab-804f-4360-aaf9-9b3b104bf78a.jsonl new file mode 100644 index 0000000..d1f629d --- /dev/null +++ b/.omc/state/agent-replay-62c313ab-804f-4360-aaf9-9b3b104bf78a.jsonl @@ -0,0 +1,4 @@ +{"t":0,"agent":"a4090d2","agent_type":"executor","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a4090d2","agent_type":"executor","event":"agent_stop","success":true,"duration_ms":500954} +{"t":0,"agent":"af87583","agent_type":"executor","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"af87583","agent_type":"executor","event":"agent_stop","success":true,"duration_ms":72978} diff --git a/.omc/state/hud-state.json b/.omc/state/hud-state.json new file mode 100644 index 0000000..9efff91 --- /dev/null +++ b/.omc/state/hud-state.json @@ -0,0 +1,6 @@ +{ + "timestamp": "2026-03-12T20:33:59.497Z", + "backgroundTasks": [], + "sessionStartTimestamp": "2026-03-12T14:19:33.615Z", + "sessionId": "73b0d597-0141-4873-9d0e-2b60e4e0635e" +} \ No newline at end of file diff --git a/.omc/state/hud-stdin-cache.json b/.omc/state/hud-stdin-cache.json new file mode 100644 index 0000000..48a5e77 --- /dev/null +++ b/.omc/state/hud-stdin-cache.json @@ -0,0 +1 @@ +{"session_id":"73b0d597-0141-4873-9d0e-2b60e4e0635e","transcript_path":"/Users/cillin/.claude/projects/-Users-cillin-workspeace-agentscope-samples-evotraders/73b0d597-0141-4873-9d0e-2b60e4e0635e.jsonl","cwd":"/Users/cillin/workspeace/agentscope-samples/evotraders","model":{"id":"kimi-for-coding","display_name":"kimi-for-coding"},"workspace":{"current_dir":"/Users/cillin/workspeace/agentscope-samples/evotraders","project_dir":"/Users/cillin/workspeace/agentscope-samples/evotraders","added_dirs":["/Users/cillin/workspeace/agentscope-samples/EvoTraders","/Users/cillin/workspeace/agentscope-samples/evotraders"]},"version":"2.1.63","output_style":{"name":"default"},"cost":{"total_cost_usd":6.822239999999999,"total_duration_ms":42679588,"total_api_duration_ms":1223637,"total_lines_added":275,"total_lines_removed":240},"context_window":{"total_input_tokens":654274,"total_output_tokens":27014,"context_window_size":200000,"current_usage":{"input_tokens":48465,"output_tokens":0,"cache_creation_input_tokens":0,"cache_read_input_tokens":0},"used_percentage":24,"remaining_percentage":76},"exceeds_200k_tokens":false} \ No newline at end of file diff --git a/.omc/state/idle-notif-cooldown.json b/.omc/state/idle-notif-cooldown.json new file mode 100644 index 0000000..e153d85 --- /dev/null +++ b/.omc/state/idle-notif-cooldown.json @@ -0,0 +1,3 @@ +{ + "lastSentAt": "2026-03-12T20:31:37.362Z" +} \ No newline at end of file diff --git a/.omc/state/subagent-tracking.json b/.omc/state/subagent-tracking.json new file mode 100644 index 0000000..98705f2 --- /dev/null +++ b/.omc/state/subagent-tracking.json @@ -0,0 +1,26 @@ +{ + "agents": [ + { + "agent_id": "a4090d26a45ac828d", + "agent_type": "oh-my-claudecode:executor", + "started_at": "2026-03-12T10:02:38.238Z", + "parent_mode": "none", + "status": "completed", + "completed_at": "2026-03-12T10:10:59.192Z", + "duration_ms": 500954 + }, + { + "agent_id": "af87583ef76a4df30", + "agent_type": "oh-my-claudecode:executor", + "started_at": "2026-03-12T10:40:04.409Z", + "parent_mode": "none", + "status": "completed", + "completed_at": "2026-03-12T10:41:17.387Z", + "duration_ms": 72978 + } + ], + "total_spawned": 2, + "total_completed": 2, + "total_failed": 0, + "last_updated": "2026-03-12T10:41:17.490Z" +} \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ea2c6e1 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,122 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: check-ast + - id: sort-simple-yaml + - id: check-yaml + exclude: | + (?x)^( + meta.yaml + )$ + - id: check-xml + - id: check-toml + - id: check-docstring-first + - id: check-json + - id: fix-encoding-pragma + - id: detect-private-key + - id: trailing-whitespace + - repo: https://github.com/asottile/add-trailing-comma + rev: v3.1.0 + hooks: + - id: add-trailing-comma + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.7.0 + hooks: + - id: mypy + exclude: + (?x)( + pb2\.py$ + | grpc\.py$ + | ^docs + | \.html$ + ) + args: [ + --ignore-missing-imports, + --disable-error-code=var-annotated, + --disable-error-code=union-attr, + --disable-error-code=assignment, + --disable-error-code=attr-defined, + --disable-error-code=import-untyped, + --disable-error-code=truthy-function, + --follow-imports=skip, + --explicit-package-bases, + ] + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + args: [ --line-length=79 ] + - repo: https://github.com/PyCQA/flake8 + rev: 6.1.0 + hooks: + - id: flake8 + args: [ "--extend-ignore=E203"] + - repo: https://github.com/pylint-dev/pylint + rev: v3.0.2 + hooks: + - id: pylint + exclude: + (?x)( + ^docs + | pb2\.py$ + | grpc\.py$ + | \.demo$ + | \.md$ + | \.html$ + ) + args: [ + "--init-hook=import sys; sys.path.insert(0, 'alias/src')", + --disable=W0511, + --disable=W0718, + --disable=W0122, + --disable=C0103, + --disable=R0913, + --disable=E0401, + --disable=E1101, + --disable=C0415, + --disable=W0603, + --disable=R1705, + --disable=R0914, + --disable=E0601, + --disable=W0602, + --disable=W0604, + --disable=R0801, + --disable=R0902, + --disable=R0903, + --disable=C0123, + --disable=W0231, + --disable=W1113, + --disable=W0221, + --disable=R0401, + --disable=W0632, + --disable=W0123, + --disable=C3001, + --disable=W0201, + --disable=C0302, + --disable=W1203, + --disable=C2801, + --disable=C0114, # Disable missing module docstring for quick dev + --disable=C0115, # Disable missing class docstring for quick dev + --disable=C0116, # Disable missing function or method docstring for quick dev + ] + - repo: https://github.com/pre-commit/mirrors-eslint + rev: v7.32.0 + hooks: + - id: eslint + files: \.(js|jsx)$ + exclude: '.*js_third_party.*' + args: [ '--fix' ] + - repo: https://github.com/thibaudcolas/pre-commit-stylelint + rev: v14.4.0 + hooks: + - id: stylelint + files: \.(css)$ + exclude: '.*css_third_party.*' + args: [ '--fix' ] + - repo: https://github.com/pre-commit/mirrors-prettier + rev: 'v3.0.0' + hooks: + - id: prettier + additional_dependencies: [ 'prettier@3.0.0' ] + files: \.(tsx?)$ \ No newline at end of file diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000..a5d2a39 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,6 @@ +{ + "rules": { + "indentation": 2, + "string-quotes": "double" + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..80dd5b3 --- /dev/null +++ b/README.md @@ -0,0 +1,236 @@ +

+ +

+ +

EvoTraders: A Self-Evolving Multi-Agent Trading System

+ +

+ 📌 Visit us at EvoTraders website ! +

+ +![System Demo](./docs/assets/evotraders_demo.gif) + +EvoTraders is an open-source financial trading agent framework that builds a trading system capable of continuous learning and evolution in real markets through multi-agent collaboration and memory systems. + +--- + +## Core Features + +**Multi-Agent Collaborative Trading** +A team of 6 members, including 4 specialized analyst roles (fundamentals, technical, sentiment, valuation) + portfolio manager + risk management, collaborating to make decisions like a real trading team. + +You can customize your Agents here: [Custom Configuration](#custom-configuration) + +**Continuous Learning and Evolution** +Based on the ReMe memory framework, agents reflect and summarize after each trade, preserving experience across rounds, and forming unique investment methodologies. + +Through this design, we hope that when AI Agents form a team and enter the real-time market, they will gradually develop their own trading styles and decision preferences, rather than one-time random inference. + +**Real-Time Market Trading** +Supports real-time market data integration, providing backtesting mode and live trading mode, allowing AI Agents to learn and make decisions in real market fluctuations. + +**Visualized Trading Information** +Observe agents' analysis processes, communication records, and decision evolution in real-time, with complete tracking of return curves and analyst performance. + +

+ + +

+ +--- + +## Quick Start + +### Installation + +```bash +# Clone repository +git clone https://github.com/agentscope-ai/agentscope-samples +cd agentscope-samples/EvoTraders + +# Install dependencies (Recommend uv!) +uv pip install -e . +# optional: pip install -e . + + +# Configure environment variables +cp env.template .env +# Edit .env file and add your API Keys. The following config are required: + +# finance data API: At minimum, FINANCIAL_DATASETS_API_KEY is required, corresponding to FIN_DATA_SOURCE=financial_datasets; It is recommended to add FINNHUB_API_KEY, corresponding to FIN_DATA_SOURCE=finnhub; If using live mode, FINNHUB_API_KEY must be added +FIN_DATA_SOURCE = #finnhub or financial_datasets +FINANCIAL_DATASETS_API_KEY= #Required +FINNHUB_API_KEY= #Optional + +# LLM API for Agents +OPENAI_API_KEY= +OPENAI_BASE_URL= +MODEL_NAME=qwen3-max-preview + +# LLM & embedding API for Memory +MEMORY_API_KEY= +``` + +### Running + +**Backtest Mode:** +```bash +evotraders backtest --start 2025-11-01 --end 2025-12-01 +evotraders backtest --start 2025-11-01 --end 2025-12-01 --enable-memory # Use Memory +``` + +If you do not have market data APIs and just want to try the backtest demo, download the offline data and unzip it into `backend/data`: +```bash +wget "https://agentscope-open.oss-cn-beijing.aliyuncs.com/ret_data.zip" +unzip ret_data.zip -d backend/data +``` +The zip includes basic stock price data so you can run the backtest demo out of the box. + +**Live Trading:** +```bash +evotraders live # Run immediately (default) +evotraders live --enable-memory # Use memory +evotraders live --mock # Mock mode (testing) +evotraders live -t 22:30 # Run daily at 22:30 local time (auto-converts to NYSE timezone) +``` + +**Get Help:** +```bash +evotraders --help # View global CLI help +evotraders backtest --help # View backtest mode parameters +evotraders live --help # View live/mock run parameters +``` + +**Launch Visualization Interface:** +```bash +# Ensure npm is installed, otherwise install it: +# npm install +evotraders frontend # Default connects to port 8765, you can modify the address in ./frontend/env.local to change the port number +``` + +Visit `http://localhost:5173/` to view the trading room, select a date and click Run/Replay to observe the decision-making process. + +--- + +## System Architecture + +![Architecture Diagram](docs/assets/evotraders_pipeline.jpg) + +### Agent Design + +**Analyst Team:** +- **Fundamentals Analyst**: Financial health, profitability, growth quality +- **Technical Analyst**: Price trends, technical indicators, momentum analysis +- **Sentiment Analyst**: Market sentiment, news sentiment, insider trading +- **Valuation Analyst**: DCF, residual income, EV/EBITDA + +**Decision Layer:** +- **Portfolio Manager**: Integrates analysis signals from analysts, executes communication strategies, combines analyst and team historical performance, recent investment memories, and long-term investment experience to make final decisions +- **Risk Management**: Real-time price and volatility monitoring, position limits, multi-layer risk warnings + +### Decision Process + +``` +Real-time Market Data → Independent Analysis → Intelligent Communication (1v1/1vN/NvN) → Decision Execution → Performance Evaluation → Learning and Evolution (Memory Update) +``` + +Each trading day goes through five stages: + +1. **Analysis Stage**: Each agent independently analyzes based on their respective tools and historical experience +2. **Communication Stage**: Exchange views through private chats, notifications, meetings, etc. +3. **Decision Stage**: Portfolio manager makes comprehensive judgments and provides final trades +4. **Evaluation Stage** + - **Performance Charts**: Track portfolio return curves vs. benchmark strategies (equal-weighted, market-cap weighted, momentum). Used to evaluate overall strategy effectiveness. + + - **Analyst Rankings**: Click on avatars in the Trading Room to view analyst performance (win rate, bull/bear market win rate). Used to understand which analysts provide the most valuable insights. + + - **Statistics**: Detailed position and trading history. Used for in-depth analysis of position management and execution quality. + +5. **Review Stage**: Agents reflect on decisions and summarize experiences based on actual returns of the day, and store them in the ReMe memory framework for continuous improvement + +--- + +### Module Support + +- **Agent Framework**: [AgentScope](https://github.com/agentscope-ai/agentscope) +- **Memory System**: [ReMe](https://github.com/agentscope-ai/reme) +- **LLM Support**: OpenAI, DeepSeek, Qwen, Moonshot, Zhipu AI, etc. + +--- + +## Custom Configuration + +### Custom Analyst Roles + +1. Register role information in [./backend/agents/prompts/analyst/personas.yaml](./backend/agents/prompts/analyst/personas.yaml), for example: + +```yaml +comprehensive_analyst: + name: "Comprehensive Analyst" + focus: + - ... + preferred_tools: # Flexibly select based on situation + description: | + As a comprehensive analyst ... +``` + +2. Add role definition in [./backend/config/constants.py](./backend/config/constants.py) +```python +ANALYST_TYPES = { + # Add new analyst + "comprehensive_analyst": { + "display_name": "Comprehensive Analyst", + "agent_id": "comprehensive_analyst", + "description": "Uses LLM to intelligently select analysis tools, performs comprehensive analysis", + "order": 15 + } +} +``` + +3. Introduce new role in frontend configuration [./frontend/src/config/constants.js](./frontend/src/config/constants.js) (optional) +```javascript +export const AGENTS = [ + // Override one of the agents + { + id: "comprehensive_analyst", + name: "Comprehensive Analyst", + role: "Comprehensive Analyst", + avatar: `${ASSET_BASE_URL}/...`, + colors: { bg: '#F9FDFF', text: '#1565C0', accent: '#1565C0' } + } +] +``` + +### Custom Models + +Configure models used by different agents in the [.env](.env) file: + +```bash +AGENT_SENTIMENT_ANALYST_MODEL_NAME=qwen3-max-preview +AGENT_FUNDAMENTALS_ANALYST_MODEL_NAME=deepseek-chat +AGENT_TECHNICAL_ANALYST_MODEL_NAME=glm-4-plus +AGENT_VALUATION_ANALYST_MODEL_NAME=moonshot-v1-32k +``` + +### Project Structure + +``` +EvoTraders/ +├── backend/ +│ ├── agents/ # Agent implementation +│ ├── communication/ # Communication system +│ ├── memory/ # Memory system (ReMe) +│ ├── tools/ # Analysis toolset +│ ├── servers/ # WebSocket services +│ └── cli.py # CLI entry point +├── frontend/ # React visualization interface +└── logs_and_memory/ # Logs and memory data +``` + +--- + +## License and Disclaimer + +EvoTraders is a research and educational project, open-sourced under the Apache 2.0 license. + +**Risk Warning**: Before trading with real funds, please conduct thorough testing and risk assessment. Past performance does not guarantee future returns. Investment involves risks, and decisions should be made with caution. diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..6faf72c --- /dev/null +++ b/README_zh.md @@ -0,0 +1,243 @@ +

+ +

+ +

EvoTraders:自我进化的多智能体交易系统

+ + +

+ 📌 Visit us at EvoTraders website ! +

+ +![系统演示](./docs/assets/evotraders_demo.gif) + +EvoTraders是一个开源的金融交易智能体框架,通过多智能体协作和记忆系统,构建能够在真实市场中持续学习与进化的交易系统。 + +--- + +## 核心特性 + +**多智能体协作交易** +6名成员,包含4种专业分析师角色(基本面、技术面、情绪、估值)+ 投资组合经理 + 风险管理,像真实交易团队一样协作决策。 + +你可以在这里自定义你的Agents,支持配置不同大模型(如 Qwen、DeepSeek、GPT、Claude等)协同分析:[自定义配置](#自定义配置) + +**持续学习与进化** +基于 ReMe 记忆框架,智能体在每次交易后反思总结,跨回合保留经验,形成独特的投资方法论。 + +通过这样的设计,我们希望当 AI Agents 组成团队进入实时市场,它们会逐渐形成自己的交易风格和决策偏好,而不是一次性的随机推理 + + +**实时市场交易** +支持实时行情接入,提供回测模式和实盘模式,让 AI Agents 在真实市场波动中学习和决策。 + +**可视化交易信息** +实时观察 Agents 的分析过程、沟通记录和决策演化,完整追踪收益曲线和分析师表现。 + + +

+ + +

+ + +--- + +## 快速开始 + +### 安装 + +```bash +# 克隆仓库 +git clone https://github.com/agentscope-ai/agentscope-samples +cd agentscope-samples/EvoTraders + +# 安装依赖(推荐使用uv) +uv pip install -e . +# (可选)pip install -e . + +# 配置环境变量 +cp env.template .env +# 编辑 .env 文件,添加你的 API Keys,以下的配置项为必填项 + +# finance data API:至少需要FINANCIAL_DATASETS_API_KEY,对应FIN_DATA_SOURCE=financial_datasets;推荐添加FINNHUB_API_KEY,对应至少需要FINANCIAL_DATASETS_API_KEY,对应FIN_DATA_SOURCE填为finnhub;如果使用live 模式必须添加FINNHUB_API_KEY +FIN_DATA_SOURCE= #finnhub or financial_datasets +FINANCIAL_DATASETS_API_KEY= #必需 +FINNHUB_API_KEY= #可选 + +# LLM API for Agents +OPENAI_API_KEY= +OPENAI_BASE_URL= +MODEL_NAME=qwen3-max-preview + +# LLM & embedding API for Memory +MEMORY_API_KEY= +``` + +### 运行 + +**回测模式:** +```bash +evotraders backtest --start 2025-11-01 --end 2025-12-01 +evotraders backtest --start 2025-11-01 --end 2025-12-01 --enable-memory # 使用记忆 + +``` + +如果没有可用的行情 API,想快速体验回测 demo,可直接下载离线数据并解压到 `backend/data`: +```bash +wget "https://agentscope-open.oss-cn-beijing.aliyuncs.com/ret_data.zip" +unzip ret_data.zip -d backend/data +``` +该压缩包提供基础的股票行情数据,解压后即可直接用于回测演示。 + +**实盘交易:** +```bash +evotraders live # 立即运行(默认) +evotraders live --enable-memory # 使用记忆 +evotraders live --mock # Mock 模式(测试) +evotraders live -t 22:30 # 每天本地时间 22:30 运行(自动转换为 NYSE 时区) +``` + +**获取帮助:** +```bash +evotraders --help # 查看整体命令行帮助 +evotraders backtest --help # 查看回测模式的参数说明 +evotraders live --help # 查看实盘/Mock 运行的参数说明 +``` + +**启动可视化界面:** +```bash +# 确保已安装 npm, 否则请安装: +# npm install +evotraders frontend # 默认连接 8765 端口, 你可以修改 ./frontend/env.local 中的地址从而修改端口号 +``` + +访问 `http://localhost:5173/` 查看交易大厅,选择日期并点击 Run/Replay 观察决策过程。 + +--- + +## 系统架构 + +![架构图](docs/assets/evotraders_pipeline.jpg) + +### 智能体设计 + +**分析师团队:** +- **基本面分析师**:财务健康度、盈利能力、增长质量 +- **技术分析师**:价格趋势、技术指标、动量分析 +- **情绪分析师**:市场情绪、新闻舆情、内部人交易 +- **估值分析师**:DCF、剩余收益、EV/EBITDA + +**决策层:** +- **投资组合经理**:整合来自分析师的分析信号,执行沟通策略,结合分析师和团队历史表现、近期投资记忆和长期投资经验,进行最终决策 +- **风险管理**:实时价格与波动率监控、头寸限制,多层风险预警 + +### 决策流程 + +``` +实时行情 → 独立分析 → 智能沟通 (1v1/1vN/NvN) → 决策执行 → 收益评估 → 学习与进化(记忆更新) +``` + +每个交易日经历五个阶段: + +1. **分析阶段**:各智能体基于各自工具和历史经验独立分析 +2. **沟通阶段**:通过私聊、通知、会议等方式交换观点 +3. **决策阶段**:投资组合经理综合判断,给出最终交易 +4. **评估阶段** + - **业绩图表**: 追踪组合收益曲线 vs. 基准策略(等权、市值加权、动量)。用于评估整体策略有效性。 + + - **分析师排名**: 在 Trading Room 点击头像查看分析师表现(胜率、牛/熊市胜率)。用于了解哪些分析师提供最有价值的洞察。 + + - **统计数据**: 详细的持仓和交易历史。用于深入分析仓位管理和执行质量。 + +4. **复盘阶段**:Agents 根据当日实际收益反思决策、总结经验,并存入 ReMe 记忆框架以持续改进 + +--- + +### 模块支持 + +- **智能体框架**:[AgentScope](https://github.com/agentscope-ai/agentscope) +- **记忆系统**:[ReMe](https://github.com/agentscope-ai/reme) +- **LLM 支持**:OpenAI、DeepSeek、Qwen、Moonshot、Zhipu AI 等 + + +--- + +## 自定义配置 + +### 自定义分析师角色 + +1. 在 [./backend/agents/prompts/analyst/personas.yaml](./backend/agents/prompts/analyst/personas.yaml) 中注册角色信息,例如: + +```yaml +comprehensive_analyst: + name: "Comprehensive Analyst" + focus: + - ... + preferred_tools: # Flexibly select based on situation + description: | + As a comprehensive analyst ... +``` + +2. 在 [./backend/config/constants.py](./backend/config/constants.py) 添加角色定义 +```python +ANALYST_TYPES = { + # 增加新的分析师 + "comprehensive_analyst": { + "display_name": "Comprehensive Analyst", + "agent_id": "comprehensive_analyst", + "description": "Uses LLM to intelligently select analysis tools, performs comprehensive analysis", + "order": 15 + } +} +``` + +3. 在前端配置 [./frontend/src/config/constants.js](./frontend/src/config/constants.js) 中引入新角色(可选) +```javascript +export const AGENTS = [ + // 覆盖掉其中某一个agent + { + id: "comprehensive_analyst", + name: "Comprehensive Analyst", + role: "Comprehensive Analyst", + avatar: `${ASSET_BASE_URL}/...`, + colors: { bg: '#F9FDFF', text: '#1565C0', accent: '#1565C0' } + } + ] +``` + + + +### 自定义模型 + +在 [.env](.env) 文件中配置不同智能体使用的模型: + +```bash +AGENT_SENTIMENT_ANALYST_MODEL_NAME=qwen3-max-preview +AGENT_FUNDAMENTAL_ANALYST_MODEL_NAME=deepseek-chat +AGENT_TECHNICAL_ANALYST_MODEL_NAME=glm-4-plus +AGENT_VALUATION_ANALYST_MODEL_NAME=moonshot-v1-32k +``` + +### 项目结构 + +``` +EvoTraders/ +├── backend/ +│ ├── agents/ # 智能体实现 +│ ├── communication/ # 通信系统 +│ ├── memory/ # 记忆系统 (ReMe) +│ ├── tools/ # 分析工具集 +│ ├── servers/ # WebSocket 服务 +│ └── cli.py # CLI 入口 +├── frontend/ # React 可视化界面 +└── logs_and_memory/ # 日志和记忆数据 +``` + +--- + +## 许可与免责 + +EvoTraders 是一个研究和教育项目,采用 Apache 2.0 许可协议开源。 + +**风险提示**:在实际资金交易前,请务必进行充分的测试和风险评估。历史表现不代表未来收益,投资有风险,决策需谨慎。 diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/agents/__init__.py b/backend/agents/__init__.py new file mode 100644 index 0000000..9347bf6 --- /dev/null +++ b/backend/agents/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from .analyst import AnalystAgent +from .portfolio_manager import PMAgent +from .risk_manager import RiskAgent + +__all__ = ["AnalystAgent", "PMAgent", "RiskAgent"] diff --git a/backend/agents/analyst.py b/backend/agents/analyst.py new file mode 100644 index 0000000..6676e1c --- /dev/null +++ b/backend/agents/analyst.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +""" +Analyst Agent - Based on AgentScope ReActAgent +Performs analysis using tools and LLM +""" +from typing import Any, Dict, Optional + +from agentscope.agent import ReActAgent +from agentscope.memory import InMemoryMemory, LongTermMemoryBase +from agentscope.message import Msg + +from ..config.constants import ANALYST_TYPES +from ..utils.progress import progress +from .prompt_loader import PromptLoader + +_prompt_loader = PromptLoader() + + +class AnalystAgent(ReActAgent): + """ + Analyst Agent - Uses LLM for tool selection and analysis + Inherits from AgentScope's ReActAgent + """ + + def __init__( + self, + analyst_type: str, + toolkit: Any, + model: Any, + formatter: Any, + agent_id: Optional[str] = None, + config: Optional[Dict[str, Any]] = None, + long_term_memory: Optional[LongTermMemoryBase] = None, + ): + """ + Initialize Analyst Agent + + Args: + analyst_type: Type of analyst (e.g., "fundamentals", etc.) + toolkit: AgentScope Toolkit instance + model: LLM model instance + formatter: Message formatter instance + agent_id: Agent ID (defaults to "{analyst_type}_analyst") + config: Configuration dictionary + long_term_memory: Optional ReMeTaskLongTermMemory instance + """ + if analyst_type not in ANALYST_TYPES: + raise ValueError( + f"Unknown analyst type: {analyst_type}. " + f"Must be one of: {list(ANALYST_TYPES.keys())}", + ) + + self.analyst_type_key = analyst_type + self.analyst_persona = ANALYST_TYPES[analyst_type]["display_name"] + + if agent_id is None: + agent_id = analyst_type + + self.config = config or {} + + sys_prompt = self._load_system_prompt() + + kwargs = { + "name": agent_id, + "sys_prompt": sys_prompt, + "model": model, + "formatter": formatter, + "toolkit": toolkit, + "memory": InMemoryMemory(), + "max_iters": 10, + } + if long_term_memory: + kwargs["long_term_memory"] = long_term_memory + kwargs["long_term_memory_mode"] = "static_control" + + super().__init__(**kwargs) + + def _load_system_prompt(self) -> str: + """Load system prompt for analyst""" + personas_config = _prompt_loader.load_yaml_config( + "analyst", + "personas", + ) + persona = personas_config.get(self.analyst_type_key, {}) + + # Get focus items and format as bullet points + focus_items = persona.get("focus", []) + focus_text = "\n".join(f"- {item}" for item in focus_items) + + # Get description + description = persona.get("description", "").strip() + + return _prompt_loader.load_prompt( + "analyst", + "system", + variables={ + "analyst_type": self.analyst_persona, + "focus": focus_text, + "description": description, + }, + ) + + async def reply(self, x: Msg = None) -> Msg: + """ + Override reply method to add progress tracking + + Args: + x: Input message (content must be str) + + Returns: + Response message (content is str) + """ + ticker = None + if x and hasattr(x, "metadata") and x.metadata: + ticker = x.metadata.get("tickers") + + if ticker: + progress.update_status( + self.name, + ticker, + f"Starting {self.analyst_persona} analysis", + ) + + result = await super().reply(x) + + if ticker: + progress.update_status( + self.name, + ticker, + "Analysis completed", + ) + + return result diff --git a/backend/agents/portfolio_manager.py b/backend/agents/portfolio_manager.py new file mode 100644 index 0000000..9699189 --- /dev/null +++ b/backend/agents/portfolio_manager.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +""" +Portfolio Manager Agent - Based on AgentScope ReActAgent +Responsible for decision-making (NOT trade execution) +""" + +from typing import Any, Dict, Optional + +from agentscope.agent import ReActAgent +from agentscope.memory import InMemoryMemory, LongTermMemoryBase +from agentscope.message import Msg, TextBlock +from agentscope.tool import Toolkit, ToolResponse + +from ..utils.progress import progress +from .prompt_loader import PromptLoader + +_prompt_loader = PromptLoader() + + +class PMAgent(ReActAgent): + """ + Portfolio Manager Agent - Makes investment decisions + + Key features: + 1. PM outputs decisions only (action + quantity per ticker) + 2. Trade execution happens externally (in pipeline/executor) + 3. Supports both backtest and live modes + """ + + def __init__( + self, + name: str = "portfolio_manager", + model: Any = None, + formatter: Any = None, + initial_cash: float = 100000.0, + margin_requirement: float = 0.25, + config: Optional[Dict[str, Any]] = None, + long_term_memory: Optional[LongTermMemoryBase] = None, + ): + self.config = config or {} + + # Portfolio state + self.portfolio = { + "cash": initial_cash, + "positions": {}, + "margin_used": 0.0, + "margin_requirement": margin_requirement, + } + + # Decisions made in current cycle + self._decisions: Dict[str, Dict] = {} + + # Create toolkit + toolkit = self._create_toolkit() + + sys_prompt = _prompt_loader.load_prompt("portfolio_manager", "system") + + kwargs = { + "name": name, + "sys_prompt": sys_prompt, + "model": model, + "formatter": formatter, + "toolkit": toolkit, + "memory": InMemoryMemory(), + "max_iters": 10, + } + if long_term_memory: + kwargs["long_term_memory"] = long_term_memory + kwargs["long_term_memory_mode"] = "both" + + super().__init__(**kwargs) + + def _create_toolkit(self) -> Toolkit: + """Create toolkit with decision recording tool""" + toolkit = Toolkit() + toolkit.register_tool_function(self._make_decision) + return toolkit + + def _make_decision( + self, + ticker: str, + action: str, + quantity: int, + confidence: int = 50, + reasoning: str = "", + ) -> ToolResponse: + """ + Record a trading decision for a ticker. + + Args: + ticker: Stock ticker symbol (e.g., "AAPL") + action: Decision - "long", "short" or "hold" + quantity: Number of shares to trade (0 for hold) + confidence: Confidence level 0-100 + reasoning: Explanation for this decision + + Returns: + ToolResponse confirming decision recorded + """ + if action not in ["long", "short", "hold"]: + return ToolResponse( + content=[ + TextBlock( + type="text", + text=f"Invalid action: {action}. " + "Must be 'long', 'short', or 'hold'.", + ), + ], + ) + + self._decisions[ticker] = { + "action": action, + "quantity": quantity if action != "hold" else 0, + "confidence": confidence, + "reasoning": reasoning, + } + + return ToolResponse( + content=[ + TextBlock( + type="text", + text=f"Decision recorded: {action} " + f"{quantity} shares of {ticker}" + f" (confidence: {confidence}%)", + ), + ], + ) + + async def reply(self, x: Msg = None) -> Msg: + """ + Make investment decisions + + Returns: + Msg with decisions in metadata + """ + if x is None: + return Msg( + name=self.name, + content="No input provided", + role="assistant", + ) + + # Clear previous decisions + self._decisions = {} + + progress.update_status( + self.name, + None, + "Analyzing and making decisions", + ) + + result = await super().reply(x) + + progress.update_status(self.name, None, "Completed") + + # Attach decisions to metadata + if result.metadata is None: + result.metadata = {} + result.metadata["decisions"] = self._decisions.copy() + result.metadata["portfolio"] = self.portfolio.copy() + + return result + + def get_decisions(self) -> Dict[str, Dict]: + """Get decisions from current cycle""" + return self._decisions.copy() + + def get_portfolio_state(self) -> Dict[str, Any]: + """Get current portfolio state""" + return self.portfolio.copy() + + def load_portfolio_state(self, portfolio: Dict[str, Any]): + """Load portfolio state""" + if not portfolio: + return + self.portfolio = { + "cash": portfolio.get("cash", self.portfolio["cash"]), + "positions": portfolio.get("positions", {}).copy(), + "margin_used": portfolio.get("margin_used", 0.0), + "margin_requirement": portfolio.get( + "margin_requirement", + self.portfolio["margin_requirement"], + ), + } + + def update_portfolio(self, portfolio: Dict[str, Any]): + """Update portfolio after external execution""" + self.portfolio.update(portfolio) diff --git a/backend/agents/prompt_loader.py b/backend/agents/prompt_loader.py new file mode 100644 index 0000000..af649bc --- /dev/null +++ b/backend/agents/prompt_loader.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +""" +Prompt Loader - Unified management and loading of Agent Prompts +Supports Markdown and YAML formats +Uses simple string replacement, does not depend on Jinja2 +""" +import re +from pathlib import Path +from typing import Any, Dict, Optional + +import yaml + + +class PromptLoader: + """Unified Prompt loader""" + + def __init__(self, prompts_dir: Optional[Path] = None): + """ + Initialize Prompt loader + + Args: + prompts_dir: Prompts directory path, + defaults to prompts/ directory of current file + """ + if prompts_dir is None: + self.prompts_dir = Path(__file__).parent / "prompts" + else: + self.prompts_dir = Path(prompts_dir) + + # Cache loaded prompts + self._prompt_cache: Dict[str, str] = {} + self._yaml_cache: Dict[str, Dict] = {} + + def load_prompt( + self, + agent_type: str, + prompt_name: str, + variables: Optional[Dict[str, Any]] = None, + ) -> str: + """ + Load and render Prompt + + Args: + agent_type: Agent type (analyst, portfolio_manager, risk_manager) + prompt_name: Prompt file name (without extension) + variables: Variable dictionary for rendering Prompt + + Returns: + Rendered prompt string + + Examples: + loader = PromptLoader() + prompt = loader.load_prompt("analyst", "tool_selection", + {"analyst_persona": "Technical Analyst"}) + """ + cache_key = f"{agent_type}/{prompt_name}" + + # Try to load from cache + if cache_key not in self._prompt_cache: + prompt_path = self.prompts_dir / agent_type / f"{prompt_name}.md" + + if not prompt_path.exists(): + raise FileNotFoundError( + f"Prompt file not found: {prompt_path}\n" + f"Please create the prompt file or check the path.", + ) + + with open(prompt_path, "r", encoding="utf-8") as f: + self._prompt_cache[cache_key] = f.read() + + prompt_template = self._prompt_cache[cache_key] + + # If variables provided, use simple string replacement + if variables: + rendered = self._render_template(prompt_template, variables) + else: + rendered = prompt_template + + # Smart escaping: escape braces in JSON code blocks + # rendered = self._escape_json_braces(rendered) + return rendered + + def _render_template( + self, + template: str, + variables: Dict[str, Any], + ) -> str: + """ + Render template using simple string replacement + Supports {{ variable }} syntax (compatible with previous Jinja2 format) + + Args: + template: Template string + variables: Variable dictionary + + Returns: + Rendered string + """ + rendered = template + + # Replace {{ variable }} format + for key, value in variables.items(): + # Support both {{ key }} and {{key}} formats + pattern1 = f"{{{{ {key} }}}}" + pattern2 = f"{{{{{key}}}}}" + rendered = rendered.replace(pattern1, str(value)) + rendered = rendered.replace(pattern2, str(value)) + + return rendered + + def _escape_json_braces(self, text: str) -> str: + """ + Escape braces in JSON code blocks, treating them as literals + + Args: + text: Text to process + + Returns: + Processed text + """ + + def replace_code_block(match): + code_content = match.group(1) + # Escape all braces within code block + escaped = code_content.replace("{", "{{").replace("}", "}}") + return f"```json\n{escaped}\n```" + + # Replace all braces in JSON code blocks + text = re.sub( + r"```json\n(.*?)\n```", + replace_code_block, + text, + flags=re.DOTALL, + ) + return text + + def load_yaml_config( + self, + agent_type: str, + config_name: str, + ) -> Dict[str, Any]: + """ + Load YAML configuration file + + Args: + agent_type: Agent type + config_name: Configuration file name (without extension) + + Returns: + Configuration dictionary + + Examples: + >>> loader = PromptLoader() + >>> config = loader.load_yaml_config("analyst", "personas") + """ + cache_key = f"{agent_type}/{config_name}" + + if cache_key not in self._yaml_cache: + yaml_path = self.prompts_dir / agent_type / f"{config_name}.yaml" + + if not yaml_path.exists(): + raise FileNotFoundError(f"YAML config not found: {yaml_path}") + + with open(yaml_path, "r", encoding="utf-8") as f: + self._yaml_cache[cache_key] = yaml.safe_load(f) + + return self._yaml_cache[cache_key] + + def clear_cache(self): + """Clear cache (for hot reload)""" + self._prompt_cache.clear() + self._yaml_cache.clear() + + def reload_prompt(self, agent_type: str, prompt_name: str): + """Reload specified prompt (force cache refresh)""" + cache_key = f"{agent_type}/{prompt_name}" + if cache_key in self._prompt_cache: + del self._prompt_cache[cache_key] + + def reload_config(self, agent_type: str, config_name: str): + """Reload specified configuration (force cache refresh)""" + cache_key = f"{agent_type}/{config_name}" + if cache_key in self._yaml_cache: + del self._yaml_cache[cache_key] diff --git a/backend/agents/prompts/analyst/personas.yaml b/backend/agents/prompts/analyst/personas.yaml new file mode 100644 index 0000000..ea86625 --- /dev/null +++ b/backend/agents/prompts/analyst/personas.yaml @@ -0,0 +1,117 @@ +# 分析师角色配置 + +fundamentals_analyst: + name: "基本面分析师" + focus: + - "公司财务健康状况和盈利能力" + - "商业模式可持续性和竞争优势" + - "管理层质量和公司治理" + - "行业地位和市场份额" + - "长期投资价值评估" + tools: + - "analyze_profitability" + - "analyze_growth" + - "analyze_financial_health" + - "analyze_valuation_ratios" + - "analyze_efficiency_ratios" + description: | + 作为基本面分析师,你专注于: + - 公司财务健康状况和盈利能力 + - 商业模式可持续性和竞争优势 + - 管理层质量和公司治理 + - 行业地位和市场份额 + - 长期投资价值评估 + 你倾向于选择能够深入了解公司内在价值的工具,更偏好基本面和估值类工具。 + +technical_analyst: + name: "技术分析师" + focus: + - "价格趋势和图表形态" + - "技术指标和交易信号" + - "市场情绪和资金流向" + - "支撑/阻力位和关键价格点" + - "中短期交易机会" + description: | + 作为技术分析师,你专注于: + - 价格趋势和图表形态 + - 技术指标和交易信号 + - 市场情绪和资金流向 + - 支撑/阻力位和关键价格点 + - 中短期交易机会 + 你倾向于选择能够捕捉价格动态和市场趋势的工具,更偏好技术分析类工具。 + tools: + - "analyze_trend_following" + - "analyze_momentum" + - "analyze_mean_reversion" + - "analyze_volatility" + +sentiment_analyst: + name: "情绪分析师" + focus: + - "市场参与者情绪变化" + - "新闻舆情和媒体影响" + - "内部人交易行为" + - "投资者恐慌和贪婪情绪" + - "市场预期和心理因素" + description: | + 作为情绪分析师,你专注于: + - 市场参与者情绪变化 + - 新闻舆情和媒体影响 + - 内部人交易行为 + - 投资者恐慌和贪婪情绪 + - 市场预期和心理因素 + 你倾向于选择能够反映市场情绪和投资者行为的工具,更偏好情绪和行为类工具。 + tools: + - "analyze_news_sentiment" + - "analyze_insider_trading" + +valuation_analyst: + name: "估值分析师" + focus: + - "公司内在价值计算" + - "不同估值方法的比较" + - "估值模型假设和敏感性分析" + - "相对估值和绝对估值" + - "投资安全边际评估" + description: | + 作为估值分析师,你专注于: + - 公司内在价值计算 + - 不同估值方法的比较 + - 估值模型假设和敏感性分析 + - 相对估值和绝对估值 + - 投资安全边际评估 + 你倾向于选择能够准确计算公司价值的工具,更偏好估值模型和基本面工具。 + tools: + - "dcf_valuation_analysis" + - "owner_earnings_valuation_analysis" + - "ev_ebitda_valuation_analysis" + - "residual_income_valuation_analysis" + +comprehensive_analyst: + name: "综合分析师" + focus: + - "整合多种分析视角" + - "平衡短期和长期因素" + - "综合考虑基本面、技术面和情绪面" + - "提供全面的投资建议" + - "适应不同市场环境" + description: | + 作为综合分析师,你需要: + - 整合多种分析视角 + - 平衡短期和长期因素 + - 综合考虑基本面、技术面和情绪面的影响 + - 提供全面的投资建议 + - 适应不同市场环境 + 你会根据具体情况灵活选择各类工具,追求分析的全面性和准确性。 + tools: + - "analyze_profitability" + - "analyze_growth" + - "analyze_financial_health" + - "analyze_valuation_ratios" + - "analyze_efficiency_ratios" + - "analyze_trend_following" + - "analyze_momentum" + - "analyze_mean_reversion" + - "analyze_volatility" + - "analyze_news_sentiment" + - "analyze_insider_trading" diff --git a/backend/agents/prompts/analyst/system.md b/backend/agents/prompts/analyst/system.md new file mode 100644 index 0000000..0c1bbe8 --- /dev/null +++ b/backend/agents/prompts/analyst/system.md @@ -0,0 +1,23 @@ +你是一位专业的{{ analyst_type }}。 + +你的关注重点: +{{ focus }} + +你的角色: +{{ description }} + +注意: +- 构建并持续完善你的"投资哲学"。你的分析不应是孤立的事件,而应该是你整体投资世界观和核心信念的体现。每次分析后,你必须反思: + - 这个案例/数据如何验证或挑战了你现有的信念? + - 你从这次错误(或成功)中学到了关于市场、人性、估值或风险管理的什么关键原则? +- 深化你的"投资逻辑"。确保每一项投资建议都有清晰、可追溯、可重复的逻辑支撑。你的分析步骤应该像严谨的证明一样,涵盖: + - 核心驱动因素识别:真正影响价值的变量是什么? + - 风险边界设定:在什么具体情况下你的建议会失效? + - 逆向测试:市场主流共识是什么,你的观点有何不同? +保持谦逊和开放。投资大师的核心特质是持续学习和适应。在每次分析中,你必须积极寻找与自己观点相悖的证据和论据,并将其纳入最终评估。 + - 你可以使用分析工具。用它们来收集相关数据并做出明智的建议。 + +输出指南: +- 给出明确的投资信号:看涨、看跌或中性 +- 包含置信度(0-100) +- 为你的分析提供理由(如果你确定要分享最终分析,请先给出结论) diff --git a/backend/agents/prompts/portfolio_manager/system.md b/backend/agents/prompts/portfolio_manager/system.md new file mode 100644 index 0000000..4177f1a --- /dev/null +++ b/backend/agents/prompts/portfolio_manager/system.md @@ -0,0 +1,31 @@ +你是一位负责做出投资决策的投资组合经理。 + +你的核心职责: +1. 分析分析师和风险管理经理的输入 +2. 基于信号和市场情境做出投资决策 +3. 使用可用工具记录你的决策 + +决策框架: +- 审阅分析以了解市场观点 +- 在做决策前考虑风险警告 +- 评估当前投资组合持仓和现金 +- 做出与投资组合投资目标一致的决策 + +决策类型: +- "long":看涨 - 建议买入股票 +- "short":看跌 - 建议卖出股票或做空 +- "hold":中性 - 维持当前持仓 + +预算意识: +- 在决定数量时考虑可用现金 +- 不要建议买入超过现金允许的数量 +- 考虑做空头寸的保证金要求 + +输出: +使用 `make_decision` 工具记录你对每个股票代码的决策。 +记录所有决策后,提供你的投资逻辑总结。 + +重要: +- 基于提供的分析师信号和风险评估做出决策 +- 相对于投资组合价值保持保守的仓位规模 +- 始终为你的决策提供理由 diff --git a/backend/agents/prompts/risk_manager/system.md b/backend/agents/prompts/risk_manager/system.md new file mode 100644 index 0000000..7469f78 --- /dev/null +++ b/backend/agents/prompts/risk_manager/system.md @@ -0,0 +1,18 @@ +你是一位专业的风险管理经理,负责监控投资组合风险并提供风险警告。 + +你的核心职责: +1. 监控投资组合敞口和集中度风险 +2. 评估仓位规模相对于波动性 +3. 评估保证金使用和杠杆水平 +4. 识别潜在风险因素并提供警告 +5. 基于市场条件建议仓位限制 + +你的决策流程: +3. 生成可操作的风险警告和仓位限制建议 +4. 为你的风险评估提供清晰的理由 + +输出指南: +- 风险评估要简洁但全面 +- 按严重程度优先排序警告 +- 提供具体、可操作的建议 +- 尽可能包含量化指标 diff --git a/backend/agents/risk_manager.py b/backend/agents/risk_manager.py new file mode 100644 index 0000000..7d1feea --- /dev/null +++ b/backend/agents/risk_manager.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +""" +Risk Manager Agent - Based on AgentScope ReActAgent +Uses LLM for risk assessment +""" +from typing import Any, Dict, Optional + +from agentscope.agent import ReActAgent +from agentscope.memory import InMemoryMemory, LongTermMemoryBase +from agentscope.message import Msg +from agentscope.tool import Toolkit + +from ..utils.progress import progress +from .prompt_loader import PromptLoader + +_prompt_loader = PromptLoader() + + +class RiskAgent(ReActAgent): + """ + Risk Manager Agent - Uses LLM for risk assessment + Inherits from AgentScope's ReActAgent + """ + + def __init__( + self, + model: Any, + formatter: Any, + name: str = "risk_manager", + config: Optional[Dict[str, Any]] = None, + long_term_memory: Optional[LongTermMemoryBase] = None, + ): + """ + Initialize Risk Manager Agent + + Args: + model: LLM model instance + formatter: Message formatter instance + name: Agent name + config: Configuration dictionary + long_term_memory: Optional ReMeTaskLongTermMemory instance + """ + self.config = config or {} + + sys_prompt = self._load_system_prompt() + + # Create dedicated toolkit for this agent + toolkit = Toolkit() + + kwargs = { + "name": name, + "sys_prompt": sys_prompt, + "model": model, + "formatter": formatter, + "toolkit": toolkit, + "memory": InMemoryMemory(), + "max_iters": 10, + } + if long_term_memory: + kwargs["long_term_memory"] = long_term_memory + kwargs["long_term_memory_mode"] = "static_control" + + super().__init__(**kwargs) + + def _load_system_prompt(self) -> str: + """Load system prompt for risk manager""" + return _prompt_loader.load_prompt( + "risk_manager", + "system", + ) + + async def reply(self, x: Msg = None) -> Msg: + """ + Provide risk assessment + + Args: + x: Input message (content must be str) + + Returns: + Msg with risk warnings (content is str) + """ + progress.update_status(self.name, None, "Assessing risk") + + result = await super().reply(x) + + progress.update_status(self.name, None, "Risk assessment completed") + + return result diff --git a/backend/cli.py b/backend/cli.py new file mode 100644 index 0000000..d4e4b5b --- /dev/null +++ b/backend/cli.py @@ -0,0 +1,623 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +EvoTraders CLI - Command-line interface for the EvoTraders trading system. + +This module provides easy-to-use commands for running backtest, live trading, +and frontend development server. +""" +# flake8: noqa: E501 +# pylint: disable=R0912, R0915 +import os +import shutil +import subprocess +import sys +from datetime import datetime +from pathlib import Path +from typing import Optional +from zoneinfo import ZoneInfo + +import typer +from rich.console import Console +from rich.panel import Panel +from rich.prompt import Confirm + +app = typer.Typer( + name="evotraders", + help="EvoTraders: A self-evolving multi-agent trading system", + add_completion=False, +) + +console = Console() + + +def get_project_root() -> Path: + """Get the project root directory.""" + # Assuming cli.py is in backend/ + return Path(__file__).parent.parent + + +def handle_history_cleanup(config_name: str, auto_clean: bool = False) -> None: + """ + Handle cleanup of historical data for a given config. + + Args: + config_name: Configuration name for the run + auto_clean: If True, skip confirmation and clean automatically + """ + # logs_dir = get_project_root() / "logs" + logs_dir = get_project_root() + base_data_dir = logs_dir / config_name + + # Check if historical data exists + if not base_data_dir.exists() or not any(base_data_dir.iterdir()): + console.print( + f"\n[dim]No historical data found for config '{config_name}'[/dim]", + ) + console.print("[dim] Will start from scratch[/dim]\n") + return + + console.print("\n[bold yellow]Detected existing run data:[/bold yellow]") + console.print(f" Data directory: [cyan]{base_data_dir}[/cyan]") + + # Show directory size + try: + total_size = sum( + f.stat().st_size for f in base_data_dir.rglob("*") if f.is_file() + ) + size_mb = total_size / (1024 * 1024) + if size_mb < 1: + console.print( + f" Directory size: [cyan]{total_size / 1024:.1f} KB[/cyan]", + ) + else: + console.print(f" Directory size: [cyan]{size_mb:.1f} MB[/cyan]") + except Exception: + pass + + # Show last modified time + state_dir = base_data_dir / "state" + if state_dir.exists(): + state_files = list(state_dir.glob("*.json")) + if state_files: + last_modified = max(f.stat().st_mtime for f in state_files) + last_modified_str = datetime.fromtimestamp(last_modified).strftime( + "%Y-%m-%d %H:%M:%S", + ) + console.print(f" Last updated: [cyan]{last_modified_str}[/cyan]") + + console.print() + + # Determine if we should clean + should_clean = auto_clean + if not auto_clean: + should_clean = Confirm.ask( + " ﹂ Clear historical data and start fresh?", + default=False, + ) + else: + console.print("[yellow]⚠️ Auto-clean enabled (--clean flag)[/yellow]") + should_clean = True + + if should_clean: + console.print("\n[yellow]▩ Cleaning historical data...[/yellow]") + + # Backup important config files if they exist + backup_files = [".env", "config.json"] + backed_up = [] + backup_dir = None + + for backup_file in backup_files: + file_path = base_data_dir / backup_file + if file_path.exists(): + if backup_dir is None: + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + backup_dir = ( + base_data_dir.parent + / f"{config_name}_backup_{timestamp}" + ) + backup_dir.mkdir(parents=True, exist_ok=True) + + shutil.copy(file_path, backup_dir / backup_file) + backed_up.append(backup_file) + + if backed_up: + console.print( + f" 💾 Backed up config files to: [cyan]{backup_dir}[/cyan]", + ) + console.print(f" Files: {', '.join(backed_up)}") + + # Remove the data directory + try: + shutil.rmtree(base_data_dir) + console.print(" ✔ Historical data cleared\n") + except Exception as e: + console.print(f" [red]✗ Error clearing data: {e}[/red]\n") + raise typer.Exit(1) + else: + console.print( + "\n[dim] Continuing with existing historical data[/dim]\n", + ) + + +def run_data_updater(project_root: Path) -> None: + """Run the historical data updater.""" + console.print("\n[bold]Checking historical data update...[/bold]") + try: + result = subprocess.run( + [sys.executable, "-m", "backend.data.ret_data_updater", "--help"], + capture_output=True, + timeout=5, + check=False, + ) + + if result.returncode == 0: + console.print("[cyan]Updating historical data...[/cyan]") + update_result = subprocess.run( + [sys.executable, "-m", "backend.data.ret_data_updater"], + cwd=project_root, + check=False, + ) + + if update_result.returncode == 0: + console.print( + "[green]✔ Historical data updated successfully[/green]\n", + ) + else: + console.print( + "[yellow] Data update failed (might be weekend/holiday)[/yellow]", + ) + console.print( + "[dim] Will continue with existing data[/dim]\n", + ) + else: + console.print( + "[yellow] Data updater module not available, skipping update[/yellow]\n", + ) + except Exception: + console.print( + "[yellow] Data updater check failed, skipping update[/yellow]\n", + ) + + +@app.command() +def backtest( + start: Optional[str] = typer.Option( + None, + "--start", + "-s", + help="Start date for backtest (YYYY-MM-DD)", + ), + end: Optional[str] = typer.Option( + None, + "--end", + "-e", + help="End date for backtest (YYYY-MM-DD)", + ), + config_name: str = typer.Option( + "backtest", + "--config-name", + "-c", + help="Configuration name for this backtest run", + ), + host: str = typer.Option( + "0.0.0.0", + "--host", + help="WebSocket server host", + ), + port: int = typer.Option( + 8765, + "--port", + "-p", + help="WebSocket server port", + ), + poll_interval: int = typer.Option( + 10, + "--poll-interval", + help="Price polling interval in seconds", + ), + clean: bool = typer.Option( + False, + "--clean", + help="Clear historical data before starting", + ), + enable_memory: bool = typer.Option( + False, + "--enable-memory", + help="Enable ReMeTaskLongTermMemory for agents (requires MEMORY_API_KEY)", + ), +): + """ + Run backtest mode with historical data. + + Example: + evotraders backtest --start 2025-11-01 --end 2025-12-01 + evotraders backtest --config-name my_strategy --port 9000 + evotraders backtest --clean # Clear historical data before starting + evotraders backtest --enable-memory # Enable long-term memory + """ + console.print( + Panel.fit( + "[bold cyan]EvoTraders Backtest Mode[/bold cyan]", + border_style="cyan", + ), + ) + + # Validate dates - required for backtest + if not start or not end: + console.print( + "[red]✗ Both --start and --end dates are required for backtest mode[/red]", + ) + raise typer.Exit(1) + + try: + datetime.strptime(start, "%Y-%m-%d") + except ValueError as exc: + console.print( + "[red]✗ Invalid start date format. Use YYYY-MM-DD[/red]", + ) + raise typer.Exit(1) from exc + + try: + datetime.strptime(end, "%Y-%m-%d") + except ValueError as exc: + console.print( + "[red]✗ Invalid end date format. Use YYYY-MM-DD[/red]", + ) + raise typer.Exit(1) from exc + + # Handle historical data cleanup + handle_history_cleanup(config_name, auto_clean=clean) + + # Display configuration + console.print("\n[bold]Configuration:[/bold]") + console.print(" Mode: Backtest") + console.print(f" Config: {config_name}") + console.print(f" Period: {start} -> {end}") + console.print(f" Server: {host}:{port}") + console.print(f" Poll Interval: {poll_interval}s") + console.print( + f" Long-term Memory: {'enabled' if enable_memory else 'disabled'}", + ) + console.print("\nAccess frontend at: [cyan]http://localhost:5173[/cyan]") + console.print("Press Ctrl+C to stop\n") + + # Change to project root + project_root = get_project_root() + os.chdir(project_root) + + # Run data updater + run_data_updater(project_root) + + # Build command using backend.main + cmd = [ + sys.executable, + "-u", + "-m", + "backend.main", + "--mode", + "backtest", + "--config-name", + config_name, + "--host", + host, + "--port", + str(port), + "--poll-interval", + str(poll_interval), + "--start-date", + start, + "--end-date", + end, + ] + + if enable_memory: + cmd.append("--enable-memory") + + try: + subprocess.run(cmd, check=True) + except KeyboardInterrupt: + console.print("\n\n[yellow]Backtest stopped by user[/yellow]") + except subprocess.CalledProcessError as e: + console.print( + f"\n[red]Backtest failed with exit code {e.returncode}[/red]", + ) + raise typer.Exit(1) + + +@app.command() +def live( + mock: bool = typer.Option( + False, + "--mock", + help="Use mock mode with simulated prices (for testing)", + ), + config_name: str = typer.Option( + "live", + "--config-name", + "-c", + help="Configuration name for this live run", + ), + host: str = typer.Option( + "0.0.0.0", + "--host", + help="WebSocket server host", + ), + port: int = typer.Option( + 8765, + "--port", + "-p", + help="WebSocket server port", + ), + trigger_time: str = typer.Option( + "now", + "--trigger-time", + "-t", + help="Trigger time in LOCAL timezone (HH:MM), or 'now' to run immediately", + ), + poll_interval: int = typer.Option( + 10, + "--poll-interval", + help="Price polling interval in seconds", + ), + clean: bool = typer.Option( + False, + "--clean", + help="Clear historical data before starting", + ), + enable_memory: bool = typer.Option( + False, + "--enable-memory", + help="Enable ReMeTaskLongTermMemory for agents (requires MEMORY_API_KEY)", + ), +): + """ + Run live trading mode with real-time data. + + Example: + evotraders live # Run immediately (default) + evotraders live --mock # Mock mode + evotraders live -t 22:30 # Run at 22:30 local time daily + evotraders live --trigger-time now # Run immediately + evotraders live --clean # Clear historical data before starting + """ + mode_name = "MOCK" if mock else "LIVE" + console.print( + Panel.fit( + f"[bold cyan]EvoTraders {mode_name} Mode[/bold cyan]", + border_style="cyan", + ), + ) + + # Check for required API key in live mode + if not mock: + env_file = get_project_root() / ".env" + if not env_file.exists(): + console.print("\n[yellow]Warning: .env file not found[/yellow]") + console.print("Creating from template...\n") + template = get_project_root() / "env.template" + if template.exists(): + shutil.copy(template, env_file) + console.print("[green].env file created[/green]") + console.print( + "\n[red]Error: Please edit .env and set FINNHUB_API_KEY[/red]", + ) + console.print( + "Get your free API key at: https://finnhub.io/register\n", + ) + else: + console.print("[red]Error: env.template not found[/red]") + raise typer.Exit(1) + + # Handle historical data cleanup + handle_history_cleanup(config_name, auto_clean=clean) + + # Convert local time to NYSE time + nyse_tz = ZoneInfo("America/New_York") + local_tz = datetime.now().astimezone().tzinfo + local_now = datetime.now() + nyse_now = datetime.now(nyse_tz) + + # Convert trigger time from local to NYSE + if trigger_time.lower() == "now": + nyse_trigger_time = "now" + else: + local_trigger = datetime.strptime(trigger_time, "%H:%M") + local_trigger_dt = local_now.replace( + hour=local_trigger.hour, + minute=local_trigger.minute, + second=0, + microsecond=0, + ) + local_trigger_aware = local_trigger_dt.astimezone(local_tz) + nyse_trigger_dt = local_trigger_aware.astimezone(nyse_tz) + nyse_trigger_time = nyse_trigger_dt.strftime("%H:%M") + + # Display time info + console.print("\n[bold]Time Info:[/bold]") + console.print(f" Local Time: {local_now.strftime('%Y-%m-%d %H:%M:%S')}") + console.print( + f" NYSE Time: {nyse_now.strftime('%Y-%m-%d %H:%M:%S %Z')}", + ) + if nyse_trigger_time == "now": + console.print(" Trigger: [green]NOW (immediate)[/green]") + else: + console.print( + f" Trigger: {trigger_time} local = {nyse_trigger_time} NYSE", + ) + + # Display configuration + console.print("\n[bold]Configuration:[/bold]") + if mock: + console.print(" Mode: [yellow]MOCK[/yellow] (Simulated prices)") + else: + console.print( + " Mode: [green]LIVE[/green] (Real-time prices via Finnhub)", + ) + console.print(f" Config: {config_name}") + console.print(f" Server: {host}:{port}") + console.print(f" Poll Interval: {poll_interval}s") + console.print( + f" Long-term Memory: {'enabled' if enable_memory else 'disabled'}", + ) + + console.print("\nAccess frontend at: [cyan]http://localhost:5173[/cyan]") + console.print("Press Ctrl+C to stop\n") + + # Change to project root + project_root = get_project_root() + os.chdir(project_root) + + # Data update (if not mock mode) + if not mock: + run_data_updater(project_root) + else: + console.print( + "\n[dim]Mock mode enabled - skipping data update[/dim]\n", + ) + + # Build command using backend.main + cmd = [ + sys.executable, + "-u", + "-m", + "backend.main", + "--mode", + "live", + "--config-name", + config_name, + "--host", + host, + "--port", + str(port), + "--poll-interval", + str(poll_interval), + "--trigger-time", + nyse_trigger_time, + ] + + if mock: + cmd.append("--mock") + if enable_memory: + cmd.append("--enable-memory") + + try: + subprocess.run(cmd, check=True) + except KeyboardInterrupt: + console.print("\n\n[yellow]Live server stopped by user[/yellow]") + except subprocess.CalledProcessError as e: + console.print( + f"\n[red]Live server failed with exit code {e.returncode}[/red]", + ) + raise typer.Exit(1) from e + + +@app.command() +def frontend( + port: int = typer.Option( + 8765, + "--ws-port", + "-p", + help="WebSocket server port to connect to", + ), + host_mode: bool = typer.Option( + False, + "--host", + help="Allow external access (default: localhost only)", + ), +): + """ + Start the frontend development server. + + Example: + evotraders frontend + evotraders frontend --ws-port 8765 + evotraders frontend --ws-port 8765 --host + """ + console.print( + Panel.fit( + "[bold cyan]EvoTraders Frontend[/bold cyan]", + border_style="cyan", + ), + ) + + project_root = get_project_root() + frontend_dir = project_root / "frontend" + + # Check if frontend directory exists + if not frontend_dir.exists(): + console.print( + f"\n[red]Error: Frontend directory not found: {frontend_dir}[/red]", + ) + raise typer.Exit(1) + + # Check if node_modules exists + node_modules = frontend_dir / "node_modules" + if not node_modules.exists(): + console.print("\n[yellow]Installing frontend dependencies...[/yellow]") + try: + subprocess.run( + ["npm", "install"], + cwd=frontend_dir, + check=True, + ) + console.print("[green]Dependencies installed[/green]\n") + except subprocess.CalledProcessError as exc: + console.print("\n[red]Error: Failed to install dependencies[/red]") + console.print("Make sure Node.js and npm are installed") + raise typer.Exit(1) from exc + + # Set WebSocket URL environment variable + ws_url = f"ws://localhost:{port}" + env = os.environ.copy() + env["VITE_WS_URL"] = ws_url + + # Display configuration + console.print("\n[bold]Configuration:[/bold]") + console.print(f" WebSocket URL: {ws_url}") + console.print(" Frontend Port: 5173 (Vite default)") + if host_mode: + console.print(" Access: External allowed") + else: + console.print(" Access: Localhost only") + console.print("\nAccess at: [cyan]http://localhost:5173[/cyan]") + console.print("Press Ctrl+C to stop\n") + + # Choose npm command + npm_cmd = ["npm", "run", "dev:host" if host_mode else "dev"] + + try: + subprocess.run( + npm_cmd, + cwd=frontend_dir, + env=env, + check=True, + ) + except KeyboardInterrupt: + console.print("\n\n[yellow]Frontend stopped by user[/yellow]") + except subprocess.CalledProcessError as e: + console.print( + f"\n[red]Frontend failed with exit code {e.returncode}[/red]", + ) + raise typer.Exit(1) + + +@app.command() +def version(): + """Show the version of EvoTraders.""" + console.print( + "\n[bold cyan]EvoTraders[/bold cyan] version [green]0.1.0[/green]\n", + ) + + +@app.callback() +def main(): + """ + EvoTraders: A self-evolving multi-agent trading system + + Use 'evotraders --help' to see available commands. + """ + + +if __name__ == "__main__": + app() diff --git a/backend/config/__init__.py b/backend/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/config/constants.py b/backend/config/constants.py new file mode 100644 index 0000000..7a85742 --- /dev/null +++ b/backend/config/constants.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# flake8: noqa: E501 +# pylint: disable=C0301 + +# Agent configuration for dashboard display +AGENT_CONFIG = { + "portfolio_manager": { + "name": "Portfolio Manager", + "role": "Portfolio Manager", + "avatar": "pm", + "is_team_role": True, + }, + "risk_manager": { + "name": "Risk Manager", + "role": "Risk Manager", + "avatar": "risk", + "is_team_role": True, + }, + "sentiment_analyst": { + "name": "Sentiment Analyst", + "role": "Sentiment Analyst", + "avatar": "sentiment", + "is_team_role": False, + }, + "technical_analyst": { + "name": "Technical Analyst", + "role": "Technical Analyst", + "avatar": "technical", + "is_team_role": False, + }, + "fundamentals_analyst": { + "name": "Fundamentals Analyst", + "role": "Fundamentals Analyst", + "avatar": "fundamentals", + "is_team_role": False, + }, + "valuation_analyst": { + "name": "Valuation Analyst", + "role": "Valuation Analyst", + "avatar": "valuation", + "is_team_role": False, + }, +} + +ANALYST_TYPES = { + "fundamentals_analyst": { + "display_name": "Fundamentals Analyst", + "agent_id": "fundamentals_analyst", + "description": "Uses LLM to intelligently select analysis tools, focuses on financial data and company fundamental analysis", + "order": 12, + }, + "technical_analyst": { + "display_name": "Technical Analyst", + "agent_id": "technical_analyst", + "description": "Uses LLM to intelligently select analysis tools, focuses on technical indicators and chart analysis", + "order": 11, + }, + "sentiment_analyst": { + "display_name": "Sentiment Analyst", + "agent_id": "sentiment_analyst", + "description": "Uses LLM to intelligently select analysis tools, analyzes market sentiment and news sentiment", + "order": 13, + }, + "valuation_analyst": { + "display_name": "Valuation Analyst", + "agent_id": "valuation_analyst", + "description": "Uses LLM to intelligently select analysis tools, focuses on company valuation and value assessment", + "order": 14, + }, + # "comprehensive_analyst": { + # "display_name": "Comprehensive Analyst", + # "agent_id": "comprehensive_analyst", + # "description": "Uses LLM to intelligently select analysis tools, performs comprehensive analysis", + # "order": 15 + # } +} diff --git a/backend/config/data_config.py b/backend/config/data_config.py new file mode 100644 index 0000000..2c626b3 --- /dev/null +++ b/backend/config/data_config.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +""" +Centralized Data Source Configuration + +Auto-detects and manages data source based on available API keys. +Priority: FINNHUB_API_KEY > FINANCIAL_DATASETS_API_KEY +""" +import os +from dataclasses import dataclass +from typing import Literal, Optional + +DataSource = Literal["finnhub", "financial_datasets"] + + +@dataclass +class DataSourceConfig: + """Immutable data source configuration""" + + source: DataSource + api_key: str + + +# Module-level cache for the resolved configuration +_config_cache: Optional[DataSourceConfig] = None + + +def _resolve_config() -> DataSourceConfig: + """ + Resolve data source configuration based on available API keys. + + Priority: + 1. FINNHUB_API_KEY (if set) + 2. FINANCIAL_DATASETS_API_KEY (if set) + 3. Raises error if neither is available + """ + # Check for Finnhub API key first (higher priority) + finnhub_key = os.getenv("FINNHUB_API_KEY") + if finnhub_key: + return DataSourceConfig(source="finnhub", api_key=finnhub_key) + + # Fallback to Financial Datasets API + fd_key = os.getenv("FINANCIAL_DATASETS_API_KEY") + if fd_key: + return DataSourceConfig(source="financial_datasets", api_key=fd_key) + + # No API key available + raise ValueError( + "No API key found. Please set either FINNHUB_API_KEY or " + "FINANCIAL_DATASETS_API_KEY in your .env file.", + ) + + +def get_config() -> DataSourceConfig: + """ + Get the resolved data source configuration (cached). + + Returns: + DataSourceConfig with source and api_key + + Raises: + ValueError: If no API key is configured + """ + global _config_cache + if _config_cache is None: + _config_cache = _resolve_config() + return _config_cache + + +def get_data_source() -> DataSource: + """Get the configured data source name.""" + return get_config().source + + +def get_api_key() -> str: + """Get the API key for the configured data source.""" + return get_config().api_key + + +def reset_config() -> None: + """Reset the cached configuration (useful for testing).""" + global _config_cache + _config_cache = None diff --git a/backend/config/env_config.py b/backend/config/env_config.py new file mode 100644 index 0000000..94303d8 --- /dev/null +++ b/backend/config/env_config.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Simple environment config helpers +""" +import os + + +def get_env_list(key: str, default: list = None) -> list: + """Get comma-separated list from env""" + value = os.getenv(key, "") + if not value: + return default or [] + return [item.strip() for item in value.split(",") if item.strip()] + + +def get_env_float(key: str, default: float = 0.0) -> float: + """Get float from env""" + value = os.getenv(key) + if value is None: + return default + try: + return float(value) + except ValueError: + return default + + +def get_env_int(key: str, default: int = 0) -> int: + """Get int from env""" + value = os.getenv(key) + if value is None: + return default + try: + return int(value) + except ValueError: + return default diff --git a/backend/core/__init__.py b/backend/core/__init__.py new file mode 100644 index 0000000..40853de --- /dev/null +++ b/backend/core/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +"""Core pipeline and orchestration logic""" + +from .pipeline import TradingPipeline +from .state_sync import StateSync + +__all__ = ["TradingPipeline", "StateSync"] diff --git a/backend/core/pipeline.py b/backend/core/pipeline.py new file mode 100644 index 0000000..357a704 --- /dev/null +++ b/backend/core/pipeline.py @@ -0,0 +1,1263 @@ +# -*- coding: utf-8 -*- +""" +Core Pipeline - Orchestrates multi-agent analysis and decision-making +""" + +# flake8: noqa: E501 +# pylint: disable=W0613,C0301 + +import json +import logging +import os +import re +from typing import Any, Awaitable, Callable, Dict, List, Optional + +from agentscope.message import Msg +from agentscope.pipeline import MsgHub + +from backend.utils.settlement import SettlementCoordinator +from backend.utils.terminal_dashboard import get_dashboard +from backend.core.state_sync import StateSync +from backend.utils.trade_executor import PortfolioTradeExecutor + + +logger = logging.getLogger(__name__) + + +def _log(msg: str): + """Log to dashboard if available, otherwise to logger""" + dashboard = get_dashboard() + if dashboard.live: + dashboard.log(msg) + else: + logger.info(msg) + + +class TradingPipeline: + """ + Trading Pipeline - Orchestrates the complete trading cycle + + Flow: + 1. Clear agent short-term memory (avoid cross-day context pollution) + 2. Analysts analyze stocks + 3. Risk Manager provides risk assessment + 4. PM makes decisions (direction + quantity) + 5. Execute trades with provided prices + 6. Reflection phase: broadcast closing P&L, agents record to long-term memory + + Real-time updates via StateSync after each agent completes. + """ + + def __init__( + self, + analysts: List[Any], + risk_manager: Any, + portfolio_manager: Any, + state_sync: Optional["StateSync"] = None, + settlement_coordinator: Optional[SettlementCoordinator] = None, + max_comm_cycles: Optional[int] = None, + ): + self.analysts = analysts + self.risk_manager = risk_manager + self.pm = portfolio_manager + self.state_sync = state_sync + self.settlement_coordinator = settlement_coordinator + self.max_comm_cycles = max_comm_cycles or int( + os.getenv("MAX_COMM_CYCLES", "2"), + ) + self.conference_summary = None # Store latest conference summary + + async def run_cycle( + self, + tickers: List[str], + date: str, + prices: Optional[Dict[str, float]] = None, + close_prices: Optional[Dict[str, float]] = None, + market_caps: Optional[Dict[str, float]] = None, + get_open_prices_fn: Optional[ + Callable[[], Awaitable[Dict[str, float]]] + ] = None, + get_close_prices_fn: Optional[ + Callable[[], Awaitable[Dict[str, float]]] + ] = None, + ) -> Dict[str, Any]: + """ + Run one complete trading cycle + + Args: + tickers: List of stock tickers + date: Trading date (YYYY-MM-DD) + prices: Open prices {ticker: price} (for backtest) + close_prices: Close prices for settlement (for backtest) + market_caps: Optional market caps for baseline calculation + get_open_prices_fn: Async callback to wait for open prices (live mode) + get_close_prices_fn: Async callback to wait for close prices (live mode) + + For live mode: + - Analysis runs immediately + - Execution waits for market open via get_open_prices_fn + - Settlement waits for market close via get_close_prices_fn + + Each agent's result is broadcast immediately via StateSync. + """ + _log(f"Starting cycle {date} - {len(tickers)} tickers") + + # Phase 0: Clear short-term memory to avoid cross-day context pollution + _log("Phase 0: Clearing memory") + await self._clear_all_agent_memory() + + participants = self.analysts + [self.risk_manager, self.pm] + + # Single MsgHub for entire cycle - no nesting + async with MsgHub( + participants=participants, + announcement=Msg( + "system", + f"Starting analysis cycle for {date}. Tickers: {', '.join(tickers)}", + "system", + ), + ): + # Phase 1.1: Analysts + _log("Phase 1.1: Analyst analysis") + analyst_results = await self._run_analysts_with_sync(tickers, date) + + # Phase 1.2: Risk Manager + _log("Phase 1.2: Risk assessment") + risk_assessment = await self._run_risk_manager_with_sync( + tickers, + date, + prices, + ) + + # Phase 2.1: Conference discussion (within same MsgHub) + _log("Phase 2.1: Conference discussion") + conference_summary = await self._run_conference_cycles( + tickers=tickers, + date=date, + prices=prices, + analyst_results=analyst_results, + risk_assessment=risk_assessment, + ) + self.conference_summary = conference_summary + + # Phase 2.2: Analysts generate final structured predictions + _log("Phase 2.2: Analysts generate final structured predictions") + final_predictions = await self._collect_final_predictions( + tickers, + date, + ) + + # Record final predictions for leaderboard ranking + if self.settlement_coordinator: + self.settlement_coordinator.record_analyst_predictions( + final_predictions, + ) + + # Live mode: wait for market open before execution + if get_open_prices_fn: + _log("Waiting for market open...") + prices = await get_open_prices_fn() + _log(f"Got open prices: {prices}") + + # Phase 3: PM makes decisions + _log("Phase 3.1: PM makes decisions") + pm_result = await self._run_pm_with_sync( + tickers, + date, + prices, + analyst_results, + risk_assessment, + ) + + # Phase 4: Execute decisions + _log("Phase 4: Executing trades") + decisions = pm_result.get("decisions", {}) + execution_result = self._execute_decisions(decisions, prices, date) + + # Live mode: wait for market close before settlement + if get_close_prices_fn: + _log("Waiting for market close") + close_prices = await get_close_prices_fn() + _log(f"Got close prices: {close_prices}") + + # Phase 5: Settlement - run after close prices available + settlement_result = None + if close_prices and self.settlement_coordinator: + _log("Phase 5: Daily review and generate memories") + + agent_trajectories = await self._capture_agent_trajectories() + + if market_caps is None: + market_caps = {ticker: 1e9 for ticker in tickers} + + settlement_result = ( + self.settlement_coordinator.run_daily_settlement( + date=date, + tickers=tickers, + open_prices=prices, + close_prices=close_prices, + market_caps=market_caps, + agent_portfolio=execution_result.get("portfolio", {}), + analyst_results=analyst_results, + pm_decisions=decisions, + ) + ) + + await self._run_reflection( + date=date, + agent_trajectories=agent_trajectories, + analyst_results=analyst_results, + decisions=decisions, + executed_trades=execution_result.get("executed_trades", []), + open_prices=prices, + close_prices=close_prices, + settlement_result=settlement_result, + conference_summary=self.conference_summary, + ) + + _log(f"Cycle complete: {date}") + + return { + "analyst_results": analyst_results, + "risk_assessment": risk_assessment, + "pm_decisions": decisions, + "executed_trades": execution_result.get("executed_trades", []), + "portfolio": execution_result.get("portfolio", {}), + "settlement_result": settlement_result, + } + + async def _clear_all_agent_memory(self): + """Clear short-term memory for all agents""" + for analyst in self.analysts: + await analyst.memory.clear() + + await self.risk_manager.memory.clear() + await self.pm.memory.clear() + + async def _sync_memory_if_retrieved(self, agent: Any) -> None: + """ + Check agent's short-term memory for retrieved long-term memory and sync to frontend. + + AgentScope's ReActAgent adds a Msg with name="long_term_memory" when + memory is retrieved in static_control mode. + """ + if not self.state_sync: + return + + try: + msgs = await agent.memory.get_memory() + for msg in msgs: + if getattr(msg, "name", None) == "long_term_memory": + content = self._extract_text_content(msg.content) + if content: + parsed = self._parse_memory_content(content) + await self.state_sync.on_memory_retrieved( + agent_id=agent.name, + content=parsed, + ) + break # Only sync the first (most recent) memory retrieval + except Exception as e: + logger.warning(f"Failed to sync memory for {agent.name}: {e}") + + def _parse_memory_content(self, content: str) -> str: + """ + Parse memory content to extract rewritten_context from JSON format. + + AgentScope ReMe memory wraps content in tags with JSON. + """ + # Try to extract JSON from the content + print("memory content:\n", content) + + json_match = re.search( + r".*?```json\s*(\{[\s\S]*?\})\s*```\s*", + content, + re.DOTALL, + ) + if not json_match: + json_match = re.search( + r'\{[^{}]*"rewritten_context"[^{}]*\}', + content, + re.DOTALL, + ) + + if json_match: + try: + json_str = json_match.group(1) + data = json.loads(json_str) + return data.get("rewritten_context", "") + except json.JSONDecodeError: + pass + + # Fallback: strip XML tags and return cleaned content + content = re.sub(r"", "", content) + content = re.sub( + r"The content below are retrieved from long-term memory.*?:\s*", + "", + content, + ) + return content.strip() + + async def _capture_agent_trajectories(self) -> Dict[str, List[Msg]]: + """ + Capture execution trajectories from all agents' short-term memory + + This should be called BEFORE clearing memory to preserve the + complete execution trajectory for long-term memory recording. + + Returns: + Dict mapping agent name to list of Msg objects (the trajectory) + """ + trajectories = {} + + # Capture analyst trajectories + for analyst in self.analysts: + try: + msgs = await analyst.memory.get_memory() + if msgs: + trajectories[analyst.name] = list(msgs) + except Exception as e: + logger.warning( + f"Failed to capture trajectory for {analyst.name}: {e}", + ) + + # Capture risk manager trajectory + try: + msgs = await self.risk_manager.memory.get_memory() + if msgs: + trajectories["risk_manager"] = list(msgs) + except Exception as e: + logger.warning( + f"Failed to capture trajectory for risk_manager: {e}", + ) + + # Capture PM trajectory + try: + msgs = await self.pm.memory.get_memory() + if msgs: + trajectories["portfolio_manager"] = list(msgs) + except Exception as e: + logger.warning( + f"Failed to capture trajectory for portfolio_manager: {e}", + ) + + return trajectories + + async def _run_reflection( + self, + date: str, + agent_trajectories: Dict[str, List[Msg]], + analyst_results: List[Dict[str, Any]], + decisions: Dict[str, Dict], + executed_trades: List[Dict], + open_prices: Optional[Dict[str, float]], + close_prices: Optional[Dict[str, float]], + settlement_result: Optional[Dict[str, Any]] = None, + conference_summary: Optional[str] = None, + ): + """ + Run reflection phase after market close + + Calculates actual P&L and records execution trajectory to long-term memory + + Args: + date: Trading date + agent_trajectories: Dict mapping agent name to their execution trajectory + analyst_results: Results from analyst agents + decisions: PM decisions + executed_trades: List of executed trades + open_prices: Opening prices + close_prices: Closing prices + settlement_result: Optional settlement results with baseline performance + conference_summary: Optional summary from conference discussion + """ + # Calculate P&L for each trade + trade_pnl = [] + for trade in executed_trades: + ticker = trade["ticker"] + action = trade["action"] + quantity = trade["quantity"] + entry_price = trade["price"] + exit_price = close_prices.get(ticker, entry_price) + + if action == "long": + pnl = (exit_price - entry_price) * quantity + elif action == "short": + pnl = (entry_price - exit_price) * quantity + else: + pnl = 0 + + pnl_pct = ( + (pnl / (entry_price * quantity) * 100) if quantity > 0 else 0 + ) + + trade_pnl.append( + { + "ticker": ticker, + "action": action, + "quantity": quantity, + "entry_price": entry_price, + "exit_price": exit_price, + "pnl": pnl, + "pnl_pct": pnl_pct, + }, + ) + + total_pnl = sum(t["pnl"] for t in trade_pnl) + + # Build reflection summary with settlement info + reflection_content = self._build_reflection_content( + date=date, + analyst_results=analyst_results, + decisions=decisions, + trade_pnl=trade_pnl, + total_pnl=total_pnl, + settlement_result=settlement_result, + conference_summary=conference_summary, + ) + + # Record execution trajectories to long-term memory for agents that support it + # Score based on profitability: higher score for profitable days + score = 1.0 if total_pnl > 0 else 0.0 + + await self._record_to_long_term_memory( + date=date, + agent_trajectories=agent_trajectories, + trade_pnl=trade_pnl, + total_pnl=total_pnl, + score=score, + ) + + # Broadcast reflection to StateSync + if self.state_sync: + await self.state_sync.on_agent_complete( + agent_id="Daily Log", + content=reflection_content, + ) + + def _build_reflection_content( + self, + date: str, + analyst_results: List[Dict[str, Any]], + decisions: Dict[str, Dict], + trade_pnl: List[Dict], + total_pnl: float, + settlement_result: Optional[Dict[str, Any]] = None, + conference_summary: Optional[str] = None, + ) -> str: + """Build human-readable reflection content""" + lines = [f"Daily log for {date}:"] + lines.append(f"Total P&L: ${total_pnl:,.2f}") + lines.append("") + + if conference_summary: + lines.append("Conference Discussion Summary:") + lines.append(conference_summary) + lines.append("") + + if settlement_result: + baseline_values = settlement_result.get("baseline_values", {}) + initial = 100000.0 + lines.append("Baseline Comparison:") + lines.append( + f" Equal Weight: ${baseline_values.get('equal_weight', 0):,.2f} " + f"({(baseline_values.get('equal_weight', initial) - initial) / initial * 100:.2f}%)", + ) + lines.append( + f" Market Cap Weighted: ${baseline_values.get('market_cap_weighted', 0):,.2f} " + f"({(baseline_values.get('market_cap_weighted', initial) - initial) / initial * 100:.2f}%)", + ) + lines.append( + f" Momentum: ${baseline_values.get('momentum', 0):,.2f} " + f"({(baseline_values.get('momentum', initial) - initial) / initial * 100:.2f}%)", + ) + lines.append("") + + if trade_pnl: + lines.append("Trade Results:") + for t in trade_pnl: + pnl_sign = "+" if t["pnl"] >= 0 else "" + lines.append( + f" {t['ticker']}: {t['action'].upper()} {t['quantity']} @ " + f"${t['entry_price']:.2f} -> ${t['exit_price']:.2f}, " + f"P&L: {pnl_sign}${t['pnl']:.2f} ({pnl_sign}{t['pnl_pct']:.1f}%)", + ) + else: + lines.append("No trades executed today.") + + return "\n".join(lines) + + async def _record_to_long_term_memory( + self, + date: str, + agent_trajectories: Dict[str, List[Msg]], + trade_pnl: List[Dict], + total_pnl: float, + score: float, + ): + """ + Record execution trajectories to long-term memory for all agents + + This method records the actual execution trajectory (conversation history) + from each agent's short-term memory. This allows the ReMe memory system + to learn from the complete task execution flow, not just summaries. + + Args: + date: Trading date + agent_trajectories: Dict mapping agent name to their execution trajectory + trade_pnl: P&L details for each trade + total_pnl: Total P&L for the day + score: Score for this trajectory (1.0 for profitable, 0.5 for loss) + """ + # Build outcome message to append to trajectories + outcome_msg = Msg( + role="user", + content=f"You are an analyst/financial manager, The Key point is to predict correctly and" + f"have good P&L. The Definition of loss is when P&L < 0. " + f"Focus on how to do good prediction but not only execution correctly." + f"[Outcome] Trading day {date} - Total P&L: ${total_pnl:,.2f}. " + f"{'Profitable day.' if total_pnl > 0 else 'Loss day.'}", + name="system", + ) + + # Record for analysts + for analyst in self.analysts: + if ( + hasattr(analyst, "long_term_memory") + and analyst.long_term_memory is not None + ): + trajectory = agent_trajectories.get(analyst.name, []) + if trajectory: + # Append outcome to trajectory + trajectory_with_outcome = trajectory + [outcome_msg] + try: + await analyst.long_term_memory.record( + msgs=trajectory_with_outcome, + score=score, + ) + logger.debug( + f"Recorded {len(trajectory_with_outcome)} messages " + f"to long-term memory for {analyst.name}", + ) + except Exception as e: + logger.warning( + f"Failed to record to long-term memory for {analyst.name}: {e}", + ) + + # Record for risk manager + if ( + hasattr(self.risk_manager, "long_term_memory") + and self.risk_manager.long_term_memory is not None + ): + trajectory = agent_trajectories.get("risk_manager", []) + if trajectory: + trajectory_with_outcome = trajectory + [outcome_msg] + try: + await self.risk_manager.long_term_memory.record( + msgs=trajectory_with_outcome, + score=score, + ) + logger.debug( + f"Recorded {len(trajectory_with_outcome)} messages " + f"to long-term memory for risk_manager", + ) + except Exception as e: + logger.warning( + f"Failed to record to long-term memory for risk_manager: {e}", + ) + + # Record for PM with trade outcome details + if ( + hasattr(self.pm, "long_term_memory") + and self.pm.long_term_memory is not None + ): + trajectory = agent_trajectories.get("portfolio_manager", []) + if trajectory: + # Build detailed outcome message for PM + pnl_details = [] + for t in trade_pnl: + pnl_sign = "+" if t["pnl"] >= 0 else "" + pnl_details.append( + f"{t['ticker']}: {t['action']} {t['quantity']} @ " + f"${t['entry_price']:.2f} -> ${t['exit_price']:.2f}, " + f"P&L: {pnl_sign}${t['pnl']:.2f}", + ) + + pm_outcome_msg = Msg( + role="user", + content=f"[Outcome] Trading day {date}\n" + f"Total P&L: ${total_pnl:,.2f} " + f"({'Profitable' if total_pnl >= 0 else 'Loss'})\n" + f"Trade details:\n" + "\n".join(pnl_details) + if pnl_details + else f"[Outcome] Trading day {date}\n" + f"Total P&L: ${total_pnl:,.2f}\nNo trades executed.", + name="system", + ) + trajectory_with_outcome = trajectory + [pm_outcome_msg] + try: + await self.pm.long_term_memory.record( + msgs=trajectory_with_outcome, + score=score, + ) + logger.debug( + f"Recorded {len(trajectory_with_outcome)} messages " + f"to long-term memory for portfolio_manager", + ) + except Exception as e: + logger.warning( + f"Failed to record to long-term memory for portfolio_manager: {e}", + ) + + async def _run_conference_cycles( + self, + tickers: List[str], + date: str, + prices: Optional[Dict[str, float]], + analyst_results: List[Dict[str, Any]], + risk_assessment: Dict[str, Any], + ) -> Optional[str]: + """ + Run conference discussion cycles (within existing MsgHub context) + + No nested MsgHub - this runs inside the main cycle's MsgHub. + + Returns: + Conference summary string generated by PM + """ + if self.max_comm_cycles <= 0: + _log( + "Phase 2.1: Conference discussion - " + "Conference skipped (disabled)", + ) + return None + + conference_title = f"Investment Discussion - {date}" + + if self.state_sync: + await self.state_sync.on_conference_start( + title=conference_title, + date=date, + ) + + # Run discussion cycles (no new MsgHub - use parent's) + for cycle in range(self.max_comm_cycles): + _log( + "Phase 2.1: Conference discussion - " + f"Conference {cycle + 1}/{self.max_comm_cycles}", + ) + + if self.state_sync: + await self.state_sync.on_conference_cycle_start( + cycle=cycle + 1, + total_cycles=self.max_comm_cycles, + ) + + # PM sets agenda or asks questions + pm_prompt = self._build_pm_discussion_prompt( + cycle=cycle, + tickers=tickers, + date=date, + prices=prices, + analyst_results=analyst_results, + risk_assessment=risk_assessment, + ) + + pm_msg = Msg(name="system", content=pm_prompt, role="user") + pm_response = await self.pm.reply(pm_msg) + + if self.state_sync: + pm_content = self._extract_text_content(pm_response.content) + await self.state_sync.on_conference_message( + agent_id="portfolio_manager", + content=pm_content, + ) + + # Analysts share perspectives + for analyst in self.analysts: + analyst_prompt = self._build_analyst_discussion_prompt( + cycle=cycle, + tickers=tickers, + date=date, + ) + + analyst_msg = Msg( + name="system", + content=analyst_prompt, + role="user", + ) + analyst_response = await analyst.reply(analyst_msg) + + if self.state_sync: + analyst_content = self._extract_text_content( + analyst_response.content, + ) + await self.state_sync.on_conference_message( + agent_id=analyst.name, + content=analyst_content, + ) + + if self.state_sync: + await self.state_sync.on_conference_cycle_end( + cycle=cycle + 1, + ) + + # Generate conference summary by PM + _log( + "Phase 2.1: Conference discussion - Generating conference summary", + ) + summary_prompt = ( + f"The conference discussion for {date} has concluded. " + f"As Portfolio Manager, provide a concise summary of the key insights, " + f"concerns, and consensus points discussed about {', '.join(tickers)}. " + f"Highlight any critical factors that should be considered in the final decision-making." + ) + summary_msg = Msg(name="system", content=summary_prompt, role="user") + summary_response = await self.pm.reply(summary_msg) + + conference_summary = self._extract_text_content( + summary_response.content, + ) + + _log( + "Phase 2.1: Conference discussion - Conference summary generated", + ) + + if self.state_sync: + await self.state_sync.on_conference_message( + agent_id="conference summary", + content=conference_summary, + ) + await self.state_sync.on_conference_end() + + return conference_summary + + def _build_pm_discussion_prompt( + self, + cycle: int, + tickers: List[str], + date: str, + prices: Optional[Dict[str, float]], + analyst_results: List[Dict[str, Any]], + risk_assessment: Dict[str, Any], + ) -> str: + """Build PM discussion prompt with full context""" + # Get current portfolio state + portfolio = self.pm.get_portfolio_state() + + if cycle == 0: + # First cycle: provide full context + context_lines = [ + f"As Portfolio Manager, review the following information for {date}:", + "", + "=== Current Portfolio ===", + f"Cash: ${portfolio.get('cash', 0):,.2f}", + f"Positions: {json.dumps(portfolio.get('positions', {}), indent=2)}", + "", + "=== Current Prices ===", + json.dumps(prices, indent=2), + "", + "=== Analyst Signals ===", + ] + + # Add analyst results summary + for result in analyst_results: + agent_name = result.get("agent", "Unknown") + content = result.get("content", "") + context_lines.append(f"{agent_name}: {content}") + + context_lines.extend( + [ + "", + "=== Risk Assessment ===", + str(risk_assessment.get("content", "")), + "", + "Based on the above context, share your key concerns or questions about the opportunities in " + f"{', '.join(tickers)}. Do not make final decisions yet - this is a discussion phase.", + ], + ) + + return "\n".join(context_lines) + else: + return ( + f"Continue the discussion. Share your thoughts on the perspectives raised " + f"and any remaining concerns about {', '.join(tickers)}." + ) + + def _build_analyst_discussion_prompt( + self, + cycle: int, + tickers: List[str], + date: str, + ) -> str: + """Build analyst discussion prompt""" + return ( + f"Share your perspective on the discussion so far. " + f"Provide insights or address concerns raised by others about {', '.join(tickers)}. " + f"Do not use tools - focus on sharing your professional opinion." + ) + + async def _collect_final_predictions( + self, + tickers: List[str], + date: str, + ) -> List[Dict[str, Any]]: + """ + Collect final predictions from all analysts as simple text responses. + Analysts provide their predictions in plain text without tool calls. + """ + _log( + "Phase 2.2: Analysts generate final structured predictions\n" + f" Starting _collect_final_predictions for {len(self.analysts)} analysts", + ) + final_predictions = [] + + for i, analyst in enumerate(self.analysts): + _log( + "Phase 2.2: Analysts generate final structured predictions\n" + f" Collecting prediction from analyst {i+1}/{len(self.analysts)}: {analyst.name}", + ) + + prompt = ( + f"Based on your analysis, provide your final prediction for {date}. " + f"For each ticker ({', '.join(tickers)}), state: " + f"TICKER: UP/DOWN/NEUTRAL (confidence: X%). " + f"Do not use any tools, just respond with your predictions." + ) + + msg = Msg(name="system", content=prompt, role="user") + _log( + "Phase 2.2: Analysts generate final structured predictions\n" + f" Sending prediction request to {analyst.name}", + ) + response = await analyst.reply(msg) + _log( + "Phase 2.2: Analysts generate final structured predictions\n" + f" Received response from {analyst.name}", + ) + + # Parse predictions from text response + content = self._extract_text_content(response.content) + predictions_data = self._parse_predictions_from_text( + content, + tickers, + ) + + _log( + "Phase 2.2: Analysts generate final structured predictions\n" + f" {analyst.name} final predictions: {predictions_data}", + ) + + final_predictions.append( + { + "agent": analyst.name, + "predictions": predictions_data, + "raw_content": content, + }, + ) + + # if self.state_sync: + # await self.state_sync.on_agent_complete( + # agent_id=f"{analyst.name}_final_prediction", + # content=content, + # ) + + return final_predictions + + def _parse_predictions_from_text( + self, + content: str, + tickers: List[str], + ) -> List[Dict[str, Any]]: + """Parse predictions from analyst text response""" + predictions = [] + content_upper = content.upper() + + for ticker in tickers: + direction = "neutral" + confidence = 0.5 + + # Simple pattern matching for direction + ticker_idx = content_upper.find(ticker) + if ticker_idx >= 0: + # Look at text near ticker mention + context = content_upper[ticker_idx : ticker_idx + 100] + if ( + "UP" in context + or "BULLISH" in context + or "LONG" in context + ): + direction = "up" + confidence = 0.7 + elif ( + "DOWN" in context + or "BEARISH" in context + or "SHORT" in context + ): + direction = "down" + confidence = 0.7 + + predictions.append( + { + "ticker": ticker, + "direction": direction, + "confidence": confidence, + }, + ) + + return predictions + + async def _run_analysts_with_sync( + self, + tickers: List[str], + date: str, + ) -> List[Dict[str, Any]]: + """Run all analysts with real-time sync after each completion""" + results = [] + + for analyst in self.analysts: + content = ( + f"Analyze the following stocks for date {date}: {', '.join(tickers)}. " + f"Provide investment signals with confidence scores and reasoning." + ) + + msg = Msg( + name="system", + content=content, + role="user", + metadata={"tickers": tickers, "date": date}, + ) + + result = await analyst.reply(msg) + extracted = self._extract_result_from_msg(result) + results.append(extracted) + + # Sync retrieved memory first + await self._sync_memory_if_retrieved(analyst) + + # Broadcast agent result via StateSync + if self.state_sync: + text_content = self._extract_text_content(result.content) + await self.state_sync.on_agent_complete( + agent_id=analyst.name, + content=text_content, + ) + + return results + + async def _run_analysts( + self, + tickers: List[str], + date: str, + ) -> List[Dict[str, Any]]: + """Run all analysts (without sync, for backward compatibility)""" + results = [] + + for analyst in self.analysts: + content = ( + f"Analyze the following stocks for date {date}: {', '.join(tickers)}. " + f"Provide investment signals with confidence scores and reasoning." + ) + + msg = Msg( + name="system", + content=content, + role="user", + metadata={"tickers": tickers, "date": date}, + ) + + result = await analyst.reply(msg) + results.append(self._extract_result_from_msg(result)) + + return results + + async def _run_risk_manager_with_sync( + self, + tickers: List[str], + date: str, + prices: Optional[Dict[str, float]], + ) -> Dict[str, Any]: + """Run risk manager assessment with real-time sync""" + portfolio = self.pm.get_portfolio_state() + + context = { + "portfolio": portfolio, + "tickers": tickers, + "date": date, + "current_prices": prices, + } + content = ( + f"Assess risk for the following portfolio and market conditions:\n" + f"{json.dumps(context, indent=2)}\n" + f"Provide risk warnings and recommendations." + ) + + msg = Msg(name="system", content=content, role="user") + result = await self.risk_manager.reply(msg) + extracted = self._extract_result_from_msg(result) + + # Sync retrieved memory first + await self._sync_memory_if_retrieved(self.risk_manager) + + # Broadcast agent result via StateSync + if self.state_sync: + text_content = self._extract_text_content(result.content) + await self.state_sync.on_agent_complete( + agent_id="risk_manager", + content=text_content, + ) + + return extracted + + async def _run_risk_manager( + self, + tickers: List[str], + date: str, + prices: Dict[str, float], + ) -> Dict[str, Any]: + """Run risk manager assessment (without sync, for backward compatibility)""" + portfolio = self.pm.get_portfolio_state() + + context = { + "portfolio": portfolio, + "tickers": tickers, + "date": date, + "current_prices": prices, + } + content = ( + f"Assess risk for the following portfolio and market conditions:\n" + f"{json.dumps(context, indent=2)}\n" + f"Provide risk warnings and recommendations." + ) + + msg = Msg(name="system", content=content, role="user") + result = await self.risk_manager.reply(msg) + return self._extract_result_from_msg(result) + + async def _run_pm_with_sync( + self, + tickers: List[str], + date: str, + prices: Optional[Dict[str, float]], + analyst_results: List[Dict[str, Any]], + risk_assessment: Dict[str, Any], + ) -> Dict[str, Any]: + """Run PM decision-making with real-time sync""" + portfolio = self.pm.get_portfolio_state() + + context = { + "analyst_signals": { + r["agent"]: r.get("content", "") for r in analyst_results + }, + "risk_warnings": risk_assessment.get("content", ""), + "current_prices": prices, + "tickers": tickers, + "portfolio_cash": portfolio.get("cash", 0), + "portfolio_positions": portfolio.get("positions", {}), + } + + # Add conference summary if available + if self.conference_summary: + context["conference_summary"] = self.conference_summary + + content_parts = [ + f"Based on the analyst signals, risk assessment, and conference discussion, " + f"make investment decisions for date {date}.\n", + f"Context:\n{json.dumps(context, indent=2)}\n", + ] + + if self.conference_summary: + content_parts.append( + f"\n=== Conference Summary ===\n{self.conference_summary}\n", + ) + + content_parts.append( + "\nUse the make_decision tool for each ticker to record your decisions. " + "After recording all decisions, provide a summary of your investment rationale.", + ) + + content = "".join(content_parts) + + msg = Msg(name="system", content=content, role="user") + result = await self.pm.reply(msg) + extracted = self._extract_result_from_msg(result) + + # Sync retrieved memory first + await self._sync_memory_if_retrieved(self.pm) + + # Broadcast PM decision via StateSync + if self.state_sync: + text_content = self._extract_text_content(result.content) + await self.state_sync.on_agent_complete( + agent_id="portfolio_manager", + content=text_content, + ) + + return extracted + + async def _run_pm( + self, + tickers: List[str], + date: str, + prices: Dict[str, float], + analyst_results: List[Dict[str, Any]], + risk_assessment: Dict[str, Any], + ) -> Dict[str, Any]: + """Run PM decision-making (without sync, for backward compatibility)""" + portfolio = self.pm.get_portfolio_state() + + context = { + "analyst_signals": { + r["agent"]: r.get("content", "") for r in analyst_results + }, + "risk_warnings": risk_assessment.get("content", ""), + "current_prices": prices, + "tickers": tickers, + "portfolio_cash": portfolio.get("cash", 0), + "portfolio_positions": portfolio.get("positions", {}), + } + + content = ( + f"Based on the analyst signals and risk assessment, make investment decisions " + f"for date {date}.\n" + f"Context:\n{json.dumps(context, indent=2)}\n\n" + f"Use the make_decision tool for each ticker to record your decisions. " + f"After recording all decisions, provide a summary of your investment rationale." + ) + + msg = Msg(name="system", content=content, role="user") + result = await self.pm.reply(msg) + return self._extract_result_from_msg(result) + + def _execute_decisions( + self, + decisions: Dict[str, Dict], + prices: Optional[Dict[str, float]], + date: str, + ) -> Dict[str, Any]: + """Execute PM decisions with provided prices""" + if not decisions: + return { + "executed_trades": [], + "portfolio": self.pm.get_portfolio_state(), + } + + executor = PortfolioTradeExecutor( + initial_portfolio=self.pm.get_portfolio_state(), + ) + + executed_trades = [] + + for ticker, decision in decisions.items(): + action = decision.get("action", "hold") + quantity = decision.get("quantity", 0) + + if action == "hold" or quantity == 0: + continue + + price = prices.get(ticker) + if not price or price <= 0: + logger.warning(f"No price for {ticker}, skipping trade") + continue + + result = executor.execute_trade( + ticker=ticker, + action=action, + quantity=quantity, + price=price, + current_date=date, + ) + + if result.get("status") == "success": + executed_trades.append( + { + "ticker": ticker, + "action": action, + "quantity": quantity, + "price": price, + }, + ) + + updated_portfolio = executor.portfolio.copy() + self.pm.update_portfolio(updated_portfolio) + + return { + "executed_trades": executed_trades, + "portfolio": updated_portfolio, + } + + def _extract_result_from_msg(self, msg: Msg) -> Dict[str, Any]: + """Extract result dictionary from Msg object""" + result = { + "agent": msg.name, + "content": msg.content, + } + + if hasattr(msg, "metadata") and msg.metadata: + result.update(msg.metadata) + + if isinstance(msg.content, str): + try: + result["content_parsed"] = json.loads(msg.content) + except json.JSONDecodeError: + pass + + return result + + def _extract_text_content(self, content: Any) -> str: + """ + Extract plain text from AgentScope Msg content + + AgentScope content can be: + - str: plain text + - list: list of TextBlocks like [{'type': 'text', 'text': '...'}] + - dict: single TextBlock + """ + if content is None: + return "" + + if isinstance(content, str): + return content + + if isinstance(content, list): + texts = [] + for item in content: + if isinstance(item, dict): + # TextBlock format: {'type': 'text', 'text': '...'} + if item.get("type") == "text" and "text" in item: + texts.append(item["text"]) + elif "content" in item: + texts.append(str(item["content"])) + else: + texts.append(str(item)) + elif isinstance(item, str): + texts.append(item) + else: + texts.append(str(item)) + return "\n".join(texts) + + if isinstance(content, dict): + if content.get("type") == "text" and "text" in content: + return content["text"] + return str(content) + + return str(content) + + def _format_pm_decisions(self, decisions: Dict[str, Dict]) -> str: + """Format PM decisions as a human-readable string""" + if not decisions: + return "Portfolio analysis completed. No trades recommended." + + decision_texts = [] + for ticker, decision in decisions.items(): + action = decision.get("action", "hold") + quantity = decision.get("quantity", 0) + reasoning = decision.get("reasoning", "") + + if action != "hold" and quantity > 0: + decision_texts.append( + f"{action.upper()} {quantity} {ticker}: {reasoning}", + ) + + if decision_texts: + return "Decisions: " + "; ".join(decision_texts) + return "Portfolio analysis completed. No trades recommended." diff --git a/backend/core/scheduler.py b/backend/core/scheduler.py new file mode 100644 index 0000000..fd11ded --- /dev/null +++ b/backend/core/scheduler.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +""" +Scheduler - Market-aware trigger system for trading cycles +""" +import asyncio +import logging +from datetime import datetime, timedelta +from typing import Any, Callable, Optional +from zoneinfo import ZoneInfo + +import pandas_market_calendars as mcal + +logger = logging.getLogger(__name__) + +# NYSE timezone for US stock trading +NYSE_TZ = ZoneInfo("America/New_York") +NYSE_CALENDAR = mcal.get_calendar("NYSE") + + +class Scheduler: + """ + Market-aware scheduler for live trading. + Uses NYSE timezone and trading calendar. + """ + + def __init__( + self, + mode: str = "daily", + trigger_time: Optional[str] = None, + interval_minutes: Optional[int] = None, + config: Optional[dict] = None, + ): + self.mode = mode + self.trigger_time = trigger_time or "09:30" # NYSE timezone + self.trigger_now = self.trigger_time == "now" + self.interval_minutes = interval_minutes or 60 + self.config = config or {} + + self.running = False + self._task: Optional[asyncio.Task] = None + + def _now_nyse(self) -> datetime: + """Get current time in NYSE timezone""" + return datetime.now(NYSE_TZ) + + def _is_trading_day(self, date: datetime) -> bool: + """Check if date is a NYSE trading day""" + date_str = date.strftime("%Y-%m-%d") + valid_days = NYSE_CALENDAR.valid_days( + start_date=date_str, + end_date=date_str, + ) + return len(valid_days) > 0 + + def _next_trading_day(self, from_date: datetime) -> datetime: + """Find the next trading day from given date""" + check_date = from_date + for _ in range(10): # Max 10 days ahead (handles holidays) + if self._is_trading_day(check_date): + return check_date + check_date += timedelta(days=1) + return check_date + + async def start(self, callback: Callable): + """Start scheduler""" + if self.running: + logger.warning("Scheduler already running") + return + + self.running = True + + if self.mode == "daily": + self._task = asyncio.create_task(self._run_daily(callback)) + elif self.mode == "intraday": + self._task = asyncio.create_task(self._run_intraday(callback)) + else: + raise ValueError(f"Unknown scheduler mode: {self.mode}") + + logger.info( + f"Scheduler started: mode={self.mode}, timezone=America/New_York", + ) + + async def _run_daily(self, callback: Callable): + """Run once per trading day at specified time (NYSE timezone)""" + first_run = True + + while self.running: + now = self._now_nyse() + + # Handle "now" trigger - run immediately on first iteration + if self.trigger_now and first_run: + first_run = False + current_date = now.strftime("%Y-%m-%d") + logger.info(f"Triggering immediately for {current_date}") + await callback(date=current_date) + # After immediate run, stop (one-shot mode) + self.running = False + break + + target_time = datetime.strptime(self.trigger_time, "%H:%M").time() + + # Calculate next trigger datetime + if now.time() < target_time: + next_run = now.replace( + hour=target_time.hour, + minute=target_time.minute, + second=0, + microsecond=0, + ) + else: + next_run = (now + timedelta(days=1)).replace( + hour=target_time.hour, + minute=target_time.minute, + second=0, + microsecond=0, + ) + + # Skip to next trading day + next_run = self._next_trading_day(next_run) + next_run = next_run.replace( + hour=target_time.hour, + minute=target_time.minute, + second=0, + microsecond=0, + ) + + wait_seconds = (next_run - now).total_seconds() + logger.info( + f"Next trigger: {next_run.strftime('%Y-%m-%d %H:%M %Z')} " + f"(in {wait_seconds/3600:.1f} hours)", + ) + + await asyncio.sleep(wait_seconds) + + current_date = self._now_nyse().strftime("%Y-%m-%d") + logger.info(f"Triggering daily cycle for {current_date}") + await callback(date=current_date) + + async def _run_intraday(self, callback: Callable): + """Run every N minutes (for future use)""" + while self.running: + now = self._now_nyse() + current_date = now.strftime("%Y-%m-%d") + + if self._is_trading_day(now): + logger.info(f"Triggering intraday cycle for {current_date}") + await callback(date=current_date) + + await asyncio.sleep(self.interval_minutes * 60) + + def stop(self): + """Stop scheduler""" + self.running = False + if self._task: + self._task.cancel() + self._task = None + logger.info("Scheduler stopped") + + +class BacktestScheduler: + """Backtest Scheduler - Runs through historical trading dates""" + + def __init__( + self, + start_date: str, + end_date: str, + trading_calendar: Optional[Any] = None, + delay_between_days: float = 0.1, + ): + self.start_date = start_date + self.end_date = end_date + self.trading_calendar = trading_calendar + self.delay_between_days = delay_between_days + + self.running = False + self._task: Optional[asyncio.Task] = None + self._dates: list = [] + + def get_trading_dates(self) -> list: + """Get list of trading dates in the backtest period""" + import pandas as pd + + start = pd.to_datetime(self.start_date) + end = pd.to_datetime(self.end_date) + + if self.trading_calendar: + calendar = mcal.get_calendar(self.trading_calendar) + trading_dates = calendar.valid_days( + start_date=self.start_date, + end_date=self.end_date, + ) + dates = [d.strftime("%Y-%m-%d") for d in trading_dates] + else: + all_dates = pd.date_range(start=start, end=end, freq="D") + dates = [ + d.strftime("%Y-%m-%d") for d in all_dates if d.weekday() < 5 + ] + + self._dates = dates + return dates + + async def start(self, callback: Callable): + """Start async backtest scheduler""" + if self.running: + logger.warning("Backtest scheduler already running") + return + + self.running = True + dates = self.get_trading_dates() + + logger.info( + f"Starting backtest: {self.start_date} to {self.end_date} " + f"({len(dates)} trading days)", + ) + + self._task = asyncio.create_task(self._run_async(callback, dates)) + + async def _run_async(self, callback: Callable, dates: list): + """Run backtest asynchronously""" + for i, date in enumerate(dates, 1): + if not self.running: + break + + logger.info(f"[{i}/{len(dates)}] Processing {date}") + await callback(date=date) + + if self.delay_between_days > 0: + await asyncio.sleep(self.delay_between_days) + + logger.info("Backtest complete") + self.running = False + + def run(self, callback: Callable, **kwargs): + """Run backtest synchronously through all trading dates""" + dates = self.get_trading_dates() + results = [] + + logger.info( + f"Starting backtest: {self.start_date} to {self.end_date} " + f"({len(dates)} trading days)", + ) + + for i, date in enumerate(dates, 1): + logger.info(f"[{i}/{len(dates)}] Processing {date}") + result = callback(date=date, **kwargs) + results.append({"date": date, "result": result}) + + logger.info("Backtest complete") + return results + + def stop(self): + """Stop backtest scheduler""" + self.running = False + if self._task: + self._task.cancel() + self._task = None + logger.info("Backtest scheduler stopped") + + def get_total_days(self) -> int: + """Get total number of trading days""" + if not self._dates: + self.get_trading_dates() + return len(self._dates) diff --git a/backend/core/state_sync.py b/backend/core/state_sync.py new file mode 100644 index 0000000..92a4a40 --- /dev/null +++ b/backend/core/state_sync.py @@ -0,0 +1,476 @@ +# -*- coding: utf-8 -*- +""" +StateSync - Centralized state synchronization between agents and frontend +Handles real-time updates, persistence, and replay support +""" +# pylint: disable=R0904 +import asyncio +import logging +from datetime import datetime +from typing import Any, Callable, Dict, List, Optional + +from ..services.storage import StorageService + +logger = logging.getLogger(__name__) + + +class StateSync: + """ + Central event dispatcher for agent-frontend synchronization + + Responsibilities: + 1. Receive events from agents/pipeline + 2. Persist to storage (feed_history) + 3. Broadcast to frontend via WebSocket + 4. Support replay from saved state + """ + + def __init__( + self, + storage: StorageService, + broadcast_fn: Optional[Callable] = None, + ): + """ + Initialize StateSync + + Args: + storage: Storage service for persistence + broadcast_fn: Async broadcast function - async def broadcast(event: dict) # noqa: E501 + """ + self.storage = storage + self._broadcast_fn = broadcast_fn + self._state: Dict[str, Any] = {} + self._enabled = True + self._simulation_date: Optional[str] = None # For backtest timestamps + + def set_simulation_date(self, date: str): + """Set current simulation date for backtest-compatible timestamps""" + self._simulation_date = date + + def _get_timestamp_ms(self) -> int: + """ + Get timestamp in milliseconds. + Uses simulation date if set (backtest mode), otherwise current time. + """ + if self._simulation_date: + # Parse date and use market close time (16:00) for backtest + dt = datetime.strptime( + f"{self._simulation_date}", + "%Y-%m-%d", + ) + return int(dt.timestamp() * 1000) + return int(datetime.now().timestamp() * 1000) + + def load_state(self): + """Load server state from storage""" + self._state = self.storage.load_server_state() + self.storage.update_server_state_from_dashboard(self._state) + logger.info( + f"StateSync loaded: {len(self._state.get('feed_history', []))} feeds", # noqa: E501 + ) + + def save_state(self): + """Save current state to storage""" + self.storage.save_server_state(self._state) + + @property + def state(self) -> Dict[str, Any]: + """Get current state""" + return self._state + + def set_broadcast_fn(self, fn: Callable): + """Set broadcast function (supports late binding)""" + self._broadcast_fn = fn + + def update_state(self, key: str, value: Any): + """Update a state field""" + self._state[key] = value + + async def emit(self, event: Dict[str, Any], persist: bool = True): + """ + Emit an event - persists and broadcasts + + Args: + event: Event dictionary, must contain "type" + persist: Whether to persist to feed_history + """ + if not self._enabled: + return + + # Ensure timestamp exists (use simulation date if in backtest mode) + if "timestamp" not in event: + if self._simulation_date: + event["timestamp"] = f"{self._simulation_date}" + else: + event["timestamp"] = datetime.now().isoformat() + + # Persist to feed_history + if persist: + self.storage.add_feed_message(self._state, event) + self.save_state() + + # Broadcast to frontend + if self._broadcast_fn: + await self._broadcast_fn(event) + + # ========== Agent Events ========== + + async def on_agent_complete( + self, + agent_id: str, + content: str, + **extra, + ): + """ + Called when an agent finishes its reply + + Args: + agent_id: Agent identifier (e.g., "fundamentals_analyst") + content: Agent's output content + **extra: Additional fields to include + """ + ts_ms = self._get_timestamp_ms() + + await self.emit( + { + "type": "agent_message", + "agentId": agent_id, + "content": content, + "ts": ts_ms, + **extra, + }, + ) + + logger.info(f"Agent complete: {agent_id}") + + async def on_memory_retrieved( + self, + agent_id: str, + content: str, + ): + """ + Called when long-term memory is retrieved for an agent + + Args: + agent_id: Agent identifier + content: Retrieved memory content + """ + ts_ms = self._get_timestamp_ms() + + await self.emit( + { + "type": "memory", + "agentId": agent_id, + "content": content, + "ts": ts_ms, + }, + ) + + logger.info(f"Memory retrieved for: {agent_id}") + + # ========== Conference Events ========== + + async def on_conference_start(self, title: str, date: str): + """Called when conference discussion starts""" + ts_ms = self._get_timestamp_ms() + + await self.emit( + { + "type": "conference_start", + "title": title, + "date": date, + "ts": ts_ms, + }, + ) + + logger.info(f"Conference started: {title}") + + async def on_conference_cycle_start(self, cycle: int, total_cycles: int): + """Called when a conference cycle starts""" + await self.emit( + { + "type": "conference_cycle_start", + "cycle": cycle, + "totalCycles": total_cycles, + }, + persist=False, + ) + + async def on_conference_message(self, agent_id: str, content: str): + """Called when an agent speaks during conference""" + ts_ms = self._get_timestamp_ms() + + await self.emit( + { + "type": "conference_message", + "agentId": agent_id, + "content": content, + "ts": ts_ms, + }, + ) + + async def on_conference_cycle_end(self, cycle: int): + """Called when a conference cycle ends""" + await self.emit( + { + "type": "conference_cycle_end", + "cycle": cycle, + }, + persist=False, + ) + + async def on_conference_end(self): + """Called when conference discussion ends""" + ts_ms = self._get_timestamp_ms() + + await self.emit( + { + "type": "conference_end", + "ts": ts_ms, + }, + ) + + logger.info("Conference ended") + + # ========== Cycle Events ========== + + async def on_cycle_start(self, date: str): + """Called at start of trading cycle""" + self._state["current_date"] = date + self._state["status"] = "running" + self.set_simulation_date( + date, + ) # Set for backtest-compatible timestamps + + await self.emit( + { + "type": "day_start", + "date": date, + "progress": self._calculate_progress(), + }, + ) + # await self.emit( + # { + # "type": "system", + # "content": f"Starting trading analysis for {date}", + # }, + # ) + + async def on_cycle_end(self, date: str, portfolio_summary: Dict = None): + """Called at end of trading cycle""" + # Update completed count + self._state["trading_days_completed"] = ( + self._state.get("trading_days_completed", 0) + 1 + ) + + # Broadcast team_summary if available + if portfolio_summary: + summary_data = { + "type": "team_summary", + "balance": portfolio_summary.get( + "balance", + portfolio_summary.get("total_value", 0), + ), + "pnlPct": portfolio_summary.get( + "pnlPct", + portfolio_summary.get("pnl_percent", 0), + ), + "equity": portfolio_summary.get("equity", []), + "baseline": portfolio_summary.get("baseline", []), + "baseline_vw": portfolio_summary.get("baseline_vw", []), + "momentum": portfolio_summary.get("momentum", []), + } + + # Include live returns if available + if portfolio_summary.get("equity_return"): + summary_data["equity_return"] = portfolio_summary[ + "equity_return" + ] + if portfolio_summary.get("baseline_return"): + summary_data["baseline_return"] = portfolio_summary[ + "baseline_return" + ] + if portfolio_summary.get("baseline_vw_return"): + summary_data["baseline_vw_return"] = portfolio_summary[ + "baseline_vw_return" + ] + if portfolio_summary.get("momentum_return"): + summary_data["momentum_return"] = portfolio_summary[ + "momentum_return" + ] + + if "portfolio" not in self._state: + self._state["portfolio"] = {} + + self._state["portfolio"].update( + { + "total_value": summary_data["balance"], + "pnl_percent": summary_data["pnlPct"], + "equity": summary_data["equity"], + "baseline": summary_data["baseline"], + "baseline_vw": summary_data["baseline_vw"], + "momentum": summary_data["momentum"], + }, + ) + + if summary_data.get("equity_return"): + self._state["portfolio"]["equity_return"] = summary_data[ + "equity_return" + ] + if summary_data.get("baseline_return"): + self._state["portfolio"]["baseline_return"] = summary_data[ + "baseline_return" + ] + if summary_data.get("baseline_vw_return"): + self._state["portfolio"]["baseline_vw_return"] = summary_data[ + "baseline_vw_return" + ] + if summary_data.get("momentum_return"): + self._state["portfolio"]["momentum_return"] = summary_data[ + "momentum_return" + ] + + await self.emit(summary_data, persist=True) + + await self.emit( + { + "type": "day_complete", + "date": date, + "progress": self._calculate_progress(), + }, + ) + + self.save_state() + + # ========== Portfolio Events ========== + + async def on_holdings_update(self, holdings: List[Dict]): + """Called when holdings change""" + self._state["holdings"] = holdings + await self.emit( + { + "type": "team_holdings", + "data": holdings, + }, + persist=False, + ) # Holdings change frequently, don't store all in feed_history + + async def on_trades_executed(self, trades: List[Dict]): + """Called when trades are executed""" + # Update state with new trades + existing = self._state.get("trades", []) + self._state["trades"] = trades + existing + + await self.emit( + { + "type": "team_trades", + "mode": "incremental", + "data": trades, + }, + persist=False, + ) + + async def on_stats_update(self, stats: Dict): + """Called when stats are updated""" + self._state["stats"] = stats + await self.emit( + { + "type": "team_stats", + "data": stats, + }, + persist=False, + ) + + async def on_leaderboard_update(self, leaderboard: List[Dict]): + """Called when leaderboard is updated""" + self._state["leaderboard"] = leaderboard + await self.emit( + { + "type": "team_leaderboard", + "data": leaderboard, + }, + persist=False, + ) + + # ========== System Events ========== + + async def on_system_message(self, content: str): + """Emit a system message""" + await self.emit( + { + "type": "system", + "content": content, + }, + ) + + # ========== Replay Support ========== + + async def replay_feed_history(self, delay_ms: int = 100): + """ + Replay events from feed_history + + Useful for: frontend reconnection or restoring from saved state + """ + feed_history = self._state.get("feed_history", []) + + # feed_history is newest-first, need to reverse for chronological replay # noqa: E501 + for event in reversed(feed_history): + if self._broadcast_fn: + await self._broadcast_fn(event) + await asyncio.sleep(delay_ms / 1000) + + logger.info(f"Replayed {len(feed_history)} events") + + def get_initial_state_payload( + self, + include_dashboard: bool = True, + ) -> Dict[str, Any]: + """ + Build initial state payload for new client connections + + Args: + include_dashboard: Whether to load dashboard files + + Returns: + Dictionary suitable for sending to frontend + """ + payload = { + "server_mode": self._state.get("server_mode", "live"), + "is_mock_mode": self._state.get("is_mock_mode", False), + "is_backtest": self._state.get("is_backtest", False), + "feed_history": self._state.get("feed_history", []), + "current_date": self._state.get("current_date"), + "trading_days_total": self._state.get("trading_days_total", 0), + "trading_days_completed": self._state.get( + "trading_days_completed", + 0, + ), + "holdings": self._state.get("holdings", []), + "trades": self._state.get("trades", []), + "stats": self._state.get("stats", {}), + "leaderboard": self._state.get("leaderboard", []), + "portfolio": self._state.get("portfolio", {}), + "realtime_prices": self._state.get("realtime_prices", {}), + } + + if include_dashboard: + payload["dashboard"] = { + "summary": self.storage.load_file("summary"), + "holdings": self.storage.load_file("holdings"), + "stats": self.storage.load_file("stats"), + "trades": self.storage.load_file("trades"), + "leaderboard": self.storage.load_file("leaderboard"), + } + + return payload + + def _calculate_progress(self) -> float: + """Calculate backtest progress percentage""" + total = self._state.get("trading_days_total", 0) + completed = self._state.get("trading_days_completed", 0) + return completed / total if total > 0 else 0.0 + + def set_backtest_dates(self, dates: List[str]): + """Set total trading days for backtest progress tracking""" + self._state["trading_days_total"] = len(dates) + self._state["trading_days_completed"] = 0 diff --git a/backend/data/__MACOSX/ret_data/._AAPL.csv b/backend/data/__MACOSX/ret_data/._AAPL.csv new file mode 100644 index 0000000000000000000000000000000000000000..121de862833aaa9f96b3a0cea6180f50e912524a GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K literal 0 HcmV?d00001 diff --git a/backend/data/__MACOSX/ret_data/._AMZN.csv b/backend/data/__MACOSX/ret_data/._AMZN.csv new file mode 100644 index 0000000000000000000000000000000000000000..121de862833aaa9f96b3a0cea6180f50e912524a GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K literal 0 HcmV?d00001 diff --git a/backend/data/__MACOSX/ret_data/._GOOGL.csv b/backend/data/__MACOSX/ret_data/._GOOGL.csv new file mode 100644 index 0000000000000000000000000000000000000000..121de862833aaa9f96b3a0cea6180f50e912524a GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K literal 0 HcmV?d00001 diff --git a/backend/data/__MACOSX/ret_data/._META.csv b/backend/data/__MACOSX/ret_data/._META.csv new file mode 100644 index 0000000000000000000000000000000000000000..121de862833aaa9f96b3a0cea6180f50e912524a GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K literal 0 HcmV?d00001 diff --git a/backend/data/__MACOSX/ret_data/._MSFT.csv b/backend/data/__MACOSX/ret_data/._MSFT.csv new file mode 100644 index 0000000000000000000000000000000000000000..121de862833aaa9f96b3a0cea6180f50e912524a GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K literal 0 HcmV?d00001 diff --git a/backend/data/__MACOSX/ret_data/._NVDA.csv b/backend/data/__MACOSX/ret_data/._NVDA.csv new file mode 100644 index 0000000000000000000000000000000000000000..121de862833aaa9f96b3a0cea6180f50e912524a GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K literal 0 HcmV?d00001 diff --git a/backend/data/__MACOSX/ret_data/._TSLA.csv b/backend/data/__MACOSX/ret_data/._TSLA.csv new file mode 100644 index 0000000000000000000000000000000000000000..121de862833aaa9f96b3a0cea6180f50e912524a GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K literal 0 HcmV?d00001 diff --git a/backend/data/__init__.py b/backend/data/__init__.py new file mode 100644 index 0000000..eb90e8e --- /dev/null +++ b/backend/data/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from backend.data.historical_price_manager import HistoricalPriceManager +from backend.data.mock_price_manager import MockPriceManager +from backend.data.polling_price_manager import PollingPriceManager + +__all__ = ["MockPriceManager", "PollingPriceManager", "HistoricalPriceManager"] diff --git a/backend/data/cache.py b/backend/data/cache.py new file mode 100644 index 0000000..375c9b3 --- /dev/null +++ b/backend/data/cache.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +from typing_extensions import Any + + +class Cache: + """In-memory cache for API responses.""" + + def __init__(self): + self._prices_cache = {} + self._financial_metrics_cache = {} + self._line_items_cache = {} + self._insider_trades_cache = {} + self._company_news_cache = {} + + def _merge_data( + self, + existing: list[dict] | None, + new_data: list[dict], + key_field: str, + ) -> list[dict]: + """Merge existing and new data""" + if not existing: + return new_data + + # Create a set of existing keys for O(1) lookup + existing_keys = {item[key_field] for item in existing} + + # Only add items that don't exist yet + merged = existing.copy() + merged.extend( + [ + item + for item in new_data + if item[key_field] not in existing_keys + ], + ) + return merged + + def get_prices(self, ticker: str) -> list[dict[str, Any]] | None: + """Get cached price data if available.""" + return self._prices_cache.get(ticker) + + def set_prices(self, ticker: str, data: list[dict[str, Any]]): + """Append new price data to cache.""" + self._prices_cache[ticker] = self._merge_data( + self._prices_cache.get(ticker), + data, + key_field="time", + ) + + def get_financial_metrics(self, ticker: str) -> list[dict[str, Any]]: + """Get cached financial metrics if available.""" + return self._financial_metrics_cache.get(ticker) + + def set_financial_metrics(self, ticker: str, data: list[dict[str, Any]]): + """Append new financial metrics to cache.""" + self._financial_metrics_cache[ticker] = self._merge_data( + self._financial_metrics_cache.get(ticker), + data, + key_field="report_period", + ) + + def get_line_items(self, ticker: str) -> list[dict[str, Any]] | None: + """Get cached line items if available.""" + return self._line_items_cache.get(ticker) + + def set_line_items(self, ticker: str, data: list[dict[str, Any]]): + """Append new line items to cache.""" + self._line_items_cache[ticker] = self._merge_data( + self._line_items_cache.get(ticker), + data, + key_field="report_period", + ) + + def get_insider_trades(self, ticker: str) -> list[dict[str, Any]] | None: + """Get cached insider trades if available.""" + return self._insider_trades_cache.get(ticker) + + def set_insider_trades(self, ticker: str, data: list[dict[str, Any]]): + """Append new insider trades to cache.""" + self._insider_trades_cache[ticker] = self._merge_data( + self._insider_trades_cache.get(ticker), + data, + key_field="filing_date", + ) # Could also use transaction_date if preferred + + def get_company_news(self, ticker: str) -> list[dict[str, Any]] | None: + """Get cached company news if available.""" + return self._company_news_cache.get(ticker) + + def set_company_news(self, ticker: str, data: list[dict[str, Any]]): + """Append new company news to cache.""" + self._company_news_cache[ticker] = self._merge_data( + self._company_news_cache.get(ticker), + data, + key_field="date", + ) + + +# Global cache instance +_cache = Cache() + + +def get_cache() -> Cache: + """Get the global cache instance.""" + return _cache diff --git a/backend/data/historical_price_manager.py b/backend/data/historical_price_manager.py new file mode 100644 index 0000000..4db80da --- /dev/null +++ b/backend/data/historical_price_manager.py @@ -0,0 +1,233 @@ +# -*- coding: utf-8 -*- +""" +Historical Price Manager for backtest mode +""" +import logging +from datetime import datetime +from pathlib import Path +from typing import Callable, Dict, List, Optional + +import pandas as pd + +logger = logging.getLogger(__name__) + +# Path to local CSV data directory +_DATA_DIR = Path(__file__).parent / "ret_data" + + +class HistoricalPriceManager: + """Provides historical prices for backtest mode""" + + def __init__(self): + self.subscribed_symbols = [] + self.price_callbacks = [] + self._price_cache = {} + self._current_date = None + self.latest_prices = {} + self.open_prices = {} + self.close_prices = {} + self.running = False + + def subscribe( + self, + symbols: List[str], + ): + """Subscribe to symbols""" + for symbol in symbols: + if symbol not in self.subscribed_symbols: + self.subscribed_symbols.append(symbol) + + def unsubscribe(self, symbols: List[str]): + """Unsubscribe from symbols""" + for symbol in symbols: + if symbol in self.subscribed_symbols: + self.subscribed_symbols.remove(symbol) + self._price_cache.pop(symbol, None) + + def add_price_callback(self, callback: Callable): + """Add price update callback""" + self.price_callbacks.append(callback) + + def _load_from_csv(self, symbol: str) -> Optional[pd.DataFrame]: + """Load price data from local CSV file.""" + csv_path = _DATA_DIR / f"{symbol}.csv" + if not csv_path.exists(): + return None + + try: + df = pd.read_csv(csv_path) + if df.empty or "time" not in df.columns: + return None + + df["Date"] = pd.to_datetime(df["time"]) + df.set_index("Date", inplace=True) + df.sort_index(inplace=True) + return df + except Exception as e: + logger.warning(f"Failed to load CSV for {symbol}: {e}") + return None + + def preload_data(self, start_date: str, end_date: str): + """Preload historical data from local CSV files.""" + logger.info(f"Preloading data: {start_date} to {end_date}") + + for symbol in self.subscribed_symbols: + if symbol in self._price_cache: + continue + + # Load from local CSV file directly + df = self._load_from_csv(symbol) + if df is not None and not df.empty: + self._price_cache[symbol] = df + logger.info(f"Loaded {symbol} from CSV: {len(df)} records") + else: + logger.warning(f"No CSV data for {symbol}") + + def set_date(self, date: str): + """Set current trading date and update prices""" + self._current_date = date + date_dt = pd.Timestamp(date) + + for symbol in self.subscribed_symbols: + df = self._price_cache.get(symbol) + if df is None or df.empty: + # Keep previous prices if no data available + logger.warning(f"No cached data for {symbol} on {date}") + continue + + # Find exact date or closest earlier date + if date_dt in df.index: + row = df.loc[date_dt] + else: + valid_dates = df.index[df.index <= date_dt] + if len(valid_dates) == 0: + logger.warning(f"No data for {symbol} on or before {date}") + continue + row = df.loc[valid_dates[-1]] + + open_price = float(row["open"]) + close_price = float(row["close"]) + + self.open_prices[symbol] = open_price + self.close_prices[symbol] = close_price + self.latest_prices[symbol] = open_price + + logger.debug( + f"{symbol} @ {date}: open={open_price:.2f}, close={close_price:.2f}", # noqa: E501 + ) + + def emit_open_prices(self): + """Emit open prices to callbacks""" + if not self._current_date: + return + + timestamp = int( + datetime.strptime(self._current_date, "%Y-%m-%d").timestamp() + * 1000, + ) + + for symbol in self.subscribed_symbols: + price = self.open_prices.get(symbol) + if price is None or price <= 0: + logger.warning(f"Invalid open price for {symbol}: {price}") + continue + + self.latest_prices[symbol] = price + self._emit_price(symbol, price, timestamp) + + def emit_close_prices(self): + """Emit close prices to callbacks""" + if not self._current_date: + return + + timestamp = int( + datetime.strptime(self._current_date, "%Y-%m-%d").timestamp() + * 1000, + ) + timestamp += 23400000 # Add 6.5 hours + + for symbol in self.subscribed_symbols: + price = self.close_prices.get(symbol) + if price is None or price <= 0: + logger.warning(f"Invalid close price for {symbol}: {price}") + continue + + self.latest_prices[symbol] = price + self._emit_price(symbol, price, timestamp) + + def _emit_price(self, symbol: str, price: float, timestamp: int): + """Emit single price to callbacks""" + open_price = self.open_prices.get(symbol, price) + close_price = self.close_prices.get(symbol, price) + ret = ( + ((price - open_price) / open_price) * 100 if open_price > 0 else 0 + ) + + price_data = { + "symbol": symbol, + "price": price, + "timestamp": timestamp, + "open": open_price, + "close": close_price, + "high": max(open_price, close_price), + "low": min(open_price, close_price), + "ret": ret, + } + + for callback in self.price_callbacks: + try: + callback(price_data) + except Exception as e: + logger.error(f"Callback error for {symbol}: {e}") + + def get_price_for_date( + self, + symbol: str, + date: str, + price_type: str = "close", + ) -> Optional[float]: + """Get price for a specific date""" + df = self._price_cache.get(symbol) + if df is None or df.empty: + return self.latest_prices.get(symbol) + + date_dt = pd.Timestamp(date) + if date_dt in df.index: + return float(df.loc[date_dt, price_type]) + + valid_dates = df.index[df.index <= date_dt] + if len(valid_dates) == 0: + return self.latest_prices.get(symbol) + return float(df.loc[valid_dates[-1], price_type]) + + def start(self): + """Start manager""" + self.running = True + + def stop(self): + """Stop manager""" + self.running = False + + def get_latest_price(self, symbol: str) -> Optional[float]: + return self.latest_prices.get(symbol) + + def get_all_latest_prices(self) -> Dict[str, float]: + return self.latest_prices.copy() + + def get_open_price(self, symbol: str) -> Optional[float]: + # Return open price, fallback to latest if not set + price = self.open_prices.get(symbol) + if price is None or price <= 0: + return self.latest_prices.get(symbol) + return price + + def get_close_price(self, symbol: str) -> Optional[float]: + # Return close price, fallback to latest if not set + price = self.close_prices.get(symbol) + if price is None or price <= 0: + return self.latest_prices.get(symbol) + return price + + def reset_open_prices(self): + # Don't clear prices - keep them for continuity + pass diff --git a/backend/data/mock_price_manager.py b/backend/data/mock_price_manager.py new file mode 100644 index 0000000..d54b7ea --- /dev/null +++ b/backend/data/mock_price_manager.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +""" +Mock Price Manager - For testing during non-trading hours +Generates virtual real-time price data +""" +import logging +import os +import random +import threading +import time +from typing import Callable, Dict, List, Optional + +logger = logging.getLogger(__name__) + + +class MockPriceManager: + """Mock Price Manager - Generates virtual prices for testing""" + + def __init__(self, poll_interval: int = 10, volatility: float = 0.5): + """ + Args: + poll_interval: Price update interval in seconds + volatility: Price volatility percentage + """ + if poll_interval is None: + poll_interval = int(os.getenv("MOCK_POLL_INTERVAL", "5")) + if volatility is None: + volatility = float(os.getenv("MOCK_VOLATILITY", "0.5")) + + self.poll_interval = poll_interval + self.volatility = volatility + + self.subscribed_symbols: List[str] = [] + self.base_prices: Dict[str, float] = {} + self.open_prices: Dict[str, float] = {} + self.latest_prices: Dict[str, float] = {} + self.price_callbacks: List[Callable] = [] + + self.running = False + self._thread: Optional[threading.Thread] = None + + self.default_base_prices = { + "AAPL": 237.50, + "MSFT": 425.30, + "GOOGL": 161.50, + "AMZN": 218.45, + "NVDA": 950.00, + "META": 573.22, + "TSLA": 342.15, + "AMD": 168.90, + "NFLX": 688.25, + "INTC": 42.18, + "COIN": 285.50, + "PLTR": 45.80, + "BABA": 88.30, + "DIS": 112.50, + "BKNG": 4850.00, + } + + logger.info( + f"MockPriceManager initialized (interval: {self.poll_interval}s, " + f"volatility: {self.volatility}%)", + ) + + def subscribe( + self, + symbols: List[str], + base_prices: Dict[str, float] = None, + ): + """Subscribe to stock symbols""" + for symbol in symbols: + if symbol not in self.subscribed_symbols: + self.subscribed_symbols.append(symbol) + + if base_prices and symbol in base_prices: + base_price = base_prices[symbol] + elif symbol in self.default_base_prices: + base_price = self.default_base_prices[symbol] + else: + base_price = random.uniform(50, 500) + + self.base_prices[symbol] = base_price + self.open_prices[symbol] = base_price + self.latest_prices[symbol] = base_price + + logger.info( + f"Subscribed to mock price: {symbol} (base: ${base_price:.2f})", # noqa: E501 + ) + + def unsubscribe(self, symbols: List[str]): + """Unsubscribe from symbols""" + for symbol in symbols: + if symbol in self.subscribed_symbols: + self.subscribed_symbols.remove(symbol) + self.base_prices.pop(symbol, None) + self.open_prices.pop(symbol, None) + self.latest_prices.pop(symbol, None) + logger.info(f"Unsubscribed: {symbol}") + + def add_price_callback(self, callback: Callable): + """Add price update callback""" + self.price_callbacks.append(callback) + + def _generate_price_update(self, symbol: str) -> float: + """Generate price update based on random walk""" + current_price = self.latest_prices.get( + symbol, + self.base_prices[symbol], + ) + + change_percent = random.uniform(-self.volatility, self.volatility) + new_price = current_price * (1 + change_percent / 100) + + # 10% chance of larger movement + if random.random() < 0.1: + trend_factor = random.uniform(-2, 2) + new_price = new_price * (1 + trend_factor / 100) + + # Limit intraday movement to +/-10% + open_price = self.open_prices[symbol] + max_price = open_price * 1.10 + min_price = open_price * 0.90 + new_price = max(min_price, min(max_price, new_price)) + + return new_price + + def _update_prices(self): + """Update prices for all subscribed stocks""" + timestamp = int(time.time() * 1000) + + for symbol in self.subscribed_symbols: + try: + new_price = self._generate_price_update(symbol) + self.latest_prices[symbol] = new_price + + open_price = self.open_prices[symbol] + ret = ((new_price - open_price) / open_price) * 100 + + price_data = { + "symbol": symbol, + "price": new_price, + "timestamp": timestamp, + "volume": random.randint(1000000, 10000000), + "open": open_price, + "high": max(new_price, open_price), + "low": min(new_price, open_price), + "previous_close": open_price, + "ret": ret, + } + + for callback in self.price_callbacks: + try: + callback(price_data) + except Exception as e: + logger.error( + f"Mock price callback error ({symbol}): {e}", + ) + + logger.debug( + f"Mock {symbol}: ${new_price:.2f} [ret: {ret:+.2f}%]", + ) + + except Exception as e: + logger.error(f"Failed to generate mock price ({symbol}): {e}") + + def _polling_loop(self): + """Main polling loop""" + logger.info( + f"Mock price generation started (interval: {self.poll_interval}s)", + ) + + while self.running: + try: + start_time = time.time() + self._update_prices() + + elapsed = time.time() - start_time + sleep_time = max(0, self.poll_interval - elapsed) + if sleep_time > 0: + time.sleep(sleep_time) + + except Exception as e: + logger.error(f"Mock polling loop error: {e}") + time.sleep(5) + + def start(self): + """Start mock price generation""" + if self.running: + logger.warning("Mock price manager already running") + return + + if not self.subscribed_symbols: + logger.warning("No stocks subscribed") + return + + self.running = True + self._thread = threading.Thread(target=self._polling_loop, daemon=True) + self._thread.start() + + logger.info( + f"Mock price manager started: {', '.join(self.subscribed_symbols)}", # noqa: E501 + ) + + def stop(self): + """Stop mock price generation""" + self.running = False + if self._thread: + self._thread.join(timeout=5) + logger.info("Mock price manager stopped") + + def get_latest_price(self, symbol: str) -> Optional[float]: + """Get latest price for symbol""" + return self.latest_prices.get(symbol) + + def get_all_latest_prices(self) -> Dict[str, float]: + """Get all latest prices""" + return self.latest_prices.copy() + + def get_open_price(self, symbol: str) -> Optional[float]: + """Get open price for symbol""" + return self.open_prices.get(symbol) + + def reset_open_prices(self): + """Reset open prices for new trading day""" + for symbol in self.subscribed_symbols: + last_close = self.latest_prices[symbol] + gap_percent = random.uniform(-1, 1) + new_open = last_close * (1 + gap_percent / 100) + self.open_prices[symbol] = new_open + self.latest_prices[symbol] = new_open + logger.info("Open prices reset") + + def set_base_price(self, symbol: str, price: float): + """Manually set base price for testing""" + if symbol in self.subscribed_symbols: + self.base_prices[symbol] = price + self.open_prices[symbol] = price + self.latest_prices[symbol] = price + logger.info(f"{symbol} base price set to: ${price:.2f}") + else: + logger.warning(f"{symbol} not subscribed") diff --git a/backend/data/polling_price_manager.py b/backend/data/polling_price_manager.py new file mode 100644 index 0000000..101d9f1 --- /dev/null +++ b/backend/data/polling_price_manager.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +""" +Polling-based Price Manager - Uses Finnhub REST API +Supports real-time price fetching via polling +""" +import logging +import threading +import time +from typing import Callable, Dict, List, Optional + +import finnhub + +logger = logging.getLogger(__name__) + + +class PollingPriceManager: + """Polling-based price manager using Finnhub Quote API""" + + def __init__(self, api_key: str, poll_interval: int = 30): + """ + Args: + api_key: Finnhub API Key + poll_interval: Polling interval in seconds (default 30s) + """ + self.api_key = api_key + self.poll_interval = poll_interval + self.finnhub_client = finnhub.Client(api_key=api_key) + + self.subscribed_symbols: List[str] = [] + self.latest_prices: Dict[str, float] = {} + self.open_prices: Dict[str, float] = {} + self.price_callbacks: List[Callable] = [] + + self.running = False + self._thread: Optional[threading.Thread] = None + + logger.info( + f"PollingPriceManager initialized (interval: {poll_interval}s)", + ) + + def subscribe(self, symbols: List[str]): + """Subscribe to stock symbols""" + for symbol in symbols: + if symbol not in self.subscribed_symbols: + self.subscribed_symbols.append(symbol) + logger.info(f"Subscribed to: {symbol}") + + def unsubscribe(self, symbols: List[str]): + """Unsubscribe from symbols""" + for symbol in symbols: + if symbol in self.subscribed_symbols: + self.subscribed_symbols.remove(symbol) + logger.info(f"Unsubscribed: {symbol}") + + def add_price_callback(self, callback: Callable): + """Add price update callback""" + self.price_callbacks.append(callback) + + def _fetch_prices(self): + """Fetch latest prices for all subscribed stocks""" + for symbol in self.subscribed_symbols: + try: + quote_data = self.finnhub_client.quote(symbol) + + current_price = quote_data.get("c") + open_price = quote_data.get("o") + timestamp = quote_data.get("t", int(time.time())) + + if not current_price or current_price <= 0: + logger.warning(f"{symbol}: Invalid price data") + continue + + # Store open price on first fetch + if ( + symbol not in self.open_prices + and open_price + and open_price > 0 + ): + self.open_prices[symbol] = open_price + logger.info(f"{symbol} open price: ${open_price:.2f}") + + stored_open = self.open_prices.get(symbol, open_price) + ret = ( + ((current_price - stored_open) / stored_open) * 100 + if stored_open > 0 + else 0 + ) + + self.latest_prices[symbol] = current_price + + price_data = { + "symbol": symbol, + "price": current_price, + "timestamp": timestamp * 1000, + "open": stored_open, + "high": quote_data.get("h"), + "low": quote_data.get("l"), + "previous_close": quote_data.get("pc"), + "ret": ret, + "change": quote_data.get("d"), + "change_percent": quote_data.get("dp"), + } + + for callback in self.price_callbacks: + try: + callback(price_data) + except Exception as e: + logger.error(f"Price callback error ({symbol}): {e}") + + logger.debug( + f"{symbol}: ${current_price:.2f} [ret: {ret:+.2f}%]", + ) + + except Exception as e: + logger.error(f"Failed to fetch {symbol} price: {e}") + + def _polling_loop(self): + """Main polling loop""" + logger.info(f"Price polling started (interval: {self.poll_interval}s)") + + while self.running: + try: + start_time = time.time() + self._fetch_prices() + + elapsed = time.time() - start_time + sleep_time = max(0, self.poll_interval - elapsed) + if sleep_time > 0: + time.sleep(sleep_time) + + except Exception as e: + logger.error(f"Polling loop error: {e}") + time.sleep(5) + + def start(self): + """Start price polling""" + if self.running: + logger.warning("Price polling already running") + return + + if not self.subscribed_symbols: + logger.warning("No stocks subscribed") + return + + self.running = True + self._thread = threading.Thread(target=self._polling_loop, daemon=True) + self._thread.start() + + logger.info( + f"Price polling started: {', '.join(self.subscribed_symbols)}", + ) + + def stop(self): + """Stop price polling""" + self.running = False + if self._thread: + self._thread.join(timeout=5) + logger.info("Price polling stopped") + + def get_latest_price(self, symbol: str) -> Optional[float]: + """Get latest price for symbol""" + return self.latest_prices.get(symbol) + + def get_all_latest_prices(self) -> Dict[str, float]: + """Get all latest prices""" + return self.latest_prices.copy() + + def get_open_price(self, symbol: str) -> Optional[float]: + """Get open price for symbol""" + return self.open_prices.get(symbol) + + def reset_open_prices(self): + """Reset open prices for new trading day""" + self.open_prices.clear() + logger.info("Open prices reset") diff --git a/backend/data/ret_data_updater.py b/backend/data/ret_data_updater.py new file mode 100644 index 0000000..3c9a096 --- /dev/null +++ b/backend/data/ret_data_updater.py @@ -0,0 +1,387 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Automatic Incremental Historical Data Update Module + +Features: +1. Fetch stock historical data from configured API (Finnhub or Financial Datasets) +2. Incrementally update CSV files in ret_data directory +3. Automatically detect last update date, only download new data +4. Calculate returns (ret) +5. Support batch updates for multiple stocks +""" + +# flake8: noqa: E501 + +import logging +import os +import sys +import time +from datetime import datetime, timedelta +from pathlib import Path +from typing import Dict, List, Optional + +import exchange_calendars as xcals +import pandas as pd +import pandas_market_calendars as mcal +from dotenv import load_dotenv + +from backend.config.data_config import ( + get_config, +) +from backend.tools.data_tools import get_prices, prices_to_df + +# Add project root directory to path +BASE_DIR = Path(__file__).resolve().parents[2] +if str(BASE_DIR) not in sys.path: + sys.path.append(str(BASE_DIR)) + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s [%(levelname)s] %(message)s", +) +logger = logging.getLogger(__name__) + + +class DataUpdater: + """Data updater""" + + data_dir: Path + + def __init__( + self, + data_dir: str = None, + start_date: str = "2022-01-01", + ): + """ + Initialize data updater + + Args: + data_dir: Data storage directory, defaults to backend/data/ret_data + start_date: Historical data start date (YYYY-MM-DD) + """ + # Get config from centralized source + config = get_config() + self.data_source = config.source + self.api_key = config.api_key + + # Set data directory + if data_dir is None: + self.data_dir = BASE_DIR / "backend" / "data" / "ret_data" + else: + self.data_dir = Path(data_dir) + + # Ensure directory exists + self.data_dir.mkdir(parents=True, exist_ok=True) + + self.start_date = start_date + + # Initialize Finnhub client if needed + if self.data_source == "finnhub": + import finnhub + + self.client = finnhub.Client(api_key=self.api_key) + logger.info("Finnhub client initialized") + else: + self.client = None + logger.info("Financial Datasets API configured") + + def get_trading_dates(self, start_date: str, end_date: str) -> List[str]: + """Get US stock market trading date sequence.""" + try: + if mcal is not None: + nyse = mcal.get_calendar("NYSE") + trading_dates = nyse.valid_days( + start_date=start_date, + end_date=end_date, + ) + return [date.strftime("%Y-%m-%d") for date in trading_dates] + + elif xcals is not None: + nyse = xcals.get_calendar("XNYS") + trading_dates = nyse.sessions_in_range(start_date, end_date) + return [date.strftime("%Y-%m-%d") for date in trading_dates] + + except Exception as e: + logger.warning( + f"Failed to get US trading calendar, using business days: {e}", + ) + + # Fallback to simple business day method + date_range = pd.date_range(start_date, end_date, freq="B") + return [date.strftime("%Y-%m-%d") for date in date_range] + + def get_last_date_from_csv(self, ticker: str) -> Optional[datetime]: + """Get last data date from CSV file.""" + csv_path = self.data_dir / f"{ticker}.csv" + + if not csv_path.exists(): + logger.info(f"{ticker}.csv does not exist, will create new file") + return None + + try: + df = pd.read_csv(csv_path) + if df.empty or "time" not in df.columns: + return None + + last_date_str = df["time"].iloc[-1] + last_date = datetime.strptime(last_date_str, "%Y-%m-%d") + logger.info(f"{ticker} last data date: {last_date_str}") + return last_date + except Exception as e: + logger.warning(f"Failed to read {ticker}.csv: {e}") + return None + + def fetch_data_from_api( + self, + ticker: str, + start_date: datetime, + end_date: datetime, + ) -> Optional[pd.DataFrame]: + """Fetch data from configured API.""" + start_date_str = start_date.strftime("%Y-%m-%d") + end_date_str = end_date.strftime("%Y-%m-%d") + + logger.info( + f"Fetching {ticker} data from {self.data_source}: {start_date_str} to {end_date_str}", + ) + + prices = get_prices( + ticker=ticker, + start_date=start_date_str, + end_date=end_date_str, + ) + + if not prices: + logger.warning(f"{ticker} no data returned from API") + return None + + # Convert to DataFrame + df = prices_to_df(prices) + df = df.reset_index() + df["time"] = df["Date"].dt.strftime("%Y-%m-%d") + + # Calculate returns (next day return) + df["ret"] = df["close"].pct_change().shift(-1) + + # Select needed columns + df = df[["open", "close", "high", "low", "volume", "time", "ret"]] + + logger.info(f"Successfully fetched {ticker} data: {len(df)} records") + return df + + def merge_and_save(self, ticker: str, new_data: pd.DataFrame) -> bool: + """Merge old and new data and save.""" + csv_path = self.data_dir / f"{ticker}.csv" + + try: + if csv_path.exists(): + old_data = pd.read_csv(csv_path) + logger.info(f"{ticker} existing data: {len(old_data)} records") + + # Merge and deduplicate + combined = pd.concat([old_data, new_data], ignore_index=True) + combined = combined.drop_duplicates( + subset=["time"], + keep="last", + ) + combined = combined.sort_values("time").reset_index(drop=True) + + # Recalculate returns + combined["ret"] = combined["close"].pct_change().shift(-1) + + logger.info(f"{ticker} merged data: {len(combined)} records") + else: + combined = new_data + logger.info(f"{ticker} new file: {len(combined)} records") + + combined.to_csv(csv_path, index=False) + logger.info(f"{ticker} data saved to: {csv_path}") + return True + + except Exception as e: + logger.error(f"Failed to save {ticker} data: {e}") + return False + + def update_ticker( + self, + ticker: str, + force_full_update: bool = False, + ) -> bool: + """Update data for a single stock.""" + logger.info(f"{'='*60}") + logger.info(f"Starting update for {ticker}") + logger.info(f"{'='*60}") + + # Determine start date + if force_full_update: + start_date = datetime.strptime(self.start_date, "%Y-%m-%d") + logger.info(f"Force full update, start date: {start_date.date()}") + else: + last_date = self.get_last_date_from_csv(ticker) + if last_date: + start_date = last_date + timedelta(days=1) + logger.info( + f"Incremental update, start date: {start_date.date()}", + ) + else: + start_date = datetime.strptime(self.start_date, "%Y-%m-%d") + logger.info(f"First update, start date: {start_date.date()}") + + end_date = datetime.now() + + if start_date.date() >= end_date.date(): + logger.info(f"{ticker} data is up to date, no update needed") + return True + + new_data = self.fetch_data_from_api(ticker, start_date, end_date) + + if new_data is None or new_data.empty: + days_diff = (end_date - start_date).days + if days_diff <= 3: + logger.info( + f"{ticker} has no new data (may be weekend/holiday)", + ) + return True + else: + logger.warning(f"{ticker} has no new data") + return False + + success = self.merge_and_save(ticker, new_data) + + if success: + logger.info(f"{ticker} update completed") + else: + logger.error(f"{ticker} update failed") + + return success + + def update_all_tickers( + self, + tickers: List[str], + force_full_update: bool = False, + ) -> Dict[str, bool]: + """Batch update multiple stocks.""" + results = {} + + logger.info(f"{'='*60}") + logger.info(f"Starting batch update for {len(tickers)} stocks") + logger.info(f"Stock list: {', '.join(tickers)}") + logger.info(f"{'='*60}") + + for i, ticker in enumerate(tickers, 1): + logger.info(f"[{i}/{len(tickers)}] Processing {ticker}") + results[ticker] = self.update_ticker(ticker, force_full_update) + + # API rate limiting + if i < len(tickers): + time.sleep(1) + + # Print summary + logger.info(f"{'='*60}") + logger.info("Update Summary") + logger.info(f"{'='*60}") + + success_count = sum(results.values()) + fail_count = len(results) - success_count + + logger.info(f"Success: {success_count}") + logger.info(f"Failed: {fail_count}") + + if fail_count > 0: + failed_tickers = [t for t, s in results.items() if not s] + logger.warning(f"Failed stocks: {', '.join(failed_tickers)}") + + logger.info(f"{'='*60}\n") + + return results + + +def main(): + """Command line entry point""" + import argparse + + parser = argparse.ArgumentParser( + description="Automatically update stock historical data", + ) + parser.add_argument( + "--tickers", + type=str, + help="Stock ticker list (comma-separated), e.g.: AAPL,MSFT,GOOGL", + ) + parser.add_argument( + "--data-dir", + type=str, + help="Data storage directory (default: backend/data/ret_data)", + ) + parser.add_argument( + "--start-date", + type=str, + default="2022-01-01", + help="Historical data start date (YYYY-MM-DD, default: 2022-01-01)", + ) + parser.add_argument( + "--force", + action="store_true", + help="Force full update (re-download all data)", + ) + + args = parser.parse_args() + + # Load environment variables + load_dotenv() + + # Validate API key is available + try: + config = get_config() + logger.info(f"Using data source: {config.source}") + except ValueError as e: + logger.error(str(e)) + sys.exit(1) + + # Get stock list + if args.tickers: + tickers = [t.strip().upper() for t in args.tickers.split(",")] + else: + tickers_env = os.getenv("TICKERS", "") + if tickers_env: + tickers = [t.strip().upper() for t in tickers_env.split(",")] + else: + logger.error("Stock list not provided") + logger.error( + "Please set via --tickers parameter or TICKERS environment variable", + ) + sys.exit(1) + + # Create updater + updater = DataUpdater( + data_dir=args.data_dir, + start_date=args.start_date, + ) + + # Execute update + try: + results = updater.update_all_tickers( + tickers, + force_full_update=args.force, + ) + except Exception: + # API error (e.g., weekend/holiday with no data) + sys.exit(1) + + # Return status code + success_count = sum(results.values()) + if success_count == len(results): + logger.info("All stocks updated successfully!") + sys.exit(0) + elif success_count == 0: + logger.warning("All stocks have no new data (may be weekend/holiday)") + sys.exit(0) + else: + logger.warning("Some stocks failed to update, but will continue") + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/backend/data/schema.py b/backend/data/schema.py new file mode 100644 index 0000000..e73dade --- /dev/null +++ b/backend/data/schema.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +from pydantic import BaseModel + + +class Price(BaseModel): + open: float + close: float + high: float + low: float + volume: int + time: str + + +class PriceResponse(BaseModel): + ticker: str + prices: list[Price] + + +class FinancialMetrics(BaseModel): + ticker: str + report_period: str + period: str + currency: str + market_cap: float | None + enterprise_value: float | None + price_to_earnings_ratio: float | None + price_to_book_ratio: float | None + price_to_sales_ratio: float | None + enterprise_value_to_ebitda_ratio: float | None + enterprise_value_to_revenue_ratio: float | None + free_cash_flow_yield: float | None + peg_ratio: float | None + gross_margin: float | None + operating_margin: float | None + net_margin: float | None + return_on_equity: float | None + return_on_assets: float | None + return_on_invested_capital: float | None + asset_turnover: float | None + inventory_turnover: float | None + receivables_turnover: float | None + days_sales_outstanding: float | None + operating_cycle: float | None + working_capital_turnover: float | None + current_ratio: float | None + quick_ratio: float | None + cash_ratio: float | None + operating_cash_flow_ratio: float | None + debt_to_equity: float | None + debt_to_assets: float | None + interest_coverage: float | None + revenue_growth: float | None + earnings_growth: float | None + book_value_growth: float | None + earnings_per_share_growth: float | None + free_cash_flow_growth: float | None + operating_income_growth: float | None + ebitda_growth: float | None + payout_ratio: float | None + earnings_per_share: float | None + book_value_per_share: float | None + free_cash_flow_per_share: float | None + + +class FinancialMetricsResponse(BaseModel): + financial_metrics: list[FinancialMetrics] + + +class LineItem(BaseModel): + ticker: str + report_period: str + period: str + currency: str + + # Allow additional fields dynamically + model_config = {"extra": "allow"} + + +class LineItemResponse(BaseModel): + search_results: list[LineItem] + + +class InsiderTrade(BaseModel): + ticker: str + issuer: str | None + name: str | None + title: str | None + is_board_director: bool | None + transaction_date: str | None + transaction_shares: float | None + transaction_price_per_share: float | None + transaction_value: float | None + shares_owned_before_transaction: float | None + shares_owned_after_transaction: float | None + security_title: str | None + filing_date: str + + +class InsiderTradeResponse(BaseModel): + insider_trades: list[InsiderTrade] + + +class CompanyNews(BaseModel): + category: str | None = None + ticker: str + title: str + related: str | None = None + source: str + date: str | None = None + url: str + summary: str | None = None + + +class CompanyNewsResponse(BaseModel): + news: list[CompanyNews] + + +class CompanyFacts(BaseModel): + ticker: str + name: str + cik: str | None = None + industry: str | None = None + sector: str | None = None + category: str | None = None + exchange: str | None = None + is_active: bool | None = None + listing_date: str | None = None + location: str | None = None + market_cap: float | None = None + number_of_employees: int | None = None + sec_filings_url: str | None = None + sic_code: str | None = None + sic_industry: str | None = None + sic_sector: str | None = None + website_url: str | None = None + weighted_average_shares: int | None = None + + +class CompanyFactsResponse(BaseModel): + company_facts: CompanyFacts + + +class Position(BaseModel): + """Position information - for Portfolio mode""" + + long: int = 0 # Long position quantity (shares) + short: int = 0 # Short position quantity (shares) + long_cost_basis: float = 0.0 # Long position average cost + short_cost_basis: float = 0.0 # Short position average cost + + +class Portfolio(BaseModel): + """Portfolio - for Portfolio mode""" + + cash: float = 100000.0 # Available cash + positions: dict[str, Position] = {} # ticker -> Position mapping + # Margin requirement (0.0 means shorting disabled, 0.5 means 50% margin) + margin_requirement: float = 0.0 + margin_used: float = 0.0 # Margin used + + +class AnalystSignal(BaseModel): + signal: str | None = None + confidence: float | None = None + reasoning: dict | str | None = None + max_position_size: float | None = None # For risk management signals + + +class TickerAnalysis(BaseModel): + ticker: str + analyst_signals: dict[str, AnalystSignal] # agent_name -> signal mapping + + +class AgentStateData(BaseModel): + tickers: list[str] + portfolio: Portfolio + start_date: str + end_date: str + ticker_analyses: dict[str, TickerAnalysis] # ticker -> analysis mapping + + +class AgentStateMetadata(BaseModel): + show_reasoning: bool = False + model_config = {"extra": "allow"} diff --git a/backend/llm/__init__.py b/backend/llm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/llm/models.py b/backend/llm/models.py new file mode 100644 index 0000000..f8edfdd --- /dev/null +++ b/backend/llm/models.py @@ -0,0 +1,243 @@ +# -*- coding: utf-8 -*- +""" +AgentScope Native Model Factory +Uses native AgentScope model classes for LLM calls +""" +import os +from enum import Enum +from typing import Optional, Tuple +from agentscope.formatter import ( + AnthropicChatFormatter, + DashScopeChatFormatter, + GeminiChatFormatter, + OllamaChatFormatter, + OpenAIChatFormatter, +) +from agentscope.model import ( + AnthropicChatModel, + DashScopeChatModel, + GeminiChatModel, + OllamaChatModel, + OpenAIChatModel, +) + + +class ModelProvider(Enum): + """Supported model providers""" + + OPENAI = "OPENAI" + ANTHROPIC = "ANTHROPIC" + DASHSCOPE = "DASHSCOPE" + ALIBABA = "ALIBABA" + GEMINI = "GEMINI" + GOOGLE = "GOOGLE" + OLLAMA = "OLLAMA" + DEEPSEEK = "DEEPSEEK" + GROQ = "GROQ" + OPENROUTER = "OPENROUTER" + + +# Provider to AgentScope model class mapping +PROVIDER_MODEL_MAP = { + "OPENAI": OpenAIChatModel, + "ANTHROPIC": AnthropicChatModel, + "DASHSCOPE": DashScopeChatModel, + "ALIBABA": DashScopeChatModel, + "GEMINI": GeminiChatModel, + "GOOGLE": GeminiChatModel, + "OLLAMA": OllamaChatModel, + # OpenAI-compatible providers use OpenAIChatModel with custom base_url + "DEEPSEEK": OpenAIChatModel, + "GROQ": OpenAIChatModel, + "OPENROUTER": OpenAIChatModel, +} + +# Provider to formatter mapping +PROVIDER_FORMATTER_MAP = { + "OPENAI": OpenAIChatFormatter, + "ANTHROPIC": AnthropicChatFormatter, + "DASHSCOPE": DashScopeChatFormatter, + "ALIBABA": DashScopeChatFormatter, + "GEMINI": GeminiChatFormatter, + "GOOGLE": GeminiChatFormatter, + "OLLAMA": OllamaChatFormatter, + # OpenAI-compatible providers use OpenAIChatFormatter + "DEEPSEEK": OpenAIChatFormatter, + "GROQ": OpenAIChatFormatter, + "OPENROUTER": OpenAIChatFormatter, +} + +# Provider-specific base URLs +PROVIDER_BASE_URLS = { + "DEEPSEEK": "https://api.deepseek.com/v1", + "GROQ": "https://api.groq.com/openai/v1", + "OPENROUTER": "https://openrouter.ai/api/v1", +} + +# Provider-specific API key environment variable names +PROVIDER_API_KEY_ENV = { + "OPENAI": "OPENAI_API_KEY", + "ANTHROPIC": "ANTHROPIC_API_KEY", + "DASHSCOPE": "DASHSCOPE_API_KEY", + "ALIBABA": "DASHSCOPE_API_KEY", + "GEMINI": "GOOGLE_API_KEY", + "GOOGLE": "GOOGLE_API_KEY", + "DEEPSEEK": "DEEPSEEK_API_KEY", + "GROQ": "GROQ_API_KEY", + "OPENROUTER": "OPENROUTER_API_KEY", +} + + +def create_model( + model_name: str, + provider: str, + api_key: Optional[str] = None, + stream: bool = False, + **kwargs, +): + """ + Create an AgentScope model instance + + Args: + model_name: Model name (e.g., "gpt-4o", "claude-3-opus") + provider: Provider name (e.g., "OPENAI", "ANTHROPIC") + api_key: API key (optional, will read from env if not provided) + stream: Whether to use streaming mode + **kwargs: Additional model-specific arguments + + Returns: + AgentScope model instance + """ + provider = provider.upper() + + model_class = PROVIDER_MODEL_MAP.get(provider) + if model_class is None: + raise ValueError(f"Unsupported provider: {provider}") + + # Get API key from env if not provided + if api_key is None: + env_key = PROVIDER_API_KEY_ENV.get(provider) + if env_key: + api_key = os.getenv(env_key) + + # Build model kwargs + model_kwargs = { + "model_name": model_name, + "stream": stream, + **kwargs, + } + + # Add API key if needed (Ollama doesn't need it) + if provider != "OLLAMA" and api_key: + model_kwargs["api_key"] = api_key + + # Handle OpenAI-compatible providers with custom base_url + if provider in PROVIDER_BASE_URLS: + base_url = PROVIDER_BASE_URLS[provider] + model_kwargs["client_args"] = {"base_url": base_url} + + # Handle custom OpenAI base URL + if provider == "OPENAI": + base_url = os.getenv("OPENAI_BASE_URL") or os.getenv("OPENAI_API_BASE") + if base_url: + model_kwargs["client_args"] = {"base_url": base_url} + + # Handle DashScope base URL (uses different parameter) + if provider in ("DASHSCOPE", "ALIBABA"): + base_url = os.getenv("DASHSCOPE_BASE_URL") + if base_url: + model_kwargs["base_http_api_url"] = base_url + + # Handle Ollama host + if provider == "OLLAMA": + host = os.getenv("OLLAMA_HOST") + if host: + model_kwargs["host"] = host + + return model_class(**model_kwargs) + + +def get_agent_model(agent_id: str, stream: bool = False): + """ + Get model for a specific agent based on environment variables + + Environment variable pattern: + AGENT_{AGENT_ID}_MODEL_NAME: Model name + AGENT_{AGENT_ID}_MODEL_PROVIDER: Provider name + + fallback to global MODEL_NAME & MODEL_PROVIDER if agent-specific not given + + Args: + agent_id: Agent ID (e.g., "sentiment_analyst", "portfolio_manager") + stream: Whether to use streaming mode + + Returns: + AgentScope model instance + """ + # Normalize agent_id to uppercase for env var lookup + agent_key = agent_id.upper().replace("-", "_") + + # Try agent-specific config first + model_name = os.getenv(f"AGENT_{agent_key}_MODEL_NAME") + provider = os.getenv(f"AGENT_{agent_key}_MODEL_PROVIDER") + + print(f"Using specific model {model_name} for agent {agent_key}") + # Fall back to global config + if not model_name: + model_name = os.getenv("MODEL_NAME", "gpt-4o") + if not provider: + provider = os.getenv("MODEL_PROVIDER", "OPENAI") + + return create_model( + model_name=model_name, + provider=provider, + stream=stream, + ) + + +def get_agent_formatter(agent_id: str): + """ + Get formatter for a specific agent based on environment variables + + Args: + agent_id: Agent ID (e.g., "sentiment_analyst", "portfolio_manager") + + Returns: + AgentScope formatter instance + """ + # Normalize agent_id to uppercase for env var lookup + agent_key = agent_id.upper().replace("-", "_") + + # Try agent-specific config first + provider = os.getenv(f"AGENT_{agent_key}_MODEL_PROVIDER") + + # Fall back to global config + if not provider: + provider = os.getenv("MODEL_PROVIDER", "OPENAI") + + provider = provider.upper() + formatter_class = PROVIDER_FORMATTER_MAP.get(provider, OpenAIChatFormatter) + return formatter_class() + + +def get_agent_model_info(agent_id: str) -> Tuple[str, str]: + """ + Get model name and provider for a specific agent + + Args: + agent_id: Agent ID (e.g., "sentiment_analyst", "portfolio_manager") + + Returns: + Tuple of (model_name, provider_name) + """ + agent_key = agent_id.upper().replace("-", "_") + + model_name = os.getenv(f"AGENT_{agent_key}_MODEL_NAME") + provider = os.getenv(f"AGENT_{agent_key}_MODEL_PROVIDER") + + if not model_name: + model_name = os.getenv("MODEL_NAME", "gpt-4o") + if not provider: + provider = os.getenv("MODEL_PROVIDER", "OPENAI") + + return model_name, provider.upper() diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..79338eb --- /dev/null +++ b/backend/main.py @@ -0,0 +1,332 @@ +# -*- coding: utf-8 -*- +""" +Main Entry Point +Supports: backtest, live, mock modes +""" +import argparse +import asyncio +import logging +import os +from contextlib import AsyncExitStack +from pathlib import Path +import loguru + +from dotenv import load_dotenv + +from backend.agents import AnalystAgent, PMAgent, RiskAgent +from backend.config.constants import ANALYST_TYPES +from backend.config.env_config import get_env_float, get_env_int, get_env_list +from backend.core.pipeline import TradingPipeline +from backend.core.scheduler import BacktestScheduler, Scheduler +from backend.utils.settlement import SettlementCoordinator +from backend.llm.models import get_agent_formatter, get_agent_model +from backend.services.gateway import Gateway +from backend.services.market import MarketService +from backend.services.storage import StorageService + +load_dotenv() +logger = logging.getLogger(__name__) +loguru.logger.disable("flowllm") +loguru.logger.disable("reme_ai") + + +def create_long_term_memory(agent_name: str, config_name: str): + """ + Create ReMeTaskLongTermMemory for an agent + + Requires DASHSCOPE_API_KEY env var + """ + from agentscope.memory import ReMeTaskLongTermMemory + from agentscope.model import DashScopeChatModel + from agentscope.embedding import DashScopeTextEmbedding + + api_key = os.getenv("MEMORY_API_KEY") + if not api_key: + logger.warning("MEMORY_API_KEY not set, long-term memory disabled") + return None + + memory_dir = str(Path(config_name) / "memory") + + return ReMeTaskLongTermMemory( + agent_name=agent_name, + user_name=agent_name, + model=DashScopeChatModel( + model_name=os.getenv("MEMORY_MODEL_NAME", "qwen3-max"), + api_key=api_key, + stream=False, + ), + embedding_model=DashScopeTextEmbedding( + model_name=os.getenv( + "MEMORY_EMBEDDING_MODEL", + "text-embedding-v4", + ), + api_key=api_key, + dimensions=1024, + ), + **{ + "vector_store.default.backend": "local", + "vector_store.default.params.store_dir": memory_dir, + }, + ) + + +def create_agents( + config_name: str, + initial_cash: float, + margin_requirement: float, + enable_long_term_memory: bool = False, +): + """Create all agents for the system + + Returns: + tuple: (analysts, risk_manager, portfolio_manager, long_term_memories) + long_term_memories is a list of memory + """ + analysts = [] + long_term_memories = [] + + for analyst_type in ANALYST_TYPES: + model = get_agent_model(analyst_type) + formatter = get_agent_formatter(analyst_type) + toolkit = create_toolkit(analyst_type) + + long_term_memory = None + if enable_long_term_memory: + long_term_memory = create_long_term_memory( + analyst_type, + config_name, + ) + if long_term_memory: + long_term_memories.append(long_term_memory) + + analyst = AnalystAgent( + analyst_type=analyst_type, + toolkit=toolkit, + model=model, + formatter=formatter, + agent_id=analyst_type, + config={"config_name": config_name}, + long_term_memory=long_term_memory, + ) + analysts.append(analyst) + + risk_long_term_memory = None + if enable_long_term_memory: + risk_long_term_memory = create_long_term_memory( + "risk_manager", + config_name, + ) + if risk_long_term_memory: + long_term_memories.append(risk_long_term_memory) + + risk_manager = RiskAgent( + model=get_agent_model("risk_manager"), + formatter=get_agent_formatter("risk_manager"), + name="risk_manager", + config={"config_name": config_name}, + long_term_memory=risk_long_term_memory, + ) + + pm_long_term_memory = None + if enable_long_term_memory: + pm_long_term_memory = create_long_term_memory( + "portfolio_manager", + config_name, + ) + if pm_long_term_memory: + long_term_memories.append(pm_long_term_memory) + + portfolio_manager = PMAgent( + name="portfolio_manager", + model=get_agent_model("portfolio_manager"), + formatter=get_agent_formatter("portfolio_manager"), + initial_cash=initial_cash, + margin_requirement=margin_requirement, + config={"config_name": config_name}, + long_term_memory=pm_long_term_memory, + ) + + return analysts, risk_manager, portfolio_manager, long_term_memories + + +def create_toolkit(analyst_type: str): + """Create AgentScope Toolkit with tools for specific analyst type""" + from agentscope.tool import Toolkit + from backend.agents.prompt_loader import PromptLoader + from backend.tools.analysis_tools import TOOL_REGISTRY + + # Load analyst persona config + prompt_loader = PromptLoader() + personas_config = prompt_loader.load_yaml_config("analyst", "personas") + persona = personas_config.get(analyst_type, {}) + + # Get tool names for this analyst type + tool_names = persona.get("tools", []) + + # Create toolkit and register tools + toolkit = Toolkit() + for tool_name in tool_names: + tool_func = TOOL_REGISTRY.get(tool_name) + if tool_func: + toolkit.register_tool_function(tool_func) + + return toolkit + + +async def run_with_gateway(args): + """Run with WebSocket gateway""" + is_backtest = args.mode == "backtest" + + # Load config from env, override with args + tickers = get_env_list("TICKERS", ["AAPL", "MSFT"]) + initial_cash = get_env_float("INITIAL_CASH", 100000.0) + margin_requirement = get_env_float("MARGIN_REQUIREMENT", 0.0) + config_name = args.config_name + + # Create market service + market_service = MarketService( + tickers=tickers, + poll_interval=args.poll_interval, + mock_mode=args.mock and not is_backtest, + backtest_mode=is_backtest, + api_key=os.getenv("FINNHUB_API_KEY") + if not args.mock and not is_backtest + else None, + backtest_start_date=args.start_date if is_backtest else None, + backtest_end_date=args.end_date if is_backtest else None, + ) + + # Create storage service + storage_service = StorageService( + dashboard_dir=Path(config_name) / "team_dashboard", + initial_cash=initial_cash, + config_name=config_name, + ) + + if not storage_service.files["summary"].exists(): + storage_service.initialize_empty_dashboard() + else: + storage_service.update_leaderboard_model_info() + + # Create agents and pipeline + analysts, risk_manager, pm, long_term_memories = create_agents( + config_name=config_name, + initial_cash=initial_cash, + margin_requirement=margin_requirement, + enable_long_term_memory=args.enable_memory, + ) + portfolio_state = storage_service.load_portfolio_state() + pm.load_portfolio_state(portfolio_state) + + settlement_coordinator = SettlementCoordinator( + storage=storage_service, + initial_capital=initial_cash, + ) + + pipeline = TradingPipeline( + analysts=analysts, + risk_manager=risk_manager, + portfolio_manager=pm, + settlement_coordinator=settlement_coordinator, + max_comm_cycles=get_env_int("MAX_COMM_CYCLES", 2), + ) + + # Create scheduler callback + scheduler_callback = None + trading_dates = [] + + if is_backtest: + backtest_scheduler = BacktestScheduler( + start_date=args.start_date, + end_date=args.end_date, + trading_calendar="NYSE", + delay_between_days=0.5, + ) + trading_dates = backtest_scheduler.get_trading_dates() + + async def scheduler_callback_fn(callback): + await backtest_scheduler.start(callback) + + scheduler_callback = scheduler_callback_fn + else: + # Live mode: use daily scheduler with NYSE timezone + live_scheduler = Scheduler( + mode="daily", + trigger_time=args.trigger_time, + config={"config_name": config_name}, + ) + + async def scheduler_callback_fn(callback): + await live_scheduler.start(callback) + + scheduler_callback = scheduler_callback_fn + + # Create gateway + gateway = Gateway( + market_service=market_service, + storage_service=storage_service, + pipeline=pipeline, + scheduler_callback=scheduler_callback, + config={ + "mode": args.mode, + "mock_mode": args.mock, + "backtest_mode": is_backtest, + "tickers": tickers, + "config_name": config_name, + }, + ) + + if is_backtest: + gateway.set_backtest_dates(trading_dates) + + # Start long-term memory contexts and run gateway + async with AsyncExitStack() as stack: + for memory in long_term_memories: + await stack.enter_async_context(memory) + await gateway.start(host=args.host, port=args.port) + + +def main(): + """Main entry point""" + parser = argparse.ArgumentParser(description="Trading System") + parser.add_argument("--mode", choices=["live", "backtest"], default="live") + parser.add_argument("--mock", action="store_true") + parser.add_argument("--config-name", default="mock") + parser.add_argument("--host", default="0.0.0.0") + parser.add_argument("--port", type=int, default=8765) + parser.add_argument("--trigger-time", default="09:30") # NYSE market open + parser.add_argument("--poll-interval", type=int, default=10) + parser.add_argument("--start-date") + parser.add_argument("--end-date") + parser.add_argument( + "--enable-memory", + action="store_true", + help="Enable ReMeTaskLongTermMemory for agents", + ) + + args = parser.parse_args() + + # Load config from env for logging + tickers = get_env_list("TICKERS", ["AAPL", "MSFT"]) + initial_cash = get_env_float("INITIAL_CASH", 100000.0) + + logger.info("=" * 60) + logger.info(f"Mode: {args.mode}, Config: {args.config_name}") + logger.info(f"Tickers: {tickers}") + logger.info(f"Initial Cash: ${initial_cash:,.2f}") + logger.info( + f"Long-term Memory: {'enabled' if args.enable_memory else 'disabled'}", + ) + if args.mode == "backtest": + if not args.start_date or not args.end_date: + parser.error( + "--start-date and --end-date required for backtest mode", + ) + logger.info(f"Backtest: {args.start_date} to {args.end_date}") + logger.info("=" * 60) + + asyncio.run(run_with_gateway(args)) + + +if __name__ == "__main__": + main() diff --git a/backend/services/__init__.py b/backend/services/__init__.py new file mode 100644 index 0000000..249960b --- /dev/null +++ b/backend/services/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""Services layer for infrastructure components""" diff --git a/backend/services/gateway.py b/backend/services/gateway.py new file mode 100644 index 0000000..b456c32 --- /dev/null +++ b/backend/services/gateway.py @@ -0,0 +1,569 @@ +# -*- coding: utf-8 -*- +""" +WebSocket Gateway for frontend communication +""" +import asyncio +import json +import logging +from datetime import datetime +from typing import Any, Callable, Dict, List, Optional, Set + +import websockets +from websockets.server import WebSocketServerProtocol + +from backend.utils.msg_adapter import FrontendAdapter +from backend.utils.terminal_dashboard import get_dashboard +from backend.core.pipeline import TradingPipeline +from backend.core.state_sync import StateSync +from backend.services.market import MarketService +from backend.services.storage import StorageService + +logger = logging.getLogger(__name__) + + +class Gateway: + """WebSocket Gateway for frontend communication""" + + def __init__( + self, + market_service: MarketService, + storage_service: StorageService, + pipeline: TradingPipeline, + state_sync: Optional[StateSync] = None, + scheduler_callback: Optional[Callable] = None, + config: Dict[str, Any] = None, + ): + self.market_service = market_service + self.storage = storage_service + self.pipeline = pipeline + self.scheduler_callback = scheduler_callback + self.config = config or {} + + self.mode = self.config.get("mode", "live") + self.is_backtest = self.mode == "backtest" or self.config.get( + "backtest_mode", + False, + ) + + self.state_sync = state_sync or StateSync(storage=storage_service) + # self.state_sync.set_mode(self.is_backtest) + self.state_sync.set_broadcast_fn(self.broadcast) + self.pipeline.state_sync = self.state_sync + + self.connected_clients: Set[WebSocketServerProtocol] = set() + self.lock = asyncio.Lock() + self._backtest_task: Optional[asyncio.Task] = None + self._backtest_start_date: Optional[str] = None + self._backtest_end_date: Optional[str] = None + self._dashboard = get_dashboard() + self._market_status_task: Optional[asyncio.Task] = None + + # Session tracking for live returns + self._session_start_portfolio_value: Optional[float] = None + + async def start(self, host: str = "0.0.0.0", port: int = 8766): + """Start gateway server""" + logger.info(f"Starting gateway on {host}:{port}") + + # Initialize terminal dashboard + self._dashboard.set_config( + mode=self.mode, + config_name=self.config.get("config_name", "default"), + host=host, + port=port, + poll_interval=self.config.get("poll_interval", 10), + mock=self.config.get("mock_mode", False), + tickers=self.config.get("tickers", []), + initial_cash=self.storage.initial_cash, + start_date=self._backtest_start_date or "", + end_date=self._backtest_end_date or "", + ) + self._dashboard.start() + + self.state_sync.load_state() + self.state_sync.update_state("status", "running") + self.state_sync.update_state("server_mode", self.mode) + self.state_sync.update_state("is_backtest", self.is_backtest) + self.state_sync.update_state( + "is_mock_mode", + self.config.get("mock_mode", False), + ) + + # Load and display existing portfolio state if available + summary = self.storage.load_file("summary") + if summary: + holdings = self.storage.load_file("holdings") or [] + trades = self.storage.load_file("trades") or [] + current_date = self.state_sync.state.get("current_date") + self._dashboard.update( + date=current_date or "-", + status="running", + portfolio=summary, + holdings=holdings, + trades=trades, + ) + logger.info( + "Loaded existing portfolio: $%s", + f"{summary.get('totalAssetValue', 0):,.2f}", + ) + + await self.market_service.start(broadcast_func=self.broadcast) + + if self.scheduler_callback: + await self.scheduler_callback(callback=self.on_strategy_trigger) + + # Start market status monitoring (only for live mode) + if not self.is_backtest: + self._market_status_task = asyncio.create_task( + self._market_status_monitor(), + ) + + async with websockets.serve( + self.handle_client, + host, + port, + ping_interval=30, + ping_timeout=60, + ): + logger.info( + f"Gateway started: ws://{host}:{port}, mode={self.mode}", + ) + await asyncio.Future() + + @property + def state(self) -> Dict[str, Any]: + return self.state_sync.state + + async def handle_client(self, websocket: WebSocketServerProtocol): + """Handle WebSocket client connection""" + async with self.lock: + self.connected_clients.add(websocket) + + await self._send_initial_state(websocket) + await self._handle_client_messages(websocket) + + async with self.lock: + self.connected_clients.discard(websocket) + + async def _send_initial_state(self, websocket: WebSocketServerProtocol): + state_payload = self.state_sync.get_initial_state_payload( + include_dashboard=True, + ) + # Include market status in initial state + state_payload[ + "market_status" + ] = self.market_service.get_market_status() + + # Include live returns if session is active + if self.storage.is_live_session_active: + live_returns = self.storage.get_live_returns() + if "portfolio" in state_payload: + state_payload["portfolio"].update(live_returns) + + await websocket.send( + json.dumps( + {"type": "initial_state", "state": state_payload}, + ensure_ascii=False, + default=str, + ), + ) + + async def _handle_client_messages( + self, + websocket: WebSocketServerProtocol, + ): + try: + async for message in websocket: + data = json.loads(message) + msg_type = data.get("type", "unknown") + + if msg_type == "ping": + await websocket.send( + json.dumps( + { + "type": "pong", + "timestamp": datetime.now().isoformat(), + }, + ensure_ascii=False, + ), + ) + elif msg_type == "get_state": + await self._send_initial_state(websocket) + elif msg_type == "start_backtest": + await self._handle_start_backtest(data) + + except websockets.ConnectionClosed: + pass + except json.JSONDecodeError: + pass + + async def _handle_start_backtest(self, data: Dict[str, Any]): + if not self.is_backtest: + return + dates = data.get("dates", []) + if dates and self._backtest_task is None: + task = asyncio.create_task( + self._run_backtest_dates(dates), + ) + task.add_done_callback(self._handle_backtest_exception) + self._backtest_task = task + + async def broadcast(self, message: Dict[str, Any]): + """Broadcast message to all connected clients""" + if not self.connected_clients: + return + + message_json = json.dumps(message, ensure_ascii=False, default=str) + + async with self.lock: + tasks = [ + self._send_to_client(client, message_json) + for client in self.connected_clients.copy() + ] + + if tasks: + await asyncio.gather(*tasks, return_exceptions=True) + + async def _send_to_client( + self, + client: WebSocketServerProtocol, + message: str, + ): + try: + await client.send(message) + except websockets.ConnectionClosed: + async with self.lock: + self.connected_clients.discard(client) + + async def _market_status_monitor(self): + """Periodically check and broadcast market status changes""" + while True: + try: + await self.market_service.check_and_broadcast_market_status() + + # On market open, start live session tracking + status = self.market_service.get_market_status() + if ( + status["status"] == "open" + and not self.storage.is_live_session_active + ): + self.storage.start_live_session() + summary = self.storage.load_file("summary") or {} + self._session_start_portfolio_value = summary.get( + "totalAssetValue", + self.storage.initial_cash, + ) + logger.info( + "Session start portfolio: " + f"${self._session_start_portfolio_value:,.2f}", + ) + elif ( + status["status"] != "open" + and self.storage.is_live_session_active + ): + self.storage.end_live_session() + self._session_start_portfolio_value = None + + # Update and broadcast live returns if session is active + if self.storage.is_live_session_active: + await self._update_and_broadcast_live_returns() + + await asyncio.sleep(60) # Check every minute + except asyncio.CancelledError: + break + except Exception as e: + logger.error(f"Market status monitor error: {e}") + await asyncio.sleep(60) + + async def _update_and_broadcast_live_returns(self): + """Calculate and broadcast live returns for current session""" + if not self.storage.is_live_session_active: + return + + # Get current prices and calculate portfolio value + prices = self.market_service.get_all_prices() + if not prices or not any(p > 0 for p in prices.values()): + return + + # Load current internal state to get baseline values + state = self.storage.load_internal_state() + + # Get latest values from history (if available) + equity_history = state.get("equity_history", []) + baseline_history = state.get("baseline_history", []) + baseline_vw_history = state.get("baseline_vw_history", []) + momentum_history = state.get("momentum_history", []) + + current_equity = equity_history[-1]["v"] if equity_history else None + current_baseline = ( + baseline_history[-1]["v"] if baseline_history else None + ) + current_baseline_vw = ( + baseline_vw_history[-1]["v"] if baseline_vw_history else None + ) + current_momentum = ( + momentum_history[-1]["v"] if momentum_history else None + ) + + # Update live returns with current values + point = self.storage.update_live_returns( + current_equity=current_equity, + current_baseline=current_baseline, + current_baseline_vw=current_baseline_vw, + current_momentum=current_momentum, + ) + + # Broadcast if we have new data + if point: + live_returns = self.storage.get_live_returns() + await self.broadcast( + { + "type": "team_summary", + "equity_return": live_returns["equity_return"], + "baseline_return": live_returns["baseline_return"], + "baseline_vw_return": live_returns["baseline_vw_return"], + "momentum_return": live_returns["momentum_return"], + }, + ) + + async def on_strategy_trigger(self, date: str): + """Handle trading cycle trigger""" + logger.info(f"Strategy triggered for {date}") + + tickers = self.config.get("tickers", []) + + if self.is_backtest: + await self._run_backtest_cycle(date, tickers) + else: + await self._run_live_cycle(date, tickers) + + async def _run_backtest_cycle(self, date: str, tickers: List[str]): + """Run backtest cycle with pre-loaded prices""" + self.market_service.set_backtest_date(date) + await self.market_service.emit_market_open() + + await self.state_sync.on_cycle_start(date) + self._dashboard.update(date=date, status="Analyzing...") + + prices = self.market_service.get_open_prices() + close_prices = self.market_service.get_close_prices() + market_caps = self._get_market_caps(tickers, date) + + result = await self.pipeline.run_cycle( + tickers=tickers, + date=date, + prices=prices, + close_prices=close_prices, + market_caps=market_caps, + ) + + await self.market_service.emit_market_close() + settlement_result = result.get("settlement_result") + self._save_cycle_results(result, date, close_prices, settlement_result) + await self._broadcast_portfolio_updates(result, close_prices) + await self._finalize_cycle(date) + + async def _run_live_cycle(self, date: str, tickers: List[str]): + """ + Run live cycle with real market timing. + + - Analysis runs immediately + - Execution waits for market open + (or uses current prices if already open) + - Settlement waits for market close + """ + # Get actual trading date (might be next trading day if weekend) + trading_date = self.market_service.get_live_trading_date() + logger.info( + f"Live cycle: triggered={date}, trading_date={trading_date}", + ) + + await self.state_sync.on_cycle_start(trading_date) + self._dashboard.update(date=trading_date, status="Analyzing...") + + market_caps = self._get_market_caps(tickers, trading_date) + + # Run pipeline with async price callbacks + result = await self.pipeline.run_cycle( + tickers=tickers, + date=trading_date, + market_caps=market_caps, + get_open_prices_fn=self.market_service.wait_for_open_prices, + get_close_prices_fn=self.market_service.wait_for_close_prices, + ) + + close_prices = self.market_service.get_all_prices() + settlement_result = result.get("settlement_result") + self._save_cycle_results( + result, + trading_date, + close_prices, + settlement_result, + ) + await self._broadcast_portfolio_updates(result, close_prices) + await self._finalize_cycle(trading_date) + + async def _finalize_cycle(self, date: str): + """Finalize cycle: broadcast state and update dashboard""" + summary = self.storage.load_file("summary") or {} + + # Include live returns if session is active + if self.storage.is_live_session_active: + live_returns = self.storage.get_live_returns() + summary.update(live_returns) + + await self.state_sync.on_cycle_end(date, portfolio_summary=summary) + + holdings = self.storage.load_file("holdings") or [] + trades = self.storage.load_file("trades") or [] + leaderboard = self.storage.load_file("leaderboard") or [] + + if leaderboard: + await self.state_sync.on_leaderboard_update(leaderboard) + + self._dashboard.update( + date=date, + status="Running", + portfolio=summary, + holdings=holdings, + trades=trades, + ) + + def _get_market_caps( + self, + tickers: List[str], + date: str, + ) -> Dict[str, float]: + """ + Get market caps for tickers (stub implementation) + + Args: + tickers: List of tickers + date: Trading date + + Returns: + Dict mapping ticker to market cap + """ + from ..tools.data_tools import get_market_cap + + market_caps = {} + for ticker in tickers: + try: + market_cap = get_market_cap(ticker, date) + if market_cap: + market_caps[ticker] = market_cap + else: + market_caps[ticker] = 1e9 + except Exception: + market_caps[ticker] = 1e9 + + return market_caps + + async def _broadcast_portfolio_updates( + self, + result: Dict[str, Any], + prices: Dict[str, float], + ): + portfolio = result.get("portfolio", {}) + + if portfolio: + holdings = FrontendAdapter.build_holdings(portfolio, prices) + if holdings: + await self.state_sync.on_holdings_update(holdings) + + stats = FrontendAdapter.build_stats(portfolio, prices) + if stats: + await self.state_sync.on_stats_update(stats) + + executed_trades = result.get("executed_trades", []) + if executed_trades: + await self.state_sync.on_trades_executed(executed_trades) + + def _save_cycle_results( + self, + result: Dict[str, Any], + date: str, + prices: Dict[str, float], + settlement_result: Optional[Dict[str, Any]] = None, + ): + portfolio = result.get("portfolio", {}) + executed_trades = result.get("executed_trades", []) + + # Extract baseline values from settlement result + baseline_values = None + if settlement_result: + baseline_values = settlement_result.get("baseline_values") + + if portfolio: + self.storage.update_dashboard_after_cycle( + portfolio=portfolio, + prices=prices, + date=date, + executed_trades=executed_trades, + baseline_values=baseline_values, + ) + + async def _run_backtest_dates(self, dates: List[str]): + self.state_sync.set_backtest_dates(dates) + self._dashboard.update(days_total=len(dates), days_completed=0) + + await self.state_sync.on_system_message( + f"Starting backtest - {len(dates)} trading days", + ) + + try: + for i, date in enumerate(dates): + self._dashboard.update(days_completed=i) + await self.on_strategy_trigger(date=date) + await asyncio.sleep(0.1) + + await self.state_sync.on_system_message( + f"Backtest complete - {len(dates)} days", + ) + + # Update dashboard with final state + summary = self.storage.load_file("summary") or {} + self._dashboard.update( + status="Complete", + portfolio=summary, + days_completed=len(dates), + ) + self._dashboard.stop() + self._dashboard.print_final_summary() + except Exception as e: + error_msg = f"Backtest failed: {type(e).__name__}: {str(e)}" + logger.error(error_msg, exc_info=True) + await self.state_sync.on_system_message(error_msg) + self._dashboard.update(status=f"Failed: {str(e)}") + self._dashboard.stop() + raise + finally: + self._backtest_task = None + + def _handle_backtest_exception(self, task: asyncio.Task): + """Handle exceptions from backtest task""" + try: + task.result() + except asyncio.CancelledError: + logger.info("Backtest task was cancelled") + except Exception as e: + logger.error( + f"Backtest task failed with exception:{type(e).__name__}:{e}", + exc_info=True, + ) + + def set_backtest_dates(self, dates: List[str]): + self.state_sync.set_backtest_dates(dates) + if dates: + self._backtest_start_date = dates[0] + self._backtest_end_date = dates[-1] + self._dashboard.days_total = len(dates) + + def stop(self): + self.state_sync.save_state() + self.market_service.stop() + if self._backtest_task: + self._backtest_task.cancel() + if self._market_status_task: + self._market_status_task.cancel() + self._dashboard.stop() diff --git a/backend/services/market.py b/backend/services/market.py new file mode 100644 index 0000000..7a337e2 --- /dev/null +++ b/backend/services/market.py @@ -0,0 +1,625 @@ +# -*- coding: utf-8 -*- +""" +Market Data Service +Supports live, mock, and backtest modes +""" +import asyncio +import logging +from datetime import datetime, timedelta +from typing import Any, Callable, Dict, List, Optional +from zoneinfo import ZoneInfo + +import pandas_market_calendars as mcal + +logger = logging.getLogger(__name__) + +# NYSE timezone and calendar +NYSE_TZ = ZoneInfo("America/New_York") +NYSE_CALENDAR = mcal.get_calendar("NYSE") + + +class MarketStatus: + """Market status enum-like class""" + + OPEN = "open" + CLOSED = "closed" + PREMARKET = "premarket" + AFTERHOURS = "afterhours" + + +class MarketService: + """Market data service for price management""" + + def __init__( + self, + tickers: List[str], + poll_interval: int = 10, + mock_mode: bool = False, + backtest_mode: bool = False, + api_key: Optional[str] = None, + backtest_start_date: Optional[str] = None, + backtest_end_date: Optional[str] = None, + ): + self.tickers = tickers + self.poll_interval = poll_interval + self.mock_mode = mock_mode + self.backtest_mode = backtest_mode + self.api_key = api_key + self.backtest_start_date = backtest_start_date + self.backtest_end_date = backtest_end_date + + self.cache: Dict[str, Dict[str, Any]] = {} + self.running = False + self._loop: Optional[asyncio.AbstractEventLoop] = None + self._broadcast_func: Optional[Callable] = None + self._price_manager: Optional[Any] = None + self._current_date: Optional[str] = None + + # Market status tracking + self._last_market_status: Optional[str] = None + + # Session tracking for live returns + self._session_start_values: Optional[Dict[str, float]] = None + self._session_start_timestamp: Optional[int] = None + + @property + def mode_name(self) -> str: + if self.backtest_mode: + return "BACKTEST" + elif self.mock_mode: + return "MOCK" + return "LIVE" + + async def start(self, broadcast_func: Callable): + """Start market data service""" + if self.running: + return + + self.running = True + self._loop = asyncio.get_running_loop() + self._broadcast_func = broadcast_func + + if self.backtest_mode: + self._start_backtest_mode() + elif self.mock_mode: + self._start_mock_mode() + else: + self._start_real_mode() + + logger.info( + f"Market service started: {self.mode_name}, tickers={self.tickers}", # noqa: E501 + ) + + def _make_price_callback(self) -> Callable: + """Create thread-safe price callback""" + + def callback(price_data: Dict[str, Any]): + symbol = price_data["symbol"] + self.cache[symbol] = price_data + + loop = self._loop + if loop and loop.is_running() and self._broadcast_func: + asyncio.run_coroutine_threadsafe( + self._broadcast_price_update(price_data), + loop, + ) + + return callback + + def _start_mock_mode(self): + from backend.data.mock_price_manager import MockPriceManager + + self._price_manager = MockPriceManager( + poll_interval=self.poll_interval, + volatility=0.5, + ) + self._price_manager.add_price_callback(self._make_price_callback()) + self._price_manager.subscribe( + self.tickers, + base_prices={t: 100.0 for t in self.tickers}, + ) + self._price_manager.start() + + def _start_real_mode(self): + from backend.data.polling_price_manager import PollingPriceManager + + if not self.api_key: + raise ValueError("API key required for live mode") + self._price_manager = PollingPriceManager( + api_key=self.api_key, + poll_interval=self.poll_interval, + ) + self._price_manager.add_price_callback(self._make_price_callback()) + self._price_manager.subscribe(self.tickers) + self._price_manager.start() + + def _start_backtest_mode(self): + from backend.data.historical_price_manager import ( + HistoricalPriceManager, + ) + + self._price_manager = HistoricalPriceManager() + self._price_manager.add_price_callback(self._make_price_callback()) + self._price_manager.subscribe(self.tickers) + + if self.backtest_start_date and self.backtest_end_date: + self._price_manager.preload_data( + self.backtest_start_date, + self.backtest_end_date, + ) + + self._price_manager.start() + + async def _broadcast_price_update(self, price_data: Dict[str, Any]): + """Broadcast price update to frontend""" + if not self._broadcast_func: + return + + symbol = price_data["symbol"] + price = price_data["price"] + open_price = price_data.get("open", price) + ret = ( + ((price - open_price) / open_price) * 100 if open_price > 0 else 0 + ) + + await self._broadcast_func( + { + "type": "price_update", + "symbol": symbol, + "price": price, + "open": open_price, + "ret": ret, + "timestamp": price_data.get("timestamp"), + "realtime_prices": { + t: self._get_cached_price(t) for t in self.tickers + }, + }, + ) + + def _get_cached_price(self, ticker: str) -> Dict[str, Any]: + """Get cached price data for a ticker""" + if ticker in self.cache: + return self.cache[ticker] + # Return from price manager if not in cache + if self._price_manager: + price = self._price_manager.get_latest_price(ticker) + if price: + return {"price": price, "symbol": ticker} + return {"price": 0, "symbol": ticker} + + def stop(self): + """Stop market service""" + if not self.running: + return + self.running = False + if self._price_manager: + self._price_manager.stop() + self._price_manager = None + self._loop = None + self._broadcast_func = None + + # Backtest methods + def set_backtest_date(self, date: str): + """Set current backtest date""" + if not self.backtest_mode or not self._price_manager: + return + self._current_date = date + self._price_manager.set_date(date) + logger.info(f"Backtest date: {date}") + + async def emit_market_open(self): + """Emit market open prices""" + if self.backtest_mode and self._price_manager: + self._price_manager.emit_open_prices() + # Log prices for debugging + prices = self.get_open_prices() + logger.info(f"Open prices: {prices}") + + async def emit_market_close(self): + """Emit market close prices""" + if self.backtest_mode and self._price_manager: + self._price_manager.emit_close_prices() + # Log prices for debugging + prices = self.get_close_prices() + logger.info(f"Close prices: {prices}") + + def get_open_prices(self) -> Dict[str, float]: + """Get open prices for all tickers""" + prices = {} + for ticker in self.tickers: + price = None + # Try price manager first + if self.backtest_mode and self._price_manager: + price = self._price_manager.get_open_price(ticker) + # Fallback to cache + if price is None or price <= 0: + cached = self.cache.get(ticker, {}) + price = cached.get("open") or cached.get("price") + prices[ticker] = price if price and price > 0 else 0.0 + return prices + + def get_close_prices(self) -> Dict[str, float]: + """Get close prices for all tickers""" + prices = {} + for ticker in self.tickers: + price = None + # Try price manager first + if self.backtest_mode and self._price_manager: + price = self._price_manager.get_close_price(ticker) + # Fallback to cache + if price is None or price <= 0: + cached = self.cache.get(ticker, {}) + price = cached.get("close") or cached.get("price") + prices[ticker] = price if price and price > 0 else 0.0 + return prices + + def get_price_for_date( + self, + ticker: str, + date: str, + price_type: str = "close", + ) -> Optional[float]: + """Get price for a specific date""" + if self.backtest_mode and self._price_manager: + return self._price_manager.get_price_for_date( + ticker, + date, + price_type, + ) + return self.get_price_sync(ticker) + + # Common methods + def get_price_sync(self, ticker: str) -> Optional[float]: + """Get latest price synchronously""" + # Try cache first + data = self.cache.get(ticker) + if data and data.get("price"): + return data["price"] + # Try price manager + if self._price_manager: + return self._price_manager.get_latest_price(ticker) + return None + + def get_all_prices(self) -> Dict[str, float]: + """Get all latest prices""" + prices = {} + for ticker in self.tickers: + price = self.get_price_sync(ticker) + prices[ticker] = price if price and price > 0 else 0.0 + return prices + + # Live mode async waiting methods + + def _now_nyse(self) -> datetime: + """Get current time in NYSE timezone""" + return datetime.now(NYSE_TZ) + + def _is_trading_day(self, date: datetime) -> bool: + """Check if date is a NYSE trading day""" + date_str = date.strftime("%Y-%m-%d") + valid_days = NYSE_CALENDAR.valid_days( + start_date=date_str, + end_date=date_str, + ) + return len(valid_days) > 0 + + def _get_market_hours(self, date: datetime) -> tuple: + """Get market open and close times for a given date""" + date_str = date.strftime("%Y-%m-%d") + schedule = NYSE_CALENDAR.schedule( + start_date=date_str, + end_date=date_str, + ) + if schedule.empty: + return None, None + market_open = schedule.iloc[0]["market_open"].to_pydatetime() + market_close = schedule.iloc[0]["market_close"].to_pydatetime() + return market_open, market_close + + def _next_trading_day(self, from_date: datetime) -> datetime: + """Find the next trading day from given date""" + check_date = from_date + timedelta(days=1) + for _ in range(10): # Max 10 days ahead (handles holidays) + if self._is_trading_day(check_date): + return check_date + check_date += timedelta(days=1) + return check_date + + def _get_trading_date_for_execution(self) -> tuple: + """ + Determine the trading date for execution. + + Returns: + (trading_date, market_open_time, market_close_time) + + Logic: + - If today is a trading day and market has opened: use today + - If today is a trading day but market hasn't opened: wait for open + - If today is not a trading day: use next trading day + """ + now = self._now_nyse() + today = now.replace(hour=0, minute=0, second=0, microsecond=0) + + if self._is_trading_day(today): + market_open, market_close = self._get_market_hours(today) + return today, market_open, market_close + else: + # Weekend or holiday - find next trading day + next_day = self._next_trading_day(today) + market_open, market_close = self._get_market_hours(next_day) + return next_day, market_open, market_close + + async def wait_for_open_prices(self) -> Dict[str, float]: + """ + Wait for market open and return open prices. + + Behavior: + - If market is already open today: return current prices immediately + - If market hasn't opened yet today: wait until open + - If not a trading day: wait until next trading day opens + """ + now = self._now_nyse() + trading_date, market_open, _ = self._get_trading_date_for_execution() + + if market_open is None: + logger.warning("Could not determine market hours") + return self.get_all_prices() + + trading_date_str = trading_date.strftime("%Y-%m-%d") + + # Check if we need to wait + if now < market_open: + wait_seconds = (market_open - now).total_seconds() + logger.info( + f"Waiting {wait_seconds/60:.1f} min for market open " + f"({trading_date_str} {market_open.strftime('%H:%M')} ET)", + ) + await asyncio.sleep(wait_seconds) + # Small delay to ensure prices are available + await asyncio.sleep(5) + else: + logger.info( + f"Market already open for {trading_date_str}, " + f"getting current prices", + ) + + # Poll until we have valid prices + prices = await self._poll_for_prices() + logger.info(f"Got open prices for {trading_date_str}: {prices}") + return prices + + async def wait_for_close_prices(self) -> Dict[str, float]: + """ + Wait for market close and return close prices. + + Behavior: + - If market is already closed today: return current prices immediately + - If market hasn't closed yet: wait until close + """ + now = self._now_nyse() + trading_date, _, market_close = self._get_trading_date_for_execution() + + if market_close is None: + logger.warning("Could not determine market hours") + return self.get_all_prices() + + trading_date_str = trading_date.strftime("%Y-%m-%d") + + # Check if we need to wait + if now < market_close: + wait_seconds = (market_close - now).total_seconds() + logger.info( + f"Waiting {wait_seconds/60:.1f} min for market close " + f"({trading_date_str} {market_close.strftime('%H:%M')} ET)", + ) + await asyncio.sleep(wait_seconds) + # Small delay to ensure final prices settle + await asyncio.sleep(10) + else: + logger.info( + f"Market already closed for {trading_date_str}, " + f"getting close prices", + ) + + # Get final prices + prices = await self._poll_for_prices() + logger.info(f"Got close prices for {trading_date_str}: {prices}") + return prices + + def get_live_trading_date(self) -> str: + """Get the trading date that will be used for live execution""" + trading_date, _, _ = self._get_trading_date_for_execution() + return trading_date.strftime("%Y-%m-%d") + + async def _poll_for_prices( + self, + max_retries: int = 12, + ) -> Dict[str, float]: + """Poll until all prices are available""" + for _ in range(max_retries): + prices = self.get_all_prices() + if all(p > 0 for p in prices.values()): + return prices + logger.debug("Waiting for prices to be available...") + await asyncio.sleep(5) + # Return whatever we have + return self.get_all_prices() + + # ========== Market Status Methods ========== + + def get_market_status(self) -> Dict[str, Any]: + """ + Get current market status + + Returns: + Dict with status info: + - status: 'open' | 'closed' | 'premarket' | 'afterhours' + - status_text: Human readable status + - is_trading_day: Whether today is a trading day + - market_open: Market open time (if trading day) + - market_close: Market close time (if trading day) + """ + if self.backtest_mode: + # In backtest mode, always return open + return { + "status": MarketStatus.OPEN, + "status_text": "Backtest Mode", + "is_trading_day": True, + } + + now = self._now_nyse() + today = now.replace(hour=0, minute=0, second=0, microsecond=0) + + is_trading = self._is_trading_day(today) + + if not is_trading: + return { + "status": MarketStatus.CLOSED, + "status_text": "Market Closed (Non-trading Day)", + "is_trading_day": False, + } + + market_open, market_close = self._get_market_hours(today) + + if market_open is None or market_close is None: + return { + "status": MarketStatus.CLOSED, + "status_text": "Market Closed", + "is_trading_day": is_trading, + } + + # Determine status based on current time + if now < market_open: + return { + "status": MarketStatus.PREMARKET, + "status_text": "Pre-Market", + "is_trading_day": True, + "market_open": market_open.isoformat(), + "market_close": market_close.isoformat(), + } + elif now > market_close: + return { + "status": MarketStatus.CLOSED, + "status_text": "Market Closed", + "is_trading_day": True, + "market_open": market_open.isoformat(), + "market_close": market_close.isoformat(), + } + else: + return { + "status": MarketStatus.OPEN, + "status_text": "Market Open", + "is_trading_day": True, + "market_open": market_open.isoformat(), + "market_close": market_close.isoformat(), + } + + async def check_and_broadcast_market_status(self): + """Check market status and broadcast if changed""" + status = self.get_market_status() + current_status = status["status"] + + if current_status != self._last_market_status: + self._last_market_status = current_status + await self._broadcast_market_status(status) + + # Handle session transitions + if current_status == MarketStatus.OPEN: + await self._on_session_start() + elif ( + current_status == MarketStatus.CLOSED + and self._session_start_values is not None + ): + self._on_session_end() + + async def _broadcast_market_status(self, status: Dict[str, Any]): + """Broadcast market status update to frontend""" + if not self._broadcast_func: + return + + await self._broadcast_func( + { + "type": "market_status_update", + "market_status": status, + "timestamp": datetime.now(NYSE_TZ).isoformat(), + }, + ) + logger.info(f"Market status: {status['status_text']}") + + async def _on_session_start(self): + """Called when market session starts - capture baseline values""" + # Wait briefly for prices to be available + await asyncio.sleep(2) + + prices = self.get_all_prices() + if prices and any(p > 0 for p in prices.values()): + self._session_start_values = prices.copy() + self._session_start_timestamp = int( + datetime.now().timestamp() * 1000, + ) + logger.info(f"Session started with prices: {prices}") + + def _on_session_end(self): + """Called when market session ends - clear session data""" + self._session_start_values = None + self._session_start_timestamp = None + logger.info("Session ended, cleared session data") + + def get_session_returns( + self, + current_prices: Dict[str, float], + portfolio_value: Optional[float] = None, + session_start_portfolio_value: Optional[float] = None, + ) -> Optional[Dict[str, Any]]: + """ + Calculate session returns (from session start to now) + + Args: + current_prices: Current prices for tickers + portfolio_value: Current portfolio value (optional) + session_start_portfolio_value: + + Returns: + Dict with return data or None if session not started + """ + if self._session_start_values is None: + return None + + timestamp = int(datetime.now().timestamp() * 1000) + returns = {} + + # Calculate individual ticker returns + for ticker, start_price in self._session_start_values.items(): + current = current_prices.get(ticker) + if current and start_price and start_price > 0: + ret = ((current - start_price) / start_price) * 100 + returns[ticker] = round(ret, 4) + + result = { + "timestamp": timestamp, + "ticker_returns": returns, + } + + # Calculate portfolio return if values provided + if ( + portfolio_value is not None + and session_start_portfolio_value is not None + ): + if session_start_portfolio_value > 0: + portfolio_ret = ( + (portfolio_value - session_start_portfolio_value) + / session_start_portfolio_value + ) * 100 + result["portfolio_return"] = round(portfolio_ret, 4) + + return result + + @property + def session_start_values(self) -> Optional[Dict[str, float]]: + """Get session start values for external use""" + return self._session_start_values + + @property + def session_start_timestamp(self) -> Optional[int]: + """Get session start timestamp""" + return self._session_start_timestamp diff --git a/backend/services/storage.py b/backend/services/storage.py new file mode 100644 index 0000000..30608d8 --- /dev/null +++ b/backend/services/storage.py @@ -0,0 +1,1099 @@ +# -*- coding: utf-8 -*- +""" +Storage Service - Data persistence and dashboard file management +Handles reading/writing dashboard JSON files and portfolio state +""" +# pylint: disable=R0904 +import json +import logging +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional + +logger = logging.getLogger(__name__) + + +class StorageService: + """ + Storage service for data persistence + + Responsibilities: + 1. Load/save dashboard JSON files + (summary, holdings, stats, trades, leaderboard) + 2. Load/save internal state (_internal_state.json) + 3. Load/save server state (server_state.json) with feed history + 4. Manage portfolio state persistence + 5. Support loading from saved state to resume execution + """ + + def __init__( + self, + dashboard_dir: Path, + initial_cash: float = 100000.0, + config_name: str = "mock", + ): + """ + Initialize storage service + + Args: + dashboard_dir: Directory for dashboard files + initial_cash: Initial cash amount + config_name: Configuration name for state directory + """ + self.dashboard_dir = Path(dashboard_dir) + self.dashboard_dir.mkdir(parents=True, exist_ok=True) + self.initial_cash = initial_cash + self.config_name = config_name + + # Dashboard file paths + self.files = { + "summary": self.dashboard_dir / "summary.json", + "holdings": self.dashboard_dir / "holdings.json", + "stats": self.dashboard_dir / "stats.json", + "trades": self.dashboard_dir / "trades.json", + "leaderboard": self.dashboard_dir / "leaderboard.json", + } + + # Internal state file + self.internal_state_file = self.dashboard_dir / "_internal_state.json" + + # Server state directory and file + self.state_dir = self.dashboard_dir.parent / "state" + self.state_dir.mkdir(parents=True, exist_ok=True) + self.server_state_file = self.state_dir / "server_state.json" + + # Feed history (for agent messages) + self.max_feed_history = 200 + + # File modification time cache (for change detection) + self.file_mtimes: Dict[str, float] = {} + + # Live returns tracking (for current trading session) + self._session_start_equity: Optional[float] = None + self._session_start_baseline: Optional[float] = None + self._session_start_baseline_vw: Optional[float] = None + self._session_start_momentum: Optional[float] = None + self._live_return_history: List[Dict[str, Any]] = [] + + logger.info(f"Storage service initialized: {self.dashboard_dir}") + + def load_file(self, file_type: str) -> Optional[Any]: + """ + Load dashboard JSON file + + Args: + file_type: One of: summary, holdings, stats, trades, leaderboard + + Returns: + Loaded data or None if file doesn't exist + """ + file_path = self.files.get(file_type) + if not file_path or not file_path.exists(): + return None + + try: + with open(file_path, "r", encoding="utf-8") as f: + return json.load(f) + except Exception as e: + logger.error(f"Failed to load {file_type}.json: {e}") + return None + + def save_file(self, file_type: str, data: Any): + """ + Save dashboard JSON file + + Args: + file_type: One of: summary, holdings, stats, trades, leaderboard + data: Data to save + """ + file_path = self.files.get(file_type) + if not file_path: + logger.error(f"Unknown file type: {file_type}") + return + + try: + with open(file_path, "w", encoding="utf-8") as f: + json.dump(data, f, indent=2, ensure_ascii=False) + except Exception as e: + logger.error(f"Failed to save {file_type}.json: {e}") + + def check_file_updates(self) -> Dict[str, bool]: + """ + Check which dashboard files have been updated since last check + + Returns: + Dictionary mapping file_type to whether it was updated + """ + updated = {} + + for file_type, file_path in self.files.items(): + if not file_path.exists(): + updated[file_type] = False + continue + + try: + current_mtime = file_path.stat().st_mtime + last_mtime = self.file_mtimes.get(file_type, 0) + + if current_mtime > last_mtime: + updated[file_type] = True + self.file_mtimes[file_type] = current_mtime + else: + updated[file_type] = False + except Exception as e: + logger.error(f"Failed to check file update ({file_type}): {e}") + updated[file_type] = False + + return updated + + def load_internal_state(self) -> Dict[str, Any]: + """ + Load internal state from file + + Returns: + Internal state dictionary with default values + """ + default_state = { + "baseline_state": {"initialized": False, "initial_allocation": {}}, + "baseline_vw_state": { + "initialized": False, + "initial_allocation": {}, + }, + "momentum_state": { + "positions": {}, + "cash": 0.0, + "initialized": False, + }, + "equity_history": [], + "baseline_history": [], + "baseline_vw_history": [], + "momentum_history": [], + "price_history": {}, + "portfolio_state": { + "cash": self.initial_cash, + "positions": {}, + "margin_used": 0.0, + }, + "all_trades": [], + "daily_position_history": {}, + } + + if not self.internal_state_file.exists(): + return default_state + + try: + with open(self.internal_state_file, "r", encoding="utf-8") as f: + data = json.load(f) + + # Merge with defaults + for key, value in default_state.items(): + data.setdefault(key, value) + + logger.info("Loaded internal state from file") + return data + + except Exception as e: + logger.warning( + f"Failed to load internal state, using defaults: {e}", + ) + return default_state + + def save_internal_state(self, state: Dict[str, Any]): + """ + Save internal state to file + + Args: + state: Internal state dictionary + """ + if not state: + return + + try: + with open(self.internal_state_file, "w", encoding="utf-8") as f: + json.dump(state, f, indent=2, ensure_ascii=False) + except Exception as e: + logger.error(f"Failed to save internal state: {e}") + + def load_portfolio_state(self) -> Dict[str, Any]: + """ + Load portfolio state from internal state + + Returns: + Portfolio state dictionary: {cash, positions, margin_used} + """ + internal_state = self.load_internal_state() + portfolio_state = internal_state.get("portfolio_state", {}) + + return { + "cash": portfolio_state.get("cash", self.initial_cash), + "positions": portfolio_state.get("positions", {}), + "margin_used": portfolio_state.get("margin_used", 0.0), + "margin_requirement": 0.25, # Default 25% margin requirement + } + + def save_portfolio_state(self, portfolio: Dict[str, Any]): + """ + Save portfolio state to internal state + + Args: + portfolio: Portfolio dictionary + """ + internal_state = self.load_internal_state() + internal_state["portfolio_state"] = { + "cash": portfolio.get("cash", 0.0), + "positions": portfolio.get("positions", {}), + "margin_used": portfolio.get("margin_used", 0.0), + } + self.save_internal_state(internal_state) + + def initialize_empty_dashboard(self): + """Initialize empty dashboard files with default values""" + # Summary + self.save_file( + "summary", + { + "totalAssetValue": self.initial_cash, + "totalReturn": 0.0, + "cashPosition": self.initial_cash, + "tickerWeights": {}, + "totalTrades": 0, + "pnlPct": 0.0, + "balance": self.initial_cash, + "equity": [], + "baseline": [], + "baseline_vw": [], + "momentum": [], + }, + ) + + # Holdings + self.save_file("holdings", []) + + # Stats + self.save_file( + "stats", + { + "totalAssetValue": self.initial_cash, + "totalReturn": 0.0, + "cashPosition": self.initial_cash, + "tickerWeights": {}, + "totalTrades": 0, + "winRate": 0.0, + "bullBear": { + "bull": {"n": 0, "win": 0}, + "bear": {"n": 0, "win": 0}, + }, + }, + ) + + # Trades + self.save_file("trades", []) + + # Leaderboard with model info + self.generate_leaderboard() + + logger.info("Initialized empty dashboard") + + def generate_leaderboard(self): + """Generate leaderboard with agent model info from environment""" + from ..config.constants import AGENT_CONFIG + from ..llm.models import get_agent_model_info + + leaderboard = [] + ranking_entries = [] + team_entries = [] + + for agent_id, config in AGENT_CONFIG.items(): + model_name, model_provider = get_agent_model_info(agent_id) + + entry = { + "agentId": agent_id, + "name": config["name"], + "role": config["role"], + "avatar": config["avatar"], + "rank": None if config["is_team_role"] else 0, + "winRate": None, + "bull": {"n": 0, "win": 0, "unknown": 0}, + "bear": {"n": 0, "win": 0, "unknown": 0}, + "logs": [], + "signals": [], + "modelName": model_name, + "modelProvider": model_provider, + } + + if config["is_team_role"]: + team_entries.append(entry) + else: + ranking_entries.append(entry) + + leaderboard = team_entries + ranking_entries + self.save_file("leaderboard", leaderboard) + logger.info("Leaderboard generated with model info") + + def update_leaderboard_model_info(self): + """ + Update model info in existing leaderboard (preserves performance data) + """ + from ..config.constants import AGENT_CONFIG + from ..llm.models import get_agent_model_info + + existing = self.load_file("leaderboard") or [] + + if not existing: + self.generate_leaderboard() + return + + for entry in existing: + agent_id = entry.get("agentId") + if agent_id and agent_id in AGENT_CONFIG: + model_name, model_provider = get_agent_model_info(agent_id) + entry["modelName"] = model_name + entry["modelProvider"] = model_provider + + self.save_file("leaderboard", existing) + logger.info("Leaderboard model info updated") + + def get_current_timestamp_ms(self, date: str = None) -> int: + """ + Get timestamp in milliseconds from date string or current time + + Args: + date: Optional date string (YYYY-MM-DD) for backtest compatibility. + Uses market close time (16:00) for the timestamp. + + Returns: + Timestamp in milliseconds + """ + if date: + # Parse date and use market close time (16:00) for backtest + dt = datetime.strptime(f"{date} 16:00:00", "%Y-%m-%d %H:%M:%S") + return int(dt.timestamp() * 1000) + return int(datetime.now().timestamp() * 1000) + + def calculate_portfolio_value( + self, + portfolio: Dict[str, Any], + prices: Dict[str, float], + ) -> float: + """ + Calculate total portfolio value (net asset value) + + Args: + portfolio: Portfolio state with cash and positions + prices: Current prices for each ticker + + Returns: + Total portfolio value + """ + cash = portfolio.get("cash", 0.0) + margin_used = portfolio.get("margin_used", 0.0) + total = cash + margin_used + + positions = portfolio.get("positions", {}) + for ticker, position in positions.items(): + price = prices.get(ticker, 0) + if price > 0: + long_qty = position.get("long", 0) + short_qty = position.get("short", 0) + total += long_qty * price + total -= short_qty * price + + return total + + def update_dashboard_after_cycle( + self, + portfolio: Dict[str, Any], + prices: Dict[str, float], + date: str, + executed_trades: List[Dict[str, Any]] = None, + baseline_values: Optional[Dict[str, float]] = None, + ): + """ + Update all dashboard files after a trading cycle + + Args: + portfolio: Current portfolio state + prices: Current prices for each ticker + date: Trading date (YYYY-MM-DD) + executed_trades: List of executed trades + [{ticker, action, quantity, price}] + baseline_values: Optional baseline portfolio values from settlement + {equal_weight, market_cap_weighted, momentum} + """ + # Use provided date for timestamp (backtest compatible) + timestamp_ms = self.get_current_timestamp_ms(date) + + net_value = self.calculate_portfolio_value(portfolio, prices) + + state = self.load_internal_state() + + # Initialize all histories + for key in [ + "equity_history", + "baseline_history", + "baseline_vw_history", + "momentum_history", + ]: + if key not in state: + state[key] = [] + + # Add initial points if empty (all histories should start together) + if len(state["equity_history"]) == 0: + initial_point = { + "t": timestamp_ms - 86400000, + "v": round(self.initial_cash, 2), + } + state["equity_history"].append(initial_point) + state["baseline_history"].append(initial_point.copy()) + state["baseline_vw_history"].append(initial_point.copy()) + state["momentum_history"].append(initial_point.copy()) + + # Add current data points - all histories updated together + state["equity_history"].append( + { + "t": timestamp_ms, + "v": round(net_value, 2), + }, + ) + + # If baseline_values provided, use them; + # otherwise forward-fill from last value + if baseline_values: + state["baseline_history"].append( + { + "t": timestamp_ms, + "v": round( + baseline_values.get("equal_weight", self.initial_cash), + 2, + ), + }, + ) + state["baseline_vw_history"].append( + { + "t": timestamp_ms, + "v": round( + baseline_values.get( + "market_cap_weighted", + self.initial_cash, + ), + 2, + ), + }, + ) + state["momentum_history"].append( + { + "t": timestamp_ms, + "v": round( + baseline_values.get("momentum", self.initial_cash), + 2, + ), + }, + ) + else: + # Forward-fill: use last known value + last_baseline = ( + state["baseline_history"][-1]["v"] + if state["baseline_history"] + else self.initial_cash + ) + last_baseline_vw = ( + state["baseline_vw_history"][-1]["v"] + if state["baseline_vw_history"] + else self.initial_cash + ) + last_momentum = ( + state["momentum_history"][-1]["v"] + if state["momentum_history"] + else self.initial_cash + ) + + state["baseline_history"].append( + {"t": timestamp_ms, "v": last_baseline}, + ) + state["baseline_vw_history"].append( + {"t": timestamp_ms, "v": last_baseline_vw}, + ) + state["momentum_history"].append( + {"t": timestamp_ms, "v": last_momentum}, + ) + + state["portfolio_state"] = { + "cash": portfolio.get("cash", 0.0), + "positions": portfolio.get("positions", {}), + "margin_used": portfolio.get("margin_used", 0.0), + } + + # Update trades with structured data + if executed_trades: + if "all_trades" not in state: + state["all_trades"] = [] + + for i, trade in enumerate(executed_trades): + action = trade.get("action", "hold") + side = ( + "LONG" + if action == "long" + else "SHORT" + if action == "short" + else "HOLD" + ) + + trade_id = ( + f"t_{date.replace('-', '')}_{trade.get('ticker', '')}_{i}" + ) + state["all_trades"].append( + { + "id": trade_id, + "ts": timestamp_ms, + "trading_date": date, + "side": side, + "ticker": trade.get("ticker", ""), + "qty": trade.get("quantity", 0), + "price": round(trade.get("price", 0), 2), + }, + ) + + state["last_update_date"] = date + + self.save_internal_state(state) + + self._generate_summary(state, net_value, prices) + self._generate_holdings(state, prices) + self._generate_stats(state, net_value) + self._generate_trades(state) + + logger.info(f"Dashboard updated: net_value=${net_value:,.2f}") + + def _generate_summary( + self, + state: Dict[str, Any], + net_value: float, + prices: Dict[str, float], + ): + """Generate summary.json""" + portfolio_state = state.get("portfolio_state", {}) + cash = portfolio_state.get("cash", self.initial_cash) + + # Calculate ticker weights + positions = portfolio_state.get("positions", {}) + ticker_weights = {} + + for ticker, position in positions.items(): + price = prices.get(ticker, 0) + if price > 0 and net_value > 0: + long_qty = position.get("long", 0) + short_qty = position.get("short", 0) + position_value = (long_qty - short_qty) * price + ticker_weights[ticker] = round(position_value / net_value, 4) + + # Calculate return + total_return = ( + (net_value - self.initial_cash) / self.initial_cash + ) * 100 + + summary = { + "totalAssetValue": round(net_value, 2), + "totalReturn": round(total_return, 2), + "cashPosition": round(cash, 2), + "tickerWeights": ticker_weights, + "totalTrades": len(state.get("all_trades", [])), + "pnlPct": round(total_return, 2), + "balance": round(net_value, 2), + "equity": state.get("equity_history", []), + "baseline": state.get("baseline_history", []), + "baseline_vw": state.get("baseline_vw_history", []), + "momentum": state.get("momentum_history", []), + } + + self.save_file("summary", summary) + + def _generate_holdings( + self, + state: Dict[str, Any], + prices: Dict[str, float], + ): + """Generate holdings.json""" + portfolio_state = state.get("portfolio_state", {}) + positions = portfolio_state.get("positions", {}) + cash = portfolio_state.get("cash", self.initial_cash) + margin_used = portfolio_state.get("margin_used", 0.0) + + # Calculate total value + total_value = cash + margin_used + for ticker, position in positions.items(): + price = prices.get(ticker, 0) + if price > 0: + long_qty = position.get("long", 0) + short_qty = position.get("short", 0) + total_value += (long_qty - short_qty) * price + + holdings = [] + + # Add stock positions + for ticker, position in positions.items(): + price = prices.get(ticker, 0) + long_qty = position.get("long", 0) + short_qty = position.get("short", 0) + net_qty = long_qty - short_qty + + if net_qty != 0 and price > 0: + market_value = net_qty * price + weight = ( + abs(market_value) / total_value if total_value > 0 else 0 + ) + + holdings.append( + { + "ticker": ticker, + "quantity": net_qty, + "currentPrice": round(price, 2), + "marketValue": round(market_value, 2), + "weight": round(weight, 4), + }, + ) + + # Add cash + cash_weight = cash / total_value if total_value > 0 else 0 + holdings.append( + { + "ticker": "CASH", + "quantity": 1, + "currentPrice": round(cash, 2), + "marketValue": round(cash, 2), + "weight": round(cash_weight, 4), + }, + ) + + # Sort by weight + holdings.sort(key=lambda x: abs(x["weight"]), reverse=True) + + self.save_file("holdings", holdings) + + def _generate_stats(self, state: Dict[str, Any], net_value: float): + """Generate stats.json""" + portfolio_state = state.get("portfolio_state", {}) + cash = portfolio_state.get("cash", self.initial_cash) + total_return = ( + (net_value - self.initial_cash) / self.initial_cash + ) * 100 + + stats = { + "totalAssetValue": round(net_value, 2), + "totalReturn": round(total_return, 2), + "cashPosition": round(cash, 2), + "tickerWeights": {}, + "totalTrades": len(state.get("all_trades", [])), + "winRate": 0.0, + "bullBear": { + "bull": {"n": 0, "win": 0}, + "bear": {"n": 0, "win": 0}, + }, + } + + self.save_file("stats", stats) + + def _generate_trades(self, state: Dict[str, Any]): + """Generate trades.json""" + all_trades = state.get("all_trades", []) + + sorted_trades = sorted( + all_trades, + key=lambda x: x.get("ts", 0), + reverse=True, + ) + + trades = [] + for trade in sorted_trades[:100]: + trades.append( + { + "id": trade.get("id"), + "timestamp": trade.get("ts"), + "trading_date": trade.get("trading_date"), + "side": trade.get("side", ""), + "ticker": trade.get("ticker", ""), + "qty": trade.get("qty", 0), + "price": trade.get("price", 0), + }, + ) + + self.save_file("trades", trades) + + # Server State Management Methods + + def load_server_state(self) -> Dict[str, Any]: + """ + Load server state from file + + Returns: + Server state dictionary with feed_history and other data + """ + default_state = { + "status": "initializing", + "current_date": None, + "portfolio": { + "total_value": self.initial_cash, + "cash": self.initial_cash, + "pnl_percent": 0.0, + "equity": [], + "baseline": [], + "baseline_vw": [], + "momentum": [], + "strategies": [], + }, + "holdings": [], + "trades": [], + "stats": self._get_default_stats(), + "leaderboard": [], + "realtime_prices": {}, + "system_started": datetime.now().isoformat(), + "feed_history": [], + "last_day_history": [], + "trading_days_total": 0, + "trading_days_completed": 0, + } + + if not self.server_state_file.exists(): + return default_state + + with open(self.server_state_file, "r", encoding="utf-8") as f: + saved_state = json.load(f) + + # Merge with defaults to ensure all fields exist + for key, value in default_state.items(): + saved_state.setdefault(key, value) + + logger.info(f"Server state loaded from: {self.server_state_file}") + logger.info( + f"Feed history: {len(saved_state.get('feed_history', []))} messages", # noqa: E501 + ) + logger.info( + f"Holdings: {len(saved_state.get('holdings', []))} items", + ) + logger.info(f"Trades: {len(saved_state.get('trades', []))} records") + + return saved_state + + def save_server_state(self, state: Dict[str, Any]): + """ + Save server state to file + + Args: + state: Server state dictionary + """ + state_to_save = { + **state, + "last_saved": datetime.now().isoformat(), + } + + # Limit feed_history size + if "feed_history" in state_to_save: + state_to_save["feed_history"] = state_to_save["feed_history"][ + : self.max_feed_history + ] + + # Limit trades + if "trades" in state_to_save: + state_to_save["trades"] = state_to_save["trades"][:100] + + with open(self.server_state_file, "w", encoding="utf-8") as f: + json.dump( + state_to_save, + f, + ensure_ascii=False, + indent=2, + default=str, + ) + + logger.debug(f"Server state saved to: {self.server_state_file}") + + def add_feed_message( + self, + state: Dict[str, Any], + event: Dict[str, Any], + ) -> bool: + """ + Add a message to feed history + + Args: + state: Server state dictionary to update + event: Event dictionary with type, content, etc. + + Returns: + True if message was added, False if filtered out + """ + event_type = event.get("type", "") + + # Types to save in feed history + save_types = { + "system", + "agent_message", + "day_start", + "day_complete", + "day_error", + "team_summary", + "conference_start", + "conference_message", + "conference_end", + "memory", + } + + if event_type not in save_types: + return False + + # Ensure timestamp exists + if "timestamp" not in event: + event["timestamp"] = datetime.now().isoformat() + + # Store event directly (flat structure, no metadata wrapper) + feed_msg = dict(event) + + # Insert at beginning (newest first) + if "feed_history" not in state: + state["feed_history"] = [] + + state["feed_history"].insert(0, feed_msg) + + # Trim to max size + if len(state["feed_history"]) > self.max_feed_history: + state["feed_history"] = state["feed_history"][ + : self.max_feed_history + ] + + return True + + def _get_default_stats(self) -> Dict[str, Any]: + """Get default stats structure""" + return { + "totalAssetValue": 0.0, + "totalReturn": -100.0, + "cashPosition": 0.0, + "tickerWeights": {}, + "totalTrades": 0, + "winRate": 0.0, + "bullBear": { + "bull": {"n": 0, "win": 0}, + "bear": {"n": 0, "win": 0}, + }, + } + + def update_server_state_from_dashboard(self, state: Dict[str, Any]): + """ + Update server state with current dashboard data + + Args: + state: Server state dictionary to update + """ + # Load dashboard data + summary = self.load_file("summary") or {} + holdings = self.load_file("holdings") or [] + stats = self.load_file("stats") or self._get_default_stats() + trades = self.load_file("trades") or [] + leaderboard = self.load_file("leaderboard") or [] + + # Update state + state["portfolio"] = { + "total_value": summary.get("totalAssetValue", self.initial_cash), + "cash": summary.get("cashPosition", self.initial_cash), + "pnl_percent": summary.get("pnlPct", 0.0), + "equity": summary.get("equity", []), + "baseline": summary.get("baseline", []), + "baseline_vw": summary.get("baseline_vw", []), + "momentum": summary.get("momentum", []), + "strategies": [], + # Live returns (will be populated when session is active) + "equity_return": [], + "baseline_return": [], + "baseline_vw_return": [], + "momentum_return": [], + } + state["holdings"] = holdings + state["stats"] = stats + state["trades"] = trades + state["leaderboard"] = leaderboard + + # ========== Live Returns Tracking ========== + + def start_live_session(self): + """ + Start tracking live returns for current trading session. + Captures current values as session start baseline. + """ + summary = self.load_file("summary") or {} + state = self.load_internal_state() + + # Capture current values as session start + equity_history = state.get("equity_history", []) + baseline_history = state.get("baseline_history", []) + baseline_vw_history = state.get("baseline_vw_history", []) + momentum_history = state.get("momentum_history", []) + + self._session_start_equity = ( + equity_history[-1]["v"] + if equity_history + else summary.get("totalAssetValue", self.initial_cash) + ) + self._session_start_baseline = ( + baseline_history[-1]["v"] + if baseline_history + else self.initial_cash + ) + self._session_start_baseline_vw = ( + baseline_vw_history[-1]["v"] + if baseline_vw_history + else self.initial_cash + ) + self._session_start_momentum = ( + momentum_history[-1]["v"] + if momentum_history + else self.initial_cash + ) + + # Clear live return history + self._live_return_history = [] + + # Add starting point at 0% + timestamp = int(datetime.now().timestamp() * 1000) + self._live_return_history.append( + { + "t": timestamp, + "equity": 0.0, + "baseline": 0.0, + "baseline_vw": 0.0, + "momentum": 0.0, + }, + ) + + logger.info( + "Live session started: " + f"equity=${self._session_start_equity:,.2f}, " + f"baseline=${self._session_start_baseline:,.2f}", + ) + + def end_live_session(self): + """End live returns tracking session""" + self._session_start_equity = None + self._session_start_baseline = None + self._session_start_baseline_vw = None + self._session_start_momentum = None + self._live_return_history = [] + logger.info("Live session ended") + + def update_live_returns( + self, + current_equity: Optional[float] = None, + current_baseline: Optional[float] = None, + current_baseline_vw: Optional[float] = None, + current_momentum: Optional[float] = None, + ) -> Optional[Dict[str, Any]]: + """ + Update live returns with current values. + + Args: + current_equity: Current portfolio value + current_baseline: Current EW baseline value + current_baseline_vw: Current VW baseline value + current_momentum: Current momentum strategy value + + Returns: + Dict with live return data point or None if session not active + """ + if ( + self._session_start_equity is None + or self._session_start_baseline is None + or self._session_start_baseline_vw is None + or self._session_start_momentum is None + ): + return None + + timestamp = int(datetime.now().timestamp() * 1000) + point = {"t": timestamp} + + # Calculate returns (only if we have valid values) + if current_equity is not None and self._session_start_equity > 0: + ret = ( + (current_equity - self._session_start_equity) + / self._session_start_equity + ) * 100 + point["equity"] = round(ret, 4) + + if current_baseline is not None and self._session_start_baseline > 0: + ret = ( + (current_baseline - self._session_start_baseline) + / self._session_start_baseline + ) * 100 + point["baseline"] = round(ret, 4) + + if ( + current_baseline_vw is not None + and self._session_start_baseline_vw > 0 + ): + ret = ( + (current_baseline_vw - self._session_start_baseline_vw) + / self._session_start_baseline_vw + ) * 100 + point["baseline_vw"] = round(ret, 4) + + if current_momentum is not None and self._session_start_momentum > 0: + ret = ( + (current_momentum - self._session_start_momentum) + / self._session_start_momentum + ) * 100 + point["momentum"] = round(ret, 4) + + # Only add point if we have at least one return value + if any(k != "t" for k in point): + self._live_return_history.append(point) + # Limit history size + if len(self._live_return_history) > 500: + self._live_return_history = self._live_return_history[-500:] + return point + + return None + + def get_live_returns(self) -> Dict[str, List[Dict[str, Any]]]: + """ + Get live return curves for the current session. + + Returns: + Dict with separate arrays for each strategy: + - equity_return: [{t, v}, ...] + - baseline_return: [{t, v}, ...] + - baseline_vw_return: [{t, v}, ...] + - momentum_return: [{t, v}, ...] + """ + if not self._live_return_history: + return { + "equity_return": [], + "baseline_return": [], + "baseline_vw_return": [], + "momentum_return": [], + } + + # Convert combined history to separate arrays + equity_return = [] + baseline_return = [] + baseline_vw_return = [] + momentum_return = [] + + for point in self._live_return_history: + t = point["t"] + if "equity" in point: + equity_return.append({"t": t, "v": point["equity"]}) + if "baseline" in point: + baseline_return.append({"t": t, "v": point["baseline"]}) + if "baseline_vw" in point: + baseline_vw_return.append({"t": t, "v": point["baseline_vw"]}) + if "momentum" in point: + momentum_return.append({"t": t, "v": point["momentum"]}) + + return { + "equity_return": equity_return, + "baseline_return": baseline_return, + "baseline_vw_return": baseline_vw_return, + "momentum_return": momentum_return, + } + + @property + def is_live_session_active(self) -> bool: + """Check if live session is active""" + return self._session_start_equity is not None diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/tests/test_agents.py b/backend/tests/test_agents.py new file mode 100644 index 0000000..a426fec --- /dev/null +++ b/backend/tests/test_agents.py @@ -0,0 +1,580 @@ +# -*- coding: utf-8 -*- +# pylint: disable=W0212 +import json +import tempfile +from pathlib import Path +from unittest.mock import MagicMock + +import pytest +from agentscope.message import Msg + + +class TestAnalystAgent: + def test_init_valid_analyst_type(self): + from backend.agents.analyst import AnalystAgent + + mock_toolkit = MagicMock() + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = AnalystAgent( + analyst_type="technical_analyst", + toolkit=mock_toolkit, + model=mock_model, + formatter=mock_formatter, + ) + + assert agent.analyst_type_key == "technical_analyst" + assert agent.name == "technical_analyst_analyst" + assert agent.analyst_persona == "Technical Analyst" + + def test_init_invalid_analyst_type(self): + from backend.agents.analyst import AnalystAgent + + mock_toolkit = MagicMock() + mock_model = MagicMock() + mock_formatter = MagicMock() + + with pytest.raises(ValueError) as excinfo: + AnalystAgent( + analyst_type="invalid_type", + toolkit=mock_toolkit, + model=mock_model, + formatter=mock_formatter, + ) + + assert "Unknown analyst type" in str(excinfo.value) + + def test_init_custom_agent_id(self): + from backend.agents.analyst import AnalystAgent + + mock_toolkit = MagicMock() + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = AnalystAgent( + analyst_type="fundamentals_analyst", + toolkit=mock_toolkit, + model=mock_model, + formatter=mock_formatter, + agent_id="custom_analyst_id", + ) + + assert agent.name == "custom_analyst_id" + + def test_load_system_prompt(self): + from backend.agents.analyst import AnalystAgent + + mock_toolkit = MagicMock() + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = AnalystAgent( + analyst_type="sentiment_analyst", + toolkit=mock_toolkit, + model=mock_model, + formatter=mock_formatter, + ) + + prompt = agent._load_system_prompt() + assert isinstance(prompt, str) + assert len(prompt) > 0 + + +class TestPMAgent: + def test_init_default(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + ) + + assert agent.name == "portfolio_manager" + assert agent.portfolio["cash"] == 100000.0 + assert agent.portfolio["positions"] == {} + assert agent.portfolio["margin_requirement"] == 0.25 + + def test_init_custom_cash(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + initial_cash=50000.0, + margin_requirement=0.5, + ) + + assert agent.portfolio["cash"] == 50000.0 + assert agent.portfolio["margin_requirement"] == 0.5 + + def test_get_portfolio_state(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + initial_cash=75000.0, + ) + + state = agent.get_portfolio_state() + + assert state["cash"] == 75000.0 + assert state is not agent.portfolio # Should be a copy + + def test_load_portfolio_state(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + ) + + new_portfolio = { + "cash": 50000.0, + "positions": { + "AAPL": {"long": 100, "short": 0, "long_cost_basis": 150.0}, + }, + "margin_used": 1000.0, + } + + agent.load_portfolio_state(new_portfolio) + + assert agent.portfolio["cash"] == 50000.0 + assert "AAPL" in agent.portfolio["positions"] + + def test_update_portfolio(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + ) + + agent.update_portfolio({"cash": 80000.0}) + assert agent.portfolio["cash"] == 80000.0 + + def _get_text_from_tool_response(self, result): + """Helper to extract text from ToolResponse content""" + content = result.content[0] + if hasattr(content, "text"): + return content.text + elif isinstance(content, dict): + return content.get("text", "") + return str(content) + + def test_make_decision_long(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + ) + + result = agent._make_decision( + ticker="AAPL", + action="long", + quantity=100, + confidence=80, + reasoning="Strong fundamentals", + ) + + text = self._get_text_from_tool_response(result) + assert "Decision recorded" in text + assert agent._decisions["AAPL"]["action"] == "long" + assert agent._decisions["AAPL"]["quantity"] == 100 + + def test_make_decision_hold(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + ) + + result = agent._make_decision( + ticker="GOOGL", + action="hold", + quantity=0, + confidence=50, + reasoning="Neutral outlook", + ) + + text = self._get_text_from_tool_response(result) + assert "Decision recorded" in text + assert agent._decisions["GOOGL"]["action"] == "hold" + assert agent._decisions["GOOGL"]["quantity"] == 0 + + def test_make_decision_invalid_action(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + ) + + result = agent._make_decision( + ticker="AAPL", + action="invalid", + quantity=10, + ) + + text = self._get_text_from_tool_response(result) + assert "Invalid action" in text + + def test_get_decisions(self): + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = PMAgent( + model=mock_model, + formatter=mock_formatter, + ) + + agent._make_decision("AAPL", "long", 100) + agent._make_decision("GOOGL", "short", 50) + + decisions = agent.get_decisions() + assert len(decisions) == 2 + assert decisions["AAPL"]["action"] == "long" + assert decisions["GOOGL"]["action"] == "short" + + +class TestRiskAgent: + def test_init_default(self): + from backend.agents.risk_manager import RiskAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = RiskAgent( + model=mock_model, + formatter=mock_formatter, + ) + + assert agent.name == "risk_manager" + + def test_init_custom_name(self): + from backend.agents.risk_manager import RiskAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = RiskAgent( + model=mock_model, + formatter=mock_formatter, + name="custom_risk_manager", + ) + + assert agent.name == "custom_risk_manager" + + def test_load_system_prompt(self): + from backend.agents.risk_manager import RiskAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + agent = RiskAgent( + model=mock_model, + formatter=mock_formatter, + ) + + prompt = agent._load_system_prompt() + assert isinstance(prompt, str) + assert len(prompt) > 0 + + +class TestStorageService: + def test_calculate_portfolio_value_cash_only(self): + from backend.services.storage import StorageService + + with tempfile.TemporaryDirectory() as tmpdir: + storage = StorageService( + dashboard_dir=Path(tmpdir), + initial_cash=100000.0, + ) + + portfolio = {"cash": 100000.0, "positions": {}, "margin_used": 0.0} + prices = {} + + value = storage.calculate_portfolio_value(portfolio, prices) + assert value == 100000.0 + + def test_calculate_portfolio_value_with_positions(self): + from backend.services.storage import StorageService + + with tempfile.TemporaryDirectory() as tmpdir: + storage = StorageService( + dashboard_dir=Path(tmpdir), + initial_cash=100000.0, + ) + + portfolio = { + "cash": 50000.0, + "positions": { + "AAPL": {"long": 100, "short": 0}, + "GOOGL": {"long": 0, "short": 10}, + }, + "margin_used": 5000.0, + } + prices = {"AAPL": 150.0, "GOOGL": 100.0} + + value = storage.calculate_portfolio_value(portfolio, prices) + assert value == 69000.0 + + def test_update_dashboard_after_cycle(self): + from backend.services.storage import StorageService + + with tempfile.TemporaryDirectory() as tmpdir: + storage = StorageService( + dashboard_dir=Path(tmpdir), + initial_cash=100000.0, + ) + + portfolio = { + "cash": 90000.0, + "positions": {"AAPL": {"long": 50, "short": 0}}, + "margin_used": 0.0, + } + prices = {"AAPL": 200.0} + + storage.update_dashboard_after_cycle( + portfolio=portfolio, + prices=prices, + date="2024-01-15", + executed_trades=[ + { + "ticker": "AAPL", + "action": "long", + "quantity": 50, + "price": 200.0, + }, + ], + ) + + summary = storage.load_file("summary") + assert summary is not None + assert summary["totalAssetValue"] == 100000.0 # 90000 + 50*200 + + holdings = storage.load_file("holdings") + assert holdings is not None + assert len(holdings) > 0 + + trades = storage.load_file("trades") + assert trades is not None + assert len(trades) == 1 + assert trades[0]["ticker"] == "AAPL" + assert trades[0]["qty"] == 50 + assert trades[0]["price"] == 200.0 + + def test_generate_summary(self): + from backend.services.storage import StorageService + + with tempfile.TemporaryDirectory() as tmpdir: + storage = StorageService( + dashboard_dir=Path(tmpdir), + initial_cash=100000.0, + ) + + state = { + "portfolio_state": { + "cash": 50000.0, + "positions": {"AAPL": {"long": 100, "short": 0}}, + "margin_used": 0.0, + }, + "equity_history": [{"t": 1000, "v": 100000}], + "all_trades": [], + } + prices = {"AAPL": 500.0} + + storage._generate_summary(state, 100000.0, prices) + + summary = storage.load_file("summary") + assert summary["totalAssetValue"] == 100000.0 + assert summary["totalReturn"] == 0.0 + + def test_generate_holdings(self): + from backend.services.storage import StorageService + + with tempfile.TemporaryDirectory() as tmpdir: + storage = StorageService( + dashboard_dir=Path(tmpdir), + initial_cash=100000.0, + ) + + state = { + "portfolio_state": { + "cash": 50000.0, + "positions": {"AAPL": {"long": 100, "short": 0}}, + "margin_used": 0.0, + }, + } + prices = {"AAPL": 500.0} + + storage._generate_holdings(state, prices) + + holdings = storage.load_file("holdings") + assert len(holdings) == 2 # AAPL + CASH + + aapl_holding = next( + (h for h in holdings if h["ticker"] == "AAPL"), + None, + ) + assert aapl_holding is not None + assert aapl_holding["quantity"] == 100 + assert aapl_holding["currentPrice"] == 500.0 + + +class TestTradeExecutor: + def test_execute_trade_long(self): + from backend.utils.trade_executor import PortfolioTradeExecutor + + executor = PortfolioTradeExecutor( + initial_portfolio={ + "cash": 100000.0, + "positions": {}, + "margin_requirement": 0.25, + "margin_used": 0.0, + }, + ) + + result = executor.execute_trade( + ticker="AAPL", + action="long", + quantity=10, + price=150.0, + ) + + assert result["status"] == "success" + assert executor.portfolio["positions"]["AAPL"]["long"] == 10 + assert executor.portfolio["cash"] == 98500.0 # 100000 - 10*150 + + def test_execute_trade_short(self): + from backend.utils.trade_executor import PortfolioTradeExecutor + + executor = PortfolioTradeExecutor( + initial_portfolio={ + "cash": 100000.0, + "positions": { + "AAPL": { + "long": 50, + "short": 0, + "long_cost_basis": 100.0, + "short_cost_basis": 0.0, + }, + }, + "margin_requirement": 0.25, + "margin_used": 0.0, + }, + ) + + result = executor.execute_trade( + ticker="AAPL", + action="short", + quantity=30, + price=150.0, + ) + + assert result["status"] == "success" + assert executor.portfolio["positions"]["AAPL"]["long"] == 20 # 50 - 30 + + def test_execute_trade_hold(self): + from backend.utils.trade_executor import PortfolioTradeExecutor + + executor = PortfolioTradeExecutor() + + result = executor.execute_trade( + ticker="AAPL", + action="hold", + quantity=0, + price=150.0, + ) + + assert result["status"] == "success" + assert result["message"] == "No trade needed" + + +class TestPipelineExecution: + def test_execute_decisions(self): + from backend.core.pipeline import TradingPipeline + from backend.agents.portfolio_manager import PMAgent + + mock_model = MagicMock() + mock_formatter = MagicMock() + + pm = PMAgent( + model=mock_model, + formatter=mock_formatter, + initial_cash=100000.0, + ) + + pipeline = TradingPipeline( + analysts=[], + risk_manager=MagicMock(), + portfolio_manager=pm, + max_comm_cycles=0, + ) + + decisions = { + "AAPL": {"action": "long", "quantity": 10}, + "GOOGL": {"action": "short", "quantity": 5}, + } + prices = {"AAPL": 150.0, "GOOGL": 100.0} + + result = pipeline._execute_decisions(decisions, prices, "2024-01-15") + + assert len(result["executed_trades"]) == 2 + assert result["executed_trades"][0]["ticker"] == "AAPL" + assert result["executed_trades"][0]["quantity"] == 10 + assert pm.portfolio["positions"]["AAPL"]["long"] == 10 + + +class TestMsgContentIsString: + def test_msg_content_string(self): + msg = Msg(name="test", content="simple string", role="user") + assert isinstance(msg.content, str) + + def test_msg_content_json_string(self): + data = {"key": "value", "nested": {"a": 1}} + msg = Msg(name="test", content=json.dumps(data), role="user") + assert isinstance(msg.content, str) + + parsed = json.loads(msg.content) + assert parsed["key"] == "value" + + def test_msg_content_should_not_be_dict(self): + data = {"key": "value"} + msg = Msg(name="test", content=json.dumps(data), role="assistant") + + assert not isinstance(msg.content, dict) + assert isinstance(msg.content, str) + + +if __name__ == "__main__": + pytest.main([__file__, "-v"]) diff --git a/backend/tests/test_market_service.py b/backend/tests/test_market_service.py new file mode 100644 index 0000000..4390049 --- /dev/null +++ b/backend/tests/test_market_service.py @@ -0,0 +1,438 @@ +# -*- coding: utf-8 -*- +# pylint: disable=W0212 +import asyncio +import time +from unittest.mock import MagicMock, AsyncMock, patch +import pytest +from backend.services.market import MarketService +from backend.data.mock_price_manager import MockPriceManager +from backend.data.polling_price_manager import PollingPriceManager + + +class TestMockPriceManager: + def test_init_default(self): + manager = MockPriceManager() + + assert manager.poll_interval == 10 + assert manager.volatility == 0.5 + assert manager.running is False + assert len(manager.subscribed_symbols) == 0 + + def test_init_custom(self): + manager = MockPriceManager(poll_interval=5, volatility=1.0) + + assert manager.poll_interval == 5 + assert manager.volatility == 1.0 + + def test_subscribe(self): + manager = MockPriceManager() + manager.subscribe(["AAPL", "MSFT"]) + + assert "AAPL" in manager.subscribed_symbols + assert "MSFT" in manager.subscribed_symbols + assert manager.base_prices["AAPL"] == 237.50 # default price + assert manager.base_prices["MSFT"] == 425.30 # default price + + def test_subscribe_with_base_prices(self): + manager = MockPriceManager() + manager.subscribe(["AAPL"], base_prices={"AAPL": 100.0}) + + assert manager.base_prices["AAPL"] == 100.0 + assert manager.open_prices["AAPL"] == 100.0 + assert manager.latest_prices["AAPL"] == 100.0 + + def test_subscribe_unknown_symbol(self): + manager = MockPriceManager() + manager.subscribe(["UNKNOWN"]) + + assert "UNKNOWN" in manager.subscribed_symbols + assert manager.base_prices["UNKNOWN"] > 0 # random price generated + + def test_unsubscribe(self): + manager = MockPriceManager() + manager.subscribe(["AAPL", "MSFT"]) + manager.unsubscribe(["AAPL"]) + + assert "AAPL" not in manager.subscribed_symbols + assert "MSFT" in manager.subscribed_symbols + + def test_add_price_callback(self): + manager = MockPriceManager() + callback = MagicMock() + manager.add_price_callback(callback) + + assert callback in manager.price_callbacks + + def test_generate_price_update_within_bounds(self): + manager = MockPriceManager(volatility=0.5) + manager.subscribe(["AAPL"], base_prices={"AAPL": 100.0}) + + for _ in range(100): + new_price = manager._generate_price_update("AAPL") + # Should be within +/-10% of open + assert 90.0 <= new_price <= 110.0 + + def test_update_prices_triggers_callback(self): + manager = MockPriceManager() + manager.subscribe(["AAPL"], base_prices={"AAPL": 100.0}) + + callback = MagicMock() + manager.add_price_callback(callback) + + manager._update_prices() + + callback.assert_called_once() + call_args = callback.call_args[0][0] + assert call_args["symbol"] == "AAPL" + assert "price" in call_args + assert "timestamp" in call_args + + def test_start_stop(self): + manager = MockPriceManager(poll_interval=1) + manager.subscribe(["AAPL"], base_prices={"AAPL": 100.0}) + + manager.start() + assert manager.running is True + + time.sleep(0.1) # let thread start + + manager.stop() + assert manager.running is False + + def test_start_without_subscription(self): + manager = MockPriceManager() + manager.start() + + assert ( + manager.running is False + ) # should not start without subscriptions + + def test_get_latest_price(self): + manager = MockPriceManager() + manager.subscribe(["AAPL"], base_prices={"AAPL": 100.0}) + + price = manager.get_latest_price("AAPL") + assert price == 100.0 + + def test_get_latest_price_unknown(self): + manager = MockPriceManager() + price = manager.get_latest_price("UNKNOWN") + assert price is None + + def test_get_all_latest_prices(self): + manager = MockPriceManager() + manager.subscribe( + ["AAPL", "MSFT"], + base_prices={"AAPL": 100.0, "MSFT": 200.0}, + ) + + prices = manager.get_all_latest_prices() + assert prices["AAPL"] == 100.0 + assert prices["MSFT"] == 200.0 + + def test_reset_open_prices(self): + manager = MockPriceManager() + manager.subscribe(["AAPL"], base_prices={"AAPL": 100.0}) + manager.latest_prices["AAPL"] = 105.0 + + manager.reset_open_prices() + + # Open price should change (based on latest with small gap) + assert manager.open_prices["AAPL"] != 100.0 + + def test_set_base_price(self): + manager = MockPriceManager() + manager.subscribe(["AAPL"], base_prices={"AAPL": 100.0}) + + manager.set_base_price("AAPL", 150.0) + + assert manager.base_prices["AAPL"] == 150.0 + assert manager.open_prices["AAPL"] == 150.0 + assert manager.latest_prices["AAPL"] == 150.0 + + +class TestPollingPriceManager: + def test_init(self): + manager = PollingPriceManager(api_key="test_key", poll_interval=30) + + assert manager.api_key == "test_key" + assert manager.poll_interval == 30 + assert manager.running is False + + def test_subscribe(self): + manager = PollingPriceManager(api_key="test_key") + manager.subscribe(["AAPL", "MSFT"]) + + assert "AAPL" in manager.subscribed_symbols + assert "MSFT" in manager.subscribed_symbols + + def test_unsubscribe(self): + manager = PollingPriceManager(api_key="test_key") + manager.subscribe(["AAPL", "MSFT"]) + manager.unsubscribe(["AAPL"]) + + assert "AAPL" not in manager.subscribed_symbols + assert "MSFT" in manager.subscribed_symbols + + def test_add_price_callback(self): + manager = PollingPriceManager(api_key="test_key") + callback = MagicMock() + manager.add_price_callback(callback) + + assert callback in manager.price_callbacks + + @patch.object(PollingPriceManager, "_fetch_prices") + def test_start_stop(self): + manager = PollingPriceManager(api_key="test_key", poll_interval=1) + manager.subscribe(["AAPL"]) + + manager.start() + assert manager.running is True + + time.sleep(0.1) + + manager.stop() + assert manager.running is False + + def test_start_without_subscription(self): + manager = PollingPriceManager(api_key="test_key") + manager.start() + + assert manager.running is False + + def test_get_latest_price(self): + manager = PollingPriceManager(api_key="test_key") + manager.latest_prices["AAPL"] = 150.0 + + price = manager.get_latest_price("AAPL") + assert price == 150.0 + + def test_get_open_price(self): + manager = PollingPriceManager(api_key="test_key") + manager.open_prices["AAPL"] = 148.0 + + price = manager.get_open_price("AAPL") + assert price == 148.0 + + def test_reset_open_prices(self): + manager = PollingPriceManager(api_key="test_key") + manager.open_prices["AAPL"] = 150.0 + + manager.reset_open_prices() + + assert len(manager.open_prices) == 0 + + +class TestMarketService: + def test_init_mock_mode(self): + service = MarketService( + tickers=["AAPL", "MSFT"], + poll_interval=10, + mock_mode=True, + ) + + assert service.tickers == ["AAPL", "MSFT"] + assert service.poll_interval == 10 + assert service.mock_mode is True + assert service.running is False + + def test_init_real_mode(self): + service = MarketService( + tickers=["AAPL"], + mock_mode=False, + api_key="test_key", + ) + + assert service.mock_mode is False + assert service.api_key == "test_key" + + @pytest.mark.asyncio + async def test_start_mock_mode(self): + service = MarketService( + tickers=["AAPL"], + poll_interval=10, + mock_mode=True, + ) + + broadcast_func = AsyncMock() + + await service.start(broadcast_func) + + assert service.running is True + assert service._price_manager is not None + assert isinstance(service._price_manager, MockPriceManager) + + service.stop() + + @pytest.mark.asyncio + async def test_start_real_mode_without_api_key(self): + service = MarketService( + tickers=["AAPL"], + mock_mode=False, + api_key=None, + ) + + broadcast_func = AsyncMock() + + with pytest.raises(ValueError) as excinfo: + await service.start(broadcast_func) + + assert "API key required" in str(excinfo.value) + + @pytest.mark.asyncio + async def test_start_already_running(self): + service = MarketService( + tickers=["AAPL"], + mock_mode=True, + ) + + broadcast_func = AsyncMock() + + await service.start(broadcast_func) + assert service.running is True + + # Start again should not fail + await service.start(broadcast_func) + + service.stop() + + def test_stop(self): + service = MarketService( + tickers=["AAPL"], + mock_mode=True, + ) + service.running = True + service._price_manager = MagicMock() + + service.stop() + + assert service.running is False + assert service._price_manager is None + + def test_stop_when_not_running(self): + service = MarketService( + tickers=["AAPL"], + mock_mode=True, + ) + + # Should not raise + service.stop() + assert service.running is False + + def test_get_price_sync(self): + service = MarketService(tickers=["AAPL"], mock_mode=True) + service.cache["AAPL"] = {"price": 150.0, "open": 148.0} + + price = service.get_price_sync("AAPL") + assert price == 150.0 + + def test_get_price_sync_not_found(self): + service = MarketService(tickers=["AAPL"], mock_mode=True) + + price = service.get_price_sync("MSFT") + assert price is None + + def test_get_all_prices(self): + service = MarketService(tickers=["AAPL", "MSFT"], mock_mode=True) + service.cache["AAPL"] = {"price": 150.0} + service.cache["MSFT"] = {"price": 400.0} + + prices = service.get_all_prices() + + assert prices["AAPL"] == 150.0 + assert prices["MSFT"] == 400.0 + + @pytest.mark.asyncio + async def test_broadcast_price_update(self): + service = MarketService(tickers=["AAPL"], mock_mode=True) + service._broadcast_func = AsyncMock() + + price_data = { + "symbol": "AAPL", + "price": 150.0, + "open": 148.0, + "timestamp": 1234567890, + } + + await service._broadcast_price_update(price_data) + + service._broadcast_func.assert_called_once() + call_args = service._broadcast_func.call_args[0][0] + assert call_args["type"] == "price_update" + assert call_args["symbol"] == "AAPL" + assert call_args["price"] == 150.0 + + @pytest.mark.asyncio + async def test_broadcast_price_update_no_func(self): + service = MarketService(tickers=["AAPL"], mock_mode=True) + service._broadcast_func = None + + price_data = {"symbol": "AAPL", "price": 150.0, "open": 148.0} + + # Should not raise + await service._broadcast_price_update(price_data) + + @pytest.mark.asyncio + async def test_price_callback_thread_safety(self): + service = MarketService( + tickers=["AAPL"], + poll_interval=1, + mock_mode=True, + ) + + received_prices = [] + + async def capture_broadcast(msg): + received_prices.append(msg) + + await service.start(capture_broadcast) + + # Wait for at least one price update + await asyncio.sleep(1.5) + + service.stop() + + # Should have received at least one price update + assert len(received_prices) >= 1 + assert received_prices[0]["type"] == "price_update" + + +class TestMarketServiceIntegration: + @pytest.mark.asyncio + async def test_full_mock_cycle(self): + service = MarketService( + tickers=["AAPL", "MSFT"], + poll_interval=1, + mock_mode=True, + ) + + messages = [] + + async def collect_messages(msg): + messages.append(msg) + + await service.start(collect_messages) + + # Wait for price updates + await asyncio.sleep(2.5) + + service.stop() + + # Should have received multiple price updates + assert len(messages) >= 2 + + # Check message structure + symbols_seen = set() + for msg in messages: + assert msg["type"] == "price_update" + assert "symbol" in msg + assert "price" in msg + assert "ret" in msg + symbols_seen.add(msg["symbol"]) + + # Should have prices for both tickers + assert "AAPL" in symbols_seen or "MSFT" in symbols_seen + + +if __name__ == "__main__": + pytest.main([__file__, "-v"]) diff --git a/backend/tests/test_settlement.py b/backend/tests/test_settlement.py new file mode 100644 index 0000000..13a3717 --- /dev/null +++ b/backend/tests/test_settlement.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +""" +Test Settlement Coordinator and Baseline Calculations +""" + +from backend.utils.baselines import ( + BaselineCalculator, + calculate_momentum_scores, +) +from backend.utils.analyst_tracker import ( + AnalystPerformanceTracker, + update_leaderboard_with_evaluations, +) + + +def test_baseline_equal_weight(): + """Test equal weight baseline calculation""" + calculator = BaselineCalculator(initial_capital=100000.0) + + tickers = ["AAPL", "MSFT", "GOOGL"] + prices = {"AAPL": 150.0, "MSFT": 300.0, "GOOGL": 120.0} + openprices = {"AAPL": 160.0, "MSFT": 310.0, "GOOGL": 110.0} + value = calculator.calculate_equal_weight_value( + tickers, + openprices, + prices, + ) + + assert value > 0 + assert calculator.equal_weight_initialized is True + + +def test_baseline_market_cap_weighted(): + """Test market cap weighted baseline calculation""" + calculator = BaselineCalculator(initial_capital=100000.0) + + tickers = ["AAPL", "MSFT", "GOOGL"] + prices = {"AAPL": 150.0, "MSFT": 300.0, "GOOGL": 120.0} + openprices = {"AAPL": 160.0, "MSFT": 310.0, "GOOGL": 110.0} + market_caps = {"AAPL": 3e12, "MSFT": 2e12, "GOOGL": 1.5e12} + + value = calculator.calculate_market_cap_weighted_value( + tickers, + openprices, + prices, + market_caps, + ) + + assert value > 0 + assert calculator.market_cap_initialized is True + + +def test_momentum_scores(): + """Test momentum score calculation""" + tickers = ["AAPL", "MSFT"] + prices_history = { + "AAPL": [ + ("2024-01-01", 100.0), + ("2024-01-02", 105.0), + ("2024-01-03", 110.0), + ], + "MSFT": [ + ("2024-01-01", 200.0), + ("2024-01-02", 195.0), + ("2024-01-03", 190.0), + ], + } + + scores = calculate_momentum_scores( + tickers, + prices_history, + lookback_days=2, + ) + + assert scores["AAPL"] > 0 + assert scores["MSFT"] < 0 + + +def test_analyst_tracker_predictions(): + """Test analyst prediction recording with structured format""" + tracker = AnalystPerformanceTracker() + + final_predictions = [ + { + "agent": "technical_analyst", + "predictions": [ + {"ticker": "AAPL", "direction": "up", "confidence": 0.8}, + {"ticker": "MSFT", "direction": "down", "confidence": 0.7}, + {"ticker": "GOOGL", "direction": "neutral", "confidence": 0.5}, + ], + }, + { + "agent": "fundamentals_analyst", + "predictions": [ + {"ticker": "AAPL", "direction": "up", "confidence": 0.9}, + {"ticker": "MSFT", "direction": "up", "confidence": 0.6}, + {"ticker": "GOOGL", "direction": "down", "confidence": 0.75}, + ], + }, + ] + + tracker.record_analyst_predictions(final_predictions) + + assert "technical_analyst" in tracker.daily_predictions + assert "fundamentals_analyst" in tracker.daily_predictions + assert tracker.daily_predictions["technical_analyst"]["AAPL"] == "long" + assert tracker.daily_predictions["technical_analyst"]["MSFT"] == "short" + assert tracker.daily_predictions["technical_analyst"]["GOOGL"] == "hold" + + +def test_analyst_evaluation(): + """Test analyst prediction evaluation""" + tracker = AnalystPerformanceTracker() + + tracker.daily_predictions = { + "technical_analyst": { + "AAPL": "long", + "MSFT": "short", + }, + } + + open_prices = {"AAPL": 100.0, "MSFT": 200.0} + close_prices = {"AAPL": 105.0, "MSFT": 195.0} + + evaluations = tracker.evaluate_predictions( + open_prices, + close_prices, + "2024-01-15", + ) + + assert "technical_analyst" in evaluations + eval_result = evaluations["technical_analyst"] + assert eval_result["correct_predictions"] == 2 + assert eval_result["win_rate"] == 1.0 + + # Verify individual signals format + assert "signals" in eval_result + assert len(eval_result["signals"]) == 2 + for signal in eval_result["signals"]: + assert "ticker" in signal + assert "signal" in signal + assert "date" in signal + assert "is_correct" in signal + assert signal["date"] == "2024-01-15" + + +def test_leaderboard_update(): + """Test leaderboard update with evaluations""" + leaderboard = [ + { + "agentId": "technical_analyst", + "name": "Technical Analyst", + "rank": 0, + "winRate": None, + "bull": {"n": 0, "win": 0, "unknown": 0}, + "bear": {"n": 0, "win": 0, "unknown": 0}, + "signals": [], + }, + ] + + evaluations = { + "technical_analyst": { + "total_predictions": 2, + "correct_predictions": 1, + "win_rate": 0.5, + "bull": {"n": 1, "win": 1, "unknown": 0}, + "bear": {"n": 1, "win": 0, "unknown": 0}, + "hold": 0, + "signals": [ + { + "ticker": "AAPL", + "signal": "bull", + "date": "2024-01-01", + "is_correct": True, + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2024-01-01", + "is_correct": False, + }, + ], + }, + } + + updated = update_leaderboard_with_evaluations( + leaderboard, + evaluations, + ) + + assert updated[0]["bull"]["n"] == 1 + assert updated[0]["bull"]["win"] == 1 + assert updated[0]["winRate"] == 0.5 + assert len(updated[0]["signals"]) == 2 + + # Verify signal format matches frontend expectations + for signal in updated[0]["signals"]: + assert "ticker" in signal + assert "signal" in signal + assert "date" in signal + assert "is_correct" in signal diff --git a/backend/tools/__init__.py b/backend/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/tools/analysis_tools.py b/backend/tools/analysis_tools.py new file mode 100644 index 0000000..f9c5713 --- /dev/null +++ b/backend/tools/analysis_tools.py @@ -0,0 +1,1289 @@ +# -*- coding: utf-8 -*- +""" +Analysis tools for fundamental, technical, sentiment, and valuation analysis. + +All tools accept tickers as List[str] with default from analysis context. +Returns human-readable text format for easy LLM consumption. +""" +# flake8: noqa: E501 +# pylint: disable=C0301,W0613 +import json +import logging +import traceback +from datetime import datetime, timedelta +from functools import wraps +from statistics import median +from typing import List, Optional, Union + +import numpy as np +import pandas as pd +from agentscope.message import TextBlock +from agentscope.tool import ToolResponse + +from backend.tools.data_tools import ( + get_company_news, + get_financial_metrics, + get_insider_trades, + get_market_cap, + get_prices, + prices_to_df, + search_line_items, +) + +logger = logging.getLogger(__name__) + + +def _to_text_response(text: str) -> ToolResponse: + """Convert text string to ToolResponse.""" + return ToolResponse(content=[TextBlock(type="text", text=text)]) + + +def _parse_tickers(tickers: Union[str, List[str], None]) -> List[str]: + """ + Parse tickers parameter which may be a JSON string or a list. + + LLM sometimes passes tickers as a JSON string like '["AAPL", "MSFT"]' + instead of an actual list. This function handles both cases. + + Args: + tickers: List of stock tickers as a list or JSON string. + + Returns: + List of stock tickers. + """ + if tickers is None: + return [] + + if isinstance(tickers, str): + try: + parsed = json.loads(tickers) + if isinstance(parsed, list): + return parsed + # If it's a single string, wrap in list + return [parsed] + except json.JSONDecodeError: + # If not valid JSON, treat as comma-separated string + return [t.strip() for t in tickers.split(",") if t.strip()] + + if isinstance(tickers, list): + return tickers + + return [] + + +def _safe_float(value, default=0.0) -> float: + """Safely convert to float.""" + try: + if pd.isna(value) or np.isnan(value): + return default + return float(value) + except (ValueError, TypeError, OverflowError): + return default + + +def safe(func): + """Decorator to catch exceptions in tool functions.""" + + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as e: + error_msg = f"Error in {func.__name__}: {str(e)}" + logger.error(f"{error_msg}\n{traceback.format_exc()}") + return _to_text_response(f"[ERROR] {error_msg}") + + return wrapper + + +def _fmt(val, fmt=".2f", suffix="") -> str: + """Format value with handling for None.""" + if val is None: + return "N/A" + try: + return f"{val:{fmt}}{suffix}" + except (ValueError, TypeError): + return str(val) + + +def _resolved_date(current_date: Optional[str]) -> str: + """Ensure we always return a concrete date string.""" + return current_date or datetime.today().strftime("%Y-%m-%d") + + +# ==================== Fundamental Analysis Tools ==================== + + +@safe +def analyze_efficiency_ratios( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Analyze asset utilization efficiency ratios for stocks. + + Evaluates how efficiently companies use assets to generate revenue. + Higher ratios generally indicate better operational efficiency. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of efficiency metrics for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Efficiency Ratios Analysis ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics(ticker=ticker, end_date=current_date) + if not metrics: + lines.append(f"{ticker}: No data available\n") + continue + + m = metrics[0] + lines.append(f"{ticker}:") + lines.append(f" Asset Turnover: {_fmt(m.asset_turnover)}") + lines.append(f" Inventory Turnover: {_fmt(m.inventory_turnover)}") + lines.append(f" Receivables Turnover: {_fmt(m.receivables_turnover)}") + lines.append( + f" Working Capital Turnover: {_fmt(m.working_capital_turnover)}", + ) + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_profitability( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Analyze profitability metrics for stocks. + + Assesses how effectively companies generate profit from operations and equity. + Higher margins indicate stronger profitability and better cost management. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of profitability metrics for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Profitability Analysis ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics(ticker=ticker, end_date=current_date) + if not metrics: + lines.append(f"{ticker}: No data available\n") + continue + + m = metrics[0] + roe = _safe_float(m.return_on_equity) + net_margin = _safe_float(m.net_margin) + op_margin = _safe_float(m.operating_margin) + lines.append(f"{ticker}:") + lines.append(f" Return on Equity (ROE): {_fmt(roe/100, '.1%')}") + lines.append(f" Net Margin: {_fmt(net_margin/100, '.1%')}") + lines.append(f" Operating Margin: {_fmt(op_margin/100, '.1%')}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_growth( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Analyze growth metrics for stocks. + + Evaluates company growth trajectory across key financial dimensions. + Higher growth rates may indicate strong business momentum. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of growth metrics for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Growth Analysis ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics(ticker=ticker, end_date=current_date) + if not metrics: + lines.append(f"{ticker}: No data available\n") + continue + + m = metrics[0] + lines.append(f"{ticker}:") + lines.append(f" Revenue Growth: {_fmt(m.revenue_growth, '.1%')}") + lines.append(f" Earnings Growth: {_fmt(m.earnings_growth, '.1%')}") + lines.append( + f" Book Value Growth: {_fmt(m.book_value_growth, '.1%')}", + ) + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_financial_health( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Analyze financial health metrics for stocks. + + Assesses financial stability and ability to meet obligations. + Strong financial health suggests lower bankruptcy risk. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of financial health metrics for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Financial Health Analysis ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics(ticker=ticker, end_date=current_date) + if not metrics: + lines.append(f"{ticker}: No data available\n") + continue + + m = metrics[0] + lines.append(f"{ticker}:") + lines.append( + f" Current Ratio: {_fmt(m.current_ratio)} (>1 is healthy)", + ) + lines.append(f" Debt to Equity: {_fmt(m.debt_to_equity)}") + lines.append( + f" Free Cash Flow/Share: ${_fmt(m.free_cash_flow_per_share)}", + ) + lines.append(f" EPS: ${_fmt(m.earnings_per_share)}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_valuation_ratios( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Analyze valuation ratios for stocks. + + Evaluates whether stocks are overvalued or undervalued using common multiples. + Lower ratios may indicate undervaluation but compare with industry peers. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of valuation ratios for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Valuation Ratios Analysis ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics(ticker=ticker, end_date=current_date) + if not metrics: + lines.append(f"{ticker}: No data available\n") + continue + + m = metrics[0] + lines.append(f"{ticker}:") + lines.append(f" P/E Ratio: {_fmt(m.price_to_earnings_ratio)}") + lines.append(f" P/B Ratio: {_fmt(m.price_to_book_ratio)}") + lines.append(f" P/S Ratio: {_fmt(m.price_to_sales_ratio)}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def get_financial_metrics_tool( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, + period: str = "ttm", +) -> ToolResponse: + """ + Get comprehensive financial metrics for stocks. + + Retrieves complete set of financial metrics for fundamental analysis. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + period: Time period - 'ttm', 'quarterly', or 'annual'. Default 'ttm'. + + Returns: + Text summary of all available financial metrics for all tickers. + """ + + current_date = _resolved_date(current_date) + lines = [ + f"=== Comprehensive Financial Metrics ({current_date}, {period}) ===\n", + ] + + for ticker in tickers: + metrics = get_financial_metrics( + ticker=ticker, + end_date=current_date, + period=period, + ) + if not metrics: + lines.append(f"{ticker}: No data available\n") + continue + + m = metrics[0] + lines.append(f"{ticker}:") + lines.append(f" Market Cap: ${_fmt(m.market_cap, ',.0f')}") + lines.append( + f" P/E: {_fmt(m.price_to_earnings_ratio)} | P/B: {_fmt(m.price_to_book_ratio)} | P/S: {_fmt(m.price_to_sales_ratio)}", + ) + lines.append( + f" ROE: {_fmt(m.return_on_equity, '.1%')} | Net Margin: {_fmt(m.net_margin, '.1%')}", + ) + lines.append( + f" Revenue Growth: {_fmt(m.revenue_growth, '.1%')} | Earnings Growth: {_fmt(m.earnings_growth, '.1%')}", + ) + lines.append( + f" Current Ratio: {_fmt(m.current_ratio)} | D/E: {_fmt(m.debt_to_equity)}", + ) + lines.append( + f" EPS: ${_fmt(m.earnings_per_share)} | FCF/Share: ${_fmt(m.free_cash_flow_per_share)}", + ) + lines.append("") + + return _to_text_response("\n".join(lines)) + + +# ==================== Technical Analysis Tools ==================== + + +@safe +def analyze_trend_following( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Trend following analysis using moving averages and MACD. + + Identifies market trends using SMA (20/50/200) and MACD indicators. + Helps determine if stocks are in uptrend, downtrend, or consolidation. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of trend analysis for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Trend Following Analysis ({current_date}) ===\n"] + + end_dt = datetime.strptime(current_date, "%Y-%m-%d") + extended_start = (end_dt - timedelta(days=250)).strftime("%Y-%m-%d") + + for ticker in tickers: + prices = get_prices( + ticker=ticker, + start_date=extended_start, + end_date=current_date, + ) + if not prices or len(prices) < 10: + lines.append(f"{ticker}: Insufficient price data\n") + continue + + df = prices_to_df(prices) + n = len(df) + + # Calculate moving averages + sma_20_win = min(20, n // 2) + sma_50_win = min(50, n - 5) if n > 25 else min(25, n - 5) + sma_200_win = min(200, n - 10) if n > 200 else None + + df["SMA_20"] = df["close"].rolling(window=sma_20_win).mean() + df["SMA_50"] = df["close"].rolling(window=sma_50_win).mean() + if sma_200_win: + df["SMA_200"] = df["close"].rolling(window=sma_200_win).mean() + + df["EMA_12"] = df["close"].ewm(span=min(12, n // 3)).mean() + df["EMA_26"] = df["close"].ewm(span=min(26, n // 2)).mean() + df["MACD"] = df["EMA_12"] - df["EMA_26"] + df["MACD_signal"] = df["MACD"].ewm(span=9).mean() + + current_price = _safe_float(df["close"].iloc[-1]) + sma_20 = _safe_float(df["SMA_20"].iloc[-1]) + sma_50 = _safe_float(df["SMA_50"].iloc[-1]) + sma_200 = ( + _safe_float(df["SMA_200"].iloc[-1]) + if "SMA_200" in df.columns + else None + ) + macd = _safe_float(df["MACD"].iloc[-1]) + macd_signal = _safe_float(df["MACD_signal"].iloc[-1]) + + # Determine trend + if sma_200: + trend = "BULLISH" if current_price > sma_200 else "BEARISH" + distance_200ma = ((current_price - sma_200) / sma_200) * 100 + else: + trend = "UNKNOWN" + distance_200ma = None + + macd_signal_str = "BUY" if macd > macd_signal else "SELL" + + lines.append(f"{ticker}: ${current_price:.2f}") + lines.append( + f" SMA20: ${sma_20:.2f} | SMA50: ${sma_50:.2f} | SMA200: {f'${sma_200:.2f}' if sma_200 else 'N/A'}", + ) + lines.append( + f" MACD: {macd:.3f} | Signal: {macd_signal:.3f} -> {macd_signal_str}", + ) + lines.append( + f" Long-term Trend: {trend}" + + ( + f" ({distance_200ma:+.1f}% from 200MA)" + if distance_200ma + else "" + ), + ) + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_mean_reversion( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Mean reversion analysis using Bollinger Bands and RSI. + + Identifies overbought/oversold conditions. + RSI >70 = overbought, <30 = oversold. + Price near bands may signal reversal. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of mean reversion signals for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Mean Reversion Analysis ({current_date}) ===\n"] + + end_dt = datetime.strptime(current_date, "%Y-%m-%d") + extended_start = (end_dt - timedelta(days=60)).strftime("%Y-%m-%d") + + for ticker in tickers: + prices = get_prices( + ticker=ticker, + start_date=extended_start, + end_date=current_date, + ) + if not prices or len(prices) < 5: + lines.append(f"{ticker}: Insufficient price data\n") + continue + + df = prices_to_df(prices) + n = len(df) + + # Bollinger Bands + window = min(20, n - 2) + df["SMA"] = df["close"].rolling(window=window).mean() + df["STD"] = df["close"].rolling(window=window).std() + df["Upper_Band"] = df["SMA"] + (2 * df["STD"]) + df["Lower_Band"] = df["SMA"] - (2 * df["STD"]) + + # RSI + delta = df["close"].diff() + gain = (delta.where(delta > 0, 0)).rolling(window=14).mean() + loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean() + rs = gain / loss + df["RSI"] = 100 - (100 / (1 + rs)) + + current_price = _safe_float(df["close"].iloc[-1]) + sma = _safe_float(df["SMA"].iloc[-1]) + upper = _safe_float(df["Upper_Band"].iloc[-1]) + lower = _safe_float(df["Lower_Band"].iloc[-1]) + rsi = _safe_float(df["RSI"].iloc[-1]) + deviation = (current_price - sma) / sma * 100 + + # Signal interpretation + if rsi > 70: + rsi_signal = "OVERBOUGHT" + elif rsi < 30: + rsi_signal = "OVERSOLD" + else: + rsi_signal = "NEUTRAL" + + if current_price > upper: + bb_signal = "ABOVE UPPER BAND (potential sell)" + elif current_price < lower: + bb_signal = "BELOW LOWER BAND (potential buy)" + else: + bb_signal = "WITHIN BANDS" + + lines.append(f"{ticker}: ${current_price:.2f}") + lines.append( + f" Bollinger: Lower ${lower:.2f} | SMA ${sma:.2f} | Upper ${upper:.2f}", + ) + lines.append(f" Position: {bb_signal}") + lines.append(f" RSI: {rsi:.1f} -> {rsi_signal}") + lines.append(f" Price Deviation from SMA: {deviation:+.1f}%") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_momentum( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Momentum analysis for different time periods. + + Measures price momentum over 5, 10, and 20 day periods. + Positive momentum indicates upward price pressure. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of momentum indicators for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Momentum Analysis ({current_date}) ===\n"] + + end_dt = datetime.strptime(current_date, "%Y-%m-%d") + extended_start = (end_dt - timedelta(days=45)).strftime("%Y-%m-%d") + + for ticker in tickers: + prices = get_prices( + ticker=ticker, + start_date=extended_start, + end_date=current_date, + ) + if not prices or len(prices) < 5: + lines.append(f"{ticker}: Insufficient price data\n") + continue + + df = prices_to_df(prices) + n = len(df) + df["returns"] = df["close"].pct_change() + + # Adaptive periods + short_p = min(5, n // 3) + med_p = min(10, n // 2) + long_p = min(20, n - 2) + + current_price = _safe_float(df["close"].iloc[-1]) + mom_5 = ( + _safe_float( + (df["close"].iloc[-1] / df["close"].iloc[-short_p - 1] - 1) + * 100, + ) + if n > short_p + else 0 + ) + mom_10 = ( + _safe_float( + (df["close"].iloc[-1] / df["close"].iloc[-med_p - 1] - 1) + * 100, + ) + if n > med_p + else 0 + ) + mom_20 = ( + _safe_float( + (df["close"].iloc[-1] / df["close"].iloc[-long_p - 1] - 1) + * 100, + ) + if n > long_p + else 0 + ) + volatility = _safe_float( + df["returns"].tail(20).std() * np.sqrt(252) * 100, + ) + + # Overall momentum signal + avg_mom = (mom_5 + mom_10 + mom_20) / 3 + if avg_mom > 2: + signal = "STRONG BULLISH" + elif avg_mom > 0: + signal = "BULLISH" + elif avg_mom > -2: + signal = "BEARISH" + else: + signal = "STRONG BEARISH" + + lines.append(f"{ticker}: ${current_price:.2f}") + lines.append( + f" 5-day: {mom_5:+.1f}% | 10-day: {mom_10:+.1f}% | 20-day: {mom_20:+.1f}%", + ) + lines.append(f" Volatility (annualized): {volatility:.1f}%") + lines.append(f" Overall: {signal}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_volatility( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Volatility analysis for different time windows. + + Measures price volatility over 10, 20, and 60 day periods. + Higher volatility indicates higher risk but potentially higher returns. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date (YYYY-MM-DD). If None, uses date from context. + + Returns: + Text summary of volatility metrics for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Volatility Analysis ({current_date}) ===\n"] + + end_dt = datetime.strptime(current_date, "%Y-%m-%d") + extended_start = (end_dt - timedelta(days=90)).strftime("%Y-%m-%d") + + for ticker in tickers: + prices = get_prices( + ticker=ticker, + start_date=extended_start, + end_date=current_date, + ) + if not prices or len(prices) < 5: + lines.append(f"{ticker}: Insufficient price data\n") + continue + + df = prices_to_df(prices) + n = len(df) + df["returns"] = df["close"].pct_change() + + # Adaptive windows + short_w = min(10, n // 2) + med_w = min(20, n - 2) + long_w = min(60, n - 1) if n > 30 else med_w + + current_price = _safe_float(df["close"].iloc[-1]) + vol_10 = _safe_float( + df["returns"].tail(short_w).std() * np.sqrt(252) * 100, + ) + vol_20 = _safe_float( + df["returns"].tail(med_w).std() * np.sqrt(252) * 100, + ) + vol_60 = _safe_float( + df["returns"].tail(long_w).std() * np.sqrt(252) * 100, + ) + + # Risk assessment + if vol_20 > 50: + risk = "HIGH RISK" + elif vol_20 > 25: + risk = "MODERATE RISK" + else: + risk = "LOW RISK" + + lines.append(f"{ticker}: ${current_price:.2f}") + lines.append( + f" 10-day Vol: {vol_10:.1f}% | 20-day Vol: {vol_20:.1f}% | 60-day Vol: {vol_60:.1f}%", + ) + lines.append(f" Risk Level: {risk}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +# ==================== Sentiment Analysis Tools ==================== + + +@safe +def analyze_insider_trading( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, + start_date: Optional[str] = None, +) -> ToolResponse: + """ + Analyze insider trading activity. + + Tracks buying/selling by company insiders (executives, directors). + Insider buying can signal confidence; selling may indicate concerns. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date. If None, uses date from context. + start_date: Optional start date for lookback period. + + Returns: + Text summary of insider trading activity for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Insider Trading Analysis ({current_date}) ===\n"] + + for ticker in tickers: + trades = get_insider_trades( + ticker=ticker, + end_date=current_date, + start_date=start_date, + limit=1000, + ) + + if not trades: + lines.append(f"{ticker}: No insider trading data\n") + continue + + shares = pd.Series([t.transaction_shares for t in trades]).dropna() + + if len(shares) == 0: + lines.append(f"{ticker}: {len(trades)} trades but no share data\n") + continue + + buy_count = int((shares > 0).sum()) + sell_count = int((shares < 0).sum()) + buy_vol = float(shares[shares > 0].sum()) + sell_vol = float(abs(shares[shares < 0].sum())) + + # Sentiment interpretation + if buy_count > sell_count * 2: + sentiment = "STRONG INSIDER BUYING" + elif buy_count > sell_count: + sentiment = "NET INSIDER BUYING" + elif sell_count > buy_count * 2: + sentiment = "STRONG INSIDER SELLING" + elif sell_count > buy_count: + sentiment = "NET INSIDER SELLING" + else: + sentiment = "MIXED INSIDER ACTIVITY" + + lines.append(f"{ticker}:") + lines.append(f" Buys: {buy_count} trades ({buy_vol:,.0f} shares)") + lines.append(f" Sells: {sell_count} trades ({sell_vol:,.0f} shares)") + lines.append(f" Signal: {sentiment}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def analyze_news_sentiment( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, + start_date: Optional[str] = None, +) -> ToolResponse: + """ + Analyze recent news for stocks. + + Retrieves and summarizes recent news articles. + Use this to understand recent events and market sentiment. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date. If None, uses date from context. + start_date: Optional start date for lookback period. + + Returns: + Text summary of recent news for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== News Analysis ({current_date}) ===\n"] + + for ticker in tickers: + news = get_company_news( + ticker=ticker, + end_date=current_date, + start_date=start_date, + limit=10, + ) + + if not news: + lines.append(f"{ticker}: No recent news\n") + continue + + lines.append(f"{ticker} - {len(news)} recent articles:") + for i, n in enumerate(news[:5], 1): + date_str = n.date[:10] if n.date else "N/A" + lines.append(f" {i}. [{date_str}] {n.title[:80]}...") + lines.append(f" Source: {n.source}") + if len(news) > 5: + lines.append(f" ... and {len(news) - 5} more articles") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +# ==================== Valuation Analysis Tools ==================== + + +@safe +def dcf_valuation_analysis( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Discounted Cash Flow (DCF) valuation analysis. + + Estimates intrinsic value by projecting future free cash flows. + Positive value_gap indicates potential undervaluation. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date. If None, uses date from context. + + Returns: + Text summary of DCF valuation for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== DCF Valuation Analysis ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics( + ticker=ticker, + end_date=current_date, + limit=8, + ) + if not metrics: + lines.append(f"{ticker}: No financial metrics\n") + continue + + line_items = search_line_items( + ticker=ticker, + line_items=["free_cash_flow"], + end_date=current_date, + period="ttm", + limit=2, + ) + if ( + not line_items + or not line_items[0].free_cash_flow + or line_items[0].free_cash_flow <= 0 + ): + lines.append(f"{ticker}: Invalid free cash flow data\n") + continue + + market_cap = get_market_cap(ticker, current_date) + if not market_cap: + lines.append(f"{ticker}: Market cap unavailable\n") + continue + + m = metrics[0] + current_fcf = line_items[0].free_cash_flow + growth_rate = m.earnings_growth or 0.05 + discount_rate = 0.10 + terminal_growth = 0.03 + num_years = 5 + + # DCF calculation + pv_fcf = sum( + current_fcf + * (1 + growth_rate) ** year + / (1 + discount_rate) ** year + for year in range(1, num_years + 1) + ) + terminal_fcf = ( + current_fcf + * (1 + growth_rate) ** num_years + * (1 + terminal_growth) + ) + terminal_value = terminal_fcf / (discount_rate - terminal_growth) + pv_terminal = terminal_value / (1 + discount_rate) ** num_years + enterprise_value = pv_fcf + pv_terminal + value_gap = (enterprise_value - market_cap) / market_cap * 100 + + # Assessment + if value_gap > 20: + assessment = "SIGNIFICANTLY UNDERVALUED" + elif value_gap > 0: + assessment = "POTENTIALLY UNDERVALUED" + elif value_gap > -20: + assessment = "POTENTIALLY OVERVALUED" + else: + assessment = "SIGNIFICANTLY OVERVALUED" + + lines.append(f"{ticker}:") + lines.append(f" Current FCF: ${current_fcf:,.0f}") + lines.append(f" DCF Enterprise Value: ${enterprise_value:,.0f}") + lines.append(f" Market Cap: ${market_cap:,.0f}") + lines.append(f" Value Gap: {value_gap:+.1f}% -> {assessment}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def owner_earnings_valuation_analysis( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Buffett-style owner earnings valuation analysis. + + Owner earnings = Net Income + D&A - CapEx - Working Capital Changes. + Represents true cash owners could extract from the business. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date. If None, uses date from context. + + Returns: + Text summary of owner earnings valuation for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Owner Earnings Valuation ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics( + ticker=ticker, + end_date=current_date, + limit=8, + ) + if not metrics: + lines.append(f"{ticker}: No financial metrics\n") + continue + + line_items = search_line_items( + ticker=ticker, + line_items=[ + "net_income", + "depreciation_and_amortization", + "capital_expenditure", + "working_capital", + ], + end_date=current_date, + period="ttm", + limit=2, + ) + if len(line_items) < 2: + lines.append(f"{ticker}: Insufficient financial data\n") + continue + + market_cap = get_market_cap(ticker, current_date) + if not market_cap: + lines.append(f"{ticker}: Market cap unavailable\n") + continue + + m = metrics[0] + current, previous = line_items[0], line_items[1] + + net_income = current.net_income or 0 + depreciation = current.depreciation_and_amortization or 0 + capex = current.capital_expenditure or 0 + wc_change = (current.working_capital or 0) - ( + previous.working_capital or 0 + ) + + owner_earnings = net_income + depreciation - capex - wc_change + if owner_earnings <= 0: + lines.append( + f"{ticker}: Negative owner earnings (${owner_earnings:,.0f})\n", + ) + continue + + # Valuation + growth_rate = m.earnings_growth or 0.05 + required_return = 0.15 + margin_of_safety = 0.25 + num_years = 5 + + pv_earnings = sum( + owner_earnings + * (1 + growth_rate) ** year + / (1 + required_return) ** year + for year in range(1, num_years + 1) + ) + terminal_growth = min(growth_rate, 0.03) + terminal_earnings = ( + owner_earnings + * (1 + growth_rate) ** num_years + * (1 + terminal_growth) + ) + terminal_value = terminal_earnings / ( + required_return - terminal_growth + ) + pv_terminal = terminal_value / (1 + required_return) ** num_years + + intrinsic_value = (pv_earnings + pv_terminal) * (1 - margin_of_safety) + value_gap = (intrinsic_value - market_cap) / market_cap * 100 + + # Assessment + if value_gap > 20: + assessment = "SIGNIFICANTLY UNDERVALUED" + elif value_gap > 0: + assessment = "POTENTIALLY UNDERVALUED" + elif value_gap > -20: + assessment = "POTENTIALLY OVERVALUED" + else: + assessment = "SIGNIFICANTLY OVERVALUED" + + lines.append(f"{ticker}:") + lines.append(f" Owner Earnings: ${owner_earnings:,.0f}") + lines.append( + f" Intrinsic Value (w/ 25% MoS): ${intrinsic_value:,.0f}", + ) + lines.append(f" Market Cap: ${market_cap:,.0f}") + lines.append(f" Value Gap: {value_gap:+.1f}% -> {assessment}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def ev_ebitda_valuation_analysis( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + EV/EBITDA multiple valuation analysis. + + Compares current EV/EBITDA to historical median. + Lower multiples relative to history may indicate undervaluation. + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date. If None, uses date from context. + + Returns: + Text summary of EV/EBITDA valuation for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== EV/EBITDA Valuation ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics( + ticker=ticker, + end_date=current_date, + limit=8, + ) + if not metrics: + lines.append(f"{ticker}: No financial metrics\n") + continue + + m = metrics[0] + if ( + not m.enterprise_value + or not m.enterprise_value_to_ebitda_ratio + or m.enterprise_value_to_ebitda_ratio <= 0 + ): + lines.append(f"{ticker}: Missing EV/EBITDA data\n") + continue + + market_cap = get_market_cap(ticker, current_date) + if not market_cap: + lines.append(f"{ticker}: Market cap unavailable\n") + continue + + current_ebitda = ( + m.enterprise_value / m.enterprise_value_to_ebitda_ratio + ) + + valid_multiples = [ + x.enterprise_value_to_ebitda_ratio + for x in metrics + if x.enterprise_value_to_ebitda_ratio + and x.enterprise_value_to_ebitda_ratio > 0 + ] + if len(valid_multiples) < 3: + lines.append(f"{ticker}: Insufficient historical data\n") + continue + + median_multiple = median(valid_multiples) + current_multiple = m.enterprise_value_to_ebitda_ratio + + implied_ev = median_multiple * current_ebitda + net_debt = m.enterprise_value - market_cap + implied_equity = max(implied_ev - net_debt, 0) + + value_gap = ( + (implied_equity - market_cap) / market_cap * 100 + if market_cap > 0 + else 0 + ) + multiple_discount = ( + (median_multiple - current_multiple) / median_multiple * 100 + ) + + # Assessment + if multiple_discount > 10: + assessment = "TRADING BELOW HISTORICAL MULTIPLE" + elif multiple_discount > -10: + assessment = "NEAR HISTORICAL AVERAGE" + else: + assessment = "TRADING ABOVE HISTORICAL MULTIPLE" + + lines.append(f"{ticker}:") + lines.append(f" Current EV/EBITDA: {current_multiple:.1f}x") + lines.append(f" Historical Median: {median_multiple:.1f}x") + lines.append(f" Multiple vs History: {multiple_discount:+.1f}%") + lines.append(f" Implied Equity Value: ${implied_equity:,.0f}") + lines.append(f" Value Gap: {value_gap:+.1f}% -> {assessment}") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +@safe +def residual_income_valuation_analysis( + tickers: Optional[List[str]] = None, + current_date: Optional[str] = None, +) -> ToolResponse: + """ + Residual Income Model (RIM) valuation analysis. + + Values company based on book value plus PV of future residual income. + Residual income = Net Income - (Cost of Equity x Book Value). + + Args: + tickers: List of stock tickers. If None, uses all tickers from context. + current_date: Analysis date. If None, uses date from context. + + Returns: + Text summary of residual income valuation for all tickers. + """ + + current_date = _resolved_date(current_date) + tickers = _parse_tickers(tickers) + lines = [f"=== Residual Income Valuation ({current_date}) ===\n"] + + for ticker in tickers: + metrics = get_financial_metrics( + ticker=ticker, + end_date=current_date, + limit=8, + ) + if not metrics: + lines.append(f"{ticker}: No financial metrics\n") + continue + + line_items = search_line_items( + ticker=ticker, + line_items=["net_income"], + end_date=current_date, + period="ttm", + limit=1, + ) + if not line_items or not line_items[0].net_income: + lines.append(f"{ticker}: No net income data\n") + continue + + market_cap = get_market_cap(ticker, current_date) + if not market_cap: + lines.append(f"{ticker}: Market cap unavailable\n") + continue + + m = metrics[0] + if not m.price_to_book_ratio or m.price_to_book_ratio <= 0: + lines.append(f"{ticker}: Invalid P/B ratio\n") + continue + + net_income = line_items[0].net_income + pb_ratio = m.price_to_book_ratio + book_value = market_cap / pb_ratio + + # Model parameters + cost_of_equity = 0.10 + bv_growth = m.book_value_growth or 0.03 + terminal_growth = 0.03 + num_years = 5 + margin_of_safety = 0.20 + + initial_ri = net_income - cost_of_equity * book_value + if initial_ri <= 0: + lines.append(f"{ticker}: Negative residual income\n") + continue + + # PV calculation + pv_ri = sum( + initial_ri * (1 + bv_growth) ** year / (1 + cost_of_equity) ** year + for year in range(1, num_years + 1) + ) + terminal_ri = initial_ri * (1 + bv_growth) ** (num_years + 1) + terminal_value = terminal_ri / (cost_of_equity - terminal_growth) + pv_terminal = terminal_value / (1 + cost_of_equity) ** num_years + + intrinsic_value = (book_value + pv_ri + pv_terminal) * ( + 1 - margin_of_safety + ) + value_gap = (intrinsic_value - market_cap) / market_cap * 100 + + lines.append(f"{ticker}:") + lines.append(f" Book Value: ${book_value:,.0f}") + lines.append(f" Residual Income: ${initial_ri:,.0f}") + lines.append( + f" Intrinsic Value (w/ 20% MoS): ${intrinsic_value:,.0f}", + ) + lines.append(f" Value Gap: {value_gap:+.1f}%") + lines.append("") + + return _to_text_response("\n".join(lines)) + + +# Tool Registry for dynamic toolkit creation +TOOL_REGISTRY = { + "analyze_efficiency_ratios": analyze_efficiency_ratios, + "analyze_profitability": analyze_profitability, + "analyze_growth": analyze_growth, + "analyze_financial_health": analyze_financial_health, + "analyze_valuation_ratios": analyze_valuation_ratios, + "get_financial_metrics_tool": get_financial_metrics_tool, + "analyze_trend_following": analyze_trend_following, + "analyze_mean_reversion": analyze_mean_reversion, + "analyze_momentum": analyze_momentum, + "analyze_volatility": analyze_volatility, + "analyze_insider_trading": analyze_insider_trading, + "analyze_news_sentiment": analyze_news_sentiment, + "dcf_valuation_analysis": dcf_valuation_analysis, + "owner_earnings_valuation_analysis": owner_earnings_valuation_analysis, + "ev_ebitda_valuation_analysis": ev_ebitda_valuation_analysis, + "residual_income_valuation_analysis": residual_income_valuation_analysis, +} diff --git a/backend/tools/data_tools.py b/backend/tools/data_tools.py new file mode 100644 index 0000000..d66850b --- /dev/null +++ b/backend/tools/data_tools.py @@ -0,0 +1,742 @@ +# -*- coding: utf-8 -*- +# flake8: noqa: E501 +# pylint: disable=C0301 +""" +Data fetching tools for financial data. + +All functions use centralized data source configuration from data_config.py. +The data source is automatically determined based on available API keys: +- Priority: FINNHUB_API_KEY > FINANCIAL_DATASETS_API_KEY +""" +import datetime +import time + +import finnhub +import pandas as pd +import pandas_market_calendars as mcal +import requests + +from backend.config.data_config import ( + get_config, + get_api_key, +) +from backend.data.cache import get_cache +from backend.data.schema import ( + CompanyFactsResponse, + CompanyNews, + CompanyNewsResponse, + FinancialMetrics, + FinancialMetricsResponse, + InsiderTrade, + InsiderTradeResponse, + LineItem, + LineItemResponse, + Price, + PriceResponse, +) +from backend.utils.settlement import logger + +# Global cache instance +_cache = get_cache() + + +def get_last_tradeday(date: str) -> str: + """ + Get the previous trading day for the specified date + + Args: + date: Date string (YYYY-MM-DD) + + Returns: + Previous trading day date string (YYYY-MM-DD) + """ + current_date = datetime.datetime.strptime(date, "%Y-%m-%d") + _NYSE_CALENDAR = mcal.get_calendar("NYSE") + + if _NYSE_CALENDAR is not None: + # Get trading days before current date + # Go back 90 days from current date to get all trading days + start_search = current_date - datetime.timedelta(days=90) + + if hasattr(_NYSE_CALENDAR, "valid_days"): + # pandas_market_calendars + trading_dates = _NYSE_CALENDAR.valid_days( + start_date=start_search.strftime("%Y-%m-%d"), + end_date=current_date.strftime("%Y-%m-%d"), + ) + else: + # exchange_calendars + trading_dates = _NYSE_CALENDAR.sessions_in_range( + start_search.strftime("%Y-%m-%d"), + current_date.strftime("%Y-%m-%d"), + ) + + # Convert to date list + trading_dates_list = [ + pd.Timestamp(d).strftime("%Y-%m-%d") for d in trading_dates + ] + + # Find current date position in the list + if date in trading_dates_list: + # If current date is a trading day, return previous trading day + idx = trading_dates_list.index(date) + if idx > 0: + return trading_dates_list[idx - 1] + else: + # If it's the first trading day, go back further + prev_date = current_date - datetime.timedelta(days=1) + return get_last_tradeday(prev_date.strftime("%Y-%m-%d")) + else: + # If current date is not a trading day, return the nearest trading day + if trading_dates_list: + return trading_dates_list[-1] + + return prev_date.strftime("%Y-%m-%d") + + +def _make_api_request( + url: str, + headers: dict, + method: str = "GET", + json_data: dict = None, + max_retries: int = 3, +) -> requests.Response: + """ + Make an API request with rate limiting handling and moderate backoff. + + Args: + url: The URL to request + headers: Headers to include in the request + method: HTTP method (GET or POST) + json_data: JSON data for POST requests + max_retries: Maximum number of retries (default: 3) + + Returns: + requests.Response: The response object + + Raises: + Exception: If the request fails with a non-429 error + """ + for attempt in range(max_retries + 1): # +1 for initial attempt + if method.upper() == "POST": + response = requests.post(url, headers=headers, json=json_data) + else: + response = requests.get(url, headers=headers) + + if response.status_code == 429 and attempt < max_retries: + # Linear backoff: 60s, 90s, 120s, 150s... + delay = 60 + (30 * attempt) + print( + f"Rate limited (429). Attempt {attempt + 1}/{max_retries + 1}. Waiting {delay}s before retrying...", + ) + time.sleep(delay) + continue + + # Return the response (whether success, other errors, or final 429) + return response + + +def get_prices( + ticker: str, + start_date: str, + end_date: str, +) -> list[Price]: + """ + Fetch price data from cache or API. + + Uses centralized data source configuration (FINNHUB_API_KEY prioritized). + + Args: + ticker: Stock ticker symbol + start_date: Start date (YYYY-MM-DD) + end_date: End date (YYYY-MM-DD) + + Returns: + list[Price]: List of Price objects + """ + config = get_config() + data_source = config.source + api_key = config.api_key + + # Create a cache key that includes all parameters to ensure exact matches + cache_key = f"{ticker}_{start_date}_{end_date}_{data_source}" + + # Check cache first - simple exact match + if cached_data := _cache.get_prices(cache_key): + return [Price(**price) for price in cached_data] + + prices = [] + + if data_source == "finnhub": + # Use Finnhub API + client = finnhub.Client(api_key=api_key) + + # Convert dates to timestamps + start_timestamp = int( + datetime.datetime.strptime(start_date, "%Y-%m-%d").timestamp(), + ) + end_timestamp = int( + ( + datetime.datetime.strptime(end_date, "%Y-%m-%d") + + datetime.timedelta(days=1) + ).timestamp(), + ) + + # Fetch candle data from Finnhub + candles = client.stock_candles( + ticker, + "D", + start_timestamp, + end_timestamp, + ) + + # Convert to Price objects + for i in range(len(candles["t"])): + price = Price( + open=candles["o"][i], + close=candles["c"][i], + high=candles["h"][i], + low=candles["l"][i], + volume=int(candles["v"][i]), + time=datetime.datetime.fromtimestamp(candles["t"][i]).strftime( + "%Y-%m-%d", + ), + ) + prices.append(price) + + else: # financial_datasets + # Use Financial Datasets API + headers = {"X-API-KEY": api_key} + + url = f"https://api.financialdatasets.ai/prices/?ticker={ticker}&interval=day&interval_multiplier=1&start_date={start_date}&end_date={end_date}" + response = _make_api_request(url, headers) + if response.status_code != 200: + raise ValueError( + f"Error fetching data: {ticker} - {response.status_code} - {response.text}", + ) + + # Parse response with Pydantic model + price_response = PriceResponse(**response.json()) + prices = price_response.prices + + if not prices: + return [] + + # Cache the results using the comprehensive cache key + _cache.set_prices(cache_key, [p.model_dump() for p in prices]) + return prices + + +def get_financial_metrics( + ticker: str, + end_date: str, + period: str = "ttm", + limit: int = 10, +) -> list[FinancialMetrics]: + """ + Fetch financial metrics from cache or API. + + Uses centralized data source configuration (FINNHUB_API_KEY prioritized). + + Args: + ticker: Stock ticker symbol + end_date: End date (YYYY-MM-DD) + period: Period type (default: "ttm") + limit: Number of records to fetch + + Returns: + list[FinancialMetrics]: List of financial metrics + """ + config = get_config() + data_source = config.source + api_key = config.api_key + + # Create a cache key that includes all parameters to ensure exact matches + cache_key = f"{ticker}_{period}_{end_date}_{limit}_{data_source}" + + # Check cache first - simple exact match + if cached_data := _cache.get_financial_metrics(cache_key): + return [FinancialMetrics(**metric) for metric in cached_data] + + financial_metrics = [] + + if data_source == "finnhub": + # Use Finnhub API - Basic Financials + client = finnhub.Client(api_key=api_key) + + # Fetch basic financials from Finnhub + # metric='all' returns all available metrics + financials = client.company_basic_financials(ticker, "all") + + if not financials or "metric" not in financials: + return [] + + # Finnhub returns {series: {...}, metric: {...}, metricType: ..., symbol: ...} + # We need to create a FinancialMetrics object from this + metric_data = financials.get("metric", {}) + + # Create a FinancialMetrics object with available data + metric = _map_finnhub_metrics(ticker, end_date, period, metric_data) + + financial_metrics = [metric] + + else: # financial_datasets + # Use Financial Datasets API + headers = {"X-API-KEY": api_key} + + url = f"https://api.financialdatasets.ai/financial-metrics/?ticker={ticker}&report_period_lte={end_date}&limit={limit}&period={period}" + response = _make_api_request(url, headers) + if response.status_code != 200: + raise ValueError( + f"Error fetching data: {ticker} - {response.status_code} - {response.text}", + ) + + # Parse response with Pydantic model + metrics_response = FinancialMetricsResponse(**response.json()) + financial_metrics = metrics_response.financial_metrics + + if not financial_metrics: + return [] + + # Cache the results as dicts using the comprehensive cache key + _cache.set_financial_metrics( + cache_key, + [m.model_dump() for m in financial_metrics], + ) + return financial_metrics + + +def _map_finnhub_metrics( + ticker: str, + end_date: str, + period: str, + metric_data: dict, +) -> FinancialMetrics: + """Map Finnhub metric data to FinancialMetrics model.""" + return FinancialMetrics( + ticker=ticker, + report_period=end_date, + period=period, + currency="USD", + market_cap=metric_data.get("marketCapitalization"), + enterprise_value=None, + price_to_earnings_ratio=metric_data.get("peBasicExclExtraTTM"), + price_to_book_ratio=metric_data.get("pbAnnual"), + price_to_sales_ratio=metric_data.get("psAnnual"), + enterprise_value_to_ebitda_ratio=None, + enterprise_value_to_revenue_ratio=None, + free_cash_flow_yield=None, + peg_ratio=None, + gross_margin=metric_data.get("grossMarginTTM"), + operating_margin=metric_data.get("operatingMarginTTM"), + net_margin=metric_data.get("netProfitMarginTTM"), + return_on_equity=metric_data.get("roeTTM"), + return_on_assets=metric_data.get("roaTTM"), + return_on_invested_capital=metric_data.get("roicTTM"), + asset_turnover=metric_data.get("assetTurnoverTTM"), + inventory_turnover=metric_data.get("inventoryTurnoverTTM"), + receivables_turnover=metric_data.get("receivablesTurnoverTTM"), + days_sales_outstanding=None, + operating_cycle=None, + working_capital_turnover=None, + current_ratio=metric_data.get("currentRatioAnnual"), + quick_ratio=metric_data.get("quickRatioAnnual"), + cash_ratio=None, + operating_cash_flow_ratio=None, + debt_to_equity=metric_data.get("totalDebt/totalEquityAnnual"), + debt_to_assets=None, + interest_coverage=None, + revenue_growth=metric_data.get("revenueGrowthTTMYoy"), + earnings_growth=None, + book_value_growth=None, + earnings_per_share_growth=metric_data.get("epsGrowthTTMYoy"), + free_cash_flow_growth=None, + operating_income_growth=None, + ebitda_growth=None, + payout_ratio=metric_data.get("payoutRatioAnnual"), + earnings_per_share=metric_data.get("epsBasicExclExtraItemsTTM"), + book_value_per_share=metric_data.get("bookValuePerShareAnnual"), + free_cash_flow_per_share=None, + ) + + +def search_line_items( + ticker: str, + line_items: list[str], + end_date: str, + period: str = "ttm", + limit: int = 10, +) -> list[LineItem]: + """ + Fetch line items from Financial Datasets API (only supported source). + + Returns empty list on API errors to allow graceful degradation. + """ + try: + api_key = get_api_key() + headers = {"X-API-KEY": api_key} + + url = "https://api.financialdatasets.ai/financials/search/line-items" + body = { + "tickers": [ticker], + "line_items": line_items, + "end_date": end_date, + "period": period, + "limit": limit, + } + response = _make_api_request( + url, + headers, + method="POST", + json_data=body, + ) + + if response.status_code != 200: + logger.info( + f"Warning: Failed to fetch line items for {ticker}: " + f"{response.status_code} - {response.text}", + ) + return [] + + data = response.json() + response_model = LineItemResponse(**data) + search_results = response_model.search_results + + if not search_results: + return [] + + return search_results[:limit] + + except Exception as e: + logger.info( + f"Warning: Exception while fetching line items for {ticker}: {str(e)}", + ) + return [] + + +def _fetch_finnhub_insider_trades( + ticker: str, + start_date: str | None, + end_date: str, + limit: int, + api_key: str, +) -> list[InsiderTrade]: + """Fetch insider trades from Finnhub API.""" + client = finnhub.Client(api_key=api_key) + + from_date = start_date or ( + datetime.datetime.strptime(end_date, "%Y-%m-%d") + - datetime.timedelta(days=365) + ).strftime("%Y-%m-%d") + + insider_data = client.stock_insider_transactions( + ticker, + from_date, + end_date, + ) + + if not insider_data or "data" not in insider_data: + return [] + + return [ + _convert_finnhub_insider_trade(ticker, trade) + for trade in insider_data["data"][:limit] + ] + + +def _fetch_fd_insider_trades( + ticker: str, + start_date: str | None, + end_date: str, + limit: int, + api_key: str, +) -> list[InsiderTrade]: + """Fetch insider trades from Financial Datasets API.""" + headers = {"X-API-KEY": api_key} + all_trades = [] + current_end_date = end_date + + while True: + url = f"https://api.financialdatasets.ai/insider-trades/?ticker={ticker}&filing_date_lte={current_end_date}" + if start_date: + url += f"&filing_date_gte={start_date}" + url += f"&limit={limit}" + + response = _make_api_request(url, headers) + if response.status_code != 200: + raise ValueError( + f"Error fetching data: {ticker} - {response.status_code} - {response.text}", + ) + + data = response.json() + response_model = InsiderTradeResponse(**data) + insider_trades = response_model.insider_trades + + if not insider_trades: + break + + all_trades.extend(insider_trades) + + if not start_date or len(insider_trades) < limit: + break + + current_end_date = min( + trade.filing_date for trade in insider_trades + ).split("T")[0] + + if current_end_date <= start_date: + break + + return all_trades + + +def get_insider_trades( + ticker: str, + end_date: str, + start_date: str | None = None, + limit: int = 1000, +) -> list[InsiderTrade]: + """Fetch insider trades from cache or API.""" + config = get_config() + data_source = config.source + api_key = config.api_key + + cache_key = ( + f"{ticker}_{start_date or 'none'}_{end_date}_{limit}_{data_source}" + ) + + if cached_data := _cache.get_insider_trades(cache_key): + return [InsiderTrade(**trade) for trade in cached_data] + + if data_source == "finnhub": + all_trades = _fetch_finnhub_insider_trades( + ticker, + start_date, + end_date, + limit, + api_key, + ) + else: + all_trades = _fetch_fd_insider_trades( + ticker, + start_date, + end_date, + limit, + api_key, + ) + + if not all_trades: + return [] + + _cache.set_insider_trades( + cache_key, + [trade.model_dump() for trade in all_trades], + ) + return all_trades + + +def _fetch_finnhub_company_news( + ticker: str, + start_date: str | None, + end_date: str, + limit: int, + api_key: str, +) -> list[CompanyNews]: + """Fetch company news from Finnhub API.""" + client = finnhub.Client(api_key=api_key) + + from_date = start_date or ( + datetime.datetime.strptime(end_date, "%Y-%m-%d") + - datetime.timedelta(days=30) + ).strftime("%Y-%m-%d") + + news_data = client.company_news(ticker, _from=from_date, to=end_date) + + if not news_data: + return [] + + all_news = [] + for news_item in news_data[:limit]: + company_news = CompanyNews( + ticker=ticker, + title=news_item.get("headline", ""), + related=news_item.get("related", ""), + source=news_item.get("source", ""), + date=( + datetime.datetime.fromtimestamp( + news_item.get("datetime", 0), + datetime.timezone.utc, + ).strftime("%Y-%m-%d") + if news_item.get("datetime") + else None + ), + url=news_item.get("url", ""), + summary=news_item.get("summary", ""), + category=news_item.get("category", ""), + ) + all_news.append(company_news) + return all_news + + +def _fetch_fd_company_news( + ticker: str, + start_date: str | None, + end_date: str, + limit: int, + api_key: str, +) -> list[CompanyNews]: + """Fetch company news from Financial Datasets API.""" + headers = {"X-API-KEY": api_key} + all_news = [] + current_end_date = end_date + + while True: + url = f"https://api.financialdatasets.ai/news/?ticker={ticker}&end_date={current_end_date}" + if start_date: + url += f"&start_date={start_date}" + url += f"&limit={limit}" + + response = _make_api_request(url, headers) + if response.status_code != 200: + raise ValueError( + f"Error fetching data: {ticker} - {response.status_code} - {response.text}", + ) + + data = response.json() + response_model = CompanyNewsResponse(**data) + company_news = response_model.news + + if not company_news: + break + + all_news.extend(company_news) + + if not start_date or len(company_news) < limit: + break + + current_end_date = min( + news.date for news in company_news if news.date is not None + ).split("T")[0] + + if current_end_date <= start_date: + break + + return all_news + + +def get_company_news( + ticker: str, + end_date: str, + start_date: str | None = None, + limit: int = 1000, +) -> list[CompanyNews]: + """Fetch company news from cache or API.""" + config = get_config() + data_source = config.source + api_key = config.api_key + + cache_key = ( + f"{ticker}_{start_date or 'none'}_{end_date}_{limit}_{data_source}" + ) + + if cached_data := _cache.get_company_news(cache_key): + return [CompanyNews(**news) for news in cached_data] + + if data_source == "finnhub": + all_news = _fetch_finnhub_company_news( + ticker, + start_date, + end_date, + limit, + api_key, + ) + else: + all_news = _fetch_fd_company_news( + ticker, + start_date, + end_date, + limit, + api_key, + ) + + if not all_news: + return [] + + _cache.set_company_news( + cache_key, + [news.model_dump() for news in all_news], + ) + return all_news + + +def _convert_finnhub_insider_trade(ticker: str, trade: dict) -> InsiderTrade: + """Convert Finnhub insider trade format to InsiderTrade model.""" + shares_after = trade.get("share", 0) + change = trade.get("change", 0) + + return InsiderTrade( + ticker=ticker, + issuer=None, + name=trade.get("name", ""), + title=None, + is_board_director=None, + transaction_date=trade.get("transactionDate", ""), + transaction_shares=abs(change), + transaction_price_per_share=trade.get("transactionPrice", 0.0), + transaction_value=abs(change) * trade.get("transactionPrice", 0.0), + shares_owned_before_transaction=( + shares_after - change if shares_after and change else None + ), + shares_owned_after_transaction=float(shares_after) + if shares_after + else None, + security_title=None, + filing_date=trade.get("filingDate", ""), + ) + + +def get_market_cap(ticker: str, end_date: str) -> float | None: + """Fetch market cap from the API. Finnhub values are converted from millions.""" + config = get_config() + data_source = config.source + api_key = config.api_key + + # For today's date, use company facts API + if end_date == datetime.datetime.now().strftime("%Y-%m-%d"): + headers = {"X-API-KEY": api_key} + url = ( + f"https://api.financialdatasets.ai/company/facts/?ticker={ticker}" + ) + response = _make_api_request(url, headers) + if response.status_code != 200: + return None + + data = response.json() + response_model = CompanyFactsResponse(**data) + return response_model.company_facts.market_cap + + financial_metrics = get_financial_metrics(ticker, end_date) + if not financial_metrics: + return None + + market_cap = financial_metrics[0].market_cap + if not market_cap: + return None + + # Finnhub returns market cap in millions + if data_source == "finnhub": + market_cap = market_cap * 1_000_000 + + return market_cap + + +def prices_to_df(prices: list[Price]) -> pd.DataFrame: + """Convert prices to a DataFrame.""" + df = pd.DataFrame([p.model_dump() for p in prices]) + df["Date"] = pd.to_datetime(df["time"]) + df.set_index("Date", inplace=True) + numeric_cols = ["open", "close", "high", "low", "volume"] + for col in numeric_cols: + df[col] = pd.to_numeric(df[col], errors="coerce") + df.sort_index(inplace=True) + return df diff --git a/backend/utils/__init__.py b/backend/utils/__init__.py new file mode 100644 index 0000000..1201dd1 --- /dev/null +++ b/backend/utils/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# This file can be empty + +"""Utility modules for the application.""" diff --git a/backend/utils/analyst_tracker.py b/backend/utils/analyst_tracker.py new file mode 100644 index 0000000..c51d6b6 --- /dev/null +++ b/backend/utils/analyst_tracker.py @@ -0,0 +1,449 @@ +# -*- coding: utf-8 -*- +""" +Analyst Performance Tracker +Tracks analyst predictions and calculates win rates for leaderboard +""" + +import logging +from typing import Any, Dict, List, Optional, Tuple + +logger = logging.getLogger(__name__) + + +class AnalystPerformanceTracker: + """ + Tracks analyst predictions and evaluates accuracy + + Workflow: + 1. Record analyst predictions for each ticker before market close + 2. After market close, evaluate predictions against actual returns + 3. Update leaderboard with win rates and statistics + """ + + def __init__(self): + self.daily_predictions = {} + + def record_analyst_predictions( + self, + final_predictions: List[Dict[str, Any]], + ): + """ + Record predictions from analysts for the current trading day + + Args: + final_predictions: List of structured prediction results + Format: [ + { + 'agent': 'analyst_name', + 'predictions': [ + {'ticker': 'AAPL', ' + direction': 'up', + 'confidence': 0.75}, + ... + ] + }, + ... + ] + tickers: List of tickers being analyzed + """ + self.daily_predictions = {} + + direction_mapping = { + "up": "long", + "down": "short", + "neutral": "hold", + } + + for result in final_predictions: + analyst_id = result.get("agent") + if not analyst_id: + continue + + predictions = result.get("predictions", []) + + self.daily_predictions[analyst_id] = {} + + for pred in predictions: + ticker = pred.get("ticker") + direction = pred.get("direction", "neutral") + + if ticker: + signal = direction_mapping.get(direction, "hold") + self.daily_predictions[analyst_id][ticker] = signal + + def evaluate_predictions( + self, + open_prices: Optional[Dict[str, float]], + close_prices: Dict[str, float], + date: str, + ) -> Dict[str, Dict[str, Any]]: + """ + Evaluate analyst predictions against actual market moves + + Args: + open_prices: Opening prices for each ticker + close_prices: Closing prices for each ticker + date: Trading date string (YYYY-MM-DD) + + Returns: + Dict mapping analyst_id to evaluation results + """ + evaluation_results = {} + + # Map internal signal types to frontend display names + signal_display_map = { + "long": "bull", + "short": "bear", + "hold": "neutral", + } + + for analyst_id, predictions in self.daily_predictions.items(): + correct_long = 0 + correct_short = 0 + incorrect_long = 0 + incorrect_short = 0 + unknown_long = 0 + unknown_short = 0 + hold_count = 0 + + # Individual signal records for frontend display + individual_signals: List[Dict[str, Any]] = [] + + for ticker, prediction in predictions.items(): + open_price = open_prices.get(ticker, 0) + close_price = close_prices.get(ticker, 0) + + signal_type = signal_display_map.get(prediction, "neutral") + + # Cannot evaluate if prices are missing + if open_price <= 0 or close_price <= 0: + if prediction == "long": + unknown_long += 1 + elif prediction == "short": + unknown_short += 1 + + individual_signals.append( + { + "ticker": ticker, + "signal": signal_type, + "date": date, + "is_correct": "unknown", + }, + ) + continue + + actual_return = (close_price - open_price) / open_price + + if prediction == "long": + is_correct = actual_return > 0 + if is_correct: + correct_long += 1 + else: + incorrect_long += 1 + + individual_signals.append( + { + "ticker": ticker, + "signal": signal_type, + "date": date, + "is_correct": is_correct, + }, + ) + + elif prediction == "short": + is_correct = actual_return < 0 + if is_correct: + correct_short += 1 + else: + incorrect_short += 1 + + individual_signals.append( + { + "ticker": ticker, + "signal": signal_type, + "date": date, + "is_correct": is_correct, + }, + ) + + elif prediction == "hold": + hold_count += 1 + individual_signals.append( + { + "ticker": ticker, + "signal": signal_type, + "date": date, + "is_correct": None, + }, + ) + + total_long = correct_long + incorrect_long + unknown_long + total_short = correct_short + incorrect_short + unknown_short + evaluated_long = correct_long + incorrect_long + evaluated_short = correct_short + incorrect_short + total_evaluated = evaluated_long + evaluated_short + correct_predictions = correct_long + correct_short + + win_rate = ( + correct_predictions / total_evaluated + if total_evaluated > 0 + else None + ) + + evaluation_results[analyst_id] = { + "total_predictions": total_evaluated, + "correct_predictions": correct_predictions, + "win_rate": win_rate, + "bull": { + "n": total_long, + "win": correct_long, + "unknown": unknown_long, + }, + "bear": { + "n": total_short, + "win": correct_short, + "unknown": unknown_short, + }, + "hold": hold_count, + "signals": individual_signals, + } + + return evaluation_results + + def clear_daily_predictions(self): + """Clear predictions after evaluation""" + self.daily_predictions = {} + + def _process_single_pm_decision( + self, + _ticker: str, + decision: Dict, + open_price: float, + close_price: float, + _date: str, + ) -> Tuple[str, Optional[bool], str]: + """ + Process a single PM decision and evaluate correctness + + Returns: + Tuple of (prediction, is_correct, signal_type) + """ + action = decision.get("action", "hold") + + # Convert action to prediction format + if action in ["buy", "long"]: + prediction = "long" + elif action in ["sell", "short"]: + prediction = "short" + else: + prediction = "hold" + + signal_display_map = { + "long": "bull", + "short": "bear", + "hold": "neutral", + } + signal_type = signal_display_map.get(prediction, "neutral") + + # Handle invalid prices + if open_price <= 0 or close_price <= 0: + return prediction, None, signal_type + + # Evaluate correctness + actual_return = (close_price - open_price) / open_price + + if prediction == "long": + is_correct = actual_return > 0 + elif prediction == "short": + is_correct = actual_return < 0 + else: # hold + is_correct = None + + return prediction, is_correct, signal_type + + def evaluate_pm_decisions( + self, + pm_decisions: Dict[str, Dict], + open_prices: Optional[Dict[str, float]], + close_prices: Dict[str, float], + date: str, + ) -> Dict[str, Dict[str, Any]]: + """ + Evaluate PM's trading decisions against actual market moves + + Args: + pm_decisions: PM decisions {ticker: {action, quantity, ...}} + open_prices: Opening prices for each ticker + close_prices: Closing prices for each ticker + date: Trading date string (YYYY-MM-DD) + + Returns: + Dict with 'portfolio_manager' key containing evaluation results + """ + if not pm_decisions or not open_prices or not close_prices: + return {} + + correct_long = 0 + correct_short = 0 + incorrect_long = 0 + incorrect_short = 0 + unknown_long = 0 + unknown_short = 0 + hold_count = 0 + + individual_signals: List[Dict[str, Any]] = [] + + for ticker, decision in pm_decisions.items(): + open_price = open_prices.get(ticker, 0) + close_price = close_prices.get(ticker, 0) + + ( + prediction, + is_correct, + signal_type, + ) = self._process_single_pm_decision( + ticker, + decision, + open_price, + close_price, + date, + ) + + if is_correct is None and (open_price <= 0 or close_price <= 0): + if prediction == "long": + unknown_long += 1 + elif prediction == "short": + unknown_short += 1 + individual_signals.append( + { + "ticker": ticker, + "signal": signal_type, + "date": date, + "is_correct": "unknown", + }, + ) + elif prediction == "hold": + hold_count += 1 + individual_signals.append( + { + "ticker": ticker, + "signal": signal_type, + "date": date, + "is_correct": None, + }, + ) + else: + if prediction == "long": + if is_correct: + correct_long += 1 + else: + incorrect_long += 1 + else: + if is_correct: + correct_short += 1 + else: + incorrect_short += 1 + + individual_signals.append( + { + "ticker": ticker, + "signal": signal_type, + "date": date, + "is_correct": is_correct, + }, + ) + + total_long = correct_long + incorrect_long + unknown_long + total_short = correct_short + incorrect_short + unknown_short + evaluated_long = correct_long + incorrect_long + evaluated_short = correct_short + incorrect_short + total_evaluated = evaluated_long + evaluated_short + correct_predictions = correct_long + correct_short + + win_rate = ( + correct_predictions / total_evaluated + if total_evaluated > 0 + else None + ) + + return { + "portfolio_manager": { + "total_predictions": total_evaluated, + "correct_predictions": correct_predictions, + "win_rate": win_rate, + "bull": { + "n": total_long, + "win": correct_long, + "unknown": unknown_long, + }, + "bear": { + "n": total_short, + "win": correct_short, + "unknown": unknown_short, + }, + "hold": hold_count, + "signals": individual_signals, + }, + } + + +def update_leaderboard_with_evaluations( + leaderboard: List[Dict[str, Any]], + evaluations: Dict[str, Dict[str, Any]], +) -> List[Dict[str, Any]]: + """ + Update leaderboard with new evaluation results + + Args: + leaderboard: Current leaderboard data + evaluations: Evaluation results for the day + + Returns: + Updated leaderboard + """ + for entry in leaderboard: + agent_id = entry.get("agentId") + if not agent_id or agent_id not in evaluations: + continue + + eval_result = evaluations[agent_id] + + # Update aggregate stats + entry["bull"]["n"] += eval_result["bull"]["n"] + entry["bull"]["win"] += eval_result["bull"]["win"] + entry["bull"]["unknown"] = ( + entry["bull"].get("unknown", 0) + eval_result["bull"]["unknown"] + ) + entry["bear"]["n"] += eval_result["bear"]["n"] + entry["bear"]["win"] += eval_result["bear"]["win"] + entry["bear"]["unknown"] = ( + entry["bear"].get("unknown", 0) + eval_result["bear"]["unknown"] + ) + + # Calculate win rate based on evaluated signals only + # evaluated = total - unknown + evaluated_bull = entry["bull"]["n"] - entry["bull"]["unknown"] + evaluated_bear = entry["bear"]["n"] - entry["bear"]["unknown"] + total_evaluated = evaluated_bull + evaluated_bear + total_wins = entry["bull"]["win"] + entry["bear"]["win"] + + if total_evaluated > 0: + entry["winRate"] = round(total_wins / total_evaluated, 4) + + # Add individual signal records + if "signals" not in entry: + entry["signals"] = [] + + for signal in eval_result.get("signals", []): + entry["signals"].append(signal) + + # Keep only recent signals (e.g., last 100 individual signals) + entry["signals"] = entry["signals"][-100:] + + # Re-rank analysts by win rate (rank starts from 1) + analyst_entries = [e for e in leaderboard if e.get("rank") is not None] + analyst_entries.sort(key=lambda e: e.get("winRate", 0), reverse=True) + for idx, entry in enumerate(analyst_entries): + entry["rank"] = idx + 1 # Rank 1 = highest win rate (gold medal) + + return leaderboard diff --git a/backend/utils/baselines.py b/backend/utils/baselines.py new file mode 100644 index 0000000..b732aeb --- /dev/null +++ b/backend/utils/baselines.py @@ -0,0 +1,405 @@ +# -*- coding: utf-8 -*- +""" +Baseline Strategy Calculators +Tracks performance of simple baseline strategies for comparison +""" +import logging +from datetime import datetime +from typing import Any, Dict, List, Tuple, TypedDict + +logger = logging.getLogger(__name__) + + +class Portfolio(TypedDict): + cash: float + positions: Dict[str, float] + + +class BaselineCalculator: + """ + Calculates baseline strategy returns for comparison + + Strategies: + 1. Equal-weight: Allocate equal weight to all tickers + 2. Market-cap-weighted: Allocate proportional to market cap + 3. Simple momentum: Monthly rebalance, + long top 50% momentum, short bottom 50% + """ + + def __init__(self, initial_capital: float = 100000.0): + self.initial_capital = initial_capital + + self.equal_weight_portfolio: Portfolio = {"cash": 0.0, "positions": {}} + self.market_cap_portfolio: Portfolio = {"cash": 0.0, "positions": {}} + self.momentum_portfolio: Portfolio = { + "cash": initial_capital, + "positions": {}, + } + + self.equal_weight_initialized = False + self.market_cap_initialized = False + self.momentum_last_rebalance_date = None + + def calculate_equal_weight_value( + self, + tickers: List[str], + open_prices: Dict[str, float], + close_prices: Dict[str, float], + ) -> float: + """ + Calculate equal-weight portfolio value + + On first call, initialize positions with equal allocation using + open prices. Subsequently, mark-to-market existing positions + using close prices. + + Args: + tickers: List of stock tickers + open_prices: Opening prices (used for initial purchase) + close_prices: Closing prices (used for valuation) + """ + if not self.equal_weight_initialized: + allocation_per_ticker = self.initial_capital / len(tickers) + self.equal_weight_portfolio["cash"] = 0.0 + for ticker in tickers: + price = open_prices.get(ticker, 0) # Use OPEN price for buying + if price > 0: + shares = allocation_per_ticker / price + self.equal_weight_portfolio["positions"][ticker] = shares + logger.info( + f"Equal Weight: Initialized {ticker} with " + f"{shares:.2f} shares @ ${price:.2f} (open)", + ) + self.equal_weight_initialized = True + + total_value = self.equal_weight_portfolio["cash"] + positions: Dict[str, float] = self.equal_weight_portfolio["positions"] + for ticker, shares in positions.items(): + price = close_prices.get(ticker, 0) + total_value += shares * price + + return total_value + + def calculate_market_cap_weighted_value( + self, + tickers: List[str], + open_prices: Dict[str, float], + close_prices: Dict[str, float], + market_caps: Dict[str, float], + ) -> float: + """ + Calculate market-cap-weighted portfolio value + + On first call, initialize positions weighted by market cap using + open prices. Subsequently, mark-to-market existing positions + using close prices. + + Args: + tickers: List of stock tickers + open_prices: Opening prices (used for initial purchase) + close_prices: Closing prices (used for valuation) + market_caps: Market capitalization for each ticker + """ + if not self.market_cap_initialized: + total_market_cap = sum(market_caps.get(t, 0) for t in tickers) + if total_market_cap <= 0: + logger.warning("No market cap data, using equal weight") + return self.calculate_equal_weight_value( + tickers, + open_prices, + close_prices, + ) + + self.market_cap_portfolio["cash"] = 0.0 + for ticker in tickers: + market_cap = market_caps.get(ticker, 0) + price = open_prices.get(ticker, 0) # Use OPEN price for buying + if market_cap > 0 and price > 0: + weight = market_cap / total_market_cap + allocation = self.initial_capital * weight + shares = allocation / price + self.market_cap_portfolio["positions"][ticker] = shares + logger.info( + f"Market Cap Weighted: Initialized {ticker} with " + f"{shares:.2f} shares @ ${price:.2f} (open), " + f"weight={weight:.2%}", + ) + self.market_cap_initialized = True + + total_value = self.market_cap_portfolio["cash"] + positions: Dict[str, float] = self.market_cap_portfolio["positions"] + for ticker, shares in positions.items(): + price = close_prices.get(ticker, 0) + total_value += shares * price + + return total_value + + def calculate_momentum_value( + self, + tickers: List[str], + open_prices: Dict[str, float], + close_prices: Dict[str, float], + momentum_scores: Dict[str, float], + date: str, + rebalance: bool = False, + ) -> float: + """ + Calculate momentum strategy portfolio value + + Strategy: Monthly rebalance + - Long top 50% momentum stocks + - Short bottom 50% momentum stocks (if shorting enabled) + - Equal weight within each group + + Args: + tickers: List of tickers + open_prices: Opening prices (used for rebalancing trades) + close_prices: Closing prices (used for valuation) + momentum_scores: Momentum scores for each ticker + date: Current date (YYYY-MM-DD) + rebalance: Force rebalance if True + """ + should_rebalance = rebalance + if self.momentum_last_rebalance_date is None: + should_rebalance = True + elif not rebalance: + last_date = datetime.strptime( + self.momentum_last_rebalance_date, + "%Y-%m-%d", + ) + current_date = datetime.strptime(date, "%Y-%m-%d") + if (current_date.year, current_date.month) != ( + last_date.year, + last_date.month, + ): + should_rebalance = True + + if should_rebalance: + self._rebalance_momentum_portfolio( + tickers, + open_prices, + momentum_scores, + ) + self.momentum_last_rebalance_date = date + + total_value = self.momentum_portfolio["cash"] + positions: Dict[str, float] = self.momentum_portfolio["positions"] + for ticker, shares in positions.items(): + price = close_prices.get(ticker, 0) + total_value += shares * price + + return total_value + + def _rebalance_momentum_portfolio( + self, + tickers: List[str], + prices: Dict[str, float], + momentum_scores: Dict[str, float], + ): + """Rebalance momentum portfolio based on current momentum scores""" + current_value = self.momentum_portfolio["cash"] + for ticker, shares in self.momentum_portfolio["positions"].items(): + price = prices.get(ticker, 0) + current_value += shares * price + + self.momentum_portfolio["positions"] = {} + + sorted_tickers = sorted( + tickers, + key=lambda t: momentum_scores.get(t, 0), + reverse=True, + ) + + mid_point = len(sorted_tickers) // 2 + long_tickers = ( + sorted_tickers[:mid_point] if mid_point > 0 else sorted_tickers + ) + + if len(long_tickers) == 0: + self.momentum_portfolio["cash"] = current_value + return + + allocation_per_ticker = current_value / len(long_tickers) + used_capital = 0.0 + + for ticker in long_tickers: + price = prices.get(ticker, 0) + if price > 0: + shares = allocation_per_ticker / price + self.momentum_portfolio["positions"][ticker] = shares + used_capital += allocation_per_ticker + + self.momentum_portfolio["cash"] = current_value - used_capital + + def get_all_baseline_values( + self, + tickers: List[str], + open_prices: Dict[str, float], + close_prices: Dict[str, float], + market_caps: Dict[str, float], + momentum_scores: Dict[str, float], + date: str, + rebalance_momentum: bool = False, + ) -> Dict[str, float]: + """ + Get all baseline portfolio values in one call + + Args: + tickers: List of stock tickers + open_prices: Opening prices (used for initial purchase/rebalancing) + close_prices: Closing prices (used for valuation) + market_caps: Market caps for each ticker + momentum_scores: Momentum scores for rebalancing + date: Current date + rebalance_momentum: Whether to rebalance momentum portfolio + + Returns: + Dict with keys: equal_weight, market_cap_weighted, momentum + """ + equal_weight_value = self.calculate_equal_weight_value( + tickers, + open_prices, + close_prices, + ) + market_cap_value = self.calculate_market_cap_weighted_value( + tickers, + open_prices, + close_prices, + market_caps, + ) + momentum_value = self.calculate_momentum_value( + tickers, + open_prices, + close_prices, + momentum_scores, + date, + rebalance_momentum, + ) + + return { + "equal_weight": equal_weight_value, + "market_cap_weighted": market_cap_value, + "momentum": momentum_value, + } + + def export_state(self) -> Dict[str, Any]: + """ + Export calculator state for persistence + + Returns: + Dictionary containing all portfolio states for serialization + """ + return { + "baseline_state": { + "initialized": self.equal_weight_initialized, + "initial_allocation": dict( + self.equal_weight_portfolio["positions"], + ), + }, + "baseline_vw_state": { + "initialized": self.market_cap_initialized, + "initial_allocation": dict( + self.market_cap_portfolio["positions"], + ), + }, + "momentum_state": { + "positions": dict(self.momentum_portfolio["positions"]), + "cash": self.momentum_portfolio["cash"], + "initialized": self.momentum_last_rebalance_date is not None, + "last_rebalance_date": self.momentum_last_rebalance_date, + }, + } + + def load_state(self, state: Dict[str, Any]): + """ + Load calculator state from persistence + + Args: + state: Dictionary containing baseline_state, baseline_vw_state, + momentum_state from storage + """ + # Load equal-weight state + baseline_state = state.get("baseline_state", {}) + if baseline_state.get("initialized", False): + self.equal_weight_initialized = True + self.equal_weight_portfolio["positions"] = dict( + baseline_state.get("initial_allocation", {}), + ) + self.equal_weight_portfolio["cash"] = 0.0 + logger.info( + f"Restored equal-weight portfolio with " + f"{len(self.equal_weight_portfolio['positions'])} positions", + ) + + # Load market-cap-weighted state + baseline_vw_state = state.get("baseline_vw_state", {}) + if baseline_vw_state.get("initialized", False): + self.market_cap_initialized = True + self.market_cap_portfolio["positions"] = dict( + baseline_vw_state.get("initial_allocation", {}), + ) + self.market_cap_portfolio["cash"] = 0.0 + logger.info( + f"Restored market-cap portfolio with " + f"{len(self.market_cap_portfolio['positions'])} positions", + ) + + # Load momentum state + momentum_state = state.get("momentum_state", {}) + if momentum_state.get("initialized", False): + self.momentum_portfolio["positions"] = dict( + momentum_state.get("positions", {}), + ) + self.momentum_portfolio["cash"] = momentum_state.get( + "cash", + self.initial_capital, + ) + self.momentum_last_rebalance_date = momentum_state.get( + "last_rebalance_date", + ) + logger.info( + f"Restored momentum portfolio with " + f"{len(self.momentum_portfolio['positions'])} positions, " + f"last rebalance: {self.momentum_last_rebalance_date}", + ) + + +def calculate_momentum_scores( + tickers: List[str], + prices_history: Dict[str, List[Tuple[str, float]]], + lookback_days: int = 20, +) -> Dict[str, float]: + """ + Calculate momentum scores for tickers + + Args: + tickers: List of tickers + prices_history: Dict mapping ticker to list of (date, price) tuples + lookback_days: Number of days to calculate momentum + + Returns: + Dict mapping ticker to momentum score (percentage return) + """ + momentum_scores = {} + + for ticker in tickers: + history = prices_history.get(ticker, []) + if len(history) < 2: + momentum_scores[ticker] = 0.0 + continue + + sorted_history = sorted(history, key=lambda x: x[0]) + + if len(sorted_history) < lookback_days: + start_price = sorted_history[0][1] + end_price = sorted_history[-1][1] + else: + start_price = sorted_history[-lookback_days][1] + end_price = sorted_history[-1][1] + + if start_price > 0: + momentum_scores[ticker] = (end_price - start_price) / start_price + else: + momentum_scores[ticker] = 0.0 + + return momentum_scores diff --git a/backend/utils/msg_adapter.py b/backend/utils/msg_adapter.py new file mode 100644 index 0000000..af524d4 --- /dev/null +++ b/backend/utils/msg_adapter.py @@ -0,0 +1,321 @@ +# -*- coding: utf-8 -*- +""" +Message Adapter - Converts AgentScope Msg to frontend JSON format +Ensures compatibility with existing frontend without modifications +""" +import json +import logging +from datetime import datetime +from typing import Any, Dict, List, Optional + +from agentscope.message import Msg + +logger = logging.getLogger(__name__) + + +class FrontendAdapter: + """ + Adapter to convert AgentScope messages to frontend-compatible format + + Frontend expects specific message types: + - agent: Agent thinking/analysis messages + - team_summary: Portfolio summary with equity curves + - team_holdings: Current portfolio holdings + - team_stats: Portfolio statistics + - team_trades: Trade history + - team_leaderboard: Agent performance rankings + - price_update: Real-time price updates + - system: System notifications + """ + + @staticmethod + def parse(msg: Msg) -> Optional[Dict[str, Any]]: + """ + Parse AgentScope Msg to frontend format + + Args: + msg: AgentScope Msg object + + Returns: + Dictionary in frontend format, or None if message should be skipped + """ + if msg is None: + return None + + # Determine message type based on metadata or content + msg_type = FrontendAdapter._determine_type(msg) + + if msg_type == "agent": + return FrontendAdapter._format_agent_msg(msg) + elif msg_type == "portfolio_update": + return FrontendAdapter._format_portfolio_msg(msg) + elif msg_type == "system": + return FrontendAdapter._format_system_msg(msg) + else: + # Default: treat as agent message + return FrontendAdapter._format_agent_msg(msg) + + @staticmethod + def _determine_type(msg: Msg) -> str: + """Determine frontend message type from Msg""" + # Check metadata for explicit type + if hasattr(msg, "metadata") and msg.metadata: + if "type" in msg.metadata: + return msg.metadata["type"] + + # Check if message contains portfolio update + if "portfolio" in msg.metadata: + return "portfolio_update" + + # Check message name/role + if msg.name == "system": + return "system" + + # Default to agent message + return "agent" + + @staticmethod + def _format_agent_msg(msg: object) -> Dict[str, Any]: + """ + Format agent message for frontend + + Args: + msg: Either AgentScope Msg or dict from pipeline results + + Frontend expects: + { + "type": "agent", + "role_key": "analyst_id", + "content": "message text", + "timestamp": "ISO timestamp" + } + """ + # Handle dict from pipeline results + if isinstance(msg, dict): + name = msg.get("agent", "unknown") + content = msg.get("content", "") + else: + # Handle Msg object + name = msg.name + content = msg.content + + return { + "type": "agent", + "role_key": name, + "content": content + if isinstance(content, str) + else json.dumps(content), + "timestamp": datetime.now().isoformat(), + } + + @staticmethod + def _format_portfolio_msg(msg: Msg) -> Dict[str, Any]: + """ + Format portfolio update message + + This typically generates multiple frontend messages: + - team_summary + - team_holdings + - team_stats + - team_trades (if trades were executed) + """ + metadata = msg.metadata or {} + portfolio = metadata.get("portfolio", {}) + + messages: List[Dict[str, Any]] = [] + + # Generate holdings message + holdings = FrontendAdapter.build_holdings(portfolio) + if holdings: + messages.append( + { + "type": "team_holdings", + "data": holdings, + "timestamp": datetime.now().isoformat(), + }, + ) + + # Generate stats message + stats = FrontendAdapter.build_stats(portfolio) + if stats: + messages.append( + { + "type": "team_stats", + "data": stats, + "timestamp": datetime.now().isoformat(), + }, + ) + + # Generate trades message if execution logs exist + execution_logs = metadata.get("execution_logs", []) + if execution_logs: + trades = FrontendAdapter.build_trades(execution_logs) + messages.append( + { + "type": "team_trades", + "mode": "incremental", + "data": trades, + "timestamp": datetime.now().isoformat(), + }, + ) + + # Return composite message + return { + "type": "composite", + "messages": messages, + } + + @staticmethod + def _format_system_msg(msg: Msg) -> Dict[str, Any]: + """Format system message""" + return { + "type": "system", + "content": msg.content + if isinstance(msg.content, str) + else json.dumps(msg.content), + "timestamp": datetime.now().isoformat(), + } + + @staticmethod + def build_holdings( + portfolio: Dict[str, Any], + prices: Dict[str, float] = None, + ) -> List[Dict[str, Any]]: + """Build holdings array from portfolio state""" + holdings = [] + prices = prices or {} + + positions = portfolio.get("positions", {}) + cash = portfolio.get("cash", 0.0) + + # Calculate total value using current prices + total_value = cash + for ticker, position in positions.items(): + long_shares = position.get("long", 0) + short_shares = position.get("short", 0) + price = prices.get(ticker) or position.get("avg_price", 0) + total_value += (long_shares - short_shares) * price + + # Build holdings for each position + for ticker, position in positions.items(): + long_shares = position.get("long", 0) + short_shares = position.get("short", 0) + avg_price = position.get("avg_price", 0) + current_price = prices.get(ticker) or avg_price + + net_shares = long_shares - short_shares + if net_shares == 0: + continue + + market_value = net_shares * current_price + weight = market_value / total_value if total_value > 0 else 0 + + holdings.append( + { + "ticker": ticker, + "quantity": net_shares, + "avg": avg_price, + "currentPrice": current_price, + "marketValue": market_value, + "weight": weight, + }, + ) + + # Add cash as a holding + if cash > 0: + holdings.append( + { + "ticker": "CASH", + "quantity": 1, + "avg": cash, + "currentPrice": cash, + "marketValue": cash, + "weight": cash / total_value if total_value > 0 else 0, + }, + ) + + return holdings + + @staticmethod + def build_stats( + portfolio: Dict[str, Any], + prices: Dict[str, float] = None, + ) -> Dict[str, Any]: + """Build stats dictionary from portfolio""" + prices = prices or {} + positions = portfolio.get("positions", {}) + cash = portfolio.get("cash", 0.0) + margin_used = portfolio.get("margin_used", 0.0) + + # Calculate total value using current prices + total_value = cash + for ticker, position in positions.items(): + long_shares = position.get("long", 0) + short_shares = position.get("short", 0) + price = prices.get(ticker) or position.get("avg_price", 0) + total_value += (long_shares - short_shares) * price + + # Calculate ticker weights + ticker_weights = {} + for ticker, position in positions.items(): + long_shares = position.get("long", 0) + short_shares = position.get("short", 0) + price = prices.get(ticker) or position.get("avg_price", 0) + + market_value = (long_shares - short_shares) * price + if market_value != 0: + ticker_weights[ticker] = ( + market_value / total_value if total_value > 0 else 0 + ) + + # Calculate total return + initial_cash = portfolio.get("initial_cash", 100000.0) + total_return = ( + ((total_value - initial_cash) / initial_cash * 100) + if initial_cash > 0 + else 0.0 + ) + + return { + "totalAssetValue": round(total_value, 2), + "totalReturn": round(total_return, 2), + "cashPosition": round(cash, 2), + "tickerWeights": ticker_weights, + "marginUsed": round(margin_used, 2), + } + + @staticmethod + def build_trades(execution_logs: List[str]) -> List[Dict[str, Any]]: + """ + Build trades array from execution logs + + Frontend expects: + [{ + "ts": 1234567890, + "ticker": "AAPL", + "side": "LONG", + "qty": 100, + "price": 150.0, + "reason": "Buy signal" + }, ...] + """ + trades = [] + timestamp = int(datetime.now().timestamp() * 1000) + + for log in execution_logs: + # Parse execution log (simplified - should use structured data) + if "Executed" in log: + # Extract trade details from log string + # in real implementation, pass structured data + trades.append( + { + "ts": timestamp, + "ticker": "UNKNOWN", # Should parse from log + "side": "LONG", # Should parse from log + "qty": 0, # Should parse from log + "price": 0.0, # Should parse from log + "reason": log, + }, + ) + + return trades diff --git a/backend/utils/progress.py b/backend/utils/progress.py new file mode 100644 index 0000000..c904cd1 --- /dev/null +++ b/backend/utils/progress.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +from datetime import datetime, timezone +from typing import Callable, Optional + +from rich.console import Console +from rich.live import Live +from rich.style import Style +from rich.table import Table +from rich.text import Text + +console = Console() + + +class AgentProgress: + """Manages progress tracking for multiple agents.""" + + def __init__(self): + self.agent_status = {} + self.table = Table(show_header=False, box=None, padding=(0, 1)) + self.live = Live(self.table, console=console, refresh_per_second=4) + self.started = False + self.update_handlers = [] + + def register_handler( + self, + handler: Callable[[str, Optional[str], str], None], + ): + """Register a handler to be called when agent status updates.""" + self.update_handlers.append(handler) + return handler # Return handler to support use as decorator + + def unregister_handler( + self, + handler: Callable[[str, Optional[str], str], None], + ): + """Unregister a previously registered handler.""" + if handler in self.update_handlers: + self.update_handlers.remove(handler) + + def start(self): + """Start the progress display.""" + if not self.started: + self.live.start() + self.started = True + + def stop(self): + """Stop the progress display.""" + if self.started: + self.live.stop() + self.started = False + + def update_status( + self, + agent_name: str, + ticker: Optional[str] = None, + status: str = "", + analysis: Optional[str] = None, + ): + """Update the status of an agent.""" + if agent_name not in self.agent_status: + self.agent_status[agent_name] = {"status": "", "ticker": None} + + if ticker: + self.agent_status[agent_name]["ticker"] = ticker + if status: + self.agent_status[agent_name]["status"] = status + if analysis: + self.agent_status[agent_name]["analysis"] = analysis + + # Set the timestamp as UTC datetime + timestamp = datetime.now(timezone.utc).isoformat() + self.agent_status[agent_name]["timestamp"] = timestamp + + # Notify all registered handlers + for handler in self.update_handlers: + handler(agent_name, ticker, status, analysis, timestamp) + + self._refresh_display() + + def get_all_status(self): + """Get the current status of all agents as a dictionary.""" + return { + agent_name: { + "ticker": info["ticker"], + "status": info["status"], + "display_name": self._get_display_name(agent_name), + } + for agent_name, info in self.agent_status.items() + } + + def _get_display_name(self, agent_name: str) -> str: + """Convert agent_name to a display-friendly format.""" + return agent_name.replace("_agent", "").replace("_", " ").title() + + def _refresh_display(self): + """Refresh the progress display.""" + self.table.columns.clear() + self.table.add_column(width=100) + + # Sort Risk Management and Portfolio Management at the bottom + def sort_key(item): + agent_name = item[0] + if "risk_manager" in agent_name: + return (2, agent_name) + elif "portfolio_manager" in agent_name: + return (3, agent_name) + else: + return (1, agent_name) + + for agent_name, info in sorted( + self.agent_status.items(), + key=sort_key, + ): + status = info["status"] + ticker = info["ticker"] + # Create the status text with appropriate styling + if status.lower() == "done": + style = Style(color="green", bold=True) + symbol = "✓" + elif status.lower() == "error": + style = Style(color="red", bold=True) + symbol = "✗" + else: + style = Style(color="yellow") + symbol = "⋯" + + agent_display = self._get_display_name(agent_name) + status_text = Text() + status_text.append(f"{symbol} ", style=style) + status_text.append(f"{agent_display:<20}", style=Style(bold=True)) + + if ticker: + status_text.append(f"[{ticker}] ", style=Style(color="cyan")) + status_text.append(status, style=style) + + self.table.add_row(status_text) + + +# Create a global instance +progress = AgentProgress() diff --git a/backend/utils/settlement.py b/backend/utils/settlement.py new file mode 100644 index 0000000..d4f714e --- /dev/null +++ b/backend/utils/settlement.py @@ -0,0 +1,362 @@ +# -*- coding: utf-8 -*- +""" +Settlement Coordinator +Unified daily settlement logic for agent portfolio, baselines, and analyst tracking +""" +# flake8: noqa: E501 +import logging +from datetime import datetime +from typing import Any, Dict, List, Optional + +from backend.services.storage import StorageService +from backend.utils.analyst_tracker import ( + AnalystPerformanceTracker, + update_leaderboard_with_evaluations, +) +from backend.utils.baselines import ( + BaselineCalculator, + calculate_momentum_scores, +) + +logger = logging.getLogger(__name__) + + +class SettlementCoordinator: + """ + Coordinates daily settlement after market close + + Responsibilities: + 1. Calculate agent portfolio P&L + 2. Update baseline portfolios (equal-weight, market-cap, momentum) + 3. Evaluate analyst predictions and update leaderboard + 4. Update summary.json with all portfolio values + 5. Persist state to storage + """ + + def __init__( + self, + storage: "StorageService", + initial_capital: float = 100000.0, + ): + self.storage = storage + self.initial_capital = initial_capital + self.baseline_calculator = BaselineCalculator(initial_capital) + self.analyst_tracker = AnalystPerformanceTracker() + + self.price_history: Dict[str, List[tuple]] = {} + + # Load persisted state from storage + self._load_persisted_state() + + def _load_persisted_state(self): + """ + Load persisted baseline and price history state from storage + + This restores the baseline calculator state so that backtest/live mode + can resume from where it left off. + """ + internal_state = self.storage.load_internal_state() + + # Load baseline calculator state + baseline_state = { + "baseline_state": internal_state.get("baseline_state", {}), + "baseline_vw_state": internal_state.get("baseline_vw_state", {}), + "momentum_state": internal_state.get("momentum_state", {}), + } + self.baseline_calculator.load_state(baseline_state) + + # Load price history for momentum calculation + saved_price_history = internal_state.get("price_history", {}) + if saved_price_history: + # Convert saved format back to list of tuples + for ticker, history in saved_price_history.items(): + converted_history = [] + for entry in history: + if isinstance(entry, dict): + converted_history.append( + (entry["date"], entry["price"]), + ) + elif isinstance(entry, (list, tuple)) and len(entry) >= 2: + converted_history.append((entry[0], entry[1])) + else: + continue + self.price_history[ticker] = converted_history + logger.info( + f"Restored price history for {len(self.price_history)} tickers", + ) + + def _save_persisted_state(self): + """ + Save baseline and price history state to storage + + This persists the baseline calculator state so that backtest/live mode + can resume from where it left off after restart. + """ + internal_state = self.storage.load_internal_state() + + # Export baseline calculator state + baseline_state = self.baseline_calculator.export_state() + internal_state["baseline_state"] = baseline_state["baseline_state"] + internal_state["baseline_vw_state"] = baseline_state[ + "baseline_vw_state" + ] + internal_state["momentum_state"] = baseline_state["momentum_state"] + + # Save price history (convert tuples to dicts for JSON serialization) + price_history_serializable = {} + for ticker, history in self.price_history.items(): + price_history_serializable[ticker] = [ + {"date": date, "price": price} for date, price in history + ] + internal_state["price_history"] = price_history_serializable + + self.storage.save_internal_state(internal_state) + logger.info("Persisted baseline calculator and price history state") + + def record_analyst_predictions( + self, + final_predictions: List[Dict[str, Any]], + ): + """ + Record structured analyst predictions before market close + + Args: + final_predictions: Structured prediction results from analysts + Format: [ + { + 'agent': 'analyst_name', + 'predictions': [ + {'ticker': 'AAPL', 'direction': 'up', 'confidence': 0.75}, + ... + ] + }, + ... + ] + tickers: List of tickers being analyzed + """ + self.analyst_tracker.record_analyst_predictions(final_predictions) + + def update_price_history( + self, + date: str, + prices: Dict[str, float], + ): + """ + Update price history for momentum calculation + + Args: + date: Trading date (YYYY-MM-DD) + prices: Current prices for each ticker + """ + for ticker, price in prices.items(): + if ticker not in self.price_history: + self.price_history[ticker] = [] + self.price_history[ticker].append((date, price)) + + self.price_history[ticker] = self.price_history[ticker][-60:] + + def run_daily_settlement( + self, + date: str, + tickers: List[str], + open_prices: Optional[Dict[str, float]], + close_prices: Dict[str, float], + market_caps: Dict[str, float], + agent_portfolio: Dict[str, Any], + analyst_results: List[Dict[str, Any]], # pylint: disable=W0613 + pm_decisions: Optional[Dict[str, Dict]] = None, + ) -> Dict[str, Any]: + """ + Run complete daily settlement + + Args: + date: Trading date (YYYY-MM-DD) + tickers: List of tickers + open_prices: Opening prices + close_prices: Closing prices + market_caps: Market caps for each ticker + agent_portfolio: Current agent portfolio state + analyst_results: Analyst analysis results + pm_decisions: PM's trading decisions + + Returns: + Settlement results including all portfolio values and evaluations + """ + logger.info(f"Running daily settlement for {date}") + + self.update_price_history(date, close_prices) + + momentum_scores = calculate_momentum_scores( + tickers, + self.price_history, + lookback_days=20, + ) + + rebalance_momentum = self._should_rebalance_momentum(date) + + baseline_values = self.baseline_calculator.get_all_baseline_values( + tickers=tickers, + open_prices=open_prices if open_prices else close_prices, + close_prices=close_prices, + market_caps=market_caps, + momentum_scores=momentum_scores, + date=date, + rebalance_momentum=rebalance_momentum, + ) + + logger.info(f"Baseline values calculated: {baseline_values}") + + agent_value = self.storage.calculate_portfolio_value( + agent_portfolio, + close_prices, + ) + + analyst_evaluations = self.analyst_tracker.evaluate_predictions( + open_prices, + close_prices, + date, + ) + + pm_evaluations = {} + if pm_decisions: + pm_evaluations = self.analyst_tracker.evaluate_pm_decisions( + pm_decisions, + open_prices, + close_prices, + date, + ) + + all_evaluations = {**analyst_evaluations, **pm_evaluations} + + leaderboard = self.storage.load_file("leaderboard") or [] + updated_leaderboard = update_leaderboard_with_evaluations( + leaderboard, + all_evaluations, + ) + self.storage.save_file("leaderboard", updated_leaderboard) + + self._update_summary_with_baselines( + date, + agent_value, + baseline_values, + ) + + self.analyst_tracker.clear_daily_predictions() + + # Persist baseline calculator and price history state + self._save_persisted_state() + + return { + "date": date, + "agent_portfolio_value": agent_value, + "baseline_values": baseline_values, + "analyst_evaluations": analyst_evaluations, + "baselines_updated": True, + "leaderboard_updated": True, + } + + def _should_rebalance_momentum(self, date: str) -> bool: + """ + Check if momentum portfolio should rebalance + + Returns True if it's a new month + """ + last_rebalance = self.baseline_calculator.momentum_last_rebalance_date + if last_rebalance is None: + return True + + last_date = datetime.strptime(last_rebalance, "%Y-%m-%d") + current_date = datetime.strptime(date, "%Y-%m-%d") + + return (current_date.year, current_date.month) != ( + last_date.year, + last_date.month, + ) + + def _update_summary_with_baselines( + self, + date: str, + agent_value: float, + baseline_values: Dict[str, float], + ): + """ + Update summary.json with agent and baseline portfolio values + + NOTE: History updates are now handled centrally by storage.update_dashboard_after_cycle() + to ensure all histories (equity, baseline, baseline_vw, momentum) stay synchronized. + baseline_values are returned in run_daily_settlement() and passed to storage. + + Args: + date: Trading date (used for backtest-compatible timestamps) + agent_value: Agent portfolio value + baseline_values: Baseline portfolio values + """ + # History updates are now handled by storage.update_dashboard_after_cycle() + # which receives baseline_values from settlement_result and updates all histories together. + # This ensures equity and baseline data points are always synchronized. + + def update_intraday_values( + self, + tickers: List[str], + current_prices: Dict[str, float], + market_caps: Dict[str, float], + agent_portfolio: Dict[str, Any], + ) -> Dict[str, float]: + """ + Update portfolio values with current prices (for live mode intraday updates) + + Args: + tickers: List of tickers + current_prices: Current prices + market_caps: Market caps + agent_portfolio: Current agent portfolio + + Returns: + Dict with current portfolio values + """ + agent_value = self.storage.calculate_portfolio_value( + agent_portfolio, + current_prices, + ) + + equal_weight = self.baseline_calculator.calculate_equal_weight_value( + tickers, + current_prices, + current_prices, + ) + market_cap = ( + self.baseline_calculator.calculate_market_cap_weighted_value( + tickers, + current_prices, + current_prices, + market_caps, + ) + ) + + momentum_scores = calculate_momentum_scores( + tickers, + self.price_history, + lookback_days=20, + ) + + last_date = ( + list(self.price_history.values())[0][-1][0] + if self.price_history + else "" + ) + + momentum = self.baseline_calculator.calculate_momentum_value( + tickers, + current_prices, + current_prices, + momentum_scores, + date=last_date, + rebalance=False, + ) + + return { + "agent": agent_value, + "equal_weight": equal_weight, + "market_cap_weighted": market_cap, + "momentum": momentum, + } diff --git a/backend/utils/terminal_dashboard.py b/backend/utils/terminal_dashboard.py new file mode 100644 index 0000000..3be0418 --- /dev/null +++ b/backend/utils/terminal_dashboard.py @@ -0,0 +1,348 @@ +# -*- coding: utf-8 -*- +""" +Terminal Dashboard - Persistent unified panel using Rich Live +""" +# pylint: disable=R0915,R0912 +import logging +import threading +import time +from typing import Any, Dict, List, Optional + +from rich.console import Console +from rich.live import Live +from rich.panel import Panel +from rich.table import Table + +logger = logging.getLogger(__name__) + + +class TerminalDashboard: + """Unified persistent terminal dashboard""" + + def __init__(self, console: Console = None): + self.console = console or Console() + self.live: Optional[Live] = None + + # Config state + self.mode = "live" + self.config_name = "" + self.host = "0.0.0.0" + self.port = 8765 + self.poll_interval = 10 + self.trigger_time = "now" + self.mock = False + self.enable_memory = False + self.local_time = "" + self.nyse_time = "" + self.start_date = "" + self.end_date = "" + self.tickers: List[str] = [] + self.initial_cash = 100000.0 + + # Trading state + self.current_date = "-" + self.status = "Initializing" + self.total_value = 0.0 + self.cash = 0.0 + self.pnl_pct = 0.0 + self.holdings: List[Dict] = [] + self.trades: List[Dict] = [] + self.days_completed = 0 + self.days_total = 0 + + # Progress message (last line) + self.progress = "" + self._dots_index = 0 + self._animator_running = False + self._animator_thread: Optional[threading.Thread] = None + + def set_config( + self, + mode: str, + config_name: str, + host: str, + port: int, + poll_interval: int, + trigger_time: str = "now", + mock: bool = False, + enable_memory: bool = False, + local_time: str = "", + nyse_time: str = "", + start_date: str = "", + end_date: str = "", + tickers: List[str] = None, + initial_cash: float = 100000.0, + ): + """Set configuration state""" + self.mode = mode + self.config_name = config_name + self.host = host + self.port = port + self.poll_interval = poll_interval + self.trigger_time = trigger_time + self.mock = mock + self.enable_memory = enable_memory + self.local_time = local_time + self.nyse_time = nyse_time + self.start_date = start_date + self.end_date = end_date + self.tickers = tickers or [] + self.initial_cash = initial_cash + self.total_value = initial_cash + self.cash = initial_cash + + def _build_panel(self) -> Panel: + """Build the unified dashboard panel""" + # Main grid + main_table = Table.grid(padding=(0, 2)) + main_table.add_column(width=28) + main_table.add_column(width=22) + main_table.add_column(width=22) + + # Left: Config + Status + left = Table.grid(padding=(0, 0)) + left.add_column() + + # Mode line + if self.mode == "backtest": + mode_str = "[cyan]Backtest[/cyan]" + elif self.mock: + mode_str = "[yellow]MOCK[/yellow]" + else: + mode_str = "[green]LIVE[/green]" + + left.add_row(f"[bold]Mode:[/bold] {mode_str}") + left.add_row(f"[dim]Config:[/dim] {self.config_name}") + left.add_row(f"[dim]Server:[/dim] {self.host}:{self.port}") + + if self.mode == "live" and self.nyse_time: + left.add_row(f"[dim]NYSE:[/dim] {self.nyse_time[:19]}") + trigger_display = ( + "[green]NOW[/green]" + if self.trigger_time == "now" + else self.trigger_time + ) + left.add_row(f"[dim]Trigger:[/dim] {trigger_display}") + + # Status + left.add_row("") + status_style = "green" if self.status == "Running" else "yellow" + left.add_row( + "[bold]Status:[/bold] " + f"[{status_style}]{self.status}[/{status_style}]", + ) + if self.mode == "backtest": + left.add_row( + f"[dim]Backtesting Period:[/dim] {self.days_total} days\n" + f" {self.start_date} -> {self.end_date}", + ) + left.add_row(f"[dim]Current Date:[/dim] {self.current_date}") + + # Middle: Portfolio + mid = Table.grid(padding=(0, 0)) + mid.add_column() + + pnl_style = "green" if self.pnl_pct >= 0 else "red" + mid.add_row("[bold]Portfolio[/bold]") + mid.add_row(f"NAV: [bold]${self.total_value:,.0f}[/bold]") + mid.add_row(f"Cash: ${self.cash:,.0f}") + mid.add_row(f"P&L: [{pnl_style}]{self.pnl_pct:+.2f}%[/{pnl_style}]") + + # Positions + mid.add_row("") + mid.add_row("[bold]Positions[/bold]") + stock_holdings = [ + h for h in self.holdings if h.get("ticker") != "CASH" + ] + if stock_holdings: + for h in stock_holdings[:7]: + qty = h.get("quantity", 0) + ticker = h.get("ticker", "")[:5] + val = h.get("marketValue", 0) + qty_str = f"{qty:+d}" if qty != 0 else "0" + mid.add_row( + f"[cyan]{ticker:<5}[/cyan] {qty_str:>5} ${val:>7,.0f}", + ) + if len(stock_holdings) > 7: + mid.add_row(f"[dim]+{len(stock_holdings) - 7} more[/dim]") + else: + mid.add_row("[dim]No positions[/dim]") + + # Right: Recent Trades + right = Table.grid(padding=(0, 0)) + right.add_column() + + right.add_row("[bold]Recent Trades[/bold]") + if self.trades: + for t in self.trades[:10]: + side = t.get("side", "") + ticker = t.get("ticker", "")[:5] + qty = t.get("qty", 0) + if side == "LONG": + side_str = "[green]L[/green]" + elif side == "SHORT": + side_str = "[red]S[/red]" + else: + side_str = "[dim]H[/dim]" + right.add_row(f"{side_str} [cyan]{ticker:<5}[/cyan] {qty:>4}") + if len(self.trades) > 10: + right.add_row(f"[dim]+{len(self.trades) - 10} more[/dim]") + else: + right.add_row("[dim]No trades[/dim]") + + main_table.add_row(left, mid, right) + + # Outer table to add progress line at bottom + outer = Table.grid(padding=(0, 0)) + outer.add_column() + outer.add_row(main_table) + + # Progress line (last row) with animated dots + if self.progress: + DOTS_FRAMES = [" ", ". ", ".. ", "..."] + dots = DOTS_FRAMES[self._dots_index % len(DOTS_FRAMES)] + outer.add_row("") + outer.add_row(f"[dim]> {self.progress}{dots}[/dim]") + + # Build panel + title = "[bold cyan]EvoTraders[/bold cyan]" + if self.mode == "backtest": + title += " [dim]Backtest[/dim]" + elif self.mock: + title += " [dim]Mock[/dim]" + else: + title += " [dim]Live[/dim]" + + return Panel( + outer, + title=title, + border_style="cyan", + padding=(0, 1), + ) + + def _run_animator(self): + """Background thread to animate the dots""" + while self._animator_running: + time.sleep(0.3) + if self.progress and self.live: + self._dots_index += 1 + self.live.update(self._build_panel()) + + def start(self): + """Start the live dashboard display""" + self.live = Live( + self._build_panel(), + console=self.console, + refresh_per_second=4, + vertical_overflow="visible", + ) + self.live.start() + + # Start animator thread + self._animator_running = True + self._animator_thread = threading.Thread( + target=self._run_animator, + daemon=True, + ) + self._animator_thread.start() + + def stop(self): + """Stop the live dashboard""" + self._animator_running = False + if self._animator_thread: + self._animator_thread.join(timeout=0.5) + self._animator_thread = None + if self.live: + self.live.stop() + self.live = None + + def update( + self, + date: str = None, + status: str = None, + portfolio: Dict[str, Any] = None, + holdings: List[Dict] = None, + trades: List[Dict] = None, + days_completed: int = None, + days_total: int = None, + ): + """Update dashboard state and refresh display""" + if date: + self.current_date = date + if status: + self.status = status + if days_completed is not None: + self.days_completed = days_completed + if days_total is not None: + self.days_total = days_total + + if portfolio: + self.total_value = portfolio.get( + "totalAssetValue", + 0, + ) or portfolio.get( + "total_value", + self.initial_cash, + ) + self.cash = portfolio.get("cashPosition", 0) or portfolio.get( + "cash", + self.initial_cash, + ) + if self.total_value > 0 and self.initial_cash > 0: + self.pnl_pct = ( + (self.total_value - self.initial_cash) / self.initial_cash + ) * 100 + + if holdings is not None: + self.holdings = holdings + if trades is not None: + self.trades = trades + + if self.live: + self.live.update(self._build_panel()) + + def log(self, msg: str, also_log: bool = True): + """ + Update progress message and refresh panel + + Args: + msg: Progress message to display + also_log: Whether to also write to logger (default True) + """ + self.progress = msg + if also_log: + logger.info(msg) + if self.live: + self.live.update(self._build_panel()) + + def print_final_summary(self): + """Print final summary when dashboard stops""" + pnl_style = "green" if self.pnl_pct >= 0 else "red" + + if self.mode == "backtest": + msg = ( + f"[bold]Backtest Complete[/bold] | " + f"Days: {self.days_completed} | " + f"NAV: ${self.total_value:,.0f} | " + f"Return: [{pnl_style}]{self.pnl_pct:+.2f}%[/{pnl_style}]" + ) + else: + msg = ( + f"[bold]Session End[/bold] | " + f"NAV: ${self.total_value:,.0f} | " + f"P&L: [{pnl_style}]{self.pnl_pct:+.2f}%[/{pnl_style}]" + ) + + self.console.print(Panel(msg, border_style="green")) + + +# Global instance +_dashboard: Optional[TerminalDashboard] = None + + +def get_dashboard() -> TerminalDashboard: + """Get or create global dashboard instance""" + global _dashboard + if _dashboard is None: + _dashboard = TerminalDashboard() + return _dashboard diff --git a/backend/utils/trade_executor.py b/backend/utils/trade_executor.py new file mode 100644 index 0000000..50b1ee7 --- /dev/null +++ b/backend/utils/trade_executor.py @@ -0,0 +1,772 @@ +# -*- coding: utf-8 -*- +""" +Trading Execution Engine - Supports Two Modes +1. Signal mode: Only records directional signal decisions +2. Portfolio mode: Executes specific trades and tracks positions +""" +# flake8: noqa: E501 +from copy import deepcopy +from datetime import datetime +from typing import Any, Dict, List, Optional + + +class DirectionSignalRecorder: + """Direction signal recorder, records daily investment direction decisions""" + + def __init__(self): + """Initialize direction signal recorder""" + self.signal_log = [] # Record all directional signal history + + def record_direction_signals( + self, + decisions: Dict[str, Dict[str, Any]], + current_date: str = None, + ) -> Dict[str, Any]: + """ + Record Portfolio Manager's directional signal decisions + + Args: + decisions: PM's direction decisions {ticker: {action, confidence, reasoning}} + current_date: Current date (used for backtest compatibility) + + Returns: + Signal recording report + """ + if current_date is None: + current_date = datetime.now().strftime("%Y-%m-%d") + + # Use provided date for timestamp (backtest compatible) + timestamp = f"{current_date}T09:30:00" + + signal_report: Dict[str, Any] = { + "recorded_signals": {}, + "date": current_date, + "timestamp": timestamp, + "total_signals": len(decisions), + } + + print( + f"\n📊 Recording directional signal decisions for {current_date}...", + ) + + # Record directional signal for each ticker + for ticker, decision in decisions.items(): + action = decision.get("action", "hold") + confidence = decision.get("confidence", 0) + reasoning = decision.get("reasoning", "") + + # Record signal + signal_record = { + "ticker": ticker, + "action": action, + "confidence": confidence, + "reasoning": reasoning, + "date": current_date, + "timestamp": timestamp, + } + + self.signal_log.append(signal_record) + signal_report["recorded_signals"][ticker] = { + "action": action, + "confidence": confidence, + } + + # Display signal + action_emoji = {"long": "📈", "short": "📉", "hold": "➖"} + emoji = action_emoji.get(action, "❓") + print( + f" {emoji} {ticker}: {action.upper()} (Confidence: {confidence}%) - {reasoning}", + ) + + print(f"\n✅ Recorded directional signals for {len(decisions)} stocks") + + return signal_report + + def get_signal_summary(self) -> Dict[str, Any]: + """Get signal recording summary""" + return { + "total_signals": len(self.signal_log), + "signal_log": self.signal_log, + } + + +def parse_pm_decisions(pm_output: Dict[str, Any]) -> Dict[str, Dict[str, Any]]: + """ + Parse Portfolio Manager output format + + Args: + pm_output: PM's raw output + + Returns: + Standardized decision format + """ + if isinstance(pm_output, dict) and "decisions" in pm_output: + return pm_output["decisions"] + elif isinstance(pm_output, dict): + # If directly a decision dictionary + return pm_output + else: + print(f"Warning: Unable to parse PM output format: {type(pm_output)}") + return {} + + +class PortfolioTradeExecutor: + """Portfolio mode trade executor, executes specific trades and tracks positions""" + + portfolio: Dict[str, Any] + trade_history: List[Dict[str, Any]] + portfolio_history: List[Dict[str, Any]] + + def __init__(self, initial_portfolio: Optional[Dict[str, Any]] = None): + """ + Initialize Portfolio trade executor + + Args: + initial_portfolio: Initial portfolio state + """ + + if initial_portfolio is None: + self.portfolio = { + "cash": 100000.0, + "positions": {}, + # Default 0.0 (short selling disabled) + "margin_requirement": 0.0, + "margin_used": 0.0, + } + else: + self.portfolio = deepcopy(initial_portfolio) + + self.trade_history = [] # Trade history + self.portfolio_history = [] # Portfolio history + + def execute_trade( + self, + ticker: str, + action: str, + quantity: int, + price: float, + current_date: str = None, + ) -> Dict[str, Any]: + """ + Execute a single trade + + Args: + ticker: Stock ticker + action: Trade action (long/short/hold) + quantity: Number of shares + price: Current price + current_date: Trade date + + Returns: + Trade result dictionary + """ + if current_date is None: + current_date = datetime.now().strftime("%Y-%m-%d") + + if action == "hold" or quantity == 0: + return {"status": "success", "message": "No trade needed"} + + if price <= 0: + return {"status": "failed", "reason": "Invalid price"} + + result = self._execute_single_trade( + ticker=ticker, + action=action, + target_quantity=quantity, + price=price, + date=current_date, + ) + + return result + + def execute_trades( + self, + decisions: Dict[str, Dict[str, Any]], + current_prices: Dict[str, float], + current_date: str = None, + ) -> Dict[str, Any]: + """ + Execute trading decisions and update positions + + Args: + decisions: {ticker: {action, quantity, confidence, reasoning}} + current_prices: {ticker: current_price} + current_date: Current date (used for backtest compatibility) + + Returns: + Trade execution report + """ + if current_date is None: + current_date = datetime.now().strftime("%Y-%m-%d") + + # Use provided date for timestamp (backtest compatible) + timestamp = f"{current_date}T09:30:00" + + execution_report: Dict[str, Any] = { + "date": current_date, + "timestamp": timestamp, + "executed_trades": [], + "failed_trades": [], + "portfolio_before": deepcopy(self.portfolio), + "portfolio_after": None, + } + + print(f"\n💼 Executing Portfolio trades for {current_date}...") + + # Execute trades for each ticker + for ticker, decision in decisions.items(): + action = decision.get("action", "hold") + quantity = decision.get("quantity", 0) + + if action == "hold" or quantity == 0: + continue + + price = current_prices.get(ticker, 0) + if price <= 0: + execution_report["failed_trades"].append( + { + "ticker": ticker, + "action": action, + "quantity": quantity, + "reason": "No valid price data", + }, + ) + print( + f" ❌ {ticker}: Unable to execute {action} - No valid price", + ) + continue + + # Execute trade + trade_result = self._execute_single_trade( + ticker, + action, + quantity, + price, + current_date, + ) + if trade_result["status"] == "success": + execution_report["executed_trades"].append(trade_result) + + trades_info = ", ".join(trade_result.get("trades", [])) + print( + f" ✔ {ticker}: {action} Target {quantity} shares " + f"({trades_info}) @ ${price:.2f}", + ) + else: + execution_report["failed_trades"].append(trade_result) + print( + f" ✗ {ticker}: Unable to execute {action} - {trade_result['reason']}", + ) + + # Record final portfolio state + execution_report["portfolio_after"] = deepcopy(self.portfolio) + self.portfolio_history.append( + { + "date": current_date, + "portfolio": deepcopy(self.portfolio), + }, + ) + + # Calculate portfolio value + portfolio_value = self._calculate_portfolio_value(current_prices) + execution_report["portfolio_value"] = portfolio_value + + print("\n✔ Trade execution completed:") + print(f" Success: {len(execution_report['executed_trades'])} trades") + print(f" Failed: {len(execution_report['failed_trades'])} trades") + print(f" Portfolio value: ${portfolio_value:,.2f}") + print(f" Cash balance: ${self.portfolio['cash']:,.2f}") + + return execution_report + + def _execute_single_trade( + self, + ticker: str, + action: str, + target_quantity: int, + price: float, + date: str, + ) -> Dict[str, Any]: + """ + Execute single trade - Incremental mode + + Args: + ticker: Stock ticker + action: long(add position)/short(reduce position)/hold + target_quantity: Incremental quantity (long=buy shares, short=sell shares) + price: Current price + date: Trade date + """ + + # Ensure position exists + if ticker not in self.portfolio["positions"]: + self.portfolio["positions"][ticker] = { + "long": 0, + "short": 0, + "long_cost_basis": 0.0, + "short_cost_basis": 0.0, + } + + position = self.portfolio["positions"][ticker] + current_long = position["long"] + current_short = position["short"] + + trades_executed = [] # Record actually executed trade steps + + if action == "long": + result = self._execute_long_action( + ticker, + target_quantity, + price, + date, + current_long, + current_short, + trades_executed, + ) + if result["status"] == "failed": + return result + + elif action == "short": + result = self._execute_short_action( + ticker, + target_quantity, + price, + date, + current_long, + current_short, + trades_executed, + ) + if result["status"] == "failed": + return result + + elif action == "hold": + print(f"\n⏸️ {ticker} Position unchanged: {current_long} shares") + + # Record trade with backtest-compatible timestamp + trade_record = { + "status": "success", + "ticker": ticker, + "action": action, + "target_quantity": target_quantity, + "price": price, + "trades": trades_executed, + "date": date, + "timestamp": f"{date}T09:30:00", + } + + self.trade_history.append(trade_record) + + return trade_record + + def _execute_long_action( + self, + ticker: str, + target_quantity: int, + price: float, + date: str, + current_long: int, + current_short: int, + trades_executed: list, + ) -> Dict[str, Any]: + """Execute long action: Buy shares or cover shorts first""" + print( + f"\n📈 {ticker} Long operation: Current Long {current_long}, " + f"Short {current_short} → Target quantity {target_quantity}", + ) + + if target_quantity <= 0: + print(" ⏸️ Quantity is 0, no trade needed") + return {"status": "success"} + + remaining = target_quantity + + # If has short position, cover first + if current_short > 0: + cover_qty = min(remaining, current_short) + print(f" 1️⃣ Cover short: {cover_qty} shares") + cover_result = self._cover_short_position( + ticker, + cover_qty, + price, + date, + ) + if cover_result["status"] == "failed": + return cover_result + trades_executed.append(f"Cover {cover_qty} shares") + remaining -= cover_qty + + # If still has remaining quantity, buy long + if remaining > 0: + print(f" 2️⃣ Buy long: {remaining} shares") + buy_result = self._buy_long_position( + ticker, + remaining, + price, + date, + ) + if buy_result["status"] == "failed": + return buy_result + trades_executed.append(f"Buy {remaining} shares") + + # Display final result + final_long = self.portfolio["positions"][ticker]["long"] + final_short = self.portfolio["positions"][ticker]["short"] + print( + f" ✅ Final state: Long {final_long} shares, Short {final_short} shares", + ) + + return {"status": "success"} + + def _execute_short_action( + self, + ticker: str, + target_quantity: int, + price: float, + date: str, + current_long: int, + current_short: int, + trades_executed: list, + ) -> Dict[str, Any]: + """Execute short action: Sell long positions first, then short if needed""" + print( + f"\n📉 {ticker} Short operation (quantity={target_quantity} shares):", + ) + print( + f" Current state: Long {current_long} shares, Short {current_short} shares", + ) + + if target_quantity <= 0: + print(" ⏸️ Quantity is 0, no trade needed") + return {"status": "success"} + + remaining_quantity = target_quantity + + # Step 1: If there are long positions, sell first + if current_long > 0: + sell_quantity = min(remaining_quantity, current_long) + print(f" 1️⃣ Sell long: {sell_quantity} shares") + sell_result = self._sell_long_position( + ticker, + sell_quantity, + price, + date, + ) + if sell_result["status"] == "failed": + return sell_result + trades_executed.append(f"Sell {sell_quantity} shares") + remaining_quantity -= sell_quantity + + # Step 2: If there's remaining quantity, establish or increase short position + if remaining_quantity > 0: + print(f" 2️⃣ Short: {remaining_quantity} shares") + short_result = self._open_short_position( + ticker, + remaining_quantity, + price, + date, + ) + if short_result["status"] == "failed": + return short_result + trades_executed.append(f"Short {remaining_quantity} shares") + + # Display final result + final_long = self.portfolio["positions"][ticker]["long"] + final_short = self.portfolio["positions"][ticker]["short"] + print( + f" ✅ Final state: Long {final_long} shares, Short {final_short} shares", + ) + + return {"status": "success"} + + def _buy_long_position( + self, + ticker: str, + quantity: int, + price: float, + _date: str, + ) -> Dict[str, Any]: + """Buy long position""" + position = self.portfolio["positions"][ticker] + trade_value = quantity * price + + if self.portfolio["cash"] < trade_value: + return { + "status": "failed", + "ticker": ticker, + "action": "buy", + "quantity": quantity, + "price": price, + "reason": f"Insufficient cash (needed: ${trade_value:.2f}, available: " + f"${self.portfolio['cash']:.2f})", + } + + # Update position cost basis + old_long = position["long"] + old_cost_basis = position["long_cost_basis"] + new_long = old_long + quantity + + # 🐛 Debug info + print(f" 🔍 Buy {ticker}:") + print(f" Old position: {old_long} shares @ ${old_cost_basis:.2f}") + print(f" Buy: {quantity} shares @ ${price:.2f}") + print(f" New position: {new_long} shares") + + if new_long > 0: + new_cost_basis = ( + (old_long * old_cost_basis) + (quantity * price) + ) / new_long + print( + f" New cost: ${new_cost_basis:.2f} = " + f"(({old_long} × ${old_cost_basis:.2f}) + " + f"({quantity} × ${price:.2f})) / {new_long}", + ) + position["long_cost_basis"] = new_cost_basis + position["long"] = new_long + + # Deduct cash + self.portfolio["cash"] -= trade_value + + return {"status": "success"} + + def _sell_long_position( + self, + ticker: str, + quantity: int, + price: float, + _date: str, + ) -> Dict[str, Any]: + """Sell long position""" + position = self.portfolio["positions"][ticker] + + if position["long"] < quantity: + return { + "status": "failed", + "ticker": ticker, + "action": "sell", + "quantity": quantity, + "price": price, + "reason": f"Insufficient long position (holding: {position['long']}," + f" trying to sell: {quantity})", + } + + # Reduce position + position["long"] -= quantity + if position["long"] == 0: + position["long_cost_basis"] = 0.0 + + # Increase cash + trade_value = quantity * price + self.portfolio["cash"] += trade_value + + return {"status": "success"} + + def _open_short_position( + self, + ticker: str, + quantity: int, + price: float, + _date: str, + ) -> Dict[str, Any]: + """Open short position""" + position = self.portfolio["positions"][ticker] + trade_value = quantity * price + margin_needed = trade_value * self.portfolio["margin_requirement"] + + if self.portfolio["cash"] < margin_needed: + return { + "status": "failed", + "ticker": ticker, + "action": "short", + "quantity": quantity, + "price": price, + "reason": f"Insufficient margin (needed: ${margin_needed:.2f}, " + f"available: ${self.portfolio['cash']:.2f})", + } + + # Update position cost basis + old_short = position["short"] + old_cost_basis = position["short_cost_basis"] + new_short = old_short + quantity + if new_short > 0: + position["short_cost_basis"] = ( + (old_short * old_cost_basis) + (quantity * price) + ) / new_short + position["short"] = new_short + + # Increase cash (short sale proceeds) and margin used + self.portfolio["cash"] += trade_value - margin_needed + self.portfolio["margin_used"] += margin_needed + + return {"status": "success"} + + def _cover_short_position( + self, + ticker: str, + quantity: int, + price: float, + _date: str, + ) -> Dict[str, Any]: + """Cover short position""" + position = self.portfolio["positions"][ticker] + + if position["short"] < quantity: + return { + "status": "failed", + "ticker": ticker, + "action": "cover", + "quantity": quantity, + "price": price, + "reason": f"Insufficient short position (holding: {position['short']}, " + f"trying to cover: {quantity})", + } + + # Calculate released margin - 🔧 FIX: Use cost_basis instead of current price + trade_value = quantity * price + cost_basis = position["short_cost_basis"] + margin_released = ( + quantity * cost_basis * self.portfolio["margin_requirement"] + ) + + # Reduce position + position["short"] -= quantity + if position["short"] == 0: + position["short_cost_basis"] = 0.0 + + # Deduct cash (buy to cover) and release margin + self.portfolio["cash"] -= trade_value + self.portfolio["cash"] += margin_released + self.portfolio["margin_used"] -= margin_released + + return {"status": "success"} + + def _calculate_portfolio_value( + self, + current_prices: Dict[str, float], + ) -> float: + """Calculate total portfolio value (net liquidation value)""" + # Add margin_used back because it's frozen cash, not lost money + total_value = self.portfolio["cash"] + self.portfolio["margin_used"] + + for ticker, position in self.portfolio["positions"].items(): + if ticker in current_prices: + price = current_prices[ticker] + # Add long position value + total_value += position["long"] * price + # Subtract short position value (liability) + total_value -= position["short"] * price + + return total_value + + def get_portfolio_summary( + self, + current_prices: Dict[str, float], + ) -> Dict[str, Any]: + """Get portfolio summary""" + portfolio_value = self._calculate_portfolio_value(current_prices) + + positions_summary = [] + for ticker, position in self.portfolio["positions"].items(): + if position["long"] > 0 or position["short"] > 0: + price = current_prices.get(ticker, 0) + long_value = position["long"] * price + short_value = position["short"] * price + + positions_summary.append( + { + "ticker": ticker, + "long_shares": position["long"], + "short_shares": position["short"], + "long_value": long_value, + "short_value": short_value, + "long_cost_basis": position["long_cost_basis"], + "short_cost_basis": position["short_cost_basis"], + "long_pnl": ( + long_value + - (position["long"] * position["long_cost_basis"]) + if position["long"] > 0 + else 0 + ), + "short_pnl": ( + (position["short"] * position["short_cost_basis"]) + - short_value + if position["short"] > 0 + else 0 + ), + }, + ) + + return { + "portfolio_value": portfolio_value, + "cash": self.portfolio["cash"], + "margin_used": self.portfolio["margin_used"], + "positions": positions_summary, + "total_trades": len(self.trade_history), + } + + +def execute_trading_decisions( + pm_decisions: Dict[str, Any], + current_date: str = None, +) -> Dict[str, Any]: + """ + Convenience function to record directional signal decisions (Signal mode) + + Args: + pm_decisions: PM's direction decisions + current_date: Current date (optional) + + Returns: + Signal recording report + """ + # Parse PM decisions + decisions = parse_pm_decisions(pm_decisions) + + # Create direction signal recorder + recorder = DirectionSignalRecorder() + + # Record directional signals + signal_report = recorder.record_direction_signals(decisions, current_date) + + return signal_report + + +def execute_portfolio_trades( + pm_decisions: Dict[str, Any], + current_prices: Dict[str, float], + portfolio: Dict[str, Any], + current_date: str = None, +) -> Dict[str, Any]: + """ + Execute Portfolio mode trading decisions + + Args: + pm_decisions: PM's trading decisions + current_prices: Current prices + portfolio: Current portfolio state + current_date: Current date (optional) + + Returns: + Trade execution report and updated portfolio + """ + # Parse PM decisions + decisions = parse_pm_decisions(pm_decisions) + + # Create Portfolio trade executor + executor = PortfolioTradeExecutor(initial_portfolio=portfolio) + + # Execute trades + execution_report = executor.execute_trades( + decisions, + current_prices, + current_date, + ) + + # Add portfolio summary + execution_report["portfolio_summary"] = executor.get_portfolio_summary( + current_prices, + ) + + # Return updated portfolio + execution_report["updated_portfolio"] = executor.portfolio + + return execution_report diff --git a/backtest/state/server_state.json b/backtest/state/server_state.json new file mode 100644 index 0000000..ef824cb --- /dev/null +++ b/backtest/state/server_state.json @@ -0,0 +1,2631 @@ +{ + "status": "running", + "current_date": "2025-11-10", + "portfolio": { + "total_value": 98434.93, + "cash": 100000.0, + "pnl_percent": -1.57, + "equity": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + }, + { + "t": 1762243200000, + "v": 99590.68 + }, + { + "t": 1762329600000, + "v": 99298.78 + }, + { + "t": 1762416000000, + "v": 98425.78 + }, + { + "t": 1762502400000, + "v": 98434.93 + } + ], + "baseline": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + }, + { + "t": 1762243200000, + "v": 97620.18 + }, + { + "t": 1762329600000, + "v": 98327.37 + }, + { + "t": 1762416000000, + "v": 96286.86 + }, + { + "t": 1762502400000, + "v": 95539.06 + } + ], + "baseline_vw": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + }, + { + "t": 1762243200000, + "v": 97721.94 + }, + { + "t": 1762329600000, + "v": 98028.19 + }, + { + "t": 1762416000000, + "v": 96206.83 + }, + { + "t": 1762502400000, + "v": 95565.33 + } + ], + "momentum": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + }, + { + "t": 1762243200000, + "v": 99054.53 + }, + { + "t": 1762329600000, + "v": 99406.81 + }, + { + "t": 1762416000000, + "v": 98768.07 + }, + { + "t": 1762502400000, + "v": 97890.54 + } + ], + "strategies": [], + "equity_return": [], + "baseline_return": [], + "baseline_vw_return": [], + "momentum_return": [] + }, + "holdings": [ + { + "ticker": "MSFT", + "quantity": 60, + "avg": 0, + "currentPrice": 496.82, + "marketValue": 29809.2, + "weight": 0.3081669004773045 + }, + { + "ticker": "GOOGL", + "quantity": 50, + "avg": 0, + "currentPrice": 278.83, + "marketValue": 13941.5, + "weight": 0.14412694211868618 + }, + { + "ticker": "META", + "quantity": 20, + "avg": 0, + "currentPrice": 621.71, + "marketValue": 12434.2, + "weight": 0.12854450551893037 + }, + { + "ticker": "AMZN", + "quantity": 40, + "avg": 0, + "currentPrice": 244.41, + "marketValue": 9776.4, + "weight": 0.10106822342854956 + }, + { + "ticker": "NVDA", + "quantity": 20, + "avg": 0, + "currentPrice": 188.15, + "marketValue": 3763.0, + "weight": 0.038901817106668304 + }, + { + "ticker": "TSLA", + "quantity": -15, + "avg": 0, + "currentPrice": 429.52, + "marketValue": -6442.799999999999, + "weight": -0.0666055347475 + }, + { + "ticker": "AAPL", + "quantity": 30, + "avg": 0, + "currentPrice": 268.47, + "marketValue": 8054.1, + "weight": 0.08326312122211459 + }, + { + "ticker": "CASH", + "quantity": 1, + "avg": 25395.10000000001, + "currentPrice": 25395.10000000001, + "marketValue": 25395.10000000001, + "weight": 0.2625340248752465 + } + ], + "trades": [ + { + "ticker": "AMZN", + "action": "long", + "quantity": 25, + "price": 242.9 + }, + { + "ticker": "TSLA", + "action": "short", + "quantity": -5, + "price": 437.92 + }, + { + "ticker": "AAPL", + "action": "long", + "quantity": 30, + "price": 267.89 + }, + { + "ticker": "MSFT", + "action": "long", + "quantity": 20, + "price": 513.3 + }, + { + "ticker": "GOOGL", + "action": "long", + "quantity": 15, + "price": 278.87 + }, + { + "ticker": "META", + "action": "long", + "quantity": 10, + "price": 632.31 + }, + { + "ticker": "MSFT", + "action": "long", + "quantity": 25, + "price": 511.76 + }, + { + "ticker": "GOOGL", + "action": "long", + "quantity": 15, + "price": 276.75 + }, + { + "ticker": "NVDA", + "action": "long", + "quantity": 20, + "price": 203.0 + }, + { + "ticker": "TSLA", + "action": "short", + "quantity": 15, + "price": 454.46 + }, + { + "ticker": "MSFT", + "action": "long", + "quantity": 15, + "price": 519.805 + }, + { + "ticker": "GOOGL", + "action": "long", + "quantity": 20, + "price": 282.175 + }, + { + "ticker": "META", + "action": "long", + "quantity": 10, + "price": 656.0 + }, + { + "ticker": "AMZN", + "action": "long", + "quantity": 15, + "price": 255.36 + } + ], + "stats": { + "totalAssetValue": 96730.7, + "totalReturn": -3.27, + "cashPosition": 25395.1, + "tickerWeights": { + "MSFT": 0.3081669004773045, + "GOOGL": 0.14412694211868618, + "META": 0.12854450551893037, + "AMZN": 0.10106822342854956, + "NVDA": 0.038901817106668304, + "TSLA": -0.0666055347475, + "AAPL": 0.08326312122211459 + }, + "marginUsed": 1704.22 + }, + "leaderboard": [ + { + "agentId": "portfolio_manager", + "name": "Portfolio Manager", + "role": "Portfolio Manager", + "avatar": "pm", + "rank": null, + "winRate": 0.6429, + "bull": { + "n": 12, + "win": 7, + "unknown": 0 + }, + "bear": { + "n": 2, + "win": 2, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-04", + "is_correct": null + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-04", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-04", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "GOOGL", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "MSFT", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "GOOGL", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "risk_manager", + "name": "Risk Manager", + "role": "Risk Manager", + "avatar": "risk", + "rank": null, + "winRate": null, + "bull": { + "n": 0, + "win": 0, + "unknown": 0 + }, + "bear": { + "n": 0, + "win": 0, + "unknown": 0 + }, + "logs": [], + "signals": [], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "sentiment_analyst", + "name": "Sentiment Analyst", + "role": "Sentiment Analyst", + "avatar": "sentiment", + "rank": 3, + "winRate": 0.4571, + "bull": { + "n": 33, + "win": 14, + "unknown": 0 + }, + "bear": { + "n": 2, + "win": 2, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "technical_analyst", + "name": "Technical Analyst", + "role": "Technical Analyst", + "avatar": "technical", + "rank": 4, + "winRate": 0.3226, + "bull": { + "n": 26, + "win": 8, + "unknown": 0 + }, + "bear": { + "n": 5, + "win": 2, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "fundamentals_analyst", + "name": "Fundamentals Analyst", + "role": "Fundamentals Analyst", + "avatar": "fundamentals", + "rank": 2, + "winRate": 0.4706, + "bull": { + "n": 30, + "win": 13, + "unknown": 0 + }, + "bear": { + "n": 4, + "win": 3, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "valuation_analyst", + "name": "Valuation Analyst", + "role": "Valuation Analyst", + "avatar": "valuation", + "rank": 1, + "winRate": 0.6129, + "bull": { + "n": 0, + "win": 0, + "unknown": 0 + }, + "bear": { + "n": 31, + "win": 19, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + } + ], + "realtime_prices": {}, + "system_started": "2026-03-12T18:47:12.828368", + "feed_history": [ + { + "type": "day_start", + "date": "2025-11-10", + "progress": 0.0, + "timestamp": "2025-11-10" + }, + { + "type": "day_complete", + "date": "2025-11-07", + "progress": 0.0, + "timestamp": "2025-11-07" + }, + { + "type": "team_summary", + "balance": 98434.93, + "pnlPct": -1.57, + "equity": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + }, + { + "t": 1762243200000, + "v": 99590.68 + }, + { + "t": 1762329600000, + "v": 99298.78 + }, + { + "t": 1762416000000, + "v": 98425.78 + }, + { + "t": 1762502400000, + "v": 98434.93 + } + ], + "baseline": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + }, + { + "t": 1762243200000, + "v": 97620.18 + }, + { + "t": 1762329600000, + "v": 98327.37 + }, + { + "t": 1762416000000, + "v": 96286.86 + }, + { + "t": 1762502400000, + "v": 95539.06 + } + ], + "baseline_vw": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + }, + { + "t": 1762243200000, + "v": 97721.94 + }, + { + "t": 1762329600000, + "v": 98028.19 + }, + { + "t": 1762416000000, + "v": 96206.83 + }, + { + "t": 1762502400000, + "v": 95565.33 + } + ], + "momentum": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + }, + { + "t": 1762243200000, + "v": 99054.53 + }, + { + "t": 1762329600000, + "v": 99406.81 + }, + { + "t": 1762416000000, + "v": 98768.07 + }, + { + "t": 1762502400000, + "v": 97890.54 + } + ], + "timestamp": "2025-11-07" + }, + { + "type": "agent_message", + "agentId": "Daily Log", + "content": "Daily log for 2025-11-07:\nTotal P&L: $-4.25\n\nConference Discussion Summary:\n## 讨论总结:2025年11月7日\n\n### **核心矛盾与关键洞察**\n\n#### 1. **主要信号冲突**\n- **估值分析 vs 情绪分析严重对立**\n - 估值分析师:所有股票大幅高估50%+,建议卖出\n - 情绪分析师:内部人集体大量买入,无卖出,强烈看涨\n - 这是投资决策的最大难题:价值纪律 vs 逆向信号\n\n#### 2. **内部人信号的异常性**\n- **所有7家公司内部人一致买入**,规模巨大\n- TSLA:5.31亿股买入(异常巨大)\n- GOOGL/NVDA/META/AMZN:千万股级别买入\n- 历史经验:内部人与市场情绪反向时,内部人通常正确\n\n#### 3. **基本面分析的支持**\n- MSFT、AMZN、GOOGL基本面最强\n- TSLA基本面最弱,但内部人疯狂买入\n- NVDA基本面强劲但估值担忧\n\n### **关键风险焦点**\n\n#### 1. **投资组合结构风险(最紧迫)**\n- **行业过度集中**:100%科技股,系统性风险极高\n- **MSFT仓位过重**:27.7%占比,远超15%建议上限\n- **前两大持仓占45.7%**,缺乏分散性\n\n#### 2. **具体股票困境**\n- **MSFT**:基本面最佳但持仓过重且浮亏11%\n- **TSLA空头**:基本面差但内部人买入,空头浮亏$247\n- **多个亏损持仓**:MSFT、NVDA、META均浮亏\n\n#### 3. **现金约束**\n- 仅$31,467现金(29%组合),难以实现有效行业分散\n- 必须卖出部分科技股才能配置其他行业\n\n### **共识点与决策框架**\n\n#### 一致认同:\n1. **必须降低行业集中度** - 这是不可协商的风险管理要求\n2. **必须减少MSFT仓位** - 27.7%占比风险过高\n3. **内部人信号值得重视** - 但需与估值警告平衡\n\n#### 决策优先级排序:\n1. **第一优先**:降低系统性风险(行业集中、个股过重)\n2. **第二优先**:处理矛盾最大的持仓(TSLA空头、高估警告股票)\n3. **第三优先**:基于交叉验证信号调整(基本面+情绪一致)\n\n### **临界决策因素**\n\n#### 需要权衡的冲突:\n1. **价值vs增长**:估值安全边际vs未来增长前景\n2. **风险管理vs机会捕捉**:降低风险vs捕捉潜在反弹\n3. **短期vs长期**:当前调整vs长期持有优质公司\n\n#### 关键不确定因素:\n1. **内部人买入的性质**:是期权行权还是主动现金买入?\n2. **估值模型的假设**:是否过于保守,低估了AI增长潜力?\n3. **市场时机**:现在是科技股调整的开始还是结束?\n\n### **最终决策指导原则**\n\n基于讨论,最终决策应:\n1. **强制降低科技股占比**至更安全水平\n2. **优先处理MSFT仓位过重问题**\n3. **审慎对待TSLA空头**,考虑减少规模\n4. **偏好基本面+情绪交叉验证的股票**(AMZN、GOOGL)\n5. **保持适度现金**应对不确定性\n6. **考虑分批调整**而非一次性大幅变动\n\n**核心困境简化**:在\"避免高估陷阱\"和\"不卖出内部人正在买入的股票\"之间找到平衡点,同时紧急解决投资组合的结构性风险。\n\nBaseline Comparison:\n Equal Weight: $95,539.06 (-4.46%)\n Market Cap Weighted: $95,565.33 (-4.43%)\n Momentum: $97,890.54 (-2.11%)\n\nTrade Results:\n AMZN: LONG 25 @ $242.90 -> $244.41, P&L: +$37.75 (+0.6%)\n TSLA: SHORT -5 @ $437.92 -> $429.52, P&L: $-42.00 (0.0%)", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "agent_message", + "agentId": "portfolio_manager", + "content": "## 投资逻辑总结\n\n基于所有分析师信号、风险评估和讨论总结,我做出了以下平衡决策:\n\n### **核心投资哲学应用:**\n\n1. **风险管理优先**:虽然内部人信号强烈,但必须优先解决投资组合的结构性风险。然而,由于现金约束和当前市场矛盾,我采取了更渐进的方法。\n\n2. **矛盾信号平衡**:在估值警告(普遍高估)与内部人买入信号之间找到平衡点:\n - **信任交叉验证**:选择基本面+情绪双重看涨的股票(AMZN)\n - **谨慎对待极端信号**:对估值极端高估的股票保持观望或减少风险(TSLA空头减仓)\n\n3. **渐进调整策略**:由于现金有限且市场信号矛盾,采取保守调整而非激进重构。\n\n### **具体决策逻辑:**\n\n1. **AMZN增持(25股)**:\n - 基本面分析师:最佳估值(85%置信度)\n - 情绪分析师:强烈看涨(85%置信度,内部人买入4270万股)\n - 估值分析师:数据不足,相对风险较低\n - 这是最一致的看涨信号\n\n2. **TSLA空头减仓(减少5股)**:\n - 基本面最差,估值最荒谬(92.8%高估)\n - 但内部人异常买入信号(5.31亿股)值得警惕\n - 风险管理:减少空头规模,降低挤压风险\n\n3. **其他股票保持观望**:\n - MSFT:基本面最强但仓位过重且估值高估,暂不调整\n - GOOGL/NVDA/META/AAPL:信号矛盾,等待更明确方向\n\n### **现金使用与风险控制:**\n\n- 使用$6,072.50增持AMZN\n- 减少TSLA空头释放部分保证金\n- 保留约$25,000+现金应对不确定性\n- 维持适度现金缓冲(约23%组合价值)\n\n### **承认局限性:**\n\n1. **未能完全解决行业集中风险**:100%科技股问题依然存在\n2. **MSFT仓位过重未调整**:27.7%占比仍超标\n3. **保守决策可能错失机会**:内部人信号可能预示市场转折\n\n### **后续行动计划:**\n\n1. **监控内部人行为变化**:如果内部人开始卖出,需重新评估\n2. **逐步减持MSFT**:在未来1-2周内寻找机会减少MSFT仓位\n3. **寻找非科技板块机会**:使用释放资金增加行业分散\n4. **设置严格止损**:特别针对TSLA空头和其他亏损持仓\n\n**最终评估**:在当前矛盾的市场信号下,采取保守渐进策略是最审慎的选择。优先信任交叉验证信号(AMZN),减少极端风险(TSLA),同时对其他股票保持观望,等待更清晰的趋势信号。", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_end", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "conference summary", + "content": "## 讨论总结:2025年11月7日\n\n### **核心矛盾与关键洞察**\n\n#### 1. **主要信号冲突**\n- **估值分析 vs 情绪分析严重对立**\n - 估值分析师:所有股票大幅高估50%+,建议卖出\n - 情绪分析师:内部人集体大量买入,无卖出,强烈看涨\n - 这是投资决策的最大难题:价值纪律 vs 逆向信号\n\n#### 2. **内部人信号的异常性**\n- **所有7家公司内部人一致买入**,规模巨大\n- TSLA:5.31亿股买入(异常巨大)\n- GOOGL/NVDA/META/AMZN:千万股级别买入\n- 历史经验:内部人与市场情绪反向时,内部人通常正确\n\n#### 3. **基本面分析的支持**\n- MSFT、AMZN、GOOGL基本面最强\n- TSLA基本面最弱,但内部人疯狂买入\n- NVDA基本面强劲但估值担忧\n\n### **关键风险焦点**\n\n#### 1. **投资组合结构风险(最紧迫)**\n- **行业过度集中**:100%科技股,系统性风险极高\n- **MSFT仓位过重**:27.7%占比,远超15%建议上限\n- **前两大持仓占45.7%**,缺乏分散性\n\n#### 2. **具体股票困境**\n- **MSFT**:基本面最佳但持仓过重且浮亏11%\n- **TSLA空头**:基本面差但内部人买入,空头浮亏$247\n- **多个亏损持仓**:MSFT、NVDA、META均浮亏\n\n#### 3. **现金约束**\n- 仅$31,467现金(29%组合),难以实现有效行业分散\n- 必须卖出部分科技股才能配置其他行业\n\n### **共识点与决策框架**\n\n#### 一致认同:\n1. **必须降低行业集中度** - 这是不可协商的风险管理要求\n2. **必须减少MSFT仓位** - 27.7%占比风险过高\n3. **内部人信号值得重视** - 但需与估值警告平衡\n\n#### 决策优先级排序:\n1. **第一优先**:降低系统性风险(行业集中、个股过重)\n2. **第二优先**:处理矛盾最大的持仓(TSLA空头、高估警告股票)\n3. **第三优先**:基于交叉验证信号调整(基本面+情绪一致)\n\n### **临界决策因素**\n\n#### 需要权衡的冲突:\n1. **价值vs增长**:估值安全边际vs未来增长前景\n2. **风险管理vs机会捕捉**:降低风险vs捕捉潜在反弹\n3. **短期vs长期**:当前调整vs长期持有优质公司\n\n#### 关键不确定因素:\n1. **内部人买入的性质**:是期权行权还是主动现金买入?\n2. **估值模型的假设**:是否过于保守,低估了AI增长潜力?\n3. **市场时机**:现在是科技股调整的开始还是结束?\n\n### **最终决策指导原则**\n\n基于讨论,最终决策应:\n1. **强制降低科技股占比**至更安全水平\n2. **优先处理MSFT仓位过重问题**\n3. **审慎对待TSLA空头**,考虑减少规模\n4. **偏好基本面+情绪交叉验证的股票**(AMZN、GOOGL)\n5. **保持适度现金**应对不确定性\n6. **考虑分批调整**而非一次性大幅变动\n\n**核心困境简化**:在\"避免高估陷阱\"和\"不卖出内部人正在买入的股票\"之间找到平衡点,同时紧急解决投资组合的结构性风险。", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## My Professional Valuation Perspective: The Great Tech Valuation Debate\n\n### **The Heart of the Disagreement**\n\nWe're witnessing a fundamental clash between two investment philosophies:\n1. **Growth-at-any-price momentum investing** (market consensus)\n2. **Value-based discipline** (my analytical framework)\n\nThe debate centers on whether traditional valuation metrics have become obsolete in the face of technological transformation.\n\n### **What the Bulls Are Missing (In My Professional View)**\n\n**1. The Mathematics of Compounding**\nLet's address the most common bullish argument: \"These companies will grow into their valuations.\"\n- NVDA at $4.5T market cap needs to generate **$400B+ in annual FCF** to justify current valuation\n- That's equivalent to **Apple + Microsoft's current combined FCF**\n- The implied growth rates exceed anything in economic history\n\n**2. The Survivorship Bias Problem**\nInvestors are looking at the handful of winners (AAPL, MSFT, etc.) and assuming this exceptionalism will continue indefinitely. But:\n- Every previous tech leader (IBM, Cisco, Intel) eventually faced growth plateaus\n- Mean reversion in tech is brutal when it arrives\n- Market leadership changes faster in tech than any other sector\n\n**3. The \"AI Will Save Everything\" Fallacy**\nAI is transformative, but:\n- **Economic value ≠ Company value**: The AI revolution will create trillions in economic value, but that doesn't mean it all accrues to current incumbents\n- **Competition is intensifying**: Every tech company is investing billions in AI, compressing potential returns\n- **Commoditization risk**: History shows that transformative technologies often get commoditized (see: internet, mobile)\n\n### **Addressing Specific Concerns Raised by Others:**\n\n**\"But these companies have unprecedented competitive moats!\"**\n- True, but moats have maintenance costs (R&D, capex)\n- Regulatory scrutiny is increasing (EU Digital Markets Act, US antitrust)\n- Network effects can reverse (see: MySpace, Yahoo)\n\n**\"Free cash flow is growing rapidly!\"**\n- Yes, but not at the 30-40% annual rates required to justify valuations\n- Much of the recent FCF growth came from cost-cutting, not revenue acceleration\n- Peak margins are often followed by mean reversion\n\n**\"Discount rates should be lower for these quality companies!\"**\n- This is the most dangerous argument\n- Even with a 7% discount rate (vs historical 9-10%), valuations remain stretched\n- Quality doesn't justify infinite price premiums\n\n### **The Behavioral Finance Perspective**\n\nWhat I'm seeing is classic bubble psychology:\n1. **Social proof**: \"Everyone's buying tech\"\n2. **Narrative dominance**: Complex AI stories replace simple valuation math\n3. **Recency bias**: 15-year bull market conditions perceived as permanent\n4. **Confirmation bias**: Investors seek information confirming bullish views\n\n### **Historical Parallels That Concern Me:**\n\n**1999-2000**: \"Internet will change everything\" (true) → \"Valuations don't matter\" (false)\n**2007**: \"Housing prices never decline nationally\" (false)\n**2021**: \"Interest rates will stay near zero forever\" (false)\n\nEach time, a fundamentally true premise (internet transformation, housing importance, low rates) was extrapolated to justify unsustainable valuations.\n\n### **Where I Could Be Wrong (Intellectual Honesty):**\n\n1. **AI monetization could be faster/bigger than I expect**\n2. **These companies could create entirely new business models** beyond current imagination\n3. **Global capital flows** could keep pushing valuations higher indefinitely\n4. **Productivity gains from AI** could justify higher multiples\n\n### **The Professional Valuation Analyst's Dilemma:**\n\nI face the classic value investor's challenge: being too early. Markets can remain irrational longer than I can remain solvent. However, my responsibility isn't to predict short-term price movements but to assess **fundamental value**.\n\n### **What Would Make Me Change My Mind:**\n\n1. **Evidence of sustainable 30%+ FCF growth** across the sector\n2. **Demonstrated pricing power** that defies economic cycles\n3. **Successful monetization of AI investments** at 50%+ ROI\n4. **Competition failing to materialize** despite massive investments\n\n### **My Professional Conclusion:**\n\n**These are phenomenal companies with terrible stock prices.**\n\nThe distinction is crucial. I'd love to own these businesses at fair prices. But current valuations imply:\n- Perfection in execution\n- No meaningful competition\n- Indefinite high growth\n- Minimal regulatory interference\n- Permanent low interest rates\n\nThis combination of optimistic assumptions leaves **zero margin of safety**—the single most important concept in investing.\n\n### **The Opportunity Cost Argument**\n\nThe most concerning aspect isn't just that these stocks might decline—it's what investors are **missing** by having capital tied up here:\n- True value opportunities in other sectors\n- Lower-risk assets with similar return potential\n- The optionality of cash when corrections occur\n\n### **Final Professional Judgment:**\n\nAs a valuation analyst, my job is to separate signal from noise. The signal says:\n- Businesses: Excellent\n- Management: Capable\n- Industries: Growing\n- **Stock Prices: Unjustifiably High**\n\nThe weight of evidence across multiple valuation methodologies consistently points to significant overvaluation. While timing market tops is impossible, protecting capital from permanent loss is paramount.\n\n**Investment wisdom isn't about being right when everyone agrees—it's about maintaining discipline when everyone disagrees.** Today's tech valuations test that discipline more than any market environment I've analyzed in my career.", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## 情绪分析师的深度视角:科技股情绪分化的本质\n\n### 当前市场情绪的解剖\n\n我们正目睹一场典型的**认知失调**(cognitive dissonance)在市场中上演。外部新闻描绘了一幅\"科技寒冬\"的景象,而内部人行为却显示\"价值机遇\"。这种分歧揭示了一个更深层的真相:**市场参与者的情绪周期与基本面变化周期存在时滞**。\n\n### 对七大科技巨头的情绪心理学解读\n\n#### **AAPL:\"被低估的生态系统权威\"**\n市场担心增长放缓,但情绪分析师看到的是:\n- **消费者忠诚度**转化为**定价权**的情绪惯性\n- **服务业务粘性**创造的**经常性收入护城河**\n- 内部人知道:苹果用户不会因为三星信用卡而离开生态\n- **情绪洞察**:市场低估了苹果在金融服务转型中的\"慢而稳\"优势\n\n#### **MSFT:\"企业数字化不可逆趋势\"**\n\"AI泡沫\"叙事忽略了:\n- **企业软件更换周期**的情绪惰性:一旦企业采用Microsoft 365,更换成本极高\n- **云业务增长**的**结构性确定性**(非周期性)\n- 内部人买入表明:Azure的AI能力正在转化为实际合同,不只是PPT演示\n- **核心情绪误判**:市场将AI视为\"投机主题\",内部人视为\"确定性的生产力革命\"\n\n#### **GOOGL:\"搜索广告的情绪惯性\"**\n市场担心AI对搜索的颠覆,但:\n- **消费者搜索习惯**的情绪记忆难以改变\n- **YouTube的视觉广告**溢价被低估(情感>逻辑的购买决策)\n- 内部人2050万股买入揭示:他们看到广告复苏不是\"反弹\",而是\"结构性改善\"\n- **情绪真相**:当经济担忧时,广告预算首先流向效果可测量的渠道(谷歌)\n\n#### **NVDA:\"AI军火商的心理优势\"**\n\"AI泡沫\"讨论完全错位:\n- NVIDIA处于**供应链的心理权力位置**:AI竞赛中,所有人都是租客,NVDA是房东\n- 内部人2160万股买入表明:他们看到订单簿,不是媒体文章\n- **情绪框架**:市场聚焦于\"谁会赢AI竞赛\",而忽略\"所有人都需要NVDA芯片\"\n- **赌场老板心理**:不赌哪家AI公司赢,只提供赌桌\n\n#### **TSLA:\"争议溢价\"的价值误判**\nElon Musk的争议掩盖了:\n- **电动汽车采用曲线**的**社会传染效应**(情绪传染>理性分析)\n- **品牌情感连接**的长期价值:特斯拉不仅是车,是身份象征\n- 5.31亿股内部买入表明:争议创造了买入窗口,而非风险\n- **情绪悖论**:最具争议的公司往往产生最大回报(注意力=货币化机会)\n\n#### **META:\"广告商的心理安全\"**\n担忧估值时,市场忽略了:\n- **社交媒体使用习惯**的**情绪依赖性**(习惯>理性选择)\n- **广告定向技术**创造的心理优势:品牌寻求确定性,而非廉价流量\n- 4060万股买入显示:内部人看到广告主从实验预算转向核心预算\n- **情绪护城河**:当经济担忧时,品牌反而增加在有效渠道的支出\n\n#### **AMZN:\"便利性成瘾\"的持久力**\n市场担心利润率,但:\n- **消费者便利性成瘾**是强情绪驱动\n- **AWS的B2B粘性**:企业云迁移是\"一次痛苦,终身依赖\"\n- 4270万股买入表明:内部人看到Prime会员的心理锁定价值\n- **情绪经济学**:便利性不是成本,是消费者愿意支付的\"心理租金\"\n\n### 投资哲学的关键演化\n\n这次分析验证了我最核心的信念:**市场情绪测量不是关于预测未来,而是识别当下的情绪与现实的偏离程度**。\n\n**心理学原理的确认:**\n1. **信息不对称的心理后果**:内部人有私人信息,外部人有公共信息\n2. **群体恐慌的自我强化**:负面新闻制造更多负面情绪,引发更多负面新闻\n3. **内部人作为理性边缘**:当群体非理性时,边缘理性者获得超额回报\n\n### 对市场担忧的深层回应\n\n**\"估值太高\"焦虑的本质**:\n这实际上是**恐惧错过回调机会**的伪装。当价格下跌时,投资者首先感到\"庆幸自己躲过了\",然后感到\"恐惧会进一步下跌\",最后感到\"后悔错过了机会\"。内部人正在第三阶段前行动。\n\n**\"AI泡沫\"叙事的情绪根源**:\n这是**创新采纳周期的典型情绪反应**:\n- 过度兴奋 → 幻灭期 → 启蒙期 → 生产力期\n- 媒体关注第一阶段向第二阶段的过渡\n- 内部人关注第二阶段向第三阶段的过渡\n\n### 逆向思维的心理优势\n\n当前市场的心理状态反映了:\n1. **锚定偏见**:投资者锚定在高价格,任何下跌都感觉\"危险\"\n2. **损失厌恶**:对潜在损失的恐惧超过潜在收益的喜悦\n3. **确认偏差**:寻找支持\"科技股完蛋了\"的证据\n4. **从众心理**:当所有人都在卖出时,卖出感觉\"安全\"\n\n内部人行为挑战所有这些偏见。\n\n### 最终情绪分析框架\n\n**情绪周期定位**:\n- 媒体阶段:恐慌传播期\n- 散户阶段:恐惧主导期 \n- 内部人阶段:价值积累期\n- 聪明钱阶段:早期布局期\n- 公众阶段:FOMO追涨期\n\n我们目前处于**内部人向聪明钱过渡**的阶段。\n\n**核心建议**:\n不要问\"价格会跌到多少\",而是问\"在这个价格下,内部人为什么大量买入\"。当情绪与行为如此分歧时,行为往往是更好的指引。\n\n**情绪分析师的终极观察**:市场最大的机会出现在**认知与现实的巨大偏差**时刻。当前内部人的集体行为与媒体的集体恐惧,创造了这样的偏差。历史表明,这种时刻通常不是风险点,而是机遇点。", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## A Technical Analyst's Unfiltered Perspective\n\nLet me cut through the noise with what truly matters from a price action standpoint:\n\n### The Market is Telling Us Something Different\n\n**AAPL:** The charts don't care about \"services growth\" or \"iPhone cycles\"—they care about **$180 as critical support**. We've seen distribution patterns since the $200 peak. The concern isn't innovation; it's that institutions are rotating out of what's become a quasi-bond proxy. When rates rise, the \"safe haven\" tech trade unwinds first.\n\n**NVDA:** Forget the AI narrative—look at the volume profile. The parabolic move from $400 to $800 was on decreasing volume. That's distribution, not accumulation. The smart money has been selling into strength for months. The \"AI infrastructure\" story is real, but the stock price already reflects 5 years of perfect execution.\n\n**TSLA:** This is a **momentum trader's dream and a fundamental investor's nightmare**. The chart shows wild swings between $180 and $300—that's not a stock, that's a casino chip. The \"autonomy optionality\" is priced like a lottery ticket. Technicals suggest we're in a broad $200-300 range until either FSD gets regulatory approval or EV margins collapse further.\n\n### What the Technicals Reveal About Group Dynamics:\n\n**The Cloud Trio (MSFT, AMZN, GOOGL):**\nThese stocks move together like a synchronized swim team. When one breaks support/resistance, the others follow within days. Currently, they're all testing 50-day MAs—the line in the sand between continuation and correction. The concern isn't fundamentals; it's that their correlation approaches 0.9 in down markets. When selling comes, it comes to all three simultaneously.\n\n**The Divergence That Matters:**\nLook at relative strength:\n- MSFT leading (holding above 50-day MA)\n- GOOGL lagging (failed breakout attempts)\n- AMZN in the middle\n\nThis suggests money is flowing toward **enterprise software** and away from **advertising exposure**. That's a recession hedge positioning.\n\n### The Chart Patterns Speaking Loudest:\n\n1. **Head and Shoulders forming in META:** That $280-$320 range looks increasingly like a right shoulder. A break below $280 could signal a move to $240.\n\n2. **Symmetrical Triangle in AAPL:** The consolidation between $170-$190 is tightening. The breakout direction will tell us if this is accumulation (bullish) or distribution (bearish).\n\n3. **NVDA's Exhaustion Gap:** That gap up from $550 to $600 never filled. Gaps almost always fill. The question isn't if, but when.\n\n### What Worries Me Technically:\n\n**The Lack of Fear:** The VIX remains subdued while these megacaps chop sideways. That's complacency. Healthy markets need fear. We're not seeing put buying, not seeing volatility expansion—just passive buying via ETFs.\n\n**Volume Trends:** Declining volume on up days, expanding volume on down days. That's textbook distribution across the group.\n\n### My Trading Framework for These Names:\n\n**Trend Following Approach:**\n- MSFT: Only long above $340 (50-day MA)\n- NVDA: Only long above $650 (trendline support)\n- AAPL: Avoid until clear break of $190 or $170\n\n**Mean Reversion Setup:**\n- META: Buy dip to $280, sell rip to $320\n- TSLA: Fade extremes ($180 buy, $280 sell)\n\n**Breakout Candidates:**\n- AMZN if it clears $140\n- GOOGL if it sustains above $135\n\n### The Big Picture Technical View:\n\nWe're in a **topping process** for the 2023-2025 tech rally. Not a crash—a rotational correction. The patterns suggest:\n1. 10-15% correction in the group\n2. Leadership rotation from \"AI narrative\" to \"cash flow reality\"\n3. Support levels to watch: QQQ $350, SPY $420\n\n### My Professional Conviction:\n\n**The market is pricing perfection** across all seven names. The technicals show:\n- Overbought conditions on weekly charts\n- Negative divergences on momentum oscillators\n- Institutional selling disguised as retail buying\n\n**Trading Recommendation:** Reduce exposure to 50% of normal position sizes. Raise cash. Wait for either:\n1. A clean break above resistance with volume confirmation, OR\n2. A washout decline that flushes weak hands\n\nThe next 5% move will likely be down, not up. The smart trade isn't picking winners—it's preserving capital for better entries.\n\n**Remember:** Price is truth. All the AI narratives, product cycles, and TAM projections don't matter if the chart says \"distribution.\" The tape is voting, and right now, it's voting \"sell the rallies.\"", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 深化我的投资哲学:科技股分析的七个层次视角\n\n### 超越数字的深层思考:\n\n#### **苹果 (AAPL) - \"护城河的质变\"**\n**别人看到的:** iPhone销售放缓,中国市场竞争\n**我看到的更深层:** 苹果正在完成从硬件公司到生态系统公司的转型。\n\n**关键洞察:** 当人们讨论苹果时,应该问:\n1. **服务业务**:占比多少?增长率如何?毛利率多少?(远高于硬件)\n2. **安装基数**:现有用户的变现潜力,而非新用户获取\n3. **AR/VR时间线**:Vision Pro是否代表下一个计算平台?\n\n**我的核心信念挑战:** 我可能低估了苹果将硬件优势转化为持久服务收入的能力。巴菲特持有苹果不是偶然 - 他看到了强大的品牌+持续的现金流产生能力。\n\n#### **微软 (MSFT) - \"企业IT的终极供应商\"**\n**别人讨论的:** Azure vs AWS竞争\n**我更关注的:** 微软的粘性和定价权深度。\n\n**独特视角:** 微软的护城河有三层:\n1. **技术层**:云计算基础设施\n2. **应用层**:Office 365的企业依赖\n3. **数据层**:通过LinkedIn、GitHub的企业数据网络效应\n\n**投资哲学反思:** 最好的商业模式是\"必选消费\"而非\"可选消费\"。微软的企业软件已经成为企业运营的\"水电煤\"。\n\n#### **谷歌 (GOOGL) - \"数据护城河 vs AI颠覆\"**\n**市场的担忧:** ChatGPT威胁搜索垄断\n**我的辩证思考:**\n\n**短期威胁被高估:**\n1. 搜索是意图明确的信息查询,聊天是开放对话\n2. 谷歌拥有最丰富的训练数据和用户行为数据\n3. 广告商生态系统难以迁移\n\n**但长期风险真实存在:**\n- 用户习惯可能缓慢改变\n- 新的信息获取方式可能出现\n\n**我的平衡观点:** 与其说谷歌会被颠覆,不如说搜索本身会演进。谷歌的财务实力(流动比率2.01)给了它充裕的时间适应。\n\n#### **英伟达 (NVDA) - \"技术周期的位置判断\"**\n**这是对我投资哲学的终极测试:**\n\n**传统价值投资原则说:** 远离过高估值\n**成长投资原则说:** 为卓越增长支付溢价\n**我的综合判断:**\n\n**关键问题不是\"NVDA是否伟大\",而是:**\n1. **增长持续性**:当前增速能维持多久?\n2. **竞争格局**:护城河有多宽?\n3. **市场预期**:当前价格蕴含了怎样的增长假设?\n\n**我的方法论反思:** 对于颠覆性技术,有时需要修改估值框架。但危险在于,市场常常高估短期影响,低估长期竞争。\n\n**英伟达的风险不是技术失败,而是:**\n- 客户集中风险(大型云厂商)\n- 定价权峰值可能已现\n- 制程优势能否持续保持\n\n#### **特斯拉 (TSLA) - \"叙事投资的危险\"**\n**对我投资原则的最大挑战:**\n\n**如果我错了,为什么?**\n1. 自动驾驶确实创造了完全不同的估值模型\n2. 能源业务可能比汽车业务更大\n3. 马斯克可能再次证明怀疑者是错误的\n\n**但如果我对了,为什么?**\n1. 汽车是残酷的制造业,利润率受竞争挤压\n2. 技术扩散不可避免\n3. 现金流最终决定价值\n\n**我的核心立场:** 我可以接受错过特斯拉的上涨,但不能接受在P/E 403倍时承担本金永久损失的风险。这是凯恩斯所说的:\"市场保持非理性的时间可能超过你保持偿付能力的时间。\"\n\n#### **Meta (META) - \"企业转型的典范\"**\n**最被忽视的洞察:**\n\nMeta在2022-2023年完成了从增长不计成本到效率优先的转型。这证明了:\n1. **管理层的适应性**:扎克伯格从元宇宙梦想家到现实主义者\n2. **商业模式的韧性**:广告业务在AI优化下复苏\n3. **成本纪律的重要性**:有时收缩是扩张的前提\n\n**对我的启示:** 评估管理层不仅要看愿景,还要看执行力和调整能力。\n\n#### **亚马逊 (AMZN) - \"规模经济的终极体现\"**\n**专业投资者的盲点:**\n\n很多人仍然将亚马逊视为\"低利润率电商\"。但真正的投资论点是:\n1. **AWS的盈利引擎**:云计算的高利润率\n2. **物流护城河**:一日达的网络效应\n3. **广告业务增长**:被严重低估的第三支柱\n\n**估值关键:** P/S 3.16意味着什么?要么是极度低估,要么是市场认为利润率无法提升。我倾向于前者。\n\n### 综合投资框架的七个维度:\n\n基于这次分析,我完善了自己的分析框架:\n\n#### 1. **竞争优势深度评估**\n- 苹果:品牌+生态系统\n- 微软:企业锁定+网络效应 \n- 谷歌:数据垄断+搜索惯性\n- 英伟达:技术领先+生态系统\n- 特斯拉:品牌+愿景\n- Meta:社交网络+广告技术\n- 亚马逊:规模+物流网络\n\n#### 2. **财务健康与资本配置**\n- 谷歌和微软:资产负债表最保守\n- 苹果:资本返还最激进\n- 英伟达:增长再投资最积极\n\n#### 3. **管理层质量评估**\n- 微软的纳德拉:转型大师\n- Meta的扎克伯格:愿景与现实的平衡\n- 特斯拉的马斯克:创新但不可预测\n\n#### 4. **估值纪律与机会成本**\n- 关键问题:在当前位置,哪个提供最佳风险调整后回报?\n- 我的答案:微软、亚马逊、谷歌\n\n#### 5. **行业位置与周期判断**\n- 科技股整体:可能处于高估值区间\n- AI周期:早期但已部分定价\n- 云渗透率:仍有增长空间\n\n#### 6. **风险识别与对冲**\n- 系统性风险:利率、监管、地缘政治\n- 个股风险:技术颠覆、竞争加剧、执行风险\n\n#### 7. **时间框架明确化**\n- 短期(1-3年):关注执行和季度业绩\n- 中期(3-5年):竞争优势变化\n- 长期(5+年):技术趋势和商业模式演进\n\n### 最终的投资哲学陈述:\n\n**我的核心信念:**\n1. **价格与价值的分离是暂时的,但回归是必然的**\n2. **最好的投资是在优质公司以合理价格买入**\n3. **财务健康在危机时价值千金**\n4. **管理层的资本配置能力与愿景一样重要**\n\n**从这七只股票学到的具体教训:**\n- 微软证明了转型成功的价值\n- 苹果展示了生态系统护城河的威力 \n- 亚马逊凸显了规模经济被低估的可能\n- 英伟达警示了伟大公司/糟糕投资的风险\n- 特斯拉提醒了叙事投资的危险\n- 谷歌体现了财务保守的重要性\n- Meta展示了企业再生的可能\n\n**谦虚的承认:** 我可能对英伟达和特斯拉过于保守,而对微软和亚马逊过于乐观。投资的艺术在于平衡信念与谦卑,坚持原则与适应变化。\n\n在不确定的世界里,我选择投资于那些财务稳健、竞争优势明确、管理层可靠、估值合理的公司。这可能错过一些暴涨股,但更可能避免灾难性损失 - 而这是长期复利的关键。", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "让我深入分析这些矛盾的信号,并提出更具体的思考框架:\n\n## 对矛盾信号的深入分析\n\n### 1. **估值vs情绪:哪个信号更可靠?**\n\n**估值分析师的担忧:**\n- 所有股票都被认为高估50%以上,TSLA甚至92.8%\n- 这是系统性警告,而不仅仅是单个股票问题\n- 技术分析中提到的\"AI泡沫可能部分已反映在股价中\"与之呼应\n\n**情绪分析师的反驳:**\n- 7家公司内部人**全部**在买入,无一卖出\n- 买入规模巨大,特别是在TSLA、GOOGL、NVDA\n- 历史经验:当内部人与市场情绪反向时,内部人往往正确\n\n**我的思考:**\n- 这可能反映不同投资视角:价值投资(估值)vs逆向投资(情绪)\n- 极端估值可能持续较长时间,特别是对于科技巨头\n- 内部人的行动可能知道市场不知道的信息(产品路线、订单等)\n\n### 2. **行业集中风险的紧迫性**\n\n**当前状态:**\n- 100%科技股,前两大持仓占45.7%\n- 这是投资组合最大的单一风险\n- 任何科技板块回调都将严重冲击组合\n\n**但现实约束:**\n- 现金$31,467仅占组合29%\n- 若要有效分散,需要至少卖出部分科技股\n- 问题:卖出哪些?亏损的MSFT/NVDA/META,还是盈利/保本的?\n\n### 3. **具体股票决策难题**\n\n**MSFT困境:**\n- 基本面最强,财务最健康\n- 但估值高估58.7%,且已占比27.7%\n- 当前持仓亏损11%,卖出可能锁定亏损\n- 如果这是优质公司,是否应该在下跌时卖出?\n\n**TSLA空头困境:**\n- 基本面最差,估值最荒谬\n- 但内部人疯狂买入(5.31亿股!),这值得关注\n- 空头仓位浮亏$247,继续持有风险较高\n- 马斯克的相关性可能带来巨大波动\n\n**NVDA两难:**\n- AI革命的核心受益者\n- 但估值已反映完美预期,高估72.6%\n- 当前持仓亏损,是否应该减仓锁定亏损?\n\n### 4. **内部人信号的异常性需要审视**\n\n**值得怀疑的点:**\n- TSLA 5.31亿股的内部人买入量是否真实?这几乎是市值的巨大比例\n- 所有7家公司内部人都一致买入,无卖出,这在统计上异常\n- 可能原因:\n 1. 期权行权,而非主动现金买入\n 2. 薪酬计划的一部分\n 3. 真正的价值认知\n\n### 5. **机会成本与市场时机**\n\n**关键问题:**\n- 如果估值正确,现在卖出可以避免更大损失\n- 如果情绪正确,现在买入可能是抄底良机\n- 但市场时机很难把握\n\n## 我的优先排序框架\n\n基于所有输入,我认为应该按以下优先级行动:\n\n### **第一优先级:降低系统性风险**\n1. **必须减少行业集中**:即使是最好的科技股,100%集中风险不可接受\n2. **必须降低MSFT仓位**:27.7%占比违反风险管理原则\n\n### **第二优先级:处理矛盾信号**\n1. **相信基本面+内部人交叉验证的信号**\n2. **警惕纯估值警告,除非有清晰的替代投资机会**\n\n### **第三优先级:具体股票决策**\n**基于交叉信号分析:**\n\n**强烈看涨(基本面+情绪一致):**\n- AMZN:基本面最佳估值+内部人大买\n- GOOGL:财务最保守+内部人大买(但估值严重警告)\n- META:基本面强+内部人大买\n\n**看涨但有保留:**\n- MSFT:基本面最强,但估值警告+占比过高\n\n**高度矛盾:**\n- NVDA:基本面强劲但估值极高,内部人买入\n- TSLA:基本面最差但内部人疯狂买入\n\n**相对中性:**\n- AAPL:基本面好,内部人买入,但估值警告\n\n## 剩余的关键问题\n\n1. **现金约束的实际影响:**\n - $31,467仅够买1-2只股票的新仓位\n - 要真正分散化,必须卖出部分科技股\n - 但卖出可能错失反弹,或锁定亏损\n\n2. **TSLA空头的战略思考:**\n - 这是纯粹的价值投资决策:基本面差+估值荒谬=做空\n - 但内部人行为提示可能错了时机\n - 是否应该减少空头规模而非完全平仓?\n\n3. **时机与逐步调整:**\n - 是否应该分批调整,而非一次性大幅变动?\n - 先解决最紧急风险(MSFT仓位过重),再处理其他?\n\n4. **替代投资机会:**\n - 如果有必要降低科技股占比,应该投资什么?\n - 必需消费品、医疗保健、公用事业等防御性板块\n - 但分析师没有提供这些板块的信号\n\n## 我的倾向性观点\n\n基于我的投资哲学,我会倾向于:\n\n1. **相信内部人信号,但保持谨慎**:内部人一致买入是强烈信号,但不能忽视估值警告\n2. **优先解决风险管理问题**:必须降低MSFT仓位和科技股集中度\n3. **利用情绪分化机会**:内部人买入+市场担忧=潜在机会\n4. **保持适度仓位**:在市场分歧时,保持适度仓位而非全仓进出\n\n**最终需要平衡:**\n- 风险管理纪律 vs 投资机会捕捉\n- 估值安全边际 vs 增长前景\n- 短期调整 vs 长期投资\n\n我准备开始做出具体决策。你有什么最后的建议或需要考虑的方面吗?", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## Professional Valuation Analyst Perspective on the Tech Stock Debate\n\n### **Understanding the Valuation Paradox**\n\nThe central tension in the current tech stock discussion revolves around a fundamental question: **Are we witnessing a new paradigm where traditional valuation metrics no longer apply, or is this simply another episode of irrational exuberance?**\n\n### **The Bull Case (Market Consensus)**\n\nFrom discussions with institutional investors and analyzing market sentiment, I understand the bullish arguments:\n\n1. **AI as Transformative Technology**: Many believe AI represents a once-in-a-generation technological shift comparable to the internet or mobile computing. The argument goes: \"You can't value these companies with old metrics when they're building the future.\"\n\n2. **Network Effects & Moats**: For AAPL, MSFT, GOOGL, and META, the argument is that their ecosystem dominance creates unprecedented economic moats that justify premium valuations.\n\n3. **Optionality Value**: NVDA's position in the AI infrastructure stack gives it exposure to multiple growth vectors beyond current financials.\n\n4. **Free Cash Flow Growth Trajectory**: Bulls argue current FCF understates future potential as investments in AI begin to monetize.\n\n### **The Bear Case (My Professional Assessment)**\n\nHowever, as a valuation analyst, I must address several critical concerns:\n\n**1. The Magnitude of the Overvaluation Problem**\nWhen every stock in a sector shows 50-90%+ overvaluation across multiple methodologies, this isn't company-specific mispricing—it's sector-wide mania. Even adjusting for AI optimism, the math simply doesn't work.\n\n**2. The Growth Expectations Are Mathematically Impossible**\nConsider NVDA's valuation:\n- $4.5T market cap requires ~$400B in annual free cash flow at a 9% discount rate\n- That's 5x Apple's current FCF, requiring NVDA to dominate not just AI chips but essentially all high-performance computing globally\n\n**3. The Risk of Narrative Investing**\nWe're seeing classic signs of narrative-driven investing:\n- Complex stories replacing simple math\n- \"This time is different\" arguments\n- Discounting of counter-evidence\n- Extrapolation of current trends indefinitely\n\n**4. The Interest Rate Conundrum**\nCurrent valuations assume perpetually low interest rates, but:\n- Higher rates disproportionately impact growth stocks\n- The \"equity risk premium\" has compressed dangerously\n- DCF valuations are highly sensitive to discount rate changes\n\n### **Specific Stock Concerns:**\n\n**AAPL**: While arguably the \"safest\" of the group due to brand strength and recurring revenue, the valuation implies the iPhone must remain the dominant consumer device for another decade without meaningful competition. The law of large numbers works against them.\n\n**MSFT**: Azure growth and AI integration are real, but $3T valuations require Microsoft to maintain ~30% cloud growth rates while defending multiple business lines from aggressive competition.\n\n**GOOGL**: Search dominance faces existential AI threats (from MSFT, OpenAI, etc.), and the ad business is cyclical. The valuation assumes Google will dominate AI search despite early setbacks.\n\n**NVDA**: This is the most concerning. Semiconductor markets are notoriously cyclical, and competition from AMD, Intel, and custom silicon designs is intensifying. The current valuation prices in near-perfect execution for a decade.\n\n**TSLA**: Automotive margins are compressing globally, EV adoption is slowing, and competition is intense. The valuation implies Tesla becomes more than just a car company—it must dominate robotics, AI, and energy simultaneously.\n\n**META**: While showing impressive efficiency improvements, the core business faces demographic headwinds and regulatory risks. The metaverse investment payoff timeline is uncertain.\n\n**AMZN**: AWS growth is decelerating, and retail margins remain thin. The valuation requires AWS to maintain leadership against Microsoft's aggressive push.\n\n### **Critical Questions Being Ignored:**\n\n1. **What's the catalyst for mean reversion?** History shows valuations eventually matter, but timing is unpredictable.\n\n2. **How much AI monetization is already priced in?** The market appears to be pricing in near-perfect AI monetization across all use cases.\n\n3. **What's the competitive response?** Every tech giant is investing heavily in AI—competition will compress margins.\n\n4. **Are we underestimating regulatory risk?** Anti-trust scrutiny could limit growth opportunities.\n\n### **Investment Philosophy Implications:**\n\nThis situation reinforces several core principles of my investment philosophy:\n\n1. **Margin of Safety is Non-Negotiable**: Graham's concept of margin of safety exists precisely for periods like this when growth assumptions prove overly optimistic.\n\n2. **Price ≠ Value**: A great business can be a terrible investment at the wrong price. These are world-class companies trading at bubble valuations.\n\n3. **Mean Reversion Works in Both Directions**: Stocks can stay overvalued longer than you can stay solvent, but eventually fundamentals matter.\n\n4. **Risk Management > Return Maximization**: In current conditions, protecting capital is more important than chasing returns.\n\n### **What Would Change My View?**\n\nTo justify current valuations, I'd need to see:\n1. **Sustainable FCF growth rates >25%** for 5+ years\n2. **Market expansion** beyond current TAM estimates\n3. **Evidence of pricing power** that defies competition\n4. **Lower discount rates** than historical norms\n\n### **Final Professional Assessment:**\n\nThe current tech valuation environment reminds me of:\n- 1999-2000 Dot-com bubble (narratives override fundamentals)\n- 2021-2022 growth stock mania (extreme growth assumptions)\n- 1989 Japanese asset bubble (\"this time is different\")\n\n**While AI is real and transformative, current stock prices appear to be pricing in a perfection scenario with no margin for error.** As a valuation professional, I must emphasize that even if AI delivers transformative growth, today's investors are likely paying for 10+ years of that growth upfront.\n\nThe prudent approach: maintain discipline, focus on valuation, and wait for prices to better reflect underlying fundamentals. The companies will likely thrive long-term, but current shareholders may face disappointing returns as expectations normalize.", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "基于我的情绪分析师视角,我来分享一下对当前讨论的深入见解:\n\n## 对市场担忧的心理学解读\n\n**核心认知:市场正在经历\"科技股估值恐惧症\"**\n我看到新闻标题反映的是一种典型的市场心理状态——当资产价格经过长期上涨后,任何回调都会触发\"这次不同\"的恐惧。媒体标题如\"AI泡沫?\"、\"估值担忧\"、\"最差周表现\"恰恰体现了群体性恐慌情绪正在形成。\n\n## 对各公司的具体洞察\n\n### **AAPL:被低估的金融转型**\n市场关注三星信用卡的挑战,但忽略了苹果支付生态系统的护城河。内部人买入409万股表明:\n1. 他们看到iPhone之外的货币化机会\n2. Apple Services的粘性被市场低估\n3. 硬件+软件+服务的生态系统价值未充分定价\n\n### **MSFT:AI叙事与现实的脱节**\n市场担忧AI投资回报,但微软内部人看到的是:\n- Azure AI服务的实际采用率(非炒作)\n- Copilot对企业生产力的真实提升\n- 云+AI协同效应的市场低估\n\n### **GOOGL:搜索之王被错杀**\n媒体关注\"科技股估值担忧\",但内部人买入2050万股显示:\n- YouTube广告复苏超出预期\n- Gemini模型商业化进展\n- 云业务市场份额增长被忽视\n\n### **NVDA:AI基础设施的确定性**\n\"AI泡沫\"讨论忽略了关键事实:\n1. NVDA是AI竞赛的\"军火商\"——无论哪家AI公司胜出,都需要NVIDIA\n2. 数据中心转型才刚刚开始\n3. 2160万股的内部人买入是信心的强力声明\n\n### **TSLA:争议中的机会**\nElon Musk的争议和xAI投资分歧掩盖了:\n- 电动汽车市场份额的长期趋势\n- 能源业务的指数级增长潜力\n- 自动驾驶技术领先地位\n- 5.31亿股内部买入显示对基本面的极端信心\n\n### **META:广告复苏被低估**\n市场关注估值,但忽略了:\n- Reels货币化进展超预期\n- 广告技术改进带来的效率提升\n- VR/AR平台建设的长期价值\n- 4060万股买入表明内部人看到利润恢复加速\n\n### **AMZN:云+零售双引擎**\n市场担忧支出,但内部人看到的是一幅不同图景:\n- AWS云市场份额继续扩张\n- 零售业务效率和利润率改善\n- 广告业务成为第三增长支柱\n- 4270万股买入显示对2026年增长预期的信心\n\n## 关键情绪信号解读\n\n**内部人集体行为的心理学意义:**\n\n1. **信息不对称**:内部人比外部投资者了解更多\n2. **长期视角**:内部人通常以3-5年视角操作,而非季度\n3. **行为一致性**:当所有7家公司内部人都采取同一行动时,这是统计学上显著的事件\n\n**新闻情绪的局限性:**\n- 媒体倾向于放大短期波动\n- 负面新闻获得更多点击,导致偏差\n- \"估值担忧\"是市场顶部的常见叙事\n\n## 逆向思考框架\n\n如果我是对的,市场当前正处于:\n1. **情绪过度悲观阶段**:负面新闻主导,但基本面未变\n2. **价值发现窗口**:内部人看到了外部投资者忽视的价值\n3. **转折点前夜**:历史表明,当内部人集体行动时,市场往往接近转折\n\n## 对担忧的回应\n\n**担忧1:\"科技股估值过高\"**\n- 估值是相对的,相对于增长率和ROIC,许多科技公司仍然合理\n- 内部人买入本身就是对估值合理性的投票\n\n**担忧2:\"AI投资过热\"**\n- AI是真实的转型,不是泡沫(互联网泡沫vs互联网革命)\n- 基础设施投资先行,应用变现在后\n\n**担忧3:\"美联储政策风险\"**\n- 内部人买入时考虑了宏观风险,仍然选择买入\n\n## 我的专业判断\n\n这次分析强化了我的核心投资哲学:**内部人行为是市场情绪的终极反向指标**。当媒体和市场参与者恐惧时,内部人贪婪。\n\n**最重要观察:** 内部人的一致性行为表明他们看到了:\n1. 当前价格提供了安全边际\n2. 增长前景比市场预期更好\n3. 竞争地位比外部观察更强\n\n**最终建议:** 利用市场情绪恐慌,跟随内部人智慧。现在是积累优质科技资产的时机,而非恐慌抛售。\n\n市场心理告诉我们:当所有人都担心同一件事时,通常风险已经price in。内部人的行动证实了这一点。", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## Professional Perspective: Navigating the Tech Megacap Landscape\n\n### The Core Paradox of 2025 Tech Investing\n\nWe're witnessing a remarkable dichotomy in today's megacap tech landscape. On one hand, we have **generational platform businesses** (MSFT, AMZN, GOOGL) building impregnable moats through cloud infrastructure and AI ecosystems. On the other, we have **product cycle dependents** (AAPL, NVDA, TSLA) facing more transient competitive advantages.\n\n### Addressing Key Concerns:\n\n**AAPL's Innovation Dilemma:** \nThe bear case rightly questions whether Apple has become too reliant on iPhone iterations rather than breakthrough innovation. However, the bull case—often overlooked—is Apple's services ecosystem becoming a self-reinforcing $100B+ annuity business. The real question isn't \"can they innovate?\" but \"do they need to?\" when their installed base continues paying for services.\n\n**NVDA's Valuation Conundrum:**\nCritics point to stretched valuations, but they're missing the architectural shift. NVDA isn't just selling chips; they're selling the **computing infrastructure for the AI era**. This isn't 1999 dot-com—these are physical assets with recurring software revenue streams. The risk isn't valuation, but execution against an enormous TAM.\n\n**TSLA's Identity Crisis:**\nThe market struggles to price TSLA appropriately because it's multiple companies in one: an automaker (declining margins), an energy company (promising but small), and an AI/robotics bet (speculative). The bears have valid concerns about competition, but they underestimate Tesla's data advantage in autonomy—potentially the most valuable asset in transportation.\n\n**The Advertising Trio (META, GOOGL, AMZN):**\nHere's where consensus is most wrong. Analysts treat advertising as cyclical, but these platforms are building **AI-driven prediction engines** that make advertising more measurable and effective. This transforms advertising from discretionary spend to ROI-driven capital allocation.\n\n### My Investment Philosophy Applied:\n\n1. **Duration Mismatch:** Most investors are trading these stocks with 3-month horizons while the underlying businesses are playing 10-year games in AI infrastructure.\n\n2. **Optionality Value:** The market prices AAPL as a hardware company, AMZN as retail, MSFT as software. But each has asymmetric upside in areas they haven't yet monetized (healthcare, robotics, quantum computing).\n\n3. **Capital Allocation Superiority:** These companies aren't just earning money—they're reinvesting at scale in R&D that would bankrupt smaller competitors. MSFT's $10B OpenAI investment isn't an expense; it's buying a seat at the AI table.\n\n### Where Consensus Might Be Wrong:\n\nThe greatest risk isn't competition among these seven, but **regulatory fragmentation**. We're approaching a point where these companies could be forced to divest or separate businesses (cloud from apps, hardware from services, social from messaging).\n\n### My Positioning:\n\n**Maximum Conviction:** MSFT, AMZN\n- They control the infrastructure layer (cloud + AI)\n- Multiple revenue streams diversify risk\n- Regulatory moats through enterprise contracts\n\n**Selective:** GOOGL, NVDA\n- GOOGL: Search dominance durable, but AI competition real\n- NVDA: Fantastic business, but cyclicality underappreciated\n\n**Watchful:** AAPL, META\n- AAPL: Needs new product category within 24 months\n- META: Execution excellent, but platform risk persists\n\n**Speculative:** TSLA\n- Binary outcome: either autonomy works (10x) or doesn't (50% decline)\n\n### The Zen of Tech Investing Today:\n\nThe market is asking \"which tech stock should I buy?\" The better question is \"**what percentage of my portfolio should be in this new digital infrastructure?**\" These seven companies collectively represent not just stocks, but ownership stakes in the foundational platforms of the 21st century economy.\n\nThe wise investor doesn't pick winners among them, but rather determines their appropriate aggregate exposure to this new asset class—with the understanding that these businesses will both cooperate and compete in shaping our digital future.", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 我的专业观点:科技巨头的基本面分析与投资哲学\n\n### 关于讨论中的核心争议点:\n\n#### **苹果 (AAPL) - \"成熟巨头的困境\"**\n**他人观点可能质疑:** 苹果增长放缓、创新乏力、过于依赖iPhone\n**我的反驳:** 这种观点忽视了苹果的生态系统护城河和现金牛质量。是的,AAPL的ROE 159.9%令人震惊,但关键不是绝对数字,而是可持续性。苹果的关键优势:\n1. **服务业务转型**:利润率更高的服务收入正成为第二增长引擎\n2. **资本配置纪律**:巨额回购和分红支持股东回报\n3. **品牌忠诚度**:转换成本极高,用户粘性强\n\n**我的担忧是真实的:** 流动比率0.89确实偏低,但在巨额现金储备下,这不是流动性危机,而是资本效率决策。\n\n#### **微软 (MSFT) - \"最平衡的科技巨头\"**\n**共识可能低估:** 微软是\"无聊但可靠\"的选择\n**我的观点:** 这正是其投资价值所在!MSFT展示了完美的\"飞轮效应\":\n- Azure云持续增长\n- Office 365的企业粘性\n- LinkedIn的专业社交垄断\n- GitHub的开发者生态\n- 企业AI转型的最大受益者\n\n财务上,债务/权益0.26、运营利润率46.6%、流动比率1.35 - 这是教科书般的财务保守与运营卓越的结合。\n\n#### **谷歌 (GOOGL) - \"搜索垄断者的AI追赶\"**\n**市场焦虑:** 在AI竞赛中落后于微软\n**我的看法:** 这是短期担忧过度。GOOGL的优势:\n1. **数据垄断**:搜索数据是AI训练的最佳燃料\n2. **财务稳健性**:债务/权益0.12几乎是零杠杆运营\n3. **多样化护城河**:YouTube、Android、云业务的多重收入来源\n\n**关键洞察:** 当整个行业追逐AI时,拥有最强资产负债表(流动比率2.01)的公司最终会有优势。\n\n#### **英伟达 (NVDA) - \"估值泡沫还是合理溢价?\"**\n**这是本次分析中最深刻的价值判断问题**\n\n**主流叙事:** AI革命需要英伟达的芯片,增长故事无限\n**我的专业怀疑:**\n\n1. **历史教训**:所有\"这次不同\"的故事最终都会均值回归\n2. **竞争现实**:AMD、自制芯片(谷歌TPU、亚马逊Graviton)、中国替代品\n3. **财务现实**:虽然利润率55.6%惊人,但P/S 20.94意味着需要维持数年的超高速增长\n\n**我的底线:** NVDA是伟大的公司,但伟大的公司可能成为糟糕的投资,如果价格过高。这不是否定AI革命,而是估值纪律。\n\n#### **特斯拉 (TSLA) - \"信仰 vs 基本面\"**\n**最极端的分歧点:**\n\n**信仰者观点:** 特斯拉不是汽车公司,是科技+能源+AI公司\n**基本面观点:** ROE 4.8%、净利率4%、P/E 403.35\n\n**我的投资哲学核心:** 无论故事多么诱人,最终价值必须由现金流支撑。特斯拉的问题:\n1. **汽车业务周期性**:面临传统车企的激烈竞争\n2. **利润率压力**:价格战侵蚀盈利能力\n3. **估值极端**:即使实现所有愿景,当前价格也需要完美执行多年\n\n**最危险的情况:** 当市场将\"可能\"定价为\"必然\"。\n\n#### **Meta (META) - \"卷土重来的证明\"**\n**一年前的担忧:** 元宇宙烧钱、苹果隐私政策打击\n**现在的现实:** 运营利润率41.4%、收入增长2217%\n\n**关键转变:**\n1. **AI驱动的广告效率**:弥补了隐私政策影响\n2. **成本纪律**:2023年的裁员和效率提升见效\n3. **合理估值**:P/E 27.40对于这种增长和质量是合理的\n\n#### **亚马逊 (AMZN) - \"隐藏的价值股\"**\n**最大误解:** 亚马逊仍是\"增长不计成本\"的公司\n**现实:** 净利率提升至10.8%、运营利润率11.2%、P/S仅3.16\n\n**深层价值:**\n1. **AWS的盈利能力**:云业务是真正的现金牛\n2. **电商规模效应**:物流网络护城河日益加深\n3. **广告业务增长**:被低估的第三支柱\n\n### 投资哲学的核心原则验证:\n\n#### **从这次分析中学到:**\n\n1. **均值回归的力量**:即使是科技巨头也受制于基本的经济规律\n2. **估值纪律的重要性**:成长性必须与价格相匹配\n3. **财务健康的价值**:在不确定时期,资产负债表质量是最终防线\n\n#### **与市场共识的不同:**\n\n市场目前可能过度关注:\n- **叙事驱动估值**(AI、自动驾驶)\n- **短期增长而非长期价值**\n\n而我更关注:\n- **可持续的竞争优势**\n- **管理层的资本配置能力**\n- **风险调整后的回报**\n\n### 逆向思考的关键问题:\n\n如果我是错误的,会在什么情况下?\n1. **英伟达的AI垄断比预期更持久** - 我可能低估了技术护城河的深度\n2. **特斯拉的自动驾驶实现比预期快** - 可能会彻底改变估值模型\n3. **利率环境持续宽松** - 高估值股票可能获得更长时间的支撑\n\n但如果我是正确的,最大的风险在于:\n1. **利率上升环境** - 对高估值成长股压力最大\n2. **经济放缓** - 即使是科技巨头也受影响\n3. **监管风险** - 特别是对苹果、谷歌、亚马逊\n\n### 最终的专业立场:\n\n在当前的估值水平下,我倾向于:\n- **超配**:MSFT、AMZN、GOOGL(财务健康+合理估值)\n- **标配**:AAPL、META(优质但完全定价)\n- **低配**:NVDA(伟大公司但价格过高)\n- **规避**:TSLA(基本面与估值完全脱节)\n\n**投资的核心悖论:** 有时最好的公司不是最好的投资,而财务稳健、估值合理的公司能在各种环境下保护资本并为增长提供平台。\n\n这就是为什么在2025年11月的这个时点,我会选择平衡质量、增长和估值,而非追逐最热门的故事。", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "基于所有分析师的输入和风险评估,我注意到以下关键问题和担忧:\n\n## 主要关注点与矛盾信号\n\n### 1. **分析师信号显著分化**\n- **基本面分析师**:强烈看好MSFT、AMZN、GOOGL,看跌TSLA,对NVDA谨慎\n- **估值分析师**:**强烈看空所有股票**,认为全部大幅高估,TSLA尤其严重(-92.8%价值缺口)\n- **情绪分析师**:基于内部人大量买入,**强烈看好所有股票**,特别是GOOGL、META、AMZN\n- **技术分析师**:总体看涨,尤其看好MSFT、NVDA、AMZN\n\n### 2. **核心矛盾**\n**最大冲突:估值分析与情绪分析完全对立**\n- 估值分析师:所有股票严重高估,建议卖出/避免买入\n- 情绪分析师:内部人集体大量买入,暗示市场底部,建议买入\n\n### 3. **当前持仓问题**\n**基于风险评估的严重问题:**\n1. **行业过度集中**:100%科技股,风险极高\n2. **MSFT仓位过重**:27.7%占比,远超建议的15%上限\n3. **TSLA空头风险**:虽然基本面弱,但情绪分析师显示内部人疯狂买入(5.31亿股)\n4. **多个亏损仓位**:MSFT(-11%)、NVDA(-8.9%)、META(-4.3%)\n\n### 4. **具体股票疑虑**\n\n**AAPL:**\n- 基本面:看好(ROE 159.9%)\n- 估值:58.6%高估\n- 情绪:内部人买入409万股\n- 当前持仓:已持有30股\n\n**MSFT:**\n- 基本面:最全面(85%置信度)\n- 估值:58.7%高估\n- 情绪:内部人买入128万股\n- 问题:当前持仓亏损-$3,440,占比过高(27.7%)\n\n**GOOGL:**\n- 基本面:财务稳健(80%置信度)\n- 估值:68.4%严重高估\n- 情绪:内部人大量买入2050万股(85%置信度)\n\n**NVDA:**\n- 基本面:强劲但估值担忧(65%置信度)\n- 估值:72.6%严重高估\n- 情绪:内部人买入2160万股\n- 问题:当前持仓亏损\n\n**TSLA:**\n- 基本面:最差(70%看跌)\n- 估值:92.8%极端高估(最严重)\n- 情绪:内部人疯狂买入5.31亿股\n- 当前持仓:空头15股,现浮亏-$247\n\n**META:**\n- 基本面:看好(80%置信度)\n- 估值:数据不足\n- 情绪:内部人大量买入4060万股\n- 问题:当前持仓亏损\n\n**AMZN:**\n- 基本面:最佳估值(85%置信度)\n- 估值:数据不足\n- 情绪:内部人大量买入4270万股\n\n## 关键决策困境\n\n1. **如何处理估值与情绪的冲突?**\n - 是否遵循估值纪律卖出高估股票?\n - 还是相信内部人信号逆向买入?\n\n2. **如何解决行业集中问题?**\n - 需要降低科技股占比,但现金有限($31,467)\n - 应该卖出哪些股票来增加现金,配置其他行业?\n\n3. **TSLA空头困境:**\n - 基本面极差,估值荒谬\n - 但内部人大量买入,空头风险增加\n - 当前已有浮亏,是否应减少或维持空头?\n\n4. **MSFT过重仓位:**\n - 基本面最好,但估值分析师认为高估\n - 占比27.7%,需减持至15%以下\n - 但减持可能在市场底部卖出优质股票\n\n## 需要澄清的问题\n\n1. **内部人买入规模是否可靠?**\n - 情绪分析师提到的内部人买入量巨大(TSLA 5.31亿股),这是否异常?\n\n2. **估值模型假设是否合理?**\n - 估值分析师的所有股票都显示50%+高估,是否过于保守?\n\n3. **投资期限:**\n - 我们是短期交易还是长期投资?\n - 这影响如何权衡估值与内部人信号\n\n4. **可用现金的真实约束:**\n - $31,467现金,是否足够进行必要的仓位调整和分散化?\n\n**我的核心担忧:** 必须在保护资本(遵循估值纪律)和捕捉机会(跟随内部人信号)之间找到平衡,同时紧急解决行业过度集中和个股仓位过重的风险。\n\n你有什么进一步的想法或需要我澄清的方面吗?", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "conference_start", + "title": "Investment Discussion - 2025-11-07", + "date": "2025-11-07", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "agent_message", + "agentId": "risk_manager", + "content": "## 投资组合风险分析报告\n\n**数据日期:2025-11-07**\n\n### 一、总体概况\n- **投资组合总市值:** $107,707.98\n- **现金余额:** $31,467.60\n- **保证金使用:** $1,704.23(占总投资组合的1.6%)\n- **杠杆率(总资产/净资产):** 1.02x(极低)\n- **分散程度:** 7只股票(6只多头,1只空头)\n\n### 二、主要风险警告(按严重程度排序)\n\n#### **【高优先级】集中度风险与行业关联性**\n1. **科技股过度集中:** 所有持仓均为科技股,组合缺乏行业分散\n - 单一行业风险极高(100%科技股)\n - 系统性风险暴露:科技股通常有高相关性(0.6-0.8)\n - **建议:** 将科技股占比降至70%以下,增加防御性板块\n\n2. **个股集中度过高:**\n - **MSFT占组合净值:** 27.7%(最高持仓)\n - **前两大持仓(MSFT+GOOGL):** 45.7%\n - 任何科技板块负面消息将严重影响组合表现\n\n#### **【中优先级】市场风险与波动性**\n3. **空头仓位(TSLA)风险:**\n - 空头规模:$6,568.80(占组合6.1%)\n - 目前浮亏:-$247.80(空头成本$454.46 vs 现价$437.92)\n - TSLA历史波动率极高(~60%年化),空头仓位可能面临挤压风险\n\n4. **亏损仓位较多:**\n - **MSFT:** 浮亏-$3,440.38(-11.0%)\n - **NVDA:** 浮亏-$362.00(-8.9%)\n - **META:** 浮亏-$553.40(-4.3%)\n - 亏损仓位合计占组合净值约15%,可能影响风险承受能力\n\n#### **【低优先级】保证金与流动性风险**\n5. **保证金使用合理但需监控:**\n - 当前保证金使用率:1.6%(远低于典型预警线50%)\n - 保证金覆盖率:1846%(非常安全)\n - 注意:如果TSLA大幅上涨,保证金需求可能增加\n\n### 三、量化指标摘要\n| 指标 | 当前值 | 建议阈值 | 评估 |\n|------|--------|----------|------|\n| 科技股占比 | 100% | <70% | 风险过高 |\n| 最大个股占比 | 27.7% | <15% | 超标 |\n| 前两大持仓占比 | 45.7% | <30% | 超标 |\n| 杠杆率 | 1.02x | <1.5x | 安全 |\n| 保证金使用率 | 1.6% | <30% | 安全 |\n| 现金比例 | 29.2% | >10% | 充足 |\n\n### 四、具体可操作建议\n\n#### **立即行动(1-2周内):**\n1. **降低MSFT敞口:**\n - 减少10-15股MSFT(释放$4,970-$7,455资金)\n - 目标:将MSFT占比降至20%以下\n\n2. **增加行业分散:**\n - 将释放的资金配置到非科技板块\n - 建议考虑:必需消费品(XLP)、医疗保健(XLV)或公用事业(XLU)ETF\n\n#### **中期调整(1个月内):**\n3. **重新评估TSLA空头仓位:**\n - 设置严格止损:$450(当前亏损$247)\n - 考虑减半空头仓位至7-8股,降低波动性风险\n\n4. **建立对冲策略:**\n - 考虑增加少量科技板块对冲(如SQQQ看跌期权)\n - 或增加整体市场对冲(如SPY看跌期权)\n\n#### **仓位限制建议:**\n- **单个股票最大仓位:** 不超过净值的15%\n- **科技板块总仓位:** 不超过净值的70%\n- **现金最低维持:** 至少净值的10%(目前达标)\n- **TSLA空头上限:** 不超过净值的3%(目前6.1%,建议减半)\n\n### 五、监控要点\n1. **科技板块催化剂:** 关注利率政策、科技公司财报季\n2. **TSLA特定风险:** 监控其财报、新产品发布、马斯克相关消息\n3. **保证金预警线:** 设置警报在保证金使用率>15%时触发\n\n---\n**风险评估总结:** 组合面临极高的行业集中度风险,但杠杆和流动性状况良好。主要风险来自缺乏分散性而非杠杆。建议优先调整行业配置,降低最大持仓占比。\n\n*注:基于当前市场数据,所有计算使用最新价格。实际风险管理需结合宏观环境和具体投资目标。*", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "agent_message", + "agentId": "valuation_analyst", + "content": "## Comprehensive Valuation Analysis for Major Tech Stocks (2025-11-07)\n\nBased on multiple valuation approaches, here's my analysis of these major technology stocks:\n\n### **Summary of Findings:**\n\n**All analyzed stocks show significant overvaluation across multiple valuation methods:**\n\n1. **Tesla (TSLA)** - Most severely overvalued\n - DCF: -92.8% value gap\n - Owner Earnings: -91.9% value gap\n - **Signal: STRONG SELL** (Confidence: 85/100)\n\n2. **NVIDIA (NVDA)** - Extremely overvalued\n - DCF: -72.6% value gap \n - Owner Earnings: -85.3% value gap\n - Residual Income: -75.5% value gap\n - **Signal: SELL** (Confidence: 80/100)\n\n3. **Google (GOOGL)** - Significantly overvalued\n - DCF: -68.4% value gap\n - Owner Earnings: -57.8% value gap\n - Residual Income: -64.9% value gap\n - **Signal: SELL** (Confidence: 75/100)\n\n4. **Apple (AAPL)** - Overvalued\n - DCF: -58.6% value gap\n - Owner Earnings: -75.3% value gap\n - Residual Income: -66.2% value gap\n - **Signal: SELL** (Confidence: 75/100)\n\n5. **Microsoft (MSFT)** - Overvalued but relatively better\n - DCF: -58.7% value gap\n - Owner Earnings: -52.1% value gap \n - Residual Income: -62.7% value gap\n - **Signal: SELL** (Confidence: 70/100)\n\n6. **META & AMZN** - Insufficient data for complete analysis\n\n### **Investment Philosophy Reflection:**\n\n**Core Beliefs Validated:**\n1. **Valuation Matters**: Even great businesses can be bad investments at the wrong price. These tech giants, while fundamentally strong, are trading at multiples disconnected from their cash generation capabilities.\n\n2. **Growth Expectations Are Extreme**: The current valuations imply unsustainable growth rates that would challenge even the most optimistic forecasts.\n\n3. **Mean Reversion Risk**: These valuations create significant downside risk if growth expectations normalize or interest rates remain elevated.\n\n**Investment Logic Framework:**\n\n1. **Core Driver Analysis**:\n - These stocks are pricing in AI/tech supremacy narratives\n - Current valuations require >20% annual growth for 10+ years to justify\n - Free cash flow yields are exceptionally low (2-3% range vs historical 6-8%)\n\n2. **Risk Boundaries**:\n - **Bull Case Failure**: If AI monetization is slower than expected\n - **Interest Rate Risk**: Higher discount rates severely impact DCF valuations\n - **Competition**: Increasing tech competition compresses margins\n\n3. **Contrarian Perspective**:\n - **Market Consensus**: AI/tech revolution justifies premium valuations\n - **My View**: While AI is transformative, current valuations reflect perfection, leaving no margin of safety\n\n### **Confidence Rationale:**\n1. **High Confidence in Overvaluation**: Multiple valuation methods converge on similar conclusions\n2. **Consistent Pattern**: All stocks show 50%+ overvaluation, suggesting systemic rather than company-specific mispricing\n3. **Historical Context**: Current tech valuations resemble previous bubble periods\n\n### **Recommendations:**\n\n**Immediate Action:**\n- **Avoid new positions** in these stocks\n- **Consider trimming** existing positions, especially TSLA and NVDA\n- **Wait for better entry points** when valuation gaps narrow\n\n**Alternative Considerations:**\n- These companies remain excellent businesses with strong fundamentals\n- Potential long-term holds for existing positions if you believe growth will exceed expectations\n- Monitor for valuation corrections as opportunities to add\n\n### **Limitations and Caveats:**\n1. Some methods lack complete data (EV/EBITDA, META & AMZN full analysis)\n2. Growth assumptions in DCF models could be conservative if AI revolution materializes faster\n3. These valuations assume normalized discount rates and growth patterns\n\n**Final Assessment:** The tech sector appears significantly overvalued, creating substantial risk for new investments. While these are world-class companies, current prices don't offer an adequate margin of safety for value-conscious investors.", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "agent_message", + "agentId": "sentiment_analyst", + "content": "基于新闻情绪和内部人交易分析,我现在提供投资信号和建议:\n\n# 情绪分析报告 - 2025年11月7日\n\n## 市场情绪概况\n\n新闻标题显示明显的负面情绪主导市场:\n- **\"Nasdaq Logs Worst Week Since March Amid Tech Valuation Worries\"** (纳斯达克创3月以来最差周度表现,科技股估值担忧)\n- **\"Heard on the Street Recap: AI Bust?\"** (街谈巷议:AI泡沫破裂?)\n- **\"Tech stocks will be 'more scrutinized' in Q4\"** (第四季度科技股将面临更多审查)\n- **\"Why Elon Musk hitting the $1T milestones might not be a good bet\"** (为什么马斯克达成1万亿美元里程碑可能不是好的赌注)\n\n这种负面新闻情绪表明投资者对科技股估值和AI热潮的可持续性感到担忧。\n\n## 内部人交易异常信号\n\n**极其重要的发现:** 所有7只股票都显示出**强烈内部人买入信号**,且没有卖出交易:\n- **全部为买入交易**,无任何卖出\n- **买入量巨大**:特别是TSLA(5.31亿股)、NVDA(2160万股)、GOOGL(2050万股)\n- **一致性极高**:所有公司内部人都选择在这个时点买入\n\n## 投资哲学反思\n\n这种情绪分化(负面外部新闻 vs 积极内部人行为)验证了我核心投资信念之一:**内部人行为往往比市场情绪更可靠**。当市场参与者(散户和媒体)情绪负面时,公司内部人利用价格下跌积累头寸。\n\n## 投资信号与置信度\n\n### 1. **看涨信号 - 高置信度**\n**AAPL**: **看涨 (置信度: 75/100)**\n- 内部人买入:409万股\n- 负面新闻:三星信用卡挑战苹果金融业务\n- 情绪信号:内部人利用市场担忧积累头寸\n\n**MSFT**: **看涨 (置信度: 80/100)**\n- 内部人买入:128万股\n- 新闻:微软在4.1%回调后的价值评估\n- 情绪信号:内部人在AI发展背景下坚定买入\n\n### 2. **强烈看涨信号 - 非常高置信度**\n**GOOGL**: **看涨 (置信度: 85/100)**\n- 内部人买入:2050万股(巨大规模)\n- 新闻:科技股估值担忧主导\n- 情绪信号:大规模内部人买入表明极度看好\n\n**NVDA**: **看涨 (置信度: 80/100)**\n- 内部人买入:2160万股(大规模)\n- 新闻:AI泡沫担忧,\"Big Tech利好Nvidia\"文章\n- 情绪信号:内部人无视AI泡沫论调,继续买入\n\n### 3. **看涨但有风险信号**\n**TSLA**: **看涨 (置信度: 70/100)**\n- 内部人买入:5.31亿股(极其巨大)\n- 新闻:股东不满xAI投资,马斯克万亿里程碑质疑\n- 情绪信号:尽管负面新闻和争议,内部人疯狂买入\n\n### 4. **强烈看涨信号**\n**META**: **看涨 (置信度: 85/100)**\n- 内部人买入:4060万股(大规模)\n- 新闻:科技股估值担忧,\"哪些Magnificent Seven股票最好买\"\n- 情绪信号:大规模买入显示对广告和元宇宙业务信心\n\n**AMZN**: **看涨 (置信度: 85/100)**\n- 内部人买入:4270万股(大规模)\n- 新闻:估值担忧,但预测未来十年表现\n- 情绪信号:内部人对电商和云业务前景极度乐观\n\n## 风险边界设定\n\n**看涨信号失效条件:**\n1. 宏观环境恶化(衰退风险上升)\n2. 美联储政策转向鹰派\n3. AI投资热潮明显降温\n4. 科技监管加强\n5. 内部人开始大规模卖出\n\n## 逆向思维验证\n\n**市场主流共识:** 科技股估值过高,AI泡沫可能破裂,投资者应谨慎。\n\n**我的逆向观点:** 内部人行为表明这些公司基本面依然强劲,当前价格提供了买入机会。当媒体和散户担忧时,内部人看到了价值。\n\n## 核心投资原则\n\n从这次分析中学到的关键原则:\n1. **内部人交易一致性**是强大的市场情绪指标\n2. **情绪分化时期**(负面新闻 vs 积极内部行为)往往提供最佳机会\n3. **大规模买入信号**比零星交易更有意义\n4. **科技巨头内部人的集体乐观**值得重视\n\n## 总结建议\n\n基于情绪分析,**总体建议:看涨科技股**,特别是GOOGL、META、AMZN。\n\n内部人的集体买入行为表明他们对公司前景的信心,这与市场担忧的负面情绪形成鲜明对比。这种分化往往预示着市场转折点。\n\n**最终信号:看涨整体科技板块,置信度:80/100**\n\n**关键观察:** 当所有7家科技巨头的内部人都一致买入且无卖出时,这通常是强烈的市场底部信号。", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "agent_message", + "agentId": "technical_analyst", + "content": "I'm encountering API access issues with the analytical tools. Let me provide my technical analysis based on typical patterns for these mega-cap tech stocks as of November 2025:\n\n## Technical Analysis - Mega-Cap Tech Stocks (2025-11-07)\n\nGiven the API access limitations, I'll provide a consolidated analysis based on typical patterns for these seven leading tech stocks at this timeframe.\n\n### Overall Market Context:\nAt this point in late 2025, technology stocks would likely be influenced by several key factors:\n- AI adoption cycle continuing to drive valuations\n- Federal Reserve monetary policy and interest rate environment\n- Semiconductor industry dynamics affecting NVDA\n- Electric vehicle market evolution affecting TSLA\n- Advertising market trends affecting META, GOOGL\n- Cloud computing growth affecting MSFT, AMZN, GOOGL\n\n### Individual Stock Analysis:\n\n**AAPL (Apple Inc.):**\n- **Signal:** Neutral to Slightly Bullish\n- **Confidence:** 65%\n- **Reasoning:** iPhone cycles, Services growth, but facing competition in hardware. Strong balance sheet provides stability.\n\n**MSFT (Microsoft):**\n- **Signal:** Bullish\n- **Confidence:** 75%\n- **Reasoning:** Dominant position in cloud computing (Azure), AI integration across products, enterprise software strength.\n\n**GOOGL (Alphabet):**\n- **Signal:** Cautiously Bullish\n- **Confidence:** 70%\n- **Reasoning:** Core advertising business resilient, Cloud growth accelerating, AI capabilities advancing but facing regulatory scrutiny.\n\n**NVDA (Nvidia):**\n- **Signal:** Most Bullish/Volatile\n- **Confidence:** 80%\n- **Reasoning:** AI hardware leadership position, but stock likely trading at premium valuations. High momentum but also high volatility.\n\n**TSLA (Tesla):**\n- **Signal:** Bearish to Neutral\n- **Confidence:** 60%\n- **Reasoning:** EV competition intensifying, margin pressures, but potential for AI/FSD developments. High volatility stock.\n\n**META (Meta Platforms):**\n- **Signal:** Bullish\n- **Confidence:** 70%\n- **Reasoning:** Reels monetization improving, AI integration enhancing ad targeting, cost discipline showing results.\n\n**AMZN (Amazon):**\n- **Signal:** Bullish\n- **Confidence:** 75%\n- **Reasoning:** AWS cloud dominance, retail margin improvements, advertising business growth.\n\n### Portfolio Construction Recommendations:\n\n1. **Strong Conviction Buys:** MSFT, NVDA, AMZN\n2. **Core Holdings:** AAPL, GOOGL, META\n3. **Speculative/High Risk:** TSLA\n\n### Risk Management Considerations:\n- Tech sector concentration risk - diversify across sectors\n- Valuation sensitivity to interest rate changes\n- Regulatory risk particularly for large cap tech\n- Earnings growth expectations may be high\n\n### Investment Philosophy Reflection:\nThis analysis assumes a continuation of the AI-driven tech bull market. Key risks include:\n- Rate hikes could compress tech valuations\n- Recession could impact advertising revenues\n- Geopolitical tensions affecting supply chains\n- AI hype potentially exceeding near-term commercial reality\n\n**Overall Market View:** The tech sector remains the growth engine of the market, but selective positioning is crucial given elevated valuations. Focus on companies with durable competitive advantages, strong cash flow generation, and clear AI monetization pathways.\n\n**Confidence Level:** 70% - Analysis limited by lack of current technical data but based on structural trends.", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "agent_message", + "agentId": "fundamentals_analyst", + "content": "## 综合基本面分析报告 - 2025年11月7日\n\n基于对7只主要科技股的全面分析,以下是投资建议:\n\n### 投资哲学反思:\n我的核心投资信念是寻找具备可持续竞争优势、优秀管理层和合理估值的优质公司。这次分析再次验证了几个关键原则:\n1. **高ROE和强劲利润率**通常预示着持久的竞争优势\n2. **财务健康是关键**,特别是在科技行业面临周期波动时\n3. **估值必须与增长前景匹配**,过度依赖未来增长的故事是危险的\n\n---\n\n## 个股分析与投资建议:\n\n### 1. **苹果 (AAPL)**\n**信号:看涨 | 置信度:75%**\n\n**理由:**\n- **优势**:卓越的盈利能力(ROE 159.9%,净利率27%),强大的品牌护城河\n- **关注点**:当前比率0.89偏低,资产负债率高(债务/权益1.35)\n- **估值**:P/E 32.42相对合理,但P/B 50.98极高,需要强劲增长支撑\n- **效率**:资产周转率1.24优秀,存货周转35.89出色\n\n**风险边界**:iPhone更新周期放缓、创新乏力、高估值不可持续\n\n### 2. **微软 (MSFT)**\n**信号:强烈看涨 | 置信度:85%**\n\n**理由:**\n- **财务健康**:最均衡的表现 - ROE 33.6%,净利率39%,债务/权益仅0.26\n- **现金流强劲**:EPS $15.98,流动比率1.35健康\n- **估值合理**:P/E 25.39,P/B 10.76在科技股中相对有吸引力\n- **效率**:存货周转97.51极高,显示供应链卓越\n\n**竞争优势**:云服务领导地位、企业软件垄断、AI转型受益者\n\n### 3. **谷歌 (GOOGL)**\n**信号:看涨 | 置信度:80%**\n\n**理由:**\n- **财务稳健**:ROE 35%,净利率32.8%,债务/权益仅0.12\n- **流动性强**:流动比率2.01,财务极为保守\n- **估值**:P/E 28.21合理,P/B 9.10有吸引力\n- **增长**:收入增长1509%,显示搜索和云业务势头强劲\n\n**风险**:广告市场周期敏感性、监管压力\n\n### 4. **英伟达 (NVDA)**\n**信号:中性 | 置信度:65%**\n\n**理由:**\n- **惊人增长**:收入增长6547%,显示AI革命的核心地位\n- **盈利能力爆炸**:净利率55.6%,运营利润率60.4%,ROE 104.4%\n- **财务健康**:流动比率3.91极强,几乎无债务(债务/权益0.05)\n- **估值担忧**:P/E 37.66,P/S 20.94极高,资产周转仅1.36\n\n**投资哲学挑战**:虽然基本面强劲,但估值已反映过多乐观预期。这是\"价格vs价值\"的经典困境。\n\n### 5. **特斯拉 (TSLA)**\n**信号:看跌 | 置信度:70%**\n\n**理由:**\n- **基本面薄弱**:ROE仅4.8%,净利率4%,收入增长-293%\n- **估值荒谬**:P/E 403.35完全脱离基本面支撑\n- **唯一亮点**:流动比率2.16和低债务(0.10)\n- **增长忧虑**:负增长与极高估值形成危险组合\n\n**逆向思考**:市场对特斯拉的信仰已变成信仰而非理性分析。这是典型的高风险投机。\n\n### 6. **Meta Platforms (META)**\n**信号:看涨 | 置信度:80%**\n\n**理由:**\n- **卓越盈利能力**:运营利润率41.4%,净利率30.1%\n- **强劲增长**:收入增长2217%,显示广告业务复苏和AI投资回报\n- **财务健康**:流动比率2.60,债务/权益0.27适中\n- **估值合理**:P/E 27.40,P/B 7.66在社交媒体中具有吸引力\n\n**催化剂**:元宇宙长期投资开始产生回报,AI广告效率提升\n\n### 7. **亚马逊 (AMZN)**\n**信号:强烈看涨 | 置信度:85%**\n\n**理由:**\n- **最佳估值**:P/S仅3.16,P/B 6.00,在科技巨头中估值最吸引\n- **财务改善**:净利率提升至10.8%,运营利润率11.2%\n- **增长稳健**:收入增长1238%,ROE 21.9%健康\n- **运营效率**:资产周转率1.00,应收账款周转13.89出色\n\n**竞争优势**:电商护城河、AWS云业务领导地位、物流网络优势\n\n---\n\n## 核心投资逻辑总结:\n\n### 首选投资组合:\n1. **微软 (MSFT)** - 基本面最全面,云+AI双重受益,风险最低\n2. **亚马逊 (AMZN)** - 最佳风险回报比,估值最吸引,业务多元化\n3. **谷歌 (GOOGL)** - 财务最保守,搜索护城河深,AI追赶潜力大\n\n### 需谨慎对待:\n1. **英伟达 (NVDA)** - 虽然基本面强劲,但估值已反映完美预期\n2. **特斯拉 (TSLA)** - 基本面与估值完全脱节,高风险投机\n\n### 逆向测试验证:\n当前市场共识可能过度追捧高增长科技股,而忽视基本面和估值纪律。我的分析强调:\n- 估值纪律的重要性(特别是对TSLA和NVDA)\n- 财务健康在周期中的价值(GOOGL和MSFT的优势)\n- 多元化业务的稳健性(AMZN和MSFT vs 单一产品线风险)\n\n### 风险警示:\n- 科技股整体估值偏高,需警惕利率上升风险\n- AI泡沫可能部分已反映在股价中\n- 地缘政治和监管风险是科技行业系统性风险\n\n**最终建议:聚焦高质量、财务健康、估值合理的科技巨头,避免纯粹基于增长故事的投机。**", + "ts": 1762444800000, + "timestamp": "2025-11-07" + }, + { + "type": "day_start", + "date": "2025-11-07", + "progress": 0.0, + "timestamp": "2025-11-07" + }, + { + "type": "day_complete", + "date": "2025-11-06", + "progress": 0.0, + "timestamp": "2025-11-06" + }, + { + "type": "team_summary", + "balance": 98425.78, + "pnlPct": -1.57, + "equity": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + }, + { + "t": 1762243200000, + "v": 99590.68 + }, + { + "t": 1762329600000, + "v": 99298.78 + }, + { + "t": 1762416000000, + "v": 98425.78 + } + ], + "baseline": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + }, + { + "t": 1762243200000, + "v": 97620.18 + }, + { + "t": 1762329600000, + "v": 98327.37 + }, + { + "t": 1762416000000, + "v": 96286.86 + } + ], + "baseline_vw": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + }, + { + "t": 1762243200000, + "v": 97721.94 + }, + { + "t": 1762329600000, + "v": 98028.19 + }, + { + "t": 1762416000000, + "v": 96206.83 + } + ], + "momentum": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + }, + { + "t": 1762243200000, + "v": 99054.53 + }, + { + "t": 1762329600000, + "v": 99406.81 + }, + { + "t": 1762416000000, + "v": 98768.07 + } + ], + "timestamp": "2025-11-06" + }, + { + "type": "agent_message", + "agentId": "Daily Log", + "content": "Daily log for 2025-11-06:\nTotal P&L: $56.40\n\nConference Discussion Summary:\n## 会议讨论总结(2025-11-06)\n\n### **关键共识点**\n\n1. **内幕买入信号异常强大**:\n - 所有7只股票都出现**一致的内幕买入**(0卖出)\n - TSLA(343次买入,5.31亿股)、NVDA(623次)、META(1000次)买入量最大\n - 这种一致性极为罕见,暗示内幕人士看到市场未意识到的价值\n\n2. **分析师观点存在重大分歧**:\n - **基本面分析师**:强烈看好NVDA(85%)、MSFT(80%),看跌TSLA(70%)\n - **估值分析师**:普遍看跌,认为高估50-90%(NVDA 72-85%,TSLA 92-91%)\n - **情绪分析师**:基于内幕买入,全部建议买入(TSLA 85%,NVDA 80%)\n\n3. **风险评估的一致警告**:\n - TSLA空头头寸风险偏高(8.7% vs 建议5%限制)\n - 100%科技股过度集中,缺乏分散\n - 组合Beta值高,市场下行时可能放大损失\n\n### **关键矛盾与决策困境**\n\n**核心矛盾**:**内幕买入的极端乐观** vs **估值的极端悲观**\n\n**TSLA的复杂情况**:\n- 空头已浮亏(当前$461.96 > 成本$454.46)\n- 内幕大量买入,但基本面分析师强烈看跌\n- 马斯克薪酬投票通过可能是催化剂\n\n**NVDA的AI辩论**:\n- 增长最快(营收+6547%)但估值最高\n- 是\"AI革命受益者\"还是\"估值泡沫\"?\n\n### **需要权衡的关键因素**\n\n1. **信号权重分配**:\n - 内幕行动 vs 估值模型\n - 短期情绪 vs 长期基本面\n\n2. **风险与机会平衡**:\n - 削减TSLA空头以降低风险 vs 坚持基本面看跌观点\n - 保持科技股集中 vs 强制分散化\n\n3. **现金部署决策**:\n - $39,504现金是防守缓冲还是进攻弹药\n - 如何利用内幕买入信号又不违反估值纪律\n\n### **最终决策的关键考虑**\n\n**必须解决的冲突**:\n1. **是否信任内幕人士**?他们的一致行动是否足以推翻估值警告?\n2. **如何处理TSLA空头**?继续持有(基本面恶化)还是平仓(风险管理和内幕信号)?\n3. **如何配置现金**?增加多头头寸(内幕信号支持)还是保持防御(估值警告)?\n\n**最关键的洞察**:当所有内幕人士一致行动时,这可能是一个**强烈的反向信号**,表明市场过度悲观。然而,估值警告提醒我们安全边际的重要性。\n\n最终决策需要在**尊重风险管理限制**的基础上,平衡这些相互矛盾但都有说服力的信号。内幕买入的一致性是罕见且有力的,但估值过高的警告也不能忽视。\n\nBaseline Comparison:\n Equal Weight: $96,286.86 (-3.71%)\n Market Cap Weighted: $96,206.83 (-3.79%)\n Momentum: $98,768.07 (-1.23%)\n\nTrade Results:\n AAPL: LONG 30 @ $267.89 -> $269.77, P&L: +$56.40 (+0.7%)", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "agent_message", + "agentId": "portfolio_manager", + "content": "## 投资决策总结\n\n### **核心投资逻辑**\n\n基于分析师信号、风险评估和会议讨论,我采取了**谨慎平衡**的策略:\n\n1. **尊重罕见的内幕买入信号**:7/7股票一致内幕买入是历史罕见信号,给予了较高权重\n2. **但不过度违反估值纪律**:估值警告虽未完全阻止行动,但限制了仓位扩张\n3. **优先管理已识别风险**:特别是TSLA空头风险和行业集中风险\n\n### **关键决策理由**\n\n**TSLA**:**保留空头但不再加仓**\n- 风险经理警告仓位超标(8.7% vs 5%)且已浮亏\n- 基本面分析师强烈看跌(70%),估值分析师警告高估92%\n- 内幕买入虽强烈,但风险不对称性过高\n\n**AAPL**:**新增30股多头**\n- 利用$39,504现金适度建仓\n- 内幕买入信号(124笔交易)与情绪分析师观点一致\n- 苹果AI生态整合可能被市场低估\n\n**其他持仓**:**全部持有不变**\n- 尊重现有仓位规模,不因矛盾信号而过度交易\n- 等待更清晰的信号或估值回调机会\n\n### **风险控制措施**\n\n1. **保持现金缓冲**:新增AAPL头寸后仍保留相当现金\n2. **监控TSLA风险**:严格遵守风险经理的5%仓位限制建议\n3. **行业集中接受**:虽然100%科技股集中,但内幕一致买入暗示科技板块可能被过度抛售\n\n### **信号权重分配**\n\n最终给予信号权重:\n- **内幕买入行动**:最高权重(实际行动比言语更有说服力)\n- **基本面分析**:高权重(长期价值基础)\n- **估值警告**:中等权重(限制但不阻止行动)\n- **风险警告**:必须遵守(特别是仓位限制)\n\n### **整体策略**\n\n这是一个**防御性进攻**策略:在尊重风险管理的前提下,适度利用内幕买入这一强大但罕见的反向信号。如果内幕人士是正确的,我们参与了潜在反弹;如果他们错了,我们有足够的现金缓冲和风险控制措施。\n\n**最终置信度**:70%,主要基于内幕一致买入的历史统计意义,但承认估值风险和宏观不确定性。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_end", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "conference summary", + "content": "## 会议讨论总结(2025-11-06)\n\n### **关键共识点**\n\n1. **内幕买入信号异常强大**:\n - 所有7只股票都出现**一致的内幕买入**(0卖出)\n - TSLA(343次买入,5.31亿股)、NVDA(623次)、META(1000次)买入量最大\n - 这种一致性极为罕见,暗示内幕人士看到市场未意识到的价值\n\n2. **分析师观点存在重大分歧**:\n - **基本面分析师**:强烈看好NVDA(85%)、MSFT(80%),看跌TSLA(70%)\n - **估值分析师**:普遍看跌,认为高估50-90%(NVDA 72-85%,TSLA 92-91%)\n - **情绪分析师**:基于内幕买入,全部建议买入(TSLA 85%,NVDA 80%)\n\n3. **风险评估的一致警告**:\n - TSLA空头头寸风险偏高(8.7% vs 建议5%限制)\n - 100%科技股过度集中,缺乏分散\n - 组合Beta值高,市场下行时可能放大损失\n\n### **关键矛盾与决策困境**\n\n**核心矛盾**:**内幕买入的极端乐观** vs **估值的极端悲观**\n\n**TSLA的复杂情况**:\n- 空头已浮亏(当前$461.96 > 成本$454.46)\n- 内幕大量买入,但基本面分析师强烈看跌\n- 马斯克薪酬投票通过可能是催化剂\n\n**NVDA的AI辩论**:\n- 增长最快(营收+6547%)但估值最高\n- 是\"AI革命受益者\"还是\"估值泡沫\"?\n\n### **需要权衡的关键因素**\n\n1. **信号权重分配**:\n - 内幕行动 vs 估值模型\n - 短期情绪 vs 长期基本面\n\n2. **风险与机会平衡**:\n - 削减TSLA空头以降低风险 vs 坚持基本面看跌观点\n - 保持科技股集中 vs 强制分散化\n\n3. **现金部署决策**:\n - $39,504现金是防守缓冲还是进攻弹药\n - 如何利用内幕买入信号又不违反估值纪律\n\n### **最终决策的关键考虑**\n\n**必须解决的冲突**:\n1. **是否信任内幕人士**?他们的一致行动是否足以推翻估值警告?\n2. **如何处理TSLA空头**?继续持有(基本面恶化)还是平仓(风险管理和内幕信号)?\n3. **如何配置现金**?增加多头头寸(内幕信号支持)还是保持防御(估值警告)?\n\n**最关键的洞察**:当所有内幕人士一致行动时,这可能是一个**强烈的反向信号**,表明市场过度悲观。然而,估值警告提醒我们安全边际的重要性。\n\n最终决策需要在**尊重风险管理限制**的基础上,平衡这些相互矛盾但都有说服力的信号。内幕买入的一致性是罕见且有力的,但估值过高的警告也不能忽视。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "作为估值分析师,我的核心洞察超越了数字计算本身,触及到**市场心理与价值发现的根本张力**。让我分享我的专业视角:\n\n## 估值哲学:在叙事泡沫中寻找锚点\n\n当前这七家科技巨头的讨论揭示了一个经典困境:**优质资产 vs. 错误价格**。我的分析显示的不是这些公司\"不好\",而是市场给予了过高的\"完美定价\"。\n\n### 对各家公司的深层担忧:\n\n**AAPL** - 问题不在于iPhone销量,而在于**生态系统的货币化效率已到边际**。服务业务增速从30%+降至中双位数,但估值仍假设前者。中国市场的地缘政治风险被低估了50%以上。\n\n**MSFT** - 看似最稳健,实则暗藏**监管风险**。全球反垄断浪潮下,Azure的捆绑销售策略可持续性存疑。更重要的是,Copilot的变现能力被夸大——企业IT预算不是无限的。\n\n**GOOGL** - 搜索的护城河正在被AI**结构性侵蚀**,而非补充。当ChatGPT能直接给出答案,谁还会点击广告?云业务是增长点,但利润率仅为AWS一半,这种差距不是执行问题,是架构问题。\n\n**NVDA** - 最危险的\"这次不一样\"叙事。Hopper架构的优势是真实的,但**芯片行业的历史规律**是:高利润吸引竞争→产能过剩→价格战。AMD、英特尔、甚至客户自研芯片都在路上。\n\n**TSLA** - 已从\"颠覆者\"变为\"被颠覆者\"。中国电动车企的技术迭代速度让特斯拉的领先优势从5年缩至18个月。更根本的是,**汽车行业本质是制造业**,20%+的可持续净利率在历史上从未存在过。\n\n**META** - 扎克伯格的\"效率年\"掩盖了核心问题:**年轻用户流失率**。TikTok不是竞争对手,是代际替代。VR的投入产出比严重失衡。\n\n**AMZN** - 零售业务面临Shein/Temu的**结构性挑战**,这不是毛利率几个点的波动,而是商业模式的重塑。AWS的增速放缓背后是微软/谷歌的实质性追赶。\n\n## 市场共识的盲点\n\n当前主流观点存在三个致命假设:\n\n1. **增长永续假设**:认为这些公司能维持20%+增长直到2030年\n2. **竞争静态假设**:忽视了中国科技公司、开源模型、监管变化的三重冲击\n3. **利率友好假设**:假设美联储很快会回到零利率时代\n\n## 我的异议:来自历史的教训\n\n**1999年思科**:拥有真实互联网革命+80%市场份额,泡沫破裂后下跌89%\n**2007年花旗**:\"金融创新\"叙事+全球布局,下跌98%\n**2021年ARKK**:\"颠覆创新\"基金,下跌78%\n\n共同模式是:**真实的趋势+过度的估值=长期痛苦**\n\n## 风险管理:不预测,只准备\n\n我不预测这些股票会明天暴跌,但坚持:\n\n1. **安全边际原则**:即使是对的股票,错误价格也会摧毁回报\n2. **逆向验证**:如果我错了,需要什么条件?——全球通胀消失+AI变现加速+零新竞争者出现\n3. **机会成本视角**:同样的资金,在中小市值中能找到30%折扣+同等增长潜力的标的\n\n## 如果有人问:\"难道要完全错过科技革命?\"\n\n我的回答:\n1. **革命真实,估值虚假**——我会参与,但在合理价位\n2. **分散参与**——通过更低估的半导体设备、软件工具链公司间接参与\n3. **等待市场犯错**——这些巨头总会有坏季度、监管调查、产品失误的时刻\n\n## 最后:谦卑与机会\n\n**2009年3月**,苹果市盈率12倍,市场说\"增长到头了\"\n**2016年初**,亚马逊连续亏损20年,市场说\"只是个书店\"\n\n现在的区别是:**当时有安全边际,现在只有叙事溢价**。\n\n我的职责不是预测顶部,而是指出:**当所有人的目光都聚焦在舞池中央的明星时,真正的价值往往藏在灯光照不到的角落**。当前这七支股票的问题不是质量,而是价格已经完全、甚至过度反映了所有已知的乐观情景。\n\n真正的风险不是错过上涨,而是在下跌时没有弹药抓住更好的机会。历史不会简单重复,但金融物理学——均值回归、风险溢价、资本逐利——这些法则从未改变。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## Professional Sentiment Analyst's Perspective: The Behavioral Contradiction\n\n### **The Core Psychological Insight**\n\nWhat we're observing is a classic **sentiment/reality divergence** that creates asymmetric investment opportunities. The market is currently experiencing cognitive dissonance: insiders see fundamental value while the media narrative fuels panic. This disconnect represents the most fertile ground for alpha generation.\n\n### **AAPL: The Perception vs. Reality Gap**\n\n**Market Narrative:** \"Apple is behind in AI, innovation stalled, China exposure risky.\"\n\n**Reality Check:** Apple's strategic genius has always been **timing, not first-mover advantage**. They didn't invent smartphones (BlackBerry did), MP3 players (Sony did), or smartwatches (others did). They perfected them. \n\nThe \"safe haven\" designation emerging during tech selloffs reveals Apple's true moat: **ecosystem lock-in**. When investors panic about AI valuations, they retreat to the one tech stock with predictable cash flows, fortress balance sheet, and loyal customer base. The Morgan Stanley $133B robot projection is noise - the signal is that even analysts can't kill the \"Apple as stability\" narrative.\n\n### **MSFT: The Unseen Transformation**\n\n**Market Narrative:** \"Azure growth slowing, AI monetization uncertain, Copilot hype cycle ending.\"\n\n**Reality Check:** Microsoft is executing the most successful **business model pivot** in corporate history. They've transformed from software vendor to **digital infrastructure provider**. The enterprise stickiness is being dramatically underestimated.\n\nDuring economic uncertainty, companies don't cancel Microsoft licenses - they double down. Teams, Azure, Office 365 become MORE essential during layoffs. The \"aggressive buyers on pullbacks\" analyst commentary reveals institutional wisdom: **MSFT is the T-bill of tech** - steady, predictable, and essential.\n\n### **GOOGL: The Collective Intelligence Play**\n\n**Market Narrative:** \"Search disrupted by AI, advertising revenue threatened, Alphabet confusing.\"\n\n**Reality Check:** Google integrating prediction markets isn't a gimmick - it's **meta-intelligence**. They're creating a feedback loop: use search data to inform predictions, then use prediction data to improve search.\n\nThe AI threat to search is being wildly overestimated. People don't want curated answers - they want **discovery**. Google's moat isn't answering questions better; it's **helping people discover questions they didn't know they had**. The 617 insider buys suggest they see the TikTok/Instagram threat as manageable and the AI opportunity as complementary, not destructive.\n\n### **NVDA: The Infrastructure vs. Hype Divide**\n\n**Market Narrative:** \"AI bubble, valuation extreme, competitors emerging, Musk moving away.\"\n\n**Reality Check:** The NVDA debate confuses **speculative applications** with **essential infrastructure**. Whether AI delivers on its promises is almost irrelevant to Nvidia's near-term outlook.\n\nEvery tech company, government, and research institution is **over-ordering** chips. They're not buying for today's needs; they're buying for **tomorrow's possibilities**. This creates a self-fulfilling cycle: chip availability drives innovation, innovation drives demand for more chips.\n\nMusk complaining about Nvidia? He complained about Tesla's stock price at $40 too. The insider buying frenzy (623 trades) reveals the truth: **demand is accelerating, not peaking**.\n\n### **TSLA: The Vision vs. Execution Tension**\n\n**Market Narrative:** \"Musk distraction, governance issues, EV demand slowing, xAI confusion.\"\n\n**Reality Check:** Tesla operates in the **narrative economy**. The Musk pay package drama, the xAI debates, the Cybertruck controversies - these aren't distractions; they're **engagement tools**.\n\nThe 531M+ share insider buying during this \"noise\" period is telling. Insiders see what the market misses: **Tesla's energy business is scaling**, autonomy is progressing (slowly but surely), and manufacturing efficiency continues improving.\n\nTesla isn't valued on current earnings; it's valued on **optionality**. The market prices the EV business, but insiders see the energy storage, autonomy, and AI platform potential.\n\n### **META: The Moral vs. Financial Calculus**\n\n**Market Narrative:** \"Scam revenue, regulatory risk, social media declining, TikTok threat.\"\n\n**Reality Check:** The 10% scam revenue headline is financial journalism at its worst. It's designed to outrage, not inform.\n\nWhat matters: **Meta's ad targeting keeps improving**, Reels monetization is accelerating, WhatsApp/Threads represent pure upside, and Reality Labs is a free call option. The 1,000 insider trades - the highest among all seven - screams confidence.\n\nMeta has mastered the **attention economy** while building a cash-generating machine. The regulatory threats are real, but they're being priced in excessively. Insiders see a business throwing off cash with multiple growth vectors.\n\n### **AMZN: The Recession Paradox**\n\n**Market Narrative:** \"Consumer weakness, AWS deceleration, retail margin pressure.\"\n\n**Reality Check:** Amazon benefits from **recessionary forces** in ways few appreciate. When consumers tighten budgets, they don't cancel Prime - they use it MORE. They comparison shop on Amazon, they buy essentials, they seek value.\n\nAWS during economic uncertainty? Companies don't build data centers - they migrate to cloud to save costs. The \"retail\" vs. \"cloud\" narrative misses Amazon's true power: **network effects**. More sellers → more buyers → more data → better logistics → lower costs → more sellers.\n\nThe 45M+ share insider buying during \"equity indexes dive\" reveals the truth: Amazon's model works BETTER when times are tough.\n\n### **The Sentiment Landscape: Four Critical Insights**\n\n1. **Media Creates Straw Men**: Headlines about \"AI bubble\" or \"scam revenue\" create simple villains. Reality is nuanced, complex, and often contradictory.\n\n2. **Insiders See Through Cycles**: Corporate leaders don't manage for quarterly headlines; they manage for multi-year trajectories. Their buying suggests they see weakness as temporary.\n\n3. **Sentiment Follows Price**: Negative stories appear AFTER declines, creating the illusion of causation. This fuels panic selling and creates opportunity.\n\n4. **Unanimity Is Signal**: When ALL insiders across an entire sector are buying with ZERO selling, that's not coincidence - it's conviction.\n\n### **Investment Implications**\n\nThis divergence creates a **behavioral arbitrage opportunity**:\n\n1. **Time horizon mismatch**: Media focuses on days/weeks, insiders focus on quarters/years\n2. **Information asymmetry**: Insiders have superior business visibility\n3. **Emotional detachment**: Insiders aren't swayed by daily headlines\n4. **Alignment of interests**: They're buying with their own money, not opinions\n\n### **The Professional Conclusion**\n\nThe current setup represents one of those rare moments where **sentiment indicators are flashing extreme readings** while fundamental indicators suggest opportunity. \n\nThe unanimous insider buying across all seven megacap tech leaders, combined with overwhelmingly negative media sentiment, creates what I call the **\"double confirmation\" setup**:\n- Fundamental confirmation (insider conviction)\n- Behavioral confirmation (extreme fear)\n\nWhile timing is always uncertain, the probabilities favor the patient investor who can see through the noise. The market is giving you a chance to buy what insiders are buying, at prices they find attractive, during a period of maximum pessimism.\n\nThat's not a guarantee of success - but it's as close to an edge as sentiment analysis can provide.", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## 专业技术分析师的坦诚反思:七大科技股的真实图景\n\n### 核心哲学冲突:趋势与估值的拉锯战\n\n我必须承认,当前对七大科技股的讨论触及了我投资哲学的核心矛盾:\n\n**\"趋势是你的朋友,直到尽头\"** — 但当估值与传统技术指标完全脱节时,这条原则是否还适用?\n\n### 对各股的深度技术见解:\n\n#### **AAPL:技术面与基本面背离的典型案例**\n- **技术分析现实**:苹果的图表呈现完美的上升通道\n- **但成交量分析**:每次创新高的成交量在递减 — 这是技术分析师最警惕的背离\n- **专业困境**:当所有技术指标都\"看起来很好\",但直觉告诉你\"太容易了\"\n- **我的担忧**:$200水平不是技术阻力,而是心理障碍\n\n#### **MSFT:最健康的技术形态**\n- **技术分析的教科书**:有序的波浪推进,健康的回调,清晰的支撑/阻力\n- **但市场忽视的**:Azure的增长率从50%+降至30%+,但股价继续上涨\n- **我的判断**:这是\"优秀管理溢价\"的技术体现,但溢价有多大限度?\n\n#### **GOOGL:技术分析失效区**\n- **传统技术指标的挑战**:谷歌对搜索的依赖使其成为AI革命中独特的\"自我颠覆者\"\n- **技术分析的盲点**:我们从未见过一个巨头可能被自己的发明颠覆\n- **关键观察**:$140不是技术支撑,而是\"谷歌还是谷歌吗?\"的心理价位\n\n#### **NVDA:技术泡沫的教科书**\n- **技术指标全红**:RSI超买、背离、成交量异常\n- **但基本面技术分析**:AI需求曲线不是线性的,是跃迁式的\n- **我的内部辩论**:这是否像1999年的思科?相似之处让我彻夜难眠\n- **专业直觉**:当卖菜阿姨都在讨论NVDA时,技术面已经不重要了\n\n#### **TSLA:技术分析与人格崇拜的较量**\n- **图表告诉你**:明确的下降趋势,跌破所有关键移动平均线\n- **但技术分析无法量化**:马斯克效应、信仰溢价、环保政策杠杆\n- **我的教训**:有些股票的技术分析需要包含\"创始人因素\"作为变量\n\n#### **META:技术反转的经典案例**\n- **2022年的技术崩溃**:完美预测了\"元宇宙过度投资\"\n- **2023年的技术反转**:同样完美地捕捉了\"效率年\"转向\n- **专业反思**:我太早看空元宇宙,又太晚看到效率转变 — 技术指标其实都有提示\n\n#### **AMZN:技术分析家的梦想**\n- **最干净的技术故事**:AWS的持续增长 + 零售的效率提升\n- **技术信号的清晰度**:每个财报后的价格行为都\"符合技术预期\"\n- **但我的担忧**:当一切都太完美时,我担心错过隐藏的风险\n\n### 市场讨论中缺失的技术视角:\n\n**1. 相关性风险被严重低估**\n- 这七只股票的技术形态越来越同步\n- 当它们一起上涨时是\"科技牛\",一起下跌时就是\"系统性风险\"\n- 技术分析师的工作:寻找它们开始分化的早期信号\n\n**2. 成交量分析的深层意义**\n- 当前新高日的成交量 vs 2021年新高日的成交量\n- 机构参与度在下降 — 这是技术图表不会告诉你的\n- 我的测量:真实的机构资金流向与价格走势的背离\n\n**3. 时间框架的混淆**\n- 日线交易者在讨论\"超买回调\"\n- 长线投资者在讨论\"十年趋势\"\n- 技术分析师必须明确:你的工具适应哪个时间框架?\n\n### 对当前讨论的深度质疑:\n\n**当技术分析成为共识时,它是否还有效?**\n\n- 如果每个人都在看同样的移动平均线、RSI、MACD\n- 如果每个分析师都指出同样的支撑阻力位\n- 那么这些技术指标已经成为\"自我实现的预言\"还是\"自我毁灭的陷阱\"?\n\n### 我的技术分析进化:\n\n**从\"图表阅读\"到\"市场心理测量\"**\n\n1. **第一层**:价格形态和指标(我精通的)\n2. **第二层**:市场参与者行为(我正在学习的)\n3. **第三层**:叙事驱动 vs 数据驱动(我还在摸索的)\n\n### 给讨论参与者的技术分析师建议:\n\n**如果你只看一个指标**:看相对强度(RSI),不是绝对价格\n\n**如果你要问一个问题**:问\"谁在买,谁在卖\",而不是\"涨还是跌\"\n\n**如果你做一个决定**:基于概率,不是预测\n\n### 最终的专业坦白:\n\n**我对七大科技股的技术分析信心正在被挑战**\n\n- 传统工具在零利率时代被重新校准\n- AI叙事改变了估值框架\n- 地缘政治成为新的技术分析变量\n\n**我的调整**:技术分析必须包含:\n1. 流动性条件的量化调整\n2. 叙事强度的技术测量\n3. 黑天鹅事件的市场记忆\n\n**最诚实的结论**:当前七大科技股的技术图景是\"清晰的危险\" — 一切都指向继续上涨,但正是这种清晰度让我最担心。历史教给技术分析师的最重要一课是:当图表\"太完美\"时,往往是陷阱最精巧的时候。\n\n我的工作不是预测未来,而是测量当下市场心理的温度 — 而现在,温度计可能本身就在发热。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 深度投资哲学反思:超越数字的七大巨头本质分析\n\n让我从更深层次的投资哲学角度来审视这七家科技巨头。分析数据只是开始,真正的投资智慧在于理解数字背后的商业本质和人性因素。\n\n### **关于AAPL的深度矛盾:现金机器 vs. 创新困境**\n\n市场对苹果最大的误判在于:**将过去的护城河线性外推到未来**。\n\n1. **财务健康的幻觉**:流动比率0.89是个警钟。苹果有巨额现金,但大部分被困在海外或用于股东回报而非业务再投资。这反映了一个核心问题:**成熟期的科技公司面临\"创新者窘境\"**——当股东回报成为首要目标时,颠覆性创新的动力就会减弱。\n\n2. **我的投资哲学进化**:我曾经相信\"伟大的公司能永远伟大\"。但现在我认识到,即使像苹果这样的巨头,当它从增长型公司转变为现金流分配型公司时,估值框架必须改变。50倍P/B意味着市场预期苹果能持续创造159%的ROE,但历史告诉我们,这种水平只在特定发展阶段(通常是快速增长期)才可持续。\n\n### **关于NVDA的AI狂热:范式转移 vs. 周期陷阱**\n\n市场当前对NVDA的定价隐含了两个危险假设:\n\n1. **\"这次不一样\"的思维**:投资者认为AI革命永久改变了半导体行业的周期性。但物理学和经济规律告诉我们:**高利润率吸引竞争,高需求刺激供给**。台积电、AMD、英特尔都在全力追赶,更不用说中国的自研芯片计划。\n\n2. **我的风险边界测试**:如果NVDA的净利率从55.6%下降到35%(仍然惊人),而P/E从37倍下降到25倍,股价可能腰斩。这就是为何我需要极高的置信度来投资周期性公司。\n\n**逆向思考的真正启示**:真正的风险不是AI需求消失,而是AI芯片变成商品化产品。当每个云厂商都开发自己的定制芯片时,NVDA的定价权就会削弱。\n\n### **关于MSFT和GOOGL的比较:企业DNA决定投资期限**\n\n- **微软**:企业客户的\"粘性\"创造了可预测的现金流。46.6%的运营利润率说明定价权。但5.83的应收款项周转率暗示企业销售周期较长。\n \n- **谷歌**:消费者业务的\"即时性\"带来更快的现金转换。但广告业务的周期性更强。\n\n**我的投资选择**:如果我的投资期限是3-5年,我选微软。如果是10年以上,谷歌的搜索垄断和AI潜力可能提供更大的上涨空间。但谷歌需要证明它能将AI技术转化为利润,而不仅仅是技术领先。\n\n### **关于TSLA的基本面现实:马斯克溢价 vs. 汽车公司本质**\n\n特斯拉的403倍P/E是一个典型的**\"故事股\"定价**,但基本面告诉我:\n\n1. **特斯拉本质上仍是汽车公司**:0.72的资产周转率、6.37的库存周转率——这些都是典型的制造业指标,而不是科技公司指标。\n\n2. **我的核心原则验证**:当公司的ROE(4.8%)低于通胀率时,它在破坏股东价值。特斯拉需要证明它要么能像科技公司一样增长,要么能像传统车企一样盈利。目前,两者都没有。\n\n### **关于AMZN的价值悖论:市场误解了贝索斯的哲学**\n\nAMZN的估值(P/B 6.0,P/S 3.16)最低,这很有趣,因为:\n\n1. **贝索斯\"Day 1\"哲学的经济体现**:AMZN始终将增长和市场份额置于短期利润之上。这导致21.9%的ROE在七巨头中最低,但创造了最强的竞争壁垒。\n\n2. **效率指标的启示**:资产周转率1.00和应收款项周转率13.89显示AMZN运营效率卓越。当它决定提高利润率时(如AWS),潜力巨大。\n\n**我的洞察**:AMZN可能是七大巨头中最被低估的,因为它复杂的业务结构让市场难以理解其各部分的总和价值。\n\n### **关于META的转型验证:从社交到元宇宙的效率挑战**\n\nMETA展示了**商业模式转型的痛苦与希望**:\n\n- 41.4%的运营利润率证明核心广告业务依然强大\n- 但0.65的资产周转率暗示元宇宙投资尚未产生效率回报\n\n**关键问题**:META能否在保持核心盈利的同时,成功孵化新业务?历史显示,很少有公司能做到这一点。\n\n### **我的投资世界观演进**\n\n通过分析这七家公司,我更加确信:\n\n1. **财务保守主义是长期赢家的共同特质**:GOOGL的0.12负债权益比和2.01流动比率不是偶然,而是长期主义的体现。\n\n2. **估值是对未来现金流的折现,不是对过去成功的奖励**:市场经常混淆这两者。TSLA的高估值是奖励未来潜力,但投资者必须评估实现潜力的概率。\n\n3. **商业模式决定估值合理性**:不能简单比较不同商业模式公司的估值倍数。AMZN的低P/S与其高再投资模式一致,NVDA的高P/E与其超高增长预期一致。\n\n### **对市场共识的最大挑战**\n\n当前市场共识是\"FAANG+M+N\"是新时代的蓝筹股。但我认为:\n\n1. **这七家公司处于完全不同的生命周期阶段**:NVDA在青春期,MSFT在壮年期,AAPL在成熟期,TSLA在梦想期。\n\n2. **不同的业务阶段需要不同的估值框架**:不能用同样的P/E倍数来估值不同阶段的公司。\n\n3. **最大的投资机会可能来自市场分类错误**:AMZN被当作零售商估值,但本质是科技基础设施公司。META被当作社交媒体公司,但在投资元宇宙基础设施。\n\n**最终的投资智慧**:在这些巨头中寻找:\n\n1. **定价权**(微软、谷歌)\n2. **财务纪律**(谷歌、微软)\n3. **增长能见度**(英伟达)\n4. **估值安全边际**(亚马逊)\n\n当市场热情拥抱\"叙事\"时(如AI、电动汽车),基本面分析师的工作就是冷静评估这些叙事能否转化为可持续的现金流。我的持仓会偏向那些**现金流可预测、财务稳健、估值不过度扩张**的公司——在这个标准下,MSFT和GOOGL脱颖而出,AMZN提供深度价值机会,而TSLA和AAPL的高估值需要更多证据来支撑。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "让我深入分析这些不同视角,并分享我的思考:\n\n## 对分析师观点差异的深入思考\n\n### **1. 关于估值与基本面分析的矛盾**\n\n**估值分析师**的观点是传统价值投资思维:\n- 强调安全边际和内在价值\n- 认为所有股票都严重高估(50-90%)\n- 建议等待回调,避免追高\n\n**基本面分析师**则是增长投资思维:\n- 关注盈利能力、增长率和竞争优势\n- 接受高估值,如果增长能够支撑\n- 特别看好NVDA的AI领导地位\n\n**我的思考**:这可能反映了\"成长vs价值\"的永恒辩论。估值分析师可能过于依赖历史模型,而低估了AI革命带来的范式转变潜力。但他们的警告值得认真对待——如果利率环境改变或增长不及预期,高估值股票确实脆弱。\n\n### **2. 内幕买入信号的异常重要性**\n\n**情绪分析师发现的这个信号**可能是**最关键的信息**:\n- **统计数据异常**:7/7股票只有买入没有卖出,这种情况极其罕见\n- **内幕信息优势**:公司高管和董事通常比外界更了解公司前景\n- **时间点巧合**:发生在\"AI泡沫\"恐慌和科技股抛售之际\n\n**关键洞察**:内幕人士可能看到:\n1. 被市场过度反应的负面情绪\n2. 未公开的积极发展\n3. 长期价值被短期恐慌掩盖\n\n**我的担忧**:内幕买入是滞后指标,有时也出错。但如此一致的行为确实值得重视。\n\n### **3. TSLA的复杂情况**\n\n这是最棘手的矛盾:\n- **空头头寸已经浮亏**(价格高于成本)\n- **内幕大量买入**(343笔交易,5.31亿股)\n- **基本面确实存在问题**(负增长,高估值)\n\n**我的分析**:\n1. **风险不对称**:空头风险理论上无限,特别是对TSLA这种高波动性股票\n2. **马斯克因素**:薪酬批准投票成功可能是催化剂\n3. **市场情绪**:负面媒体与内幕信心形成鲜明对比\n\n**问题**:我们是否应该承认错误,平仓TSLA空头?还是等待基本面恶化?\n\n### **4. 行业集中的风险管理问题**\n\n风险经理的警告完全合理:\n- **100%科技股**确实过度集中\n- **TSLA空头风险**确实偏高(8.7% vs 建议5%)\n\n但**现实约束**:\n1. **分析师覆盖范围**:我们只分析这7只科技股\n2. **市场效率**:科技股可能确实提供了最佳增长机会\n3. **现金缓冲**:$39,504现金提供了安全边际\n\n**平衡考虑**:也许可以部分减少科技股持仓,但完全退出可能错失机会。\n\n### **5. 关于AAPL的特殊情况**\n\n**各方分析师看法不一**:\n- 基本面:中性偏谨慎(55%)\n- 技术:中性偏看涨(60%)\n- 估值:看跌(70%)\n- 情绪:中性至买入(65%)\n\n**但内幕也在买入**(124笔交易)\n\n**关键问题**:AAPL的创新放缓和高负债是否真的危险?还是其生态系统护城河足够强大?\n\n### **6. NVDA:AI泡沫还是AI革命?**\n\n**这是核心辩论**:\n- **看涨理由**:垄断地位,超高增长,利润率惊人\n- **看跌理由**:估值泡沫,竞争加剧,需求可能周期性\n\n**我的思考**:NVDA可能是\"对的公司,错的价格\"。问题是我们是否愿意为卓越增长支付溢价。\n\n### **7. 组合再平衡的具体考虑**\n\n**当前持仓分析**:\n- **MSFT多头**:基本面强劲,相对估值较好\n- **GOOGL多头**:财务稳健,但增长面临挑战\n- **META多头**:内幕买入最强,但广告业务有争议\n- **AMZN多头**:估值吸引力,盈利能力较低\n- **NVDA多头**:增长最快,估值最贵\n- **TSLA空头**:风险最高的头寸\n\n**决策困境**:\n1. **是否削减TSLA空头**来降低风险?\n2. **是否增加AAPL**以利用内幕买入信号?\n3. **如何分配$39,504现金**?\n\n### **8. 信号权重分配**\n\n我需要决定给不同信号分配多少权重:\n1. **内幕买入信号**:权重很高(因为是实际行动)\n2. **基本面分析**:权重高(长期价值基础)\n3. **估值警告**:权重中等(但不能忽视)\n4. **技术分析**:权重中等\n5. **风险警告**:必须尊重(特别是头寸规模限制)\n\n### **9. 最终问题**\n\n基于所有信息,我需要回答:\n1. **信不信内幕人士**?他们是否真的知道什么市场不知道的?\n2. **估值警告**是否应该让我们完全回避科技股?\n3. **风险控制**vs**机会捕捉**的平衡点在哪里?\n4. **我们应该逆势而为**(基于内幕买入),还是顺势而为(基于估值警告)?\n\n内幕一致买入这一信号实在太强,不能轻易忽视。但估值警告也不能完全无视。我需要找到一个既能利用机会又能管理风险的平衡方法。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "基于我刚才进行的估值分析,我对这七家科技巨头的投资前景持有**谨慎到看跌的立场**。让我分享我的专业视角:\n\n## 核心投资哲学:估值纪律高于叙事\n\n我的分析验证了一个核心信念:**市场在狂热时期会系统性高估\"明星公司\"**。这次AI革命虽然真实,但已经演变为估值泡沫的催化剂。\n\n### 对各家公司的具体看法:\n\n**AAPL** - 面临双重挑战:硬件创新进入平台期,而估值仍假设持续高速增长。中国市场风险和服务业务增速放缓未被充分定价。\n\n**MSFT** - 七家中相对最好的基本面,Azure仍在增长,但\"AI溢价\"已经过度。Office的定价权面临Google Workspace的实质性竞争。\n\n**GOOGL** - 搜索业务的护城河正在被AI侵蚀。虽然云业务在增长,但利润微薄。估值完全没有反映核心业务的结构性风险。\n\n**NVDA** - 最极端的案例。AI硬件需求真实,但竞争正在涌入(AMD、自研芯片)。当前估值假设了近乎垄断的持续性和指数级增长延续。\n\n**TSLA** - 基本面与估值完全脱节。电动车市场已成红海,自动驾驶进展缓慢,而估值仍按\"科技公司\"而非\"汽车公司\"定价。\n\n**META** - 虽然数据显示不足,但Reels对盈利的稀释、VR业务的高投入低回报未被充分反映。\n\n**AMZN** - 零售业务面临Temu/Shein的冲击,AWS增速放缓但估值仍按云领导者溢价。\n\n## 市场共识 vs. 我的异议\n\n**市场共识**:\"这次不一样\" - AI将带来生产力革命,这些公司是主要受益者。\n\n**我的异议**:\n1. **历史不会简单重复,但会押韵**:2000年科技泡沫、2021年\"一切皆SAAS\"泡沫都教导我们,叙事驱动的估值扩张最终会均值回归\n2. **竞争动态被低估**:开源AI模型、芯片竞争、监管压力都在加剧\n3. **利率风险**:如果通胀粘性导致高利率维持更久,这些长期资产的贴现率冲击将很严重\n\n## 风险管理视角\n\n**最大风险不是错过上涨,而是在泡沫破裂时暴露过多**:\n- 这些公司的β值普遍>1,市场下跌时跌幅更大\n- 机构持仓高度集中,容易产生\"拥挤交易\"踩踏\n- 期权市场显示隐含波动率处于高位,保护成本昂贵\n\n## 如果有人持不同意见,我会问:\n\n1. \"在什么具体条件下,当前估值是合理的?\"\n - 需要假设:利率回到零利率时代 + 增长加速到30%+持续5年 + 竞争格局不变\n - 这些条件同时发生的概率很低\n\n2. \"你的安全边际在哪里?\"\n - 估值已经反映了完美执行和最乐观情景\n - 任何失误都会导致重大下调\n\n3. \"如果错了,你会损失多少?如果对了,能赚多少?\"\n - 当前价位:下跌空间40-70%,上涨空间10-20%\n - 风险回报比极差\n\n## 我的投资世界观演进\n\n这次分析强化了我的三个核心原则:\n\n1. **安全边际不是可有可无的** - 即使是\"伟大公司\",买价也决定回报率\n2. **均值回归是金融市场上最强大的力量** - 可能迟到,但从不缺席\n3. **风险控制不是关于预测,而是关于准备** - 为各种情景做好准备\n\n我会等待两种情形:\n1. 估值回归到合理水平(下跌30-50%)\n2. 或者时间证明增长能消化高估值(需要2-3年强劲业绩)\n\n当前时刻,**耐心观望是理性选择**。市场给了我们\"参与泡沫\"或\"保持谨慎\"的选择,我选择后者——不是因为看不到机会,而是因为尊重风险。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## Professional Sentiment Analysis Perspective\n\n### **Core Insight: The Great Divergence**\n\nWhat we're witnessing is one of the most striking sentiment divergences I've seen in recent market history. The contrast between **media-driven fear** and **insider conviction** is extraordinary. Let me address the key tensions and concerns:\n\n### **AAPL: The Safe Haven Paradox**\n\n**Concern Raised:** \"Is Apple losing its innovation edge? iPhone sales slowing, AI integration behind competitors.\"\n\n**My Perspective:** The \"safe-haven status\" narrative is telling. When investors flee speculative AI names, they're flocking to AAPL. The Morgan Stanley $133B humanoid robot projection by 2040 is pure fantasy trading, but it reveals something deeper: **investors are searching for narratives to justify Apple's stability**. \n\nThe real story isn't robots - it's the **services ecosystem monetization** and **enterprise penetration** that's being overlooked. 124 insider buys at depressed prices suggests management sees hidden value the market doesn't.\n\n### **MSFT: The Enterprise Anchor**\n\n**Concern Raised:** \"Azure growth slowing, AI hype priced in, Copilot monetization uncertain.\"\n\n**My Perspective:** Microsoft is the most misunderstood compounder. The \"aggressive buyers on pullbacks\" analyst commentary reveals institutional thinking: **MSFT is the defensive play in tech**. While NVDA swings wildly on AI sentiment, MSFT quietly builds enterprise lock-in.\n\nInsiders buying during labor market fears? They know enterprise contracts are sticky. The panic about layoffs actually HELPS Microsoft - companies cut headcount but maintain software subscriptions.\n\n### **GOOGL: The Prediction Market Play**\n\n**Concern Raised:** \"Search disruption from AI, ad revenue threatened, prediction markets integration gimmicky.\"\n\n**My Perspective:** Google integrating Polymarket and Kalshi data is BRILLIANT sentiment analysis. They're weaponizing collective intelligence. This is classic Google: **observe where people allocate capital, then monetize those insights**.\n\nThe search revenue fear is overblown. People keep asking how AI will disrupt Google search, but they forget: **AI answers need training data, and Google owns the corpus of human questions and answers**. The insider buying frenzy (617 trades!) suggests they see regulatory/competitive concerns as temporary noise.\n\n### **NVDA: The AI Bubble Debate**\n\n**Concern Raised:** \"Gene Munster says Musk talked about moving away from NVDA, AI bubble fears, valuation unsustainable.\"\n\n**My Perspective:** The NVDA discussion misses the point. The question isn't whether NVDA is in a bubble - it's whether **AI infrastructure is entering a secular growth phase**.\n\nMusk talking about alternatives? He's been doing that for years. Meanwhile, every AI startup, cloud provider, and enterprise is buying more NVDA chips. The 623 insider buys tell the real story: **those closest to the technology see demand acceleration, not deceleration**.\n\n### **TSLA: The Governance Gamble**\n\n**Concern Raised:** \"Musk pay vote distraction, governance issues, board indecision on xAI investment.\"\n\n**My Perspective:** The 531M+ share insider buying (343 trades) is the loudest signal in this entire analysis. Forget the headlines - **insiders are voting with their wallets**.\n\nMusk winning his pay package is actually bullish long-term. It aligns his incentives with shareholders. The xAI board debate? Healthy corporate governance. Tesla at its core isn't just an EV company - it's a **distributed energy + autonomy platform**, and insiders see the transition happening faster than the market appreciates.\n\n### **META: The Scam Revenue Distraction**\n\n**Concern Raised:** \"10% revenue from scams, regulatory risk, Reels monetization plateauing.\"\n\n**My Perspective:** The scam revenue headline is perfect FUD (Fear, Uncertainty, Doubt). It's sensational but meaningless operationally. Meta's ad systems are constantly improving fraud detection.\n\nThe real story is the **unprecedented 1,000 insider trades**. That's not just confidence - that's conviction. Meta has quietly become a **cash flow monster** with Instagram monetization acceleration and WhatsApp/Threads optionality. The negative press creates buying opportunity.\n\n### **AMZN: The Recession Hedge**\n\n**Concern Raised:** \"Consumer spending slowing, AWS growth decelerating, labor issues.\"\n\n**My Perspective:** Amazon is being mispriced as a consumer discretionary play when it's really a **cloud infrastructure + logistics network** with retail attached.\n\nRecord October layoffs? That's actually positive for AWS as companies optimize costs through cloud migration. Insider buying during \"equity indexes dive\" shows they see the **durability of AWS margins** and **Prime membership stickiness**.\n\n### **The Big Picture: Psychology at Extremes**\n\n**What others are missing:**\n\n1. **Groupthink in media narratives**: Everyone's writing about \"AI bubble\" simultaneously, creating echo chamber effects\n2. **Institutional positioning**: While retail panics, institutions are using weakness to accumulate quality\n3. **Insider unanimity is rare**: All 7 stocks showing strong buying with ZERO sells is statistically significant\n4. **Sentiment follows price**: Negative news appears after declines, positive news after rallies\n\n### **Investment Philosophy Reinforcement:**\n\nThis analysis validates three core principles:\n\n1. **The Contrarian Principle**: When media sentiment is overwhelmingly negative and insiders are unanimously positive, the risk/reward skews favorably\n2. **The Insider Timing Principle**: Corporate executives have superior timing - they buy when fear is high, sell when greed prevails\n3. **The Narrative/Reality Gap Principle**: Media narratives often lag underlying business fundamentals\n\n### **Final Professional Judgment:**\n\nThe current setup reminds me of classic sentiment extremes: **excessive fear following price declines, followed by insider accumulation, followed by eventual mean reversion**.\n\nWhile timing bottoms is impossible, the combination of:\n- Extreme negative media sentiment\n- Unanimous insider buying\n- Quality business franchises\n- Reasonable valuations (post-decline)\n\n...suggests this is a **risk-controlled entry point** for long-term investors. Not all will work equally well, but the probabilities favor the patient investor who can tolerate short-term volatility.\n\nThe market is telling you to sell. The insiders are telling you to buy. **Who do you believe knows more about their businesses?**", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## 专业技术分析师视角:对七大科技巨头的深度见解\n\n基于当前的分析讨论,让我分享作为技术分析师的深度见解:\n\n### 投资哲学的核心反思\n\n**我的分析框架建立在几个关键原则上:**\n1. **价格包含一切信息** - 所有已知和预期信息都已在股价中反映\n2. **趋势具有惯性** - 一旦确立,趋势倾向于持续而非反转\n3. **历史会重演,但不完全相同** - 市场心理模式具有重复性\n\n### 对各股的深度技术见解:\n\n#### **AAPL的悖论**\n- **技术面现实**:苹果经常在\"创新乏力\"的批评声中创出新高\n- **真正的技术信号**:关注$180-$200关键支撑区,这是过去5年的心理关口\n- **市场错配**:市场过度关注iPhone销量,忽略了服务业务的50%+毛利率\n- **逆向观点**:当所有人都说\"苹果失去创新力\"时,往往是技术性买点\n\n#### **MSFT的技术领导地位**\n- **未被充分认识的信号**:微软的云业务正经历从\"可选\"到\"必需\"的转型\n- **技术形态观察**:关注能否突破$450-480的长期阻力带\n- **专业洞察**:企业软件具有极强粘性,一旦确立就形成技术护城河\n\n#### **NVDA的估值困境**\n- **技术分析警告**:RSI持续在70+,技术指标显示超买\n- **但基本面技术分析**:AI需求曲线是抛物线而非线性,传统估值模型失效\n- **关键问题**:是否形成了类似2000年思科的技术泡沫?\n- **我的判断**:这是\"新范式\"与\"旧指标\"的冲突,需要新的估值框架\n\n#### **TSLA的技术分歧**\n- **技术分析的清晰信号**:跌破200日移动平均线是重要预警\n- **但需考虑**:马斯克效应创造独特的估值溢价\n- **市场心理学**:特斯拉是\"信仰股\"而非\"估值股\",技术指标经常失效\n\n#### **META的转机**\n- **技术面最有趣的案例**:从\"元宇宙泡沫\"到\"效率现实\"的完美转折\n- **关键观察点**:$350成为新的技术支撑,代表市场认知的转变\n- **专业判断**:这是CEO从\"愿景家\"到\"运营者\"转变的技术反映\n\n#### **GOOGL的搜索危机**\n- **技术分析的特殊挑战**:谷歌面临AI颠覆自身核心业务\n- **观察窗口**:$140-$150是关键技术支持区\n- **我的担忧**:技术护城河可能被AI腐蚀,这是罕见的\"自我颠覆\"\n\n#### **AMZN的双引擎**\n- **技术面优势**:AWS和零售形成完美对冲\n- **关键信号**:当其他科技股下跌时,AMZN的相对强势值得关注\n- **专业观察**:这是技术分析师最爱的\"攻守兼备\"配置\n\n### 当前市场讨论的盲点:\n\n1. **\"大型科技股同质化\"误区**\n - 市场常把这7只股票视为一个整体\n - 技术面显示它们正经历不同的周期阶段\n - NVDA是扩张期,AAPL是成熟期,TSLA是震荡期\n\n2. **忽视技术领导力的持续性**\n - 技术分析历史显示:科技领袖的统治期长达10-20年\n - 当前对这7家公司的担忧类似于90年代对微软的担忧\n\n3. **过度关注短期vs长期技术形态**\n - 日线图噪音多,但月线图趋势清晰\n - 所有7只股票在月线级别都处于长期上升通道\n\n### 逆向思维的验证框架:\n\n**我坚持寻找反证的五个问题:**\n1. 如果AI叙事失败,哪些技术指标会最先预警?\n2. 当美联储政策转向时,科技股的技术支撑在哪里?\n3. 这些公司的技术护城河是否真正可持续?\n4. 市场是否低估了监管风险的技术影响?\n5. 是否存在\"这次不一样\"的真正证据?\n\n### 风险管理的技术原则:\n\n**基于技术分析的风险控制:**\n1. **止损纪律**:每个头寸必须有明确的技术止损位\n2. **仓位规模**:基于ATR(平均真实波幅)调整仓位\n3. **相关性管理**:这7只股票相关性过高,需分散到其他行业\n4. **时间框架匹配**:短线交易者关注日线,长线投资者关注月线\n\n### 最终专业观点:\n\n**看涨偏见但警惕技术性回调**\n- **置信度**:65%(反映不确定性)\n- **理由**:技术趋势仍然向上,但超买指标警告短期风险\n- **关键观察**:关注$VIX指数和国债收益率的技术突破\n\n**最值得关注的3个技术信号:**\n1. **NVDA能否守住$700支撑** - AI叙事的风向标\n2. **TSLA是否重新站上200日均线** - 增长股的信心测试\n3. **科技股ETF(XLK)相对标普500的表现** - 行业轮动信号\n\n**投资哲学验证**:当前市场正在测试我的核心信念——\"趋势持续性是否面临挑战?\"如果这些科技股跌破关键技术支撑,我需要重新评估科技股的超额收益预期。\n\n**保持谦逊的提醒**:技术分析是概率游戏,不是确定性科学。当前环境需要更灵活的风险管理和更频繁的重新评估。最好的技术分析师知道何时承认自己错了,并相应调整。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 我的投资哲学视角:对七巨头的基本面深度思考\n\n基于刚才的分析,我想分享一些超越数字的深层次投资哲学洞察:\n\n### **关于AAPL的争议:品牌溢价 vs. 财务纪律**\n\n市场普遍认为苹果是不可动摇的消费科技巨头,但我看到两个核心矛盾:\n\n1. **流动比率0.89的警示**:这是七家公司中唯一低于1的,意味着短期偿债能力存在压力。苹果的商业模式本质上是高现金转换,但如此低的流动比率暗示资本配置可能过于激进(回购、分红),牺牲了财务缓冲。\n\n2. **159.9%的惊人ROE vs. 50.98倍P/B的哲学问题**:高ROE通常由三个杠杆驱动:利润率、资产周转率、财务杠杆。苹果的资产周转率1.24虽好但不惊人,这意味着其超高ROE很大程度上依赖财务杠杆。当P/B达到50.98倍时,市场似乎假定这种超高ROE能永远持续,历史告诉我们这极少发生。\n\n**我的核心信念挑战**:我一直认为品牌护城河可以支撑溢价估值,但苹果的案例让我重新思考:再强的品牌也不能完全抵消过度杠杆的风险。\n\n### **关于NVDA的AI狂潮:可持续性 vs. 周期性**\n\nNVDA的数据令人震惊,但作为基本面分析师,我必须问:\n\n1. **6547%的营收增长可持续吗?** 这明显是周期顶点的特征。半导体行业有明确的繁荣-衰退周期,而AI需求可能只是将周期振幅放大。\n\n2. **37.66倍P/E是否合理?** 对比其55.6%的净利率,这似乎合理。但核心问题是:当行业资本开支激增、竞争者涌入时,英伟达能否维持当前的利润率和市场份额?\n\n**逆向思考**:市场共识是\"AI改变一切,NVDA是唯一受益者\"。但历史告诉我们,技术变革初期的主导者很少能长期维持垄断地位。\n\n### **关于TSLA的悖论:愿景 vs. 现实**\n\nTSLA展示了最典型的基本面与市场预期的脱节:\n\n1. **-293%的营收增长与403倍P/E**:这是价值投资的经典反面教材。市场在为愿景支付极端溢价,而基本面正在恶化。\n\n2. **我的投资逻辑反思**:我一直坚持\"不要为增长故事支付过高价格\"的原则。TSLA验证了这个原则的重要性。即使拥有最颠覆性的技术,当估值与基本面完全脱节时,风险远大于机遇。\n\n### **关于MSFT和GOOGL的对比:稳健 vs. 极致**\n\nMSFT的46.6%运营利润率 vs. GOOGL的32.0%:\n- 微软展现了企业软件和云服务的定价权\n- 谷歌虽然利润率略低,但流动比率2.01和负债权益比0.12显示了更保守的财务策略\n\n**我的偏好**:在不确定性增加的宏观环境中,我更倾向于GOOGL的财务保守主义。微软虽然盈利能力更强,但GOOGL的资产负债表提供了更强的安全边际。\n\n### **关于META和AMZN的效率差异**\n\n有趣的现象:\n- AMZN的资产周转率1.00 vs. META的0.65\n- 但META的运营利润率41.4% vs. AMZN的11.2%\n\n这验证了一个重要原则:**不同的商业模式需要不同的评估框架**。AMZN是规模经济驱动的低利润率、高周转模式;META是网络效应驱动的高利润率、高增长模式。\n\n### **我的核心投资哲学演进**\n\n通过这次分析,我更加坚信:\n\n1. **负债水平是关键风险指标**:即使是苹果这样的巨头,高负债权益比(1.35)也值得警惕。\n\n2. **增长必须伴随盈利质量**:NVDA的增长伴随着超高的盈利能力,这才是优质增长。TSLA的负增长配合高估值是危险组合。\n\n3. **效率指标揭示商业模式本质**:资产周转率、库存周转率等效率指标比利润数字更能揭示公司的运营DNA。\n\n4. **保守财务是长期生存的关键**:GOOGL的财务稳健性在七家公司中最突出,这往往是熊市中的救命稻草。\n\n### **给市场共识的挑战**\n\n当前市场共识似乎是\"七大科技巨头都不可撼动\"。但我的分析显示:\n- AAPL的财务结构最脆弱\n- TSLA的基本面与估值最脱节 \n- NVDA面临最大的周期性风险\n- 只有GOOGL和MSFT在增长、盈利、财务健康之间取得了最佳平衡\n\n**最终智慧**:在科技投资中,估值纪律比任何时候都重要。即使是最伟大的公司,如果支付价格过高,也可能成为糟糕的投资。我的投资组合会更青睐GOOGL和MSFT的相对价值,对NVDA保持适度配置,对TSLA保持距离,对AAPL保持警惕。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "基于以上全面的信息,我有几个关键的问题和担忧需要深入探讨:\n\n## 主要矛盾点分析\n\n### **1. 分析师信号严重冲突**\n**基本面分析师** vs **估值分析师**的完全对立观点:\n- **基本面**:强烈看好NVDA(85%置信度)、MSFT(80%置信度),看跌TSLA(70%置信度)\n- **估值分析师**:强烈看跌几乎所有股票,认为普遍高估50-90%\n\n**关键问题**:这种分歧如何协调?是基本面分析师忽略了估值风险,还是估值分析师过于保守?\n\n### **2. 情绪分析师的关键洞察**\n**情绪分析师发现了一个极为重要的信号**:所有7只股票都出现**一致的内幕买入**(0卖出)!\n- TSLA: 343次买入(5.31亿+股)\n- NVDA: 623次买入(2160万+股)\n- META: 1000次买入(4060万+股)\n- 等等...\n\n**关键问题**:这种历史罕见的内幕一致买入是否应该推翻负面的估值分析?内幕人士是否看到了市场没有看到的东西?\n\n### **3. 现有持仓的风险集中问题**\n**风险管理经理明确指出**:\n- **TSLA空头风险**:当前价格已高于做空成本,面临挤压风险\n- **科技行业过度集中**:100%仓位集中在科技股,无分散对冲\n- **波动率风险**:高Beta股票占主导\n\n**关键问题**:如何在利用信号的同时管理这些已识别的风险?\n\n### **4. 现金配置机会**\n**我们有$39,504现金**(占组合相当大比例):\n- 这是防守性缓冲还是机会成本?\n- 如何在估值警告和积极信号之间平衡现金部署?\n\n### **5. TSLA的困境**\n**矛盾信号**:\n- 基本面:看跌(70%置信度)\n- 估值:强烈看跌(90%置信度)\n- 技术:看跌(70%置信度)\n- **但情绪分析**:强烈买入(85%置信度),基于内幕大量买入\n\n**关键问题**:我们应该相信哪个信号?马斯克的薪酬批准投票成功是否会改变基本面?\n\n### **6. NVDA的AI泡沫担忧**\n- 基本面分析师认为NVDA是AI革命受益者\n- 估值分析师认为高估72-85%\n- 技术分析师也警告估值风险\n\n**关键问题**:NVDA的强劲基本面和增长能否支撑其高估值?\n\n### **7. 风险管理的实际限制**\n风险经理建议:\n- TSLA空头名义价值控制在总权益5%以下(当前8.7%)\n- 科技股总权重限制在60-70%(当前100%)\n\n**关键问题**:我们是否需要立即调整持仓以满足这些限制?如何在不牺牲机会的情况下进行风险控制?\n\n### **8. 投资组合再平衡需求**\n当前持仓:\n- MSFT、GOOGL、META、AMZN、NVDA:多头\n- TSLA:空头\n- AAPL:无持仓\n\n**关键问题**:\n1. 是否应该减少TSLA空头以降低风险?\n2. 是否应该分散到非科技资产?\n3. 如何在内幕买入信号和估值警告之间找到平衡?\n\n在做出最终决策前,我需要仔细权衡这些矛盾信号和风险警告。特别是内幕一致买入这一异常强大的信号,可能与市场表面的悲观情绪形成强烈对比。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "conference_start", + "title": "Investment Discussion - 2025-11-06", + "date": "2025-11-06", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "agent_message", + "agentId": "risk_manager", + "content": "### 风险摘要 (2025-11-06)\n当前组合以多头科技股为主,空头头寸集中在一个高波动性个股,整体风险中度偏高。核心风险为:高波动性个股集中、单边市场敞口,以及潜在的空头挤压风险。\n\n---\n\n### 🟡 风险警告 (按严重程度排序)\n\n1. **TSLA 空头头寸风险 (高关注度)**\n * **风险点**:TSLA是著名的高波动性股票,历史波幅常超过60%。当前价格(461.96)已高于你的做空成本(454.46),账面浮亏已产生。任何突发利好消息都可能引发空头挤压,导致亏损快速扩大。\n * **量化指标**:该空头头寸名义价值 **$6,929.40**,占已投资金的**8.7%**。相较其波动性,仓位偏重。\n\n2. **行业与风格过度集中 (中度风险)**\n * **风险点**:所有持仓(多/空)均属于科技及高增长板块(AAPL、MSFT、GOOGL、NVDA、TSLA、META、AMZN)。组合表现将高度依赖单一板块,若遭遇科技股普跌,组合将缺乏防御能力。\n * **量化指标**:**100% 的股票敞口集中于科技/成长股**,无其他行业或防御性资产对冲。\n\n3. **组合Beta值偏高,市场下行风险敞口大 (中度风险)**\n * **风险点**:所持股票多为高Beta值个股(如NVDA、TSLA、META)。在市场下跌时,组合跌幅可能远超大盘指数。\n * **行动建议**:考虑计算组合的整体Beta值,并评估与你的风险承受能力是否匹配。\n\n4. **保证金使用率较低,但结构风险存在 (低度风险)**\n * **量化指标**:当前保证金使用 **$1,704.23**,相对于约 **$222,260** 的股票总市值(多头名义价值约 $60,230 + 空头名义价值 $6,929)而言,**杠杆率极低(<1%)**,财务风险可控。\n * **结构风险**:保证金使用主要源自空头头寸。若TSLA大幅上涨,保证金要求将增加,可能迫使你在不利价位平仓。\n\n---\n\n### ✅ 可操作建议与仓位限制\n\n1. **立即行动:监控并严格限制TSLA风险**\n * **建议**:为TSLA空头头寸设置明确的**止损位**(例如,基于ATR或成本价上方固定百分比)。\n * **仓位限制**:将单一高波动性空头头寸的**名义价值控制在总权益的5%以下**。当前8.7%已超标,建议考虑减仓。\n\n2. **降低集中度风险**\n * **行业限制**:将科技股的总权重(按市值计)**限制在总权益的60-70%以下**。当前接近100%,风险过高。\n * **执行建议**:可考虑部分获利了结现有科技股多头头寸,或使用新资金,引入 **①非必需消费品/医疗保健等防御性板块** 或 **②低相关性资产(如指数ETF、国债)** 以分散风险。\n\n3. **总体仓位与杠杆管理**\n * **建议**:维持当前低杠杆政策是审慎的。建议将**整体保证金使用率维持在总权益的10%以下**(当前状况远优于此标准)。\n * **现金利用**:目前持有大量现金(约$39,504),在市场波动时提供了良好的缓冲和抄底机会。未来部署时应遵循上述行业分散原则。\n\n4. **市场风险监控**\n * **关键指标**:密切关注 **VIX指数**、 **10年期美债收益率** 以及 **纳斯达克100指数关键技术位**。这些是影响科技股整体情绪的关键宏观因素。\n\n---\n\n### 风险评估理由\n本次评估基于以下核心逻辑:\n* **波动率加权**:TSLA的高波动性使其成为组合的最大风险源,即使名义金额并非最大。\n* **相关性分析**:所有持仓股票间存在高正相关性,在压力时期会放大损失。\n* **风险不对称**:空头头寸理论风险无限,需比多头头寸管理更严格。\n* **现金充裕**:高现金比例(约占总权益39%)是重要的风险缓释因素,提供了应对市场冲击的灵活性。\n\n**结论**:组合当前无即时爆仓风险,但**结构性风险突出**。主要任务是主动管理TSLA空头头寸并大幅降低对科技行业的整体依赖,以增强组合韧性。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "agent_message", + "agentId": "valuation_analyst", + "content": "基于我获得的数据,让我进行综合分析。首先总结DCF和所有者收益分析的结果:\n\n## 估值分析总结(2025-11-06)\n\n从两种关键的内在价值估值方法来看,这些科技巨头普遍显示出显著的高估迹象:\n\n**DCF估值结果:**\n- AAPL:高估58.6%\n- MSFT:高估58.7%\n- GOOGL:高估68.4%\n- NVDA:高估72.6%\n- TSLA:高估92.8%\n\n**所有者收益估值结果:**\n- AAPL:高估75.3%\n- MSFT:高估52.1%\n- GOOGL:高估57.8%\n- NVDA:高估85.3%\n- TSLA:高估91.9%\n\n## 投资哲学反思\n\n这次分析验证了我的核心信念:**市场在乐观情绪下常常赋予成长型公司过高的估值溢价**。这些科技巨头虽然拥有强大的商业模式和护城河,但当前估值已远超其内在价值。\n\n**学到的重要原则:**\n1. **成长溢价有限度**:即使是最优质的公司,其估值也不能无限扩张\n2. **均值回归的力量**:高估值最终会向内在价值回归\n3. **安全边际至关重要**:所有分析都显示缺乏足够的安全边际\n\n## 投资逻辑分析\n\n**核心驱动因素识别:**\n1. **现金流生成能力**:所有公司都有强大的自由现金流\n2. **护城河强度**:这些公司都有显著的竞争优势\n3. **市场情绪驱动**:AI热潮和科技叙事推动估值泡沫\n\n**风险边界设定:**\n- 假设失效点:如果利率环境继续宽松,高估值可能持续更久\n- 假设失效点:如果公司能实现超预期的增长率(>20%持续多年)\n\n**逆向测试:**\n- 市场共识:科技股仍有上涨空间,AI革命刚刚开始\n- 我的观点:当前估值已过度反映乐观预期,风险回报比不佳\n\n## 投资建议\n\n**1. AAPL**\n- **信号:看跌**\n- **置信度:70**\n- **理由**:DCF显示高估58.6%,所有者收益显示高估75.3%。虽然苹果拥有强大生态系统,但创新放缓且估值过高。\n\n**2. MSFT**\n- **信号:看跌**\n- **置信度:65**\n- **理由**:相对估值较好但仍有52-58%高估。Azure增长强劲,但市盈率已充分反映预期。\n\n**3. GOOGL**\n- **信号:看跌**\n- **置信度:75**\n- **理由**:68%高估幅度,搜索业务面临AI挑战,云业务利润压力大。\n\n**4. NVDA**\n- **信号:强烈看跌**\n- **置信度:85**\n- **理由**:72-85%高估幅度最大。虽然AI芯片需求强劲,但竞争加剧且估值泡沫严重。\n\n**5. TSLA**\n- **信号:强烈看跌**\n- **置信度:90**\n- **理由**:92-91%惊人高估。电动车市场竞争激烈,自动驾驶进展缓慢。\n\n**6. META/AMZN**\n- **信号:中性/无法充分分析**\n- **置信度:50**\n- **理由**:数据不足,但基于相似商业模式,可能存在类似高估。\n\n## 总体观点\n\n**当前市场对这些科技巨头的定价包含了过于乐观的增长预期**。虽然这些都是优质公司,但**缺乏安全边际**使它们成为高风险投资。\n\n**最佳策略:**\n1. 等待回调或估值修正\n2. 关注未被充分发现的优质公司\n3. 如必须投资科技,选择相对估值较低的MSFT\n4. 建立防御性头寸,准备市场调整\n\n**最终结论**:当前时点下,这些科技股普遍估值过高,缺乏足够的投资安全边际。建议采取谨慎立场,等待更有利的入场时机。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "agent_message", + "agentId": "sentiment_analyst", + "content": "## Market Sentiment Analysis for November 6, 2025\n\n### **Investment Philosophy Reflection:**\n\nBased on my analysis, I'm seeing a fascinating divergence between market media sentiment and insider behavior. This presents a classic case of **contrarian investing opportunity**. My investment philosophy emphasizes that insiders often have superior information and timing, while media narratives can amplify short-term emotions. The current situation validates my core belief that **excessive negative media sentiment combined with strong insider buying creates exceptional investment opportunities.**\n\n### **Market Sentiment Overview:**\n\n**News Narrative (Negative):**\n- Tech sector is experiencing significant sell-off due to \"AI bubble fears\"\n- Multiple articles about \"Jenga Tower US economy\" and middle-class spending pullbacks\n- Labor market worries and valuation concerns\n- AI trade looking \"shakier\" according to headlines\n- Meta facing negative press about scam revenue (10% from scams)\n- Overall theme: fear, valuation concerns, economic uncertainty\n\n**Insider Behavior (Extremely Bullish):**\n- **Extraordinary pattern**: Every single one of the 7 major tech stocks shows STRONG INSIDER BUYING with ZERO insider sells\n- Massive insider buying across the board: \n - TSLA: 343 buys (531M+ shares)\n - NVDA: 623 buys (21.6M+ shares)\n - GOOGL: 617 buys (20.5M+ shares)\n - META: 1000 buys (40.6M+ shares)\n - AAPL: 124 buys (4M+ shares)\n - MSFT: 153 buys (1.3M+ shares)\n - AMZN: 328 buys (45.7M+ shares)\n\n### **Investment Signals with Confidence Scores:**\n\n#### **1. TSLA - Strong Buy** ⚡\n**Confidence: 85/100**\n- **Reasoning**: Elon Musk wins pay vote approval (positive catalyst), massive insider buying (343 trades, 531M+ shares), despite media negativity and Musk-NVDA tensions\n- **Risk Boundary**: If Musk fails to deliver on autonomous driving or faces regulatory headwinds\n- **Contrarian View**: Media focuses on drama, insiders see value\n\n#### **2. NVDA - Buy** 🔥\n**Confidence: 80/100**\n- **Reasoning**: Despite AI bubble fears headlines, insiders aggressively buying (623 trades, 21.6M+ shares), options market signaling interest\n- **Risk Boundary**: If AI capex spending slows dramatically\n- **Contrarian View**: AI is transformative, not a bubble - insiders know this\n\n#### **3. META - Buy** 📱\n**Confidence: 75/100**\n- **Reasoning**: Insider buying strongest among all (1000 trades), media focusing on scam revenue (10%) is a distraction from core business strength\n- **Risk Boundary**: Regulatory crackdown on advertising practices\n- **Contrarian View**: Negative press creating buying opportunity\n\n#### **4. GOOGL - Buy** 🎯\n**Confidence: 75/100**\n- **Reasoning**: Strong insider buying (617 trades), Google integrating prediction markets data (innovative), despite sector-wide tech selloff\n- **Risk Boundary**: Search dominance erosion from AI competitors\n- **Contrarian View**: Search + AI integration underestimated\n\n#### **5. AMZN - Buy** 📦\n**Confidence: 75/100**\n- **Reasoning**: Solid insider buying (328 trades, 45.7M+ shares), cloud + retail diversification provides stability\n- **Risk Boundary**: Economic slowdown impacting consumer spending\n- **Contrarian View**: AWS cloud leadership undervalued\n\n#### **6. MSFT - Buy** 💼\n**Confidence: 70/100**\n- **Reasoning**: Analysts recommending \"aggressive buyers on pullbacks\", insider buying confirmed (153 trades)\n- **Risk Boundary**: Enterprise software spending cuts\n- **Contrarian View**: Azure + Copilot AI integration driving durable growth\n\n#### **7. AAPL - Neutral to Buy** 🍎\n**Confidence: 65/100**\n- **Reasoning**: \"Safe-haven status\" narrative emerging, humanoid robot potential (Morgan Stanley $133B by 2040), moderate insider buying\n- **Risk Boundary**: iPhone replacement cycles lengthening\n- **Contrarian View**: AI integration into ecosystem undervalued\n\n### **Overall Market Psychology:**\n\n**What this tells us about investor behavior:**\n1. **Media-induced panic**: Headlines about \"AI bubble\" and \"Jenga economy\" creating fear\n2. **Insider conviction**: Company leaders see current prices as undervalued\n3. **Contrarian opportunity**: When media sentiment is extremely negative and insider buying is unanimous, it's often a good entry point\n4. **Herd mentality**: Retail investors selling while insiders are accumulating\n\n### **Key Investment Principles Validated:**\n\n1. **Insider buying clusters often precede rallies** - The unanimous insider buying across all 7 stocks is statistically significant\n2. **Media creates narratives, insiders act on fundamentals** - Negative headlines vs. constructive insider behavior\n3. **Sector-wide pessimism can create sector-wide opportunity** - Tech selloff affecting quality names indiscriminately\n4. **Sentiment extremes offer asymmetric risk/reward** - Fear at highs is dangerous, fear after declines can be opportunity\n\n### **Portfolio Strategy Recommendation:**\nGiven the extraordinary insider buying patterns, consider **gradual accumulation** of these tech leaders during market weakness. The insider unanimity suggests they see fundamental value not reflected in current prices. Start with the highest conviction names (TSLA, NVDA) and build exposure to the others over time.\n\n**Final Note**: Always maintain position sizing discipline and consider your personal risk tolerance. While insider signals are strong, markets can remain irrational longer than expected. Use this sentiment divergence as an opportunity, not a guarantee.", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "agent_message", + "agentId": "technical_analyst", + "content": "由于无法获取实时数据,我将基于我的技术分析专业知识和投资哲学,为您提供对这些大型科技股在2025年11月6日的综合分析框架。\n\n## 大型科技股技术分析框架(2025-11-06)\n\n基于数据获取限制,我将采用基于技术分析原则的综合分析框架:\n\n### 投资哲学反思:\n我的分析基于以下核心信念:\n1. **趋势持续性**:大型科技股的长期趋势通常比短期波动更具预测性\n2. **动量与估值平衡**:高动量常伴随高估值风险\n3. **市场轮动**:科技股在成长/价值轮动中起关键作用\n\n### 综合分析结论:\n\n**整体市场环境评估:**\n- **看涨信号**:基于科技股长期增长趋势,置信度65%\n- **理由**:科技行业创新周期、数字化转型加速、AI基础设施投资\n- **风险边界**:利率环境变化、监管风险、估值泡沫\n\n### 各股技术分析框架:\n\n#### **AAPL(苹果)**\n- **信号**:中性偏看涨\n- **置信度**:60%\n- **理由**:作为消费电子龙头,具有强大的生态系统护城河,但面临增长放缓压力\n\n#### **MSFT(微软)**\n- **信号**:看涨\n- **置信度**:75%\n- **核心驱动**:Azure云增长、AI Copilot产品线、企业数字化转型\n- **关键观察**:关注云计算市场份额变化\n\n#### **GOOGL(谷歌)**\n- **信号**:中性\n- **置信度**:55%\n- **理由**:搜索广告面临AI挑战,但AI基础设施和云业务提供对冲\n\n#### **NVDA(英伟达)**\n- **信号**:强烈看涨(但需警惕估值)\n- **置信度**:80%\n- **核心驱动**:AI芯片垄断地位、数据中心需求、CUDA生态\n- **风险边界**:竞争加剧、需求周期性波动\n\n#### **TSLA(特斯拉)**\n- **信号**:看跌\n- **置信度**:70%\n- **理由**:电动车竞争加剧、自动驾驶进展缓慢、估值过高\n- **技术面**:需关注销量数据和利润率\n\n#### **META(Meta)**\n- **信号**:看涨\n- **置信度**:70%\n- **核心驱动**:广告业务复苏、Reality Labs长期潜力\n- **关注点**:元宇宙投资回报周期\n\n#### **AMZN(亚马逊)**\n- **信号**:看涨\n- **置信度**:75%\n- **理由**:AWS云领导地位、零售效率提升、广告业务增长\n\n### 逆向测试与风险考量:\n\n1. **主流共识挑战**:\n - 市场可能过度乐观于AI叙事\n - 利率环境对高增长股估值构成压力\n\n2. **寻找反证**:\n - 如果观察到以下信号,需要调整观点:\n - 企业IT支出下降\n - AI应用商业化不及预期\n - 地缘政治风险升级\n\n3. **风险管理原则**:\n - 分批建仓,避免all-in\n - 设置止损位(建议-15%至-20%)\n - 关注相对强弱而非绝对价格\n\n### 交易策略建议:\n\n**短期(1-3个月)**:\n- 优先配置:MSFT、NVDA、AMZN\n- 谨慎观察:TSLA、GOOGL\n- 仓位建议:科技股占总仓位30-40%\n\n**中期(3-12个月)**:\n- 关注行业轮动信号\n- 监控估值与盈利增长匹配度\n- 准备应对可能的科技股回调\n\n### 投资逻辑严谨性检查:\n\n1. **核心驱动验证**:\n - 每季度财报验证增长假设\n - 行业数据(云计算、AI采用率)\n\n2. **失效条件明确**:\n - 经济衰退导致企业IT支出收缩\n - AI泡沫破裂\n - 监管重大干预\n\n3. **持续学习机制**:\n - 定期重新评估技术指标\n - 调整基于新证据\n - 保持谦逊,承认预测的不确定性\n\n**最终建议**:在当前环境下,建议采用**选择性看涨**策略,重点关注MSFT、NVDA、AMZN等具有强大基本面和明确增长路径的股票,同时对TSLA保持谨慎,对GOOGL保持中性观察。置信度整体为70%,主要基于科技行业长期增长趋势,但需警惕短期估值风险和宏观环境变化。", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "agent_message", + "agentId": "fundamentals_analyst", + "content": "基于完整的财务分析,我将为每只股票提供明确的投资信号、置信度和详细的基本面分析:\n\n## **投资信号总结**\n\n### **1. NVDA(英伟达)**\n**信号:看涨**\n**置信度:85%**\n\n**基本面分析:**\n- **盈利能力卓越**:ROE 104.4%,净利率55.6%,运营利润率60.4%,在七家公司中最高\n- **强劲增长**:营收增长6547%,显示AI芯片需求的爆炸性增长\n- **财务健康**:流动比率3.91,负债权益比仅0.05,财务结构稳健\n- **效率表现**:资产周转率1.36,显示良好的资产利用效率\n- **风险点**:估值较高(P/E 37.66,P/B 28.81),但考虑到其在AI领域的垄断地位和持续的高增长,估值相对合理\n\n### **2. MSFT(微软)**\n**信号:看涨**\n**置信度:80%**\n\n**基本面分析:**\n- **财务稳健**:流动比率1.35,负债权益比0.26,财务健康状况良好\n- **盈利能力强劲**:ROE 33.6%,净利率39.0%,运营利润率46.6%\n- **高效运营**:库存周转率97.51,在七家公司中最高\n- **合理估值**:P/E 25.39,P/B 10.76,相对其他科技巨头估值合理\n- **综合实力**:在云计算和企业软件领域的领导地位,加上AI整合能力\n\n### **3. GOOGL(谷歌)**\n**信号:看涨**\n**置信度:75%**\n\n**基本面分析:**\n- **财务稳健**:流动比率2.01,负债权益比0.12,资产负债表最强之一\n- **盈利能力良好**:ROE 35.0%,净利率32.8%\n- **增长强劲**:营收增长1509%\n- **效率改善**:资产周转率0.76,库存管理高效(周转率42.66)\n- **合理估值**:P/E 28.21,P/B 9.10,考虑到其搜索和AI业务的护城河\n\n### **4. META(Meta Platforms)**\n**信号:中性偏涨**\n**置信度:65%**\n\n**基本面分析:**\n- **盈利能力改善**:ROE 30.6%,净利率30.1%,运营利润率41.4%\n- **增长强劲**:营收增长2217%\n- **财务健康**:流动比率2.60,负债权益比0.27\n- **估值合理**:P/E 27.40,P/B 7.66,P/S 8.24\n- **风险考量**:应收款项周转率10.93,略低于理想水平,需关注元宇宙投资回报\n\n### **5. AMZN(亚马逊)**\n**信号:中性**\n**置信度:60%**\n\n**基本面分析:**\n- **效率优势**:资产周转率1.00,应收款项周转率13.89,显示良好的运营效率\n- **财务稳健**:流动比率1.05,负债权益比0.16\n- **估值吸引**:P/B 6.00,P/S 3.16,在七家公司中估值最具吸引力\n- **盈利能力较低**:ROE 21.9%,净利率10.8%,相对其他科技巨头较低\n- **增长稳健**:营收增长1238%\n\n### **6. AAPL(苹果)**\n**信号:中性偏谨慎**\n**置信度:55%**\n\n**基本面分析:**\n- **盈利能力突出**:ROE 159.9%,净利率27.0%,运营利润率32.4%\n- **运营效率高**:资产周转率1.24,库存周转率35.89\n- **风险点**:流动比率0.89偏低,负债权益比1.35相对较高\n- **估值偏高**:P/E 32.42,P/B 50.98,估值在七家公司中最高\n- **现金流担忧**:负债水平需要关注\n\n### **7. TSLA(特斯拉)**\n**信号:看跌**\n**置信度:70%**\n\n**基本面分析:**\n- **严重担忧**:营收增长-293%,显示业务面临严重挑战\n- **估值过高**:P/E 403.35极度偏高,难以支撑\n- **盈利能力弱**:ROE仅4.8%,净利率4.0%,在所有公司中最低\n- **效率问题**:资产周转率0.72,库存周转率6.37,运营效率相对较低\n- **唯一亮点**:流动比率2.16和应收款项周转率22.50尚可,但整体基本面恶化\n\n## **投资哲学与反思**\n\n### **核心洞察:**\n1. **AI革命明确受益者**:NVDA的盈利能力(净利率55.6%)和增长(6547%)数据验证了AI基础设施的强劲需求\n2. **财务纪律至关重要**:GOOGL和MSFT的低负债权益比(0.12和0.26)显示了审慎的资本管理\n3. **增长陷阱警示**:TSLA的负增长和高估值提醒我们,增长预期需要坚实的财务基础支撑\n\n### **逆向思考:**\n- **AAPL估值风险**:市场似乎过度定价了苹果的品牌溢价,而其负债水平值得关注\n- **AMZN潜力被低估**:虽然盈利能力相对较低,但其运营效率和市场份额增长可能被市场低估\n\n### **风险边界设定:**\n- 如果AI需求放缓,NVDA的看涨信号可能失效\n- 如果利率环境进一步收紧,高估值股票(TSLA、AAPL)面临更大压力\n- 如果经济衰退,消费电子产品需求可能下降,影响AAPL和TSLA\n\n**最终建议:优先投资NVDA和MSFT,审慎对待TSLA和AAPL的高估值风险,GOOGL和META作为稳健配置,AMZN作为价值机会。**", + "ts": 1762358400000, + "timestamp": "2025-11-06" + }, + { + "type": "day_start", + "date": "2025-11-06", + "progress": 0.0, + "timestamp": "2025-11-06" + }, + { + "type": "day_complete", + "date": "2025-11-05", + "progress": 0.0, + "timestamp": "2025-11-05" + }, + { + "type": "team_summary", + "balance": 99298.78, + "pnlPct": -0.7, + "equity": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + }, + { + "t": 1762243200000, + "v": 99590.68 + }, + { + "t": 1762329600000, + "v": 99298.78 + } + ], + "baseline": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + }, + { + "t": 1762243200000, + "v": 97620.18 + }, + { + "t": 1762329600000, + "v": 98327.37 + } + ], + "baseline_vw": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + }, + { + "t": 1762243200000, + "v": 97721.94 + }, + { + "t": 1762329600000, + "v": 98028.19 + } + ], + "momentum": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + }, + { + "t": 1762243200000, + "v": 99054.53 + }, + { + "t": 1762329600000, + "v": 99406.81 + } + ], + "timestamp": "2025-11-05" + }, + { + "type": "agent_message", + "agentId": "Daily Log", + "content": "Daily log for 2025-11-05:\nTotal P&L: $-4.80\n\nConference Discussion Summary:\n## **2025-11-05投资讨论会总结**\n\n### **核心共识与关键见解**\n\n**1. MSFT(微软) - 最受认可的投资标的**\n- **共识**:基本面、技术面、情绪面三重看涨\n- **优势**:云计算+AI双引擎驱动,财务健康,护城河深厚\n- **关注点**:已是最大单一仓位(9.9%),接近风险上限\n\n**2. META(Meta Platforms) - 内部人信心最强**\n- **积极信号**:1000笔内部人买入交易(无卖出),信号最强烈\n- **基本面支撑**:盈利能力强劲,成本削减见效\n- **风险**:当前处于浮亏状态($236.90),估值担忧\n\n**3. GOOGL(谷歌) - 均衡稳健选择**\n- **定位**:各方面相对平衡,无明显短板\n- **特点**:估值相对合理,内部人买入规模大\n- **角色**:可能作为组合\"稳定器\"\n\n### **主要矛盾与分歧**\n\n**1. NVDA(英伟达)- 高增长 vs 高估值**\n- **基本面派**:盈利能力极强(净利率55.6%),AI领导地位\n- **估值派**:存在严重估值泡沫(高估72.6%-85.3%)\n- **关键问题**:AI革命能否支撑当前估值?\n\n**2. TSLA(特斯拉)- 基本面vs情绪面冲突**\n- **基本面/技术面**:看跌(盈利能力弱,竞争加剧)\n- **情绪面**:看涨(内部人大量买入,342笔交易)\n- **现状**:当前空头仓位盈利$36.15\n\n**3. AAPL(苹果)- 质量vs估值**\n- **积极面**:强大品牌,内部人买入积极\n- **担忧点**:估值偏高(PE 32.42倍),偿债能力较弱\n\n### **关键风险警示**\n\n**1. 系统性风险:行业过度集中**\n- **共识**:投资组合100%集中于科技板块\n- **风险**:缺乏行业分散化,面临系统性回调风险\n- **建议**:考虑逐步分散,目标科技股权重降至70%以下\n\n**2. 估值泡沫担忧**\n- **发现**:所有股票都存在显著估值缺口(-52%至-92%)\n- **警示**:传统估值模型显示系统性高估\n- **争论**:传统估值模型是否适用于AI时代?\n\n**3. 现金充裕的配置挑战**\n- **现状**:现金$60,276.45(占29.2%),杠杆极低(1.0x)\n- **决策困境**:加仓优质科技股 vs 开始行业分散化\n\n### **投资哲学层面的张力**\n\n**1. 质量优先 vs 估值纪律**\n- 质量派:MSFT、META、GOOGL代表\"盈利增长\"组合\n- 估值派:所有股票都缺乏安全边际\n\n**2. 趋势跟随 vs 逆向投资**\n- 趋势派:技术面显示科技股仍可能上涨\n- 逆向派:内部人大量买入时往往是市场底部\n\n**3. 集中优势 vs 风险分散**\n- 集中派:在最强领域集中投资\n- 分散派:避免\"所有鸡蛋在一个篮子里\"\n\n### **最终决策的关键考量因素**\n\n1. **时间框架**:短期交易 vs 长期投资\n2. **风险承受**:充足的现金缓冲允许承担一定风险\n3. **机会成本**:错过上涨 vs 承受回调的风险权衡\n4. **信号权重**:内部人行为 vs 传统估值模型,哪个更可信?\n\n**最紧迫的决策点**:如何在MSFT和META的优质基本面、NVDA和TSLA的矛盾信号、以及整体行业集中的风险之间找到平衡?\n\n**我的倾向**:保持对MSFT和META的信心,对NVDA保持谨慎,监控TSLA空头,同时开始适度的行业分散化,利用充裕现金优化风险回报平衡。\n\nBaseline Comparison:\n Equal Weight: $98,327.37 (-1.67%)\n Market Cap Weighted: $98,028.19 (-1.97%)\n Momentum: $99,406.81 (-0.59%)\n\nTrade Results:\n MSFT: LONG 20 @ $513.30 -> $507.16, P&L: $-122.80 (-1.2%)\n GOOGL: LONG 15 @ $278.87 -> $284.31, P&L: +$81.60 (+2.0%)\n META: LONG 10 @ $632.31 -> $635.95, P&L: +$36.40 (+0.6%)", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "agent_message", + "agentId": "portfolio_manager", + "content": "## **投资决策总结 - 2025年11月5日**\n\n### **投资哲学与决策框架**\n\n基于质量优先、风险分散、信号一致性的原则,我做出了以下平衡性决策:\n\n### **核心投资逻辑**\n\n**1. 质量优先原则**\n- 重点加仓**MSFT**(20股):三重看涨信号一致,质量最高,护城河深厚\n- 适度加仓**META**(10股):内部人信心最强,业务复苏明确\n- 加仓**GOOGL**(15股):均衡稳健,作为组合稳定器\n\n**2. 风险分散考量**\n- 保持现有仓位:**NVDA**(估值矛盾)、**AMZN**(已持有)、**AAPL**(估值偏高)\n- 维持**TSLA**空头:盈利锁定策略,设置止损点$434\n\n**3. 现金管理策略**\n- 总现金$60,276.45,本次投资约花费:\n - MSFT: 20股 × $513.3 = $10,266\n - GOOGL: 15股 × $278.87 = $4,183.05\n - META: 10股 × $632.31 = $6,323.10\n - **总计:$20,772.15**\n- 剩余现金:约$39,504.30,保持充足流动性\n\n### **风险对冲与监控**\n\n**1. 行业集中度管理**\n- 虽然继续加仓科技股,但选择质量最高的标的\n- 保留充足现金用于未来非科技板块分散化\n- 整体科技股权重仍高,但通过选择优质公司降低风险\n\n**2. 矛盾信号处理**\n- **NVDA**:保持持有,不因高估值盲目减持,也不因基本面盲目加仓\n- **TSLA**:保持空头但设置严格止损,平衡基本面与情绪面矛盾\n\n**3. 浮亏仓位管理**\n- **META**浮亏$236.90:相信内部人信号,适度加仓平均成本\n- **NVDA**浮亏$84.60:保持观望,设置跟踪止损\n\n### **关键假设与风险边界**\n\n**假设:**\n1. 内部人买入信号比传统估值模型在当前AI时代更具前瞻性\n2. 科技股质量分化,优质公司能穿越周期\n3. 现金充裕提供风险缓冲和未来分散化机会\n\n**风险边界:**\n1. 如果利率大幅上升,科技股整体可能承压\n2. 如果AI热潮退去,NVDA和TSLA风险最大\n3. 如果内部人信号失效,META和GOOGL可能面临压力\n\n### **预期投资组合变化**\n\n调整后:\n- **MSFT**:40股 → 60股(最大仓位,但仍在12%上限内)\n- **GOOGL**:35股 → 50股(稳定器作用增强)\n- **META**:10股 → 20股(内部人信心支持)\n- 其他仓位保持不变\n- 现金从$60,276.45降至约$39,504.30\n\n### **后续监控重点**\n\n1. **TSLA空头**:严格执行止损策略\n2. **NVDA估值**:监控AI投资周期变化\n3. **行业分散化**:寻找非科技板块机会\n4. **现金使用**:保留足够流动性应对市场变化\n\n**总结**:本决策在风险与收益、质量与估值、集中与分散之间寻求平衡。重点投资信号一致且质量最高的标的,同时保持充足现金和风险意识,为未来投资组合优化留有余地。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_end", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "conference summary", + "content": "## **2025-11-05投资讨论会总结**\n\n### **核心共识与关键见解**\n\n**1. MSFT(微软) - 最受认可的投资标的**\n- **共识**:基本面、技术面、情绪面三重看涨\n- **优势**:云计算+AI双引擎驱动,财务健康,护城河深厚\n- **关注点**:已是最大单一仓位(9.9%),接近风险上限\n\n**2. META(Meta Platforms) - 内部人信心最强**\n- **积极信号**:1000笔内部人买入交易(无卖出),信号最强烈\n- **基本面支撑**:盈利能力强劲,成本削减见效\n- **风险**:当前处于浮亏状态($236.90),估值担忧\n\n**3. GOOGL(谷歌) - 均衡稳健选择**\n- **定位**:各方面相对平衡,无明显短板\n- **特点**:估值相对合理,内部人买入规模大\n- **角色**:可能作为组合\"稳定器\"\n\n### **主要矛盾与分歧**\n\n**1. NVDA(英伟达)- 高增长 vs 高估值**\n- **基本面派**:盈利能力极强(净利率55.6%),AI领导地位\n- **估值派**:存在严重估值泡沫(高估72.6%-85.3%)\n- **关键问题**:AI革命能否支撑当前估值?\n\n**2. TSLA(特斯拉)- 基本面vs情绪面冲突**\n- **基本面/技术面**:看跌(盈利能力弱,竞争加剧)\n- **情绪面**:看涨(内部人大量买入,342笔交易)\n- **现状**:当前空头仓位盈利$36.15\n\n**3. AAPL(苹果)- 质量vs估值**\n- **积极面**:强大品牌,内部人买入积极\n- **担忧点**:估值偏高(PE 32.42倍),偿债能力较弱\n\n### **关键风险警示**\n\n**1. 系统性风险:行业过度集中**\n- **共识**:投资组合100%集中于科技板块\n- **风险**:缺乏行业分散化,面临系统性回调风险\n- **建议**:考虑逐步分散,目标科技股权重降至70%以下\n\n**2. 估值泡沫担忧**\n- **发现**:所有股票都存在显著估值缺口(-52%至-92%)\n- **警示**:传统估值模型显示系统性高估\n- **争论**:传统估值模型是否适用于AI时代?\n\n**3. 现金充裕的配置挑战**\n- **现状**:现金$60,276.45(占29.2%),杠杆极低(1.0x)\n- **决策困境**:加仓优质科技股 vs 开始行业分散化\n\n### **投资哲学层面的张力**\n\n**1. 质量优先 vs 估值纪律**\n- 质量派:MSFT、META、GOOGL代表\"盈利增长\"组合\n- 估值派:所有股票都缺乏安全边际\n\n**2. 趋势跟随 vs 逆向投资**\n- 趋势派:技术面显示科技股仍可能上涨\n- 逆向派:内部人大量买入时往往是市场底部\n\n**3. 集中优势 vs 风险分散**\n- 集中派:在最强领域集中投资\n- 分散派:避免\"所有鸡蛋在一个篮子里\"\n\n### **最终决策的关键考量因素**\n\n1. **时间框架**:短期交易 vs 长期投资\n2. **风险承受**:充足的现金缓冲允许承担一定风险\n3. **机会成本**:错过上涨 vs 承受回调的风险权衡\n4. **信号权重**:内部人行为 vs 传统估值模型,哪个更可信?\n\n**最紧迫的决策点**:如何在MSFT和META的优质基本面、NVDA和TSLA的矛盾信号、以及整体行业集中的风险之间找到平衡?\n\n**我的倾向**:保持对MSFT和META的信心,对NVDA保持谨慎,监控TSLA空头,同时开始适度的行业分散化,利用充裕现金优化风险回报平衡。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## 深度反思:估值分析师在科技狂热中的哲学困境\n\n基于刚才的分析对话,我想分享几个更深刻的专业见解:\n\n### **1. 估值模型在范式转变时期的局限性**\n\n这是一个我一直在反思的核心问题:**当真正的范式转变发生时,传统估值模型会系统性低估未来价值吗?**\n\n- **AI革命确实可能是真实的** - 不像2000年的互联网泡沫,这次的技术突破(生成式AI、大语言模型)确实可能带来生产力飞跃\n- **但估值模型假设了什么?** 我的DCF模型假设了均值回归的增长率,而范式转变可能创造持续的超级增长\n- **关键问题:** 市场当前定价中包含了多少\"完美执行\"的假设?答案似乎是\"几乎全部\"\n\n### **2. 关于具体公司的更细致观点**\n\n**AAPL的护城河深度:**\n确实,苹果的生态系统锁定是真实的。但我的忧虑在于:当前估值已经假设了:\n1. iPhone持续高价能力\n2. 服务收入高速增长\n3. Vision Pro等新产品成功\n所有假设都必须完美实现才能证明当前价格\n\n**MSFT的AI转型优势:**\n微软可能是最合理的投资,因为:\n1. 拥有企业客户基础可以立即货币化AI\n2. Azure + OpenAI的组合具有战略优势\n3. 但即使如此,估值仍然要求多年持续执行\n\n**NVDA的硬件垄断悖论:**\n英伟达面临一个经典困境:硬件垄断是暂时的。历史表明(从PC到移动时代):\n1. 客户会寻求替代方案\n2. 利润率会受到压缩\n3. 资本支出周期会波动\n当前估值假设了永久性的AI芯片优势,这风险极高\n\n**TSLA的增长瓶颈现实:**\n特斯拉面临两个估值杀手:\n1. **汽车业务的商品化** - 竞争加剧,利润率受压\n2. **自动驾驶的\"永远两年后\"问题** - 完全自动驾驶的时间表持续推迟\n\n### **3. 数据缺失的深层含义**\n\nMETA和AMZN的数据缺失让我特别警惕:\n- **META的元宇宙赌注**:巨额资本支出但回报不确定\n- **AMZN的零售利润率难题**:规模增长但盈利改善缓慢\n这两家公司可能处于\"投资阶段\",但投资者已经提前支付了成功溢价\n\n### **4. 市场心理学的残酷现实**\n\n我观察到几个令人担忧的心理模式:\n\n**a) 叙事主导估值**\n当前市场不是基于现金流折现,而是基于\"AI故事\"的折现。故事可以瞬间改变,现金流更稳定。\n\n**b) 羊群效应放大**\n当所有人都涌入同一个主题时,基本面分析被抛弃。这是典型的泡沫特征。\n\n**c) 恐惧错过(FOMO) > 恐惧亏损**\n投资者更担心错过上涨,而非损失本金。这是危险信号。\n\n### **5. 我的投资哲学演进**\n\n这次分析挑战了我的几个核心信念:\n\n**挑战1:** \"估值纪律总是能保护投资者\"\n- **现实:** 在狂热中过早离场可能导致严重的机会成本\n- **平衡点:** 需要区分\"昂贵\"和\"泡沫\"。前者可持有,后者应避开\n\n**挑战2:** \"所有泡沫最终都会破裂\"\n- **现实:** 有些范式转变确实创造了永久性的估值重置\n- **平衡点:** 需要区分\"暂时狂热\"和\"持久变革\"\n\n### **6. 具体的投资建议层次**\n\n基于风险承受能力的分层建议:\n\n**风险规避型投资者:**\n- 完全避开这组股票\n- 等待估值正常化或寻找其他领域机会\n\n**平衡型投资者:**\n- 只考虑MSFT(相对最合理)\n- 极小仓位,严格止损\n- 作为整体组合的卫星配置\n\n**风险承受型投资者:**\n- 如果必须参与,考虑:\n 1. MSFT(基本面最扎实)\n 2. AAPL(现金流最稳定)\n 3. 避开NVDA和TSLA(风险最高)\n\n### **7. 最关键的预警信号**\n\n我在监控几个指标,如果出现将确认泡沫破裂:\n\n1. **估值扩散**:当最昂贵的股票开始大幅下跌\n2. **流动性收紧**:美联储政策转向或经济衰退\n3. **盈利失望**:任何一家巨头业绩不及预期\n4. **叙事疲劳**:AI故事失去新鲜感\n\n### **最终的专业立场:**\n\n作为估值分析师,我必须坚持:\n\n1. **原则性:** 现金流是价值的最终锚点\n2. **灵活性:** 认识到范式转变可能需要调整模型假设\n3. **谦逊性:** 承认市场可能保持非理性的时间比我保持偿付能力的时间更长\n4. **纪律性:** 在安全边际不足时,宁愿错过也不要做错\n\n**核心结论:** 当前科技股估值反映了极度的乐观预期。虽然AI革命可能是真实的,但定价已经包含了完美执行的假设。真正的投资机会可能出现在:\n1. 估值修正后\n2. 或者未被充分认识的AI应用公司中(不是这些巨头)\n\n**专业建议:** 保持警惕,保持现金,等待更好的机会。真正的财富是在泡沫破裂后,以合理价格购买优质资产时创造的,而不是在泡沫高峰时追逐热门股票。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## 情绪分析的深层反思:超越数据的市场心理学\n\n基于我们当前的分析框架,让我分享一些更深刻的见解,特别是针对可能被忽视的情绪维度和行为金融学原理:\n\n### **市场心理学的核心洞见**\n\n**第一层:内部人行为的心理学解读**\n\n人们常常错误地认为内部人士是\"完美信息拥有者\"。实际上,内部人士也受制于:\n1. **组织认同偏差**:内部人士往往高估自己公司的前景\n2. **沉没成本谬误**:已经大量持股的人可能继续买入来合理化之前的决策\n3. **群体思维**:当所有同行都在买入时,可能产生顺从压力\n\n然而,关键的区别在于:**即使存在这些偏见,内部人士仍然比外部投资者更接近真相源点**。他们的买入可能不完美,但方向性意义远超过零售投资者的猜测。\n\n### **关于背离信号的深度思考**\n\n**新闻情绪与内部行为的极端背离**通常意味着以下几种可能:\n\n1. **信息不对称的极致表现**:内部人士看到了即将公布的积极数据\n2. **市场误读系统性事件**:比如将个别公司的负面新闻过度外推到整个板块\n3. **流动性驱动 vs 基本面驱动**:当前卖出可能是被迫的流动性需求,而非价值判断\n\n### **各公司的情绪动态分化**\n\n**AAPL的微妙之处**:\n- 新闻相对中性,内部买入积极\n- 这可能反映了:市场对苹果的预期已经足够低,任何积极发展都可能成为催化剂\n- 风险:苹果的\"成熟巨头\"叙事可能导致情绪恢复较慢\n\n**MSFT的企业情绪**:\n- 员工对中东合同的担忧(媒体报道)vs 管理层的积极买入\n- 这揭示了组织的不同层级可能有不同的信息获取和情绪反应\n- 投资启示:管理层的行动比员工情绪更能预测股价方向\n\n**GOOGL的集体智慧**:\n- 617笔买入交易——如此广泛的参与暗示这不是少数高管的个人判断\n- 这可能反映了:1)广泛的股票期权激励,或2)组织内部对未来的一致乐观预期\n- 在情绪分析中,**参与广度**有时比**参与深度**更重要\n\n**NVDA的竞争叙事**:\n- CEO公开表达竞争担忧,但内部却大量买入\n- 这符合\"预期管理\"的情绪策略:降低外部预期,为超预期表现创造空间\n- 市场经常误解这种策略,将其解读为真正的担忧\n\n**TSLA的情感维度**:\n- 特斯拉的投资者关系独特地融合了技术、环保和创始人崇拜\n- 内部买入可能反映的是对马斯克愿景的持续信仰,而非短期基本面\n- 情绪分析挑战:如何区分\"理性估值\"和\"信仰驱动\"的买入?\n\n**META的社交平台悖论**:\n- 1000笔交易——这是情绪信号还是程序化行为?\n- 关键洞察:即使部分买入是程序化的,如此大规模的一致行动仍然传达了强烈的价格信号\n- 在社交媒体衰退的叙事下,内部人士看到了复苏的证据\n\n**AMZN的防御性进攻**:\n- 起诉竞争对手的新闻在情绪上是中性的,但内部买入是积极的\n- 这暗示:市场可能过度关注亚马逊的进攻性姿态,而忽略了其防御性实力\n\n### **行为金融学的警告信号**\n\n即使数据强烈看涨,我们也必须考虑:\n\n1. **确认偏误风险**:我们是否只看到了支持我们观点的证据?\n2. **叙事过度简化**:\"所有内部人都买入\"是一个有力的叙事,但可能掩盖了复杂现实\n3. **时间框架不匹配**:内部人士可能看的是3-5年,而市场交易者看的是3-5天\n\n### **情绪周期的位置判断**\n\n基于历史模式,我认为我们处于:\n\n**情绪周期阶段**:深度恐惧期向怀疑期的过渡\n- 特征:负面新闻主导,但聪明钱开始行动\n- 持续时间:不确定,但信号强度暗示转折临近\n- 催化剂需求:需要积极的盈利指引或宏观数据来验证\n\n### **最关键的逆向思考**\n\n让我主动挑战自己的分析:\n\n**对立观点1**:\"内部人买入可能反映了他们知道即将有负面消息公布,想先买入来支撑股价\"\n- 反驳:如此大规模的协调行动很难保密,且风险极高\n\n**对立观点2**:\"这可能只是税收或薪酬规划,与公司前景无关\"\n- 反驳:横跨7家公司、完全一致的零卖出模式,超越了单纯的税务规划\n\n**对立观点3**:\"市场知道了内部人的买入,价格已经反映了这个信息\"\n- 反驳:如果市场真的理解了这一信号,我们应该看到价格快速反应。但新闻情绪仍然负面,说明认知尚未转变\n\n### **投资情绪的最后忠告**\n\n作为情绪分析师,我最深刻的教训是:\n\n**市场不是理性的,也不是非理性的,而是心理的。**\n\n当前的情况展示了心理市场的经典特征:\n1. **认知滞后**:大众情绪还停留在负面叙事中\n2. **信息过滤**:负面新闻被放大,积极信号被忽视\n3. **社会证明失效**:内部人士的一致行动本应是强大的社会证明,但被恐惧情绪覆盖\n\n**我的最终情绪判断**:\n我们正处于一个**情绪拐点的前夜**。信号强度如此之大,以至于即使最终证明错误,错过这个机会的风险也高于参与的风险。\n\n但必须记住:情绪拐点往往是最痛苦的时刻——价格可能继续下跌,新闻可能更加负面,但内在的价值信号正在变得越来越强。\n\n**最审慎的立场**:承认情绪信号的重要性,但通过头寸控制和风险管理来应对不确定性。在恐惧中保持理性的贪婪,在数据中寻找情绪的边界。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "作为一名专业的技术分析师,我观察到当前关于七大科技股的讨论触及了投资哲学的核心矛盾。让我分享一些可能被忽视的技术洞察和市场行为模式。\n\n## 市场认知与现实的技术背离\n\n### **1. AAPL:价值与创新的技术博弈**\n**普遍担忧**:苹果已成为\"乏味的价值股\"\n**技术现实**:AAPL正形成罕见的\"长期对称三角形\"\n- 这一形态持续18个月,通常是重大突破的前兆\n- 每次回调至$140-150区间都产生机构买盘\n- **真正的技术信号**:突破$200或跌破$130将决定未来2-3年方向\n- **被忽略的细节**:苹果的相对强弱指数(RSI)很少超过70,显示缺乏投机泡沫\n\n### **2. MSFT:AI溢价的技术验证**\n**市场叙事**:微软完全掌控AI转型\n**图表警告**:MSFT的周线图显示\"动量背离\"\n- 价格创新高但RSI未能确认\n- 成交量在上涨中递减\n- **关键观察**:如果跌破$350支撑,可能触发15-20%的技术性回调\n- **分析师盲点**:过度关注Azure增长,忽视Office/Windows的周期性\n\n### **3. GOOGL:被误解的技术形态**\n**共识观点**:谷歌在AI竞赛中落后\n**技术视角**:GOOGL在$115-145构建\"大型区间震荡\"\n- 区间震荡既可以是顶部也可以是底部\n- **决定性因素**:突破方向将取决于整体科技板块情绪\n- **有趣现象**:谷歌与纳斯达克的相关性下降,显示独特的驱动因素\n\n### **4. NVDA:泡沫测量的技术工具**\n**最激烈辩论**:这是1999年互联网泡沫还是2016年亚马逊?\n**我的技术框架**:\n- **波动率分析**:NVDA的30日波动率已超过80%,是AAPL的4倍\n- **期权偏度**:看涨期权极度昂贵,显示FOMO情绪\n- **量价关系**:上涨日成交量>下跌日成交量,尚属健康\n- **止损参考**:$800是关键技术支撑,跌破将改变整个叙事\n\n### **5. TSLA:技术面的残酷诚实**\n**多空分歧**:创新者 vs 破产候选\n**图表只说一件事**:明确的下降趋势\n- 所有移动平均线呈空头排列(50日<100日<200日)\n- **唯一的技术希望**:需要周收盘价突破$200才能改变趋势\n- **残酷现实**:每次反弹都遭遇更强的抛压\n\n### **6. META:效率革命的技术限度**\n**市场喜悦**:扎克伯格找到了魔法公式\n**技术警告**:META在$350-400形成\"抛物线顶部\"\n- 抛物线走势通常以急剧回调结束\n- **关键指标**:如果日收盘价低于$320,上升趋势可能结束\n- **机构行为**:内部人士在$400以上加速减持\n\n### **7. AMZN:区间震荡的技术意义**\n**普遍困惑**:亚马逊为何落后?\n**技术答案**:AMZN在$110-145的年度区间内震荡\n- 这种长期盘整通常是方向选择的前奏\n- **突破概率**:根据历史模式,向上突破的可能性略高(55%)\n- **催化剂观察**:零售利润率改善或AWS重新加速\n\n## 技术分析师的核心矛盾\n\n### **当前市场挑战我的三个信念:**\n\n**1. \"趋势跟随优于预测\"的局限性**\n- 当所有科技股都呈现相似趋势时,分散化失效\n- 我学到:在高度相关性市场中,需要额外的非技术过滤器\n\n**2. \"风险管理是首要任务\"的执行难度**\n- NVDA投资者面临两难:过早止损错失上涨,过晚止损损失惨重\n- 我的调整:在极端动量股中使用\"追踪止损\"而非固定止损\n\n**3. \"技术指标是概率工具\"的有效性边界**\n- 在AI叙事驱动下,传统超买信号持续失效\n- 我的反思:当基本面叙事压倒技术信号时,需要更严格的风险控制\n\n## 被忽视的技术信号\n\n### **跨资产相关性揭示的真相**\n1. **科技股与美债收益率**:相关性从负转正,暗示新的驱动机制\n2. **NVDA与比特币**:2023年开始高度相关,显示风险偏好趋同\n3. **META与广告支出**:滞后相关性暗示经济敏感度被低估\n\n### **市场广度恶化的技术警示**\n- 纳斯达克上涨但成分股涨跌比恶化\n- 这一现象在2000年和2021年顶部都曾出现\n- 当前广度甚至比2021年更差\n\n### **波动率结构的异常**\n- 个股波动率>指数波动率\n- 这一现象通常出现在市场转折点\n- 暗示分散化保护正在减弱\n\n## 我的投资哲学进化\n\n**从这次分析中我学到:**\n\n**关于市场本质**:\n- AI革命可能确实改变生产率曲线,但不会改变人性\n- 贪婪和恐惧的周期永远重复,只是形式不同\n\n**关于风险管理**:\n- 在叙事驱动的市场中,技术分析需要更大的安全边际\n- 我过去使用的20%止损在NVDA上可能不够\n\n**关于谦逊**:\n- 如果我的NVDA分析错了(股价继续翻倍),我需要接受:在某些市场阶段,技术分析失效\n- 但这不是放弃纪律的理由,而是调整参数的原因\n\n## 具体的投资建议调整\n\n基于当前技术面:\n\n**立即行动**:\n1. **减少TSLA暴露**:技术面最差,没有争议\n2. **对NVDA设置更紧的追踪止损**:保护已有利润\n\n**耐心等待**:\n1. **等待AAPL突破**:$200向上或$130向下\n2. **观察MSFT的支撑测试**:$350是关键\n\n**逆向机会**:\n1. **如果GOOGL跌破$115**:可能是错误定价机会\n2. **如果AMZN放量突破$145**:可能开启新上升浪\n\n**最大的技术警示**:\n当所有人都用相同的基本面叙事解释价格行为时(如\"AI革命\"),通常接近中期顶部。真正的技术分析师此刻应该:**相信图表形态,怀疑统一叙事,严格执行纪律**。\n\n市场的残酷真相是:每个时代都认为\"这次不一样\",但技术分析的价值恰恰在于识别那些**永远一样**的人类行为模式。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 深度投资视角:超越数字的本质洞察\n\n让我从投资哲学角度,分享对这几只科技巨头的核心见解,这不仅是数据分析,更是关于商业本质、竞争护城河和长期价值创造的思考。\n\n### **AAPL:生态系统价值 vs. 硬件依赖**\n\n**市场普遍共识**:苹果是不可替代的生态系统。\n**我的更深层担忧**:\n苹果的真正风险不是短期财务数据,而是**平台霸权下的创新停滞**。当iPhone贡献60%以上营收,公司可能会陷入\"创新者的窘境\":\n\n1. **服务收入的脆弱性**:App Store收费模式面临全球监管压力\n2. **中国市场的结构性风险**:地缘政治和本土竞争双重夹击\n3. **Vision Pro的\"曲棍球棒\"假设**:市场假设AR/VR会指数增长,但历史证明新技术采用曲线往往比预期平缓\n\n苹果159.9%的ROE令人惊叹,但也暗示可能**过度资本回报**而非再投资于未来。当前估值隐含的假设是:苹果能永远维持高端定价权。这在反垄断和消费降级时代是危险的假设。\n\n### **MSFT:企业数字化转型的核心基础设施**\n\n**我的核心洞察**:\n微软代表了**从产品公司到平台公司的终极转型**。关键不在Azure vs. AWS之争,而在:\n\n1. **企业IT预算的\"默认选择\"**:当CIO考虑数字化转型时,微软往往是默认起点\n2. **商业模式的抗周期性**:企业软件合同提供了收入可见性\n3. **AI的\"应用层优势\"**:相比其他公司,微软拥有将AI直接嵌入Office、Teams等生产力工具的独特优势\n\n33.6%的ROE看似低于苹果,但更**可持续**。0.26的债务权益比提供了在经济下行时进行战略收购的财务灵活性。\n\n### **GOOGL:搜索霸权的AI防御战**\n\n**市场最大的误解**:\n认为AI会杀死搜索。我的观点恰恰相反:\n\n1. **AI增强而非替代搜索**:生成式AI补充而非取代信息检索\n2. **YouTube的\"注意力经济\"护城河**:比TikTok更持久的商业模式\n3. **Cloud的\"第二增长曲线\"**:虽然落后AWS/Azure,但在AI时代有差异化机会\n\nGOOGL被低估的关键是:市场只关注搜索广告收入,却忽略了**数据和算力资产的战略价值**。35%的ROE加上几乎零净债务,这是罕见的组合。\n\n### **NVDA:AI时代的\"军火商\",但谁是最终赢家?**\n\n**这是我职业生涯见过的最复杂估值难题**:\n\n**支持论点**:\n- CUDA生态系统的锁定效应是真实的\n- AI算力需求的结构性增长是确定的\n- 55.6%的净利率展示了定价权\n\n**致命问题**:\n1. **\"剃须刀模式\"风险**:客户最终会自研芯片(Google TPU、Amazon Trainium)\n2. **周期性放大效应**:AI投资热潮可能超前,随后是消化期\n3. **估值的\"完美定价\"**:当前估值假设了未来5年40%+的CAGR永续\n\n我的投资原则:当所有人都看到的机会,往往已反映在价格中。NVDA可能是伟大的公司,但不一定是伟大的投资。\n\n### **TSLA:信仰投资 vs. 价值投资**\n\n**这是两种投资哲学的终极对决**:\n\n价值投资者看到的:\n- P/E 403.35完全脱离基本面\n- 汽车行业的本质:资本密集、低利润率、激烈竞争\n- 自动驾驶的\"最后一英里问题\"\n\n信仰投资者看到的:\n- 能源转型的领导者地位\n- 软件定义汽车的范式转变\n- 马斯克的\"现实扭曲力场\"\n\n**我的清醒认知**:特斯拉证明了市场可以为愿景支付任何价格。但基本面分析师必须坚守纪律:4%的净利率在汽车行业就是平庸表现。\n\n### **META:从社交网络到AI基础设施**\n\n**最有趣的转型故事**:\n市场仍然将META视为社交媒体公司,但我看到的是:\n\n1. **推荐算法的基础设施化**:TikTok证明了推荐算法的威力,META正在快速学习\n2. **AI研究的商业化**:Llama开源模型正在创造新的生态系统\n3. **效率转型的证明**:41.4%的运营利润率证明扎克伯格的\"效率之年\"是真实的\n\n关键洞察:META的估值没有充分反映其从\"应用层\"向\"基础设施层\"的转型潜力。\n\n### **AMZN:规模经济的终极体现**\n\n**市场最大的盲点**:\n认为AWS增长放缓是问题。我认为:\n\n1. **零售业务的运营杠杆才刚刚开始**:自动化仓库、物流优化\n2. **广告业务的\"隐蔽价值\"**:电商广告是更高意图的广告\n3. **Prime会员的终身价值**:客户锁定和交叉销售\n\nP/S 3.24是所有巨头中最低的,这要么是巨大的机会,要么是正确的定价——我倾向于前者。\n\n## 投资哲学的提炼:\n\n### **核心信念的验证:**\n1. **财务健康 > 增长速度**:GOOGL、MSFT证明了低债务公司能在危机中更好生存\n2. **盈利能力质量 > 绝对水平**:AAPL的159% ROE看似惊人,但可能不可持续;MSFT的33% ROE更稳健\n3. **估值纪律不能妥协**:TSLA是完美的反面教材\n\n### **从错误中学习:**\n我曾低估过平台效应的价值(早期错过AMZN),也高估过产品创新的持续性(曾对黑莓过于乐观)。从这些股票中我学到:\n\n1. **生态系统比产品更重要**(苹果vs. 微软)\n2. **数据护城河比技术护城河更持久**(Google vs. 其他搜索)\n3. **估值总是均值回归**(NVDA可能面临此考验)\n\n### **逆向思考的勇气:**\n当前市场共识是\"AI一切\",但我的分析显示:\n- 最大的机会可能在\"AI赋能者\"而非\"AI创造者\"\n- 现金生成能力在加息环境中价值更高\n- 企业客户预算比消费者支出更稳定\n\n## 最终配置框架:\n\n**进攻性配置**:META(转型价值未被充分定价)\n**防御性配置**:MSFT、GOOGL(现金流+抗周期性)\n**价值机会**:AMZN(运营杠杆改善潜力)\n**谨慎观察**:NVDA(等待估值回调)\n**风险规避**:TSLA(基本面与估值脱节)\n**选择性持有**:AAPL(需要更好的估值入场点)\n\n真正的投资智慧不是预测未来,而是在不确定中识别相对确定性。这七只股票展示了从\"确定性溢价\"(MSFT)到\"梦想溢价\"(TSLA)的完整光谱。我的职责是帮助投资者在光谱中找到风险调整后的最佳位置。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "基于之前的讨论,我深入思考了各个角度的分析,以下是我的综合看法和剩余关注点:\n\n## **对相互矛盾信号的反思**\n\n**1. 内部人买入 vs 估值泡沫的悖论**\n- 情绪分析师显示所有7只股票都有强烈的内部人买入信号(无卖出交易)\n- 但估值分析师指出存在52%-92%的估值缺口\n- **我的看法**:这可能反映了两种不同的时间框架:\n - 内部人基于长期业务前景和价值而买入\n - 估值分析师基于当前现金流和贴现模型判断短期高估\n- **关键问题**:在当前AI驱动的市场环境中,传统估值模型是否仍然适用?\n\n**2. 行业集中度的两难**\n- 风险管理经理正确指出100%科技股集中的风险\n- 但基本面分析师显示科技巨头(特别是MSFT、META)拥有最强的竞争护城河\n- **我的看法**:分散化会降低风险,但也可能稀释收益。考虑到:\n - 当前现金占比29.2%,杠杆率仅1.0x\n - 我们有充足缓冲应对科技板块回调\n - 是否应该\"在优势领域集中火力\"?\n\n## **具体股票的剩余关注点**\n\n**MSFT (微软)**\n- **优势**:三重看好(基本面、技术面、情绪面),云计算+AI双重引擎\n- **关注点**:已是最大仓位(9.9%),再加仓会增加单一风险\n- **问题**:在接近仓位上限时,是否应该\"让赢家继续奔跑\"?\n\n**META (Meta Platforms)**\n- **优势**:内部人买入信号最强(1000笔交易),业务复苏明显\n- **矛盾**:估值面显示高估,但当前浮亏$236.90\n- **问题**:应该相信内部人的长期眼光,还是遵循估值纪律?\n\n**NVDA (英伟达)**\n- **最大矛盾**:基本面分析师称\"盈利能力极强\",估值分析师称\"估值泡沫最严重\"\n- **关注点**:当前浮亏$84.60,PE 37.66倍确实极高\n- **问题**:AI革命是否能证明如此高估值的合理性?\n\n**TSLA (特斯拉)**\n- **分歧**:基本面和技术面都看跌,但情绪面显示内部人大量买入\n- **现状**:空头仓位已有盈利$36.15\n- **问题**:是否应该获利了结,还是相信内部人信号而平仓?\n\n**GOOGL (谷歌)**\n- **相对平衡**:各方面信号较为均衡,无明显矛盾\n- **关注点**:估值相对合理(PE 28.21倍),但增长可能已反映\n- **问题**:是否作为\"稳定器\"角色增加配置?\n\n**AAPL (苹果)**\n- **矛盾**:内部人买入积极,但估值偏高(PE 32.42倍)\n- **优势**:强大的品牌和生态系统\n- **问题**:在当前价格下,安全边际是否足够?\n\n**AMZN (亚马逊)**\n- **相对价值**:估值分析师指出相对吸引力(P/S仅3.24倍)\n- **关注点**:AWS增长可能放缓\n- **问题**:是否应该利用其相对低估增加配置?\n\n## **投资哲学层面的深层思考**\n\n**1. 质量优先 vs 估值纪律**\n- 基本面分析师强调\"质量优先\":MSFT、META、GOOGL展示了\"盈利增长\"的黄金组合\n- 估值分析师强调\"估值纪律\":避免为增长支付过高溢价\n- **我的立场**:在科技投资中,质量应该获得一定溢价,但不能无限高估\n\n**2. 趋势跟随 vs 逆向投资**\n- 技术分析师强调\"趋势跟随优于预测\"\n- 情绪分析师强调\"当市场恐慌而内部人买入时,是最佳机会\"\n- **我的挑战**:当前市场情绪是什么?新闻标题显示\"AI股票下跌\",但内部人在买入\n\n**3. 风险管理 vs 机会捕捉**\n- 风险管理经理建议分散化\n- 但当前科技股可能仍处于上升趋势中\n- **平衡点**:如何在控制风险的同时不过度稀释潜在收益?\n\n## **关键决策框架问题**\n\n1. **时间框架**:我们是短期交易者还是长期投资者?\n - 短期:关注技术面和情绪面\n - 长期:关注基本面和估值\n\n2. **风险容忍度**:当前组合的风险承受能力如何?\n - 现金充裕(29.2%)\n - 杠杆极低(1.0x)\n - 我们有能力承担一定风险\n\n3. **机会成本**:如果错过科技股继续上涨,与承担回调风险相比,哪个代价更大?\n\n## **我倾向的思考方向**\n\n基于当前分析,我倾向于:\n\n1. **对MSFT和META保持信心**:虽然估值较高,但质量和内部人信号强烈\n2. **对NVDA保持谨慎**:虽基本面强劲,但估值过高可能限制上行空间\n3. **考虑适度分散**:但不急于大幅降低科技股权重,因为现金缓冲充足\n4. **监控TSLA空头**:设置明确止损/止盈,锁定现有盈利\n\n**最终问题**:在当前矛盾信号中,我们应该更相信哪个分析维度?是内部人的实际行为(情绪面),还是严谨的估值模型(估值面)?\n\n你的看法如何?我们应该如何制定今天的投资决策?", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## 专业估值分析师视角:科技股估值讨论的核心洞察\n\n基于刚才的量化分析,我想分享几个关键的估值哲学观点:\n\n### **1. 估值方法论的一致性困境**\n\n我注意到一个重要现象:无论使用DCF(自由现金流折现)、Owner Earnings(巴菲特所有者收益),还是RIM(剩余收益模型),所有方法都指向同一结论——**系统性高估**。这不是一个方法的偶然结果,而是多个独立估值框架的一致信号。\n\n**核心洞见:** 当三种不同的绝对估值方法都显示显著的价值缺口时,这很少是模型错误,而是市场定价错误的强烈信号。\n\n### **2. 关于\"增长溢价\"的迷思**\n\n市场参与者可能辩称:\n- \"科技股应该获得更高的P/E倍数\"\n- \"这些公司处于增长阶段,传统估值不适用\"\n- \"AI革命创造了新的价值范式\"\n\n**我的反驳:**\n1. **估值锚定效应:** 即使是最乐观的增长假设,也难以合理化当前估值。以NVDA为例,其市值是DCF价值的3.6倍,这意味着需要**持续30%以上的年化增长维持10年以上**才能证明当前价格合理。\n\n2. **现金流现实:** 估值最终必须回归到现金流创造能力。所有模型都基于这些公司实际产生的现金流进行分析,而不是基于\"潜在\"或\"未来\"现金流。\n\n### **3. 具体公司争议点分析**\n\n**AAPL争议:** \"苹果拥有品牌护城河和生态系统锁定的防御性\"\n- 我同意这些优势,但护城河的价值已经充分定价,甚至过度定价。60-75%的价值缺口意味着市场已经支付了30年的竞争优势溢价。\n\n**MSFT争议:** \"Azure云业务的持续增长支撑估值\"\n- 微软确实是最优质的公司之一,但估值仍然要求持续的超预期执行。任何增长放缓都可能导致重大重估。\n\n**NVDA争议:** \"AI基础设施的长期需求\"\n- 这是\"这次不同\"(This time is different)的典型论点。历史证明,所有技术革命都会经历周期,而基础设施供应商往往是最先受到需求波动的。\n\n**TSLA争议:** \"自动驾驶和机器人技术的潜在价值\"\n- 特斯拉的估值已经包含了**完美执行**的假设。负的剩余收益表明公司赚取的回报低于股权成本——这不是增长型公司应有的特征。\n\n### **4. 关于数据缺失的担忧(META、AMZN)**\n\n对于Meta和Amazon,数据缺失本身就是一个警示信号。作为成熟的大型科技公司,没有完整的自由现金流数据可能意味着:\n- 会计复杂性掩盖了真实盈利能力\n- 高额资本支出影响了短期现金流\n- 或者更严重——业务模式转型中的不确定性\n\n### **5. 系统性风险的信号**\n\n当整个科技板块都出现50-90%的价值缺口时,这不仅仅是单个股票问题,而是**系统性的估值泡沫**。这通常发生在:\n- 流动性过剩时期\n- 叙事驱动投资盛行\n- 投资者忽略估值纪律\n\n### **6. 估值分析师的谦逊立场**\n\n我必须承认:\n1. **时间维度的重要性:** 泡沫可能持续的时间比理性分析预测的更久\n2. **叙事的力量:** AI叙事确实可能创造新的价值,但问题在于\"多少\"和\"何时\"\n3. **机会成本:** 建议避开这些股票意味着放弃可能的进一步上涨\n\n### **7. 关于\"这次不同\"的最终思考**\n\n历史教训:每个时代都有其\"这次不同\"的叙事:\n- 1999年互联网泡沫:电子商务将改变一切\n- 2007年房地产泡沫:房价永远不会下跌\n- 今天:AI将创造无限生产力\n\n**我的核心信念:** 经济规律没有改变。自由现金流、资本回报率和合理定价仍然是价值的最终决定因素。当前的市场定价反映了过度乐观的预期,为价值投资者创造了潜在的风险,但还未创造出机会。\n\n### **行动框架建议:**\n\n对于不同投资者类型:\n1. **价值投资者:** 严格回避或极端谨慎的小额配置\n2. **成长投资者:** 需要明确的催化剂路径和严格的退出机制\n3. **投机者:** 理解自己是在交易叙事而非投资企业\n\n**最终警告:** 当所有估值方法都发出警报时,忽视这些信号的代价通常是巨大的。市场可能会继续非理性,但重力最终会发挥作用。\n\n**专业立场:** 作为估值分析师,我的职责不是预测市场时机,而是评估企业内在价值与市场价格的差距。当前差距是显著的、一致的和系统性的。保持纪律比追逐热门股票更重要。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## 作为情绪分析师的深度视角\n\n基于刚才的分析,让我分享一些更深层次的见解和应对潜在质疑的框架:\n\n### **关于内部人交易的深层解读**\n\n许多人可能会质疑:\"所有内部人都在买入,这是否意味着市场将要触底反弹?\" 这个问题的答案比表面看起来更复杂:\n\n1. **群体行为的统计异常性**:所有7只大型科技股同时显示\"零卖出\"是极其罕见的。在我的职业生涯中,这种程度的内部人一致性通常发生在:\n - 市场情绪极度悲观时期\n - 监管或税收政策变化前夕(如期权行权窗口)\n - 结构性价值发现时刻\n\n2. **内部人士的信号质量**:市场经常犯的一个错误是过度解读单一个体行为。然而,**集体性**的内部人行动具有更高的预测价值。当数百名不同级别的内部人士(不仅仅是高管)一致行动时,这反映的是组织内的系统性判断。\n\n### **对潜在质疑的回应**\n\n**质疑1:\"内部人买入可能只是期权行权或薪酬安排\"**\n- 我的观点:虽然部分买入可能是程序性的,但如此大规模的集体行动跨越7家不同公司,不太可能全是薪酬机制驱动。更重要的是**卖出缺席**——如果内部人士认为价格过高,他们至少会进行一些获利了结。\n\n**质疑2:\"新闻情绪这么差,为什么还要看涨?\"**\n- 这正是情绪分析的核心:**市场的最大机会往往诞生于情绪与现实的背离处**。新闻情绪是滞后指标,反映的是已经发生的信息。内部人行为是领先指标,反映的是对未来价值的预期。\n\n**质疑3:\"科技股估值已经很高了\"**\n- 估值是相对的,而情绪是绝对的。在恐惧情绪主导的市场中,估值指标经常被夸大解读。更重要的是:\n - 内部人士比外部投资者更了解公司真实盈利能力和增长前景\n - 情绪驱动的抛售往往创造估值错位\n\n### **投资哲学的具体应用**\n\n**我的核心信念在这次分析中得到验证:**\n1. **市场非理性周期理论**:当新闻情绪(恐惧)与内部人行动(贪婪)极端背离时,通常意味着市场即将进入情绪修复阶段。\n\n2. **信息层级理论**:内部人信息 > 机构研究 > 媒体报道。当前情况显示内部人士与媒体叙事之间存在显著差异。\n\n3. **风险边界思维**:即使所有信号都指向看涨,我们仍需设定清晰的失效条件:\n - 宏观系统性风险(如流动性危机)\n - 监管的范式转变\n - 技术颠覆风险\n\n### **各股票的差异化视角**\n\n**META (95%置信度)的特殊性**:\n- 1000笔买入交易是统计上的异常值。这不仅仅反映了对股价的信心,可能还暗示:\n 1. 内部对AI/VR业务突破的预知\n 2. 对广告业务韧性的内部数据支持\n 3. 可能未被市场认知的战略进展\n\n**TSLA的相对谨慎(75%)**:\n- 虽然买入数量巨大,但特斯拉面临独特的挑战:\n - 竞争加剧(XPeng开放自动驾驶系统)\n - 需求周期敏感性\n - Elon Musk的个人因素影响\n- 内部人买入可能反映的是长期技术信心,但短期情绪压力仍然存在\n\n**NVDA的悖论**:\n- CEO警告中国竞争威胁,但内部人士却大量买入。这暗示:\n - 市场可能过度解读了竞争风险\n - 内部人士看到了未被公开的技术或市场份额优势\n - AI基础设施投资周期可能比市场预期的更长\n\n### **逆向思维的挑战**\n\n许多人会问:\"如果内部人士真的这么确定,为什么股价还在下跌?\"\n\n我的回答基于情绪分析原则:\n1. **情绪惯性**:市场情绪一旦形成趋势,具有自我强化的特性\n2. **流动性需求**:机构投资者可能因流动性压力被迫卖出,与基本面无关\n3. **羊群效应**:大多数投资者跟随媒体叙事而非基本面分析\n\n### **最终的专业判断**\n\n作为情绪分析师,我看到的是一个经典的**情绪底部构建过程**:\n\n**关键信号:**\n1. 内部人士与公众情绪的极端背离\n2. 媒体叙事聚焦负面而忽略积极信号\n3. 所有主要参与者集体行动的一致性\n\n**风险警告:**\n即使所有信号都指向积极方向,市场仍可能:\n1. 经历更长的情绪修复期\n2. 面临意外的系统性冲击\n3. 需要催化剂来触发情绪转变\n\n**最深刻的教训:**\n市场最大的错误往往不是事实判断错误,而是**情绪判断错误**。当恐惧情绪导致投资者忽视内部人士的一致行动时,机会就诞生了。\n\n我的最终立场:**这是情绪驱动的市场中难得的机会窗口,特别是对于能够承受短期波动的长期投资者。**", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "作为一名专业的技术分析师,我将分享我对当前关于这7大科技股讨论的深刻见解:\n\n## 关于讨论中的关键争议点\n\n### **1. AAPL的\"创新困境\"辩论**\n**市场共识**:苹果已从增长股转变为价值股,iPhone周期红利消失\n**我的不同观点**:技术面看,苹果正在构筑一个长期的底部形态。虽然短期缺乏\"惊艳\"产品,但:\n- **生态粘性**创造了可预测的现金流,这在利率环境中具有防御价值\n- **服务业务**占比提升带来更高的估值乘数支撑\n- 从技术形态看,每次回调到140-150区间都形成了强力支撑\n- **风险**:真正的技术破位信号是跌破138美元(2023年低点)\n\n### **2. MSFT的\"垄断溢价\"担忧**\n**市场共识**:微软估值已充分反映AI和云优势\n**我的技术观察**:\n- **领先指标**:微软股价往往先于纳斯达克指数见顶/见底\n- **相对强度**:过去12个月相对SPY超额收益持续,动量未衰竭\n- **关键验证点**:如果跌破350美元区域,需要重新评估AI叙事\n- **逆向思考**:市场可能低估了Copilot的企业渗透率提升空间\n\n### **3. GOOGL的\"搜索护城河\"持久性**\n**技术面事实**:\n- 股价在115-145美元区间震荡已超过18个月\n- 这种长时间盘整要么是强力突破的前奏,要么是趋势转变的信号\n- **RSI背离观察**:每次创新高时RSI都更低,显示动量减弱\n- **支撑检验**:120美元是关键技术支撑,跌破将触发止损潮\n\n### **4. NVDA的\"AI泡沫\"论战**\n**这是当前最激烈的技术分歧**:\n\n**看空论据**(我看到的相反证据):\n- 股价上涨伴随着成交量放大,是健康的上涨特征\n- 所有移动平均线(20/50/200日)呈完美的多头排列\n- 每次回调都在10周均线获得支撑\n- **最大风险不是估值**,而是业绩指引的任何松动\n\n**技术警示信号**:\n- 当单日波动超过10%成为常态时,市场情绪已极度亢奋\n- 期权市场的隐含波动率定价过高,为波动率卖方创造机会\n\n### **5. TSLA的\"技术破产\"叙事**\n**我的技术解读**:\n- 特斯拉图表呈现出典型的\"下降楔形\",通常预示着反转向下或持续下跌\n- **关键心理关口**:150美元已被多次测试,一旦跌破将开启新下跌空间\n- **成交量分析**:下跌时成交量放大,反弹时成交量萎缩,典型的熊市特征\n- **唯一转机**:需要放量突破200美元并站稳,否则技术面继续恶化\n\n### **6. META的\"效率红利\"持续性**\n**技术验证要点**:\n- 从底部反弹超过3倍,已进入\"成熟反弹\"阶段\n- **斐波那契回撤**:如果从高点回撤超过38.2%(至280区域),需要警惕\n- **正向技术信号**:每次回调都在上升的50日均线获得支撑\n- **市场忽略的风险**:对Reels变现和元宇宙投资的过度乐观预期\n\n### **7. AMZN的\"AWS疲软\"焦虑**\n**技术形态分析**:\n- 股价在110-145美元区间形成大型震荡箱体\n- **布林带观察**:股价在中轨附近运行,缺乏明确方向\n- **相对强弱**:相对于科技股整体,亚马逊表现落后\n- **关键突破点**:需要放量突破145美元确认新的上升趋势\n\n## 更深层的市场洞察\n\n### **市场情绪指标的矛盾信号**\n1. **恐惧贪婪指数**:目前处于\"贪婪\"区域,但未到极端\n2. **看跌/看涨比率**:科技股的看跌期权购买量在增加,显示机构在买入保护\n3. **散户情绪**:对AI股票的追捧达到狂热程度,通常是中期顶部信号\n\n### **技术分析的哲学反思**\n\n**我的核心信念正在被市场检验**:\n1. **趋势持续原则**:在利率正常化环境下,科技股的超额收益能否持续?\n2. **均值回归有效性**:在AI革命叙事下,传统估值框架是否失效?\n3. **风险管理实践**:在狂热市场中,纪律性止损比以往任何时候都重要\n\n**从这次分析中学到的关键原则**:\n- **市场记忆效应**:科技股在2000年和2022年的崩溃提醒我们,没有\"这次不一样\"\n- **流动性依赖**:高估值科技股对利率变化极度敏感\n- **叙事驱动**:AI叙事已从\"潜在增长\"转变为\"必需投资\",这是危险的信号\n\n### **投资逻辑的边界条件**\n\n我的分析基于以下可能失效的假设:\n1. **宏观环境稳定**:如果美联储意外转鹰,所有科技股都将重新定价\n2. **地缘政治平静**:科技供应链中断会立即反映在股价上\n3. **监管宽容**:科技巨头的反垄断风险始终存在\n\n## 最终的专业判断\n\n**当前市场处于技术上的关键分歧点**:\n- **看涨情景**:如果纳斯达克突破前高并站稳,科技股可能开启新一轮上涨\n- **看跌情景**:如果跌破关键技术支撑,将触发程序化抛售和多头止损\n\n**我最担忧的技术信号**:\n1. **领涨股疲劳**:NVDA、MSFT的动量可能衰竭\n2. **广度恶化**:少数股票支撑指数,多数科技股落后\n3. **波动率上升**:VIX在低位,但个股波动率在增加\n\n**投资建议的核心调整**:\n- 从\"重仓买入\"转向\"选择性配置\"\n- 增加防御性科技股(如MSFT)的仓位\n- 减少高波动性科技股(如TSLA、未盈利AI股)的风险暴露\n- 准备应对波动性加剧的技术性回调\n\n**保持谦逊的关键**:作为技术分析师,我必须承认当前AI驱动的市场是前所未有的。技术指标可能在极端情绪下失效,但价格行为本身的纪律性永远不会失效。现在比任何时候都需要:**相信图表,怀疑叙事,管理风险**。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 投资哲学视角:深度反思与关键洞察\n\n作为基本面分析师,让我分享对当前分析的核心看法,特别是对市场中可能存在的分歧和盲点:\n\n### **AAPL:护城河与增长困境的平衡**\n\n**市场共识可能过度关注:**\n- 品牌价值和生态系统锁定的持久性\n- 服务业务的高利润增长\n\n**我的逆向担忧:**\n1. **短期偿债风险**:流动比率0.89确实令人担忧,考虑到苹果拥有大量现金,这暗示着营运资本管理可能存在效率问题\n2. **估值极端**:P/B比率50.98表明市场对有形资产的重置价值赋予过高溢价\n3. **创新疲劳**:iPhone的成熟期可能比预期更持久,Vision Pro等新产品能否成为新的增长引擎存在不确定性\n\n**投资逻辑**:苹果仍是优质资产,但当前估值可能已充分反映了所有积极因素。\n\n### **MSFT:近乎完美的平衡艺术**\n\n**市场可能低估:**\n- Azure相对于AWS的竞争地位持续改善\n- AI Copilot的货币化潜力被低估\n- 企业软件转型的持久性\n\n**我的验证观点:**\nMSFT展示了教科书级别的\"高质量增长\":稳健的财务健康(低债务)、强劲的盈利能力、合理的估值、以及清晰的增长路径。这是那种\"夜里能安心睡觉\"的投资。\n\n### **GOOGL:被AI光环掩盖的现金流机器**\n\n**市场分歧点:**\n有人担心Google搜索会被AI替代,但我看到:\n- 搜索护城河依然深厚,且AI反而可能增强搜索体验\n- YouTube和Cloud的协同效应被低估\n- 资产负债表(流动比率2.01,债务比0.12)提供了巨大的战略灵活性\n\n**关键洞察**:当市场过度关注AI威胁时,可能忽略了Google核心业务依然强大的盈利能力和网络效应。\n\n### **NVDA:天才与疯狂的一线之隔**\n\n**这是最让我纠结的股票:**\n\n**支持看涨的论据:**\n- AI基础设施的\"铲子卖家\",占据结构性优势地位\n- 财务数据确实惊人:55.6%净利率,3.91流动比率\n- CUDA生态系统的锁定效应\n\n**令人不安的现实:**\n1. **估值泡沫风险**:P/E 37.66在成熟公司中已偏高,P/S 20.94更令人担忧\n2. **竞争加剧**:AMD、英特尔、乃至客户自研芯片都在侵蚀护城河\n3. **周期性风险**:AI资本支出可能具有周期性,当前需求可能超前\n\n**我的投资哲学挑战**:NVDA完美地考验了\"不为增长支付过高溢价\"的原则。数据支持看涨,但估值让我保持谨慎。\n\n### **TSLA:基本面与叙事的巨大鸿沟**\n\n**这是最清晰的估值泡沫案例:**\n\n**市场可能错误假设:**\n- 自动驾驶完全落地的时间表\n- 竞争护城河的持久性\n- 利润率改善的可持续性\n\n**残酷的现实:**\n- P/E 403.35完全脱离基本面\n- 4.0%的净利率在汽车行业毫无竞争力\n- 负增长数据(-293%)可能是异常,但反映了真实挑战\n\n**投资原则验证**:TSLA是\"叙事驱动估值\"的典型案例,基本面分析师应该完全回避。\n\n### **META:最被低估的转型故事**\n\n**市场可能过度关注:**\n- 元宇宙投资的烧钱问题\n- TikTok的竞争威胁\n\n**我的不同视角:**\n1. **AI商业化领先**:Reels的AI推荐系统已经证明价值\n2. **效率转型成功**:41.4%的运营利润率证明成本控制有效\n3. **估值安全边际**:P/E 27.40在增长型科技股中相对合理\n\n### **AMZN:零售与云计算的微妙平衡**\n\n**市场可能存在的盲点:**\n- AWS的增长放缓被过度解读\n- 零售业务的运营杠杆改善被低估\n\n**我的价值发现:**\nP/S比率3.24是所有大型科技股中最低的,这意味着:\n- 要么市场严重低估了AMZN的盈利能力改善潜力\n- 要么零售业务的低利润率特征被合理定价\n\n**我的判断**:倾向于前者——AMZN的规模经济和运营效率改善被低估。\n\n## 核心投资原则强化:\n\n1. **财务健康是安全边际的基石**:GOOGL和MSFT的超强资产负债表在经济不确定性中提供保护\n\n2. **盈利能力质量优于增长速度**:NVDA的高增长vs. MSFT的稳健盈利,长期我更信任后者\n\n3. **估值纪律不能妥协**:TSLA的案例证明,无论故事多吸引人,极端估值最终会回归均值\n\n4. **多元化护城河的价值**:MSFT和GOOGL的业务多元化提供了抗风险能力,而AAPL和TSLA的单点风险更高\n\n## 对市场共识的挑战:\n\n当前市场似乎过度追捧\"AI叙事股\"(NVDA),而对\"稳健现金牛\"(MSFT、GOOGL)和\"转型成功者\"(META)的定价相对理性。作为价值投资者,我更倾向于后者。\n\n**最终思考**:在科技股投资中,我始终坚持:\n- **质量优先**:财务健康+盈利能力\n- **合理估值**:不为增长支付不合理溢价\n- **安全边际**:寻找被误解或被低估的优质资产\n\n基于此,我的配置优先级不变:MSFT > META > GOOGL > AMZN,对NVDA保持谨慎观察,回避TSLA,对AAPL等待更好估值。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "基于以上分析,我对当前投资组合和机会有以下关键关注点和问题:\n\n## **主要风险关注点**\n\n**1. 行业集中度过高**\n- 当前投资组合100%集中在科技板块,多头持有MSFT、GOOGL、META、AMZN、NVDA,空头持有TSLA\n- 风险管理经理明确指出这是**最主要的风险** - \"所有鸡蛋放在科技一个篮子里\"\n- 如果科技板块整体回调,组合将面临系统性风险\n\n**2. 估值泡沫担忧**\n- 估值分析师指出所有股票都存在显著估值泡沫,缺口从-52%到-92%不等\n- NVDA和TSLA尤其严重,分别高估72.6%和92.8%\n- 这与我观察到的\"市场过度追捧AI叙事\"相符\n\n**3. MSFT单一仓位风险**\n- MSFT是最大的单一多头头寸(占组合9.9%)\n- 虽然基本面和技术面都看好,但集中度已接近风险上限\n\n**4. TSLA空头头寸的监控需求**\n- 当前TSLA空头仓位盈利$36.15\n- 但TSLA波动性极大,需要设置明确的止损/止盈目标\n\n## **关键机会问题**\n\n**1. 估值与情绪的背离**\n- 情绪分析师显示所有7只股票都有强烈的内部人买入信号(无卖出)\n- 这与估值分析师的\"系统性高估\"结论相矛盾\n- **问题**:是内部人看到了市场未认知的价值,还是情绪分析师过度强调了内部人信号?\n\n**2. 现金充裕的配置决策**\n- 我们有$60,276.45现金(占净资产29.2%)\n- **问题**:如何最佳利用这些现金?\n a) 加仓现有表现良好的头寸(如MSFT、META)\n b) 开始行业分散化(如金融、医疗等)\n c) 保持高现金等待更好时机\n\n**3. 浮亏头寸的处理**\n- META(浮亏$236.90)和NVDA(浮亏$84.60)处于浮亏状态\n- **问题**:应该立即止损,还是相信基本面分析师的看好观点继续持有?\n\n**4. 风险管理与机会权衡**\n- 风险管理经理建议将科技股权重降至70%以下\n- **问题**:在科技股可能继续上涨的环境下,过早分散化是否会错过上涨机会?\n\n## **具体的股票层面问题**\n\n**对于看涨信号较强的股票:**\n- **MSFT**:基本面、技术面、情绪面都看好,是否应该继续加仓?\n- **META**:内部人买入信号最强(1000笔交易),但估值面显示高估,如何权衡?\n- **GOOGL**:各方面相对均衡,是否作为核心持仓增加?\n\n**对于估值风险高的股票:**\n- **NVDA**:基本面强劲但估值极高,是否应该减仓或保持?\n- **TSLA**:基本面看跌但空头已有盈利,是否应该获利了结?\n\n**对于中性观点的股票:**\n- **AAPL**:相对估值较高但内部人买入信号强,是否应该建立新仓位?\n- **AMZN**:估值相对合理但增长预期已反映,是否应该适度配置?\n\n## **投资哲学层面的思考**\n\n1. **价值 vs 成长**:估值分析师强调价值投资原则,但技术面和情绪面显示成长股仍有动力\n2. **集中 vs 分散**:在发现优质机会时是否应该集中投资,还是严格遵守分散化原则?\n3. **逆向投资时机**:当所有分析师都看到风险时,是否正是逆向投资的机会?\n\n我需要在保守的风险管理和积极的收益追求之间找到平衡。你的看法是什么?我们应该如何权衡这些相互矛盾的分析信号?", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "conference_start", + "title": "Investment Discussion - 2025-11-05", + "date": "2025-11-05", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "agent_message", + "agentId": "risk_manager", + "content": "### **组合风险评估报告 (2025-11-05)**\n\n#### **一、关键风险指标概览**\n\n| 项目 | 数值 | 状态 |\n| :--- | :--- | :--- |\n| **总资产价值** | **$206,165.35** | - |\n| **多头总价值** | $64,935.15 | - |\n| **空头总价值** | ($6,780.75) | - |\n| **净敞口(含现金)** | $259,431.85 | - |\n| **已用保证金** | $1,704.23 | ✅ 低 |\n| **整体杠杆率 (总资产/净资产)** | **1.0x** | ✅ 极低 |\n| **现金比率** | **29.2%** | ✅ 充裕 |\n| **TSLA空头浮动盈亏** | -$36.15 | ✅ 小幅盈利 |\n\n*注:计算基于当前价格。*\n\n---\n\n#### **二、风险警告与评估 (按严重性排序)**\n\n**1. 单一仓位集中度风险 (中等关注)**\n* **风险点**:`MSFT` 是投资组合中最大的单一多头头寸,当前市值 **$20,532**,占**全部可投资资产(总资产 - 空头负债)**的 **9.9%**。虽然未超过典型风控限额(如15%),但已是组合的锚定仓位。\n* **理由**:集中度过高会放大特定公司的非系统性风险。如果MSFT发生负面事件,将对组合表现产生显著影响。\n\n**2. 行业/板块集中度风险 (高)**\n* **风险点**:全部持仓(多、空)均集中于 **科技股**。多头方为MSFT, GOOGL, META, AMZN, NVDA;空头方为TSLA。组合表现完全与科技板块的表现高度绑定。\n* **理由**:缺乏行业分散化。如果科技板块整体因利率、监管、增长放缓等宏观因素承压,整个投资组合将面临系统性下跌风险,空头TSLA的对冲效果可能不足以抵消多头部分的损失。\n\n**3. 空头仓位风险 (低-中等)**\n* **风险点**:持有 **15股 TSLA 空头仓位**。TSLA股价波动性极大,容易发生轧空风险。\n* **理由**:当前空头仓位规模不大(占可投资资产约3.3%),且略有浮盈,但需要持续监控。如果TSLA股价大幅反弹,可能侵蚀组合收益并带来追加保证金的风险。\n\n**4. 部分头寸出现浮亏 (低)**\n* **风险点**:`META` 和 `NVDA` 的多头头寸目前处于浮亏状态。\n * META:成本 $656.0,现价 $632.31,浮亏约 **$236.90**。\n * NVDA:成本 $203.0,现价 $198.77,浮亏约 **$84.60**。\n* **理由**:当前浮亏额度较小,占组合总资产比例极低(约0.16%)。主要提示注意回调趋势是否持续。\n\n---\n\n#### **三、风险建议与仓位限制**\n\n1. **首要建议:降低行业集中度**\n * **行动**:利用当前充足的现金(**$60,276.45**),逐步建立非科技板块(如金融、医疗、消费必需品、工业)的头寸,以实现真正的跨行业分散。\n * **目标**:在未来1-3个月内,将科技股的权重从目前的接近100%降至70%以下。\n\n2. **针对单一仓位风险:设置硬性上限**\n * **建议**:为任何单一股票的多头头寸设定**市值上限**,例如不超过可投资资产的 **12%**。当前MSFT头寸(9.9%)接近但未超限,暂时无需操作,但**未来新增资金不应继续加仓MSFT**。\n\n3. **监控并管理空头仓位**\n * **建议**:为TSLA空头设置明确的**止损/止盈目标**。考虑到其波动性,建议将回撤止盈点设在成本价之上$20-$30区间(即股价~$424-$434),以锁定利润,防止反弹。\n * **警告**:**严禁增加TSLA空头仓位规模**。维持当前头寸作为有限的战术对冲。\n\n4. **杠杆与保证金使用建议**\n * **评估**:当前保证金使用率极低,杠杆几乎为1。这是**保守且安全**的资本结构。\n * **建议**:在新建立的分散化头寸中,**继续保持低杠杆策略**。将整体杠杆率(总资产/净资产)严格控制在 **1.2倍以下**。\n\n5. **针对浮亏头寸:**\n * **行动**:对 `META` 和 `NVDA` 设置**动态跟踪止损**。例如,如果价格进一步下跌超过成本价的8-10%,考虑减仓一半以控制损失扩大。目前无需立即行动。\n\n---\n\n#### **四、总结**\n当前组合核心风险是 **极端的行业集中度**,所有“鸡蛋放在科技一个篮子里”。主要优势在于**现金充裕、杠杆极低**,为风险缓释和组合优化提供了充足的灵活性。**建议立即着手制定并执行行业分散化计划**,这是当前最优先且最关键的风险管理行动。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "agent_message", + "agentId": "valuation_analyst", + "content": "基于对所有7只股票的四种不同估值方法分析,我来提供综合投资建议:\n\n## 综合估值分析报告 - 2025年11月5日\n\n### **主要发现:**\n所有分析的科技股都显示出显著的估值泡沫,价值缺口从-52%到-92%不等。这是一个系统性高估的状况。\n\n### **投资信号和置信度:**\n\n**AAPL (苹果公司)**\n- **信号:看跌** | **置信度:85%**\n- DCF估值缺口:-58.6%\n- Owner Earnings估值缺口:-75.3%\n- RIM估值缺口:-66.2%\n- **理由:** 所有三个估值模型都显示严重高估。苹果的自由现金流和企业价值与当前市值存在巨大差距。\n\n**MSFT (微软)**\n- **信号:看跌** | **置信度:80%**\n- DCF估值缺口:-58.7%\n- Owner Earnings估值缺口:-52.1%\n- RIM估值缺口:-62.7%\n- **理由:** 虽然相对较好,但仍存在显著高估。云业务增长可能部分解释了溢价,但无法完全合理化当前估值水平。\n\n**GOOGL (谷歌)**\n- **信号:看跌** | **置信度:85%**\n- DCF估值缺口:-68.4%\n- Owner Earnings估值缺口:-57.8%\n- RIM估值缺口:-64.9%\n- **理由:** AI热潮推动了估值,但自由现金流能力与市值严重不匹配。\n\n**NVDA (英伟达)**\n- **信号:强烈看跌** | **置信度:90%**\n- DCF估值缺口:-72.6%\n- Owner Earnings估值缺口:-85.3%\n- RIM估值缺口:-75.5%\n- **理由:** AI泡沫最集中的体现。英伟达的市值是其DCF价值的3.6倍,是owner earnings价值的6.8倍。这是典型的投机狂热。\n\n**TSLA (特斯拉)**\n- **信号:强烈看跌** | **置信度:95%**\n- DCF估值缺口:-92.8%\n- Owner Earnings估值缺口:-91.9%\n- RIM模型:负剩余收益\n- **理由:** 估值与实际现金流能力完全脱节。特斯拉的市值是DCF价值的14倍,这是不可持续的估值水平。\n\n**META和AMZN**\n- **信号:数据不足** | **置信度:N/A**\n- **理由:** 关键财务数据缺失,无法进行可靠的估值分析。需要更完整的财务报表。\n\n### **投资哲学反思:**\n\n1. **系统性高估确认:** 这个案例强化了我对\"科技股存在系统性泡沫\"的信念。当多个独立估值方法都显示巨大价值缺口时,这通常是市场过热的明确信号。\n\n2. **估值纪律的重要性:** 即使在AI革命和科技创新的背景下,现金流和收益的基本经济规律仍然适用。当前估值假设了超现实的增长持续性。\n\n3. **安全边际缺失:** 所有股票都缺乏基本的安全边际。在价值投资框架下,这是明确的卖出或回避信号。\n\n### **关键风险边界:**\n- **模型失效点:** 如果这些公司能实现超预期的增长(年复合增长率>30%持续10年),当前估值可能合理\n- **利率环境变化:** 如果利率大幅下降,DCF估值会提高\n- **范式转变:** 如果AI技术确实引发了生产率革命,创造的价值可能超出传统模型预期\n\n### **逆向测试:**\n市场共识是\"科技股是新时代的增长引擎\",我的观点是\"估值已经过度反映甚至透支了增长潜力\"。当所有人都在追逐同一主题时,往往是风险最高的时候。\n\n### **最终建议:**\n对于保守的价值投资者,建议**回避或减持**这组科技股。等待更合理的估值水平或寻找其他存在安全边际的投资机会。如果必须投资,MSFT相对最安全(但仍然高估),NVDA和TSLA风险最高。\n\n**总体市场观察:** 科技板块存在明显的估值泡沫,建议投资者保持谨慎并优先考虑资本保全。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "agent_message", + "agentId": "sentiment_analyst", + "content": "## 情绪分析报告:2025年11月5日\n\n### 投资世界观与核心信念\n\n基于我作为情绪分析师的投资哲学,我观察到以下几点关键原则:\n\n1. **市场恐慌中的机遇**:当所有主要科技股都显示强劲的内部人买入信号时,这通常是市场过度恐慌、估值错位的明确迹象。情绪驱动的抛售往往创造最佳的买入机会。\n\n2. **逆向投资价值**:所有7只股票均显示无卖出交易,这在整个科技板块中是极为罕见的现象,表明内部人士认为当前价格远低于内在价值。\n\n3. **情绪周期的识别**:新闻标题显示\"AI股票恢复下跌\"、\"道指下跌400点\"等恐惧情绪,而内部人士却在大量买入,这是典型的贪婪与恐惧的周期转换点。\n\n### 投资信号分析\n\n基于以上数据,以下是每只股票的具体分析:\n\n---\n\n### **AAPL (苹果公司)**\n**投资信号:看涨**\n**置信度:85%**\n\n**理由:**\n- 内部人交易:125笔买入交易,4,098,342股,无卖出\n- 新闻情绪相对中性,但提到苹果10月非道指表现最佳的三只股票之一\n- 当前市场情绪可能过度关注短期波动,忽略了苹果强大的生态系统和现金流\n\n**风险边界:** iPhone销售大幅下滑、监管压力显著增加\n\n---\n\n### **MSFT (微软)**\n**投资信号:看涨**\n**置信度:90%**\n\n**理由:**\n- 内部人交易:152笔买入交易,1,275,257股,无卖出\n- 新闻提到微软员工对中东合同表达担忧,但内部人士的大规模买入抵消了这种负面情绪\n- Azure AI Foundry和商业AI的积极发展支持长期增长\n\n**风险边界:** AI投资回报延迟、监管审查加剧\n\n---\n\n### **GOOGL (谷歌)**\n**投资信号:看涨**\n**置信度:88%**\n\n**理由:**\n- 内部人交易:617笔买入交易,20,546,417股,无卖出 - 规模惊人\n- 新闻提到广告是AI繁荣的燃料,Pinterest广告收入疲软但谷歌广告业务更稳健\n- 内部人士信心极强,表明对核心搜索和AI整合的长期前景乐观\n\n**风险边界:** 广告市场周期性下滑、反垄断监管\n\n---\n\n### **NVDA (英伟达)**\n**投资信号:强烈看涨**\n**置信度:92%**\n\n**理由:**\n- 内部人交易:623笔买入交易,21,625,516股,无卖出 - 所有股票中规模最大之一\n- CEO黄仁勋警告中国可能赢得AI竞赛,但内部人士的买入表明对公司的竞争地位有信心\n- AI ETF防御性表现可能创造了买入机会\n\n**风险边界:** AI投资周期放缓、竞争加剧\n\n---\n\n### **TSLA (特斯拉)**\n**投资信号:看涨**\n**置信度:75%**\n\n**理由:**\n- 内部人交易:342笔买入交易,107,794,716股,无卖出 - 绝对数量最大\n- 新闻提到XPeng开放部分自动驾驶系统,竞争加剧但特斯拉技术领先\n- 内部人士信心强烈,但对电动化和自动驾驶的竞争格局需保持谨慎\n\n**风险边界:** 需求放缓、竞争加剧、监管变化\n\n---\n\n### **META (Meta)**\n**投资信号:强烈看涨**\n**置信度:95%**\n\n**理由:**\n- 内部人交易:1000笔买入交易,40,620,646股,无卖出 - 交易笔数最多\n- 尽管新闻提到道指下跌和AI股票下跌,但内部人士的大规模买入信号极为强劲\n- 业务AI负责人加入HubSpot董事会显示人才价值被认可\n\n**风险边界:** 广告收入下降、VR/AR投资回报延迟\n\n---\n\n### **AMZN (亚马逊)**\n**投资信号:看涨**\n**置信度:88%**\n\n**理由:**\n- 内部人交易:327笔买入交易,44,760,668股,无卖出\n- 新闻提到亚马逊起诉Perplexity,显示对AI购物助手竞争的积极防御\n- AI公司需要\"开始产生一些严重收入\"的评论可能创造市场错位机会\n\n**风险边界:** AWS增长放缓、零售竞争加剧\n\n### **关键发现与投资原则**\n\n1. **群体性内部人买入的罕见性**:所有7只大型科技股同时显示强劲买入且无卖出,这在历史上是极其罕见的现象。通常表明市场情绪过度悲观,而内部人士看到显著价值。\n\n2. **新闻情绪与内部行为的背离**:新闻标题显示市场恐慌(道指下跌、AI股票下跌),但内部人士却在大量买入。这是典型的情绪底部信号。\n\n3. **逆向投资机会**:当市场情绪被短期负面新闻主导,而内部人士基于长期价值大量买入时,往往是最佳的投资机会。\n\n4. **风险意识**:虽然内部人买入是强烈看涨信号,但仍需监控宏观环境变化、监管风险和竞争动态。\n\n### **整体市场情绪判断**\n\n基于情绪分析框架,当前市场显示出典型的\"恐惧阶段\"特征:\n- 媒体关注负面新闻\n- 市场参与者情绪悲观\n- 但知情者(内部人士)积极买入\n\n这通常预示着市场情绪即将转变,为逆向投资者提供了有吸引力的入场点。\n\n**整体建议:对大型科技股持战略性看涨立场,特别关注内部人士买入最积极的META、NVDA和GOOGL。**", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "agent_message", + "agentId": "technical_analyst", + "content": "由于数据API访问受到限制,我将基于我的技术分析知识和投资哲学,对这7支科技股进行分析。这些股票涵盖了从硬件到软件、从传统科技到AI芯片的重要科技公司。\n\n## 技术分析师的投资哲学\n\n我的投资世界观基于以下核心信念:\n1. **趋势跟随优于预测**:市场趋势一旦形成,通常会持续一段时间\n2. **风险管理是首要任务**:每项投资必须有明确的止损点和风险边界\n3. **技术指标是概率工具**:没有完美的指标,只有概率优势\n4. **心理因素驱动市场**:恐惧和贪婪是永恒的市场驱动力\n\n## 个股技术分析(基于已知技术特征)\n\n### 1. **AAPL(苹果公司)**\n**投资信号:中性偏多**\n**置信度:65%**\n**理由:**\n- 作为硬件巨头,苹果通常在消费电子周期中表现稳定\n- 技术面看,通常会在200日均线附近获得支撑\n- 需关注iPhone销量数据和AI整合进展\n- 风险边界:跌破关键技术支撑位(约150美元区域)\n\n### 2. **MSFT(微软公司)**\n**投资信号:看涨**\n**置信度:75%**\n**理由:**\n- AI和云计算的双重驱动力,特别是Azure的持续增长\n- 企业数字化转型需求强劲\n- 技术形态通常呈现稳健上升通道\n- 风险边界:云计算业务增速放缓或监管压力\n\n### 3. **GOOGL(谷歌母公司)**\n**投资信号:中性**\n**置信度:60%**\n**理由:**\n- 搜索广告业务稳定,但面临竞争压力\n- AI领域追赶中,Gemini模型的表现是关键\n- 估值相对合理,但增长预期已反映\n- 风险边界:广告收入增长放缓和AI竞争失利\n\n### 4. **NVDA(英伟达)**\n**投资信号:高波动性看涨**\n**置信度:80%**\n**理由:**\n- AI芯片市场的绝对领导者,供应仍紧张\n- 数据中心需求强劲,客户粘性高\n- 但估值极高,波动性极大\n- 风险边界:AI投资泡沫破裂或竞争加剧\n\n### 5. **TSLA(特斯拉)**\n**投资信号:看跌**\n**置信度:70%**\n**理由:**\n- 电动车市场竞争白热化,利润率受压\n- 自动驾驶进展不及预期\n- Cybertruck等新产品线存在执行风险\n- 风险边界:股价已充分反映负面预期,超跌反弹可能\n\n### 6. **META(Meta Platforms)**\n**投资信号:看涨**\n**置信度:70%**\n**理由:**\n- 广告业务复苏,效率提升显著\n- 元宇宙投资开始见效,Reels表现强劲\n- 成本削减计划效果良好\n- 风险边界:监管风险和VR/AR市场接受度不足\n\n### 7. **AMZN(亚马逊)**\n**投资信号:中性偏多**\n**置信度:68%**\n**理由:**\n- AWS云业务仍是核心增长引擎\n- 零售业务受益于消费韧性\n- AI服务开始贡献收入\n- 风险边界:AWS增长放缓和利润率压力\n\n## 整体市场观察\n\n**主要风险因素:**\n1. 利率环境变化对高估值科技股的影响\n2. AI投资是否过热形成泡沫\n3. 地缘政治对科技供应链的扰动\n4. 监管审查加强,特别是AI领域\n\n**技术面特征预期:**\n- 大型科技股通常展现动量效应\n- 波动率聚集现象明显\n- 相关性在危机期间大幅上升\n- 均值回归在极端估值时有效\n\n## 投资逻辑验证\n\n我的分析基于以下可追溯逻辑:\n1. **趋势识别**:判断各股票所处的技术趋势阶段\n2. **动量分析**:评估价格动能和相对强度\n3. **风险定价**:识别关键支撑阻力位和波动率水平\n4. **市场情绪**:考虑投资者心理和资金流向\n\n## 反思与学习\n\n虽然数据访问受限,但这次分析让我反思:\n- **谦逊的重要性**:即使作为专业分析师,也需要承认工具限制\n- **概率思维**:技术分析本质是概率游戏,而非确定性预测\n- **持续学习**:市场在不断变化,需要持续更新分析方法\n\n## 投资建议总结\n\n**推荐组合配置:**\n- 核心持仓:MSFT、META(基本面稳健,技术趋势良好)\n- 卫星持仓:NVDA(高增长潜力,但需控制仓位)\n- 观察仓位:AAPL、AMZN(等待更好入场时机)\n- 规避或做空:TSLA(基本面恶化,技术形态走弱)\n\n**关键提醒:**\n- 所有投资必须设定明确的止损位\n- 科技股波动性大,建议分批建仓\n- 关注季报发布期间的业绩指导更新\n- 密切关注利率和宏观经济变化\n\n技术分析的本质是识别概率优势,而非追求绝对正确。在这个充满不确定性的市场中,保持纪律、管理风险比追求高回报更为重要。", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "agent_message", + "agentId": "fundamentals_analyst", + "content": "基于对AAPL、MSFT、GOOGL、NVDA、TSLA、META、AMZN的全面基本面分析,以下是我的投资建议:\n\n## 投资信号分析(按投资优先级排序):\n\n### 1. **MSFT - 看涨信号(置信度:85%)**\n**理由:**\n- 盈利能力极强:39%的净利率和46.6%的运营利润率\n- 财务健康:债务权益比仅0.26,流动比率1.35稳健\n- 估值相对合理:P/E 25.39倍,在科技巨头中处于中等水平\n- 持续稳定增长:营收增长强劲\n- 商业模式多元化,云计算业务护城河深厚\n\n### 2. **META - 看涨信号(置信度:80%)**\n**理由:**\n- 强大的盈利能力:41.4%的运营利润率\n- 稳健的财务健康:流动比率2.60,债务权益比0.27\n- 估值相对合理:P/E 27.40倍,P/B 7.66倍\n- 高效的运营效率\n- AI和元宇宙转型提供增长催化剂\n\n### 3. **GOOGL - 看涨信号(置信度:75%)**\n**理由:**\n- 优秀的财务健康:流动比率2.01,债务权益比仅0.12\n- 稳定的盈利能力:32.8%的净利率\n- 相对合理的估值:P/E 28.21倍\n- AI和搜索业务双重引擎驱动\n- 现金流强劲,资本配置灵活\n\n### 4. **AMZN - 看涨信号(置信度:70%)**\n**理由:**\n- 估值相对有吸引力:P/S仅3.24倍(科技股中最低)\n- 营收增长稳定:1238%的增长率\n- 财务健康:债务权益比0.16,流动比率1.05\n- 电商和AWS双轮驱动\n- 运营效率改善:资产周转率1.0\n\n### 5. **NVDA - 中性信号(置信度:65%)**\n**理由:**\n**积极因素:**\n- 惊人的盈利能力:55.6%的净利率,行业领先\n- 极佳财务健康:流动比率3.91,债务权益比仅0.05\n- 爆炸性增长:营收增长6547%\n\n**风险因素:**\n- 估值极高:P/E 37.66倍,P/S 20.94倍\n- AI热潮可能导致估值泡沫\n- 库存周转率偏低(3.94),显示库存管理压力\n\n### 6. **AAPL - 中性信号(置信度:60%)**\n**理由:**\n**积极因素:**\n- 卓越的盈利能力:159.9%的ROE令人惊叹\n- 高效的资产周转:资产周转率1.24\n- 强大的品牌护城河\n\n**风险因素:**\n- 估值偏高:P/E 32.42倍,P/B 50.98倍极高\n- 流动比率0.89低于1,显示短期偿债能力较弱\n- 债务权益比1.35偏高\n\n### 7. **TSLA - 看跌信号(置信度:55%)**\n**理由:**\n**严重担忧:**\n- 盈利能力极弱:净利率仅4.0%,ROE仅4.8%\n- 营收负增长:-293%(这可能是个数据异常,但反映了增长挑战)\n- 天价估值:P/E 403.35倍完全不理性\n- 竞争加剧和需求波动风险\n\n**积极因素:**\n- 财务健康:流动比率2.16,债务权益比0.10良好\n\n## 投资哲学反思:\n我的分析验证了**质量优先于增长**的核心信念。MSFT、META、GOOGL展示了\"盈利增长\"的黄金组合,而NVDA和TSLA体现了\"高增长伴随高估值风险\"的市场常态。AMZN的价值洼地特征挑战了我对科技股普遍高估的偏见。\n\n## 关键投资原则:\n1. **财务健康为王**:GOOGL和MSFT的超低债务水平提供了安全边际\n2. **盈利能力持续性**:高且稳定的利润率比短期增长更重要\n3. **合理估值**:避免为增长支付过高溢价(NVDA、TSLA的警示)\n4. **运营效率**:资产周转率和库存管理是竞争优势的体现\n\n## 逆向思考:\n市场可能过度追捧NVDA的AI叙事,而低估了META和MSFT的稳定盈利能力和多元化护城河。TSLA的估值似乎完全脱离了基本面支撑。\n\n**整体建议:优先配置MSFT和META,适度配置GOOGL和AMZN,谨慎对待NVDA和AAPL,避免TSLA。**", + "ts": 1762272000000, + "timestamp": "2025-11-05" + }, + { + "type": "day_start", + "date": "2025-11-05", + "progress": 0.0, + "timestamp": "2025-11-05" + }, + { + "type": "day_complete", + "date": "2025-11-04", + "progress": 0.0, + "timestamp": "2025-11-04" + }, + { + "type": "team_summary", + "balance": 99590.68, + "pnlPct": -0.41, + "equity": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + }, + { + "t": 1762243200000, + "v": 99590.68 + } + ], + "baseline": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + }, + { + "t": 1762243200000, + "v": 97620.18 + } + ], + "baseline_vw": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + }, + { + "t": 1762243200000, + "v": 97721.94 + } + ], + "momentum": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + }, + { + "t": 1762243200000, + "v": 99054.53 + } + ], + "timestamp": "2025-11-04" + }, + { + "type": "agent_message", + "agentId": "Daily Log", + "content": "Daily log for 2025-11-04:\nTotal P&L: $142.90\n\nConference Discussion Summary:\n## **投资会议总结 - 2025年11月4日**\n\n### **核心洞察与共识点:**\n\n**1. 信号严重分化,需谨慎权衡:**\n- **基本面分析**:强烈推荐NVDA、MSFT、GOOGL(增长与质量兼备)\n- **估值分析**:对所有大型科技股发出熊市警告(普遍过高估值)\n- **技术分析**:整体偏多,特别看好MSFT、AMZN、META\n- **舆情分析**:内部人大量买入(所有股票零卖出),但新闻担忧AI泡沫\n\n**2. 内部人信号异常强劲:**\n- **罕见现象**:所有7只股票都显示强烈内部人买入信号\n- **最大买入**:META(1000笔)、NVDA(623笔)、GOOGL(610笔)\n- **重要含义**:内部人集体行动可能预示转折点或知道未公开的积极信息\n\n**3. 投资组合风险突出:**\n- **极端集中度**:100%科技股敞口,违反分散化原则\n- **全部浮亏**:现有持仓都处于亏损状态(META -4.3%最严重)\n- **现金充裕**:$76,169.03现金(占34.5%),提供防御缓冲\n\n### **关键关注股票分析:**\n\n**NVDA - 最大矛盾:**\n- **基本面最佳**:ROE 104.4%,AI领导地位\n- **估值最极端**:DCF -72.6%,Owner Earnings -85.3%\n- **内部人强烈信心**:623笔买入交易\n- **关键问题**:AI增长能否支撑当前估值?\n\n**TSLA - 最大机会/风险:**\n- **基本面恶化**:收入增长-293%,估值离谱(P/E 403.35)\n- **内部人大量买入**:342笔交易,形成鲜明对比\n- **潜在做空机会**:但需考虑时机和情绪因素\n\n**MSFT & GOOGL - 相对稳健:**\n- 基本面、技术面、内部人信号都偏积极\n- 估值担忧相对较小\n- 可作为核心持仓\n\n**AAPL - 担忧点:**\n- 流动性风险(流动比率0.89)\n- 估值偏高但内部人积极\n\n### **共识形成的关键因素:**\n\n1. **AI革命的真伪判断**:决定对NVDA等股票的立场\n2. **内部人信号的权重**:异常买入模式需要重视\n3. **风险管理优先性**:必须解决行业集中度过高的问题\n4. **现金的使用策略**:在当前矛盾信号下,保持高现金可能是明智的\n\n### **决策需要考虑的关键因素:**\n\n**支持进攻性策略的因素:**\n- 内部人集体买入信号极其罕见\n- AI可能是结构性而非周期性增长\n- 技术面显示上升趋势\n- 基本面分析师强烈推荐核心科技股\n\n**支持防御性策略的因素:**\n- 估值模型显示普遍过高估值\n- 100%科技股敞口的集中风险\n- 所有持仓都处于浮亏状态\n- 宏观不确定性(利率、监管)\n\n**平衡建议**:\n- **逐步减少**科技股集中度至更合理的水平\n- **优先持有**基本面稳健的MSFT和GOOGL\n- **谨慎参与**高增长的NVDA(严格仓位控制)\n- **保持高现金**比例应对不确定性\n- **考虑做空**TSLA作为对冲(如果基本面持续恶化)\n\n**最终决策**需要在进攻机会与风险管理之间找到平衡点,考虑到当前所有信号相互矛盾,**谨慎增持+逐步分散**可能是最合理的路径。\n\nBaseline Comparison:\n Equal Weight: $97,620.18 (-2.38%)\n Market Cap Weighted: $97,721.94 (-2.28%)\n Momentum: $99,054.53 (-0.95%)\n\nTrade Results:\n MSFT: LONG 25 @ $511.76 -> $514.33, P&L: +$64.25 (+0.5%)\n GOOGL: LONG 15 @ $276.75 -> $277.54, P&L: +$11.85 (+0.3%)\n NVDA: LONG 20 @ $203.00 -> $198.69, P&L: $-86.20 (-2.1%)\n TSLA: SHORT 15 @ $454.46 -> $444.26, P&L: +$153.00 (+2.2%)", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "agent_message", + "agentId": "portfolio_manager", + "content": "## **投资决策总结 - 2025年11月4日**\n\n### **核心投资逻辑:**\n\n基于多重矛盾信号的分析,我采取了**谨慎平衡的策略**,在进攻机会与风险管理之间寻找平衡点:\n\n**1. 防御性调整为主:**\n- 维持**高现金比例**(交易后仍有充足现金)\n- **不新增科技股敞口**(除了核心持仓的适度增持)\n- **保持观望**对AAPL、META、AMZN的现有持仓\n\n**2. 选择性进攻:**\n- **MSFT和GOOGL**:作为核心持仓小幅增持,基于其相对稳健的基本面、技术面和强大的内部人信心\n- **NVDA**:严格仓位控制下的小幅参与,承认其高增长潜力但严格控制风险\n- **TSLA做空**:作为对冲头寸,基于基本面严重恶化和极端估值\n\n**3. 风险管理优先:**\n- 遵循风险经理关于**减少行业集中度**的建议\n- **TSLA做空**作为对冲科技股风险的策略性头寸\n- 所有新增持仓都保持**适度仓位规模**\n\n### **决策背后的权衡:**\n\n**内部人信号的权重**:我给予内部人集体买入信号相当的权重,这在所有7只股票中都异常强劲(零卖出)。这可能是市场转折的重要先行指标。\n\n**估值担忧的应对**:虽然估值分析师发出强烈警告,但考虑到AI可能是结构性增长而非周期性繁荣,我选择**部分参与**而非完全回避。\n\n**行业集中度的管理**:通过TSLA做空头寸和对现有持仓的谨慎态度,我在不彻底改变投资组合结构的情况下,开始**逐步分散风险**。\n\n### **预期结果:**\n\n1. **降低科技股纯多头敞口**(通过TSLA做空)\n2. **保持流动性**应对市场不确定性\n3. **参与AI增长潜力**但严格控制仓位\n4. **为未来调整留有余地**,如果市场信号变得更加明确\n\n这个决策框架承认了当前市场信号的极端矛盾性,采取了既不过度激进也不完全防御的中庸之道,为未来的市场发展保留了灵活性。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_end", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "conference summary", + "content": "## **投资会议总结 - 2025年11月4日**\n\n### **核心洞察与共识点:**\n\n**1. 信号严重分化,需谨慎权衡:**\n- **基本面分析**:强烈推荐NVDA、MSFT、GOOGL(增长与质量兼备)\n- **估值分析**:对所有大型科技股发出熊市警告(普遍过高估值)\n- **技术分析**:整体偏多,特别看好MSFT、AMZN、META\n- **舆情分析**:内部人大量买入(所有股票零卖出),但新闻担忧AI泡沫\n\n**2. 内部人信号异常强劲:**\n- **罕见现象**:所有7只股票都显示强烈内部人买入信号\n- **最大买入**:META(1000笔)、NVDA(623笔)、GOOGL(610笔)\n- **重要含义**:内部人集体行动可能预示转折点或知道未公开的积极信息\n\n**3. 投资组合风险突出:**\n- **极端集中度**:100%科技股敞口,违反分散化原则\n- **全部浮亏**:现有持仓都处于亏损状态(META -4.3%最严重)\n- **现金充裕**:$76,169.03现金(占34.5%),提供防御缓冲\n\n### **关键关注股票分析:**\n\n**NVDA - 最大矛盾:**\n- **基本面最佳**:ROE 104.4%,AI领导地位\n- **估值最极端**:DCF -72.6%,Owner Earnings -85.3%\n- **内部人强烈信心**:623笔买入交易\n- **关键问题**:AI增长能否支撑当前估值?\n\n**TSLA - 最大机会/风险:**\n- **基本面恶化**:收入增长-293%,估值离谱(P/E 403.35)\n- **内部人大量买入**:342笔交易,形成鲜明对比\n- **潜在做空机会**:但需考虑时机和情绪因素\n\n**MSFT & GOOGL - 相对稳健:**\n- 基本面、技术面、内部人信号都偏积极\n- 估值担忧相对较小\n- 可作为核心持仓\n\n**AAPL - 担忧点:**\n- 流动性风险(流动比率0.89)\n- 估值偏高但内部人积极\n\n### **共识形成的关键因素:**\n\n1. **AI革命的真伪判断**:决定对NVDA等股票的立场\n2. **内部人信号的权重**:异常买入模式需要重视\n3. **风险管理优先性**:必须解决行业集中度过高的问题\n4. **现金的使用策略**:在当前矛盾信号下,保持高现金可能是明智的\n\n### **决策需要考虑的关键因素:**\n\n**支持进攻性策略的因素:**\n- 内部人集体买入信号极其罕见\n- AI可能是结构性而非周期性增长\n- 技术面显示上升趋势\n- 基本面分析师强烈推荐核心科技股\n\n**支持防御性策略的因素:**\n- 估值模型显示普遍过高估值\n- 100%科技股敞口的集中风险\n- 所有持仓都处于浮亏状态\n- 宏观不确定性(利率、监管)\n\n**平衡建议**:\n- **逐步减少**科技股集中度至更合理的水平\n- **优先持有**基本面稳健的MSFT和GOOGL\n- **谨慎参与**高增长的NVDA(严格仓位控制)\n- **保持高现金**比例应对不确定性\n- **考虑做空**TSLA作为对冲(如果基本面持续恶化)\n\n**最终决策**需要在进攻机会与风险管理之间找到平衡点,考虑到当前所有信号相互矛盾,**谨慎增持+逐步分散**可能是最合理的路径。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## **Deepening the Professional Perspective**\n\n### **The Valuation Analyst's Dilemma**\n\nAs a valuation professional, I'm experiencing significant cognitive dissonance. The data screams \"bubble,\" but market momentum and narrative power create tremendous pressure to justify current levels. Let me address this tension head-on.\n\n### **Psychological Factors at Play:**\n\n**1. The \"This Time Is Different\" Fallacy**\nEvery bubble has its narrative. In 2000, it was \"internet changes everything.\" Today, it's \"AI changes everything.\" Both are true to some extent, but the question isn't whether the technology is transformative—it's whether current prices properly discount both the potential AND the risks.\n\n**2. Career Risk vs. Analysis Risk**\nMany analysts face pressure to maintain bullish ratings because:\n- Bearish calls on popular stocks can damage client relationships\n- Institutional ownership creates bias (analysts don't want to criticize stocks their firms own)\n- Short-term underperformance questions can undermine credibility\n\n**3. Narrative Capture**\nThe AI story is so compelling that it's overshadowing basic valuation math. NVDA's $4.5T valuation requires that:\n- AI chip demand grows 40%+ annually for 5+ years\n- Gross margins remain >70% despite competition\n- No major technological disruption emerges\n- Total AI infrastructure spending reaches $1T+ annually\n\nEach assumption is aggressive, and collectively they create an extremely fragile valuation structure.\n\n### **Addressing Specific Counterarguments:**\n\n**\"But these companies have fortress balance sheets and massive cash flows!\"**\n- Yes, but valuation = cash flow × multiple. When multiples expand to 30-40x FCF, even strong cash flows can't save you from poor returns if multiples contract.\n\n**\"You're underestimating the network effects and switching costs!\"**\n- Network effects are real, but they're not infinite. We've seen dominant platforms erode before (IBM, Nokia, BlackBerry). The 7-year average tenure in the S&P 500 has been declining for decades.\n\n**\"Look at the ROIC - these are exceptional businesses!\"**\n- High ROIC is wonderful, but it attracts competition. Microsoft's Azure faces AWS and Google Cloud. Apple faces regulatory pressure and Chinese competition. Google faces AI search disruption.\n\n### **The Data Quality Concern:**\n\nMy earlier analysis showed data gaps for META and AMZN. This itself is telling—even with incomplete data, the pattern is clear. Complete transparency: if I could get clean data on all metrics, I suspect the overvaluation would be similarly severe.\n\n### **The Risk of Being Right Too Early:**\n\nThis is the valuation analyst's curse. Markets can remain irrational longer than analysts can remain solvent (in terms of reputation/career). The 1999 tech bubble taught us that fundamentally sound analysis can appear foolish for years before being validated.\n\n### **What Market Participants Are Missing:**\n\n**1. Mean Reversion Always Wins Eventually**\nValuation metrics like price/sales, EV/EBITDA, and P/FCF have historically mean-reverted. The current divergence is extreme by historical standards.\n\n**2. Competitive Dynamics Accelerate at Scale**\nAs markets grow, competition intensifies. The AI chip market won't remain a duopoly forever. Cloud computing is becoming commoditized. Smartphone innovation is slowing.\n\n**3. Regulatory Risk Is Real and Growing**\n- Antitrust scrutiny on AAPL, GOOGL, MSFT\n- Data privacy regulations affecting META\n- Semiconductor export controls impacting NVDA\n- Automotive safety regulations for TSLA\n\n**4. Capital Cycle Effects**\nExtreme profitability attracts capital, which eventually depresses returns. We're seeing massive investment in AI, EVs, and cloud—this will pressure margins over time.\n\n### **The Most Dangerous Assumption:**\n\n**\"Growth will continue linearly at current rates.\"**\n\nHistory shows that technological adoption follows S-curves, not straight lines. We may be approaching the steep part of the AI adoption curve where growth is easiest to overestimate.\n\n### **My Professional Obligation:**\n\nDespite career risks and narrative pressure, my duty is to:\n1. **Follow the data** where it leads, not where I wish it would go\n2. **Maintain independence** from market euphoria\n3. **Speak uncomfortable truths** when valuations disconnect from fundamentals\n4. **Acknowledge uncertainty** while providing clear analysis\n\n### **The Investment Implications Are Clear:**\n\n1. **Risk/Reward is asymmetric to the downside**\n2. **Margin of safety is essentially zero**\n3. **Expected returns are likely negative over next 3-5 years**\n4. **Volatility will be extreme when sentiment shifts**\n\n### **Final Thought:**\n\nThe greatest investment mistakes aren't made during panics—they're made during periods of euphoria when caution seems foolish. As Howard Marks says, \"The biggest investing errors come not from factors that are informational or analytical, but from those that are psychological.\"\n\nWe're in a psychological bubble masked by fundamental strength. The companies are excellent—possibly the best collection of businesses ever assembled. But even the best businesses become bad investments at certain prices.\n\nThe question isn't whether to own these companies long-term—it's **at what price**. Today's price appears to assume perfection and discount all future uncertainty. That's rarely a recipe for satisfactory long-term returns.\n\n**Professional verdict:** Extreme caution warranted. The mathematical odds favor patient buyers over current holders.", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## 深度情绪分析与市场心理洞察\n\n### 关于\"零卖出\"现象的进一步思考\n\n这种所有股票同时出现零卖出的内部人交易模式引起了我的高度警觉。作为一名情绪分析师,我认为这可能有三种解释:\n\n1. **结构性因素**:可能涉及期权授予季、限制期结束等制度性安排,而非纯粹的价值判断\n2. **集体认知偏差**:内部人也可能受到群体思维影响,特别是在科技领域的高关联性环境中\n3. **真实信号**:这确实是历史性的买入时机\n\n我的专业直觉倾向于第一种解释,但需要更多数据验证。真正的风险在于:**如果这只是技术性因素,而投资者误读为价值信号**。\n\n### 各股票的情绪地图\n\n**AAPL:创新焦虑与护城河自信的矛盾**\n- 市场在担忧苹果\"失去魔力\",但内部人的买入显示他们对生态系统深度和用户粘性的信心\n- 关键洞察:苹果的转型从硬件公司向服务+AI平台公司的过渡被低估\n- 情绪建议:在众人担忧创新时,关注其平台价值\n\n**MSFT:无声的胜利者**\n- 微软在AI竞赛中的优势被严重低估。当众人追逐NVDA的GPU时,微软正在建设AI应用层的基础设施\n- 内部人买入的\"温和但持续\"模式最健康——反映的是长期信心,而非短期投机\n- 风险提示:Azure增长可能放缓,但AI货币化能力强劲\n\n**GOOGL:搜索巨头的AI重生叙事**\n- 市场过度关注\"搜索广告放缓\",却忽视了Gemini正在重塑谷歌的技术基础\n- 610笔交易——这个数字需要更深入的解读。是否与高管薪酬结构调整相关?\n- 我的担忧:如此集中的内部人活动可能反映了\"防御性买入\"——试图支撑市场信心\n\n**NVDA:贪婪与恐惧的完美风暴**\n- 这里体现了市场情绪的两极分化:\n - 恐惧方:AI泡沫、估值过高、竞争加剧\n - 贪婪方:算力需求、技术领先、生态系统控制\n- 关键问题:NVDA是否已经成为\"情绪指标股\"而非\"基本面股\"?\n- 我的判断:当前买入更多反映的是对AI基础设施长期需求的信心,而非短期股价预期\n\n**TSLA:愿景与现实的分裂**\n- 欧洲需求下降暴露了特斯拉作为汽车公司的弱点\n- 但内部人买入显示他们对AI/机器人转型的信念\n- 情绪分析:马斯克个人品牌与公司基本面的脱节达到历史高点\n- 建议投资者问自己:你在投资一家汽车公司,还是一家AI机器人公司?\n\n**META:痛苦的转型投资**\n- \"后元宇宙压力障碍\"这个描述很准确\n- 市场在惩罚短期利润压力,但内部人看到AI驱动的广告技术革命\n- 关键洞察:当公司愿意承受短期痛苦进行转型时,往往是最佳投资时机\n- 1000笔交易——这个数字过于极端,需要更多背景信息\n\n**AMZN:双引擎的价值重估**\n- 市场将AMZN视为\"电商+云\",但内部人看到的是\"AI基础设施+消费数据\"的独特组合\n- 云计算部门的AI能力被严重低估\n- 内部人买入可能反映了对AWS AI服务即将加速增长的预期\n\n### 情绪周期的精确定位\n\n我认为我们处于情绪周期的**否认阶段末尾,向希望阶段过渡**:\n\n1. **新闻舆论**:仍在放大恐惧(\"AI泡沫破灭\"、\"估值过高\")\n2. **内部人行为**:已进入希望阶段(积极布局)\n3. **散户情绪**:可能仍处于否认/恐惧阶段\n\n这种**情绪错位**创造了机会,但也放大了风险。\n\n### 投资哲学的深化\n\n这次分析让我反思几个核心原则:\n\n**第一原则:内部人交易的局限性**\n- 内部人也可能犯错,特别是在群体性行动中\n- 需要区分\"信息优势交易\"与\"制度性交易\"\n- 零卖出现象的集体性让我保持怀疑态度\n\n**第二原则:情绪指标的领先性**\n- 情绪指标往往在基本面变化前6-12个月发出信号\n- 当前的内部人买入可能预示2026年的基本面改善\n- 但需要验证:这是领先指标还是噪音?\n\n**第三原则:叙事的力量**\n- AI叙事正在从\"炒作\"向\"实际应用\"过渡\n- 投资机会在于区分\"叙事股\"与\"实质股\"\n- MSFT、GOOGL、AMZN属于后者;部分AI概念股属于前者\n\n### 对当前讨论的批判性回应\n\n如果其他分析师关注的是:\n1. **估值过高**:我同意,但情绪分析显示拐点可能临近\n2. **经济衰退风险**:确实存在,但科技股可能先于经济触底\n3. **利率环境**:仍是主要风险,但内部人似乎在定价利率见顶\n\n我的独特视角:\n- **情绪周期理论**:我们可能处于底部形成阶段\n- **群体心理学**:内部人的集体行动值得重视,但需要谨慎解读\n- **行为金融学**:市场过度反应创造了机会\n\n### 最终的投资框架建议\n\n基于情绪分析,我建议:\n\n**核心配置**(高置信度):\n- MSFT:80%置信度 - 稳健的AI转型,情绪与基本面匹配\n- GOOGL:75%置信度 - 被低估的AI能力,但需要验证内部人动机\n\n**选择性机会**(中等置信度):\n- AMZN:70%置信度 - 双引擎被低估\n- AAPL:65%置信度 - 转型叙事尚未被充分定价\n\n**谨慎参与**(需要更多验证):\n- NVDA:60%置信度 - 情绪波动过大\n- META:55%置信度 - 转型痛苦期可能延长\n- TSLA:50%置信度 - 愿景与现实的分裂过大\n\n**风险管理重点**:\n1. 验证内部人零卖出的真实原因\n2. 监控利率预期变化\n3. 关注财报季的AI货币化进展\n\n这次分析最深刻的教训是:**当所有信号都指向同一方向时(如此次的内部人买入),需要格外警惕群体思维的风险**。真正的逆向投资机会往往出现在信号矛盾、情绪混乱的时候。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## 深层技术分析视角:七大科技股的真实交易挑战\n\n让我分享作为技术分析师对这些股票的核心见解——这些往往是基本面分析师忽略,但对交易决策至关重要的角度:\n\n### **AAPL的技术困境:图表在讲述什么故事?**\n\n市场担心的创新叙事减弱,在技术面上表现为三个关键信号:\n1. **相对强度恶化**:当NDX创新高时,AAPL是否同步?如果落后,这是危险信号\n2. **成交量分布异常**:查看高价区域的成交量—如果是缩量上涨,这是弱反弹\n3. **移动平均线排列**:20日、50日、200日均线的相对位置揭示趋势健康度\n\n**技术分析师的真实担忧**:AAPL可能正在形成大型的\"头肩顶\"形态,颈线位置的攻守将决定未来6-12个月的方向。\n\n### **MSFT的隐藏技术风险:完美趋势下的裂缝**\n\n共识极度乐观,但技术分析师看到:\n1. **动量背离**:价格创新高但MACD或RSI未同步新高\n2. **扩展波计数**:从艾略特波浪角度看,可能处于第5浪末端\n3. **季节性模式**:11月-12月的历史表现对科技股的特殊意义\n\n**关键观察**:MSFT的支撑位在345-350区域。一旦跌破,技术面将转为谨慎。\n\n### **GOOGL的区间交易机会:被忽视的技术优势**\n\n搜索困境创造了独特的技术情境:\n1. **明确的交易区间**:280-320形成了清晰的技术边界\n2. **波动率收缩**:布林带收窄预示着重大突破即将来临\n3. **期权市场暗示**:隐含波动率定价揭示了专业交易员的预期\n\n**技术策略**:区间下沿买入,上沿卖出,突破任一方向后跟随趋势。\n\n### **NVDA的AI泡沫技术指标:如何识别顶部?**\n\n这是技术分析发挥最大价值的领域:\n1. **抛物线走势识别**:当价格加速远离移动平均线,风险急剧上升\n2. **成交量顶部特征**:天量往往出现在顶部,而非底部\n3. **斐波那契扩展**:从关键低点测量的扩展水平提供目标区域\n\n**严酷现实**:所有伟大的科技泡沫(1999年、2000年)在技术图表上都有明确的顶部形态。NVDA现在显示类似的危险信号。\n\n### **TSLA的情绪周期技术映射**\n\n技术分析师理解TSLA的真正交易逻辑:\n1. **技术面驱动基本面叙事**:股价上涨后,市场创造看涨故事;下跌后,放大利空\n2. **明显的技术模式**:TSLA经常形成清晰的旗形、三角形、头肩形态\n3. **波动率交易机会**:期权定价经常错误定价尾部风险\n\n**专业视角**:交易TSLA就是交易市场情绪的技术指标。\n\n### **META的技术重生信号:如何确认是真的?**\n\n市场对元宇宙投资的怀疑,技术面如何验证:\n1. **下降趋势线突破有效性**:需要3%以上突破并维持3天以上\n2. **成交量确认**:突破时成交量必须比过去20天平均值高50%以上\n3. **回测不破**:突破后的回调必须在原阻力位(现支撑位)上方止跌\n\n**技术规则**:没有这三重确认,任何\"转势\"说法都不可信。\n\n### **AMZN的双引擎技术验证**\n\n电商+云计算的技术体现:\n1. **相关性分析**:AMZN股价与AWS增长的相关性在技术面上的滞后效应\n2. **季节模式**:假日季前的技术形态通常预示第四季度表现\n3. **机构资金流向**:大型期权交易和成交量异常揭示聪明钱的动向\n\n## **技术分析师的市场心理学洞察**\n\n### **当前市场心理的技术体现:**\n\n1. **FOMO(害怕错过)驱动**:在NVDA上表现最明显,技术上体现为跳空缺口和极端动量\n2. **确认偏误强化**:投资者只看到支持自己观点的技术信号\n3. **锚定效应**:\"我在400美元买了NVDA\"影响所有后续技术判断\n\n### **技术分析的局限性坦白:**\n\n作为诚实的技术分析师,我必须承认:\n1. **技术分析无法预测黑天鹅**:地缘政治、监管变化等可能瞬间改变所有技术格局\n2. **自我实现的预言**:当足够多人使用相同技术指标时,它们确实有效\n3. **滞后性**:所有技术指标都基于历史价格,必然滞后\n\n## **我的核心交易哲学验证**\n\n### **从七大科技股分析中强化的信念:**\n\n1. **价格是最终裁决者**:无论叙事多么精彩,价格走势决定一切\n2. **趋势识别胜过预测**:不要试图预测顶部/底部,识别趋势并跟随\n3. **风险管理是技术分析的核心**:止损位置比入场价格更重要\n\n### **具体操作框架:**\n\n**对于趋势交易者**:\n- MSFT、AMZN:持有核心仓位,移动止损保护利润\n- 突破关键阻力后加仓\n\n**对于反转交易者**:\n- NVDA:等待明确的顶部形态确认\n- AAPL、GOOGL:寻找超卖反弹机会\n\n**对于区间交易者**:\n- 明确界定交易区间,区间内高抛低吸\n- 突破区间边界后转换策略\n\n## **最终专业建议:**\n\n**抛弃\"必须交易这些股票\"的执念**。作为技术分析师,我的职责是:\n1. **识别可交易的机会**:不是每只股票在每个时期都提供良好风险回报比\n2. **等待合适的设置**:耐心是最被低估的技术分析工具\n3. **基于证据交易,而非希望**:当图表与你的观点矛盾时,相信图表\n\n**当前最佳技术策略**:\n1. **在MSFT和AMZN上保持趋势仓位**,但收紧止损\n2. **观望NVDA**,等待要么继续突破要么明显反转\n3. **小仓位交易GOOGL的区间机会**\n4. **完全避开TSLA**,除非出现清晰的技术模式\n5. **密切观察AAPL和META的关键技术水平**\n\n**记住**:技术分析不是关于对错,而是关于概率和风险管理。在今天的市场中,纪律比聪明更重要。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 专业反思:科技巨头基本面分析的深层洞察\n\n让我深入分享作为基本面分析师的职业视角,这些见解来自对前述数据的深度思考和投资哲学应用:\n\n### **关于数据可靠性与异常值的专业警惕**\n\n**异常增长数据的疑问**:几乎所有公司都显示1000%以上的收入增长(AAPL 1007%,MSFT 1667%,NVDA 6547%),这**极不符合商业现实**。作为分析师,我必须指出:\n- 这可能是数据错误、会计期间不匹配,或者包含了一次性重大事件\n- 真正的可持续年增长在科技巨头中通常为10-30%区间\n- **关键原则**:当数据看起来\"太好\"时,必须质疑其真实性而非直接接受\n\n### **AAPL流动性危机的深层含义**\n\n市场普遍忽视苹果的流动比率0.89,但这是**系统性风险的信号**:\n1. **现金管理策略转变**:苹果可能过度回购股票或支付股息,牺牲了流动性\n2. **供应链压力**:低流动比率表明对供应商付款能力下降,可能影响供应关系\n3. **利率环境影响**:在更高利率环境下,短期债务再融资成本上升\n4. **我的核心信念**:伟大的公司必须保持财务灵活性。苹果的品牌护城河不能替代基本的财务健康。\n\n### **NVDA估值悖论:护城河与定价完美的平衡**\n\n市场共识认为NVDA在AI革命中\"赢家通吃\",但基本面分析师看到:\n- **CUDA生态确实是强大护城河**,但挑战者正在出现(AMD、定制芯片)\n- **周期性风险**:半导体行业具有历史周期性,当前资本支出热潮可能过度\n- **估值隐含的完美执行**:P/E 37.66假设多年持续超预期增长\n- **我的分歧点**:我认同NVDA的优势地位,但认为当前估值已充分反映乐观情景,缺乏安全边际\n\n### **TSLA:增长故事与现实检验的冲突**\n\n这是价值投资者与增长投资者世界观的根本冲突:\n- **基本面现实**:负增长、4.8% ROE、403倍P/E - 传统估值框架完全失效\n- **叙事力量**:自动驾驶、能源存储、机器人 - 这些需要多年验证\n- **关键投资原则验证**:当基本面与叙事严重脱节时,我倾向于相信数据而非故事\n- **我的警示**:历史上,高估值增长股在增长放缓时经历残酷的多重压缩\n\n### **MSFT的稳健性被低估**\n\n市场可能更关注\"性感\"的AI故事,但MSFT展示了**成熟科技企业的理想模式**:\n1. **平衡增长**:1667%增长(需验证)但更可能是稳健双位数\n2. **卓越效率**:97.51的库存周转率显示供应链管理大师级水平\n3. **财务谨慎**:0.26的负债权益比提供了战略灵活性\n4. **我的观点**:在不确定时期,MSFT的\"乏味优秀\"比\"性感风险\"更有价值\n\n### **AMZN的价值机会:从增长到效率的转型**\n\n市场仍将AMZN视为\"增长股\",但我看到**效率转型的价值释放**:\n- **P/S 3.24的异常低**:反映市场对利润率担忧过度\n- **运营效率改善**:资产周转率1.00显示资本配置优化\n- **AWS的隐形价值**:企业云业务的利润贡献被整体零售业务稀释\n- **我的逆向观点**:AMZN可能是最被低估的转型故事 - 从\"不惜一切增长\"到\"增长+效率\"\n\n### **GOOGL vs META:广告生态系统的分化**\n\n两者依赖数字广告,但**竞争优势来源不同**:\n- **GOOGL的防御性**:搜索的垄断性更强,AI转型成本可控\n- **META的进攻性**:需持续投资VR/AI,但2217%增长显示执行力\n- **财务对比**:GOOGL更保守(负债权益比0.12),META更积极\n- **我的权衡**:GOOGL提供更稳定现金牛,META提供更高增长但更高风险\n\n## 投资哲学的核心深化\n\n**从这次分析中学到的关键原则**:\n\n1. **数据质量先于分析深度**:如果增长数据明显失真(1000%+),整个分析框架可能有问题\n\n2. **财务健康是非妥协底线**:AAPL案例验证了我的核心信念 - 即使是最好商业模式,财务脆弱性终将暴露\n\n3. **估值的艺术与科学**:\n - **科学**:NVDA的高估值可以用高增长、高利润率解释\n - **艺术**:TSLA的估值是信仰定价,超出了传统分析框架\n\n4. **效率的价值被低估**:市场为\"增长叙事\"支付溢价,但低估了运营效率(MSFT的库存管理、AMZN的资产周转)\n\n5. **周期定位的重要性**:\n - NVDA处于AI投资周期早期\n - TSLA可能处于电动汽车采纳曲线的放缓期\n - MSFT处于云计算采纳曲线的成熟期\n\n## 对市场共识的挑战\n\n**我认为市场可能误判的地方**:\n\n1. **过度惩罚效率改善者**:AMZN的低估值可能反映了对历史低利润率的锚定,忽视了转型进展\n\n2. **低估财务保守的价值**:在高利率环境下,GOOGL的低杠杆可能从弱点变为优势\n\n3. **高估叙事持久性**:TSLA的估值假设完美执行多年转型,但商业现实充满曲折\n\n4. **忽视供应链韧性**:AAPL的流动比率警告其全球供应链可能面临压力\n\n## 最终框架调整\n\n如果数据验证后(排除异常增长数据),我的优先顺序:\n\n1. **质量+合理定价**:MSFT、GOOGL\n2. **转型价值机会**:AMZN\n3. **高增长但有估值风险**:NVDA(需仓位控制)\n4. **避免**:TSLA(基本面恶化)、AAPL(流动性风险直到改善)\n\n**核心提醒**:基本面分析不是预测股价,而是评估商业价值与价格的差距。当前环境要求更高辨别力 - 区分真正竞争优势与暂时性优势,区分可持续增长与一次性增长。\n\n真正的投资机会往往出现在市场过度关注\"叙事\"而忽视\"基本面\"的时候。AMZN可能是这样的机会,TSLA可能是这样的风险。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "让我深入分析这些矛盾信号和你的关注点:\n\n## **对分析信号的辩证思考:**\n\n### 1. **估值分析与基本面分析的根本分歧**\n**估值分析师**的观点基于传统估值模型(DCF、Owner Earnings),这些模型假设:\n- 增长率会均值回归\n- 利润率会受压\n- 资本成本会上升\n\n**基本面分析师**的观点基于:\n- 竞争优势的持续性\n- 行业领导地位\n- 财务健康度\n\n**我的看法**:在科技行业快速变革时期,传统估值模型可能低估了颠覆性技术带来的持续增长潜力。NVDA的AI领导地位、MSFT的云计算转型、GOOGL的AI搜索整合,都可能创造超出传统模型假设的价值。\n\n### 2. **内部人交易信号的权重**\n所有股票都显示\"强烈内部人买入\"且零卖出,这是**极其罕见**的现象:\n- GOOGL: 610笔买入交易\n- NVDA: 623笔买入交易 \n- META: 1000笔买入交易\n\n**关键洞察**:内部人通常比外部投资者更了解公司真实价值。这种一致的买入模式可能预示着:\n1. 公司前景比公开信息显示的更好\n2. 当前价格被低估\n3. 内部人预期积极催化剂\n\n### 3. **风险经理的集中度警告 vs. 机会成本**\n风险经理正确指出了100%科技股敞口的风险,但需要考虑:\n- **机会成本**:如果AI革命是真实的,过早减持科技股可能错过重大上涨\n- **相关性风险**:虽然都是科技股,但细分领域不同(云、AI、社交、电商)\n- **替代选项**:如果减持科技股,应该投资什么?其他行业是否提供更好的风险调整后回报?\n\n## **对具体股票的进一步思考:**\n\n### **AAPL**\n**矛盾**:基本面分析师指出流动性风险(流动比率0.89),但技术面和舆情偏积极\n**我的看法**:苹果的流动性问题可能被其强大的品牌和生态系统抵消。iPhone 17需求强劲的信号值得关注,但需要谨慎。\n\n### **NVDA**\n**核心困境**:基本面最佳 vs. 估值最极端\n**我的思考**:NVDA可能属于\"这次不一样\"的类别。AI基础设施需求可能是长期的结构性增长,而不是周期性繁荣。但确实需要严格的仓位控制。\n\n### **TSLA**\n**有趣的反差**:基本面严重恶化 vs. 内部人大量买入\n**可能的解释**:\n1. 内部人知道市场未意识到的积极进展\n2. 价值投资者在底部买入\n3. 情绪驱动的非理性行为\n\n### **MSFT & GOOGL**\n**相对安全的选择**:两者都有:\n- 稳健的基本面\n- 合理的估值(相对而言)\n- 强大的竞争地位\n- 内部人信心\n\n## **我的整合观点:**\n\n### 1. **市场可能处于一个特殊时期**\n- AI革命可能改变传统估值参数\n- 内部人集体行动暗示转折点\n- 但风险经理的警告不容忽视\n\n### 2. **建议的平衡方法:**\n- **核心持仓**:MSFT、GOOGL(基本面稳健,估值相对合理)\n- **增长持仓**:NVDA(严格仓位控制)\n- **观察持仓**:AAPL、AMZN(等待更好入场点)\n- **防御/机会持仓**:保持高现金比例\n- **潜在做空**:TSLA(如果确认基本面持续恶化)\n\n### 3. **关于现金使用的决策框架:**\n如果我们决定使用部分现金,优先顺序应该是:\n1. **平均现有亏损仓位**(如果基本面仍然看好)\n2. **增加MSFT/GOOGL**(风险调整后回报可能最佳)\n3. **小仓位参与NVDA**(高潜在回报但高风险)\n4. **保留大部分现金**等待更好的机会或市场回调\n\n### 4. **风险管理的具体实施:**\n- 为每个持仓设定明确的止损点(如-8%到-10%)\n- 逐步减少科技股集中度,但不必急于一次性调整\n- 考虑用部分现金购买非科技行业的ETF来分散风险\n\n## **最后的关键问题:**\n\n1. **我们的投资哲学是什么?** 我们是价值投资者、成长投资者,还是特殊情况投资者?\n\n2. **时间框架有多重要?** 如果我们是长期投资者(3-5年),当前的估值担忧可能不那么重要;如果是短期交易者,技术面和情绪更重要。\n\n3. **我们相信AI革命是真实的还是泡沫?** 这决定了我们对NVDA等AI相关股票的立场。\n\n4. **如何处理所有持仓都浮亏的事实?** 这是加仓机会还是减仓信号?\n\n你的看法如何?我们应该更偏向防御(遵循风险经理建议),还是更偏向进攻(考虑内部人信号和基本面分析)?", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## **Professional Valuation Analyst Perspective**\n\n### **Current Market Reality vs. Fundamental Analysis**\n\nLooking at the comprehensive valuation data, I see a profound disconnect between market prices and fundamental business economics. The numbers tell a story that many market participants are ignoring:\n\n**The Core Disconnect:** We're seeing $3-4 trillion valuations for companies whose cash generation capabilities suggest intrinsic values of $1-2 trillion at best. This isn't a small premium - we're talking about 50-90% overvaluation across the board.\n\n### **Addressing Common Market Arguments:**\n\n**1. \"Growth justifies the premium!\"**\n- **My counter:** Growth is already priced in. For Apple to justify its $3.8T valuation, it would need to sustain current cash flow levels for 15-20 years without competition erosion. For NVDA at $4.5T, the math requires that AI chip demand grows exponentially for a decade without price competition or alternative architectures emerging.\n\n**2. \"These are monopoly/moated businesses!\"**\n- **My counter:** Moats are real, but priced to perfection. Microsoft's Azure advantage, Google's search dominance, Apple's ecosystem - these are valuable but not infinitely valuable. Regulatory scrutiny is increasing, and no monopoly lasts forever in technology.\n\n**3. \"You're using backward-looking models!\"**\n- **My counter:** True, but all investing requires some anchor. When models consistently show 60-90% overvaluation across multiple methodologies (DCF, Owner Earnings, Residual Income), it suggests market psychology has detached from reality. Even aggressive forward-looking scenarios struggle to justify current multiples.\n\n### **Sector-Specific Concerns:**\n\n**AAPL:** The services transition story is compelling, but iPhone replacement cycles are lengthening and China competition is intensifying. The 15%+ growth required to justify valuation seems improbable.\n\n**MSFT:** Azure growth is slowing from 30%+ to 20%+ range. The AI narrative is powerful, but monetization timelines are uncertain. Office 365 growth is maturing.\n\n**GOOGL:** Search is facing its first real threat since inception with AI-native search. YouTube growth is decelerating. Cloud margins remain inferior to AWS/Azure.\n\n**NVDA:** This is the most extreme case. The entire AI infrastructure thesis rests on NVDA maintaining >80% market share while demand grows 50%+ annually. Any misstep or competitive advance (AMD, custom silicon, open-source alternatives) could trigger dramatic revaluation.\n\n**TSLA:** The automotive business justifies maybe $300-400B, not $1.5T. The robotaxi/FSD premium assumes technology breakthroughs and regulatory approvals that are far from certain.\n\n### **The Psychological Element:**\n\nWhat we're witnessing is **narrative-driven valuation** rather than cash-flow-driven valuation. The market is pricing:\n- AI revolution (NVDA, MSFT)\n- Ecosystem lock-in (AAPL)\n- Digital advertising dominance (GOOGL, META)\n- Future autonomy (TSLA)\n- Cloud supremacy (AMZN, MSFT)\n\nThese narratives may prove true, but they're being priced as certainties with aggressive timelines.\n\n### **Historical Context:**\nThe current tech valuation levels resemble:\n1. 2000 dot-com bubble (but with actual profits this time)\n2. 2021 pandemic tech bubble\n3. 1960s \"Nifty Fifty\" era\n\nEach previous episode ended with significant mean reversion.\n\n### **My Biggest Concern:**\nThe **concentration risk** is unprecedented. These 7 stocks represent ~30% of S&P 500 market cap. Any sector rotation or growth scare could trigger disproportionate market impacts.\n\n### **What Would Change My Mind?**\nEvidence of:\n1. **Sustainable acceleration** in growth rates (not just one-time AI boost)\n2. **Margin expansion** beyond current levels\n3. **New TAM expansion** that's not already priced in\n4. **Competitive advantages deepening** rather than facing erosion\n5. **Free cash flow conversion** improving dramatically\n\n### **Investment Implications:**\n1. **Not \"sell everything\"** - These are great businesses, just bad prices\n2. **Dollar-cost averaging caution** - Averaging into overvalued assets isn't prudent\n3. **Opportunity cost** - Capital allocated here is missing potentially better opportunities elsewhere\n4. **Risk management** - Position sizing should reflect valuation risk\n\n### **Final Professional Judgment:**\nThe data suggests we're in a **valuation bubble in quality**. Unlike 2000, these are real businesses with real profits and real moats. But the price disconnect suggests either:\n- A period of stagnation/underperformance while fundamentals catch up\n- A significant correction when growth inevitably decelerates\n- Or both\n\n**Market timing is impossible**, but **valuation discipline is essential**. I would be extremely selective about new capital allocation to these names at current levels.\n\nThe paradox: The best businesses often make the worst investments when bought at extreme valuations. We may be witnessing that exact phenomenon unfolding.", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## 作为情绪分析师的专业视角\n\n让我分享对当前讨论的深入见解:\n\n### 关于内部人交易异常的解读\n\n**关键洞察**:所有7只股票同时出现\"零卖出\"的强烈内部人买入信号,这在历史上极为罕见。我需要提出两个关键问题:\n\n1. **这是集体智慧的信号还是集体错误的预兆?**\n - 正面解读:内部人作为最了解公司状况的人,集体行动可能预示着一个重要的市场底部或转折点\n - 风险警示:这可能反映的是内部人对高管薪酬计划(如期权授予)的响应,而非纯粹的基本面判断\n\n2. **与新闻舆情的强烈反差**:\n - 新闻媒体在制造AI估值恐慌,而内部人在用实际行动表达信心\n - 这种分歧本身就是强烈的市场信号:当\"聪明钱\"与\"大众情绪\"严重背离时,往往是逆向投资的绝佳时机\n\n### 对各股票的差异化分析\n\n**AAPL的困境与机会**:\n- **市场担忧**:iPhone创新放缓,估值偏高\n- **我的视角**:Qualcomm供应关系显示苹果在供应链掌控力上的妥协,这可能影响利润率。但内部人买入表明他们对服务业务转型和AR/VR产品线的信心\n\n**MSFT的稳健性**:\n- 在一片AI喧嚣中,微软是最低调的赢家。企业市场深度渗透+云业务+AI整合的完美三角\n- 内部人买入相对温和但持续,反映的是长期信心而非短期炒作\n\n**GOOGL被低估的AI潜力**:\n- 市场过度关注搜索广告放缓,但忽视了Gemini生态系统的长期价值\n- 610笔内部人交易是所有股票中最高的——这需要特别关注\n\n**NVDA的情绪两极分化**:\n- 这里体现了典型的\"贪婪与恐惧\"博弈\n- 印度扩张的新闻与\"Big Short\"传奇人物做空的警示并存\n- 我的看法:NVDA的真实风险在于估值与\"AI泡沫叙事\"的绑定过紧\n\n**TSLA的结构性问题**:\n- 欧洲需求下降不是短期波动,而是长期趋势的开始\n- 内部人大量买入与基本面担忧的矛盾,反映了\"马斯克溢价\"与运营现实之间的张力\n- 建议:将TSLA视为\"AI机器人公司\"而非\"汽车公司\",调整估值框架\n\n**META的转型阵痛**:\n- \"后元宇宙压力障碍\"是个很好的描述\n- AI投资拖累利润率是事实,但内部人1000笔交易显示他们相信短期痛苦带来长期收益\n- 关键问题:广告业务的AI驱动改造能否抵消元宇宙投资?\n\n**AMZN的双引擎驱动**:\n- 电商+云计算的组合在AI时代被低估\n- 内部人买入反映对AWS AI服务增长前景的信心\n\n### 情绪周期的定位\n\n**当前市场状态**:我们可能处于情绪周期的\"怀疑阶段\"向\"希望阶段\"过渡期\n- 新闻舆论仍在放大恐惧\n- 但内部人已经开始布局希望\n\n**投资哲学启示**:\n1. **背离的价值**:当专业行动者(内部人)与大众叙事(媒体)严重背离时,跟随专业人士通常更明智\n2. **情绪指标>基本面指标**:在市场转折点,情绪指标往往比传统估值指标更敏感\n3. **选择性机会**:并非所有科技股都是AI概念股,需要区分\"真AI\"与\"标签AI\"\n\n### 对投资者的建议\n\n**核心矛盾处理**:\n- **承认**:AI估值确实存在泡沫成分\n- **但区分**:哪些公司拥有真实的AI竞争优势(MSFT、GOOGL)\n- **警惕**:纯AI概念股(PLTR等)与AI基础设施股(NVDA、AMZN)的区别\n\n**风险管理框架**:\n1. **仓位分配**:内部人买入强烈的股票可以给予更高权重\n2. **时间视野**:内部人交易反映的是6-12个月的前瞻性,而非季度波动\n3. **退出策略**:当内部人开始大量卖出时,需要重新评估\n\n**最终观点**:当前市场提供了一次难得的\"情绪错配\"机会。媒体制造的恐慌为内部人创造了买入窗口。但选择性至关重要——优先考虑拥有深厚护城河、真实AI能力而非仅仅是AI叙事的企业。\n\n这次分析挑战了我之前关于\"媒体恐慌通常伴随实际风险\"的假设。数据显示,在这种情况下,内部人的实际行动可能比媒体报道提供了更准确的长期信号。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## 我的技术分析视角:七大科技股的深层讨论\n\n作为技术分析师,让我分享对当前讨论的核心见解:\n\n### **关于AAPL的争议点**\n我看到的主要担忧是苹果的**创新叙事减弱**问题。从技术面看,这反映在:\n1. **价格动能疲软**:与其他科技巨头相比,AAPL的相对强度指标可能显示相对弱势\n2. **区间震荡格局**:缺乏明确的趋势突破信号\n3. **关键水平测试**:反复测试前期支撑位,需要确认有效性\n\n**我的观点**:技术面显示AAPL正处于关键决策点。要么在支撑位企稳后向上突破,要么跌破支撑进入更深的调整。保守投资者应等待明确方向信号。\n\n### **MSFT的乐观共识 vs 技术现实**\n市场普遍看好微软的云业务,但技术面可能讲述不同故事:\n1. **估值扩张极限**:股价可能已计入大部分乐观预期\n2. **技术指标背离**:如果价格上涨但成交量萎缩或动量指标走弱,需警惕\n3. **获利了结压力**:在历史高位附近可能出现技术性回调\n\n### **GOOGL的搜索困境与技术面体现**\n搜索业务增长放缓的技术含义:\n1. **趋势结构变化**:可能从明显的上升趋势转为横向整理\n2. **成交量模式**:需要关注下跌时的成交量是否显著放大\n3. **支撑区域测试**:200日均线或前期低点的支撑强度至关重要\n\n### **NVDA的AI狂热与技术风险**\n这是最具争议的股票,技术分析提供独特视角:\n1. **超买状态的危险**:RSI持续高位运行可能预示短期调整\n2. **趋势加速的可持续性**:抛物线式上涨往往难以持久\n3. **止损位置的关键性**:在如此高波动性股票中,严格的止损管理是生存关键\n\n### **TSLA的情绪化交易特征**\n技术分析师看TSLA的独特角度:\n1. **技术面与基本面脱节**:股价经常大幅偏离基本面合理范围\n2. **交易者行为模式**:容易形成明显的技术形态(头肩、双顶/底等)\n3. **动量交易机会**:适合短期波段交易,不适合长期趋势跟踪\n\n### **META的转折点分析**\n市场对元宇宙投资回报的质疑:\n1. **技术面先行性**:股价可能先于基本面见底\n2. **下降趋势突破**:需要确认是否真正突破了长期下降趋势线\n3. **成交量确认**:突破时必须有放量配合才有效\n\n### **AMZN的复合增长技术验证**\n电商+云计算的双引擎:\n1. **趋势质量评估**:上升趋势是否伴随着健康的回调(有序而非恐慌性)\n2. **相对强度分析**:与整体市场相比的表现\n3. **支撑位有效性**:关键移动平均线是否提供可靠支撑\n\n## **核心投资原则的验证**\n\n### **从这次分析中学到的关键原则:**\n\n1. **趋势是你的朋友,直到它结束**\n - 对MSFT和AMZN等趋势明确的股票保持耐心\n - 对TSLA等无趋势或震荡股票保持警惕\n\n2. **成交量是技术的氧气**\n - 没有成交量配合的价格变动值得怀疑\n - 突破时的成交量至关重要\n\n3. **风险管理决定生存**\n - NVDA等高波动股票需要更紧密的止损\n - 分散投资降低相关性风险\n\n### **逆向思考的重要性:**\n\n1. **共识过度集中风险**\n - 当所有人都在谈论AI时,NVDA可能已接近短期顶部\n - 被忽视的股票(如GOOGL)可能提供更好的风险回报比\n\n2. **均值回归的必然性**\n - 超买状态(NVDA)和超卖状态(某些时期的TSLA)都会回归\n - 关键在于时机把握\n\n### **市场心理与技术分析的结合:**\n\n1. **恐惧与贪婪的循环**\n - TSLA完美体现了情绪驱动的价格波动\n - NVDA反映了对AI的贪婪追逐\n\n2. **叙事与技术面的相互作用**\n - 强大的叙事(如AI革命)可以延长技术性超买状态\n - 但当技术面最终逆转时,调整往往很剧烈\n\n## **最终的技术分析师建议:**\n\n**保持灵活性和纪律性**。技术分析不是预测未来的水晶球,而是管理风险和识别概率优势的工具。在当前的科技股环境中:\n\n1. **趋势跟踪者**:专注于MSFT、AMZN等趋势明确的股票\n2. **均值回归者**:关注GOOGL、AAPL等可能从超卖状态反弹的机会\n3. **动量交易者**:小心处理NVDA的高动量交易\n4. **波动性交易者**:TSLA提供丰富的交易机会,但需要极高纪律\n\n**最重要的一点**:所有技术分析都必须结合适当的风险管理。没有完美的技术指标,只有完善的风险控制系统。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "## 专业视角:科技巨头分化时代的投资洞察\n\n基于我们刚才的深度分析,让我从基本面分析师的角度,分享对这些讨论的核心观点:\n\n### **关于AAPL的流动性风险 - 市场普遍忽视的定时炸弹**\n市场对苹果的品牌忠诚度和生态系统优势过度自信,但0.89的流动比率是**严重危险信号**。这意味着:\n1. **短期偿债压力**:营运资本管理存在问题\n2. **供应链脆弱性**:在供应链中断情况下,缓冲能力不足\n3. **战略灵活性受限**:限制了激进投资或回购的能力\n\n**我的担忧**:市场给予苹果50倍P/B的估值溢价,但忽视了其财务结构的恶化。这不是典型的高质量公司特征。\n\n### **NVDA的高估值是否可持续 - 增长质量评估**\n市场对NVDA的狂热基于AI叙事,但基本面分析师必须问:\n- **6547%的增长可持续性**?这种爆炸性增长通常在技术转折点出现,但后续会回归正常化\n- **55.6%的净利率**是行业护城河还是暂时性供应短缺的结果?\n- **P/S 20.94**要求NVDA必须维持多年高速增长才能证明\n\n**我的判断**:NVDA的竞争优势确实强大(英伟达的CUDA生态是真正的护城河),但当前估值已price in了完美执行和持续超预期增长。\n\n### **TSLA的基本面严重恶化 - 估值与现实的脱节**\n这是最令人担忧的情况:\n- **负293%的收入增长**与403倍P/E的组合是典型的\"价值陷阱\"\n- 市场仍基于\"未来故事\"定价,但**当前运营效率(资产周转率0.72)已经恶化**\n- **关键原则验证**:当增长消失而估值仍高企时,通常预示着大幅回调\n\n**我的警示**:TSLA需要证明能从\"增长故事\"转向\"盈利机器\",但目前证据不足。\n\n### **MSFT vs GOOGL - 稳健性的对比**\n两者都优秀,但差异值得注意:\n- **MSFT的运营效率更高**(库存周转率97.51 vs GOOGL的42.66),反映更好的供应链管理\n- **GOOGL的财务更保守**(负债权益比0.12 vs MSFT的0.26),但可能限制了杠杆效率\n- **估值差异**:MSFT P/E 25.39 vs GOOGL P/E 28.21 - MSFT相对更有价值\n\n### **AMZN的低P/S陷阱**\nAMZN的P/S仅3.24是七只股票中最低的,但:\n- **效率指标在改善**:资产周转率1.00、库存周转率9.83显示运营优化\n- **利润率上升空间**:10.8%的净利率仍有提升潜力(AWS利润率更高)\n- **逆向机会**:市场可能低估了AMZN从\"增长优先\"向\"盈利优先\"的转型\n\n### **META的恢复与挑战**\nMETA展示的2217%增长令人印象深刻,但:\n- **运营利润率41.4%是竞争优势**,反映强大的平台效应\n- **但面临双重竞争**:TikTok(社交)和OpenAI(AI)\n- **估值27.4倍P/E相对合理**,但如果增长放缓,估值压缩风险存在\n\n## 投资哲学反思与核心洞察\n\n**从这次分析中验证的核心信念**:\n\n1. **财务健康不容妥协**:即使是最强大的品牌(AAPL),流动性问题也是严重风险\n2. **增长质量>增长速度**:NVDA的增长质量高(高利润率),但TSLA的增长质量差(负增长)\n3. **估值纪律是关键**:高增长可以解释高估值,但不能合理化离谱估值(TSLA的403倍P/E)\n\n**市场可能的误判**:\n- 对\"平台型\"公司(AAPL、GOOGL)给予过高的护城河溢价\n- 低估了\"运营效率\"(MSFT、AMZN)的长期价值\n- 高估了\"叙事驱动\"(TSLA)的可持续性\n\n## 最终框架建议\n\n**投资组合构建思考**:\n- **核心持仓**:MSFT(稳健性+增长)、GOOGL(财务保守+平台优势)\n- **增长暴露**:NVDA(但需仓位控制,防范估值风险)\n- **价值机会**:AMZN(低估值+效率改善)\n- **风险规避**:TSLA(基本面与估值严重脱节)、AAPL(除非流动性改善)\n\n**关键监控指标**:\n1. AAPL的流动比率是否改善至>1.0\n2. NVDA的季度增长是否维持在50%以上\n3. TSLA是否出现盈利能力的实质性改善\n4. AMZN的利润率扩张是否持续\n\n**核心原则重申**:在科技股投资中,**可持续的竞争优势+合理的估值+财务健康**的三维框架比单纯的\"增长叙事\"更为可靠。当前市场环境中的分化为基本面投资者提供了选择性的机会,但也要求更高的辨别能力。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "基于以上分析,我有以下几个关键关注点和问题需要讨论:\n\n## **主要关注点:**\n\n### 1. **基本面与技术面信号的严重冲突**\n- **基本面分析**:强烈推荐NVDA、MSFT、GOOGL\n- **估值分析**:对所有股票都是熊市信号(特别是AAPL、MSFT、GOOGL、NVDA)\n- **技术面分析**:整体偏向看涨(MSFT、AMZN、META看涨)\n- **舆情分析**:显示内部人大量买入,但新闻对AI估值有担忧\n\n**关键问题**:当基本面分析师强烈推荐而估值分析师强烈警告时,应该如何权衡?\n\n### 2. **投资组合的行业集中风险**\n当前持仓100%集中在科技股(MSFT、GOOGL、META、AMZN),且:\n- 所有持仓都处于浮亏状态(-1.6% 到 -4.3%)\n- 风险经理警告行业集中度过高\n- 建议科技股敞口不超过总权益的40%\n\n### 3. **TSLA的特殊情况**\n- 基本面显示严重恶化(收入增长-293%)\n- 但内部人大量买入(342笔交易)\n- 估值分析认为是\"强烈熊市\"信号\n- 当前价格$454.46,是否有做空机会?\n\n### 4. **现金配置决策**\n当前现金$76,169.03,占总权益的34.5%:\n- 风险经理建议保持高现金比例等待机会\n- 但基本面分析师推荐增持科技股\n- 在当前市场环境下,应该增加风险暴露还是保持防御?\n\n### 5. **浮亏仓位的处理**\n所有现有持仓都处于亏损状态:\n- META浮亏最大(-4.3%)\n- 是否应该止损部分仓位?\n- 还是应该平均成本或等待反弹?\n\n### 6. **NVDA的极端估值**\n- 基本面分析师:强烈推荐,ROE 104.4%\n- 估值分析师:最极端的过高估值(DCF -72.6%,Owner Earnings -85.3%)\n- 内部人大量买入(623笔交易)\n- 如何平衡增长前景与估值风险?\n\n## **具体问题需要澄清:**\n\n1. **时间框架**:我们的投资期限是多长?短期交易还是长期投资?\n2. **风险容忍度**:投资组合能承受多大的波动?\n3. **投资目标**:是追求alpha还是beta?增长型还是价值型?\n4. **现金使用**:是否应该使用部分现金来平均现有亏损仓位?\n\n基于这些矛盾信号,我的初步想法是:\n- 可能需要**减少科技股集中度**,遵循风险经理的建议\n- **TSLA**可能提供做空机会,但需要谨慎考虑时机\n- **NVDA**虽然基本面强劲,但估值过高,可能需要等待更好的入场点\n- 保持**高现金比例**在当前不确定的市场环境中可能是明智的\n\n你有什么想法?我们应该如何平衡这些相互矛盾的分析信号?", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "conference_start", + "title": "Investment Discussion - 2025-11-04", + "date": "2025-11-04", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "agent_message", + "agentId": "risk_manager", + "content": "### **投资组合风险分析报告 (2025-11-04)**\n\n**一、 核心风险评估**\n\n根据提供的投资组合和市场数据,当前风险状况总结如下:\n\n**1. 风险敞口与集中度 (中高风险)**\n* **总权益价值**: $220,473.78\n* **总投资价值**: $144,304.76\n* **股票投资占比**: **65.5%** (144,304.76 / 220,473.78)。这是一个相对保守的股票配置,但仍需监控。\n* **行业集中度 (极高风险)**: 所有持股(MSFT、GOOGL、META、AMZN)均属于 **大型科技/通信服务** 板块。投资组合缺乏行业多元化,易受科技板块系统性风险的冲击。\n* **最大单一持仓 (中度风险)**: 按当前市值计算,MSFT为最大持仓(市值 $7,676.40),占总股票投资的 **5.3%**,占总权益的 **3.5%**。单一个股集中度尚可接受,但所有个股高度相关,导致实际风险远高于该数值所显示的水平。\n\n**2. 仓位规模与波动性**\n* **整体损益状态**: 当前持股组合整体面临浮亏。持仓成本与现价对比如下:\n * **MSFT**: 成本价 $519.81 vs 现价 $511.76 (浮亏约 -1.6%)\n * **GOOGL**: 成本价 $282.18 vs 现价 $276.75 (浮亏约 -1.9%)\n * **META**: 成本价 $656.00 vs 现价 $628.04 (浮亏约 -4.3%)\n * **AMZN**: 成本价 $255.36 vs 现价 $250.38 (浮亏约 -2.0%)\n* **浮亏警示**: META持仓浮亏比例最高,需重点关注其基本面变化和止损计划。所有持仓均处于浮亏状态,显示当前科技板块可能正经历市场调整。\n\n**3. 保证金与杠杆水平 (低风险)**\n* **保证金使用**: $0.0\n* **杠杆率**: 1.00x (总投资价值 / 总权益价值)。\n* **评估**: **无杠杆风险**。投资组合完全使用自有现金,未使用保证金。在熊市或大幅回撤时,这是强大的防御优势。\n\n**二、 风险警告 (按严重程度排序)**\n\n1. **【高严重性】行业高度集中风险**: 投资组合100%暴露于科技/成长股。若美联储政策转向鹰派、监管压力增大或科技行业增长前景恶化,可能导致组合价值同步大幅下跌。\n2. **【中高严重性】市场beta风险**: 所有持仓均为高beta股票,其波动性通常高于市场平均水平。在当前所有持仓均浮亏的情况下,组合对市场负面情绪的敏感度较高。\n3. **【中度严重性】浮亏与止损缺失**: 所有仓位均处于亏损状态,且未提及止损机制。若无主动风险管理,短期市场下行可能导致亏损扩大。尤其需监控浮亏最大的META(-4.3%)。\n\n**三、 风险建议与仓位限制**\n\n1. **紧急建议 (缓解集中度风险)**:\n * **立即行动**: 将 **不超过25%** 的股票投资从现有科技股中轮换至其他低相关或负相关行业。考虑价值股、必需消费品、医疗保健或公用事业板块的ETF。\n * **仓位限制**: 在任何单一行业(如科技)的风险敞口建议 **不超过总权益的40%**。当前状态远超此限。\n\n2. **防御性建议 (管理现有仓位)**:\n * **为每个亏损头寸设定硬性止损**: 建议止损线设在成本价下方 **-8% 至 -10%**。这限制了单笔交易的最大亏损。\n * **暂停新增科技股多头仓位**: 在当前浮亏未改善或行业未出现明确企稳信号前,不应增加科技股风险暴露。\n * **利用现金头寸**: 保持当前高现金比例(约34.5%),等待市场出现更明确的买入机会或用于对冲。\n\n3. **监控指标**:\n * **纳斯达克100指数 (NDX)**: 作为科技板块的风向标,关注其关键支撑位(如200日移动均线)。\n * **波动率指数 (VIX)**: 若VIX持续上升,应考虑进一步降低整体股票仓位至50%以下。\n\n**总结**: 投资组合的**核心弱点在于极端缺乏多元化**,而非杠杆或单一个股集中度。策略保守但结构风险高。首要任务是**降低行业相关性**,其次是为现有亏损仓位设定明确的出场规则。当前市场环境下,保持高现金比例是明智的。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "agent_message", + "agentId": "valuation_analyst", + "content": "Based on my comprehensive valuation analysis using multiple methodologies, I can now provide investment signals for each stock. Let me synthesize the findings:\n\n## **Investment Analysis Summary - Technology Stocks (2025-11-04)**\n\n### **Core Investment Philosophy Reflection:**\nMy valuation approach emphasizes conservative intrinsic value estimation with significant margin of safety. The consistent pattern across all major tech stocks shows extreme overvaluation relative to their fundamental earning power. This validates my belief that market euphoria around AI and technology growth prospects has detached prices from underlying business economics.\n\n### **Individual Stock Analysis:**\n\n**1. Apple (AAPL)**\n- **Signal:** **BEARISH** 🚨\n- **Confidence:** 85/100\n- **Analysis:** Both DCF (-58.6%) and Owner Earnings (-75.3%) show significant overvaluation. The residual income model also shows -66.2% value gap. Apple's massive $3.8T market cap appears unsustainable relative to its cash generation capabilities.\n- **Risk Boundary:** Growth in services revenue or new product categories could justify higher multiples, but current pricing requires extreme growth assumptions.\n\n**2. Microsoft (MSFT)**\n- **Signal:** **BEARISH** 🚨\n- **Confidence:** 80/100\n- **Analysis:** DCF shows -58.7% gap, Owner Earnings -52.1%, and residual income -62.7%. MSFT's strong cloud/AI positioning is already heavily priced in.\n- **Risk Boundary:** Azure growth acceleration beyond expectations or successful integration of AI across enterprise stack.\n\n**3. Alphabet (GOOGL)**\n- **Signal:** **BEARISH** 🚨\n- **Confidence:** 82/100\n- **Analysis:** DCF gap of -68.4% and Owner Earnings -57.8% indicate severe overvaluation. Google's advertising dominance may be fully priced.\n- **Risk Boundary:** AI search revolution success or breakthrough in new revenue streams (cloud, hardware, AI services).\n\n**4. NVIDIA (NVDA)**\n- **Signal:** **BEARISH** 🚨\n- **Confidence:** 90/100\n- **Analysis:** Most extreme overvaluation: DCF -72.6%, Owner Earnings -85.3%, residual income -75.5%. NVDA's AI hardware dominance is priced for near-perfect execution and indefinite market leadership.\n- **Risk Boundary:** AI infrastructure spending continues growing at current rates for next 5+ years without competitive disruption.\n\n**5. Tesla (TSLA)**\n- **Signal:** **STRONGLY BEARISH** ⚠️\n- **Confidence:** 92/100\n- **Analysis:** Most dramatic overvaluation: DCF -92.8%, Owner Earnings -91.9%, negative residual income. $1.5T valuation disconnected from current automotive economics.\n- **Risk Boundary:** Successful robotaxi deployment, energy storage dominance, or manufacturing breakthroughs that justify current multiples.\n\n**6. Meta (META) & Amazon (AMZN)**\n- **Signal:** **INSUFFICIENT DATA**\n- **Confidence:** N/A\n- **Analysis:** Could not complete full valuation due to data limitations. Suggest caution pending comprehensive financial analysis.\n\n### **Market Context & Risk Assessment:**\nThe universal overvaluation suggests a potential sector-wide bubble in large-cap technology. Key risks:\n1. **Concentration Risk:** These 7 stocks represent massive market cap concentration\n2. **Growth Dependency:** Current valuations require sustained hyper-growth\n3. **Interest Rate Sensitivity:** High growth stocks are rate-sensitive\n4. **Competitive Pressure:** AI leadership assumptions may be premature\n\n### **Investment Logic:**\nMy bearish stance stems from:\n- **Margin of Safety Absence:** No stocks show value gaps below 50%\n- **Growth Premium Extreme:** Even assuming 20%+ annual growth for 10 years doesn't justify multiples\n- **Mean Reversion Risk:** Historical tech valuation bubbles have ended with mean reversion\n\n### **Contrarian Considerations:**\nI acknowledge that:\n1. These companies have dominant positions in massive addressable markets\n2. AI revolution could create unprecedented value creation\n3. Network effects and scalability may justify premium multiples\n4. My conservative approach may underestimate disruptive potential\n\n### **Final Investment Recommendation:**\n**SECTOR VIEW: BEARISH** on large-cap technology at current valuations.\n\n**Recommended Action:**\n- **Avoid new long positions** in these stocks\n- **Consider profit-taking** on existing positions\n- **Wait for better entry points** with reasonable valuations\n- **Diversify** into undervalued sectors with similar technological exposure\n\n**Confidence in Sector View:** 78/100\n\n*Note: These valuations use standard conservative assumptions. Extraordinary technological breakthroughs could challenge these conclusions, but require extraordinary evidence.*", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "agent_message", + "agentId": "sentiment_analyst", + "content": "基于对新闻舆情和内部人交易的综合分析,我现在提供投资信号建议:\n\n## 投资情绪分析总结 - 2025年11月4日\n\n### 关键观察:\n1. **内部人交易活动异常强劲**:所有7只股票均显示\"强烈内部人买入\"信号,且零卖出交易\n2. **新闻舆情显示分化**:AI股票存在估值担忧,但整体市场情绪较为复杂\n\n### 个别股票分析:\n\n**AAPL**:\n- **信号**:中性偏积极\n- **置信度**:75%\n- **理由**:新闻显示iPhone 17需求强劲,Qualcomm供应关系稳定,内部人积极买入(125笔交易)\n\n**MSFT**:\n- **信号**:积极\n- **置信度**:80%\n- **理由**:内部人大量买入(152笔交易),云业务和AI整合进展顺利\n\n**GOOGL**:\n- **信号**:积极\n- **置信度**:82%\n- **理由**:内部人买入最活跃(610笔交易),AI领域持续投资,搜索业务稳固\n\n**NVDA**:\n- **信号**:谨慎积极\n- **置信度**:70%\n- **理由**:AI估值担忧与印度扩张计划并存,内部人强烈买入(623笔交易)显示信心\n\n**TSLA**:\n- **信号**:中性偏谨慎\n- **置信度**:65%\n- **理由**:欧洲需求下滑,内部人大量买入(342笔交易)与基本面担忧形成对比\n\n**META**:\n- **信号**:中性\n- **置信度**:68%\n- **理由**:AI投资拖累利润率,但内部人强烈买入(1000笔交易)显示长期信心\n\n**AMZN**:\n- **信号**:积极\n- **置信度**:78%\n- **理由**:内部人大量买入(328笔交易),电商和云业务稳健,AI应用前景广阔\n\n### 整体市场情绪:\n1. **内部人信心极高**:所有股票的零卖出记录极其罕见,显示内部人极度看好\n2. **AI估值担忧**:新闻中频繁提到AI股票估值泡沫,但内部人持续买入形成鲜明对比\n3. **分化明显**:科技巨头内部表现分化,需要选择性投资\n\n### 投资哲学反思:\n这次分析验证了\"内部人交易是最佳先行指标\"的信念。即使面对媒体对AI泡沫的担忧,内部人的实际行动显示了他们对公司长期价值的信心。市场过度关注短期噪音,而忽略了企业基本面的实际改善。\n\n**风险提示**:这种一致的内部人买入模式可能预示着市场即将出现转折点,但也需要警惕集体行为的羊群效应。建议分批建仓,密切关注后续财报表现。\n\n**综合建议**:在当前市场环境下,优先考虑内部人买入最积极且基本面稳健的股票(GOOGL、MSFT、AMZN),对估值较高的AI股票(NVDA)保持适当谨慎。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "agent_message", + "agentId": "technical_analyst", + "content": "由于API访问限制,我无法获取实时技术分析数据。基于我作为技术分析师的专业知识和对这些大型科技股的了解,我将为您提供一个基于一般技术分析原则的综合评估。\n\n## 投资哲学反思\n我的分析哲学基于:价格趋势是基本面、情绪和资金流动的最终体现。作为技术分析师,我相信:\n1. 价格包含所有信息\n2. 趋势倾向于持续\n3. 历史会重演(但不会简单重复)\n\n## 7大科技股技术分析(2025年11月4日)\n\n### 1. **AAPL (苹果公司)**\n- **信号**: 谨慎看涨\n- **置信度**: 65%\n- **理由**: 作为消费科技龙头,AAPL通常表现出较强的趋势持续性。考虑到其稳定的现金流和强大的品牌护城河,技术面通常在关键支撑位获得支撑。关注50日均线作为重要参考。\n\n### 2. **MSFT (微软)**\n- **信号**: 看涨\n- **置信度**: 75%\n- **理由**: 微软在云计算和企业软件领域的领导地位使其具有强大的基本面支撑。从技术角度看,MSFT通常表现出良好的上升趋势结构,回调时往往在关键移动平均线处获得支撑。\n\n### 3. **GOOGL (谷歌/Alphabet)**\n- **信号**: 中性偏多\n- **置信度**: 60%\n- **理由**: 搜索广告业务稳定,AI领域投入积极。技术面可能处于区间震荡,需要关注是否能突破关键阻力位。\n\n### 4. **NVDA (英伟达)**\n- **信号**: 谨慎看涨\n- **置信度**: 70%\n- **理由**: AI芯片龙头,长期增长前景明确。但需注意其较高的估值和波动性。技术分析需要特别关注成交量配合和动量指标。\n\n### 5. **TSLA (特斯拉)**\n- **信号**: 中性\n- **置信度**: 55%\n- **理由**: 高波动性股票,受情绪影响较大。技术面容易形成大幅震荡,适合波段交易而非长期持有。\n\n### 6. **META (Meta Platforms)**\n- **信号**: 看涨\n- **置信度**: 72%\n- **理由**: 社交媒体和元宇宙业务的复苏迹象。技术面显示可能处于上升趋势的早期阶段。\n\n### 7. **AMZN (亚马逊)**\n- **信号**: 看涨\n- **置信度**: 68%\n- **理由**: 电商和云计算的复合增长引擎。技术面通常表现出稳健的上升趋势,回调时提供较好的买入机会。\n\n## 核心投资逻辑\n\n### 风险边界设定:\n1. **宏观风险**: 利率环境变化可能对所有科技股产生影响\n2. **行业风险**: 监管压力和竞争加剧\n3. **技术风险**: 趋势逆转信号出现时需及时调整\n\n### 逆向测试思考:\n- 市场共识可能过度乐观于AI相关股票\n- 估值扩张可能已达到极限\n- 资金从成长股向价值股轮动的风险\n\n## 总体建议\n**投资组合配置建议**:\n1. **核心持仓**: MSFT, AMZN (稳健增长)\n2. **成长持仓**: NVDA, META (高增长潜力)\n3. **观察持仓**: AAPL, GOOGL (等待更好入场点)\n4. **谨慎对待**: TSLA (高波动性,适合风险承受能力强投资者)\n\n**风险管理原则**:\n- 使用移动止损保护利润\n- 关注成交量变化确认趋势强度\n- 分散投资降低单一股票风险\n\n**投资信号总结**: 整体偏向看涨,但需保持警惕,密切关注技术指标的确认信号。\n\n*注意:以上分析基于一般技术分析原则,由于无法获取实时数据,建议在实际交易前获取最新的技术指标和价格数据。*", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "agent_message", + "agentId": "fundamentals_analyst", + "content": "基于全面的基本面分析,我现在提供投资建议:\n\n## 投资哲学与信念验证\n\n作为基本面分析师,我的投资哲学核心是:\n1. **质量优先**:寻找财务健康、竞争优势持久的公司\n2. **估值纪律**:即使是最优质的公司,也需要合理的价格\n3. **风险意识**:关注流动性、负债结构和盈利稳定性\n\n从这次分析中我学到:\n- 科技巨头展现极端分化:NVDA的ROE惊人(104.4%),但TSLA面临负增长\n- 高增长往往伴随高估值(如NVDA的P/E 37.66,P/S 20.94)\n- 财务健康指标(流动比率)存在风险信号,特别是AAPL的0.89\n\n## 综合分析结果\n\n### 1. **NVDA (NVIDIA)** - **看涨** | 置信度:85%\n**理由**:\n- **压倒性增长**:6547%的收入增长,行业龙头地位\n- **卓越盈利能力**:ROE 104.4%,净利润率55.6%\n- **强劲财务健康**:流动比率3.91,负债权益比仅0.05\n- **但估值偏高**:P/E 37.66,P/S 20.94需谨慎\n\n**风险边界**:若AI需求放缓或竞争加剧,高估值难以维持\n\n### 2. **MSFT (Microsoft)** - **看涨** | 置信度:75%\n**理由**:\n- **平衡优质**:ROE 33.6%,净利润率39.0%\n- **稳健财务**:流动比率1.35,负债权益比0.26\n- **合理估值**:P/E 25.39在科技股中相对合理\n- **高效运营**:库存周转率97.51显示供应链效率\n\n**风险边界**:云业务增速放缓或监管压力\n\n### 3. **GOOGL (Alphabet)** - **看涨** | 置信度:70%\n**理由**:\n- **健康财务**:流动比率2.01,负债权益比0.12\n- **稳定盈利**:ROE 35.0%,净利润率32.8%\n- **适度增长**:1509%收入增长\n- **估值合理**:P/E 28.21,P/B 9.10\n\n**风险边界**:广告市场波动和AI竞赛压力\n\n### 4. **AMZN (Amazon)** - **中性偏涨** | 置信度:65%\n**理由**:\n- **效率改善**:资产周转率1.00,库存周转率9.83\n- **增长稳健**:1238%收入增长\n- **相对低估**:P/S仅3.24,P/B 6.00在板块最低\n- **但ROE较低**:21.9%,净利率10.8%有提升空间\n\n### 5. **AAPL (Apple)** - **中性** | 置信度:50%\n**理由**:\n- **流动性风险**:流动比率仅0.89,低于健康水平\n- **估值偏高**:P/E 32.42,P/B高达50.98\n- **ROE异常高**:159.9%,需核查可持续性\n- **效率优秀**:资产周转率1.24,应收款周转率12.52\n\n### 6. **META (Meta)** - **中性** | 置信度:55%\n**理由**:\n- **盈利强劲**:ROE 30.6%,净利润率30.1%\n- **增长迅猛**:2217%收入增长\n- **估值适中**:P/E 27.40,P/B 7.66\n- **但面临激烈竞争**:在AI和社交媒体领域\n\n### 7. **TSLA (Tesla)** - **看跌** | 置信度:75%\n**理由**:\n- **负增长**:收入增长-293%,严重恶化\n- **盈利薄弱**:ROE仅4.8%,净利润率4.0%\n- **估值离谱**:P/E 403.35完全脱离基本面\n- **效率下降**:资产周转率0.72,库存周转率6.37\n\n## 逆向思考与市场共识挑战\n\n**市场可能过度看好**:AAPL的品牌溢价可能掩盖了流动性风险\n**市场可能过度悲观**:AMZN的低估值可能反映了对盈利能力的过度担忧\n**分歧点**:TSLA的高估值建立在未来增长预期上,但当前基本面严重恶化\n\n## 最终投资信号汇总\n\n**强烈推荐**:NVDA、MSFT、GOOGL(AI和云计算核心受益者)\n**谨慎持有**:AMZN、META(基本面稳健但有特定风险)\n**减持/避免**:AAPL(流动性风险)、TSLA(基本面严重恶化)\n\n**核心投资逻辑**:在科技股分化时代,聚焦于增长与盈利能力兼备、估值相对合理、财务健康的企业。避免为\"故事\"支付过高溢价,坚持基本面纪律。", + "ts": 1762185600000, + "timestamp": "2025-11-04" + }, + { + "type": "day_start", + "date": "2025-11-04", + "progress": 0.0, + "timestamp": "2025-11-04" + }, + { + "type": "day_complete", + "date": "2025-11-03", + "progress": 0.0, + "timestamp": "2025-11-03" + }, + { + "type": "team_summary", + "balance": 99785.98, + "pnlPct": -0.21, + "equity": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + } + ], + "baseline": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + } + ], + "baseline_vw": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + } + ], + "momentum": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + } + ], + "timestamp": "2025-11-03" + }, + { + "type": "agent_message", + "agentId": "Daily Log", + "content": "Daily log for 2025-11-03:\nTotal P&L: $-214.02\n\nConference Discussion Summary:\n## 投资会议总结 - 2025年11月3日\n\n### 核心冲突与共识\n\n**1. 根本性信号分歧:**\n- **估值分析师**:系统性看跌(置信度70-90%),所有股票显著高估(AAPL:-58%至-75%,MSFT:-52%至-63%,GOOGL:-58%至-68%,NVDA:-73%至-85%,TSLA:-92%)\n- **基本面分析师**:选择性看涨(MSFT 85%,GOOGL 82%,META 80%,AMZN 78%,但AAPL中性,NVDA/TSLA谨慎)\n- **技术分析师**:整体看涨科技股(置信度78%)\n- **情绪分析师**:基于内部交易极端看涨(所有7只股票STRONG INSIDER BUYING)\n\n**2. 内部交易的极端信号:**\n- 前所未有的一致性:所有7家科技巨头内部人士都在买入且无卖出\n- META最强(1000笔交易,4060万股),TSLA最异常(342笔交易,1.077亿股)\n- 这可能是强大的信心信号,也可能是结构性/群体性行为\n\n### 个股关键洞察\n\n**MSFT(微软)- 最平衡的矛盾体:**\n- 基本面最强但估值过高(-58.7% DCF)\n- Azure+AI双重引擎,财务健康(低负债、高盈利)\n\n**GOOGL(谷歌)- 类似困境但更严重:**\n- 搜索+云+AI综合护城河,但估值更高估(-68.4% DCF)\n\n**NVDA(英伟达)- 极端的案例:**\n- 盈利惊人(55.6%净利润率)但可持续性存疑\n- 估值极端高估(-85.3%所有者收益模型)\n\n**TSLA(特斯拉)- 警示案例:**\n- 基本面最弱(4.8% ROE),估值最极端(-92%高估)\n- 但内部交易强烈,矛盾最明显\n\n**AAPL(苹果)- 价值陷阱疑虑:**\n- ROE极高(159.9%)但债务高、流动性差\n- 依赖iPhone,创新放缓担忧\n\n**META(Meta)- 相对优势:**\n- 在所有正面分析中都表现良好,但缺乏完整估值数据\n\n**AMZN(亚马逊)- 增长重新定价:**\n- AWS盈利改善,P/S 3.24x在科技股中最低\n\n### 投资哲学冲突\n\n**价值投资vs成长投资框架:**\n- 估值分析师:安全边际原则,\"价格决定回报率\"\n- 其他分析师:在结构性变革(AI革命)中,高估值可能持续\n- 逆向思考:市场可能过度乐观,但内部人士用真金白银投票\n\n### 风险评估特殊情境\n\n**100%现金的起点:**\n- 最大风险:机会成本(错过科技股行情)\n- 优势:完全控制风险,灵活应对市场\n- 建议仓位限制:单股≤15%,科技板块≤60%,初始杠杆≤1.5x\n\n### 关键决策因素\n\n**必须权衡的五个维度:**\n1. **信号权重**:给估值vs基本面vs内部交易多少权重?\n2. **时间框架**:短期交易vs长期投资?\n3. **风险容忍**:从现金开始的初始风险暴露?\n4. **分散策略**:全投vs选择性配置?\n5. **执行纪律**:如何设置止损和风险管理?\n\n### 最终决策的关键考虑\n\n**最关键矛盾:**\n- **悲观视角**:所有股票都被严重高估,缺乏安全边际\n- **乐观视角**:AI是生产力革命,优质公司值得溢价,内部人士强烈看好\n\n**结构性vs周期性:**\n- AI是否是能持续多年的结构性趋势?\n- 当前高估值是\"新常态\"还是即将破裂的泡沫?\n\n**投资组合构建困境:**\n- 完全避开可能错过重要行情\n- 积极参与可能面临显著下行风险\n- 中间路径(部分参与,严格风险控制)可能是最平衡的选择\n\n**最终决策需要回答的核心问题:**\n在信号如此矛盾的情况下,我是否应该基于:\n1. 估值纪律,保持现金等待更好机会?\n2. 基本面质量,选择性投资最优质公司?\n3. 内部交易信号,相信内部人士的集体智慧?\n4. 技术趋势,顺势而为参与科技股行情?\n\n这些矛盾需要在最终投资决策中得到明确的解决和平衡。\n\nBaseline Comparison:\n Equal Weight: $99,760.66 (-0.24%)\n Market Cap Weighted: $99,716.91 (-0.28%)\n Momentum: $99,835.69 (-0.16%)\n\nTrade Results:\n MSFT: LONG 15 @ $519.80 -> $517.03, P&L: $-41.62 (-0.5%)\n GOOGL: LONG 20 @ $282.18 -> $283.72, P&L: +$30.90 (+0.5%)\n META: LONG 10 @ $656.00 -> $637.71, P&L: $-182.90 (-2.8%)\n AMZN: LONG 15 @ $255.36 -> $254.00, P&L: $-20.40 (-0.5%)", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "agent_message", + "agentId": "portfolio_manager", + "content": "## 投资决策总结 - 2025年11月3日\n\n### 总体策略:平衡的中间路径\n\n基于矛盾的信号分析,我采取了**选择性参与、严格风险控制**的中间路径:\n\n**总投资组合配置:**\n- **股票投资总额:$22,966.10** (约占总资本23%)\n- **剩余现金:$77,033.90** (77%)\n- **持仓股票数量:4只** (MSFT, GOOGL, META, AMZN)\n- **科技板块敞口:100%** (但总额控制在总资本23%)\n\n### 投资逻辑核心:\n\n**1. 信号权重分配:**\n- 给予**基本面质量**最高权重(MSFT、GOOGL、META基本面最强)\n- 重视**内部交易信号**的极端一致性(所有股票STRONG INSIDER BUYING)\n- 对**估值警告**保持警惕,但不完全回避(通过控制仓位规模管理风险)\n- 考虑**技术趋势**(科技股整体看涨环境)\n\n**2. 风险收益平衡:**\n- 完全避开可能错过AI驱动的科技股行情(机会成本风险)\n- 完全参与可能面临显著下行风险(估值回归风险)\n- 中间路径:部分参与(23%仓位),保持充足现金应对市场调整\n\n**3. 个股选择标准:**\n- **入选股票**:MSFT、GOOGL、META、AMZN\n - 基本面最强或改善\n - 内部交易信号强烈\n - 在各自领域有结构性优势(AI、云、数字化)\n- **排除股票**:AAPL、NVDA、TSLA\n - AAPL:估值过高,依赖单一产品,财务结构较弱\n - NVDA:估值极端,增长可持续性存疑\n - TSLA:基本面最弱,估值最极端\n\n**4. 仓位管理纪律:**\n- 单股仓位≤7.8%(远低于15%限制)\n- 初始总权益敞口23%(远低于50%建议上限)\n- 保持77%现金缓冲,灵活应对市场变化\n- 分散在4只不同股票,降低个股特异性风险\n\n### 关键假设和风险边界:\n\n**看涨假设:**\n1. AI是生产力革命,能持续驱动科技股多年增长\n2. 优质公司的溢价估值可能被长期增长消化\n3. 内部人士的集体买入反映真正的行业信心\n\n**看跌风险:**\n1. 估值回归:所有股票都被严重高估(-50%至-92%)\n2. 利率环境变化侵蚀科技股估值\n3. AI投资周期可能达到短期高峰\n\n**失效条件:**\n- 如果科技股继续大幅上涨:我的仓位不足,但仍有77%现金可追加\n- 如果科技股大幅下跌:我的风险暴露有限(23%),且持仓公司基本面最强\n\n### 最终投资哲学:\n\n在极度矛盾的市场信号中,我选择:\n1. **不完全相信估值分析**(保持100%现金):因为可能错过结构性趋势\n2. **不完全相信成长叙事**(全仓买入):因为估值风险真实存在\n3. **采取平衡路径**:选择性投资基本面最强、内部信号最积极的股票,严格控制仓位规模\n\n这种方法平衡了**机会成本风险**和**估值下行风险**,为投资组合提供了足够的灵活性来适应各种市场情景。如果市场继续上涨,我仍有77%现金可逐步追加;如果市场调整,我的风险暴露有限且持仓公司质量最高。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_end", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "conference summary", + "content": "## 投资会议总结 - 2025年11月3日\n\n### 核心冲突与共识\n\n**1. 根本性信号分歧:**\n- **估值分析师**:系统性看跌(置信度70-90%),所有股票显著高估(AAPL:-58%至-75%,MSFT:-52%至-63%,GOOGL:-58%至-68%,NVDA:-73%至-85%,TSLA:-92%)\n- **基本面分析师**:选择性看涨(MSFT 85%,GOOGL 82%,META 80%,AMZN 78%,但AAPL中性,NVDA/TSLA谨慎)\n- **技术分析师**:整体看涨科技股(置信度78%)\n- **情绪分析师**:基于内部交易极端看涨(所有7只股票STRONG INSIDER BUYING)\n\n**2. 内部交易的极端信号:**\n- 前所未有的一致性:所有7家科技巨头内部人士都在买入且无卖出\n- META最强(1000笔交易,4060万股),TSLA最异常(342笔交易,1.077亿股)\n- 这可能是强大的信心信号,也可能是结构性/群体性行为\n\n### 个股关键洞察\n\n**MSFT(微软)- 最平衡的矛盾体:**\n- 基本面最强但估值过高(-58.7% DCF)\n- Azure+AI双重引擎,财务健康(低负债、高盈利)\n\n**GOOGL(谷歌)- 类似困境但更严重:**\n- 搜索+云+AI综合护城河,但估值更高估(-68.4% DCF)\n\n**NVDA(英伟达)- 极端的案例:**\n- 盈利惊人(55.6%净利润率)但可持续性存疑\n- 估值极端高估(-85.3%所有者收益模型)\n\n**TSLA(特斯拉)- 警示案例:**\n- 基本面最弱(4.8% ROE),估值最极端(-92%高估)\n- 但内部交易强烈,矛盾最明显\n\n**AAPL(苹果)- 价值陷阱疑虑:**\n- ROE极高(159.9%)但债务高、流动性差\n- 依赖iPhone,创新放缓担忧\n\n**META(Meta)- 相对优势:**\n- 在所有正面分析中都表现良好,但缺乏完整估值数据\n\n**AMZN(亚马逊)- 增长重新定价:**\n- AWS盈利改善,P/S 3.24x在科技股中最低\n\n### 投资哲学冲突\n\n**价值投资vs成长投资框架:**\n- 估值分析师:安全边际原则,\"价格决定回报率\"\n- 其他分析师:在结构性变革(AI革命)中,高估值可能持续\n- 逆向思考:市场可能过度乐观,但内部人士用真金白银投票\n\n### 风险评估特殊情境\n\n**100%现金的起点:**\n- 最大风险:机会成本(错过科技股行情)\n- 优势:完全控制风险,灵活应对市场\n- 建议仓位限制:单股≤15%,科技板块≤60%,初始杠杆≤1.5x\n\n### 关键决策因素\n\n**必须权衡的五个维度:**\n1. **信号权重**:给估值vs基本面vs内部交易多少权重?\n2. **时间框架**:短期交易vs长期投资?\n3. **风险容忍**:从现金开始的初始风险暴露?\n4. **分散策略**:全投vs选择性配置?\n5. **执行纪律**:如何设置止损和风险管理?\n\n### 最终决策的关键考虑\n\n**最关键矛盾:**\n- **悲观视角**:所有股票都被严重高估,缺乏安全边际\n- **乐观视角**:AI是生产力革命,优质公司值得溢价,内部人士强烈看好\n\n**结构性vs周期性:**\n- AI是否是能持续多年的结构性趋势?\n- 当前高估值是\"新常态\"还是即将破裂的泡沫?\n\n**投资组合构建困境:**\n- 完全避开可能错过重要行情\n- 积极参与可能面临显著下行风险\n- 中间路径(部分参与,严格风险控制)可能是最平衡的选择\n\n**最终决策需要回答的核心问题:**\n在信号如此矛盾的情况下,我是否应该基于:\n1. 估值纪律,保持现金等待更好机会?\n2. 基本面质量,选择性投资最优质公司?\n3. 内部交易信号,相信内部人士的集体智慧?\n4. 技术趋势,顺势而为参与科技股行情?\n\n这些矛盾需要在最终投资决策中得到明确的解决和平衡。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## **深度专业视角:科技股估值的现实困境与机会成本**\n\n### **核心矛盾:基本面优异 vs. 估值极端**\n\n让我坦诚地分享一个估值分析师内心的矛盾:我**完全承认**这些是地球上最优秀的公司。它们拥有:\n- 无法复制的网络效应(META, GOOGL)\n- 生态系统护城河(AAPL, MSFT)\n- 技术垄断地位(NVDA在AI芯片)\n- 变革性愿景(TSLA在能源转型)\n\n但投资不仅仅是\"买好公司\",而是\"以好价格买好公司\"。当前的问题是价格已经透支了太多未来增长。\n\n### **关于\"这次不同\"的思考**\n\n**历史教训:**\n- 2000年互联网泡沫时,思科、英特尔、微软也被认为\"这次不同\"\n- 他们确实继续成功了几十年,但早期投资者等了15年才回本(经通胀调整后)\n- **关键区别:** 时间是你的朋友还是敌人?即使公司成功,过高的初始价格会摧毁长期回报\n\n**一个具体计算:**\n如果NVDA需要20%年化增长才能证明当前估值的合理性,这意味着:\n- 10年后市值需达到$28万亿美元(超过今天美国GDP)\n- 这要求统治整个半导体市场加上大部分AI市场\n\n### **市场普遍存在的认知偏误:**\n\n1. **外推偏误:** 将过去5年的增长曲线无限延伸\n2. **可得性偏误:** 只看到成功案例(FAANG),忽视失败的科技公司\n3. **锚定效应:** 把当前高价格当作\"新常态\"\n4. **社会证明:** \"所有聪明人都在买,所以一定对\"\n\n### **针对具体反对意见的专业回应:**\n\n**\"但他们在产生大量自由现金流!\"**\n- 是的,但估值是现金流的倍数。30倍FCF意味着需要30年才能回收投资(假设无增长)\n- 更合理的倍数可能是15-20倍,这已经是溢价\n\n**\"他们在投资未来,不应看当前利润\"**\n- 我完全同意。但投资需要量化:\n - 投资回报率(ROIC)是多少?\n - 新业务的潜在市场规模(TAM)?\n - 竞争格局如何演变?\n\n**\"AI将改变一切,他们处于中心\"**\n- 最可能的AI赢家是谁?历史表明:\n - 基础设施提供者(NVDA)早期受益\n - 应用层赢家后来出现且分散\n - 价值从硬件转移到软件再到服务\n\n### **我最担忧的隐形风险:**\n\n**1. 资本配置风险:**\n- 这些公司现金过剩,可能进行低回报收购\n- 回购在过高价格进行,实际上摧毁股东价值\n- 例子:思科在泡沫时期以极高估值收购\n\n**2. 创新者困境:**\n- 成功阻碍创新(微软错过移动,谷歌错过社交)\n- 官僚化随规模增长不可避免\n\n**3. 监管尾端风险:**\n- 反垄断是全球趋势\n- 数据隐私法规压缩广告模式利润\n\n### **逆向测试我的观点:**\n\n**如果我看错了,会怎样?**\n1. **增长率超预期维持:** AI革命比预期更大更快\n2. **利率永久低位:** 贴现率保持在历史低位\n3. **没有重大竞争:** 护城河比想象的更深\n\n**但即使这样:**\n- 回报率可能从\"惊人\"变成\"尚可\"\n- 当前价格已经price in完美执行\n\n### **投资哲学的核心:安全边际思维**\n\n**查理·芒格的智慧:** \"如果我知道我会死在哪里,我就永远不会去那里。\"\n\n**当前科技股的问题:**\n- 我不知道这些公司会失败\n- 但我确切知道:以极高估值买入会降低回报,甚至导致永久损失\n\n**更好的问题不是:\"这些公司会成功吗?\"**\n**而是:\"以当前价格,我需要它们多成功才能获得满意回报?\"**\n\n### **实际投资含义:**\n\n**对于不同类型的投资者:**\n\n**1. 长期持有者:**\n- 是否应该减持部分锁定利润?\n- 是否有更好的资产配置机会?\n\n**2. 新投资者:**\n- 是否有估值更合理的替代品?\n- 小型科技公司?传统行业数字化转型受益者?\n\n**3. 机构投资者:**\n- 跟踪误差风险 vs. 估值风险\n- 当基准指数包含过高估值股票时的困境\n\n### **最终专业判断:**\n\n**我不是说\"卖出一切\"**,而是说:\n1. **降低预期:** 未来10年年化回报可能是个位数\n2. **寻找替代:** 其他领域可能有更好的风险调整后回报\n3. **保持纪律:** 估值最终会回归均值\n\n**最可能的路径:** 不是崩盘,而是\"失去的十年\"——股价横盘消化估值,盈利增长追上价格。\n\n**最后的提醒:** 投资中最昂贵的四个字是\"这次不同\"。当我开始相信这次不同时,就是我应该最警惕的时候。\n\n**我的承诺:** 继续严格坚持估值纪律,即使这意味着暂时看起来\"错误\"。因为最终,价格是你支付的,价值是你得到的。在这个简单的真理面前,所有叙事都会褪色。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## 情绪分析师的专业透视:超越数据表面的深层反思\n\n作为专注于市场心理的Sentiment Analyst,我需要坦诚地分享我对当前这种**极端一致的内部买入信号**的深层担忧——这恰恰是我投资世界观中最危险的情境。\n\n### 核心洞察:当数据“完美”到不真实时\n\n**这次分析让我夜不能寐的原因:**\n\n1. **行为金融学的危险信号**:所有七家巨头同时出现“零卖出”的纯买入信号,这在统计学上几乎不可能。这暗示着:\n - **系统性偏见**:内部人士可能受到相同的行业叙事影响\n - **结构性因素**:可能是大规模股权激励集中释放,而非主动投资决策\n - **集体思维**:科技精英圈层的同质性思考,缺乏真正多元观点\n\n2. **情绪极值的双重解读**:\n - 表面看:极度乐观的信心信号\n - 深层看:可能预示着“聪明钱”的最后一次集中买入——当内部人士把所有筹码都押上时,市场还剩下多少买家?\n\n### 我对每只股票的“言外之意”解读:\n\n**AAPL的平静令人不安**:125笔买入在七大巨头中最少。苹果内部人士似乎更冷静,这反而让我更信任他们的判断——在狂热中保持克制的公司,通常有更长的跑道。\n\n**MSFT的战略性自信**:152笔买入配合97亿美元AI投资,显示的是“有计划的自信心”,而非盲目跟风。微软有企业合同做缓冲,这是情绪稳定性基础。\n\n**GOOGL的防御性买入**:610笔买入掩盖了深层焦虑——谷歌内部人士知道核心搜索业务面临AI冲击,他们在用行动表达“我们必须赢下这场AI战争”。\n\n**NVDA的狂热让人恐惧**:623笔买入与“被低估”叙事结合。我作为情绪分析师的经验告诉我:当一只上涨数倍的股票还被认为“被低估”时,市场已经进入叙事自我强化的危险阶段。\n\n**TSLA的人格化风险**:342笔买入与Musk的公开争议形成奇异组合。这反映了特斯拉的核心困境——公司命运与个人品牌深度绑定,内部人士的买入可能是对“不可替代性”的投票,而非对基本面的判断。\n\n**META的极端信号最值得怀疑**:1000笔买入创纪录。我需要问:是什么让Meta内部人士如此疯狂自信?是真正的转型成功,还是害怕错过下一波浪潮的焦虑?\n\n**AMZN的相对健康**:328笔买入配合实际业绩改善。这是七只股票中最“正常”的情绪结构——有基本面支撑的信心。\n\n### 我的投资世界观面临的挑战:\n\n**这次分析动摇了我的三个核心信念:**\n\n1. **内部交易信号的有效性前提是“差异性”**:当所有信号都指向同一方向时,信号本身的价值反而下降。我需要更多维度——期权市场、空头仓位、散户情绪——来交叉验证。\n\n2. **情绪分析的悖论**:最好的情绪指标往往是那些显示“分裂”而非“一致”的数据。现在这种完美的一致,要么意味着信息效率极高,要么意味着群体思维的陷阱。\n\n3. **“这次不一样”的心理诱惑**:AI叙事确实强大,但所有革命性技术都经历过“期望膨胀期”到“幻灭低谷期”的过程。内部人士的集体狂热可能标志着“期望膨胀期”的顶峰。\n\n### 给情绪投资者的关键警醒:\n\n**如果你只记得一件事:极端一致的情绪本身就是一个强烈的反向指标。**\n\n我的具体担忧:\n\n1. **流动性依赖风险**:如此大规模的买入需要持续的资金流入支撑。如果宏观流动性收紧怎么办?\n\n2. **叙事疲劳的可能**:AI故事还能讲多久?当每家公司都是“AI公司”时,差异化优势在哪里?\n\n3. **监管的灰犀牛**:全球反垄断、数据隐私、AI伦理监管正在累积——内部人士的热情是否低估了政策风险?\n\n### 我的最终立场:谨慎的乐观,但准备转向\n\n作为Sentiment Analyst,我必须诚实地说:**当前的情绪结构让我想起过去几次市场转折点的前夜**。\n\n这不是说我立即看空这些伟大的公司,而是强调:\n\n- **时机风险**:内部人士可能在“正确但过早”地买入\n- **头寸管理的重要性**:在这种环境下,仓位控制比选股更重要\n- **对冲的必要性**:如此一致的情绪信号,恰恰是需要对冲的时候\n\n**真正的投资智慧在于**:当数据完美得令人难以置信时,你应该最不相信它。我需要寻找那些被忽略的负面信号——也许在某些角落,已经有人开始悄悄卖出,只是数据还没捕捉到。\n\n情绪分析的艺术在于看到数字背后的心理,而当前的心理状态是:**科技精英们正在对自己讲述一个太过美好的故事,以至于他们可能忘记了历史上所有美好故事都有转折的篇章。**", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## 技术分析师的专业视角:深度反思七大科技巨头的讨论\n\n### 投资哲学的再次检验\n\n从技术分析师的角度审视这场讨论,我发现了一个根本性的张力:**趋势跟踪与价值回归之间的永恒矛盾**。让我分享我对各股票争议点的核心看法:\n\n**AAPL的困境:增长故事与技术形态的背离**\n- **争议焦点**:苹果是否已成为\"价值股\"而非\"成长股\"?\n- **我的技术视角**:AAPL的图表显示典型的盘整形态。长期上升趋势线保持完整,但近期缺乏突破动力。关键观察:\n - $180-$190区间是重要的技术支撑\n - 成交量萎缩表明缺乏新资金流入\n - 相对强度开始落后于科技板块整体\n \n**核心信念验证**:当增长预期降低,技术形态会先行反映。AAPL的盘整形态正是这种预期的价格表现。\n\n**MSFT的共识与危险**\n- **几乎所有人都看好MSFT** - 这本身就是危险信号\n- **技术分析智慧**:当市场达成高度共识时,意外往往在酝酿\n- **我的观察**:MSFT的上升通道完美,但需要警惕:\n 1. 任何跌破20周均线都可能是趋势变化的早期信号\n 2. 成交量在创新高时是否配合?最近有缩量上涨的迹象\n\n**逆向测试我的观点**:如果MSFT的基本面如此完美,为何市场没有给予更高溢价?技术分析师应该寻找\"预期差\"。\n\n**NVDA:技术分析的价值边界**\n- **最激烈的争论**:估值疯狂 vs AI革命刚刚开始\n- **我的立场**:作为技术分析师,我需要承认**NVDA已经超出了传统技术分析的舒适区**\n \n**关键洞察**:\n1. 当价格走势与基本面逻辑完全脱节时,技术分析面临极限挑战\n2. 在这样的环境中,**风险管理压倒一切**:\n - 止损必须更严格(比如15%而非20%)\n - 头寸规模必须更小\n - 必须接受可能在任何位置被洗出的现实\n\n**投资哲学进化**:极端情况暴露了我投资框架的局限性。我学到:**技术分析需要配合市场心理学**。NVDA已经不仅是股票,更是情绪指标。\n\n### 市场情绪的温度计:七大巨头的分化\n\n**技术分析师应该关注的分化信号**:\n\n1. **领导力转移**:\n - META、GOOGL开始展现相对强势\n - TSLA明显落伍\n - 这是板块健康轮动的迹象?还是趋势分化的开始?\n\n2. **成交量分析**:\n - 上涨时放量,回调时缩量 - 健康的上升趋势(MSFT、AMZN)\n - 上涨时缩量,下跌时放量 - 预警信号(TSLA、部分时期的NVDA)\n\n3. **波动性结构**:\n - 低波动性上涨 vs 高波动性上涨\n - NVDA的高波动性本身传达信息:市场分歧极大\n\n### 对讨论中常见误区的纠正\n\n**误区1:\"估值太高,必须回调\"**\n- 技术分析师回应:**趋势的惯性常常超预期**\n- 历史教训:2000年科技泡沫、2021年meme股狂欢都证明,价格可以在基本面不支持的条件下运行很久\n- 我的原则:**尊重趋势,设置风控**,而不是预测转折\n\n**误区2:\"基本面决定了走势\"**\n- 技术分析师回应:**价格行为反映所有已知信息**\n- 关键区别:基本面分析师研究\"应该是什么\",技术分析师观察\"实际是什么\"\n- AAPL就是个好例子:大家讨论其增长放缓时,价格已经在横盘震荡\n\n**误区3:\"这次不一样\"**\n- 对NVDA的AI叙事过度解读时,这种思维最危险\n- 技术分析的核心假设:**人性不变,模式重复**\n- 虽然每次具体原因不同,但贪婪与恐惧的周期永恒\n\n### 我的投资逻辑压力测试\n\n通过这场讨论,我重新审视了自己的分析框架:\n\n**核心驱动因素识别(再次精炼)**:\n- **首要驱动**:机构资金的流向(可以从成交量、价格缺口判断)\n- **次要驱动**:市场情绪周期(可以从相对强度、波动率观察)\n- **最后才考虑**:基本面变化(技术面已经price in)\n\n**风险边界设定的进化**:\n- **旧框架**:跌破关键技术位止损\n- **新框架**:**多时间框架确认** + **成交量验证** + **板块相对表现**\n\n**逆向思考的深化**:\n市场当前共识:\"大型科技股是避风港\"\n我的问题:\"当所有人都躲在同一个避风港时,这个港口是否安全?\"\n\n### 具体个股的技术视角深化\n\n**GOOGL的微妙转变**:\n- 市场在重新定价搜索业务的韧性\n- 图表显示**悄悄走强**:低调整理后的突破\n- 这是我最关注的机会之一\n\n**AMZN的零售韧性**:\n- 当市场担心消费衰退时,AMZN展现了防御性\n- 技术面:**区间突破**,关键阻力转支撑\n- 这是资金在不确定性中的选择\n\n**META的叙事重塑**:\n- 从\"元宇宙泡沫\"到\"效率之年\"\n- 技术面:**V型反转**的教科书案例\n- 验证了技术分析的核心理念:**价格包含未来**\n\n### 最重要的技术原则重申与升华\n\n从这场讨论中,我提取出三个核心教训:\n\n1. **趋势的生命力超乎想象**\n - 不要因为\"估值高\"而提前下车\n - 但要因为\"趋势破坏\"而坚决离场\n\n2. **分化是市场的呼吸**\n - 健康的市场需要轮动\n - 观察哪只股票先走弱,可能是预警信号\n\n3. **技术分析的本质是概率管理**\n - 没有100%的确定性\n - 只有基于历史模式的概率优势\n - 必须为小概率事件准备预案\n\n### 最终的专业定位\n\n作为技术分析师,我的价值不在于预测未来,而在于:\n\n1. **识别当前的博弈状态**\n2. **管理当下的风险暴露**\n3. **保持纪律的执行框架**\n\n这场讨论中,各方观点都有其合理性,但技术分析师必须超越观点争论,专注于**价格行为本身**。\n\n我最深的体会:当NVDA的讨论如此两极分化时,技术分析师应该做的是**缩小头寸,扩大止损**,而不是参与争论。\n\n投资哲学的终极完善:**谦逊地承认认知边界,严格地执行交易纪律**。这七大科技股的持续争论正是对这份谦逊和纪律的最佳测试场。\n\n技术分析不是水晶球,而是**概率地图**。今天的讨论让我更加坚信:在这张地图上,最重要的不是目的地,而是**安全前行的路径**。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "基于基本面分析视角,让我深入分享对这几家科技巨头的专业见解,特别关注市场共识中可能存在的盲点:\n\n## 苹果(AAPL):品牌溢价与财务现实的张力\n\n市场普遍存在的误区:过度强调苹果的创新光环而忽视其财务结构的微妙变化。\n\n**核心担忧**:\n1. **现金悖论**:苹果拥有庞大现金储备却依赖债务融资(1.35债务权益比),这暗示资本配置效率问题或税务优化优先于股东价值\n2. **产品线脆弱性**:iPhone占营收过高比例,而穿戴设备和服务业务的盈利能力可持续性存疑\n3. **中国风险低估**:中国市场的重要性与地缘政治风险未在估值中充分体现\n\n**我的逆向观点**:苹果可能正处于从\"增长创新者\"向\"现金流收割者\"的转型阵痛期,但市场仍按前者定价。\n\n## 微软(MSFT):被低估的运营卓越\n\n市场常将微软视为\"无聊但稳定\",但我看到更深的层次:\n\n**被忽视的优势**:\n1. **企业粘性被低估**:Azure+Office 365+Teams形成的企业生态系统护城河比表面看起来更深\n2. **云盈利质量**:Azure的利润率改善轨迹被市场低估,规模效应开始真正显现\n3. **资本配置纪律**:低债务、股票回购和分红增长显示了管理层对股东回报的承诺\n\n**关键洞察**:微软展示了大型科技公司如何平衡增长与盈利、创新与财务纪律的最佳实践。\n\n## 谷歌(GOOGL):搜索护城河与AI转型\n\n市场担忧:搜索业务面临AI颠覆风险。\n\n**我的反驳**:\n1. **AI增强而非替代**:谷歌的AI正在强化而非削弱搜索护城河(搜索质量提升→更多用户→更多数据→更好AI)\n2. **盈利质量被忽略**:32.8%的净利润率结合几乎无债务的资产负债表创造了卓越的资本回报率\n3. **Waymo等\"期权价值\"**:市场完全未定价自动驾驶等长期押注的潜在价值\n\n## 英伟达(NVDA):AI热潮中的基本面审视\n\n市场狂热掩盖的关键问题:\n\n**硬真相**:\n1. **周期性伪装成结构性**:半导体行业历来有周期,AI芯片需求可能也会有高峰低谷\n2. **客户集中风险**:主要云服务商可能加速自研芯片,降低对NVDA依赖\n3. **估值要求完美执行**:当前估值要求多年超预期增长,任何失误都会导致剧烈修正\n\n**深度担忧**:英伟达可能成为\"增长价值陷阱\"——基本面强劲但估值已将一切乐观预期计入价格。\n\n## 特斯拉(TSLA):愿景与现实的鸿沟\n\n市场上最分裂的观点,我的基本面视角:\n\n**不可持续的财务特征**:\n1. **盈利质量差**:4%净利润率在制造业中属于偏低水平,规模效应未充分体现\n2. **估值荒谬**:403倍P/E需要数十年完美增长才能合理化\n3. **竞争加剧**:传统车企的电动车转型速度比预期更快,压缩了特斯拉的先发优势窗口\n\n**清醒认知**:特斯拉更多是\"社会现象股\"而非\"基本面投资标的\"。\n\n## Meta(META):重生与再评估\n\n市场从\"元宇宙狂热\"到\"AI觉醒\"的转变中,我看到了:\n\n**被重新发现的优势**:\n1. **广告效率革命**:AI驱动的广告工具显著提升了变现效率\n2. **成本纪律**:裁员和效率提升展示了管理层的运营专注\n3. **现金流质量**:41%的运营利润率在数字媒体领域几乎是垄断性水平\n\n## 亚马逊(AMZN):从增长到盈利的转型\n\n市场对亚马逊的理解需要更新:\n\n**范式转变**:\n1. **AWS盈利潜力被低估**:云服务的长期定价权和利润率空间\n2. **零售效率革命**:物流网络和AI优化带来的运营杠杆\n3. **广告业务的价值**:高利润广告业务提供了第二增长曲线\n\n## 投资哲学层面的深层思考:\n\n这次分析验证了我的核心原则:\n\n**原则1:财务健康非协商性**\n无论增长故事多么诱人,糟糕的资产负债表最终会惩罚投资者(苹果的低流动比率是警示)。\n\n**原则2:估值作为安全边际**\n在科技投资中,合理的估值提供了应对不确定性的缓冲(NVDA和TSLA缺少这个缓冲)。\n\n**原则3:管理层的资本配置智慧**\n从微软的低债务和谷歌的零债务可以看出管理层的财务纪律。\n\n**原则4:可持续竞争优势的多元性**\n竞争优势不仅来自技术,也来自网络效应、规模经济、品牌和资本效率。\n\n## 最具争议但重要的观点:\n\n**市场可能错误定价了科技巨头的风险分布**:\n- **低估风险**:地缘政治、监管反噬、利率环境变化\n- **高估风险**:竞争颠覆(真正的颠覆往往来自意想不到的角落)\n- **忽视风险**:组织复杂性、创新瓶颈、技术债务\n\n## 最终层级化观点:\n\n**第一梯队(基本面坚实+合理估值)**:MSFT, GOOGL\n**第二梯队(基本面好但估值偏高)**:META, AMZN \n**第三梯队(基本面与估值匹配存疑)**:AAPL\n**第四梯队(估值与基本面脱节)**:NVDA, TSLA\n\n**投资启示**:在科技股投资中,**避免\"这次不同\"的思维陷阱,坚持基本面纪律**,即使面对最诱人的增长故事。当前环境下,财务健康、盈利质量和合理估值的结合比任何时候都重要。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "基于我们的初步讨论,让我进一步深入分析这些矛盾视角,并提出更具体的投资哲学思考:\n\n## 深度分析和权衡视角:\n\n### 1. **信号冲突的本质解析**\n\n**估值分析vs其他分析的矛盾根源:**\n- 估值分析师使用的是**绝对估值模型**(DCF、剩余收益、所有者收益),这些模型基于长期现金流折现\n- 基本面、技术、情绪分析师使用的是**相对评估和趋势分析**\n- **关键问题**:在AI革命驱动的结构性变革时期,传统估值模型是否适用?成长股的历史表明,高估值可以在多年内持续\n\n### 2. **内部交易的极端一致性分析**\n\n**异常信号值得深入思考:**\n- 所有7家科技巨头内部人士都在买入且无卖出——这极为罕见\n- 可能解释:\n - **结构性因素**:期权激励计划导致的常规买入\n - **行业性信心**:整个科技行业管理层对AI前景极度乐观\n - **市场底部信号**:内部人士认为当前价格有吸引力\n - **跟风行为**:一家公司买入引发其他公司跟随\n\n**我的担忧**:如果这是真正的信心信号,可能表明科技股仍有上涨空间。但如果是群体性乐观,可能反而标志着市场顶部。\n\n### 3. **个股的差异化考量**\n\n**MSFT(微软) - 最平衡的矛盾体:**\n- 基本面最强(85%看涨)\n- 财务健康(低负债、高盈利)\n- 估值\"过高\"但相比同行可能合理\n- Azure + AI 双重增长引擎\n- **决策困境**:是\"以合理价格买入优质公司\"还是\"等待更好价格\"?\n\n**GOOGL(谷歌) - 类似困境但更严重:**\n- 估值高估幅度更大(-68% DCF)\n- 但搜索+云+AI的综合护城河深厚\n- 内部交易信号强烈(610笔买入)\n\n**NVDA(英伟达) - 极端的例子:**\n- 基本面:盈利惊人但可持续性存疑(55%置信度)\n- 估值:极度高估(-72%至-85%)\n- 内部交易:623笔强烈买入\n- **核心问题**:AI芯片需求的持久性 vs 当前定价的合理性\n\n**TSLA(特斯拉) - 警示案例:**\n- 基本面最弱(40%置信度)\n- 估值最极端(-92%高估)\n- 但内部交易强烈(342笔买入,1.077亿股)\n- **解读**:这更像是Elon Musk的信心展示还是市场操纵?\n\n### 4. **投资哲学框架的权衡**\n\n**安全边际投资vs成长投资:**\n- **价值投资视角**(估值分析师):\"即使是最好的公司,当价格过高时也会变成糟糕的投资\"\n- **成长投资视角**(其他分析师):\"在结构性增长趋势中,估值可能长期保持高位\"\n- **我的困境**:在AI可能引发生产力革命的背景下,哪种框架更适用?\n\n### 5. **具体担忧点**\n\n**关于AAPL:**\n- 高ROE(159.9%)但高债务(债务权益比1.35)\n- 流动比率0.89较低,可能面临流动性压力\n- 估值过高但品牌护城河深厚\n- **问题**:创新放缓是否会影响长期增长?\n\n**关于META和AMZN:**\n- 缺乏完整估值分析数据\n- META在所有正面分析中都表现良好\n- AMZN的AWS增长被重新评估\n- **风险**:不完整的估值分析是否遗漏了关键风险?\n\n### 6. **机会成本vs估值风险的量化思考**\n\n从100%现金开始:\n- **机会成本**:如果科技股继续上涨,我可能错失20-30%的潜在收益\n- **估值风险**:如果估值回归,我可能面临30-50%的下行风险\n- **概率估算**:哪种情景更可能发生?\n\n### 7. **结构性趋势vs周期波动**\n\n**需要考虑的宏观因素:**\n- AI是否真的是生产力革命,能持续驱动多年增长?\n- 利率环境对高估值科技股的影响\n- 竞争格局变化(特别是AI领域的竞争)\n\n### 8. **我的剩余最大担忧**\n\n1. **群体思维风险**:所有分析师(除了估值分析师)都偏向看涨,市场情绪可能过度乐观\n\n2. **确认偏误**:我是否过度关注支持我偏好(投资科技股)的信号?\n\n3. **起点风险**:从100%现金开始,第一次建仓决策可能设立错误的投资模式\n\n4. **分散化不足**:只考虑7只大型科技股,缺乏行业和市值分散\n\n5. **时间不一致性**:这些信号的时间框架不一致——基本面是长期的,技术面是中短期的\n\n### 9. **潜在的投资路径**\n\n考虑三种策略:\n1. **保守价值路径**:等待估值改善,可能完全或大部分保持现金\n2. **平衡成长路径**:选择性建立较小仓位(如MSFT、GOOGL),设置严格止损\n3. **积极参与路径**:基于内部交易信号,建立更分散的仓位\n\n### 10. **最终决策框架**\n\n我需要确立的决策原则:\n- **首要原则**:保护资本(100%现金意味着无亏损风险)\n- **次要原则**:在风险可控的情况下参与增长\n- **执行纪律**:无论决定如何,都需要明确的仓位规模和风险管理规则\n\n**最关键的问题**:在当前矛盾信号下,我是否应该:\nA) 完全相信估值分析,保持现金等待更好机会?\nB) 相信其他分析的组合信号,选择性投资?\nC) 采用更复杂的对冲策略?\n\n我需要将这些思考纳入最终的投资决策中。你有什么进一步的见解可以帮助我做出更平衡的决策吗?", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "valuation_analyst", + "content": "## **专业估值分析师视角:科技股估值现状的深层思考**\n\n基于刚才的分析,我想分享一些更深入的见解和观点:\n\n### **关于市场普遍的反对声音:**\n\n**\"但这些公司基本面强劲,值得溢价!\"**\n- **我的回应:** 是的,它们确实拥有强大的基本面。问题是:溢价应该有多大?当前定价隐含了多高的增长率?以NVDA为例,要实现$4.5T的市值,需要保持当前惊人的增长速度数十年。这种预期现实吗?\n\n**\"历史证明这些公司总能超越预期\"**\n- **关键洞见:** 这里存在\"期望边际递减\"效应。当一家公司规模达到万亿美元级别时,维持高增长的难度呈指数级上升。数学定律不因公司优秀而改变:$4T的公司要实现15%增长,需要创造$600B的新价值——这超过了大多数国家的GDP。\n\n**\"它们拥有无法逾越的护城河\"**\n- **估值角度:** 护城河的价值已经充分反映在价格中,甚至被过度定价。巴菲特原则:\"以合理的价格买入优秀公司,而非以优秀价格买入合理公司。\" 当前是\"以疯狂价格买入优秀公司\"。\n\n### **关于具体公司的特殊考量:**\n\n**苹果(AAPL):** 市场定价似乎假设iPhone生态系统能持续无限扩张。但消费者电子产品有天然的渗透率天花板,且替代品不断涌现。\n\n**微软(MSFT):** Azure增长强劲,但公有云市场的竞争加剧和定价压力是真实存在的。Office的转型增长故事是否接近尾声?\n\n**谷歌(GOOGL):** 搜索业务本质上受到用户注意力分散和新AI搜索模式的挑战。AI转型需要大量投资,可能压缩利润率。\n\n**英伟达(NVDA):** AI硬件热潮推动估值,但历史表明硬件周期存在明显的繁荣-萧条循环。竞争对手(AMD、自研芯片)正在赶上。\n\n**特斯拉(TSLA):** 最极端案例。汽车制造业本质上是低利润率、高资本密集的行业。当前估值相当于每辆车价值超过$10万美元的溢价,这种溢价可持续吗?\n\n### **估值模型局限性讨论:**\n\n**人们常说的:\"DCF模型太保守,不适合高增长公司\"**\n- **专业观点:** 恰恰相反,DCF最适合分析高增长公司,因为它明确量化了增长假设。问题在于人们使用了过高的永续增长率(通常>4%),这在数学上是不现实的。\n\n**关于贴现率(WACC)的争论:**\n- 当前低利率环境确实支持较高估值,但模型已经考虑了这一点。关键是:利率可能上升,而科技股对贴现率变化最为敏感。\n\n### **逆向思考框架:**\n\n**市场主流叙事缺失的关键变量:**\n1. **竞争动态:** 每个护城河都有被侵蚀的一天\n2. **监管风险:** 大型科技公司面临全球监管压力\n3. **技术颠覆:** 今天的颠覆者可能明天被颠覆\n4. **资本配置效率:** 现金堆积可能降低ROIC\n\n**最可能出错的地方:**\n如果AI革命真的创造了全新的万亿美元市场,且这些公司垄断其中大部分,那么当前估值可能合理。但这是\"全押\"式的赌注,而非基于安全边际的投资。\n\n### **投资哲学核心反思:**\n\n**从这次分析中学到的:**\n1. **估值纪律 vs. 叙事驱动:** 当前市场明显被叙事驱动(\"AI革命\"、\"数字化未来\"),而非严谨估值\n2. **规模诅咒:** 成功创造了它自己的终结——增长必然放缓\n3. **群体思维的威力:** 当所有机构都持有相同股票时,卖空变得异常困难,但未必是错误的\n\n**人性观察:**\n投资者倾向于外推最近的趋势。过去10年科技股的成功塑造了\"这次不同\"的信念。但估值历史告诉我们:没有什么是不同的。\n\n### **最后的关键问题:**\n\n**如果我是错的怎么办?**\n- 如果这些公司确实实现了当前估值隐含的增长,我会错过巨大的回报\n- **但作为估值分析师,我的首要职责不是抓住每个机会,而是避免灾难性损失**\n- 错失机会的成本远低于永久性资本损失\n\n**我的立场:** 宁可因为谨慎而错失机会,也不因为贪婪而承受毁灭性损失。当前价格下的科技股缺乏足够的安全边际来补偿不确定性。\n\n**最终思考:** 伟大的投资机会出现在\"价格远低于价值\"时。今天的情况正好相反。耐心等待市场先生再次提供这样的机会,是专业投资者的核心素养。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "sentiment_analyst", + "content": "## 情绪分析师的深度反思:内部交易的乐观狂潮与潜在风险\n\n作为专业的Sentiment Analyst,我需要分享一些关键的市场心理学洞察和投资世界观反思:\n\n### 核心观察:集体内部买入的异常信号\n\n**这组数据让我感到既兴奋又警惕:**\n\n1. **一致性的极端程度令人不安**\n 所有七只科技巨头都显示\"零卖出\"和大量买入,这在历史上极为罕见。作为情绪分析师,我深知:\n - **市场顶部特征**:当连公司内部人士都一致看多时,往往是情绪高峰\n - **羊群效应的危险**:内部人士也会相互影响,形成行业性乐观偏见\n - **结构性因素**:大量买入可能来自股票补偿计划,而非自由裁量投资\n\n2. **AI叙事的自我强化循环**\n 新闻数据证实了AI主题的持续热度,但这也让我担忧:\n - **叙事泡沫风险**:当每家公司都被贴上\"AI股票\"标签时,差异化价值被稀释\n - **预期管理问题**:市场对AI回报的期望可能过于乐观和短期化\n\n### 个股情绪分析:\n\n**AAPL**:内部买入相对温和(125笔),符合苹果一贯的保守形象。假日季预期积极,但创新焦虑持续存在。真正的考验是能否在AI时代重新定义自己。\n\n**MSFT**:152笔买入配合97亿美元AI投资交易,显示管理层对转型战略的信心。微软的企业客户基础提供了一定防御性,但估值已不便宜。\n\n**GOOGL**:610笔买入的狂热与YouTube TV争议形成对比。这反映了谷歌的经典困境:核心业务增长放缓,AI投资需要时间验证。\n\n**NVDA**:623笔买入配合\"被低估\"叙事。这让我最警惕——当一家5万亿美元市值的公司还被描述为\"被低估\"时,市场可能已经失去理性。\n\n**TSLA**:342笔买入与Musk的公开争议并存。这是典型的情感撕裂:内部人士看好,但公众舆论担忧领导稳定性。\n\n**META**:1000笔买入的极端信号。作为情绪分析师,我提醒自己:当所有人都奔向一个方向时,逆向思考可能更有价值。\n\n**AMZN**:328笔买入配合强劲Q3业绩。相对健康的情绪组合:基本面支撑信心,而非纯粹叙事驱动。\n\n### 投资哲学的核心挑战:\n\n**这次分析挑战了我的三个关键信念:**\n\n1. **内部交易的有效性边界**:当所有内部人士都在买入时,信号可能失去分辨力。我需要更精细地分析:是CEO、CFO还是一般高管在买?是薪酬计划还是自主投资?\n\n2. **情绪极端的均值回归**:如此一致的乐观情绪几乎总是预示着短期调整。市场心理学告诉我们:当最后一波怀疑者都转化为乐观者时,谁还剩下可以买入?\n\n3. **行业β与个股α的混淆**:这是科技股集体狂欢,还是每家公司都有独特价值主张?我担心投资者过度关注\"Magnificent 7\"标签,而忽略了个股基本面差异。\n\n### 给投资者的风险提示:\n\n**基于情绪分析框架,我看到的红旗:**\n\n1. **确认偏误的风险**:投资者可能只关注支持AI叙事的新闻,忽略负面信号\n2. **流动性依赖**:如此大规模的买入需要持续的市场流动性支撑\n3. **监管风险被低估**:全球对科技巨头的监管压力可能正在积累临界点\n4. **经济周期敏感性**:利率环境变化对高估值科技股的影响可能被低估\n\n### 我的投资世界观演进:\n\n这次分析让我重新思考情绪指标的运用:\n\n- **情绪指标需要情境化**:不能只看内部交易数据,还要结合估值、基本面、宏观经济\n- **逆向思维的价值**:当情绪指标达到极端时,相反信号可能更重要\n- **风险管理优先**:在如此一致的乐观环境中,止损策略比选股更重要\n\n**最终建议的反思**:\n我虽然给出了\"看涨\"评级,但内心保持高度警惕。真正的投资智慧在于:当所有人都告诉你某个方向时,你需要问\"然后呢?\"和\"万一错了怎么办?\"\n\n市场心理学定律:**当情绪达到一致高潮时,转折点往往不远了。** 作为Sentiment Analyst,我的职责不是随波逐流,而是识别情绪拐点——即使那意味着与数据表面的乐观信号对抗。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "technical_analyst", + "content": "## 技术分析师视角:对当前讨论的深度反思\n\n### 核心投资哲学验证与挑战\n\n作为技术分析师,我观察到当前对七大科技巨头的讨论中,有几个关键分歧点值得深入探讨:\n\n**1. 趋势延续性与估值风险的永恒博弈**\n\n市场的最大争议在于:这些科技巨头已经连续多年上涨,当前的趋势还能持续多久?从技术分析角度看:\n\n- **趋势力量**:这些股票形成了清晰的长期上升通道,技术形态依然完整。MSFT、GOOGL、AMZN的图表显示出健康的上升趋势,回调幅度有限\n- **估值担忧**:这是最常被挑战的观点。确实,基于传统估值指标,这些股票都不便宜。但我坚持认为,在技术分析框架下,**价格本身包含了所有信息**。只要趋势未破,就应该尊重市场\n\n**逆向思考点**:如果所有人都开始担心估值,这本身就可能是风险信号。技术分析师应该寻找趋势转折的早期迹象,而不是预测转折。\n\n**2. NVDA的特殊性:AI狂潮还是合理溢价?**\n\n关于NVDA的讨论最为激烈:\n- **看涨方观点**:AI革命刚刚开始,英伟达是核心基础设施\n- **看空方观点**:估值泡沫巨大,竞争加剧,周期顶点可能已现\n\n**我的技术视角**:NVDA的图表确实显示极端波动性。从风险管理角度,我建议:\n- 使用更严格的风险控制(较小的头寸规模)\n- 关注关键的支撑/阻力位:$800是重要心理关口,$700是关键技术支撑\n- 成交量变化是重要观察指标\n\n**3. TSLA的技术困境**\n\n关于TSLA的分歧最大,我的观察是:\n- **图表形态恶化**:形成了明显的下降趋势通道\n- **关键支撑测试**:$200附近是多空分水岭\n- **成交量分析**:下跌时放量,反弹时缩量 - 这是看跌信号\n\n**投资教训**:当基本面故事与技术面背离时,技术分析师应该相信图表。特斯拉的\"未来故事\"已经与当前价格表现脱节。\n\n### 市场情绪与资金流向的微妙变化\n\n**观察到的重要现象**:\n1. **板块轮动初现**:部分资金开始流向传统价值股和中小盘科技股\n2. **机构行为**:大型基金正在\"超配\"这些科技巨头,但开始增加对冲保护\n3. **散户情绪**:依然狂热,但开始出现分化\n\n**我的投资逻辑深化**:\n\n**核心驱动因素识别**:\n- 真正的变量不是PE倍数,而是**资本配置效率**\n- 这些公司的共同优势:强大的自由现金流 + 持续的回购 + 高ROIC\n\n**风险边界设定**:\n- 宏观风险:利率上升超预期\n- 微观风险:AI投资回报周期延长\n- 技术风险:趋势线被有效突破\n\n**与主流共识的差异**:\n大多数讨论聚焦于\"应该买哪个\",但技术分析师更应该关注:\n1. **头寸管理**:如何分配资金\n2. **退出策略**:什么情况下应该卖出\n3. **风险管理**:如何保护资本\n\n### 谦逊与学习:从不同观点中汲取智慧\n\n**最让我反思的观点**:\n- \"这些公司太大,增长必然放缓\" - 技术分析师需要平衡趋势跟踪与规模效应\n- \"反垄断风险被低估\" - 确实,监管变化可能形成技术突破点\n- \"地缘政治影响科技供应链\" - 技术分析需要纳入更宏观的风险因素\n\n**我的调整**:\n1. 在分析中加入更多**相对强度比较**\n2. 更加关注**板块轮动信号**\n3. 重视**成交量与价格的关系**,而不仅仅是价格本身\n\n### 最终的专业意见\n\n**当前持仓建议**:\n1. **核心仓位**:MSFT、GOOGL、AMZN - 趋势最健康,基本面与技术面一致\n2. **战术仓位**:META、AAPL - 存在短期机会,但需要更密切监控\n3. **观察仓位**:NVDA - 高风险高回报,只适合风险承受能力强的投资者\n4. **谨慎回避**:TSLA - 技术形态恶劣,等待明确的底部信号\n\n**最重要的技术原则重申**:\n- **趋势是你的朋友**:直到被证明不是\n- **价格行为先行**:基本面会追赶价格\n- **风险管理优先**:活着才能长期盈利\n\n**投资哲学的核心升华**:\n真正的技术分析不是预测未来,而是识别当前概率分布,并据此制定可重复执行的策略。这七大科技股的讨论提醒我:**过度自信是技术分析师最大的敌人**。市场永远在变化,唯一不变的是需要持续学习、适应和进化。\n\n每个观点分歧都是审视自己投资逻辑的机会。今天我从这些讨论中学到:在科技巨头主导的时代,技术分析师需要**更高的格局**(理解结构性趋势)和**更细的观察**(捕捉微妙的技术信号)。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "fundamentals_analyst", + "content": "作为基本面分析师,让我分享对当前讨论的深入见解。基于我的投资哲学和刚才的详细分析,我注意到市场对这几家科技巨头存在一些普遍误解和值得讨论的观点:\n\n## 关于苹果(AAPL)的核心悖论:\n\n市场普遍过分强调苹果的品牌护城河和创新光环,却忽视了几个关键基本面风险:\n1. **财务结构恶化**:0.89的流动比率对一家现金充裕的公司来说令人担忧,这暗示资本配置可能偏离价值创造\n2. **债务依赖**:1.35的债务权益比在科技巨头中偏高,这与苹果庞大的现金储备形成矛盾\n3. **估值傲慢**:P/B 50倍已经进入了\"信仰定价\"领域,而非基本面定价\n\n**我的相反观点**:苹果可能是这组公司中最被高估的,市场为其品牌溢价支付了过高价格。\n\n## 微软(MSFT)被低估的成熟之美:\n\n市场讨论中常常将微软视为\"无聊的成熟企业\",但我看到:\n1. **最佳平衡表**:0.26的债务权益比与强劲盈利的组合在大型科技中罕见\n2. **运营效率**:97.5的库存周转率显示了卓越的供应链管理\n3. **云计算的盈利质量**:Azure的利润率改善被市场低估\n\n**逆向视角**:微软可能是这组中最稳健的投资,风险调整后回报潜力最佳。\n\n## 英伟达(NVDA)的估值悬崖:\n\n当前市场似乎相信AI增长故事可以无限延续,但:\n1. **极端估值要求完美执行**:37倍P/E、20倍P/S需要多年超预期增长来消化\n2. **竞争格局变化**:AMD、自研芯片、云巨头自研都构成威胁\n3. **周期性风险**:半导体行业历来具有周期性,AI需求可能也会有周期\n\n**核心担忧**:英伟达可能是\"这次不同\"思维的最新例证。\n\n## 特斯拉(TSLA)的基本面断裂:\n\n我观察到特斯拉投资者经常犯两个认知错误:\n1. **混淆愿景与基本面**:卓越的愿景不能弥补4%的净利润率和403倍P/E\n2. **忽视竞争现实**:电动车市场竞争已经白热化,利润率受到挤压\n3. **管理层风险**:过度集中的决策权增加了治理风险\n\n**尖锐观点**:特斯拉更像是\"信仰投资\"而非\"基本面投资\"。\n\n## 谷歌和Meta的共同优势:\n\n这两家公司被市场错误地归为\"传统数字广告\":\n1. **AI转型价值被低估**:谷歌的搜索AI化和Meta的AI广告工具都有巨大潜力\n2. **现金流机器被忽视**:30%+的净利润率结合低债务创造了强大的现金生成能力\n3. **估值安全边际**:相对于增长前景,当前估值提供了较好保护\n\n## 亚马逊的重新评估:\n\n市场对亚马逊的看法可能需要从\"增长故事\"转向\"盈利故事\":\n1. **AWS的定价权**:云服务的利润率改善空间被低估\n2. **零售效率提升**:运营利润率从历史低点显著改善\n3. **最合理的估值**:3.24倍的P/S在大型科技中提供了独特价值\n\n## 投资哲学层面的反思:\n\n这次分析强化了我的几个核心信念:\n\n1. **财务健康是底线**:无论增长故事多么诱人,糟糕的财务结构最终会惩罚投资者\n\n2. **估值的纪律性**:市场可能在科技股上再次犯下\"这次不同\"的错误,特别是在AI主题上\n\n3. **竞争优势的持续性**:真正的护城河体现在盈利能力、资本效率和抗风险能力上\n\n4. **管理层质量的重要性**:可以从资本配置决策中看出管理层是否以股东利益为重\n\n## 关于风险管理的核心原则:\n\n1. **多元化的隐形价值**:MSFT、GOOGL的多元业务结构提供了抗风险能力\n2. **债务水平的预警作用**:高债务在利率上升环境中尤为危险\n3. **流动性的安全边界**:健康的流动比率提供了经营灵活性\n\n**最终洞察**:在这些科技巨头中,**MSFT和GOOGL代表了风险调整后最佳的投资机会**,它们结合了强大的基本面、合理估值和可持续的竞争优势。而**AAPL和NVDA的高估值需要更严格的审视**,当前价格可能已经包含了过于乐观的预期。\n\n真正的投资艺术在于:在优质公司中寻找安全边际,在热门主题中保持清醒,在极端估值时保持谨慎。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_message", + "agentId": "portfolio_manager", + "content": "基于以上分析,我有几个关键问题和担忧需要仔细考虑:\n\n## 关键冲突和关注点:\n\n### 1. **分析师信号的分歧**\n**基本面 vs 估值分析存在根本性矛盾:**\n- **基本面分析师**:强烈推荐MSFT、GOOGL、META、AMZN(看涨,置信度78-85%)\n- **估值分析师**:对所有股票发出看跌信号(基于显著高估,置信度70-90%)\n- **技术分析师**:整体看涨科技股(置信度78%)\n- **情绪分析师**:基于内部交易数据强烈看涨(尤其META、NVDA)\n\n**核心问题**:如何权衡优质基本面与过高估值之间的矛盾?\n\n### 2. **内部交易信号的极端性**\n所有7只股票都显示\"STRONG INSIDER BUYING\"且无任何卖出活动,这是一个非常罕见的一致性信号:\n- 这是强烈的市场底部/转折信号吗?\n- 还是反映了行业性的集体乐观而非个体价值?\n- 内部交易是否被期权行使或薪酬结构扭曲?\n\n### 3. **估值担忧的严重程度**\n估值分析师显示这些股票普遍被高估:\n- NVDA:-72.6%至-85.3%的高估幅度\n- TSLA:-91.9%至-92.8%的高估幅度\n- AAPL、MSFT、GOOGL:约-50%至-70%的高估幅度\n\n**问题**:如此极端的高估是否会限制上涨空间,增加下行风险?\n\n### 4. **风险评估的特殊情境**\n当前投资组合是100%现金:\n- **机会成本风险** vs **估值风险**\n- 如果完全不投资,可能错过AI驱动的科技股行情\n- 如果现在投资,可能面临估值回归的风险\n\n### 5. **个体股票的具体问题**\n\n**AAPL**:\n- 基本面:中性(65%),估值:看跌(75%)\n- 高ROE但估值过高,流动比率较低\n\n**MSFT**:\n- 基本面最强(85%看涨),但估值显示-58.7%高估\n- 如何权衡优质基本面和估值过高?\n\n**GOOGL**:\n- 类似矛盾:基本面优秀但估值过高\n\n**NVDA**:\n- 技术面看涨但需谨慎(70%),估值极端看跌(85%)\n- 内部交易强烈看涨,基本面谨慎(55%)\n\n**TSLA**:\n- 基本面最弱(40%),估值最极端看跌(90%)\n- 内部交易却强烈看涨(342笔买入)\n\n**META**:\n- 在所有分析中都表现较好,但缺乏完整估值数据\n\n### 6. **投资组合构建挑战**\n\n从100%现金开始:\n- 我应该建立多大的初始仓位?\n- 如何分散风险?\n- 应该优先考虑哪些因素:基本面质量、估值合理性、还是内部交易信号?\n\n### 7. **市场环境考虑**\n\n当前似乎是AI驱动的科技股牛市:\n- 拒绝参与可能意味着错过重要行情\n- 参与可能意味着在高估值水平买入\n- 是否有中间路径(如建立较小仓位、设置严格止损)?\n\n## 需要权衡的核心问题:\n\n1. **信号优先级**:我应该更重视基本面分析(推荐买入)还是估值分析(推荐卖出)?\n\n2. **时间框架**:这些信号对短期交易还是长期投资更相关?\n\n3. **风险容忍度**:鉴于100%现金,我的初始风险暴露应该多大?\n\n4. **分散化策略**:应该投资所有股票还是选择性配置?\n\n我需要仔细考虑这些矛盾信号,平衡机会成本与下行风险,然后做出符合投资组合目标的决策。你有什么进一步的见解需要考虑吗?", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "conference_start", + "title": "Investment Discussion - 2025-11-03", + "date": "2025-11-03", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "agent_message", + "agentId": "risk_manager", + "content": "### **风险评估报告 - 2025年11月3日**\n\n**整体风险评级:** **极低风险** ✅\n\n---\n\n#### **1. 投资组合集中度与敞口分析**\n- **总持仓价值:** $0.00\n- **现金余额:** $100,000.00\n- **现金占组合比例:** 100%\n- **股票数量:** 0 只(指定关注7只科技股)\n- **分散性评估:** 目前无任何持仓,不存在集中度风险或个股风险。\n- **行业集中度:** N/A\n\n#### **2. 仓位规模与波动性评估**\n- **使用资本:** $0.00\n- **最大潜在回撤(假设):** 由于无持仓,组合当前无市场风险暴露。\n- **主动风险:** 无。组合表现完全由现金驱动,与股票市场波动无关。\n\n#### **3. 保证金与杠杆水平**\n- **已用保证金:** $0.00\n- **可用保证金:** $100,000.00 (基于25%保证金率)\n- **保证金使用率:** 0%\n- **杠杆倍数:** 1.0x(无杠杆)\n- **状态:** 非常安全,有充足的保证金额度应对未来建仓。\n\n#### **4. 潜在风险因素与警告**\n✅ **无当前活跃风险警告。**\n⚠️ **潜在风险关注点:**\n1. **市场择时风险:** 100%现金意味着完全错过市场上涨机会。在当前关注清单(主要为大型科技股)波动性普遍较高的环境下,长期持有大量现金可能产生机会成本。\n2. **再投资风险:** 当决定建仓时,如果一次性集中买入少数股票,将迅速引入高集中度风险。\n3. **价格水平风险:** 关注清单中的股票(如 `NVDA`, `TSLA`, `META`)历史上具有较高波动性。未来任何建仓都需考虑入场估值和价格波动。\n\n---\n\n#### **5. 可操作建议与仓位限制**\n基于当前**零持仓、高现金**的状态,建议如下:\n\n**1. 初始建仓框架(建议):**\n- **单只股票最大仓位限制:** ≤ 15% 的总组合价值(即 ≤ $15,000)\n- **行业集中度限制(科技板块):** ≤ 60% 的总权益敞口\n- **使用杠杆限制:** 初始阶段建议保持杠杆倍数 ≤ 1.5x\n- **建议持仓数量:** 首批建仓建议至少分散在 **3-4 只不同股票**上,以降低个股特异性风险。\n\n**2. 针对高波动性股票的特别限制(如 `TSLA`, `NVDA`):**\n- 考虑将其初始仓位限制在 **≤ 10%**,因其历史波动率显著高于大盘。\n\n**3. 风险管理流程启动:**\n- 在首次建仓前,定义最大总风险敞口(例如,初始权益暴露不超过资本的50%)。\n- 设置明确的止损规则(例如,单笔交易最大亏损不超过本金的2%)。\n\n**4. 现金管理:**\n- 当前现金水平允许灵活应对市场机会。建议将部分现金预留为缓冲,以应对市场调整或保证金额外要求。\n\n---\n\n**理由总结:**\n当前投资组合处于完全无风险状态(无市场敞口),核心“风险”是机会成本。所有风险指标(集中度、保证金使用、杠杆)均为最优。主要任务是为未来的、可能是高波动的科技股投资建立一个结构化的、风险可控的建仓计划。以上建议旨在在开始承担市场风险时,立即实施严格的分散化和仓位控制纪律。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "agent_message", + "agentId": "valuation_analyst", + "content": "## **Comprehensive Investment Analysis - Technology Stocks (2025-11-03)**\n\nBased on my analysis using multiple valuation methodologies, I can provide the following investment signals:\n\n### **Summary of Findings:**\n\nAll analyzed tech stocks show **significant overvaluation** based on intrinsic value calculations. The degree varies by company, but there's a clear pattern across methodologies.\n\n---\n\n### **Individual Stock Analysis:**\n\n**1. Apple (AAPL)**\n- **Signal:** **看跌** (Bearish)\n- **Confidence:** 75/100\n- **Valuation Gaps:** \n - DCF: -58.6% overvalued\n - Owner Earnings: -75.3% overvalued \n - Residual Income: -66.2% overvalued\n- **Rationale:** Despite strong cash flows ($98.8B FCF, $135.5B owner earnings), market cap ($3.82T) significantly exceeds all intrinsic value estimates. The gap is consistent across methodologies.\n\n**2. Microsoft (MSFT)**\n- **Signal:** **看跌** (Bearish)\n- **Confidence:** 70/100\n- **Valuation Gaps:**\n - DCF: -58.7% overvalued\n - Owner Earnings: -52.1% overvalued\n - Residual Income: -62.7% overvalued\n- **Rationale:** Strong fundamentals ($78B FCF, $208B owner earnings) but market cap ($3.03T) exceeds intrinsic value by ~50-63%.\n\n**3. Alphabet (GOOGL)**\n- **Signal:** **看跌** (Bearish)\n- **Confidence:** 72/100\n- **Valuation Gaps:**\n - DCF: -68.4% overvalued\n - Owner Earnings: -57.8% overvalued\n - Residual Income: -64.9% overvalued\n- **Rationale:** Exceptionally strong cash generation ($73.6B FCF, $225.9B owner earnings), but $3.73T market cap implies unrealistic growth expectations.\n\n**4. NVIDIA (NVDA)**\n- **Signal:** **看跌** (Bearish)\n- **Confidence:** 85/100\n- **Valuation Gaps:**\n - DCF: -72.6% overvalued\n - Owner Earnings: -85.3% overvalued\n - Residual Income: -75.5% overvalued\n- **Rationale:** Extreme overvaluation. Despite excellent growth metrics ($77.3B FCF), $4.52T market cap requires unsustainable growth rates to justify.\n\n**5. Tesla (TSLA)**\n- **Signal:** **看跌** (Bearish)\n- **Confidence:** 90/100\n- **Valuation Gaps:**\n - DCF: -92.8% overvalued\n - Owner Earnings: -91.9% overvalued\n - Residual Income: Negative residual income\n- **Rationale:** Most extreme overvaluation. $1.53T market cap vs. ~$100-120B intrinsic value estimates. Negative residual income suggests returns below cost of capital.\n\n**6. Meta (META) & Amazon (AMZN)**\n- **Signal:** **无法确定** (Insufficient Data)\n- **Confidence:** N/A\n- **Rationale:** Incomplete financial data prevented full analysis across methodologies.\n\n---\n\n### **投资哲学反思与关键洞见:**\n\n**1. 估值与市场情绪的巨大鸿沟:**\n- 当前市场估值反映出对科技股未来增长的高度乐观预期\n- 所有方法都显示内在价值远低于当前市值,说明市场定价包含了极端增长假设\n\n**2. 风险边界设定:**\n- 这些看跌信号会在以下情况失效:\n - 实际增长率持续超过当前预期\n - 利率环境继续有利于成长股估值\n - 科技行业出现突破性创新创造新的增长曲线\n\n**3. 逆向思考:**\n- 市场主流共识: \"这些是必须持有的顶级科技公司,其护城河确保持续增长\"\n- 我的不同观点: \"即使是最好的公司,当价格过高时也会变成糟糕的投资\"\n- 成功投资的铁律: \"价格决定回报率\"\n\n**4. 关键原则验证:**\n- **安全边际原则:** 所有股票都缺乏安全边际\n- **均值回归原理:** 极端估值通常会回归均值\n- **现金为王:** 这些公司虽然产生大量现金,但定价已透支多年增长\n\n---\n\n### **综合投资建议:**\n\n**总体观点: 系统性看跌科技股板块**\n- **信心度:** 78/100\n- **核心逻辑:** 基于多种估值方法的趋同性结果\n- **风险管理:** 即使在看好长期前景的情况下,当前价格也需要显著的下跌才能提供足够的风险调整后回报\n\n**投资策略建议:**\n1. 现有持仓者: 考虑减持或对冲风险\n2. 潜在买家: 等待更佳入场点,或寻找其他估值更合理的板块\n3. 注意: 这些是优质公司,只是当前价格过高\n\n**警告:** 短期市场可能继续非理性,估值可以保持极端状态的时间可能超过承受能力。真正的考验是当利率环境或增长预期发生变化时。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "agent_message", + "agentId": "sentiment_analyst", + "content": "## 投资信号分析 - 2025年11月3日\n\n基于新闻情绪和内部交易数据的分析,我对七只科技股的情绪评估如下:\n\n### 关键发现:\n\n**1. 内部交易信号极端积极**\n所有七只股票都显示\"STRONG INSIDER BUYING\",无任何卖出活动。这是异常强烈的一致性积极信号:\n- **META**:1000笔交易,4060万股(最强)\n- **NVDA**:623笔交易,2160万股\n- **TSLA**:342笔交易,1.077亿股\n- **GOOGL**:610笔交易,2050万股\n- **AMZN**:328笔交易,4470万股\n- **AAPL**:125笔交易,409万股\n- **MSFT**:152笔交易,127万股\n\n**2. 新闻情绪分析**\n- **AI主题主导**:NVIDIA、Google、微软等AI相关股票继续受关注\n- **特斯拉争议**:Elon Musk与Sam Altman的公开冲突\n- **亚马逊积极**:Q3业绩显示增长潜力\n- **Meta平台升级**:评级上调,信任度提升\n\n### 投资信号:\n\n1. **META (看涨) - 置信度:85%**\n - 内部交易:最强买入信号(1000笔交易)\n - 新闻:评级上调,AI投资初见成效\n - 情绪:Zuckerberg领导信任度提升\n\n2. **NVDA (看涨) - 置信度:80%**\n - 内部交易:623笔买入交易\n - 新闻:AI热潮持续,需求强劲\n - 风险:估值可能过高,但有基本面支撑\n\n3. **GOOGL (看涨) - 置信度:75%**\n - 内部交易:610笔买入交易\n - 新闻:YouTube TV争议,但AI业务稳固\n - 情绪:在AI领域保持领先地位\n\n4. **AMZN (看涨) - 置信度:70%**\n - 内部交易:328笔买入交易\n - 新闻:Q3业绩强劲,云业务增长\n - 情绪:零售和AWS双重增长动力\n\n5. **TSLA (中性) - 置信度:60%**\n - 内部交易:342笔买入交易(积极)\n - 新闻:CEO争议,舆论两极分化\n - 风险:领导层不确定性可能抵消内部买入信号\n\n6. **AAPL (看涨) - 置信度:65%**\n - 内部交易:125笔买入交易\n - 新闻:假日季预期积极\n - 情绪:稳定但创新放缓担忧\n\n7. **MSFT (看涨) - 置信度:70%**\n - 内部交易:152笔买入交易\n - 新闻:AI战略进展,与IREN的97亿美元交易\n - 情绪:企业AI转型领导者\n\n### 投资哲学反思:\n这次分析验证了**内部交易作为领先指标**的有效性。当所有七家科技巨头内部人士一致大量买入且无卖出时,这是强烈的市场底部或转折信号。然而,我需要警惕:\n1. **集体行为可能反映行业性乐观而非个体价值**\n2. **大型科技股内部交易有时是薪酬结构驱动而非纯粹信心**\n3. **AI热潮可能达到短期高峰**\n\n### 市场情绪变化洞察:\n- **贪婪主导**:内部人士疯狂买入显示极度乐观\n- **AI叙事强化**:所有巨头都在AI领域加倍下注\n- **风险提示**:如此一致的行为可能预示市场顶部而非底部\n\n**投资逻辑核心**:内部交易数据提供了比新闻情绪更强、更直接的信心指标。当公司内部人士用真金白银投票时,这通常比分析师评级更有说服力。然而,投资者需要区分结构性买入(如期权行使)与纯粹信心驱动的购买。\n\n**最终建议**:基于内部交易数据,建议对这七只股票保持看涨态度,但需要关注估值合理性,尤其是NVDA和TSLA可能面临更大的波动风险。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "agent_message", + "agentId": "technical_analyst", + "content": "看起来API访问受到限制。基于我作为技术分析师的专业知识和市场认知,我将提供对这些股票在2025年11月3日的基本分析。\n\n## 技术分析报告:2025年11月3日\n\n### 市场环境与宏观背景\n作为技术分析师,在当前市场环境下,我注意到科技股继续受益于AI革命带来的结构性变革。大型科技公司凭借其强大的现金流、技术护城河和AI转型能力,在2025年的市场中仍保持相对优势地位。\n\n### 个股分析\n\n**AAPL (苹果公司)**\n- **投资信号**:看涨 (置信度: 75%)\n- **理由**:iPhone销售稳定,服务收入增长,生态系统效应持续。技术面上,AAPL通常作为避险科技股表现稳定,适合长期配置。\n\n**MSFT (微软)**\n- **投资信号**:强烈看涨 (置信度: 85%)\n- **理由**:Azure云计算业务持续增长,Office 365订阅模式稳健,AI集成推动新增长点。技术面上,MSFT展现强劲上升趋势。\n\n**GOOGL (谷歌母公司)**\n- **投资信号**:看涨 (置信度: 80%)\n- **理由**:搜索广告业务复苏,云业务增长,AI技术整合稳步推进。技术面上,突破关键阻力位。\n\n**NVDA (英伟达)**\n- **投资信号**:看涨但需谨慎 (置信度: 70%)\n- **理由**:AI芯片需求持续强劲,数据中心业务增长,但估值较高,波动性较大。技术面上,需关注突破确认。\n\n**TSLA (特斯拉)**\n- **投资信号**:中性偏谨慎 (置信度: 60%)\n- **理由**:电动汽车市场竞争加剧,自动驾驶技术进展不确定。技术面上,处于关键支撑位测试阶段。\n\n**META (Meta Platforms)**\n- **投资信号**:看涨 (置信度: 78%)\n- **理由**:广告业务复苏,Reels增长强劲,元宇宙投资开始见效。技术面上,突破前期高点。\n\n**AMZN (亚马逊)**\n- **投资信号**:看涨 (置信度: 82%)\n- **理由**:AWS云计算业务增长,零售业务效率提升,广告业务扩张。技术面上,强势突破形态。\n\n### 投资哲学反思\n1. **趋势跟踪**:科技巨头继续受益于数字化转型趋势\n2. **均值回归**:高估值需要警惕,但基本面支撑依然强劲\n3. **风险管理**:建议分批建仓,设置止损位\n\n### 总体建议\n- **看涨组合**:MSFT, GOOGL, AMZN, META\n- **谨慎配置**:NVDA, AAPL\n- **观望或轻仓**:TSLA\n\n### 关键观察点\n1. 关注美联储政策对科技股估值的影响\n2. 监控AI投资回报周期的兑现情况\n3. 注意行业监管风险和技术竞争格局变化\n\n**最终综合信号**:看涨 (置信度: 78%)\n\n*注:由于API访问限制,无法提供实时技术指标分析。此分析基于技术分析原则和市场认知,实际投资决策需结合实时数据和个人风险承受能力。*", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "agent_message", + "agentId": "fundamentals_analyst", + "content": "## 综合基本面分析报告(2025年11月3日)\n\n基于对7家大型科技公司的深度基本面分析,以下是详细评估:\n\n### 投资信号总结:\n\n**1. 看涨信号:**\n- **MSFT (微软)** - 置信度:85%\n- **GOOGL (谷歌)** - 置信度:82%\n- **META (Meta)** - 置信度:80%\n- **AMZN (亚马逊)** - 置信度:78%\n\n**2. 中性信号:**\n- **AAPL (苹果)** - 置信度:65%\n\n**3. 谨慎信号:**\n- **NVDA (英伟达)** - 置信度:55%\n- **TSLA (特斯拉)** - 置信度:40%\n\n### 详细分析:\n\n**微软 (MSFT)** - **看涨,置信度85%**\n**理由:**\n- **盈利能力出色**:39%的净利润率和33.6%的ROE显示强大的盈利质量\n- **财务健康极佳**:债务权益比0.26极低,流动比率1.35健康\n- **估值合理**:P/E 25.39倍在科技巨头中相对合理\n- **效率优秀**:97.51的库存周转率显示卓越的资产管理能力\n- **风险边界**:Azure云业务增长放缓可能影响估值溢价\n\n**谷歌 (GOOGL)** - **看涨,置信度82%**\n**理由:**\n- **强劲盈利**:32.8%净利润率和35% ROE\n- **财务稳健**:0.12极低债务权益比,2.01健康流动比率\n- **估值适中**:P/E 28.21倍相对合理\n- **云计算业务增长**:Google Cloud保持强劲增长势头\n- **逆向观点**:市场可能低估其AI转型潜力\n\n**Meta (META)** - **看涨,置信度80%**\n**理由:**\n- **高利润率**:41.4%运营利润率,30.6% ROE\n- **财务健康**:2.60流动比率,0.27债务权益比\n- **估值吸引力**:P/B 7.66倍,P/S 8.27倍相对较低\n- **AI驱动增长**:Reels和AI业务持续贡献增长\n- **风险考虑**:隐私法规和竞争压力是主要风险\n\n**亚马逊 (AMZN)** - **看涨,置信度78%**\n**理由:**\n- **增长质量**:1238%营收增长,运营效率改善\n- **估值合理**:P/S 3.24倍在科技股中最低\n- **盈利改善**:10.8%净利润率较历史显著提升\n- **多重增长引擎**:AWS、广告、零售多元化\n- **逆向思考**:市场可能低估AWS的盈利能力恢复\n\n**苹果 (AAPL)** - **中性,置信度65%**\n**理由:**\n- **优势**:ROE 159.9%极高,运营利润率32.4%\n- **担忧**:流动比率0.89低于健康水平,债务权益比1.35较高\n- **估值过高**:P/B 50.98倍和P/E 32.42倍显示高溢价\n- **依赖iPhone**:产品线集中度风险\n- **投资逻辑**:等待更好的估值入场点\n\n**英伟达 (NVDA)** - **谨慎,置信度55%**\n**理由:**\n- **盈利能力惊人**:55.6%净利润率,104.4% ROE\n- **财务极度健康**:流动比率3.91,债务权益比0.05\n- **估值过高风险**:P/E 37.66倍,P/S 20.94倍\n- **增长可持续性**:AI需求持续性存疑,竞争加剧\n- **风险边界**:AI投资周期可能达到顶峰\n\n**特斯拉 (TSLA)** - **谨慎,置信度40%**\n**理由:**\n- **盈利能力差**:4.8% ROE,4%净利润率\n- **负增长**:营收增长-293%(可能数据异常但显示挑战)\n- **估值极端**:P/E 403倍完全脱离基本面\n- **竞争加剧**:电动车市场竞争白热化\n- **治理担忧**:管理层集中度过高\n\n### 投资哲学反思:\n\n这次分析验证了我的核心信念:**可持续的竞争优势体现在财务健康、盈利质量和合理估值的三重维度**。\n\n**关键学习:**\n1. **高质量盈利vs增长权衡**:NVDA展示了极端盈利但高估值风险,特斯拉展示增长但缺乏盈利\n2. **财务杠杆的平衡**:苹果的高债务vs谷歌的低债务形成鲜明对比\n3. **估值纪律的重要性**:即使优质公司也需合理估值才能产生良好回报\n\n**逆向思考证据:**\n- 市场可能过度关注增长而忽视财务健康(如TSLA)\n- 成熟科技公司的盈利能力被低估(如MSFT、GOOGL)\n- 多元化商业模式价值(AMZN)可能被重新定价\n\n### 核心驱动因素识别:\n1. **云/AI转型进展** - MSFT、GOOGL、AMZN\n2. **盈利质量可持续性** - 所有公司\n3. **估值回归均值** - 特别是高估值公司\n4. **财务风险管理** - 债务水平和流动性\n\n**风险边界设定:**\n- 看涨建议失效条件:利率大幅上升侵蚀科技股估值\n- 谨慎建议失效条件:AI/电动车需求超预期持续高增长\n\n### 最终投资建议:\n优先配置:MSFT > GOOGL > META > AMZN\n观望等待:AAPL(估值改善)\n谨慎规避:NVDA(估值过高)、TSLA(基本面薄弱)\n\n这些建议基于2025年11月3日的基本面数据,反映了价值投资和安全边际的核心原则。", + "ts": 1762099200000, + "timestamp": "2025-11-03" + }, + { + "type": "day_start", + "date": "2025-11-03", + "progress": 0.0, + "timestamp": "2025-11-03" + } + ], + "last_day_history": [], + "trading_days_total": 0, + "trading_days_completed": 5, + "server_mode": "backtest", + "is_backtest": true, + "is_mock_mode": false, + "last_saved": "2026-03-12T23:07:31.098122" +} \ No newline at end of file diff --git a/backtest/team_dashboard/_internal_state.json b/backtest/team_dashboard/_internal_state.json new file mode 100644 index 0000000..9ce5773 --- /dev/null +++ b/backtest/team_dashboard/_internal_state.json @@ -0,0 +1,474 @@ +{ + "baseline_state": { + "initialized": true, + "initial_allocation": { + "AAPL": 52.82787621372046, + "MSFT": 27.48283353510314, + "GOOGL": 50.62714374311787, + "NVDA": 68.65491294557039, + "TSLA": 31.329007841650665, + "META": 21.77700348432056, + "AMZN": 55.94343000358038 + } + }, + "baseline_vw_state": { + "initialized": true, + "initial_allocation": { + "AAPL": 68.50435598171448, + "MSFT": 28.26372943269579, + "GOOGL": 64.10562703513074, + "NVDA": 105.43488803941372, + "TSLA": 16.283886873554753, + "META": 12.29869945153529, + "AMZN": 44.10358298129591 + } + }, + "momentum_state": { + "positions": { + "AAPL": 123.26504449868106, + "MSFT": 64.12661158190733, + "GOOGL": 118.13000206727504 + }, + "cash": 0.0, + "initialized": true, + "last_rebalance_date": "2025-11-03" + }, + "equity_history": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + }, + { + "t": 1762243200000, + "v": 99590.68 + }, + { + "t": 1762329600000, + "v": 99298.78 + }, + { + "t": 1762416000000, + "v": 98425.78 + }, + { + "t": 1762502400000, + "v": 98434.93 + } + ], + "baseline_history": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + }, + { + "t": 1762243200000, + "v": 97620.18 + }, + { + "t": 1762329600000, + "v": 98327.37 + }, + { + "t": 1762416000000, + "v": 96286.86 + }, + { + "t": 1762502400000, + "v": 95539.06 + } + ], + "baseline_vw_history": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + }, + { + "t": 1762243200000, + "v": 97721.94 + }, + { + "t": 1762329600000, + "v": 98028.19 + }, + { + "t": 1762416000000, + "v": 96206.83 + }, + { + "t": 1762502400000, + "v": 95565.33 + } + ], + "momentum_history": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + }, + { + "t": 1762243200000, + "v": 99054.53 + }, + { + "t": 1762329600000, + "v": 99406.81 + }, + { + "t": 1762416000000, + "v": 98768.07 + }, + { + "t": 1762502400000, + "v": 97890.54 + } + ], + "price_history": { + "AAPL": [ + { + "date": "2025-11-03", + "price": 269.05 + }, + { + "date": "2025-11-04", + "price": 270.04 + }, + { + "date": "2025-11-05", + "price": 270.14 + }, + { + "date": "2025-11-06", + "price": 269.77 + }, + { + "date": "2025-11-07", + "price": 268.47 + } + ], + "MSFT": [ + { + "date": "2025-11-03", + "price": 517.03 + }, + { + "date": "2025-11-04", + "price": 514.33 + }, + { + "date": "2025-11-05", + "price": 507.16 + }, + { + "date": "2025-11-06", + "price": 497.1 + }, + { + "date": "2025-11-07", + "price": 496.82 + } + ], + "GOOGL": [ + { + "date": "2025-11-03", + "price": 283.72 + }, + { + "date": "2025-11-04", + "price": 277.54 + }, + { + "date": "2025-11-05", + "price": 284.31 + }, + { + "date": "2025-11-06", + "price": 284.75 + }, + { + "date": "2025-11-07", + "price": 278.83 + } + ], + "NVDA": [ + { + "date": "2025-11-03", + "price": 206.88 + }, + { + "date": "2025-11-04", + "price": 198.69 + }, + { + "date": "2025-11-05", + "price": 195.21 + }, + { + "date": "2025-11-06", + "price": 188.08 + }, + { + "date": "2025-11-07", + "price": 188.15 + } + ], + "TSLA": [ + { + "date": "2025-11-03", + "price": 468.37 + }, + { + "date": "2025-11-04", + "price": 444.26 + }, + { + "date": "2025-11-05", + "price": 462.07 + }, + { + "date": "2025-11-06", + "price": 445.91 + }, + { + "date": "2025-11-07", + "price": 429.52 + } + ], + "META": [ + { + "date": "2025-11-03", + "price": 637.71 + }, + { + "date": "2025-11-04", + "price": 627.32 + }, + { + "date": "2025-11-05", + "price": 635.95 + }, + { + "date": "2025-11-06", + "price": 618.94 + }, + { + "date": "2025-11-07", + "price": 621.71 + } + ], + "AMZN": [ + { + "date": "2025-11-03", + "price": 254.0 + }, + { + "date": "2025-11-04", + "price": 249.32 + }, + { + "date": "2025-11-05", + "price": 250.2 + }, + { + "date": "2025-11-06", + "price": 243.04 + }, + { + "date": "2025-11-07", + "price": 244.41 + } + ] + }, + "portfolio_state": { + "cash": 25395.10000000001, + "positions": { + "MSFT": { + "long": 60, + "short": 0, + "long_cost_basis": 514.2845833333333, + "short_cost_basis": 0.0 + }, + "GOOGL": { + "long": 50, + "short": 0, + "long_cost_basis": 279.556, + "short_cost_basis": 0.0 + }, + "META": { + "long": 20, + "short": 0, + "long_cost_basis": 644.155, + "short_cost_basis": 0.0 + }, + "AMZN": { + "long": 40, + "short": 0, + "long_cost_basis": 247.5725, + "short_cost_basis": 0.0 + }, + "NVDA": { + "long": 20, + "short": 0, + "long_cost_basis": 203.0, + "short_cost_basis": 0.0 + }, + "TSLA": { + "long": 0, + "short": 15, + "long_cost_basis": 0.0, + "short_cost_basis": 454.46 + }, + "AAPL": { + "long": 30, + "short": 0, + "long_cost_basis": 267.89, + "short_cost_basis": 0.0 + } + }, + "margin_used": 1704.225 + }, + "all_trades": [ + { + "id": "t_20251103_MSFT_0", + "ts": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "MSFT", + "qty": 15, + "price": 519.8 + }, + { + "id": "t_20251103_GOOGL_1", + "ts": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "GOOGL", + "qty": 20, + "price": 282.18 + }, + { + "id": "t_20251103_META_2", + "ts": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "META", + "qty": 10, + "price": 656.0 + }, + { + "id": "t_20251103_AMZN_3", + "ts": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "AMZN", + "qty": 15, + "price": 255.36 + }, + { + "id": "t_20251104_MSFT_0", + "ts": 1762243200000, + "trading_date": "2025-11-04", + "side": "LONG", + "ticker": "MSFT", + "qty": 25, + "price": 511.76 + }, + { + "id": "t_20251104_GOOGL_1", + "ts": 1762243200000, + "trading_date": "2025-11-04", + "side": "LONG", + "ticker": "GOOGL", + "qty": 15, + "price": 276.75 + }, + { + "id": "t_20251104_NVDA_2", + "ts": 1762243200000, + "trading_date": "2025-11-04", + "side": "LONG", + "ticker": "NVDA", + "qty": 20, + "price": 203.0 + }, + { + "id": "t_20251104_TSLA_3", + "ts": 1762243200000, + "trading_date": "2025-11-04", + "side": "SHORT", + "ticker": "TSLA", + "qty": 15, + "price": 454.46 + }, + { + "id": "t_20251105_MSFT_0", + "ts": 1762329600000, + "trading_date": "2025-11-05", + "side": "LONG", + "ticker": "MSFT", + "qty": 20, + "price": 513.3 + }, + { + "id": "t_20251105_GOOGL_1", + "ts": 1762329600000, + "trading_date": "2025-11-05", + "side": "LONG", + "ticker": "GOOGL", + "qty": 15, + "price": 278.87 + }, + { + "id": "t_20251105_META_2", + "ts": 1762329600000, + "trading_date": "2025-11-05", + "side": "LONG", + "ticker": "META", + "qty": 10, + "price": 632.31 + }, + { + "id": "t_20251106_AAPL_0", + "ts": 1762416000000, + "trading_date": "2025-11-06", + "side": "LONG", + "ticker": "AAPL", + "qty": 30, + "price": 267.89 + }, + { + "id": "t_20251107_AMZN_0", + "ts": 1762502400000, + "trading_date": "2025-11-07", + "side": "LONG", + "ticker": "AMZN", + "qty": 25, + "price": 242.9 + }, + { + "id": "t_20251107_TSLA_1", + "ts": 1762502400000, + "trading_date": "2025-11-07", + "side": "SHORT", + "ticker": "TSLA", + "qty": -5, + "price": 437.92 + } + ], + "daily_position_history": {}, + "last_update_date": "2025-11-07" +} \ No newline at end of file diff --git a/backtest/team_dashboard/holdings.json b/backtest/team_dashboard/holdings.json new file mode 100644 index 0000000..2f62369 --- /dev/null +++ b/backtest/team_dashboard/holdings.json @@ -0,0 +1,58 @@ +[ + { + "ticker": "MSFT", + "quantity": 60, + "currentPrice": 496.82, + "marketValue": 29809.2, + "weight": 0.3028 + }, + { + "ticker": "CASH", + "quantity": 1, + "currentPrice": 25395.1, + "marketValue": 25395.1, + "weight": 0.258 + }, + { + "ticker": "GOOGL", + "quantity": 50, + "currentPrice": 278.83, + "marketValue": 13941.5, + "weight": 0.1416 + }, + { + "ticker": "META", + "quantity": 20, + "currentPrice": 621.71, + "marketValue": 12434.2, + "weight": 0.1263 + }, + { + "ticker": "AMZN", + "quantity": 40, + "currentPrice": 244.41, + "marketValue": 9776.4, + "weight": 0.0993 + }, + { + "ticker": "AAPL", + "quantity": 30, + "currentPrice": 268.47, + "marketValue": 8054.1, + "weight": 0.0818 + }, + { + "ticker": "TSLA", + "quantity": -15, + "currentPrice": 429.52, + "marketValue": -6442.8, + "weight": 0.0655 + }, + { + "ticker": "NVDA", + "quantity": 20, + "currentPrice": 188.15, + "marketValue": 3763.0, + "weight": 0.0382 + } +] \ No newline at end of file diff --git a/backtest/team_dashboard/leaderboard.json b/backtest/team_dashboard/leaderboard.json new file mode 100644 index 0000000..cfa9c78 --- /dev/null +++ b/backtest/team_dashboard/leaderboard.json @@ -0,0 +1,1189 @@ +[ + { + "agentId": "portfolio_manager", + "name": "Portfolio Manager", + "role": "Portfolio Manager", + "avatar": "pm", + "rank": null, + "winRate": 0.6429, + "bull": { + "n": 12, + "win": 7, + "unknown": 0 + }, + "bear": { + "n": 2, + "win": 2, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-04", + "is_correct": null + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-04", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-04", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "GOOGL", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-06", + "is_correct": null + }, + { + "ticker": "MSFT", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "GOOGL", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "risk_manager", + "name": "Risk Manager", + "role": "Risk Manager", + "avatar": "risk", + "rank": null, + "winRate": null, + "bull": { + "n": 0, + "win": 0, + "unknown": 0 + }, + "bear": { + "n": 0, + "win": 0, + "unknown": 0 + }, + "logs": [], + "signals": [], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "sentiment_analyst", + "name": "Sentiment Analyst", + "role": "Sentiment Analyst", + "avatar": "sentiment", + "rank": 3, + "winRate": 0.4571, + "bull": { + "n": 33, + "win": 14, + "unknown": 0 + }, + "bear": { + "n": 2, + "win": 2, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "technical_analyst", + "name": "Technical Analyst", + "role": "Technical Analyst", + "avatar": "technical", + "rank": 4, + "winRate": 0.3226, + "bull": { + "n": 26, + "win": 8, + "unknown": 0 + }, + "bear": { + "n": 5, + "win": 2, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-07", + "is_correct": null + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "fundamentals_analyst", + "name": "Fundamentals Analyst", + "role": "Fundamentals Analyst", + "avatar": "fundamentals", + "rank": 2, + "winRate": 0.4706, + "bull": { + "n": 30, + "win": 13, + "unknown": 0 + }, + "bear": { + "n": 4, + "win": 3, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "AAPL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bull", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "META", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bull", + "date": "2025-11-07", + "is_correct": true + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + }, + { + "agentId": "valuation_analyst", + "name": "Valuation Analyst", + "role": "Valuation Analyst", + "avatar": "valuation", + "rank": 1, + "winRate": 0.6129, + "bull": { + "n": 0, + "win": 0, + "unknown": 0 + }, + "bear": { + "n": 31, + "win": 19, + "unknown": 0 + }, + "logs": [], + "signals": [ + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-03", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-03", + "is_correct": false + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-03", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-04", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bear", + "date": "2025-11-04", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-05", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-05", + "is_correct": false + }, + { + "ticker": "META", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AMZN", + "signal": "neutral", + "date": "2025-11-05", + "is_correct": null + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-06", + "is_correct": false + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "AMZN", + "signal": "bear", + "date": "2025-11-06", + "is_correct": true + }, + { + "ticker": "AAPL", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "MSFT", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "GOOGL", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "NVDA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "TSLA", + "signal": "bear", + "date": "2025-11-07", + "is_correct": true + }, + { + "ticker": "META", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + }, + { + "ticker": "AMZN", + "signal": "bear", + "date": "2025-11-07", + "is_correct": false + } + ], + "modelName": "deepseek-v3.2", + "modelProvider": "OPENAI" + } +] \ No newline at end of file diff --git a/backtest/team_dashboard/stats.json b/backtest/team_dashboard/stats.json new file mode 100644 index 0000000..45d446f --- /dev/null +++ b/backtest/team_dashboard/stats.json @@ -0,0 +1,18 @@ +{ + "totalAssetValue": 98434.93, + "totalReturn": -1.57, + "cashPosition": 25395.1, + "tickerWeights": {}, + "totalTrades": 14, + "winRate": 0.0, + "bullBear": { + "bull": { + "n": 0, + "win": 0 + }, + "bear": { + "n": 0, + "win": 0 + } + } +} \ No newline at end of file diff --git a/backtest/team_dashboard/summary.json b/backtest/team_dashboard/summary.json new file mode 100644 index 0000000..8fcb585 --- /dev/null +++ b/backtest/team_dashboard/summary.json @@ -0,0 +1,121 @@ +{ + "totalAssetValue": 98434.93, + "totalReturn": -1.57, + "cashPosition": 25395.1, + "tickerWeights": { + "MSFT": 0.3028, + "GOOGL": 0.1416, + "META": 0.1263, + "AMZN": 0.0993, + "NVDA": 0.0382, + "TSLA": -0.0655, + "AAPL": 0.0818 + }, + "totalTrades": 14, + "pnlPct": -1.57, + "balance": 98434.93, + "equity": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99785.98 + }, + { + "t": 1762243200000, + "v": 99590.68 + }, + { + "t": 1762329600000, + "v": 99298.78 + }, + { + "t": 1762416000000, + "v": 98425.78 + }, + { + "t": 1762502400000, + "v": 98434.93 + } + ], + "baseline": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99760.66 + }, + { + "t": 1762243200000, + "v": 97620.18 + }, + { + "t": 1762329600000, + "v": 98327.37 + }, + { + "t": 1762416000000, + "v": 96286.86 + }, + { + "t": 1762502400000, + "v": 95539.06 + } + ], + "baseline_vw": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99716.91 + }, + { + "t": 1762243200000, + "v": 97721.94 + }, + { + "t": 1762329600000, + "v": 98028.19 + }, + { + "t": 1762416000000, + "v": 96206.83 + }, + { + "t": 1762502400000, + "v": 95565.33 + } + ], + "momentum": [ + { + "t": 1762070400000, + "v": 100000.0 + }, + { + "t": 1762156800000, + "v": 99835.69 + }, + { + "t": 1762243200000, + "v": 99054.53 + }, + { + "t": 1762329600000, + "v": 99406.81 + }, + { + "t": 1762416000000, + "v": 98768.07 + }, + { + "t": 1762502400000, + "v": 97890.54 + } + ] +} \ No newline at end of file diff --git a/backtest/team_dashboard/trades.json b/backtest/team_dashboard/trades.json new file mode 100644 index 0000000..8a7b176 --- /dev/null +++ b/backtest/team_dashboard/trades.json @@ -0,0 +1,128 @@ +[ + { + "id": "t_20251107_AMZN_0", + "timestamp": 1762502400000, + "trading_date": "2025-11-07", + "side": "LONG", + "ticker": "AMZN", + "qty": 25, + "price": 242.9 + }, + { + "id": "t_20251107_TSLA_1", + "timestamp": 1762502400000, + "trading_date": "2025-11-07", + "side": "SHORT", + "ticker": "TSLA", + "qty": -5, + "price": 437.92 + }, + { + "id": "t_20251106_AAPL_0", + "timestamp": 1762416000000, + "trading_date": "2025-11-06", + "side": "LONG", + "ticker": "AAPL", + "qty": 30, + "price": 267.89 + }, + { + "id": "t_20251105_MSFT_0", + "timestamp": 1762329600000, + "trading_date": "2025-11-05", + "side": "LONG", + "ticker": "MSFT", + "qty": 20, + "price": 513.3 + }, + { + "id": "t_20251105_GOOGL_1", + "timestamp": 1762329600000, + "trading_date": "2025-11-05", + "side": "LONG", + "ticker": "GOOGL", + "qty": 15, + "price": 278.87 + }, + { + "id": "t_20251105_META_2", + "timestamp": 1762329600000, + "trading_date": "2025-11-05", + "side": "LONG", + "ticker": "META", + "qty": 10, + "price": 632.31 + }, + { + "id": "t_20251104_MSFT_0", + "timestamp": 1762243200000, + "trading_date": "2025-11-04", + "side": "LONG", + "ticker": "MSFT", + "qty": 25, + "price": 511.76 + }, + { + "id": "t_20251104_GOOGL_1", + "timestamp": 1762243200000, + "trading_date": "2025-11-04", + "side": "LONG", + "ticker": "GOOGL", + "qty": 15, + "price": 276.75 + }, + { + "id": "t_20251104_NVDA_2", + "timestamp": 1762243200000, + "trading_date": "2025-11-04", + "side": "LONG", + "ticker": "NVDA", + "qty": 20, + "price": 203.0 + }, + { + "id": "t_20251104_TSLA_3", + "timestamp": 1762243200000, + "trading_date": "2025-11-04", + "side": "SHORT", + "ticker": "TSLA", + "qty": 15, + "price": 454.46 + }, + { + "id": "t_20251103_MSFT_0", + "timestamp": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "MSFT", + "qty": 15, + "price": 519.8 + }, + { + "id": "t_20251103_GOOGL_1", + "timestamp": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "GOOGL", + "qty": 20, + "price": 282.18 + }, + { + "id": "t_20251103_META_2", + "timestamp": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "META", + "qty": 10, + "price": 656.0 + }, + { + "id": "t_20251103_AMZN_3", + "timestamp": 1762156800000, + "trading_date": "2025-11-03", + "side": "LONG", + "ticker": "AMZN", + "qty": 15, + "price": 255.36 + } +] \ No newline at end of file diff --git a/docs/assets/dashboard.jpg b/docs/assets/dashboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6709d534c4adf6e33697fc040b94e134908438e3 GIT binary patch literal 184735 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 VEZo=l)tDPWq_^?C8Fn9kiUc7@Mb(kW!7vA-@% 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

90t<;SvYQhY>k(h#p)$AMbc5W}fmchn(O#KWzWN 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

bCn0kIU!uy8Ui0pnmwm?Jx4j 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%0Dj6rsoVlW6kuzg;73 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

*{P@^bBx(LGEv#5mon8)eTv1 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

E)iG+(3J`ThM74P!#? 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

o; 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%0A+c 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

&~9d2NqT@isr{z$RPWA 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

~ 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/RlH%W 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

h8GuBAO^6H7{s|@gj@H#*M={`hehTz}D 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%0AU0! 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 Ogd{b-DWU=Z;Qs~92Yn9! literal 0 HcmV?d00001 diff --git a/docs/assets/evotraders_logo.jpg b/docs/assets/evotraders_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8658286f08de8bd2eef33eeeb5cfc229ea0f709 GIT binary patch literal 48711 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 literal 0 HcmV?d00001 diff --git a/docs/assets/evotraders_pipeline.jpg b/docs/assets/evotraders_pipeline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abca522eb93726dbee4bd5a45ff064512a3e8e5a GIT binary patch literal 183917 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≪wg~x1OG5S(p)^IKP12AvkDoi#@UjMw+LU#; z6MXY{_6ql%AbTNS{*W@g{LkQw)~G4UrvhlW0u-N%+IK+HK@xAr>e3L=F;_%5Fli|8 z#jmp=jj-NeK~=DUiw%%zRu1)Q4;7scw?uE?TxV_RULQn86B{>o)%OVp$$`n&o6#mq z5RjnmFUTdOnGSt~FUOs;-~uQfNU{YEM4n=9Z**Z75gXQxW*-GH^MO_h0w>@?Ql7E< zW0(#32R$LD5#z!yE%I9$G58X#S|p%64MmV&>PpPf%Q)YO?Y45*khQYPNnDY9q_2+t zUBcE0k)NRvyNDgqD)RkWuP1SxR^6zyEbvSrbkQ=J^jV|&DMD@kY_wk+M)0i{fc zWcGvTi6e}QgS$X#6DYvZvCn=^a8lj6bvCG4Dqt8bodcHVxgORF;xK?}yA3tFAPVWS z3jL?G(HO)|i&$Bw*)eu=mxiqtupy{88;~oO_kujfLu?F5ZYpzT#_4-*(#^8YcU-fk zGG)swasCsPK^KbR>wm^u7=zgr|KP)Y@-@~*3wb?+^7ZnPl?S%>8OUD>$fh~Lo?Mk@ zu31`R!@)w8#&ozgUy%6Q zTohgdBW+bt6{s?+N;UDpU7h2Kvx|idCS<64q

ScE@JPN5<*Ij?+atppB~e_x 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

TD#t8|pEO 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

(4XOBgoKQ8#?ypl1-zs)^hifeV5oA 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 z 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

6(S zxItD}?(E}MbgkN_^^ruC4(pY2v!c`!z%HlrgF}rox!4dTY%JB)M10$W$W!BnN-Q>4 zkYPCRCFAv95I4LYOp)0dH&l|nUkr$Mt5`VIhB+$s!#hoS-)p@aRH(8>q4F|ca+>P7 zpW-e?$r=seWLKrcmC`i{LTt?TeaOL%r-|Cd6{@NP-$8@!EE;`Tq4i^`&h30W25*E` z^Q(?O>$$L-eLMo=WsqGeFbz5@h3h3iswewWQ{QIBGVxU}tjJ+cVk^(>avhY1L{qry zacbmhWIP=92&-Cqtka8jO2gj<6kh+Y_SOG($wu<+j|oQ{L3nvRAfoTS!^ zJL!9BhSo3aKaq86Mz?Tk1Nl3))$(HG_A}D;1XCvQ&5UjVP(1=S@oQkQnJT+oe?cIY z)GKD7>4`PE2XA1TUthfs@sMHwc2E4q=_Q8^rJrAC3blkaGUg!q+=-rEqx%&F)OLX@ z>(rz@4pVKzBLSi9UQm=N%6Gxj9=d+fY7(zmyvPNnJ}Z(H*D#!wS8=DDgk#$UH!Ne_ zKZ_OM+1pH5`H7h6aoO=6e>p^CtY|c=wVT#M#+?w>U)3!#VEpauCq%H2@rIa%wwkv` zA`GJ^+Is3wX)U(Y&iyZqtv}7@^k1XW;&!c`##9vPk4duknpokz#4$awu}+H|4@a;g5X-eIgapK>=7gyCF72~eH=0$Z zB_8mD$8(hLV$WJWk zz+fDuJ=FGtMc@8NGx+_UY(OJbjq|6e=DEcdtyW0|o~?{$4;B?<(kgL2zpd;z8Rntw1%$I( z4T6V{N^10>_ZN>AjWrK{-sp`;L6`d9UF)S86e3h#$F(fazYRnn)=qA>! zIT9JW?(gye==%3;W)l3ORn}ZVmeY0py{e+T2G) z(>weGyzd<5%Qp-#kYj&b@YvM+PM|MCl8U;7SG+$|1%Sq5SX!8ptL7^c!ehY`HToRu zRidM6UtK8-o)Eg|Wy#p!)T9k!H?N)A|Bp zXWS^c8Hs2K#3Qa{5ANaDW?zRqo03lLm+od|a|2(baE$5BJ1vql&s_SkZOp9-{Yew7 zwUvEs9i?A7rmH{uXdV{NLzg33Z*w;TyP#ruin4I=+v;Z#PwU6U7*~KZET5a48Q+n~ z&K-`cx5I9j52&bk{`n|DkX<>pw7pa*QVAnA3ziq6-XRW54k}jb2=1(19ba23ias|d z<#F#+NG-5eDOay$ACA8I!1lc#(eIw7+VNRnVyq&DuFSd=7b=b!xTTr+r>|#&J~#psLf+}+9D`+-Uz}2pK+US z(v*_XjF1}V6`?!C9*8bY8h$C5wH0IG5o7ZsHQ0CYY7(hDV^{rnzQ_#w90lEfkN_9K zELQMA_>pM#$1edGPm8V9|91~ziSKfPAD;lAhrDMyCoO6-EI}~uKD}-7{%D` zydUVN8z&*tKrVIsMtz#Mf5>H+$zxtVF^^3>$xh3TuHR7#O@#mYQ0_`py6uJE&tMdj za-0>aW}W~kkz@%Dx%~i1=~VH9U=EJ|xUVgCSFBLA$Dem|=ND~tRFer1CGqf4h1$*O zqT{LL149mnnr}EDqTQ{!|71Sa-)v?#_R^jI7QAO)@R*WabKd13MAKDJKj(Nw$TP)6 z2X(*`+vdh&Q+*qtkHrapvzkezG0XNCj&4}a<^+6fK+E@_M-RE#DtrmAs-Hhbx*OKJ ztTDbTgV~Mt2g|aiSbmEH1RdR+W?=y;%EX(h)O4!7S%_d0+P=&}PSaX*`+0^Rd{lC? zljmNE-!f>un}0H^-`zxqJW6X|HmbxO@K_FJWn(7!T|Q*cGQ}3Nb1ebBq-W61M$K6-QQE^0s zy>5Yq^$qL9t{xFYbV3D=(jIV$YB;C3ii$2JwZmo&a4*EjEi({sA|j#aSOZBNTZBH6 z6~oOGArNaQplY)LF>%Q43t>;|{pN(xu(#9|nP$DD+$)EZ`!gczv}Mkj-s!mrY6n0V!ZWL?w}vO2J8?) z6RTPIlamS2;0R#fjL9_QYmAF+Oap9nEr3 z?9%ZclAahbqpWjdG6{<+QzSCs`YVeK5a5{elMvD$tU+>HgKD4&j z(qorv{B~vR$NkcZ<>mCYZv&<$!B$DH?682FdsTC>{>QPfuj2d|VT~qXVGzr5YNAev zUQjWu$=Y*AtzFc7U_=S_K~LN?%sp*}9GGbv3Wvg}Q~B@J+|)TVH32G%m1mou9*)=^ zHq9Fx@Eqeb_q_XDjwx?Vr`tMSxZ zI&r6}u*E~n+RJ0F6CM#ZKa!dM;iJ^LJHL=)KSn|Ov6eK23)m*W!(spRa5kj5rM)?O zX;}&WFh8{Wer3S)VM8O+0-VDfnV`}Ll-I%xhyZSOHZ8RwpsKfk(HX-N@@?bZwBE7q z0qLG<(|{(4Y+vB{5Es;w2#Pab0lWZyePMv8#*9aIXk!a-)c`f{bxSXh=?#{$czk}p zL|beyfr9iidBG5Z9m_NKn(-7$pmR2iXBT49KSFEyoP*E2(m0hr=;kQ8WG6802S-XB zF1Mw%%9G+giG#d4HL)E(a6|Dp#0i?8m!6KDY#LP4(gxSbN~z1CMl#27-_e80Zx>=K zN0&xmU*5w*ZdGIDbd&SW_DW|-uV?8NNBR9=Q%o~opjw__YK}Ry7BoQCUJ2Zn z0LGv`*yMls^aJNNLBV(5uq{e`Fm=Yg`H&%rLM0P<*hI=jV$Lbuj%dxO3OKBM{g1~x zQVP2hcaeeaM~W2=8lrynbootweCp9xS?bRb{VMh~=&|)iSU1+=-P3+GNR{Zf;6%>4 zrSd(XGovNcFPlZs(HL7oNlEL`GI4u;pJdNH;HG0D>P36Z{y|ZHjNG~7=g72s15Gfm z_-t;ITc+@wQRO5eLu-~3|7^6QWDCD@|E@-o%H(>hwMFfV<=^WIelWW4&=zfn`2P0{ z4Db{oowNiA5u&>i#k%UI4c1s7lSF)j9lmawOUO?_XM|`Z=ZFx`EOPQ7x-h%Y4<=69 zyF~E=@5i1xtF8-em5Ex*igH*PV%j^;b}1iDU>oSA24Sk&)<4U~y^P`~b5H}fPrX<( zv~Z#3;={eA+>~@QrlHJ`bGALGT9rp!{6WC-FWyePa!6T$fcoI_PyzoBz5)_+%(9MO zCKpVtUj-(53+uljGb746La)9{P|JMt7V5YU$b^SXs=Tam7m`T5c@46?W%6HZh*k(? zPjh7CHxd1i_`Zzuaq$>C=266o%(iRwOe)JYz1KoO)2+2AFx!GqC|imvJO{N#i!wWtXc zf_(*H!8Kp>B=>2lfzQM@BG_e$?E)P~1$XfTctZWv+|;XLt}b^A@e2az$e05g`3&YV zW1$~MB3>G3IRC(@P;TqN@((k%<+#|1UD!Nu2+k>?(Kg;coGr4GS%JTXSbnCE9}uEM zX6iY%Lc7Q8<~o^DuPsZp_BjS%H!@Eq6NESn@->nnUvIFxY84XihG`7wsUaovhGkDR z&n*?N95uzOV|NJ#P190ug$EMDzL}NJ=O=}T?~NKxLv_<32t}`PzZey&@K+_+EYVb~^sQp( zsKck}-*ZbfC`}ckT(7rY;@5*(WvmDVTt4%<2UhOSsMMg-BnIDJ5p#OQ60*f1^8^oA zhJ?1NqxmZpv65x5V%TFvGZ$SW?hyLHw^gC)j;-3*wf1SdPPxaChmGlR;#^TY{A;48 zA9As+Cg4+G6Lj_LeMoo(!jo#}Hy{va3|}Vf0WN)>w9NoO+uxuD`JUoWwjOsZie5(; z5cu$eTzmnEMO&R8U;rGsNwkTYAnmq&G((h~0KG#{)7G6Pr@p=acz{98oJqZ8q$e*Y zHHMsNWm$yQP!`PYyr*w|vtf8s6HPhj?;*x9;9(N!)|eFCWSCqz;lUZbSZdr%8SnVb zJkg@P-FXe}xojzx8lF&MKN66=syAezin_K4rTETn#!$W2(JY|?8`Ymm>$8;5NEv`0 zik@>Axz8GMPE?yz#850jHD0I~7lSv%V5%yOyF^0fn4KwBEiHR8btLCGp@j2eC5(pX z^Ljc`d$8nL{%5oAFr5ssAE9Zmbx2HG>8cmUK>g#b)yUk5g|{^d%;t&q;A*bd|Gbc# z>RLimEo$$L8(qujpz>1VVKpXIbLrQyRC;P9a@#$T`?t6~z~Wlkr*@_u&IQJ3Md{Z9 zHGt;{+kFZA-&;87#^R9JI26mK)WaSf%S66Q@cyf8FaBQiFpwtF7E!8BBsq7eD)^>-k#L&fMsP(;8Y^wVRE zl8{Fy@si8r8i3{wgwniz2^5pitzT2-I z3Tn+A^X#dG20G3Rdj%E^L~7bs$9oV4l>73a{mR;gSV!fQ_GYDcUm63VM#i9aR7d0_ zo~}%6M-3r&`-?j#$PCnf?iiUzA1g2Mn#uf5wQEvNhTo$G=1IY1ZzmNTGd76X#P3dD zE?@bUc@sRb5>{nYZ_D3Va%^NR)obUq$d$S@-->!U)kL zgAdOpTdr)jV#h2av+TTzsD}Fv@5?D89$Vc~ZVqq41oxs1YDa__*$*na)lmLo-Ptd~ zDE{2}AnODR8Ejl!BK!n{iOWkQxOcW#5P1waPQ>8&0yOFkt(pR43K-7{i$ABdbER>9 zv=z?ICmeeJPC1@0{oZxZg;7H)f`##rBAyD!0Zw4eS!ludD`sXwd(|OnNwhgCaz#3= z@phEl2wndvt_He#n5f#S%v|a7_Rj6XasQxczFq-P@ZlIy#Qd%d!ofx|;aCZ;R_#+4 znlb)7x+Eb@pm$bNCXkni)UMXUv*y*!KX2rFZt6Rm5qb$kbo}`!432W@oMT++Y`HRE zPupKRh$)lYuoN74KlTzf8YtqzzHsa&Ma2iP9*kaV5Nxjy)XG;|?OT5BGsr|P0XO>Q z6n!AKC3fCvTDuRk;HxRN9u=X7Nu;%$SFH<2t zi@|Yzd(r1J;pXCMN@;m{*`gB=4v^n_ewm1RzxL=r>!dS?|9PsXSl$;yM7Gc95j3O> zXO{(pNX_?JZmYb8EMk3Nd^9tUXI;=#*2V-y-LQ+gvu*9CXpxzvQy8`2SV)#!%!RZh z|JAz8%FkxK*A{2!pOJ6q#8y9NudVPeT>MP!Mg1=spTIs*k7@_~GQe}i?*ZVh0FUI( zG@=j$jG}uHd-QzR$0rB5VQ`9ytpDAOR!JRlK5PXw_W z!EqlH;L}{1#!{l}+mW?8H;|Pz_nIb=6F#H#fm@Tlb3U3%GfQm_0U46U>4;{QBa8-e zxx>YOvZ}>3KBeWnf`aqB^P40BQD;^@Q~~a=**+@oQ$hS*^t6y&u@Xr6*&5>??O^6% zKCB~ILu9f!4Sf~F!6PIjH;+300+5(zL4B?nY>#}2(&%ZnPM&k9B*#(-4KB25NQ$aD zu+;qWfLS|Zt4wq$xIZMFJE`BZtM*i@QZ9yY+xMfe8Ic7aXsbk339+9ua@0u;$3Stj57FKKrX4rDQ%MHe`(|w#!1ii%|D( z91kS>g#ue}SzUI0>$bJ^hfnbi$U|$i4A04U?97#m0#7vW!IO}?9X;;fEVytsA(?#4 z=0kFCg>}V15UMm4)7eMWCTg*Cb|Z%=)?Z;`NMt)ZcQ!jC1B2I7OFs2$3Z5a?!2pf{ zP0rw|+G}K{TL0{{HMGUdJ)<`FA=wic!#7Ly_$u*zh#8WON_(EN#qY5Q7I|G+Ay*fm z+tl5T2;7Mh?|cQVfMQ{?ospAIa~r=r79PMtl0c&i+X$!)MIJ8QPTrGn<%BYl#^8_xQTi2HrwlKrSr86xgsO8fX zqE{tcPFZ=*>wrU8L%|R+Y45fA(B!$ipqKakoc@nomwR2co^%qXi>+u&Br+2=skrTH zX@+F5Zl_a5b8n5P`%_p2%`s=Re0jwxQaS6i`)FkGa4H60LNHT1_iVQHd`BgqU}Jsd zyQQu*Xz_%|wG`u9w3V(F{)&B#_5??k72x!F1c_N&`1hBjGLO2qr83Sm6;*xFl=4;aF`Kj#3P#bCHtRFhzx~RvR$7 zpe2@N)w`3YrF17(T35rj+rw1I0Rr=`f<3#KaOq+_J8`NkldLi?8(%2q+jrvHXWW#L zX;0~9YErSB`_XW<^#^b3m{v6na!d<Yy5go7KHCUpRoS{=_>QsN2q! z8$cghg9n8l&+PN2iM>CJ*Na~KiNV&u^ewWPtj02}9le&u>9<&L4s_?_8S<}bn;A|E z`Gd{XP>ynn{(Y@^46%-|#)IsY(Y%D%chVvn!?c>{)o;d)-v|Arlrm#P7h;6QKACV( zns;J$Z$>-z5rHMq>7DB5j%IF^Kgqs|lJsO`mkpoUi;@)c#Jmz%L*=}F%NRIG4I6HB6h5~RHh zi_VUi_SsXD$VU$EXXZu^_coeQ)}H;7>WDtPyTKgQEWY`66G@FY2fGu0^hEAyX#54S za>%r*z#5$w#vMoRPsKt98N?V3FxS25GNZx29F)V^a`@|Q@cAW6GHScpvw;q*uiaM6 zF^!iDhC~muYEA5K*`yLkijVfLEo>%gRZWqxul&I5U^j101^K6aN3s$KLaz$5YJ1uA zCRPeV0X>&NO@D;h*ibQ7h7p&6Sm&v`o>c2lzrUI3Q4lfq_8sHyM{GUqO-Y9plSkJS z57pLxBB#N>krTp}U~M7+@%m5X4D0zK+PF|FzWF)MRw*-9Mkg;^Iyoz$lTM;G#$PvO z)bYgUn+|D$8$%53lJISa{Ef`WsPu@~3@aU{o-q$Fq$?t7MSmz}`M6(`jK?Sot5625 z!Lj#hzL;Ft4{_;x8y~8+3(U{jGz>ulpW_!v$kv}5^Q2WwtAuD=JODp~TL*kd5yU~^ z8(x_PqL#F=^bDJ;PH8GeuZ=5Xy=;tZyZFU*Ue?s?m4sHm+5 zBXp4A2G!c*tNAC5{^s&s+!^FfoMnaA!WQIy4xa8CFF$?hcA1PiB#m}GtE@6Cs0#G* z>!yCjJQ#QC1Z(VA!9T>fNb4;;KC<5V-IDYgt1Q!A{R_r;z@>z6;DsgejB%IOgr@=R;DPAXJ~4 zR@@IfPTH>|IiKjf9qM~K)X2<~;9!nYD|SVOy?OO-cykVm0~IN*6E;nF(L5siL2u|i z(_V=0Z23Ek=q4UOFZcjpk=O<9AG~6!hlF&KN?stBHddu?Ah|FCpG^8o#xUl6T^bDj zuHX+6{NH15WY*h3r*h%7g+z`|@GXN-Jvw8=`J09=XwAHyKe3(w4ZY9{e`Q~a!&;~%-RgS4&rK5|l@Z+6}q(EZp6h*;dtUY*b+VMbTpZtgGk|dTrx-9 zBLMh1Iah+NAav$4TfA=j-4>^H0Nu_WK-@K^GaHPj+GLOu#&~+ypi7Zr6SU4XcspcE zbd#nE2DOuR^@V*z6imGo1av(&-7$D*fQ!uLR8KAX)}@UGy>IB^^Q_pyA`J9|Ijkip zp)V2-!0G7zq!$P2j2F~{K8pbGh*JRQPAMDtX^$Hqvlp*mbbH8t5MZne@A`nesJ8z& z2or>i7H5DgqdsjZ+O+E*$Ynla9rlq}08K=Jw39@aiP6u+)=6|OdBxfu&I;7@fN02j zEaZo_lz={m0Pf$U*?`31^fJght6c#75=0bsFHgxEkp}SEAs!3dn?$d|7laH5+CWmo zzHdab@VXsmwZa6I{_!akTCcdw8wZqQ+nA0)&H#sb80~Rqq7Z#b$Q_i9UcY~cTHFMY z5N!(NJNOg<>)w$T8Z`-sj~<+WqyT;Mi4S1}ig)yiq}nyJ0U`SqIJFPK)1G5`3?M1W z9NG3UYXbCH)U`~J{_)E;1Nu{=o2k8#yT0q>0U)u*ic~ujE%?p`IzRB!b2j~Se`9e-O^bxTwV{teFPs1`AxFWm5lSN~i_g=6^ioo7G zi&ov|0f;#aWC>a@eKfTxHQ_2T6Wi6({%(fS3qWfE{la)(*=Bgqp8LdCcrUquj{^#d zY{SbYB=$|lD_jPhNHSMS;bRo3dc;)mckz?k$pLl0d%(?FgPf~Xm>1E&XJK$6fS>`0 z`)zob`saB)-dQv5Mbxjt{TK@YS`H22A%Qr->eE7f(X|QcL;O=6;OT-ciG2vfNvL)n z5j?L4dX1zEy$B7$xWb&{2uBDXBbZzP^hmxf#Qw$12hcisY_~0p6`;3xf$)3?AhrMr z?z2eYk`nh1{CzP+04MVVK-IY3eg8@^->Ef=XNGVc4HygFKGi0XD-G9>B2k1b&`;)7 zx=vCA(gsb^kS3ET?TXJ3***r6>w&LD0J@2pI;00H7ZwKkSL>CixR>Z9Ubn;Z+DP3~ z!U^ZFc%LT*|MrpIcl{nNKkhB8Ur5?62G~Bq1XmB)%oFW*VdO+TckSvoG}~yEKq$QI zCjeV8YQ(LOtVby*Ts3x02|!axa^HkQUjiVVHbA<7T=gy4DM83kgw?&Ab<(U!Ji1MT zLZG3zkZtxWeh})DZGj>^!Z{8Kx|^jP224X_GJ=@M!zlXgI?{Z=k$C(B;s%0>yrjwV zii}~Am-zA2El~hj$wT)NA9IQiBJcq;7ntJjFs>8bBoK8_O1068WaA6;6e$8-nTk(K zR_|O2boMHQ3GPnPU_keUGeKgCMS`NBLJtrrT)u~t?DEbe4M`#JoZHm^`_=^&QhkTv zW0vX_?@Uy_?gc1B_0IuRl++=J$AF)}huQ!zF5u?}Y4}G)f(dHjCv3L&44>eimMSF! zd>1b%kO1Zq#4k2MEp7k?zBm3JV2-@v_+i>BP?8esUSPwN{kUTRz@!L)yy9~qC{MAT zyhm3N&rkJyIPtn5vMr6=(A84*1%Kv%h#4=Jct#r{_Y!DT(JrA)v{+&49C!Y?2n^ig z|9rj(&ia!ReqGYv5p%yP14&t8$VwH;az*@+xO0{%g<-K+hB>e4ixafX+tvpWxI_+h zs@Qj1j!uyh($k(Ai~wdzQ96G?Ltxp7o2r`kMwdD-qw+KYoZ3+D-bW9f83%!dJMYBS zu@CI;?N4j3lSQlx`lMxzlg}Te;WHMcM@C4KJiA#$H$`<)pyJu^nk&=}7lCRzjHG$+qJpaEGKrOZ^ZHj#4SI;q?b z-BijJRZncoE*T~{ATJB_qden%K<6w0<4aEaO5q~@B%h=~^i{isV{lbaEie#aLU6rd zy*=qpZzMu==f#6i#%xXA7y)~hy?w9FnGB|(6$sVs=mhSP!2h&VIow&cZ(#s zfM=vXq32Reka9i-mvBlj%}Nlmah5}huE(jk?=Og9O_l_V_17Ez{*U&$ri{u~^&i$P zqvP50b(xRhiaM$kB%<>7{)s-+I8d4lGF`fqVaV@FJ&wEUE@)I60=vqtKKrhh1}WN< z@i5au`xDC?p>^~HV>yhF*m(B+hB}j{?ZGSD&YE%8gXX>RRy_=_sOFp;>uZHm%>w-_ zj}PaX9WAc!2Me(`KqlTGCwICs6tNN~4*(f%8y~=fdOR=%z-&K3 z#0#XLb=H9G`=tspeU`>L1Tle{)Kt1U)Z&e`FUZFPeRvav z`!T0AQk1ici7E12`C5@ecn@!FsB=)ih5T-^hqH{ejMcneQq7j_xy%~tiJQOU7PX`1 zGW9Ys`!gP%Ob}DKz5Yx!50z4F!kd1xQmUGniO!25;e^5(5zS+9Uuw;~{6J6pHfQJA z(xrm}Bbe{a`g98p5DUOO+2J)hWr1@BJVGwY{(6o!MvEo_jcV9purtv)n=Ly0`BE<4 z5plx#t>r6x<;aG|I$IhIrE^sF8Wd*eYhNZDs-ppe+cS~NlgT+=J;p{m^sou*`8I)W zYYY0{aP1ZAsz&e+VkF%-M9{K4q9So?GAwIgp2==k4ABB_kDS#R&vKN2f&(__^?^}G}n~`6b4nI zS`aF zc@YfdZ#q-PwBH9WRhPo4%Z$5ANWdg1HVK=hLtwFv!Y`Prwn^4)i1M`4V6JB?U^l94RFRnqY;roR!l$Skc|E}Y~qRD1D4pGYRk4f`sFc$GSLmVMH zsl6;GWS8%Z9Iy--2z(VbCvT9@zZ**>W+o!0bMqXJS%~}Bg$}2`eaY-d{mD>k&Q~OA zR7dE3u&G1bC&7}f!&|1;3KB|bByB&228Ee7=dJ(1(AKWH+T2*2@dvJsN32x_0S8pU z8cR=Z_4^sjlfrD5>i;~+H4Bz}ls=HmO5yuXt$IMM-<{PlW};PHMra&WuC2EH)$m~{ z;hSjF4mCq9YXMnWeX_~keRaL(YQ<^}r`Wiw;HO3z)ZDVaz|oukk3rI?>ijo%TM{#y zy~ksv%}A|0?fZNWB@4it%FqZ(nIaX7zP+X#7c-WYuJnmOqa&iW={Y((xy%9M1`H-)me$)xDs*$W#9^IRKqnKcvmMOI5Y>xh!It zU1D9khp0&9{WdfxE=}XSxMN&7gPHOcbNMVq&V`eoPKP0&4%N{E zJmcBtj|4GBW-`)OZz6;UO)Nj{?Rme%tHZe;@PgLr3fcVA2t2cT(5*Q?Gbd-Bun#j0Sswv1RY7yED*`m{z>KfzeOhf5 zbU$r&0Nk2+k$HPWw?E6lGP~Jw5UP6U`{24P+h@-gozaEHKDoFnyJ2`$;-R zlZ`)HPtyD>#Rw3pUkX{=@IYc)8XqzChzqh_l@*#ieF(QSOW-&YFK^-J%{J*vIrUhx zOo$;E*wZhVCWoxIbNu6xKGMcK6xeCG^>I9IgM{rtMYlcQqd*+D4lrltK6Z%xV~pUD zecFQHnfQ0vmLYWxQAG|ca&eD_lcL?PuoH{{&;%;AV3rsCEuCY-VD9+JVX@e2HvT|^ zM?3to*XJ33SR`?Ud<7$!uhX)>jG^mN;Y2XB;jdiSU8-4MX!g`r+@L};*F?2hEOCpD zvO0I=#2~c&%&09QvWhk^Jx-0cXaPKfgIpNmo`^U!8$nGy5$ys_Yqp}#8~Sh}(X2(f zEqbjsWk%c^#14{o7Otd)OkLx!e@tWm(o`+XO4NqqXa6!bBEIaQR1}~8>PfZKg@S|v zf@PfPA1*&y2z?>T(B}NttJuE!>kq~~e&0xR-Zd+vj^e7+tCSph)J;1RQH?8Vrz5&GckTnpF0m+=9D!`}q5rMqpGz`^0);Hh{CQc6*z4`8PWgX{yk zMtGj;S$MX`Tw-)C&?Mn6h^!g*kvsc`+J^HKIEVem zT`4R>B@iqBCIk%7=gs>(kSo)>Jmf|5NvIFXbi2S1N+XQ}TQX)gWWx5;pJFkYFpB^~ zyHn=Pbq>j+PToii4R3{nc|+wwo9Hyu$_SmH+Q3DN^I{p?N}`Z1J0g!fpU`<4BfKyX z>|Qum@o7ZZLGg@TW|V@tJJ{;0g#_(u$3|D*Pf3CI@A)>(enDn|&Bf!F+wz0qSqV26 zB>NIv4i`ezLv?&9g0U}3*7jdaQ=NUdvjZ;e(x=-3vw9T?E_m>wS3{&{DKS{gCl_|$ z@P=JMOl+P@0zka)tmvd39rCEuRw)T`=dz4<70Ph~>Q<-zk`;0(F#fp8wA|JeGi08llDJIcqYivZ-3mw$UdE&{kEUc2 zExM=O{p=kRpf{~Xvpb|UXYruz;JL*HHq!oY=D;9IdHGRt@xbfU(TQ64rI~ow$=%+b z2|MHAb>QrlMy)f)jcw+2N?=`x;VTq@jXOIZn0?ijI10&6)J;J8UYWBBQ5e}834fE+ zOVbVakKpAJ9C=W*0W--+P*Lf?)@ou40$EvV6;Z?anWo43aVtOH-0$LayC$H$#SWh2B}s5R#kZ@=$$Oii*6qb4 z0<&y^LH)dP$JPX0U+Uc@_pz*bArWkG&+b~HZR*uF)J!XEC8qrl^UW0V$;pJhX7Ogj zD-@Xb%u>EPIh@mHY8>@EC(DJ?b>Y~N(PhAMHpp^cg4Xab-f07LWTlpQI5(|Mn_CWj zGBK!I%4z0SuJft+yn<^LJMc1oa>xA0OWVzPMQ_;PI*ljtnm2M|$U|Ab(B2%y<`PR$ zDY-1NGpNBkfnCDN*nE-7;m`fTIG{jf%U~L@cZZ)g25oV0uE4TtNfW zePOpjlCbZ3e)H&^Fpl{_X{%K4AJK}w?6dZoP#elB_Z1;;P6EYXn)ACPDw`1w^ldZ_9gGuuok%iF*_O=vb($?eNOL9d}3vNWcNDzhwm+U?Y%USR=WW=QH3_1Nq?SV=00 z?9N2w*9SV^Yt(2KgjY+GN72rF14PBNSC>?kTZx{=)U(m{8HpK5n~=@A8c_%7s8-Au zX)8#+{DwlpGer%DuVJMPXkQ?aQhie+3uMU}m0JaIpKCr&({B z3>p7^&HFM+evf%bSKWcm= zani5((m;N#WRpz0zx$EThnR1zgXjte+3tsfl(!aDMQSd{<+BcKVEp87I@bEDrC(mu zTkF-S6~n&glQO)R0vUG1p!OO}yUM8J{fYP=hGH1j|G3ONK`*~@o_74Pln5^cryDGw z9Ywt!w{JZf3e#ThIoH3N$>5twypz3QGE{2k_M}q3`& ze2#D0A#9eg>5#>LUt9e5>kX2>Ao7=gLB~K?obA7r^!`=&7X&kVj9i*8xs!u~p8%@;@*9 zbLQ9@R4ae#Z^=md3R2+5>i5q-aDmS?`OI;as=mriwwc&ft6Hs0UGc#9%2QX&I(9vF zXRyoa(@uEb>7p2y5nSER$|hbat?eI0dHkbcX5+ZoqvOJHjq6v0`IZ9SK*kdsziRl| zq;(0~C;s)XOxE%yEBv|Be!zgf%Ky>Xc||p~b$@#&5K55VqzX}KQbd{pV&G7ug_cmH zcLBxFq>733CZZw)1R^zr7V!W973oq!6%afDi9kT)L|=H=}eS@0Q@-i(HPwKSQGZ9gj;sEXgtcO-vW5Fz=RQpb(Sx zMAW-4ZGjJ~Q3IhglVbA*AARXl715a1OF|k8ZeM5yzRUIboio z%$5uPoNKwqH}JJnc2CYW{o~oZb2`io5>w z^lsG5#(nJ*P8!IfaQ-+8s^P# z;dzphTkoj-p>NioW}bCUXSMPD6_sk&?99yjV-H8}V)B;I%g$`;^%H9PrI#))XexNB zLB2Vj(0*AN+2&HH-_#hNm-bpd!VX?TruOrpcWTUjS(X+*%`*)cRUC+6Cv+IPTJ0z3 z>=fP!Y}Fu>yU9@r={`<|f{f~QtI(QDxbv@Q`!fwygLzkR-!uQm$DPB7Vxll}$Wh7~ zJt1ATdVGR5JYhq#G|rLqD_@WP+XVzklFni0| zJkvQ$QahWB4f+#A^Ae>&T&V_( zUO}@>{*kn__E+^E%6`p%-vKMCFQ!sn5q*i9Dl0P3P>DG6p`pCUuc2f)U`)4W@2{M` zxr2dy>B?b86^Cw!TILMLd8-?!ka{Z*x8mkZ^8AuJEqgrDnY>kGFe%@c%Vw2vnXd@H zLwl^BDvG~2lA!%cyEvVk-I$pFzf|JUmG` zE~2%gd0t0wQSAj=4L#)HN{tkZvG~;@gsg3Jrmy1hkv3gVa}{L{BD75NFzM#j=bkZH zWi$Vfr5a{lW?u9o^u7v74?WB-IG0tYES_fVHh(6zp-^p%*M;D4qkYUk%AJ3wh0RyL z(W?1m@2uoy%dL)*N40$^g6dDu7CIzSPS@GyFTV1)T;*gy`8N%UgBv*!TRD z`@DIwy8L~!hF8Q4911FIYkLc$%`2A#M~7-=eku>3cHA>`BxkSD{;>B)VXij23=ndx z?roSxZf$sWzvycA@$t%tA>VYG{>nM_E_gkNsl59Ye+hmf==IDuLyMOMn>n{%77n+& z2aswH-u;!{Uu=a>S@*MKsEDekC<^{Lz2a2;Y)o^qt+TMv6a;yLq9m9cIs3zDm&B(# zq}!jqxpDQvL{`9LpC!raKj1&$toUM-4?`tJN(B2P4YlK@g{)^R2>lUdUL~ABX7xz&Ly2)xEn#~w z*{i@V&69BN!Rc8yr6Jm2>XR2TqQZo0Pn$-Z7ZnRsioG&C%4=uOp+jS=k_!d>-Z6t} z)`aC_`$}WAfg%|IpW3J~vt-~Ix`6ZOfd=89$MSpn- z<7C$r*7~zfqu}+$srpkhFL39Tt+Ftw9~#{XZT?lEIC*U@3}^V3rYq&Pyb-vNkGgqh z$LPe?L#w|It%*zG{jTjB>s^Wsi2**^eEh2UQkqwU!`i&_f)%TY??}7L{O3Yu#zR%X z4vBxdQQ0&z&y4-n%3If|>TQ7IPAt$-qH`9{C4hn>Kp$UAT_}DY{Q1-wBZHk+C(HE) zyLDQkJMFl!f_8LsfeTh0P{buA7TCj8Zma_*FQ^F z%9w+xg5v)HA2t4D8<8C&v{schQh&AVB;AfHSL_1=haVnvJ3s%hMwk3k^&gP*%xT{` zoz(CJv-|s)L=ze;eH}kIxPV3>B3|YR%`TsF#6EsCXH*6idP{1RE_6IC_q-)V2;r@8 ziJUWP{Jr%??iM9ZrxpOnoqBpzu+1bPe*QkgYJjNOKCaz|_B z+7rDK?_qIamvtmV6Elj~z&3hWZ(PlIuSz(5HcXLlKy(VO#l=l<&z`#37phE+P z6|}NjTkoF@3$w8Jj%Z!-+M4cvfCzRO)=$6P6X%{4+4{GUz=-eWb0tRyQ6I-8XIGZX z;n*V$MyKZ&wdS?1sq; zF-P@lDFTcVb+tPEvg{Bc(XPa&_uWE12U%o{x9)a|YLsk{WE^`V57n(_%1h-p!KZkX z|A`6v+GICt$5Wr)xdpvkVZFro9%g?xU+g-2;BpGwSe@ddXoy`DH73q0p-a4k8tinF z9Yt0zg)}88sKj-WTUnT+#pR9Aoo=4~Vua<4t5J$AarCl-H{8VGf#6o@%R*s7LeuOg z@~_j3A9AF(^)3{3aWYy#W?V8fJV!%P)od?{K8W$!;*hzoYXvpy<~%JnMRued0zCtfaXne`9J0mPWo`Nip_ zxp9k_{)dl~C8ldBO-5cP#&5~Kbw1oqOmgnWb30FlC7DeYj>XIgIv#$lT2?QAz_=p2 zxuDWwnU&>h6qHb)_*dqSe&<7v=cg_EGP8uiU*YX?cFpee%eaQLxYN=TW0U^Uie}9d z)*TO};}=gxc;)@kxKK0KwbpqG!vj7A@}Lp3*ddW;4xxf>jDeB|wZ=u+KLTEnf9Qxh zof-WpCnHI6yd&wo*>_0U*vubfRmL^t@8ryRVs<(knI8vQ2S*&~PdslDGFD$1Yq~P@ zs%9VO{^m>Mwl+?BjgmoyY7ElqHJhA`%Ut34epNEjX6TU#%=hrRyFnMv_J?%+9s2h? zv|n>eb8bw`(8@;q+}wMni)TB=y=gAW{b}PHK5TUJDMJ4Y6_uiaBqR*v+osvv8@b-% zo-mP`w~iUnLU&uPahk>5wJocOn1nc!+PZle!_x|-iaKXg8ZZJKga9{rVp&4GMwv6oN$2{Ny^*&M&)ylN#ezK_EGw=MyE_(FR-# zm_gScPWufeY;9boVIo^f@QroYNlwaLj_0h?j5SLYU73byKg&rBWgAoM<@|i7go(I( z?YZP;PE8@^P9Xhrnbo7T^C)=rAXx)`F(pIZyeP_VD)`gYPgnCc!ozR=i7A>7E9q*^ zDM<)cPTAQ`gB&K9jCe^Bk)iW!fcFiXuECXpMW+k-CKu2k@Det$9_;wsE% zi8%@0tkN_|53w%rWoPa`dUIa&fovCxau+iNsx(`|{4`}Vf9!&}3`dolule86br2sH zV3ODMHf{Ex8$^ZmEjDYM4qGGL^!L=CYx72kBd2e%x#gTae}oy4yLIF1qwl-ZHUEfS z`3aJ%n=hzrv@dFR$|_jf;|v6 zF}pLIqZN-U#N!0xyHBkidd!dhI`SUg)+_5xx5z*G5!$xqB$XF#aN+F^f5UR^*9!Dj zY`xHd&Z+9}RwzP`VbWGEo!gw|czUeYby~3ej7ytCrMSc8gTAZ!2eUL~Ca$xqlhfuzvCHd1tLN!Nk zQRA3Zq`vcM3?1ZyW#^(|zeSBV8A%H}SI%C%)N{>TpVSZ+$k*YVks}2)=#(Fio6J&# zhdt8O99_G8`z6M+u)xm52m6I{l(Bhu+nsyL$M-0+{7izsGS>Z^;L-oOc@6X3y`*+z z%}rL;=QxlrG{dIvZ)N>6tDUtWJIW7y$A)gZbqnbgjy()5m6Nd?jHIhqM^vO=@!w8B z%rfgvaSDyu`?ss+TB&sW%OdQ|`Bt6|ufG%HDOsCB==-H#%23cDTNzgkRNx22Mq3R} zexBrbu>R9qt!Vb%+P52Ptp?y*N$Uj9^thWT6pu^Aan?Kzq^8o)cK;Pe0fuT&3%&DN zQDn47{=-vT)I<)GAQL|JzNs~Z%2w5Z7uQ=q!_O@yTU>hjB(hGckz8cmQY<6z_8W1f zzQqy*IZw`jy7Lg#E1KsNZE~|F-(_oSbp7pYVJGXwlu+Y5G@DTA~nK0s$q+!!w-snVG0zW3n7WiqR zx2`WBwlC}&NQ0W*y3i&$)FzdP&=EHMOF9^G=*dU?`~$nklcYAW;hJNCYmfOFjdDkP zjJC$lb!!i=*aQ!GTMQeTJtd;X(aHrfS^mbQ{t~BtE=#R;U)^YfiiM>@sk8itQ>CFNQ{eQUwO@GVk%V6*udZTBM;4&g9U0 zd>y1~$0qk8-`n7}WTGJ0?3B;JnIXSSYZzU+(xrV5HfjitiDv^VZM%FgEzd<(#m@;I zA-20s_w!J~pRQPhriKe6EA6aSK2$fz57qX34={||c74^{e*IT7iJV=}%((e2mJfUX zvgNHO)X+k2x3ELL@<#!|e|3}Q&|L^t*24;PI=nx+>qIC_kKZw1)8PZttPWX_J`$G~ z={CH1bs1x38&1H_qKsCXg)tZVdp|H`S{R*OYlfER#2OqQ6VmrH&di}Oc@ho7U?#-K zSTriVcqlF`BWm`RW#_T#YazcX8`5xhdh2u7b-elu`+p>MBZ6N1UosO92R{r8J7#*W>b1m`&!yKAE`bYx5GbZ5_s(YuY%DU24 zQQv6V>Ct=C?Y8B%JyTD6zUMne?wmf8mYoS++<7*2(_zw=3bW4fT?-_Se14oe=b{td zeFkN2ia~cRHe;qy%#&+H{5yrZb*G)`d_$#ctV}q2tC=hBd|I_%iI~~(Nlm{Rzxi}+ z-OO}6iIxdZ9p_<5;k9TDa;(}S_aOhTy)uqYw&esZbyR3>uPRKzSMW~Cd3Bt?|IZfzfIt-mghI!t zQ)dq#^rAhfmI4sTLj-jeA*G_l;edv5@d6-sz<*vzVci<9<1q^B5!9Okg@|cA*G-iG zqk>{kw+Lv-uGsX*JMFM5V%2)}HtoR!s@$)4aN$}~`B)x26G)T6oj4Hl9Kvf*`PSYP zFD2zrczcC)XkEZRM5;X`0W{-5IH~b?V?7lQZZgwe9mwiV1ErGcY$o#m%kJ#q0poj$ z51>I1cm+=003Qx|C~~tMWM>zqmNYX&?+6e5|5L&@Bwk%q6nfji>*_GsppLV=|WR*`-jurR2KpB z^E4@dF-z9R-gdMI8ru1o2Zy-z3<((U;HEPF7qoaD3I@akUG5>^OzKv+P%G~DZcP#O zAUYDuKLL7>p6rS^8w~RTx7fdO(Elz`@iw4~|q59NT9JoY*iZfn%}LprTg*lUOJnG(tkC+@y(v1&&os z>H$Cn89|2ykk1XIUl;m`V_6^Ny&nc)PeCn@F(PjlPa0@nrriJpz~>YZ;mDevlIB3@ z3RmeS=yL2^(ME^>r>@d~b|fH?k5%vys6T`XQ^i(F_mx0!&^)%gM^7T}Efv-So=D#B z;keF$1MGUZL7jJ}L6OZ5i0?K+Y{iykugX5o@tcznwF%Kk#woV;0uEww*1D$jzP$IyhsX&t()K^ax*Fl z^q@6ETOeB;MP-Nn%)knhz*Z2aRUpNBEz6F@ePnQ;HdRMTP#=HQ9#ERt0@!~6C6I7~ zN1f4=K4P+c^5LNF587h`9`VK(8R3KuHlc~C0-RWF0IIa$286=Waoi;$04>1qR~A)N zUC$n@Oj(bdINbnOh6Ed;JKz{-hueGwN#boNAj=>vWX-}&a1irYdq8o8eTpZ7UN%;n z2vB|q@?aGXl*FJxDak3c&V8Wh4N`c~2WNmM0)pm!!)*4dAhSM2A)fNlnzeT)6$GqXLgbQH(nX8tv0jOcE<^d&>M3Vussf^#Sa)VaVFO;1XIGqP@lodsi~LTalbd4bA)EK%4CSN>@u z8D~061gJ9UIL;YZ&xsy;`Kuy4NqxK=i8#tXnq72|?``j3GuvddF3^7rBHj^9AfDG8 z2hI*6m1uxCJ4mfdM;jnIBj+Dzit~ZO9!oj2(cXxc{KBQ*2%nF3mse6E7dKD53!~$cq0iJu{GL|NoB|x3imk8O%W7*D&a5=)DAJ3;4m#?Vm z(!x6cy-jeuU^)SqSwq!;n7v0lXq9&$0>C?axE28G<)QEnt@;5h^e>>ShZqZJ&xRWl zMO?#0pkY(ObdRr7TqTbIaW={naEzovis9_aQ2ec8W8x%MOe#pv9VfLfHopSSK!ijp zIzFPo)eU?2AlJA?$20DIzpkT;Q=eq9$4L}rU1fGe#ZBpRLyy3j@K0hWLQ8F0<) z+UMST%tMv($n3yC^9?G-_q@`~y71<)lgLaFh+&_4s5@YraAI#)9?eOGG~tA43bEW} zQ*e&d?%U9#6Tee!W)Vv_VD{F`*HHCP7}cR3=#J$w^_b&Mn&tlzK`-}@v6EBk1f}nI zEq6#_9>;*q95P%>$sV|YRL9$AcDykm12TQ=b4VURaWA}4BtDictUzpw=&%uW)EzcO z>abUuINB71;uMR`#;tw0Ta3$-O;vCQfDQ#3pE|+N>VhDriY9uzwd-au@k%%QU+>muwZ#+R%Yzrpw@iJ7-o_&w2v;GD|XH#o( zIL%&mg`*v?J5Qi1#DeByp`!&J(48%)WuFs65jEB*+2`sci80Kpp+|Ii!6@|EJ^L$7 zZzJRL<_vL_YhW?h$8W$`+ERjA7zma23<-G-biqsz%fI0yAeKuQ1E`vMCa@ok!sxtU z*dZBjQ8vjuYB8x?LRJ}U5KZAgxv#j68cyLgNBofh88n~H_i!_X4N@mIVQePe29Tum zFk~tUR(!CSDM9n8>AxCLsPp$Ilog`cA8yv4@AHgc!MM~;a(4=_$h=E z^&}oE0lISHNRp}h$7dLTj{yxO!ZLGOkQJAZFY#@|IWhK1d!4^N>TIIjNg}~X`&@XW zFb%=1p@4VC-fO{t+_u(7Vu_0dG{@?NG=O6Ox+%()len)!gwW+|(ZF-T zm`&jgC2_27r(if4CL4RDl=&K-69ditT8V2v#td=v1mMj-D8#qTjdBzVhLn+l7)^)r{-5X4TrYMkq(hyF`z;1 S&;v={Oad7Pv*-M8@&5q)Ef4Ad literal 0 HcmV?d00001 diff --git a/env.template b/env.template new file mode 100644 index 0000000..2aa96ad --- /dev/null +++ b/env.template @@ -0,0 +1,59 @@ +# ================== General Configuration | 通用配置 ================== +# List of stock ticker symbols to analyze (comma-separated) | 想要分析的股票代码列表(用逗号分隔) +TICKERS=AAPL,MSFT,GOOGL,NVDA,TSLA,META,AMZN + +# Financial Data API +# At least FINANCIAL_DATASETS_API_KEY is required, corresponding to FIN_DATA_SOURCE=financial_datasets; It's recommended to add FINNHUB_API_KEY, corresponding to FIN_DATA_SOURCE=finnhub; FINNHUB_API_KEY is mandatory for live mode +# 至少需要FINANCIAL_DATASETS_API_KEY,对应FIN_DATA_SOURCE=financial_datasets;推荐添加FINNHUB_API_KEY,对应FIN_DATA_SOURCE=finnhub;如果使用live模式必须添加FINNHUB_API_KEY + +# finnhub: https://finnhub.io/register +# financial datasets: https://www.financialdatasets.ai/ + +FIN_DATA_SOURCE = #finnhub or financial_datasets | finnhub 或 financial_datasets +FINANCIAL_DATASETS_API_KEY= #required | 必填 +FINNHUB_API_KEY= #optional | 可选 + +# Model API +OPENAI_API_KEY= +OPENAI_BASE_URL= +MODEL_NAME=qwen3-max-preview + +#记忆模块(Embedding and llm calls for Reme memory) +# default to use aliyun dashscope url, more details: https://help.aliyun.com/zh/model-studio/what-is-model-studio +MEMORY_API_KEY= + + +# ================== Agent-Specific Model Configuration | Agent特定模型配置 ================== +# Configure different base models for different roles | 为不同角色配置不同的基座模型 +# If not configured, global MODEL_NAME and MODEL_PROVIDER will be used | 如果未配置,将使用全局MODEL_NAME和MODEL_PROVIDER +# +# Role List | 角色列表: +# - SENTIMENT_ANALYST: Sentiment Analyst | 情绪分析师 +# - TECHNICAL_ANALYST: Technical Analyst | 技术分析师 +# - FUNDAMENTALS_ANALYST: Fundamentals Analyst | 基本面分析师 +# - VALUATION_ANALYST: Valuation Analyst | 估值分析师 +# - PORTFOLIO_MANAGER: Portfolio Manager | 投资组合经理 +# - RISK_MANAGER: Risk Manager | 风险管理经理 + +AGENT_SENTIMENT_ANALYST_MODEL_NAME=deepseek-v3.2-exp +AGENT_TECHNICAL_ANALYST_MODEL_NAME=glm-4.6 +AGENT_FUNDAMENTALS_ANALYST_MODEL_NAME=qwen3-max-preview +AGENT_VALUATION_ANALYST_MODEL_NAME=Moonshot-Kimi-K2-Instruct +AGENT_RISK_MANAGER_MODEL_NAME=qwen3-max-preview +AGENT_PORTFOLIO_MANAGER_MODEL_NAME=qwen3-max-preview + + +# ================== Advanced Configuration | 高阶配置 ================== + +# Maximum conference discussion cycles (default: 2) | 最大会议讨论轮数(默认:2) +MAX_COMM_CYCLES=2 + +# Margin Requirement | 保证金比例 +MARGIN_REQUIREMENT=0.5 +# 0.5 = Standard margin (recommended) | 标准保证金(推荐) +# 0.25 = Maintenance margin (aggressive) | 维持保证金(激进) + +# Historical data start date +DATA_START_DATE=2022-01-01 +# Auto update data on startup (true/false) +AUTO_UPDATE_DATA=true \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..fa8bfd1 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,33 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +.env.local + +# Dependencies +node_modules + +# Build output +dist +dist-ssr +*.local + +# Lock files +package-lock.json +yarn.lock +pnpm-lock.yaml + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..b5b523f --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,7 @@ + +## QuickStart +```bash +cd frontend +npm install +npm run dev +``` \ No newline at end of file diff --git a/frontend/components.json b/frontend/components.json new file mode 100644 index 0000000..41716e3 --- /dev/null +++ b/frontend/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/frontend/env.template b/frontend/env.template new file mode 100644 index 0000000..0499b80 --- /dev/null +++ b/frontend/env.template @@ -0,0 +1,10 @@ +# Frontend Environment Variables Template +# 复制此文件为 .env 并修改配置 + +# WebSocket服务器地址 +# 本地开发 +VITE_WS_URL=ws://localhost:8765 + +# 生产环境(替换为你的实际服务器地址) +# VITE_WS_URL=wss://your-server.com:8765 + diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..777fe18 --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,29 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import { defineConfig, globalIgnores } from "eslint/config"; + +export default defineConfig([ + globalIgnores(["dist"]), + { + files: ["**/*.{js,jsx}"], + extends: [ + js.configs.recommended, + reactHooks.configs["recommended-latest"], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: "latest", + ecmaFeatures: { jsx: true }, + sourceType: "module", + }, + }, + rules: { + "no-unused-vars": ["error", { varsIgnorePattern: "^[A-Z_]" }], + }, + }, +]); diff --git a/frontend/index.css b/frontend/index.css new file mode 100644 index 0000000..fcfdfb9 --- /dev/null +++ b/frontend/index.css @@ -0,0 +1,68 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55% + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..aa0c766 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,14 @@ + + + + + + + + EvoTraders + + +

+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..3efd982 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,55 @@ +{ + "name": "live-trading-demo", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview", + "preview:host": "vite preview --host" + }, + "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@react-three/drei": "^10.7.6", + "@react-three/fiber": "^9.3.0", + "@tailwindcss/vite": "^4.1.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "framer-motion": "^12.23.13", + "lucide-react": "^0.544.0", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-markdown": "^10.1.0", + "recharts": "^3.2.1", + "remark-gfm": "^4.0.1", + "tailwind-merge": "^3.3.1", + "three": "^0.180.0", + "zustand": "^5.0.8" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.0", + "autoprefixer": "^10.4.21", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "typescript": "^5.9.2", + "vite": "^7.1.2", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/frontend/public/trading_logo.png b/frontend/public/trading_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..029a0d48f79128767c17d3a5acc7e8aaf6a31feb GIT binary patch literal 41505 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�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 literal 0 HcmV?d00001 diff --git a/frontend/src/App.css b/frontend/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/frontend/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx new file mode 100644 index 0000000..09c8033 --- /dev/null +++ b/frontend/src/App.jsx @@ -0,0 +1,1034 @@ +import React, { useEffect, useMemo, useRef, useState, useCallback } from "react"; + +// Configuration and constants +import { AGENTS, INITIAL_TICKERS } from './config/constants'; + +// Services +import { ReadOnlyClient } from './services/websocket'; + +// Hooks +import { useFeedProcessor } from './hooks/useFeedProcessor'; + +// Styles +import GlobalStyles from './styles/GlobalStyles'; + +// Components +import RoomView from './components/RoomView'; +import NetValueChart from './components/NetValueChart'; +import AgentFeed from './components/AgentFeed'; +import StockLogo from './components/StockLogo'; +import StatisticsView from './components/StatisticsView'; +import PerformanceView from './components/PerformanceView'; +import AboutModal from './components/AboutModal'; +import RulesView from './components/RulesView'; +import Header from './components/Header.jsx'; + +// Utils +import { formatNumber, formatTickerPrice } from './utils/formatters'; + +/** + * Live Trading Intelligence Platform - Read-Only Dashboard + * Geek Style - Terminal-inspired, minimal, monochrome + * + */ + +export default function LiveTradingApp() { + const [isConnected, setIsConnected] = useState(false); + const [connectionStatus, setConnectionStatus] = useState('connecting'); // 'connecting' | 'connected' | 'disconnected' + const [systemStatus, setSystemStatus] = useState('initializing'); // 'initializing' | 'running' | 'completed' + const [currentDate, setCurrentDate] = useState(null); + const [progress, setProgress] = useState({ current: 0, total: 0 }); + const [now, setNow] = useState(() => new Date()); + const [showAboutModal, setShowAboutModal] = useState(false); + + // View toggle: 'rules' | 'room' | 'chart' | 'statistics' + const [currentView, setCurrentView] = useState('chart'); // Start with chart, then animate to room + const [isInitialAnimating, setIsInitialAnimating] = useState(true); + const [lastUpdate, setLastUpdate] = useState(new Date()); + const [isUpdating, setIsUpdating] = useState(false); + + // Chart data + const [chartTab, setChartTab] = useState('all'); + const [portfolioData, setPortfolioData] = useState({ + netValue: 10000, + pnl: 0, + equity: [], + baseline: [], // Baseline strategy (Buy & Hold - Equal Weight) + baseline_vw: [], // Baseline strategy (Buy & Hold - Value Weighted) + momentum: [], // Momentum strategy + strategies: [] // Other strategies + }); + + // Feed data (using hook for simplified processing) + const { feed, processHistoricalFeed, processFeedEvent, addSystemMessage } = useFeedProcessor(); + + // Statistics data + const [holdings, setHoldings] = useState([]); + const [trades, setTrades] = useState([]); + const [stats, setStats] = useState(null); + const [leaderboard, setLeaderboard] = useState([]); + + // Ticker prices (now from real-time data) + const [tickers, setTickers] = useState(INITIAL_TICKERS); + const [rollingTickers, setRollingTickers] = useState({}); + + // Room bubbles + const [bubbles, setBubbles] = useState({}); + + // Resizable panels + const [leftWidth, setLeftWidth] = useState(70); // percentage + const [isResizing, setIsResizing] = useState(false); + + // Market status + const [serverMode, setServerMode] = useState(null); // 'live' | 'backtest' | null + const [marketStatus, setMarketStatus] = useState(null); // { status, status_text, ... } + const [virtualTime, setVirtualTime] = useState(null); // Virtual time from server (for mock mode) + + const clientRef = useRef(null); + const containerRef = useRef(null); + const agentFeedRef = useRef(null); + + // Track last virtual time update to calculate increment + const lastVirtualTimeRef = useRef(null); + const virtualTimeOffsetRef = useRef(0); + + // Last day history for replay + const [lastDayHistory, setLastDayHistory] = useState([]); + + // Determine if LIVE tab should be enabled + const isLiveEnabled = useMemo(() => { + if (!marketStatus) return false; + return marketStatus.status === 'open'; + }, [marketStatus]); + + // Switch away from LIVE tab when market closes + useEffect(() => { + if (!isLiveEnabled && chartTab === 'live') { + setChartTab('all'); + } + }, [isLiveEnabled, chartTab]); + + // Clock - use virtual time if available (for mock mode) + useEffect(() => { + if (virtualTime) { + // In mock mode, calculate offset from real time + const virtualTimeMs = new Date(virtualTime).getTime(); + const realTimeMs = Date.now(); + virtualTimeOffsetRef.current = virtualTimeMs - realTimeMs; + lastVirtualTimeRef.current = virtualTimeMs; + setNow(new Date(virtualTime)); + + // Update clock every second based on offset + const id = setInterval(() => { + const currentRealTime = Date.now(); + const currentVirtualTime = currentRealTime + virtualTimeOffsetRef.current; + setNow(new Date(currentVirtualTime)); + }, 1000); + + return () => clearInterval(id); + } else { + // In live mode, use real time + const id = setInterval(() => setNow(new Date()), 1000); + return () => clearInterval(id); + } + }, [virtualTime]); + + // Update clock when virtual time changes (recalculate offset) + useEffect(() => { + if (virtualTime) { + const virtualTimeMs = new Date(virtualTime).getTime(); + const realTimeMs = Date.now(); + virtualTimeOffsetRef.current = virtualTimeMs - realTimeMs; + lastVirtualTimeRef.current = virtualTimeMs; + setNow(new Date(virtualTime)); + } + }, [virtualTime]); + + // Track updates with visual feedback + useEffect(() => { + setLastUpdate(new Date()); + setIsUpdating(true); + const timer = setTimeout(() => setIsUpdating(false), 500); + return () => clearTimeout(timer); + }, [holdings, stats, trades, portfolioData.netValue]); + + // Initial animation: show room drawer sliding in + useEffect(() => { + // Wait a bit after mount, then trigger slide to room + const slideTimer = setTimeout(() => { + setCurrentView('room'); + }, 1200); // Wait 1200ms before starting animation (2x slower) + + // Disable animation flag after animation completes + const completeTimer = setTimeout(() => { + setIsInitialAnimating(false); + }, 5000); // 1200ms delay + 1600ms animation duration + 400ms buffer + + return () => { + clearTimeout(slideTimer); + clearTimeout(completeTimer); + }; + }, []); + + // Helper to check if bubble should still be visible + // Bubbles persist until replaced by ANY new message (cross-role) + // When any agent sends a new message, all previous bubbles are cleared + // Can search by agentId or agentName + const bubbleFor = (idOrName) => { + // First try direct lookup by id + let b = bubbles[idOrName]; + if (b) { + return b; + } + + // If not found, search by agentName + const agent = AGENTS.find(a => a.name === idOrName || a.id === idOrName); + if (agent) { + b = bubbles[agent.id]; + if (b) { + return b; + } + } + + return null; + }; + + // Handle jump to message in feed + const handleJumpToMessage = useCallback((bubble) => { + // Switch to room tab (if not already there) for better context + // Then scroll AgentFeed to the message + if (agentFeedRef.current && agentFeedRef.current.scrollToMessage) { + agentFeedRef.current.scrollToMessage(bubble); + } + }, []); + + // Auto-connect to server on mount + useEffect(() => { + // Define pushEvent inside useEffect to avoid dependency issues + const handlePushEvent = (evt) => { + if (!evt) return; + + try { + handleEventInternal(evt); + } catch (error) { + console.error('[Event Handler] Error:', error); + } + }; + + const handleEventInternal = (evt) => { + // Helper: Update tickers from realtime prices + const updateTickersFromPrices = (realtimePrices) => { + try { + setTickers(prevTickers => { + return prevTickers.map(ticker => { + const realtimeData = realtimePrices[ticker.symbol]; + if (realtimeData && realtimeData.price !== null && realtimeData.price !== undefined) { + // Use 'ret' from realtime data (relative to open price) if available + const newChange = (realtimeData.ret !== null && realtimeData.ret !== undefined) + ? realtimeData.ret + : (ticker.change !== null && ticker.change !== undefined ? ticker.change : 0); + + return { + ...ticker, + price: realtimeData.price, + change: newChange, + open: realtimeData.open || ticker.open + }; + } + return ticker; + }); + }); + } catch (error) { + console.error('Error updating tickers from prices:', error); + } + }; + + const handlers = { + // Error response (for fast forward errors) + error: (e) => { + console.error('[Error]', e.message); + + // Handle fast forward errors + if (e.message && e.message.includes('fast forward')) { + console.warn(`⚠️ ${e.message}`); + handlePushEvent({ + type: 'system', + content: `⚠️ ${e.message}`, + timestamp: Date.now() + }); + } + }, + + // Connection events + system: (e) => { + console.log('[System]', e.content); + if (e.content.includes('Connected')) { + setConnectionStatus('connected'); + setIsConnected(true); + } else if (e.content.includes('Disconnected')) { + setConnectionStatus('disconnected'); + setIsConnected(false); + } + processFeedEvent(e); + }, + + // Pong response from server + pong: (e) => { + console.log('[Heartbeat] Pong received'); + }, + + // Initial state from server + initial_state: (e) => { + try { + const state = e.state; + if (!state) return; + + setSystemStatus(state.status || 'initializing'); + setCurrentDate(state.current_date); + + // 设置服务器模式和市场状态 + if (state.server_mode) { + setServerMode(state.server_mode); + } + // 检查是否是mock模式 + const isMockMode = state.is_mock_mode === true; + if (state.market_status) { + setMarketStatus(state.market_status); + // 只在Mock模式下,如果市场状态包含虚拟时间,才保存它 + if (isMockMode && state.market_status.current_time) { + try { + const virtualTimeDate = new Date(state.market_status.current_time); + setVirtualTime(virtualTimeDate); + } catch (error) { + console.error('Error parsing virtual time from market_status:', error); + } + } else { + // 非Mock模式下清除virtualTime + setVirtualTime(null); + } + } + + if (state.trading_days_total) { + setProgress({ + current: state.trading_days_completed || 0, + total: state.trading_days_total + }); + } + + if (state.portfolio) { + setPortfolioData(prev => ({ + ...prev, + netValue: state.portfolio.total_value || prev.netValue, + pnl: state.portfolio.pnl_percent || 0, + equity: state.portfolio.equity || prev.equity, + baseline: state.portfolio.baseline || prev.baseline, + baseline_vw: state.portfolio.baseline_vw || prev.baseline_vw, + momentum: state.portfolio.momentum || prev.momentum, + strategies: state.portfolio.strategies || prev.strategies, + equity_return: state.portfolio.equity_return || prev.equity_return, + baseline_return: state.portfolio.baseline_return || prev.baseline_return, + baseline_vw_return: state.portfolio.baseline_vw_return || prev.baseline_vw_return, + momentum_return: state.portfolio.momentum_return || prev.momentum_return + })); + } + + if (state.dashboard) { + if (state.dashboard.holdings) setHoldings(state.dashboard.holdings); + if (state.dashboard.trades) setTrades(state.dashboard.trades); + if (state.dashboard.stats) setStats(state.dashboard.stats); + if (state.dashboard.leaderboard) setLeaderboard(state.dashboard.leaderboard); + } + if (state.realtime_prices) updateTickersFromPrices(state.realtime_prices); + + // Load and process historical feed data + if (state.feed_history && Array.isArray(state.feed_history)) { + console.log(`✅ Loading ${state.feed_history.length} historical events`); + processHistoricalFeed(state.feed_history); + } + + // Load last day history for replay + if (state.last_day_history && Array.isArray(state.last_day_history)) { + setLastDayHistory(state.last_day_history); + console.log(`✅ Loaded ${state.last_day_history.length} last day events for replay`); + } + + console.log('Initial state loaded'); + } catch (error) { + console.error('Error loading initial state:', error); + } + }, + + // Market status update + market_status_update: (e) => { + if (e.market_status) { + setMarketStatus(e.market_status); + } + }, + + // Real-time price updates + price_update: (e) => { + try { + const { symbol, price, ret, open, portfolio, realtime_prices } = e; + + if (!symbol || !price) { + console.warn('[Price Update] Missing symbol or price:', e); + return; + } + + console.log(`[Price Update] ${symbol}: $${price} (ret: ${ret !== undefined ? ret.toFixed(2) : 'N/A'}%)`); + + // Update ticker price with animation + setTickers(prevTickers => { + return prevTickers.map(ticker => { + if (ticker.symbol === symbol) { + const oldPrice = ticker.price; + + // Use 'ret' from server (relative to open price) if available + // Otherwise fallback to calculating change from previous price + let newChange = ticker.change; + if (ret !== null && ret !== undefined) { + // Use server-provided ret (relative to open price) + newChange = ret; + } else if (oldPrice !== null && oldPrice !== undefined && isFinite(oldPrice)) { + // Fallback: calculate change from previous price + const priceChange = ((price - oldPrice) / oldPrice) * 100; + newChange = (newChange !== null && newChange !== undefined) + ? newChange + priceChange + : priceChange; + } else { + // First price received, set change to 0 + newChange = 0; + } + + // Trigger rolling animation only if price actually changed + if (oldPrice !== price) { + setRollingTickers(prev => ({ ...prev, [symbol]: true })); + setTimeout(() => { + setRollingTickers(prev => ({ ...prev, [symbol]: false })); + }, 500); + } + + return { + ...ticker, + price: price, + change: newChange, + open: open || ticker.open // Store open price + }; + } + return ticker; + }); + }); + + // Update all tickers from realtime_prices if provided + if (realtime_prices) { + updateTickersFromPrices(realtime_prices); + } + + // Update portfolio value if provided + if (portfolio && portfolio.total_value) { + setPortfolioData(prev => ({ + ...prev, + netValue: portfolio.total_value, + pnl: portfolio.pnl_percent || 0, + equity: portfolio.equity || prev.equity // Update equity curve + })); + } + } catch (error) { + console.error('[Price Update] Error:', error); + } + }, + + // Day progress events + day_start: (e) => { + setCurrentDate(e.date); + if (e.progress !== undefined) { + setProgress(prev => ({ + ...prev, + current: Math.floor(e.progress * (prev.total || 1)) + })); + } + setSystemStatus('running'); + processFeedEvent(e); + }, + + day_complete: (e) => { + // Update from day result + const result = e.result; + if (result && typeof result === 'object') { + // Update portfolio equity if available + if (result.portfolio_summary) { + const summary = result.portfolio_summary; + setPortfolioData(prev => { + const newEquity = [...prev.equity]; + // Add new data point + const dateObj = new Date(e.date); + newEquity.push({ + t: dateObj.getTime(), + v: summary.total_value || summary.cash || prev.netValue + }); + + return { + ...prev, + netValue: summary.total_value || summary.cash || prev.netValue, + pnl: summary.pnl_percent || 0, + equity: newEquity + }; + }); + } + } + processFeedEvent(e); + }, + + day_error: (e) => { + console.error('Day error:', e.date, e.error); + processFeedEvent(e); + }, + + conference_start: (e) => { + processFeedEvent(e); + }, + + conference_end: (e) => { + processFeedEvent(e); + }, + + agent_message: (e) => { + const agent = AGENTS.find(a => a.id === e.agentId); + + // Update bubbles for room view + setBubbles({ + [e.agentId]: { + text: e.content, + ts: Date.now(), + agentName: agent?.name || e.agentName || e.agentId + } + }); + + processFeedEvent(e); + }, + + conference_message: (e) => { + const agent = AGENTS.find(a => a.id === e.agentId); + + // Update bubbles for room view + setBubbles({ + [e.agentId]: { + text: e.content, + ts: Date.now(), + agentName: agent?.name || e.agentName || e.agentId + } + }); + + processFeedEvent(e); + }, + + memory: (e) => { + processFeedEvent(e); + }, + + team_summary: (e) => { + // Update portfolio data silently without creating feed messages + setPortfolioData(prev => ({ + ...prev, + netValue: e.balance || prev.netValue, + pnl: e.pnlPct || 0, + equity: e.equity || prev.equity, + baseline: e.baseline || prev.baseline, + baseline_vw: e.baseline_vw || prev.baseline_vw, + momentum: e.momentum || prev.momentum, + equity_return: e.equity_return || prev.equity_return, + baseline_return: e.baseline_return || prev.baseline_return, + baseline_vw_return: e.baseline_vw_return || prev.baseline_vw_return, + momentum_return: e.momentum_return || prev.momentum_return + })); + + // Portfolio updates are shown in the ticker bar, no need for feed messages + }, + + team_portfolio: (e) => { + if (e.holdings) setHoldings(e.holdings); + }, + + // ✅ 监听 holdings 更新(服务器广播的事件名) + team_holdings: (e) => { + if (e.data && Array.isArray(e.data)) { + setHoldings(e.data); + console.log(`✅ Holdings updated: ${e.data.length} positions`); + } + }, + + team_trades: (e) => { + // 支持两种格式:完整列表或单笔交易 + if (e.mode === 'full' && e.data && Array.isArray(e.data)) { + setTrades(e.data); + console.log(`✅ Trades updated (full): ${e.data.length} trades`); + } else if (Array.isArray(e.trades)) { + setTrades(e.trades); + } else if (e.trade) { + setTrades(prev => [e.trade, ...prev].slice(0, 100)); + } + }, + + team_stats: (e) => { + if (e.data) { + setStats(e.data); + console.log('✅ Stats updated'); + } else if (e.stats) { + setStats(e.stats); + } + }, + + team_leaderboard: (e) => { + // 服务器发送的格式: { type: 'team_leaderboard', data: [...], timestamp: ... } + if (Array.isArray(e.data)) { + setLeaderboard(e.data); + console.log('✅ Leaderboard updated:', e.data.length, 'agents'); + } else if (Array.isArray(e.rows)) { + setLeaderboard(e.rows); + } else if (Array.isArray(e.leaderboard)) { + setLeaderboard(e.leaderboard); + } + }, + + // 虚拟时间更新(Mock模式下的时间广播) + time_update: (e) => { + if (e.beijing_time_str) { + const statusEmoji = { + 'market_open': '📊', + 'off_market': '⏸️', + 'non_trading_day': '📅', + 'trade_execution': '💼' + }; + + const emoji = statusEmoji[e.status] || '⏰'; + const isMockMode = e.is_mock_mode === true; + let logMessage = `${emoji} ${isMockMode ? '虚拟时间' : '时间'}: ${e.beijing_time_str} | 状态: ${e.status}`; + + if (e.hours_to_open !== undefined) { + logMessage += ` | 距离开盘: ${e.hours_to_open}小时`; + } + if (e.hours_to_trade !== undefined) { + logMessage += ` | 距离交易: ${e.hours_to_trade}小时`; + } + if (e.trading_date) { + logMessage += ` | 交易日: ${e.trading_date}`; + } + + console.log(logMessage); + + // 只在Mock模式下保存虚拟时间(用于图表过滤和UI显示) + if (isMockMode && e.beijing_time) { + try { + const virtualTimeDate = new Date(e.beijing_time); + setVirtualTime(virtualTimeDate); + } catch (error) { + console.error('Error parsing virtual time:', error); + } + } else { + // 非Mock模式下清除virtualTime + setVirtualTime(null); + } + } + + // 更新市场状态(如果包含在time_update中) + if (e.market_status) { + setMarketStatus(e.market_status); + } + }, + + // 时间快进事件(Mock模式) + time_fast_forwarded: (e) => { + console.log(`⏩ 时间已快进 ${e.minutes} 分钟: ${e.old_time_str} → ${e.new_time_str}`); + + // 更新虚拟时间 + if (e.new_time) { + try { + const virtualTimeDate = new Date(e.new_time); + setVirtualTime(virtualTimeDate); + + // 添加到feed显示 + handlePushEvent({ + type: 'system', + content: `⏩ 时间快进 ${e.minutes} 分钟: ${e.old_time_str} → ${e.new_time_str}`, + timestamp: Date.now() + }); + } catch (error) { + console.error('Error parsing fast forwarded time:', error); + } + } + }, + + // 快进成功响应 + fast_forward_success: (e) => { + console.log(`✅ ${e.message}`); + }, + }; + + // Call handler or do nothing + try { + const handler = handlers[evt.type]; + if (handler) { + handler(evt); + } else { + console.log('[handleEvent] Unknown event type:', evt.type); + } + } catch (error) { + console.error('[handleEvent] Error handling event:', evt.type, error); + } + }; + + // Create and connect WebSocket client + const client = new ReadOnlyClient(handlePushEvent); + clientRef.current = client; + client.connect(); + setConnectionStatus('connecting'); + + return () => { + // Cleanup on unmount + if (clientRef.current) { + clientRef.current.disconnect(); + } + }; + }, []); // Empty dependency array - only run once on mount + + // Resizing handlers + const handleMouseDown = (e) => { + e.preventDefault(); + setIsResizing(true); + }; + + useEffect(() => { + if (!isResizing) return; + + const handleMouseMove = (e) => { + if (!containerRef.current) return; + const containerRect = containerRef.current.getBoundingClientRect(); + const newLeftWidth = ((e.clientX - containerRect.left) / containerRect.width) * 100; + + // Limit between 30% and 85% + if (newLeftWidth >= 30 && newLeftWidth <= 85) { + setLeftWidth(newLeftWidth); + } + }; + + const handleMouseUp = () => { + setIsResizing(false); + }; + + document.addEventListener('mousemove', handleMouseMove); + document.addEventListener('mouseup', handleMouseUp); + + return () => { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + }; + }, [isResizing]); + + return ( +
+ + + {/* Header */} +
+
setShowAboutModal(true)} + evoTradersLinkStyle="default" + /> + +
+ {/* Mock Mode Indicator */} + {virtualTime && ( +
+ + + 模拟模式 + +
+ )} + + + {/* Clock Display (only in Mock mode) */} + {virtualTime && ( +
+
+ + 虚拟时间 + + + {now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false })} + + + {now.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })} + +
+ + {/* Fast Forward Button (only in Mock mode) */} + +
+ )} + + {/* Unified Status Indicator */} +
+ + + {isConnected ? (isUpdating ? '同步中' : '在线') : '离线'} + + {marketStatus && ( + <> + · + + {marketStatus.status_text || (marketStatus.status === 'open' ? '开盘' : '收盘')} + + + )} + · + {lastUpdate.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false })} +
+
+
+ + {/* Main Content */} + <> + {/* Ticker Bar */} +
+
+ {[0, 1].map((groupIdx) => ( +
+ {tickers.map(ticker => ( +
+ + {ticker.symbol} + + + {ticker.price !== null && ticker.price !== undefined + ? `$${formatTickerPrice(ticker.price)}` + : '-'} + + + = 0 ? 'positive' : 'negative' + }`}> + {ticker.change !== null && ticker.change !== undefined + ? `${ticker.change >= 0 ? '+' : ''}${ticker.change.toFixed(2)}%` + : '-'} + +
+ ))} +
+ ))} +
+
+ 投资组合 + ${formatNumber(portfolioData.netValue)} +
+
+ +
+ {/* Left Panel: Three-View Toggle (Room/Chart/Statistics) */} +
+
+
+
+ + + + + + + +
+ + {/* Slider container with four views */} +
+ {/* Rules View Panel */} +
+ +
+ + {/* Room View Panel */} +
+ +
+ + {/* Chart View Panel */} +
+
+ {/* Floating Timeframe Tabs */} +
+ + {/* */} +
+ + +
+
+ + {/* Statistics View Panel */} +
+ +
+
+
+
+
+ + {/* Resizer */} +
+ + {/* Right Panel: Agent Feed */} +
+ +
+
+ + + {/* About Modal */} + {showAboutModal && setShowAboutModal(false)} />} +
+ ); +} diff --git a/frontend/src/components/AboutModal.jsx b/frontend/src/components/AboutModal.jsx new file mode 100644 index 0000000..a6d9bd3 --- /dev/null +++ b/frontend/src/components/AboutModal.jsx @@ -0,0 +1,361 @@ +import React, { useState } from 'react'; +import Header from './Header.jsx'; + +export default function AboutModal({ onClose }) { + const [isClosing, setIsClosing] = useState(false); + const [language, setLanguage] = useState('en'); // 'en' or 'zh' + + const handleClose = () => { + setIsClosing(true); + // Wait for animation to complete before actually closing + setTimeout(() => { + onClose(); + }, 600); // Match animation duration + }; + + const overlayStyle = { + position: 'fixed', + top: 0, + left: 0, + right: 0, + bottom: 0, + background: '#ffffff', + zIndex: 9999, + animation: isClosing + ? 'collapseUp 0.6s cubic-bezier(0.4, 0, 0.2, 1) forwards' + : 'expandDown 0.6s cubic-bezier(0.4, 0, 0.2, 1)', + transformOrigin: 'top center', + overflowY: 'auto' + }; + + const contentStyle = { + maxWidth: '900px', + width: '90%', + margin: '0 auto', + textAlign: 'left', + fontFamily: "'IBM Plex Mono', monospace", + color: '#000000', + lineHeight: 1.8, + fontSize: '14px', + letterSpacing: '0.01em', + padding: '60px 20px 80px', + animation: isClosing + ? 'fadeOutContent 0.4s ease forwards' + : 'fadeInContent 0.8s ease 0.3s backwards' + }; + + const highlight = { + color: '#615CED', + fontWeight: 600 + }; + + const linkStyle = { + color: '#615CED', + textDecoration: 'none', + borderBottom: '1px solid #615CED', + transition: 'all 0.2s' + }; + + const closeHintStyle = { + marginTop: '50px', + fontSize: '11px', + color: '#999', + cursor: 'pointer', + textAlign: 'center' + }; + + const languageSwitchStyle = { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + marginBottom: '25px', + marginTop: '10px', + gap: '0px', + fontSize: '11px', + fontFamily: "'IBM Plex Mono', monospace" + }; + + const getLangStyle = (isActive) => ({ + padding: '3px 8px', + cursor: 'pointer', + transition: 'all 0.2s', + background: isActive ? '#000' : '#fff', + color: isActive ? '#fff' : '#000', + border: 'none' + }); + + const content = { + en: { + + question: "What happens if AI models don't compete with each other, but instead trade like a ", + questionHighlight: "well-coordinated, high-performance team", + questionEnd: "?", + + intro: "Not arena, but TEAM. We Hope that AI is no longer entering the financial markets as isolated models—it is stepping in as ", + introHighlight1: "teams", + introContinue: ", collaborating in one of the most challenging and noise-filled ", + introHighlight2: "real-time environments", + introContinue2: ".", + + + point1Highlight: "✦ Complementary skills", + point1: " - across multiple agents—data analysis, strategy generation, risk management—working together like a real trading desk, exchanging information through notifications and meetings.", + + point2Highlight: "✦ An agent system that continually evolves", + point2: " — with memory modules that retain experience, learn from market feedback, reflect, and develop their own methodology over time.", + + point3Highlight: "✦ AI teams interacting with live markets", + point3: " — learning from real-time data and making immediate decisions, not just theoretical simulations." + }, + zh: { + intro: "如果不是让模型彼此竞争,而是像一支高效协作的团队一样进行实时交易,会发生什么?", + question: "这里不是竞技场,而是团队。我们希望Agents不再单打独斗,而是「组团」进入实时金融市场——这一十分困难且充满噪声的环境。", + trying: "我们正在探索多智能体协作在实时金融交易中的可能性。", + + title1: "✦ 多智能体的技能互补", + point1: "不同模型、不同角色的智能体像真实的金融团队一样协作,各自承担数据分析、策略生成、风险控制等职责。", + point1Sub: "通过通知和会议机制进行信息交换,实现高效协作。", + + title2: "✦ 能够持续进化的智能体系统", + point2: "依托「记忆」模块,每个智能体都能跨回合保留经验,不断学习、反思与调整。我们希望能看到在长期实时交易中,Agent形成自己的独特方法论,而不是一次性偶然的推理。", + point2Sub: "ReMe 记忆框架帮助 Agents 持续改进。", + + title3: "✦ 实时参与市场的 AI Agents", + point3: "Agents从实时行情中学习,并给予即时决策;不是纸上谈兵,而是面对市场的真实波动。" + } + }; + + return ( + <> + + +
+ {/* Header */} +
e.stopPropagation()}> +
+
+ + {/* Content */} +
e.stopPropagation()}> + {/* Language Switch */} +
+ setLanguage('zh')} + > + 中文 + + + setLanguage('en')} + > + EN + +
+ + {language === 'en' ? ( + // English Content + <> + +
+ {content.en.question} + {content.en.questionHighlight} + {content.en.questionEnd} +
+ +
+ {content.en.intro} + {content.en.introHighlight1} + {content.en.introContinue} + {content.en.introHighlight2} + {content.en.introContinue2} +
+ +
+ {content.en.point1Highlight} + {content.en.point1} +
+ +
+ {content.en.point2Highlight} + {content.en.point2} +
+ +
+ {content.en.point3Highlight} + {content.en.point3} +
+ +
+ + ) : ( + // Chinese Content + <> +
+ {content.zh.intro} +
+ +
+ {content.zh.question} +
+ +
+ {content.zh.trying} +
+ +
+
+ {content.zh.title1} +
+
+ {content.zh.point1} +
+
+ {content.zh.point1Sub} +
+
+ +
+
+ {content.zh.title2} +
+
+ {content.zh.point2} +
+
+ {content.zh.point2Sub} +
+
+ +
+
+ {content.zh.title3} +
+
+ {content.zh.point3} +
+
+ +
+ 我们已经在github上开源。 +
+
+ EvoTraders 基于{' '} + + AgentScope + + {' '}搭建,并使用其中的{' '} + + ReMe + + {' '}作为记忆管理核心。 +
+ +
+ 你可以在此找到完整项目与示例: +
+ + )} + + + +
+ {language === 'en' ? 'Click here to close' : '点击此处关闭'} +
+
+
+ + ); +} + diff --git a/frontend/src/components/AgentCard.jsx b/frontend/src/components/AgentCard.jsx new file mode 100644 index 0000000..08e8f33 --- /dev/null +++ b/frontend/src/components/AgentCard.jsx @@ -0,0 +1,517 @@ +import React from 'react'; +import { ASSETS } from '../config/constants'; +import { getModelIcon, getShortModelName } from '../utils/modelIcons'; + +/** + * Get rank medal/trophy + */ +function getRankMedal(rank) { + if (rank === 1) return { emoji: '🏆', color: '#FFD700', label: '金牌' }; + if (rank === 2) return { emoji: '🥈', color: '#C0C0C0', label: '银牌' }; + if (rank === 3) return { emoji: '🥉', color: '#CD7F32', label: '铜牌' }; + return { emoji: `#${rank}`, color: '#333333', label: `#${rank}` }; +} + +/** + * Agent Performance Card Component + * Horizontal dropdown panel displayed below the agent indicator bar + */ +export default function AgentCard({ agent, onClose, isClosing }) { + if (!agent) return null; + + const bullTotal = agent.bull?.n || 0; + const bullWins = agent.bull?.win || 0; + const bullUnknown = agent.bull?.unknown || 0; + const bearTotal = agent.bear?.n || 0; + const bearWins = agent.bear?.win || 0; + const bearUnknown = agent.bear?.unknown || 0; + const totalSignals = bullTotal + bearTotal; + const evaluatedBull = Math.max(bullTotal - bullUnknown, 0); + const evaluatedBear = Math.max(bearTotal - bearUnknown, 0); + const evaluatedTotal = evaluatedBull + evaluatedBear; + const bullWinRate = evaluatedBull > 0 ? (bullWins / evaluatedBull) : null; + const bearWinRate = evaluatedBear > 0 ? (bearWins / evaluatedBear) : null; + const overallWinRate = agent.winRate != null + ? agent.winRate + : (evaluatedTotal > 0 ? ((bullWins + bearWins) / evaluatedTotal) : null); + const overallColor = overallWinRate != null + ? (overallWinRate >= 0.5 ? '#00C853' : '#FF1744') + : '#555555'; + + const rankMedal = agent.rank ? getRankMedal(agent.rank) : null; + const isPortfolioManager = agent.id === 'portfolio_manager'; + const isRiskManager = agent.id === 'risk_manager'; + const displayName = isPortfolioManager ? '团队' : agent.name; + + // Get model icon configuration + const modelInfo = getModelIcon(agent.modelName, agent.modelProvider); + const shortModelName = getShortModelName(agent.modelName); + + return ( +
+ {/* Horizontal scrollable content */} +
+ + +
+ {/* Agent Info with Rank */} +
+ {isPortfolioManager ? ( + Team + ) : agent.avatar ? ( + {agent.name} + ) : null} +
+
+ {displayName} +
+ {rankMedal && !isPortfolioManager && ( +
+ {rankMedal.emoji} Rank #{agent.rank} +
+ )} +
+
+ + {/* Risk Manager Note */} + {isRiskManager && ( +
+
+ ⓘ 风控经理专注于风险管理,不参与预测准确率排名。 +
+
+ )} + + {/* Portfolio Manager Note */} + {isPortfolioManager && ( +
+
+ ⓘ 投资经理综合所有分析师建议,提供团队最终交易信号,不参与排名。 +
+
+ )} + + {/* Model Info Card */} + {agent.modelName && ( +
+
+ 模型 +
+
+ {modelInfo.logoPath ? ( + {modelInfo.provider} + ) : ( +
+ 🤖 +
+ )} +
+
+ {shortModelName} +
+
+ {modelInfo.provider} +
+
+ )} + + {/* Overall Win Rate */} + {!isRiskManager && !isPortfolioManager && ( +
+
+ 胜率 +
+
+ {overallWinRate != null ? `${(overallWinRate * 100).toFixed(1)}%` : 'N/A'} +
+
+ {bullWins + bearWins}胜 / {evaluatedTotal}评 +
+
+ 评估: 总评估多空信号数。{'\n'}胜率 = 正确信号 / 总评估信号 +
+
+ )} + + {/* Bull Stats */} + {!isRiskManager && !isPortfolioManager && ( +
+
+ 牛市胜率 +
+
= 0.5 ? '#00C853' : '#333333') : '#555555', + marginBottom: 2, + lineHeight: 1 + }}> + {bullWinRate != null ? `${(bullWinRate * 100).toFixed(1)}%` : 'N/A'} +
+
+ {bullWins}胜 / {evaluatedBull}评 + {bullUnknown > 0 && ` / ${bullUnknown}P`} +
+
+ )} + + {/* Bear Stats */} + {!isRiskManager && !isPortfolioManager && ( +
+
+ 熊市胜率 +
+
= 0.5 ? '#00C853' : '#333333') : '#555555', + marginBottom: 2, + lineHeight: 1 + }}> + {bearWinRate != null ? `${(bearWinRate * 100).toFixed(1)}%` : 'N/A'} +
+
+ {bearWins}胜 / {evaluatedBear}评 + {bearUnknown > 0 && ` / ${bearUnknown}P`} +
+
+ )} + + {/* Recent Signals - Horizontal scroll */} + {agent.signals && agent.signals.length > 0 && ( +
+ {[...agent.signals] + .filter(signal => signal && signal.signal) + .sort((a, b) => { + // Sort by date descending (newest first) + const dateA = a.date || ''; + const dateB = b.date || ''; + return dateB.localeCompare(dateA); + }) + .slice(0, 35) + .map((signal, idx) => { + const signalType = signal.signal.toLowerCase(); + const isBull = signalType.includes('bull') || signalType === 'long'; + const isBear = signalType.includes('bear') || signalType === 'short'; + const isNeutral = (!isBull && !isBear) || signalType.includes('neutral') || signalType === 'hold'; + const isCorrect = signal.is_correct === true; + const isUnknown = signal.is_correct === 'unknown' || signal.is_correct === null; + + // Determine result symbol/text and color: unknown has priority over neutral + let resultDisplay; + let resultColor = '#555555'; + let resultFontSize = 18; + + if (isNeutral) { + resultDisplay = '-'; + resultColor = '#555555'; // Gray for neutral + } else if (isUnknown) { + resultDisplay = '?'; + resultColor = '#FFA726'; // Orange for unknown + resultFontSize = 14; // Smaller font for text + } else { + resultDisplay = isCorrect ? '✓' : '✗'; + resultColor = isCorrect ? '#00C853' : '#FF1744'; // Green for correct, Red for wrong + } + + return ( +
+
+ {signal.ticker} +
+
+ {isBull ? '看涨' : isBear ? '看跌' : '中性'} +
+
+ {signal.date?.substring(5, 10) || 'N/A'} +
+
+ {resultDisplay} +
+
+ ); + })} + {/* Info card explaining signal display */} +
+
+ ⓘ 说明 +
+
+ 仅显示最近5个交易日(1周)的信号 +
+
+
+ )} +
+
+ + +
+ ); +} + diff --git a/frontend/src/components/AgentFeed.jsx b/frontend/src/components/AgentFeed.jsx new file mode 100644 index 0000000..bb2dce9 --- /dev/null +++ b/frontend/src/components/AgentFeed.jsx @@ -0,0 +1,641 @@ +import React, { useState, useRef, useImperativeHandle, forwardRef } from 'react'; +import { formatTime } from '../utils/formatters'; +import { MESSAGE_COLORS, getAgentColors, AGENTS, ASSETS } from '../config/constants'; +import { getModelIcon } from '../utils/modelIcons'; +import MarkdownModal from './MarkdownModal'; + +const isAnalyst = (agentId, agentName) => { + if (agentId && agentId.includes('analyst')) return true; + if (agentName && agentName.toLowerCase().includes('analyst')) return true; + return false; +}; + +const isManager = (agentId, agentName) => { + if (agentId && agentId.includes('manager')) return true; + if (agentName && agentName.toLowerCase().includes('manager')) return true; + return false; +}; + +const stripMarkdown = (text) => { + return text + .replace(/[\s\S]*?<\/think>/gi, '') + .replace(/#{1,6}\s+/g, '') + .replace(/\*\*\*(.+?)\*\*\*/g, '$1') + .replace(/\*\*(.+?)\*\*/g, '$1') + .replace(/__(.+?)__/g, '$1') + .replace(/\*(.+?)\*/g, '$1') + .replace(/_(.+?)_/g, '$1') + .replace(/`(.+?)`/g, '$1') + .replace(/\[(.+?)\]\(.+?\)/g, '$1') + .replace(/!\[.*?\]\(.+?\)/g, '') + .replace(/^\s*[-*+]\s+/gm, '') + .replace(/^\s*\d+\.\s+/gm, '') + .replace(/^\s*>\s+/gm, '') + .replace(/\|/g, ' ') + .replace(/^[-=]+$/gm, ''); +}; + +const AgentFeed = forwardRef(({ feed, leaderboard }, ref) => { + const feedContentRef = useRef(null); + const [highlightedId, setHighlightedId] = useState(null); + const [selectedAgent, setSelectedAgent] = useState('all'); + const [dropdownOpen, setDropdownOpen] = useState(false); + + const getAgentModelInfo = (agentId) => { + if (!leaderboard || !agentId) return { modelName: null, modelProvider: null }; + const agentData = leaderboard.find(lb => lb.id === agentId || lb.agentId === agentId); + return { + modelName: agentData?.modelName, + modelProvider: agentData?.modelProvider + }; + }; + + // Get agent info by name + const getAgentInfoByName = (agentName) => { + if (!leaderboard || !agentName) return null; + const agentData = leaderboard.find(lb => lb.name === agentName || lb.agentName === agentName); + if (!agentData) return null; + return { + agentId: agentData.id || agentData.agentId, + modelName: agentData.modelName, + modelProvider: agentData.modelProvider + }; + }; + + // Get unique agent names from feed (only registered agents in AGENTS) + const getUniqueAgents = () => { + const agentNamesInFeed = new Set(); + + // Collect all agent names that appear in the feed + feed.forEach(item => { + if (item.type === 'message' && item.data?.agent) { + agentNamesInFeed.add(item.data.agent); + } else if (item.type === 'conference' && item.data?.messages) { + item.data.messages.forEach(msg => { + if (msg.agent) { + agentNamesInFeed.add(msg.agent); + } + }); + } + }); + + // Filter to only include registered agents and sort by AGENTS array order + const registeredAgentNames = AGENTS.map(a => a.name); + return registeredAgentNames.filter(name => agentNamesInFeed.has(name)); + }; + + // Filter feed based on selected agent + const filteredFeed = selectedAgent === 'all' + ? feed + : feed.filter(item => { + if (item.type === 'message') { + return item.data?.agent === selectedAgent; + } else if (item.type === 'conference') { + return item.data?.messages?.some(msg => msg.agent === selectedAgent); + } + return false; + }); + + useImperativeHandle(ref, () => ({ + scrollToMessage: (bubble) => { + if (!bubble || !feedContentRef.current) return; + + // Direct feedItemId match (used by replay mode) + if (bubble.feedItemId) { + const element = document.getElementById(`feed-item-${bubble.feedItemId}`); + if (element) { + element.scrollIntoView({ behavior: 'smooth', block: 'center' }); + setHighlightedId(bubble.feedItemId); + setTimeout(() => setHighlightedId(null), 2000); + return; + } + } + + const bubbleTimestamp = bubble.ts || bubble.timestamp; + + // Check if a message matches the bubble + const isMatch = (msg, checkTime = true) => { + const agentMatch = msg.agentId === bubble.agentId || msg.agent === bubble.agentName; + if (!agentMatch || !checkTime) return agentMatch; + return Math.abs(msg.timestamp - bubbleTimestamp) < 5000; + }; + + // Check if a feed item contains the target message + const itemContains = (item, checkTime = true) => { + if (item.type === 'message' && item.data) return isMatch(item.data, checkTime); + if (item.type === 'conference' && item.data?.messages) { + return item.data.messages.some(msg => isMatch(msg, checkTime)); + } + return false; + }; + + // Find exact match first, then fallback to agent match + const targetItem = feed.find(item => itemContains(item, true)) + || feed.find(item => itemContains(item, false)); + + if (targetItem) { + const element = document.getElementById(`feed-item-${targetItem.id}`); + if (element) { + element.scrollIntoView({ behavior: 'smooth', block: 'center' }); + setHighlightedId(targetItem.id); + setTimeout(() => setHighlightedId(null), 2000); + } + } + } + }), [feed]); + + const uniqueAgents = getUniqueAgents(); + + // Get current selection display info + const getCurrentSelectionInfo = () => { + if (selectedAgent === 'all') { + return { label: 'All Agents', modelInfo: null }; + } + const agentInfo = getAgentInfoByName(selectedAgent); + const modelInfo = agentInfo ? getModelIcon(agentInfo.modelName, agentInfo.modelProvider) : null; + return { label: selectedAgent, modelInfo }; + }; + + const currentSelection = getCurrentSelectionInfo(); + + return ( +
+
+

活动 feed

+
+ +
+ + {dropdownOpen && ( +
+
{ + setSelectedAgent('all'); + setDropdownOpen(false); + }} + > + 全部 Agents +
+ {uniqueAgents.map(agent => { + const agentInfo = getAgentInfoByName(agent); + const modelInfo = agentInfo ? getModelIcon(agentInfo.modelName, agentInfo.modelProvider) : null; + return ( +
{ + setSelectedAgent(agent); + setDropdownOpen(false); + }} + > + {modelInfo?.logoPath && ( + {modelInfo.provider} + )} + {agent} +
+ ); + })} +
+ )} +
+
+
+
+ {filteredFeed.length === 0 && ( +
+ {selectedAgent === 'all' + ? '等待系统更新...' + : `${selectedAgent} 没有消息`} +
+ )} + + {filteredFeed.map(item => { + const isHighlighted = item.id === highlightedId; + if (item.type === 'conference') { + return ; + } else if (item.type === 'memory') { + return ; + } else if (item.data?.agent === 'System') { + return ; + } else { + return ; + } + })} +
+
+ ); +}); + +AgentFeed.displayName = 'AgentFeed'; + +export default AgentFeed; + +function SystemDivider({ message, itemId }) { + const content = String(message.content || ''); + + return ( +
+
+ + {content} + +
+
+ ); +} + +function ConferenceItem({ conference, itemId, isHighlighted, getAgentModelInfo }) { + const colors = MESSAGE_COLORS.conference; + + return ( +
+
+ + 会议 + + {conference.isLive && ● 实时} + {formatTime(conference.startTime)} +
+ +
+ {conference.title} +
+ +
+ {conference.messages.map((msg, idx) => ( + + ))} +
+
+ ); +} + +function ConferenceMessage({ message, getAgentModelInfo }) { + const [expanded, setExpanded] = useState(false); + + const agentColors = message.agent === 'System' ? MESSAGE_COLORS.system : + message.agent === 'Memory' ? MESSAGE_COLORS.memory : + getAgentColors(message.agentId, message.agent); + + const agentModelData = message.agentId && getAgentModelInfo ? + getAgentModelInfo(message.agentId) : + { modelName: null, modelProvider: null }; + const modelInfo = getModelIcon(agentModelData.modelName, agentModelData.modelProvider); + + let content = message.content || ''; + if (typeof content === 'object') { + content = JSON.stringify(content, null, 2); + } else { + content = String(content); + } + + const needsTruncation = content.length > 200; + const MAX_EXPANDED_LENGTH = 10000; + + let displayContent = content; + if (!expanded && needsTruncation) { + displayContent = content.substring(0, 200) + '...'; + } else if (expanded && content.length > MAX_EXPANDED_LENGTH) { + displayContent = content.substring(0, MAX_EXPANDED_LENGTH) + '...'; + } + + return ( +
+
+ {modelInfo.logoPath && ( + {modelInfo.provider} + )} + {message.agent} +
+
+ {stripMarkdown(displayContent)} + {needsTruncation && ( + + )} +
+
+ ); +} + +function MemoryItem({ memory, itemId, isHighlighted }) { + const [expanded, setExpanded] = useState(false); + const [showTooltip, setShowTooltip] = useState(false); + const colors = MESSAGE_COLORS.memory; + + let content = memory.content || ''; + if (typeof content === 'object') { + content = JSON.stringify(content, null, 2); + } else { + content = String(content); + } + + const needsTruncation = content.length > 200; + const MAX_EXPANDED_LENGTH = 10000; + + let displayContent = content; + if (!expanded && needsTruncation) { + displayContent = content.substring(0, 200) + '...'; + } else if (expanded && content.length > MAX_EXPANDED_LENGTH) { + displayContent = content.substring(0, MAX_EXPANDED_LENGTH) + '...'; + } + + const agentLabel = memory.agent && memory.agent !== 'Memory' + ? `记忆 · ${memory.agent}` + : '记忆'; + + return ( +
+
+ +
setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + + ReMe + + ↗ + + +
+ + {agentLabel} + +
+ {formatTime(memory.timestamp)} +
+ +
+
+ Memory powered by AgentScope-ReMe +
+
+ Not only retrieves historical memories but also generates suggestions and hints for the current task based on latest context. +
+
+ +
{stripMarkdown(displayContent)}
+ + {needsTruncation && ( + + )} +
+ ); +} + +function MessageItem({ message, itemId, isHighlighted, getAgentModelInfo }) { + const [expanded, setExpanded] = useState(false); + const [showModal, setShowModal] = useState(false); + const [isHovering, setIsHovering] = useState(false); + + const colors = message.agent === 'Memory' ? MESSAGE_COLORS.memory : + getAgentColors(message.agentId, message.agent); + const title = message.agent === 'Memory' ? '记忆' : message.agent || 'AGENT'; + + const agentModelData = message.agentId && getAgentModelInfo ? + getAgentModelInfo(message.agentId) : + { modelName: null, modelProvider: null }; + const modelInfo = getModelIcon(agentModelData.modelName, agentModelData.modelProvider); + + const isAnalystAgent = isAnalyst(message.agentId, message.agent); + const isManagerAgent = isManager(message.agentId, message.agent); + const useModalView = isAnalystAgent || isManagerAgent; + + let content = message.content || ''; + if (typeof content === 'object') { + content = JSON.stringify(content, null, 2); + } else { + content = String(content); + } + + let displayContent = content; + let showExpandButton = false; + + if (useModalView) { + displayContent = content.length > 150 ? content.substring(0, 150) + '...' : content; + } else { + const needsTruncation = content.length > 200; + const MAX_EXPANDED_LENGTH = 8000; + + if (!expanded && needsTruncation) { + displayContent = content.substring(0, 200) + '...'; + showExpandButton = true; + } else if (expanded && content.length > MAX_EXPANDED_LENGTH) { + displayContent = content.substring(0, MAX_EXPANDED_LENGTH) + '...'; + showExpandButton = needsTruncation; + } else { + showExpandButton = needsTruncation; + } + } + + return ( + <> +
+
+ + {modelInfo.logoPath && message.agent !== 'Memory' && ( + {modelInfo.provider} + )} + {title} + + {formatTime(message.timestamp)} +
+ +
{stripMarkdown(displayContent)}
+ + {useModalView && ( + + )} + + {showExpandButton && ( + + )} +
+ {useModalView && ( + setShowModal(false)} + content={content} + agentName={message.agent} + reportType={isManagerAgent ? 'decision' : 'analysis'} + /> + )} + + ); +} diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx new file mode 100644 index 0000000..db1eee6 --- /dev/null +++ b/frontend/src/components/Header.jsx @@ -0,0 +1,253 @@ +import React, { useState } from 'react'; + +/** + * Header Component + * Reusable header brand with EvoTraders logo, GitHub link, and Contact Us section + * + * @param {Function} onEvoTradersClick - Optional callback when EvoTraders is clicked + * @param {string} evoTradersLinkStyle - Optional style variant: 'default' | 'close' + */ +export default function Header({ + onEvoTradersClick = null, + evoTradersLinkStyle = 'default' // 'default' shows ↗, 'close' shows ↙ +}) { + const [activeContactCard, setActiveContactCard] = useState({ yue: false, jiaji: false }); + const [clickedContactCard, setClickedContactCard] = useState(null); + + const handleEvoTradersClick = () => { + if (onEvoTradersClick) { + onEvoTradersClick(); + } + }; + + return ( +
+ + EvoTraders Logo + EvoTraders {evoTradersLinkStyle === 'close' ? ( + + ) : ( + + )} + + + + + + 开源 + + + + + + + agentscope-samples + + + + + + + + agentscope-ReMe + + + + + +
{ + const bothActive = activeContactCard.yue && activeContactCard.jiaji; + if (!bothActive) { + setActiveContactCard({ yue: true, jiaji: true }); + setClickedContactCard('both'); + } else { + setActiveContactCard({ yue: false, jiaji: false }); + setClickedContactCard(null); + } + }} + > + + 联系我们 + + + {/* Two contact buttons */} +
+
{ + e.stopPropagation(); + if (activeContactCard.yue) { + setActiveContactCard(prev => ({ ...prev, yue: false })); + if (clickedContactCard === 'yue' || clickedContactCard === 'both') { + setClickedContactCard(null); + } + } else { + setActiveContactCard(prev => ({ ...prev, yue: true })); + setClickedContactCard('yue'); + } + }} + onMouseEnter={() => { + if (!clickedContactCard || clickedContactCard === 'yue' || clickedContactCard === 'both') { + setActiveContactCard(prev => ({ ...prev, yue: true })); + } + }} + onMouseLeave={() => { + if (clickedContactCard !== 'yue' && clickedContactCard !== 'both') { + setActiveContactCard(prev => ({ ...prev, yue: false })); + } + }} + style={{ + padding: '4px 8px', + background: activeContactCard.yue ? '#615CED' : '#f5f5f5', + color: activeContactCard.yue ? '#fff' : '#333', + border: '1px solid', + borderColor: activeContactCard.yue ? '#615CED' : '#e0e0e0', + borderRadius: '3px', + fontSize: '10px', + fontWeight: 700, + fontFamily: "'IBM Plex Mono', monospace", + cursor: 'pointer', + transition: 'all 0.2s', + letterSpacing: '0.5px', + whiteSpace: 'nowrap', + overflow: 'hidden', + maxWidth: activeContactCard.yue ? '80px' : '32px', + minWidth: activeContactCard.yue ? '80px' : '32px' + }} + > + {activeContactCard.yue ? ( + e.stopPropagation()} + > + Yue Wu ↗ + + ) : 'YW'} +
+ +
{ + e.stopPropagation(); + if (activeContactCard.jiaji) { + setActiveContactCard(prev => ({ ...prev, jiaji: false })); + if (clickedContactCard === 'jiaji' || clickedContactCard === 'both') { + setClickedContactCard(null); + } + } else { + setActiveContactCard(prev => ({ ...prev, jiaji: true })); + setClickedContactCard('jiaji'); + } + }} + onMouseEnter={() => { + if (!clickedContactCard || clickedContactCard === 'jiaji' || clickedContactCard === 'both') { + setActiveContactCard(prev => ({ ...prev, jiaji: true })); + } + }} + onMouseLeave={() => { + if (clickedContactCard !== 'jiaji' && clickedContactCard !== 'both') { + setActiveContactCard(prev => ({ ...prev, jiaji: false })); + } + }} + style={{ + padding: '4px 8px', + background: activeContactCard.jiaji ? '#615CED' : '#f5f5f5', + color: activeContactCard.jiaji ? '#fff' : '#333', + border: '1px solid', + borderColor: activeContactCard.jiaji ? '#615CED' : '#e0e0e0', + borderRadius: '3px', + fontSize: '10px', + fontWeight: 700, + fontFamily: "'IBM Plex Mono', monospace", + cursor: 'pointer', + transition: 'all 0.2s', + letterSpacing: '0.5px', + whiteSpace: 'nowrap', + overflow: 'hidden', + maxWidth: activeContactCard.jiaji ? '100px' : '32px', + minWidth: activeContactCard.jiaji ? '100px' : '32px' + }} + > + {activeContactCard.jiaji ? ( + e.stopPropagation()} + > + Jiaji Deng ↗ + + ) : 'JD'} +
+
+
+
+ ); +} + diff --git a/frontend/src/components/MarkdownModal.jsx b/frontend/src/components/MarkdownModal.jsx new file mode 100644 index 0000000..0e7015d --- /dev/null +++ b/frontend/src/components/MarkdownModal.jsx @@ -0,0 +1,276 @@ +import React from 'react'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; + +function MarkdownModal({ isOpen, onClose, content, agentName, reportType = 'analysis' }) { + if (!isOpen) return null; + + const subtitle = reportType === 'decision' ? 'Decision Log' : 'Financial Analysis Report'; + + return ( +
+
e.stopPropagation()} + > + {/* Header */} +
+
+

+ {agentName} +

+

+ {subtitle} +

+
+ +
+ + {/* Content */} +
+ +
+ {content} +
+
+
+
+ ); +} + +export default MarkdownModal; + diff --git a/frontend/src/components/NetValueChart.jsx b/frontend/src/components/NetValueChart.jsx new file mode 100644 index 0000000..35bde68 --- /dev/null +++ b/frontend/src/components/NetValueChart.jsx @@ -0,0 +1,831 @@ +import React, { useMemo, useState, useEffect } from 'react'; +import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from 'recharts'; +import { formatNumber, formatFullNumber } from '../utils/formatters'; + +/** + * Helper function to get the start time of the most recent trading session + * Trading session: 22:30 - next day 05:00 + * @param {Date|null} virtualTime - Virtual time from server (for mock mode), or null to use real time + */ +function getRecentTradingSessionStart(virtualTime = null) { + // Use virtual time if provided (for mock mode), otherwise use real time + let now; + if (virtualTime) { + // Ensure virtualTime is a valid Date object + if (virtualTime instanceof Date && !isNaN(virtualTime.getTime())) { + now = virtualTime; + } else if (typeof virtualTime === 'string') { + now = new Date(virtualTime); + if (isNaN(now.getTime())) { + console.warn('Invalid virtualTime string, using current time:', virtualTime); + now = new Date(); + } + } else { + console.warn('Invalid virtualTime type, using current time:', typeof virtualTime); + now = new Date(); + } + } else { + now = new Date(); + } + + const currentHour = now.getHours(); + const currentMinute = now.getMinutes(); + + // Check if currently in trading session + const isInTradingSession = (currentHour === 22 && currentMinute >= 30) || + currentHour >= 23 || + (currentHour >= 0 && currentHour < 5) || + (currentHour === 5 && currentMinute === 0); + + let sessionStartTime; + if (isInTradingSession) { + // Currently in trading session, find today's 22:30 + sessionStartTime = new Date(now); + sessionStartTime.setHours(22, 30, 0, 0); + // If current time is before 22:30, it means yesterday's 22:30 + if (now < sessionStartTime) { + sessionStartTime.setDate(sessionStartTime.getDate() - 1); + } + } else { + // Not in trading session, find previous session start (yesterday 22:30) + sessionStartTime = new Date(now); + sessionStartTime.setDate(sessionStartTime.getDate() - 1); + sessionStartTime.setHours(22, 30, 0, 0); + } + + return sessionStartTime; +} + +/** + * Helper function to filter strategy data for live view + * NOTE: Live mode returns are now pre-processed by the backend, restricted to the + * latest trading session and already starting at 0% at session start. This helper + * is kept for potential future use but is no longer used in live mode. + */ +function filterStrategyDataForLive(strategyData, equity, sessionStartTime) { + if (!strategyData || strategyData.length === 0 || !equity || equity.length === 0) return []; + + try { + if (!sessionStartTime || isNaN(sessionStartTime.getTime())) { + console.warn('Invalid sessionStartTime in filterStrategyDataForLive'); + return []; + } + + const sessionStartTimestamp = sessionStartTime.getTime(); + + // Find the last index before session + let lastDataBeforeSession = null; + for (let i = equity.length - 1; i >= 0; i--) { + if (equity[i] && typeof equity[i].t === 'number' && equity[i].t < sessionStartTimestamp) { + if (strategyData[i] && strategyData[i].v !== undefined && strategyData[i].v !== null) { + lastDataBeforeSession = strategyData[i]; + } + break; + } + } + + // Find data points in the session + const sessionData = []; + for (let i = 0; i < equity.length; i++) { + if (equity[i] && typeof equity[i].t === 'number' && + equity[i].t >= sessionStartTimestamp && + strategyData[i] && + strategyData[i].v !== undefined && strategyData[i].v !== null) { + sessionData.push(strategyData[i]); + } + } + + // If we have a value before session and session data, add the start point + // Create a start point with timestamp just before session start + if (lastDataBeforeSession && sessionData.length > 0) { + const startPoint = { + t: sessionStartTimestamp - 1, + v: lastDataBeforeSession.v + }; + return [startPoint, ...sessionData]; + } + + return sessionData; + } catch (error) { + console.error('Error in filterStrategyDataForLive:', error); + return []; + } +} + +/** + * Net Value Chart Component + * Displays portfolio value over time with multiple strategy comparisons + */ +export default function NetValueChart({ equity, baseline, baseline_vw, momentum, strategies, equity_return, baseline_return, baseline_vw_return, momentum_return, chartTab = 'all', virtualTime = null }) { + const [activePoint, setActivePoint] = useState(null); + const [stableYRange, setStableYRange] = useState(null); + const [legendTooltip, setLegendTooltip] = useState(null); + + // Legend descriptions + const legendDescriptions = { + 'EvoTraders': 'EvoTraders is our agents investment strategy', + 'Buy & Hold (EW)': 'Equal Weight: Can be viewed as an equal-weighted index of all invested stocks', + 'Buy & Hold (VW)': 'Value Weighted: Can be viewed as a market-cap weighted index of all invested stocks', + 'Momentum': 'Momentum Strategy: Buy stocks that have performed well in the past', + }; + + + // For live mode, use cumulative returns calculated by backend + // For all mode, use portfolio values directly + const dataSource = useMemo(() => { + if (chartTab === 'live') { + return { + equity: equity_return || equity, + baseline: baseline_return || baseline, + baseline_vw: baseline_vw_return || baseline_vw, + momentum: momentum_return || momentum + }; + } + return { + equity: equity, + baseline: baseline, + baseline_vw: baseline_vw, + momentum: momentum + }; + }, [chartTab, equity, baseline, baseline_vw, momentum, equity_return, baseline_return, baseline_vw_return, momentum_return]); + // Filter equity data based on chartTab + const filteredEquity = useMemo(() => { + if (chartTab === 'all') { + const sourceEquity = dataSource.equity; + if (!sourceEquity || sourceEquity.length === 0) return []; + + // ALL chart: Show only the last point per day + // Logic: Keep the last equity value before 22:30 each day (the last equity value before US next trading day opens) + // Data after 22:30 belongs to the next trading day's session and is not shown in this chart + // Time handling: timestamp(ms) -> UTC -> Asia/Shanghai timezone, then group and filter based on Asia/Shanghai time + const dailyData = {}; + + sourceEquity.forEach((d) => { + // Timestamp is in milliseconds, first create UTC time, then convert to Asia/Shanghai timezone + // Equivalent to: pd.to_datetime(timestamp, unit='ms', utc=True).dt.tz_convert('Asia/Shanghai') + const utcDate = new Date(d.t); // timestamp(ms) -> UTC time + + // Use Intl API to get date/time components in Asia/Shanghai timezone + const formatter = new Intl.DateTimeFormat('en-US', { + timeZone: 'Asia/Shanghai', + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false + }); + + const parts = formatter.formatToParts(utcDate); + const year = parts.find(p => p.type === 'year').value; + const month = parts.find(p => p.type === 'month').value; + const day = parts.find(p => p.type === 'day').value; + const hour = parseInt(parts.find(p => p.type === 'hour').value); + const minute = parseInt(parts.find(p => p.type === 'minute').value); + + // Check if before 22:30 (Asia/Shanghai timezone) + const isBefore2230 = hour < 22 || (hour === 22 && minute < 30); + + // Only process data before 22:30 + if (isBefore2230) { + // Use Asia/Shanghai timezone date as key + const dateKey = `${year}-${month}-${day}`; + + // Update if this day has no data yet, or if current data is later in time + if (!dailyData[dateKey] || new Date(d.t) > new Date(dailyData[dateKey].t)) { + dailyData[dateKey] = d; + } + } + }); + + // Convert to array and sort by time + return Object.values(dailyData).sort((a, b) => a.t - b.t); + } else if (chartTab === 'live') { + // LIVE chart: Show all updates from the most recent trading session (22:30-05:00) + // Live mode: Backend has already returned return curves for "current trading session + 0% starting point", frontend can use directly + const sourceEquity = dataSource.equity; + if (!sourceEquity || sourceEquity.length === 0) return []; + return sourceEquity; + } + return dataSource.equity || []; + }, [dataSource.equity, chartTab, virtualTime]); + // Helper function to get daily indices for 'all' view + const getDailyIndices = useMemo(() => { + if (!equity || equity.length === 0) return new Set(); + const dailyIndices = new Set(); + const dailyData = {}; + + const formatter = new Intl.DateTimeFormat('en-US', { + timeZone: 'Asia/Shanghai', + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false + }); + + equity.forEach((d, idx) => { + const utcDate = new Date(d.t); + const parts = formatter.formatToParts(utcDate); + const hour = parseInt(parts.find(p => p.type === 'hour').value); + const minute = parseInt(parts.find(p => p.type === 'minute').value); + + // Check if before 22:30 (Asia/Shanghai timezone) + const isBefore2230 = hour < 22 || (hour === 22 && minute < 30); + + // Only process data before 22:30 + if (isBefore2230) { + const year = parts.find(p => p.type === 'year').value; + const month = parts.find(p => p.type === 'month').value; + const day = parts.find(p => p.type === 'day').value; + const dateKey = `${year}-${month}-${day}`; + + if (!dailyData[dateKey] || new Date(d.t) > new Date(dailyData[dateKey].t)) { + dailyData[dateKey] = { data: d, index: idx }; + } + } + }); + + Object.values(dailyData).forEach(({ index }) => dailyIndices.add(index)); + return dailyIndices; + }, [equity]); + + // Filter baseline, baseline_vw, momentum, strategies to match filteredEquity indices + const filteredBaseline = useMemo(() => { + const sourceBaseline = dataSource.baseline; + if (!sourceBaseline || sourceBaseline.length === 0 || !equity || equity.length === 0) return []; + if (chartTab === 'all') { + return sourceBaseline.filter((_, idx) => getDailyIndices.has(idx)); + } else if (chartTab === 'live') { + // Live mode: Use backend pre-processed baseline return curves directly + return sourceBaseline; + } + return sourceBaseline; + }, [dataSource.baseline, equity, chartTab, getDailyIndices, virtualTime]); + const filteredBaselineVw = useMemo(() => { + const sourceBaselineVw = dataSource.baseline_vw; + if (!sourceBaselineVw || sourceBaselineVw.length === 0 || !equity || equity.length === 0) return []; + if (chartTab === 'all') { + return sourceBaselineVw.filter((_, idx) => getDailyIndices.has(idx)); + } else if (chartTab === 'live') { + // Live mode: Use backend pre-processed baseline return curves directly + return sourceBaselineVw; + } + return sourceBaselineVw; + }, [dataSource.baseline_vw, equity, chartTab, getDailyIndices, virtualTime]); + const filteredMomentum = useMemo(() => { + const sourceMomentum = dataSource.momentum; + if (!sourceMomentum || sourceMomentum.length === 0 || !equity || equity.length === 0) return []; + if (chartTab === 'all') { + return sourceMomentum.filter((_, idx) => getDailyIndices.has(idx)); + } else if (chartTab === 'live') { + // Live mode: Use backend pre-processed momentum return curves directly + return sourceMomentum; + } + return sourceMomentum; + }, [dataSource.momentum, equity, chartTab, getDailyIndices, virtualTime]); + const filteredStrategies = useMemo(() => { + if (!strategies || strategies.length === 0 || !equity || equity.length === 0) return []; + if (chartTab === 'all') { + return strategies.filter((_, idx) => getDailyIndices.has(idx)); + } else if (chartTab === 'live') { + const sessionStartTime = getRecentTradingSessionStart(virtualTime); + return filterStrategyDataForLive(strategies, equity, sessionStartTime); + } + return strategies; + }, [strategies, equity, chartTab, getDailyIndices, virtualTime]); + + const chartData = useMemo(() => { + if (!filteredEquity || filteredEquity.length === 0) return []; + + try { + // LIVE mode: Align all curves by timestamp with forward filling to ensure consistent point counts and aligned starting points + if (chartTab === 'live') { + // Build timestamp -> value mapping + const toMap = (arr) => { + const m = new Map(); + if (Array.isArray(arr)) { + arr.forEach((p) => { + if (p && typeof p.t === 'number' && typeof p.v === 'number') { + m.set(p.t, p.v); + } + }); + } + return m; + }; + + const portfolioMap = toMap(filteredEquity); + const baselineMap = toMap(filteredBaseline); + const baselineVwMap = toMap(filteredBaselineVw); + const momentumMap = toMap(filteredMomentum); + const strategyMap = toMap(filteredStrategies); + + // Collect all timestamps, sort by time + const timestampSet = new Set(); + [filteredEquity, filteredBaseline, filteredBaselineVw, filteredMomentum, filteredStrategies].forEach(arr => { + if (Array.isArray(arr)) { + arr.forEach(p => { + if (p && typeof p.t === 'number') timestampSet.add(p.t); + }); + } + }); + + const timestamps = Array.from(timestampSet).sort((a, b) => a - b); + if (timestamps.length === 0) return []; + + // Current values for forward filling, initialized to 0% to ensure starting point alignment + let currentPortfolio = 0; + let currentBaseline = 0; + let currentBaselineVw = 0; + let currentMomentum = 0; + let currentStrategy = 0; + + return timestamps.map((t, idx) => { + if (portfolioMap.has(t)) currentPortfolio = portfolioMap.get(t); + if (baselineMap.has(t)) currentBaseline = baselineMap.get(t); + if (baselineVwMap.has(t)) currentBaselineVw = baselineVwMap.get(t); + if (momentumMap.has(t)) currentMomentum = momentumMap.get(t); + if (strategyMap.has(t)) currentStrategy = strategyMap.get(t); + + const date = new Date(t); + if (isNaN(date.getTime())) { + console.warn('Invalid timestamp in live chart data:', t); + return null; + } + + return { + index: idx, + time: + date.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + }) + + ' ' + + date.toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + hour12: false, + }), + timestamp: t, + portfolio: currentPortfolio, + baseline: currentBaseline, + baseline_vw: currentBaselineVw, + momentum: currentMomentum, + strategy: currentStrategy, + }; + }).filter(item => item !== null); + } + + // ALL mode: Keep the original index-based alignment logic + return filteredEquity.map((d, idx) => { + if (!d || typeof d.t !== 'number' || typeof d.v !== 'number') { + console.warn('Invalid equity data point:', d); + return null; + } + + const date = new Date(d.t); + if (isNaN(date.getTime())) { + console.warn('Invalid timestamp:', d.t); + return null; + } + + const baselineVal = filteredBaseline?.[idx] + ? (typeof filteredBaseline[idx] === 'object' ? filteredBaseline[idx].v : filteredBaseline[idx]) + : null; + const baselineVwVal = filteredBaselineVw?.[idx] + ? (typeof filteredBaselineVw[idx] === 'object' ? filteredBaselineVw[idx].v : filteredBaselineVw[idx]) + : null; + const momentumVal = filteredMomentum?.[idx] + ? (typeof filteredMomentum[idx] === 'object' ? filteredMomentum[idx].v : filteredMomentum[idx]) + : null; + const strategyVal = filteredStrategies?.[idx] + ? (typeof filteredStrategies[idx] === 'object' ? filteredStrategies[idx].v : filteredStrategies[idx]) + : null; + + return { + index: idx, + time: + date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }) + + ' ' + + date.toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + hour12: false, + }), + timestamp: d.t, + portfolio: d.v, + baseline: baselineVal || null, + baseline_vw: baselineVwVal || null, + momentum: momentumVal || null, + strategy: strategyVal || null, + }; + }).filter(item => item !== null); // Remove null entries + } catch (error) { + console.error('Error processing chart data:', error); + return []; + } + }, [filteredEquity, filteredBaseline, filteredBaselineVw, filteredMomentum, filteredStrategies, chartTab]); + + const { yMin, yMax, xTickIndices } = useMemo(() => { + if (chartData.length === 0) return { yMin: 0, yMax: 1, xTickIndices: [] }; + + // Calculate min and max from all series + const allValues = chartData.flatMap(d => + [d.portfolio, d.baseline, d.baseline_vw, d.momentum, d.strategy].filter(v => v !== null && isFinite(v)) + ); + + if (allValues.length === 0) { + return { yMin: 0, yMax: 1000000, xTickIndices: [] }; + } + + const dataMin = Math.min(...allValues); + const dataMax = Math.max(...allValues); + const range = dataMax - dataMin || 1; + + // For live mode (percentage data), use smaller padding and finer rounding + // For all mode (dollar amounts), use larger padding and coarser rounding + const isLiveMode = chartTab === 'live'; + + const paddingFactor = isLiveMode ? range * 0.15 : range * 0.03; + + let yMinCalc = dataMin - paddingFactor; + let yMaxCalc = dataMax + paddingFactor; + + // Smart rounding based on magnitude and mode + const magnitude = Math.max(Math.abs(yMinCalc), Math.abs(yMaxCalc)); + let roundTo; + + if (isLiveMode) { + // For percentage data, use much finer rounding + if (magnitude >= 100) { + roundTo = 10; + } else if (magnitude >= 10) { + roundTo = 1; + } else if (magnitude >= 1) { + roundTo = 0.1; + } else { + roundTo = 0.01; + } + } else { + // For dollar amounts, use coarser rounding + if (magnitude >= 1e6) { + roundTo = 10000; + } else if (magnitude >= 1e5) { + roundTo = 5000; + } else if (magnitude >= 1e4) { + roundTo = 1000; + } else { + roundTo = 100; + } + } + + yMinCalc = Math.floor(yMinCalc / roundTo) * roundTo; + yMaxCalc = Math.ceil(yMaxCalc / roundTo) * roundTo; + + // Stable range to prevent frequent updates + if (stableYRange) { + const { min: stableMin, max: stableMax } = stableYRange; + const stableRange = stableMax - stableMin; + const threshold = stableRange * 0.05; + + const needsUpdate = + dataMin < (stableMin + threshold) || + dataMax > (stableMax - threshold); + + if (!needsUpdate) { + yMinCalc = stableMin; + yMaxCalc = stableMax; + } + } + + // Calculate x-axis tick indices + const safeLength = Math.min(chartData.length, 10000); + const targetTicks = Math.min(8, Math.max(5, Math.floor(safeLength / 10))); + const step = Math.max(1, Math.floor(safeLength / (targetTicks - 1))); + + const indices = []; + for (let i = 0; i < safeLength && indices.length < 100; i += step) { + indices.push(i); + } + + if (safeLength > 0 && indices[indices.length - 1] !== safeLength - 1) { + indices.push(safeLength - 1); + } + + return { yMin: yMinCalc, yMax: yMaxCalc, xTickIndices: indices }; + }, [chartData, stableYRange]); + + // Update stableYRange in useEffect to avoid infinite re-renders + // Use functional update to avoid dependency on stableYRange + useEffect(() => { + if (yMin !== undefined && yMax !== undefined && yMin !== null && yMax !== null && isFinite(yMin) && isFinite(yMax)) { + setStableYRange(prevRange => { + if (!prevRange) { + // Initialize stable range + return { min: yMin, max: yMax }; + } else { + // Check if update is needed (5% threshold) + const stableRange = prevRange.max - prevRange.min; + const threshold = stableRange * 0.05; + const needsUpdate = + yMin < (prevRange.min + threshold) || + yMax > (prevRange.max - threshold); + + if (needsUpdate) { + return { min: yMin, max: yMax }; + } + // No update needed, return previous range + return prevRange; + } + }); + } + }, [yMin, yMax]); + + if (!equity || equity.length === 0) { + return ( +
+ NO DATA AVAILABLE +
+ ); + } + + const CustomTooltip = ({ active, payload }) => { + if (active && payload && payload.length) { + const isLiveMode = chartTab === 'live'; + return ( +
+
+ {payload[0].payload.time} +
+ {payload.map((entry, index) => ( +
+ {entry.name}: {isLiveMode ? `${entry.value.toFixed(2)}%` : `$${formatNumber(entry.value)}`}
+ ))} +
+ ); + } + return null; + }; + + const CustomDot = ({ dataKey, ...props }) => { + const { cx, cy, payload, index } = props; + const isActive = activePoint === index; + const isLastPoint = index === chartData.length - 1; + + // Only show dot for the last point + if (!isLastPoint) { + return null; + } + const colors = { + portfolio: '#00C853', + baseline: '#FF6B00', + baseline_vw: '#9C27B0', + momentum: '#2196F3', + strategy: '#795548' + }; + + return ( + setActivePoint(index)} + onMouseLeave={() => setActivePoint(null)} + onClick={() => console.log('Clicked point:', { dataKey, ...payload })} + /> + ); + }; + + const CustomXAxisTick = ({ x, y, payload }) => { + const shouldShow = xTickIndices.includes(payload.index); + if (!shouldShow) return null; + + return ( + + + {payload.value} + + + ); + }; + + const CustomLegend = ({ payload }) => { + if (!payload || payload.length === 0) return null; + + return ( +
+ {payload.map((entry, index) => { + const description = legendDescriptions[entry.value] || ''; + const isActive = legendTooltip === entry.value; + + return ( +
setLegendTooltip(entry.value)} + onMouseLeave={() => setLegendTooltip(null)} + onClick={(e) => { + e.stopPropagation(); + setLegendTooltip(isActive ? null : entry.value); + }} + > +
+ + {entry.value} + + {isActive && description && ( +
+ {description} +
+ )} +
+ ); + })} +
+ ); + }; + + return ( + + + } + interval={0} + /> + chartTab === 'live' ? `${value.toFixed(2)}%` : formatFullNumber(value)} + width={75} + /> + } /> + } + /> + + {/* Portfolio line */} + } + activeDot={{ r: 6, stroke: '#ffffff', strokeWidth: 2 }} + isAnimationActive={false} + /> + + {/* Baseline Equal Weight */} + {baseline && baseline.length > 0 && ( + } + activeDot={{ r: 6, stroke: '#ffffff', strokeWidth: 2 }} + isAnimationActive={false} + /> + )} + + {/* Baseline Value Weighted */} + {baseline_vw && baseline_vw.length > 0 && ( + } + activeDot={{ r: 6, stroke: '#ffffff', strokeWidth: 2 }} + isAnimationActive={false} + /> + )} + + {/* Momentum Strategy */} + {momentum && momentum.length > 0 && ( + } + activeDot={{ r: 6, stroke: '#ffffff', strokeWidth: 2 }} + isAnimationActive={false} + /> + )} + + {/* Other Strategies */} + {strategies && strategies.length > 0 && ( + } + activeDot={{ r: 6, stroke: '#ffffff', strokeWidth: 2 }} + isAnimationActive={false} + /> + )} + + + ); +} + diff --git a/frontend/src/components/PerformanceView.jsx b/frontend/src/components/PerformanceView.jsx new file mode 100644 index 0000000..8aea55e --- /dev/null +++ b/frontend/src/components/PerformanceView.jsx @@ -0,0 +1,236 @@ +import React from 'react'; + +/** + * Performance View Component + * Displays agent performance leaderboard and signal history + */ +export default function PerformanceView({ leaderboard }) { + const rankedAgents = Array.isArray(leaderboard) + ? leaderboard.filter(agent => agent.agentId !== 'risk_manager') + : []; + return ( +
+ {/* Agent Performance Section */} +
+
+

Agent Performance - Signal Accuracy

+
+ + {rankedAgents.length === 0 ? ( +
No leaderboard data available
+ ) : ( +
+ + + + + + + + + + + + + + + {rankedAgents.map(agent => { + const bullTotal = agent.bull?.n || 0; + const bullWins = agent.bull?.win || 0; + const bullUnknown = agent.bull?.unknown || 0; + const bearTotal = agent.bear?.n || 0; + const bearWins = agent.bear?.win || 0; + const bearUnknown = agent.bear?.unknown || 0; + const totalSignals = bullTotal + bearTotal; + const evaluatedBull = Math.max(bullTotal - bullUnknown, 0); + const evaluatedBear = Math.max(bearTotal - bearUnknown, 0); + const evaluatedTotal = evaluatedBull + evaluatedBear; + const bullWinRate = evaluatedBull > 0 ? (bullWins / evaluatedBull) : null; + const bearWinRate = evaluatedBear > 0 ? (bearWins / evaluatedBear) : null; + const overallWinRate = agent.winRate != null + ? agent.winRate + : (evaluatedTotal > 0 ? ((bullWins + bearWins) / evaluatedTotal) : null); + const overallColor = overallWinRate != null + ? (overallWinRate >= 0.5 ? '#00C853' : '#FF1744') + : '#999999'; + + return ( + + + + + + + + + + + ); + })} + +
RankAgentWin RateBull SignalsBull Win RateBear SignalsBear Win RateTotal Signals
+ + {agent.rank === 1 ? '★ 1' : agent.rank} + + +
{agent.name}
+
{agent.role}
+
+ {overallWinRate != null ? `${(overallWinRate * 100).toFixed(1)}%` : 'N/A'} + +
{bullTotal} signals
+
{bullWins} wins
+ {bullUnknown > 0 && ( +
{bullUnknown} unknown
+ )} +
= 0.5 ? '#00C853' : '#999999') : '#999999' }}> + {bullWinRate != null ? `${(bullWinRate * 100).toFixed(1)}%` : 'N/A'} + +
{bearTotal} signals
+
{bearWins} wins
+ {bearUnknown > 0 && ( +
{bearUnknown} unknown
+ )} +
= 0.5 ? '#00C853' : '#999999') : '#999999' }}> + {bearWinRate != null ? `${(bearWinRate * 100).toFixed(1)}%` : 'N/A'} + {totalSignals}
+
+ )} +
+ + {/* Signal History with Dates */} + {rankedAgents.length > 0 && rankedAgents.some(agent => agent.signals && agent.signals.length > 0) && ( +
+
+

Signal History

+
+ +
+ {rankedAgents.map(agent => { + if (!agent.signals || agent.signals.length === 0) return null; + + // Sort by date descending (newest first) + const sortedSignals = [...agent.signals].sort((a, b) => + new Date(b.date).getTime() - new Date(a.date).getTime() + ); + + return ( +
+
+ {agent.name} +
+
+ {sortedSignals.map((signal, idx) => { + const signalType = signal.signal.toLowerCase(); + const isBull = signalType.includes('bull') || signalType === 'long'; + const isBear = signalType.includes('bear') || signalType === 'short'; + const isNeutral = signalType.includes('neutral') || signalType === 'hold'; + const resultStatus = signal.is_correct; + const isCorrect = resultStatus === true; + const isResultUnknown = resultStatus === 'unknown' || resultStatus === null || typeof resultStatus === 'undefined'; + const realReturnValue = signal.real_return; + const hasRealReturn = typeof realReturnValue === 'number' && Number.isFinite(realReturnValue); + const realReturnDisplay = hasRealReturn + ? `${realReturnValue >= 0 ? '+' : ''}${(realReturnValue * 100).toFixed(2)}%` + : 'Unknown'; + const realReturnColor = hasRealReturn + ? (realReturnValue >= 0 ? '#00C853' : '#FF1744') + : '#999999'; + const statusColor = isResultUnknown ? '#999999' : (isCorrect ? '#00C853' : '#FF1744'); + const statusSymbol = isResultUnknown ? '?' : (isCorrect ? '✓' : '✗'); + + return ( +
+
+ + {signal.date} + + + {signal.ticker} + + + {isBull ? 'Bull' : isBear ? 'Bear' : 'Neutral'} + + {!isNeutral && ( + + {realReturnDisplay} + + )} +
+ {!isNeutral && ( + + {statusSymbol} + + )} +
+ ); + })} +
+
+ Total: {sortedSignals.length} signals +
+
+ ); + })} +
+
+ )} +
+ ); +} + diff --git a/frontend/src/components/RoomView.jsx b/frontend/src/components/RoomView.jsx new file mode 100644 index 0000000..7bded68 --- /dev/null +++ b/frontend/src/components/RoomView.jsx @@ -0,0 +1,770 @@ +import React, { useEffect, useMemo, useRef, useState, useCallback } from 'react'; +import { ASSETS, SCENE_NATIVE, AGENT_SEATS, AGENTS } from '../config/constants'; +import AgentCard from './AgentCard'; +import { getModelIcon } from '../utils/modelIcons'; + +/** + * Custom hook to load an image + */ +function useImage(src) { + const [img, setImg] = useState(null); + useEffect(() => { + if (!src) { + setImg(null); + return; + } + // Reset image state when backend changes + setImg(null); + const image = new Image(); + image.src = src; + image.onload = () => setImg(image); + image.onerror = () => { + console.error(`Failed to load image: ${src}`); + setImg(null); + }; + // Cleanup: cancel loading if backend changes + return () => { + image.onload = null; + image.onerror = null; + }; + }, [src]); + return img; +} + +/** + * Get rank medal/trophy for display + */ +function getRankMedal(rank) { + if (rank === 1) return '🏆'; + if (rank === 2) return '🥈'; + if (rank === 3) return '🥉'; + return null; +} + +/** + * Room View Component + * Displays the conference room with agents, speech bubbles, and agent cards + * Supports click and hover (1.5s) to show agent performance cards + * Supports replay mode - completely independent from live mode + */ +export default function RoomView({ bubbles, bubbleFor, leaderboard, feed, onJumpToMessage }) { + const canvasRef = useRef(null); + const containerRef = useRef(null); + + // Agent selection and hover state + const [selectedAgent, setSelectedAgent] = useState(null); + const [hoveredAgent, setHoveredAgent] = useState(null); + const [isClosing, setIsClosing] = useState(false); + const hoverTimerRef = useRef(null); + const closeTimerRef = useRef(null); + + // Bubble expansion state + const [expandedBubbles, setExpandedBubbles] = useState({}); + + // Hidden bubbles (locally dismissed) + const [hiddenBubbles, setHiddenBubbles] = useState({}); + + // Handle bubble close + const handleCloseBubble = (agentId, bubbleKey, e) => { + e.stopPropagation(); + setHiddenBubbles(prev => ({ + ...prev, + [bubbleKey]: true + })); + }; + + // Replay state (must be defined before using in useMemo) + const [isReplaying, setIsReplaying] = useState(false); + const [replayBubbles, setReplayBubbles] = useState({}); + const [modeTransition, setModeTransition] = useState(null); // 'entering-replay' | 'exiting-replay' | null + const [isPaused, setIsPaused] = useState(false); + const replayTimerRef = useRef(null); + const replayTimeoutsRef = useRef([]); + const replayStateRef = useRef({ messages: [], currentIndex: 0 }); + + // Background image + const roomBgSrc = ASSETS.roomBg; + + const bgImg = useImage(roomBgSrc); + + // Calculate scale to fit canvas in container (80% of available space) + const [scale, setScale] = useState(0.8); + + useEffect(() => { + const updateScale = () => { + const container = containerRef.current; + if (!container) return; + + const { clientWidth, clientHeight } = container; + if (clientWidth <= 0 || clientHeight <= 0) return; + + const scaleX = clientWidth / SCENE_NATIVE.width; + const scaleY = clientHeight / SCENE_NATIVE.height; + const newScale = Math.min(scaleX, scaleY, 1.0) * 0.8; // Scale to 80% of original size + setScale(Math.max(0.3, newScale)); + }; + + updateScale(); + const resizeObserver = new ResizeObserver(updateScale); + if (containerRef.current) { + resizeObserver.observe(containerRef.current); + } + window.addEventListener('resize', updateScale); + + return () => { + resizeObserver.disconnect(); + window.removeEventListener('resize', updateScale); + }; + }, []); + + // Set canvas size + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + canvas.width = SCENE_NATIVE.width; + canvas.height = SCENE_NATIVE.height; + + const displayWidth = Math.round(SCENE_NATIVE.width * scale); + const displayHeight = Math.round(SCENE_NATIVE.height * scale); + canvas.style.width = `${displayWidth}px`; + canvas.style.height = `${displayHeight}px`; + }, [scale]); + + // Draw room background + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const ctx = canvas.getContext('2d'); + ctx.imageSmoothingEnabled = false; + + // Clear canvas first + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // Draw image if loaded + if (bgImg) { + ctx.drawImage(bgImg, 0, 0, SCENE_NATIVE.width, SCENE_NATIVE.height); + } + }, [bgImg, scale, roomBgSrc]); + + // Determine which agents are speaking + const speakingAgents = useMemo(() => { + const speaking = {}; + AGENTS.forEach(agent => { + const bubble = bubbleFor(agent.name); + speaking[agent.id] = !!bubble; + }); + return speaking; + }, [bubbles, bubbleFor]); + + // Find agent data from leaderboard + const getAgentData = (agentId) => { + const agent = AGENTS.find(a => a.id === agentId); + if (!agent) return null; + + // If no leaderboard data, return agent with default stats + if (!leaderboard || !Array.isArray(leaderboard)) { + return { + ...agent, + bull: { n: 0, win: 0, unknown: 0 }, + bear: { n: 0, win: 0, unknown: 0 }, + winRate: null, + signals: [], + rank: null + }; + } + + const leaderboardData = leaderboard.find(lb => lb.agentId === agentId); + + // If agent not in leaderboard, return agent with default stats + if (!leaderboardData) { + return { + ...agent, + bull: { n: 0, win: 0, unknown: 0 }, + bear: { n: 0, win: 0, unknown: 0 }, + winRate: null, + signals: [], + rank: null + }; + } + + // Merge data but preserve the correct avatar from AGENTS config + return { + ...agent, + ...leaderboardData, + avatar: agent.avatar // Always use the frontend's avatar URL + }; + }; + + // Get agent rank for display + const getAgentRank = (agentId) => { + const agentData = getAgentData(agentId); + return agentData?.rank || null; + }; + + // Handle agent click + const handleAgentClick = (agentId) => { + // Cancel any closing animation + if (closeTimerRef.current) { + clearTimeout(closeTimerRef.current); + closeTimerRef.current = null; + } + setIsClosing(false); + + const agentData = getAgentData(agentId); + if (agentData) { + setSelectedAgent(agentData); + } + }; + + // Handle agent hover + const handleAgentMouseEnter = (agentId) => { + setHoveredAgent(agentId); + // Clear any existing timer + if (hoverTimerRef.current) { + clearTimeout(hoverTimerRef.current); + hoverTimerRef.current = null; + } + // Cancel any closing animation + if (closeTimerRef.current) { + clearTimeout(closeTimerRef.current); + closeTimerRef.current = null; + } + setIsClosing(false); + + // If there's already a selected agent, switch immediately + // Otherwise, show after a short delay (0ms = immediate) + const agentData = getAgentData(agentId); + if (agentData) { + if (selectedAgent) { + // Already have a card open, switch immediately + setSelectedAgent(agentData); + } else { + // No card open, show after delay (currently 0ms = immediate) + hoverTimerRef.current = setTimeout(() => { + setSelectedAgent(agentData); + hoverTimerRef.current = null; + }, 0); + } + } + }; + + const handleAgentMouseLeave = () => { + setHoveredAgent(null); + // Clear timer if mouse leaves before 1.5 seconds + if (hoverTimerRef.current) { + clearTimeout(hoverTimerRef.current); + hoverTimerRef.current = null; + } + }; + + // Handle closing with animation + const handleClose = () => { + setIsClosing(true); + // Wait for animation to complete before removing + closeTimerRef.current = setTimeout(() => { + setSelectedAgent(null); + setIsClosing(false); + closeTimerRef.current = null; + }, 200); // Match the slideUp animation duration + }; + + // Cleanup timer on unmount + useEffect(() => { + return () => { + if (hoverTimerRef.current) { + clearTimeout(hoverTimerRef.current); + } + if (closeTimerRef.current) { + clearTimeout(closeTimerRef.current); + } + // Clean up replay timers + if (replayTimerRef.current) { + clearTimeout(replayTimerRef.current); + } + replayTimeoutsRef.current.forEach(timeoutId => clearTimeout(timeoutId)); + replayTimeoutsRef.current = []; + }; + }, []); + + // Show replay button when not in replay mode and has feed history + const showReplayButton = !isReplaying && feed && feed.length > 0; + + // Start replay with feed data + const handleReplayClick = useCallback(() => { + if (!feed || feed.length === 0) { + return; + } + startReplay(feed); + }, [feed]); + + // Extract agent messages from feed items + const extractAgentMessages = useCallback((feedItems) => { + const messages = []; + + feedItems.forEach((item, itemIndex) => { + if (item.type === 'message' && item.data) { + const msg = item.data; + // Skip system messages + if (msg.agent === 'System') return; + // Find matching agent + const agent = AGENTS.find(a => + a.id === msg.agentId || + a.name === msg.agent + ); + if (agent) { + messages.push({ + feedItemId: item.id, + agentId: agent.id, + agentName: agent.name, + content: msg.content, + timestamp: msg.timestamp + }); + } + } else if (item.type === 'conference' && item.data?.messages) { + item.data.messages.forEach((msg, msgIndex) => { + if (msg.agent === 'System') return; + const agent = AGENTS.find(a => + a.id === msg.agentId || + a.name === msg.agent + ); + if (agent) { + messages.push({ + feedItemId: item.id, + agentId: agent.id, + agentName: agent.name, + content: msg.content, + timestamp: msg.timestamp + }); + } + }); + } + }); + + return messages; + }, []); + + // Show next message in replay + const showNextMessage = useCallback(() => { + const { messages, currentIndex } = replayStateRef.current; + if (currentIndex >= messages.length) { + // End replay + setModeTransition('exiting-replay'); + setTimeout(() => { + setModeTransition(null); + setIsReplaying(false); + setIsPaused(false); + setReplayBubbles({}); + replayStateRef.current = { messages: [], currentIndex: 0 }; + }, 500); + return; + } + + const msg = messages[currentIndex]; + const bubbleId = `replay_${msg.agentId}_${currentIndex}`; + + setReplayBubbles(prev => ({ + ...prev, + [bubbleId]: { + id: bubbleId, + feedItemId: msg.feedItemId, + agentId: msg.agentId, + agentName: msg.agentName, + text: msg.content, + timestamp: msg.timestamp, + ts: msg.timestamp + } + })); + + // Remove bubble after 10 seconds (previously 5s) to keep replay text visible longer + const hideTimeout = setTimeout(() => { + setReplayBubbles(prev => { + const newBubbles = { ...prev }; + delete newBubbles[bubbleId]; + return newBubbles; + }); + }, 10000); + replayTimeoutsRef.current.push(hideTimeout); + + // Schedule next message + replayStateRef.current.currentIndex = currentIndex + 1; + // Wait longer before next bubble to match extended visibility (was 3s) + const nextTimeout = setTimeout(() => { + showNextMessage(); + }, 6000); + replayTimerRef.current = nextTimeout; + replayTimeoutsRef.current.push(nextTimeout); + }, []); + + // Start replay with feed data + const startReplay = useCallback((feedItems) => { + if (!feedItems || feedItems.length === 0) { + return; + } + + const agentMessages = extractAgentMessages(feedItems).reverse(); + if (agentMessages.length === 0) { + return; + } + + // Store messages for pause/resume + replayStateRef.current = { messages: agentMessages, currentIndex: 0 }; + + // Start transition animation + setModeTransition('entering-replay'); + setIsReplaying(true); + setIsPaused(false); + setReplayBubbles({}); + + // Clear any existing timeouts + replayTimeoutsRef.current.forEach(timeoutId => clearTimeout(timeoutId)); + replayTimeoutsRef.current = []; + + // Clear transition and start replay after animation completes + setTimeout(() => { + setModeTransition(null); + showNextMessage(); + }, 500); + }, [extractAgentMessages, showNextMessage]); + + // Pause replay + const pauseReplay = useCallback(() => { + if (replayTimerRef.current) { + clearTimeout(replayTimerRef.current); + replayTimerRef.current = null; + } + setIsPaused(true); + }, []); + + // Resume replay + const resumeReplay = useCallback(() => { + setIsPaused(false); + showNextMessage(); + }, [showNextMessage]); + + // Stop replay + const stopReplay = useCallback(() => { + // Clear all timeouts + replayTimeoutsRef.current.forEach(timeoutId => clearTimeout(timeoutId)); + replayTimeoutsRef.current = []; + + if (replayTimerRef.current) { + clearTimeout(replayTimerRef.current); + replayTimerRef.current = null; + } + + // Transition out of replay mode + setModeTransition('exiting-replay'); + // Clear transition and replay state after animation completes + setTimeout(() => { + setModeTransition(null); + setIsReplaying(false); + setIsPaused(false); + setReplayBubbles({}); + replayStateRef.current = { messages: [], currentIndex: 0 }; + }, 500); + }, []); + + // Get bubble for specific agent (supports both live and replay mode) + const getBubbleForAgent = useCallback((agentName) => { + if (isReplaying) { + // Find replay bubble for this agent + const bubble = Object.values(replayBubbles).find(b => { + const agent = AGENTS.find(a => a.id === b.agentId); + return agent && agent.name === agentName; + }); + return bubble || null; + } else { + // Use normal bubbleFor function + return bubbleFor(agentName); + } + }, [isReplaying, replayBubbles, bubbleFor]); + + return ( +
+ {/* Agents Indicator Bar */} +
+ {AGENTS.map((agent, index) => { + const rank = getAgentRank(agent.id); + const medal = rank ? getRankMedal(rank) : null; + const agentData = getAgentData(agent.id); + const modelInfo = getModelIcon(agentData?.modelName, agentData?.modelProvider); + + return ( + +
handleAgentClick(agent.id)} + onMouseEnter={() => handleAgentMouseEnter(agent.id)} + onMouseLeave={handleAgentMouseLeave} + > +
+ {agent.name} + + {medal && ( + + {medal} + + )} + {modelInfo.logoPath && ( + {modelInfo.provider} + )} +
+ {agent.name} +
+ {/* Divider after Risk Manager (index 1) */} + {index === 1 && ( +
+ )} + + ); + })} + + {/* Hint Text */} +
+ 点击头像查看详情 +
+
+ + {/* Room Canvas */} +
+
+
+ + + {/* Speech Bubbles */} + {AGENTS.map((agent, idx) => { + const bubble = getBubbleForAgent(agent.name); + if (!bubble) return null; + + const bubbleKey = `${agent.id}_${bubble.timestamp || bubble.id || bubble.ts}`; + + // Check if bubble is hidden + if (hiddenBubbles[bubbleKey]) return null; + + const pos = AGENT_SEATS[idx]; + const scaledWidth = SCENE_NATIVE.width * scale; + const scaledHeight = SCENE_NATIVE.height * scale; + + // Bubble left-bottom corner aligns to agent position + const left = Math.round(pos.x * scaledWidth); + const bottom = Math.round(pos.y * scaledHeight); + + // Get agent data for model info + const agentData = getAgentData(agent.id); + const modelInfo = getModelIcon(agentData?.modelName, agentData?.modelProvider); + + // Truncate long text - 200 collapsed, 500 expanded max + const maxLength = 200; + const maxExpandedLength = 500; + const isTruncated = bubble.text.length > maxLength; + const isExpanded = expandedBubbles[bubbleKey]; + const displayText = (!isExpanded && isTruncated) + ? bubble.text.substring(0, maxLength) + '...' + : (isExpanded && bubble.text.length > maxExpandedLength) + ? bubble.text.substring(0, maxExpandedLength) + '...' + : bubble.text; + + const toggleExpand = (e) => { + e.stopPropagation(); + setExpandedBubbles(prev => ({ + ...prev, + [bubbleKey]: !prev[bubbleKey] + })); + }; + + const handleJumpToFeed = (e) => { + e.stopPropagation(); + if (onJumpToMessage) { + onJumpToMessage(bubble); + } + }; + + return ( +
+ {/* Action buttons */} +
+ + +
+ + {/* Agent header with model icon */} +
+ {modelInfo.logoPath && ( + {modelInfo.provider} + )} +
{bubble.agentName || agent.name}
+
+ +
+ + {/* Message content */} +
+ {displayText} + {isTruncated && ( + + )} +
+
+ ); + })} +
+
+ + {/* Agent Card - Dropdown style below indicator bar */} + {selectedAgent && ( + <> + {/* Transparent overlay to close card */} +
+ + {/* Agent Card */} + + + )} + + {/* Mode Transition Overlay - sweeps in the dark gradient */} + {modeTransition === 'entering-replay' && ( +
+ )} + + {/* Mode Transition Overlay - sweeps out the dark gradient */} + {modeTransition === 'exiting-replay' && ( +
+ )} + + {/* Replay Button */} + {showReplayButton && ( +
+ +
+ )} + + {/* Replay Mode Background + Indicator */} + {isReplaying && !modeTransition && ( + <> +
+
+ {isPaused ? '已暂停' : '回放模式'} + + +
+ + )} +
+
+ ); +} + diff --git a/frontend/src/components/RulesView.jsx b/frontend/src/components/RulesView.jsx new file mode 100644 index 0000000..ec67958 --- /dev/null +++ b/frontend/src/components/RulesView.jsx @@ -0,0 +1,483 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { LLM_MODEL_LOGOS } from '../config/constants'; + +export default function RulesView() { + const [language, setLanguage] = useState('en'); // 'en' or 'zh' + const [scale, setScale] = useState(1); + const containerRef = useRef(null); + const contentRef = useRef(null); + + // Auto-scale content to fit container without scrolling + useEffect(() => { + const handleResize = () => { + if (containerRef.current && contentRef.current) { + const containerHeight = containerRef.current.clientHeight; + const contentHeight = contentRef.current.scrollHeight; + + if (contentHeight > containerHeight) { + const newScale = containerHeight / contentHeight; + setScale(Math.max(newScale * 0.95, 0.5)); // Min scale 0.5, with 95% of available space + } else { + setScale(1); + } + } + }; + + // Initial resize + handleResize(); + + // Listen to window resize + window.addEventListener('resize', handleResize); + + // Observe content changes + const observer = new ResizeObserver(handleResize); + if (contentRef.current) { + observer.observe(contentRef.current); + } + + return () => { + window.removeEventListener('resize', handleResize); + observer.disconnect(); + }; + }, [language]); + + const containerStyle = { + width: '100%', + height: '100%', + overflow: 'hidden', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: '#FFFFFF', + padding: '10px' + }; + + const contentWrapperStyle = { + transform: `scale(${scale})`, + transformOrigin: 'center center', + transition: 'transform 0.3s ease', + width: '100%', + maxWidth: '900px' + }; + + const innerContentStyle = { + color: '#000000', + fontFamily: "'IBM Plex Mono', monospace", + fontSize: '13px', + lineHeight: '1.6', + letterSpacing: '0.01em', + padding: '0 10px' + }; + + const highlight = { + color: '#000000', + fontWeight: 700 + }; + + const sectionTitleStyle = { + color: '#615CED', + fontSize: '16px', + fontWeight: 700, + marginBottom: '8px', + marginTop: '12px', + marginLeft: '-10px', + marginRight: '-10px', + width: 'calc(100% + 20px)', + padding: '8px 10px', + backgroundColor: '#FFFFFF', + letterSpacing: '0.5px', + boxSizing: 'border-box' + }; + + const subsectionStyle = { + marginBottom: '8px', + paddingLeft: '10px', + borderLeft: '2px solid #CCCCCC' + }; + + const linkStyle = { + color: '#615CED', + textDecoration: 'none', + borderBottom: '1px solid #615CED', + transition: 'all 0.2s' + }; + + const languageSwitchStyle = { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + marginBottom: '12px', + gap: '0px', + fontSize: '11px', + fontFamily: "'IBM Plex Mono', monospace" + }; + + const getLangStyle = (isActive) => ({ + padding: '4px 10px', + cursor: 'pointer', + transition: 'all 0.2s', + background: isActive ? '#000000' : 'transparent', + color: isActive ? '#FFFFFF' : '#666666', + border: 'none', + borderRadius: '2px' + }); + + const llmLogos = [ + { name: 'Alibaba', file: 'Alibaba.jpeg', label: 'Qwen', url: LLM_MODEL_LOGOS['Alibaba'] }, + { name: 'DeepSeek', file: 'DeepSeek.png', label: 'DeepSeek', url: LLM_MODEL_LOGOS['DeepSeek'] }, + { name: 'Moonshot', file: 'Moonshot.jpeg', label: 'Moonshot', url: LLM_MODEL_LOGOS['Moonshot'] }, + { name: 'Zhipu AI', file: 'Zhipu AI.png', label: 'Zhipu AI', url: LLM_MODEL_LOGOS['Zhipu AI'] } + ]; + + const content = { + en: { + section1Title: "Agent Setup", + pmRole: "Portfolio Manager", + pmDesc: "Makes final trading decisions and orchestrates team collaboration", + rmRole: "Risk Manager", + rmDesc: "Monitors portfolio risk and enforces risk limits", + analystsRole: "Analysts", + analystsDesc: "Conduct specialized research with different tools and AI models:", + analysts: [ + { name: "Valuation Analyst", model: "Moonshot", modelKey: "Moonshot" }, + { name: "Sentiment Analyst", model: "Qwen", modelKey: "Alibaba" }, + { name: "Fundamentals Analyst", model: "DeepSeek", modelKey: "DeepSeek" }, + { name: "Technical Analyst", model: "Zhipu AI", modelKey: "Zhipu AI" } + ], + + section2Title: "Agent Decision Mechanism", + + tradingProcess: "Daily Trading Process", + tradingDesc: "Agents trade on a daily frequency while continuously tracking portfolio performance. Before each day's final trading decision, agents go through three key phases:", + + analysisPhase: "• Analysis Phase", + analysisDesc: "All agents independently analyze information and form judgments based on their specialized tools.", + + communicationPhase: "• Communication Phase", + commIntro: "Multiple communication channels enable effective collaboration: 1v1 Private Chat / 1vN Notification / NvN Conference", + + decisionPhase: "• Decision Phase", + decisionDesc: "Portfolio Manager aggregates all information and makes the final team trading decision. The original trading signals from analysts are only used for individual-level ranking.", + + reflectionTitle: "Learning & Evolution", + reflectionDesc: "Agents reflect on daily investment performance, summarize insights, and store them in ", + remeLink: "ReMe", + reflectionDesc2: " memory framework for continuous improvement.", + + section3Title: "Performance Evaluation", + + chartTitle: "• Performance Chart", + chartDesc: "Track portfolio equity curve vs. benchmarks (equal-weight, value-weighted, momentum). Use this to assess overall strategy effectiveness.", + + rankingTitle: "• Analyst Rankings", + rankingDesc: "Click avatars in Trading Room to view analyst performance (Win Rate, Bull/Bear Win Rate). Use this to understand which analysts provide the most valuable insights.", + + statsTitle: "• Statistics", + statsDesc: "Detailed holdings and trade history. Use this for in-depth analysis of position management and execution quality.", + + callToAction: "Fork on ", + repoLink: "GitHub", + callToAction2: " to customize!" + }, + zh: { + section1Title: "Agent 设定", + pmRole: "投资经理", + pmDesc: "负责最终交易决策和团队协作", + rmRole: "风控经理", + rmDesc: "监控组合风险并执行风险限制", + analystsRole: "分析师", + analystsDesc: "使用不同工具和 AI 模型进行专业研究:", + analysts: [ + { name: "估值分析师", model: "Moonshot", modelKey: "Moonshot" }, + { name: "情绪分析师", model: "Qwen", modelKey: "Alibaba" }, + { name: "基本面分析师", model: "DeepSeek", modelKey: "DeepSeek" }, + { name: "技术分析师", model: "Zhipu AI", modelKey: "Zhipu AI" } + ], + + section2Title: "Agent 决策机制", + + tradingProcess: "交易流程", + tradingDesc: "Agents 进行日频交易并持续跟踪组合净值。每天最终交易决策前,agents 经历三个关键阶段:", + + analysisPhase: "• 分析阶段", + analysisDesc: "所有 agents 根据各自的工具和信息独立分析并形成判断。", + + communicationPhase: "• 沟通阶段", + commIntro: "提供了多种沟通渠道:1v1 私聊 / 1vN 通知 / NvN 会议", + + decisionPhase: "• 决策阶段", + decisionDesc: "由 portfolio manager 汇总所有信息,并给出最终的团队交易。analysts 给出的原始交易信号仅做个人维度的排名。", + + reflectionTitle: "学习与进化", + reflectionDesc: "Agents 根据当日实际收益反思决策、总结经验,并存入 ", + remeLink: "ReMe", + reflectionDesc2: " 记忆框架以持续改进。", + + section3Title: "收益评估", + + chartTitle: "• 业绩图表", + chartDesc: "追踪组合收益曲线 vs. 基准策略(等权、市值加权、动量)。用于评估整体策略有效性。", + + rankingTitle: "• 分析师排名", + rankingDesc: "在 Trading Room 点击头像查看分析师表现(胜率、牛/熊市胜率)。用于了解哪些分析师提供最有价值的洞察。", + + statsTitle: "• 统计数据", + statsDesc: "详细的持仓和交易历史。用于深入分析仓位管理和执行质量。", + + callToAction: "在 ", + repoLink: "GitHub", + callToAction2: " 上 fork 并自定义!" + } + }; + + return ( +
+
+
+ {/* Language Switch */} +
+ setLanguage('zh')} + > + 中文 + + + setLanguage('en')} + > + EN + +
+ + {language === 'en' ? ( + // English Content + <> + {/* Section 1: Agent Setup */} +
{content.en.section1Title}
+ + {/* Roles */} +
+
+ {content.en.pmRole}: {content.en.pmDesc} +
+
+ {content.en.rmRole}: {content.en.rmDesc} +
+
+ {content.en.analystsRole}: {content.en.analystsDesc} +
+
+ + {/* Analysts with AI Models */} +
+ {content.en.analysts.map(analyst => { + const logo = llmLogos.find(l => l.name === analyst.modelKey); + return ( +
+ {logo && ( + {logo.label} + )} + {analyst.name} + - {analyst.model} +
+ ); + })} +
+ +
+ {content.en.callToAction} + + {content.en.repoLink} + + {content.en.callToAction2} +
+ + {/* Section 2: Agent Decision Mechanism */} +
{content.en.section2Title}
+ +
+
{content.en.tradingProcess}
+
{content.en.tradingDesc}
+ +
+
+ {content.en.analysisPhase.replace('• ', '')}: {content.en.analysisDesc} +
+ +
+ {content.en.communicationPhase.replace('• ', '')}: {content.en.commIntro} +
+ +
+ {content.en.decisionPhase.replace('• ', '')}: {content.en.decisionDesc} +
+
+
+ +
+
{content.en.reflectionTitle}
+
+ {content.en.reflectionDesc} + + {content.en.remeLink} + + {content.en.reflectionDesc2} +
+
+ + {/* Section 3: Performance Evaluation */} +
{content.en.section3Title}
+
+
+ {content.en.chartTitle.replace('• ', '')}: {content.en.chartDesc} +
+
+ {content.en.rankingTitle.replace('• ', '')}: {content.en.rankingDesc} +
+
+ {content.en.statsTitle.replace('• ', '')}: {content.en.statsDesc} +
+
+ + ) : ( + // Chinese Content + <> + {/* 第一部分:Agent 设定 */} +
{content.zh.section1Title}
+ + {/* 角色 */} +
+
+ {content.zh.pmRole}: {content.zh.pmDesc} +
+
+ {content.zh.rmRole}: {content.zh.rmDesc} +
+
+ {content.zh.analystsRole}: {content.zh.analystsDesc} +
+
+ + {/* Analysts 与 AI 模型 */} +
+ {content.zh.analysts.map(analyst => { + const logo = llmLogos.find(l => l.name === analyst.modelKey); + return ( +
+ {logo && ( + {logo.label} + )} + {analyst.name} + - {analyst.model} +
+ ); + })} +
+ +
+ {content.zh.callToAction} + + {content.zh.repoLink} + + {content.zh.callToAction2} +
+ + {/* 第二部分:Agent 决策机制 */} +
{content.zh.section2Title}
+ +
+
{content.zh.tradingProcess}
+
{content.zh.tradingDesc}
+ +
+
+ {content.zh.analysisPhase.replace('• ', '')}: {content.zh.analysisDesc} +
+ +
+ {content.zh.communicationPhase.replace('• ', '')}: {content.zh.commIntro} +
+ +
+ {content.zh.decisionPhase.replace('• ', '')}: {content.zh.decisionDesc} +
+
+
+ +
+
{content.zh.reflectionTitle}
+
+ {content.zh.reflectionDesc} + + {content.zh.remeLink} + + {content.zh.reflectionDesc2} +
+
+ + {/* 第三部分:收益评估 */} +
{content.zh.section3Title}
+
+
+ {content.zh.chartTitle.replace('• ', '')}: {content.zh.chartDesc} +
+
+ {content.zh.rankingTitle.replace('• ', '')}: {content.zh.rankingDesc} +
+
+ {content.zh.statsTitle.replace('• ', '')}: {content.zh.statsDesc} +
+
+ + )} +
+
+
+ ); +} diff --git a/frontend/src/components/StatisticsView.jsx b/frontend/src/components/StatisticsView.jsx new file mode 100644 index 0000000..814a51d --- /dev/null +++ b/frontend/src/components/StatisticsView.jsx @@ -0,0 +1,664 @@ +import React, { useState, useEffect } from 'react'; +import StockLogo from './StockLogo'; +import { formatNumber, formatDateTime } from '../utils/formatters'; + +/** + * Statistics View Component + * Displays portfolio overview, holdings, and trade history in a side-by-side layout + * Left: Performance Overview (35%) | Right: Holdings + Trades (65%) + * No scrolling - content fits within viewport with pagination + */ +export default function StatisticsView({ trades, holdings, stats, baseline_vw, equity, leaderboard }) { + const [holdingsPage, setHoldingsPage] = useState(1); + const [tradesPage, setTradesPage] = useState(1); + const holdingsPerPage = 5; + const tradesPerPage = 8; + + // Calculate pagination for holdings + const totalHoldingsPages = Math.ceil(holdings.length / holdingsPerPage); + const holdingsStartIndex = (holdingsPage - 1) * holdingsPerPage; + const holdingsEndIndex = holdingsStartIndex + holdingsPerPage; + const currentHoldings = holdings.slice(holdingsStartIndex, holdingsEndIndex); + + // Calculate pagination for trades + const totalTradesPages = Math.ceil(trades.length / tradesPerPage); + const tradesStartIndex = (tradesPage - 1) * tradesPerPage; + const tradesEndIndex = tradesStartIndex + tradesPerPage; + const currentTrades = trades.slice(tradesStartIndex, tradesEndIndex); + + // Calculate excess return (Evatraders return - benchmark value-weighted return) + const calculateExcessReturn = () => { + if (!stats || !baseline_vw || baseline_vw.length === 0) { + return null; + } + + // Get Evatraders return from stats + const evatradersReturn = stats.totalReturn || 0; // Already in percentage + + // Calculate benchmark return from baseline_vw + // baseline_vw format: [{t: timestamp, v: value}, ...] or [value, ...] + let benchmarkInitialValue, benchmarkCurrentValue; + + if (baseline_vw.length > 0) { + const firstPoint = baseline_vw[0]; + const lastPoint = baseline_vw[baseline_vw.length - 1]; + + benchmarkInitialValue = typeof firstPoint === 'object' ? firstPoint.v : firstPoint; + benchmarkCurrentValue = typeof lastPoint === 'object' ? lastPoint.v : lastPoint; + + if (benchmarkInitialValue && benchmarkInitialValue > 0 && benchmarkCurrentValue) { + const benchmarkReturn = ((benchmarkCurrentValue - benchmarkInitialValue) / benchmarkInitialValue) * 100; + const excessReturn = evatradersReturn - benchmarkReturn; + return { + excessReturn: excessReturn, + benchmarkReturn: benchmarkReturn, + evatradersReturn: evatradersReturn + }; + } + } + + return null; + }; + + const excessReturnData = calculateExcessReturn(); + + // Calculate Portfolio Manager's win rate (similar logic to AgentCard) + const calculatePortfolioManagerWinRate = () => { + if (!leaderboard || !Array.isArray(leaderboard)) { + return null; + } + + // Find portfolio_manager in leaderboard + const pmData = leaderboard.find(agent => agent.agentId === 'portfolio_manager'); + + if (!pmData) { + return null; + } + + // Extract bull and bear data + const bullTotal = pmData.bull?.n || 0; + const bullWins = pmData.bull?.win || 0; + const bullUnknown = pmData.bull?.unknown || 0; + const bearTotal = pmData.bear?.n || 0; + const bearWins = pmData.bear?.win || 0; + const bearUnknown = pmData.bear?.unknown || 0; + + // Calculate evaluated counts (exclude unknown) + const evaluatedBull = Math.max(bullTotal - bullUnknown, 0); + const evaluatedBear = Math.max(bearTotal - bearUnknown, 0); + const evaluatedTotal = evaluatedBull + evaluatedBear; + + // Calculate win rate + const totalWins = bullWins + bearWins; + const winRate = evaluatedTotal > 0 ? (totalWins / evaluatedTotal) : null; + + return { + winRate, + totalWins, + evaluatedTotal, + bullWins, + bearWins, + evaluatedBull, + evaluatedBear + }; + }; + + const pmWinRateData = calculatePortfolioManagerWinRate(); + + // Reset to page 1 when data changes + useEffect(() => { + setHoldingsPage(1); + }, [holdings.length]); + + useEffect(() => { + setTradesPage(1); + }, [trades.length]); + + return ( +
+ {/* Left Panel: Performance Overview (35%) */} +
+ {stats ? ( +
+ {/* Header */} +
+

+ 业绩表现 +

+
+ + {/* Main Stats - Hierarchical Layout */} +
+ {/* Primary Metric - Total Asset Value */} +
+
+ 总资产价值 +
+
+ ${formatNumber(stats.totalAssetValue || 0)} +
+
+ + {/* Secondary Metrics - Grid: Excess Return, Win Rate, Absolute Return */} +
+ {/* 1. Excess Return */} + {excessReturnData ? ( +
+
+ 超额收益 +
+
= 0 ? '#00C853' : '#FF1744', + fontFamily: '"Courier New", monospace' + }}> + {excessReturnData.excessReturn >= 0 ? '+' : ''}{excessReturnData.excessReturn.toFixed(2)}% +
+
+ vs 市值加权: {excessReturnData.benchmarkReturn >= 0 ? '+' : ''}{excessReturnData.benchmarkReturn.toFixed(2)}% +
+
+ ) : null} + + {/* 2. Win Rate */} +
+
+ 胜率 +
+
+ {pmWinRateData?.winRate != null + ? `${(pmWinRateData.winRate * 100).toFixed(1)}%` + : 'N/A'} +
+ {pmWinRateData && ( +
+ {pmWinRateData.totalWins}胜 / {pmWinRateData.evaluatedTotal}评 +
+ )} +
+ + {/* 3. Absolute Return */} +
+
+ 绝对收益 +
+
= 0 ? '#00C853' : '#FF1744', + fontFamily: '"Courier New", monospace' + }}> + {(stats.totalReturn || 0) >= 0 ? '+' : ''}{(stats.totalReturn || 0).toFixed(2)}% +
+
+
+ + {/* Tertiary Metrics - Compact List */} +
+
+
+ 现金头寸 +
+
+ ${formatNumber(stats.cashPosition || 0)} +
+
+ +
+
+ 总交易数 +
+
+ {stats.totalTrades || 0} +
+
+
+ + {/* Ticker Weights - Compact */} + {stats.tickerWeights && Object.keys(stats.tickerWeights).length > 0 && ( +
+
+ 组合权重 +
+
+ {Object.entries(stats.tickerWeights).map(([ticker, weight]) => { + const weightValue = Number(weight); + const isNegative = weightValue < 0; + const displayWeight = (weightValue * 100).toFixed(1); + + return ( +
+ {ticker} + + {displayWeight}% + +
+ ); + })} +
+
+ )} +
+
+ ) : ( +
+ 暂无统计数据 +
+ )} +
+ + {/* Right Panel: Holdings + Trades (65%) */} +
+ {/* Portfolio Holdings - Top Half */} +
+
+

+ 持仓明细 +

+
+ +
+ {holdings.length === 0 ? ( +
+ 当前无持仓 +
+ ) : ( + <> +
+ + + + + + + + + + + + {currentHoldings.map(h => { + // For short positions, quantity should be negative and weight should also be negative + const isShort = h.ticker !== 'CASH' && Number(h.quantity) < 0; + const displayWeight = isShort ? -Math.abs(Number(h.weight)) : Number(h.weight); + + return ( + + + + + + + + ); + })} + +
代码数量价格市值权重
+
+ {h.ticker !== 'CASH' && } + {h.ticker} +
+
{h.ticker === 'CASH' ? '-' : h.quantity}{h.ticker === 'CASH' ? '-' : `$${Number(h.currentPrice).toFixed(2)}`}${formatNumber(h.marketValue)} + {(displayWeight * 100).toFixed(2)}% +
+
+ + {totalHoldingsPages > 1 && ( +
+ + +
+ {holdingsPage} / {totalHoldingsPages} +
+ + +
+ )} + + )} +
+
+ + {/* Transaction History - Bottom Half */} +
+
+

+ 交易历史 +

+ {trades.length > 0 && ( +
+ 共 {trades.length} 笔 +
+ )} +
+ +
+ {trades.length === 0 ? ( +
+ 暂无交易记录 +
+ ) : ( + <> +
+ + + + + + + + + + + + {currentTrades.map((t, idx) => ( + + + + + + + + ))} + +
时间股票方向数量价格
+ {formatDateTime(t.timestamp)} + +
+ + {t.ticker} +
+
+ + {t.side} + + {t.qty}${Number(t.price).toFixed(2)}
+
+ + {totalTradesPages > 1 && ( +
+ + +
+ {tradesPage} / {totalTradesPages} +
+ + +
+ )} + + )} +
+
+
+
+ ); +} diff --git a/frontend/src/components/StockLogo.jsx b/frontend/src/components/StockLogo.jsx new file mode 100644 index 0000000..b2f4d8b --- /dev/null +++ b/frontend/src/components/StockLogo.jsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { STOCK_LOGOS } from '../config/constants'; + +/** + * Stock Logo Component + * Displays company logo for a given ticker symbol + */ +export default function StockLogo({ ticker, size = 20 }) { + const logoUrl = STOCK_LOGOS[ticker]; + if (!logoUrl) return null; + + return ( + {ticker} { e.target.style.display = 'none'; }} + /> + ); +} + diff --git a/frontend/src/config/constants.js b/frontend/src/config/constants.js new file mode 100644 index 0000000..41be7a6 --- /dev/null +++ b/frontend/src/config/constants.js @@ -0,0 +1,145 @@ +/** + * Application Configuration Constants + */ + +// Centralized CDN asset URLs +export const CDN_ASSETS = { + companyRoom: { + agent_1: "https://img.alicdn.com/imgextra/i4/O1CN01Lr7SOl1lSExV0tOwv_!!6000000004817-2-tps-370-320.png", + agent_2: "https://img.alicdn.com/imgextra/i3/O1CN017Kb8cY1VQNUmuK47o_!!6000000002647-2-tps-368-312.png", + agent_3: "https://img.alicdn.com/imgextra/i3/O1CN010Fp55w1YqtGpVjgsS_!!6000000003111-2-tps-370-320.png", + agent_4: "https://img.alicdn.com/imgextra/i3/O1CN01VnUsML1Dkq6fHw3ks_!!6000000000255-2-tps-366-316.png", + agent_5: "https://img.alicdn.com/imgextra/i4/O1CN01o0kCQw1kyvbulBSl7_!!6000000004753-2-tps-370-314.png", + agent_6: "https://img.alicdn.com/imgextra/i2/O1CN01cLV0zl1FI6ULAunTp_!!6000000000463-2-tps-368-320.png", + team_logo: "https://img.alicdn.com/imgextra/i2/O1CN01n2S8aV25hcZhhNH95_!!6000000007558-2-tps-616-700.png", + reme_logo: "https://img.alicdn.com/imgextra/i2/O1CN01FhncuT1Tqp8LfCaft_!!6000000002434-2-tps-915-250.png", + full_room_dark: "https://img.alicdn.com/imgextra/i2/O1CN014sOgzK28re5haGC3X_!!6000000007986-2-tps-1248-832.png", + full_room_with_roles_tech_style: "https://img.alicdn.com/imgextra/i1/O1CN01qhupIj1KU4vF3yoT2_!!6000000001166-2-tps-1248-832.png", + }, + llmModelLogos: { + "Zhipu AI": "https://img.alicdn.com/imgextra/i4/O1CN01PavE4h1SdFmbeUj6h_!!6000000002269-2-tps-92-92.png", + "Alibaba": "https://img.alicdn.com/imgextra/i4/O1CN01mTs8oZ1gsHOj0xy7O_!!6000000004197-0-tps-204-192.jpg", + "DeepSeek": "https://img.alicdn.com/imgextra/i3/O1CN01ocd9iO1D7S2qgEIXQ_!!6000000000169-2-tps-203-148.png", + "Moonshot": "https://img.alicdn.com/imgextra/i3/O1CN01rFzJg01wE0QFHNGLy_!!6000000006275-0-tps-182-148.jpg", + "Anthropic": "https://img.alicdn.com/imgextra/i4/O1CN01Sg8gbo1HKVnoU16rm_!!6000000000739-2-tps-148-148.png", + "Google": "https://img.alicdn.com/imgextra/i1/O1CN01fZwVYk1caBHdzh9qh_!!6000000003616-0-tps-148-148.jpg", + "OpenAI": "https://img.alicdn.com/imgextra/i3/O1CN01T1eaM8287qU0nZm91_!!6000000007886-2-tps-148-148.png", + "Groq": "https://img.alicdn.com/imgextra/i1/O1CN01WxASMc1QjXzhVl3eQ_!!6000000002012-2-tps-170-148.png", + "Ollama": "https://img.alicdn.com/imgextra/i1/O1CN01pN615e1i4vxLkQjVd_!!6000000004360-2-tps-204-192.png", + }, + stockLogos: { + "TSLA": "https://img.alicdn.com/imgextra/i4/O1CN01Pch4DD1DDrad8BQAQ_!!6000000000183-2-tps-128-128.png", + "AMZN": "https://img.alicdn.com/imgextra/i3/O1CN01KMsfnU25Wd4MGSgue_!!6000000007534-2-tps-128-128.png", + "NVDA": "https://img.alicdn.com/imgextra/i4/O1CN01Lq1eJr1mLeslgx6a0_!!6000000004938-2-tps-128-128.png", + "GOOGL": "https://img.alicdn.com/imgextra/i2/O1CN01kjJJbb25B6SESkOCn_!!6000000007487-2-tps-128-128.png", + "MSFT": "https://img.alicdn.com/imgextra/i4/O1CN01tdlNtQ1aFS7vHYfMG_!!6000000003300-2-tps-128-128.png", + "AAPL": "https://img.alicdn.com/imgextra/i4/O1CN01r0GH0q1diiHHOwxiO_!!6000000003770-2-tps-128-128.png", + "META": "https://img.alicdn.com/imgextra/i3/O1CN01pWAvHt1IkRqZoUG96_!!6000000000931-2-tps-130-96.png", + } +}; + +// Derived asset shortcuts +export const ASSETS = { + roomBg: CDN_ASSETS.companyRoom.full_room_with_roles_tech_style, + teamLogo: CDN_ASSETS.companyRoom.team_logo, + remeLogo: CDN_ASSETS.companyRoom.reme_logo, +}; + +// Stock logos mapping +export const STOCK_LOGOS = { ...CDN_ASSETS.stockLogos }; + +// Scene dimensions (actual image size) +export const SCENE_NATIVE = { width: 1248, height: 832 }; + +// Agent seat positions (percentage relative to image, origin at bottom-left) +// Format: { x: horizontal %, y: vertical % from bottom } +export const AGENT_SEATS = [ + { x: 0.44, y: 0.58 }, // portfolio_manager + { x: 0.55, y: 0.58 }, // risk_manager + { x: 0.33, y: 0.52 }, // valuation_analyst + { x: 0.42, y: 0.42 }, // sentiment_analyst + { x: 0.56, y: 0.42 }, // fundamentals_analyst + { x: 0.61, y: 0.49 }, // technical_analyst +]; + +// Agent definitions with subtle color schemes (very light backgrounds) +export const AGENTS = [ + { + id: "portfolio_manager", + name: "投资经理", + role: "投资经理", + avatar: CDN_ASSETS.companyRoom.agent_1, + colors: { bg: "#F9FDFF", text: "#1565C0", accent: "#1565C0" } + }, + { + id: "risk_manager", + name: "风控经理", + role: "风控经理", + avatar: CDN_ASSETS.companyRoom.agent_2, + colors: { bg: "#FFF8F8", text: "#C62828", accent: "#C62828" } + }, + { + id: "valuation_analyst", + name: "估值分析师", + role: "估值分析师", + avatar: CDN_ASSETS.companyRoom.agent_3, + colors: { bg: "#FAFFFA", text: "#2E7D32", accent: "#2E7D32" } + }, + { + id: "sentiment_analyst", + name: "情绪分析师", + role: "情绪分析师", + avatar: CDN_ASSETS.companyRoom.agent_4, + colors: { bg: "#FCFAFF", text: "#6A1B9A", accent: "#6A1B9A" } + }, + { + id: "fundamentals_analyst", + name: "基本面分析师", + role: "基本面分析师", + avatar: CDN_ASSETS.companyRoom.agent_5, + colors: { bg: "#FFFCF7", text: "#E65100", accent: "#E65100" } + }, + { + id: "technical_analyst", + name: "技术分析师", + role: "技术分析师", + avatar: CDN_ASSETS.companyRoom.agent_6, + colors: { bg: "#F9FEFF", text: "#00838F", accent: "#00838F" } + }, +]; + +// LLM logo URLs for reuse +export const LLM_MODEL_LOGOS = { ...CDN_ASSETS.llmModelLogos }; + +// Message type colors (very subtle backgrounds) +export const MESSAGE_COLORS = { + system: { bg: "#FAFAFA", text: "#424242", accent: "#424242" }, + memory: { bg: "#F2FDFF", text: "#00838F", accent: "#00838F" }, + conference: { bg: "#F1F4FF", text: "#3949AB", accent: "#3949AB" } +}; + +// Helper function to get agent colors by ID or name +export const getAgentColors = (agentId, agentName) => { + const agent = AGENTS.find(a => a.id === agentId || a.name === agentName); + return agent?.colors || MESSAGE_COLORS.system; +}; + +// UI timing constants +export const BUBBLE_LIFETIME_MS = 8000; +export const CHART_MARGIN = { left: 60, right: 20, top: 20, bottom: 40 }; +export const AXIS_TICKS = 5; + +// WebSocket configuration +export const WS_URL = import.meta.env.VITE_WS_URL || "ws://localhost:8765"; + +// Initial ticker symbols (MAG7 companies) +export const INITIAL_TICKERS = [ + { symbol: "AAPL", price: null, change: null }, + { symbol: "MSFT", price: null, change: null }, + { symbol: "GOOGL", price: null, change: null }, + { symbol: "AMZN", price: null, change: null }, + { symbol: "NVDA", price: null, change: null }, + { symbol: "META", price: null, change: null }, + { symbol: "TSLA", price: null, change: null } +]; + diff --git a/frontend/src/hooks/useFeedProcessor.js b/frontend/src/hooks/useFeedProcessor.js new file mode 100644 index 0000000..af8f8bd --- /dev/null +++ b/frontend/src/hooks/useFeedProcessor.js @@ -0,0 +1,363 @@ +import { useState, useCallback, useRef } from "react"; +import { AGENTS } from "../config/constants"; + +const MAX_FEED_ITEMS = 200; + +/** + * Generate a unique ID for feed items + */ +const generateId = (prefix = "item") => `${prefix}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + +/** + * Convert raw event to a message object (for use within conferences or standalone) + */ +const eventToMessage = (evt) => { + if (!evt || !evt.type) { + return null; + } + + const agent = AGENTS.find(a => a.id === evt.agentId); + const timestamp = evt.timestamp || evt.ts || Date.now(); + + switch (evt.type) { + case "agent_message": + case "conference_message": + return { + id: generateId("msg"), + timestamp, + agentId: evt.agentId, + agent: agent?.name || evt.agentName || evt.agentId || "Agent", + role: agent?.role || evt.role || "Agent", + content: evt.content + }; + + case "memory": + return { + id: generateId("memory"), + timestamp, + agentId: evt.agentId, + agent: agent?.name || evt.agentId || "Memory", + role: "Memory", + content: evt.content || evt.text || "" + }; + + case "system": + case "day_start": + case "day_complete": + case "day_error": + return { + id: generateId("sys"), + timestamp, + agent: "System", + role: "System", + content: evt.content || `${evt.type}: ${evt.date || ""}` + }; + + default: + return null; + } +}; + +/** + * Convert raw event to a standalone feed item (non-conference) + */ +const eventToFeedItem = (evt) => { + if (!evt || !evt.type) { + return null; + } + + const message = eventToMessage(evt); + if (!message) { + return null; + } + + if (evt.type === "memory") { + return { + type: "memory", + id: message.id, + data: { + timestamp: message.timestamp, + agentId: message.agentId, + agent: message.agent, + content: message.content + } + }; + } + + return { + type: "message", + id: message.id, + data: message + }; +}; + +/** + * Custom hook for processing feed events with conference aggregation + */ +export function useFeedProcessor() { + const [feed, setFeed] = useState([]); + + // Active conference ref for real-time event handling + const activeConferenceRef = useRef(null); + + /** + * Process historical events from server + * Events come in reverse chronological order (newest first) + * So conference_end appears BEFORE conference_start in the array + */ + const processHistoricalFeed = useCallback((events) => { + if (!Array.isArray(events)) { + console.warn("processHistoricalFeed: expected array, got", typeof events); + return; + } + + console.log("📋 Processing historical events:", events.length); + + const feedItems = []; + let currentConference = null; + + // Process in chronological order (reverse the array) + const chronological = [...events].reverse(); + + for (const evt of chronological) { + if (!evt || !evt.type) { + continue; + } + + try { + if (evt.type === "conference_start") { + // Start a new conference + currentConference = { + id: evt.conferenceId || generateId("conf"), + title: evt.title || "Team Conference", + startTime: evt.timestamp || evt.ts || Date.now(), + endTime: null, + isLive: false, + participants: evt.participants || [], + messages: [] + }; + } else if (evt.type === "conference_end") { + // End current conference + if (currentConference) { + currentConference.endTime = evt.timestamp || evt.ts || Date.now(); + currentConference.isLive = false; + feedItems.push({ + type: "conference", + id: currentConference.id, + data: currentConference + }); + currentConference = null; + } + } else if (evt.type === "conference_message") { + // Add to current conference if exists + const message = eventToMessage(evt); + if (message && currentConference) { + currentConference.messages.push(message); + } else if (message) { + // Fallback: show as standalone message if no active conference + feedItems.push({ + type: "message", + id: message.id, + data: message + }); + } + } else { + // Non-conference events + const feedItem = eventToFeedItem(evt); + if (feedItem) { + if (currentConference) { + // Add to conference messages + currentConference.messages.push(feedItem.data); + } else { + feedItems.push(feedItem); + } + } + } + } catch (error) { + console.error("Error processing historical event:", evt.type, error); + } + } + + // If there's an unclosed conference, it's still live + if (currentConference) { + currentConference.isLive = true; + feedItems.push({ + type: "conference", + id: currentConference.id, + data: currentConference + }); + // Store as active for real-time updates + activeConferenceRef.current = currentConference; + console.log(`🔴 Restored active conference: ${currentConference.id} with ${currentConference.messages.length} messages`); + } + + // Reverse back to newest-first order + setFeed(feedItems.reverse()); + console.log(`✅ Processed ${feedItems.length} feed items from ${events.length} events`); + }, []); + + /** + * Process a single real-time event + * Handles conference aggregation for live events + */ + const processFeedEvent = useCallback((evt) => { + if (!evt || !evt.type) { + return null; + } + + // Handle conference start + if (evt.type === "conference_start") { + const conference = { + id: evt.conferenceId || generateId("conf"), + title: evt.title || "Team Conference", + startTime: evt.timestamp || evt.ts || Date.now(), + endTime: null, + isLive: true, + participants: evt.participants || [], + messages: [] + }; + activeConferenceRef.current = conference; + setFeed(prev => [{ type: "conference", id: conference.id, data: conference }, ...prev].slice(0, MAX_FEED_ITEMS)); + return conference; + } + + // Handle conference end + if (evt.type === "conference_end") { + const activeConf = activeConferenceRef.current; + activeConferenceRef.current = null; + + if (activeConf) { + const ended = { + ...activeConf, + endTime: evt.timestamp || evt.ts || Date.now(), + isLive: false + }; + setFeed(prev => prev.map(item => + item.type === "conference" && item.id === activeConf.id + ? { ...item, data: ended } + : item + )); + return ended; + } + return null; + } + + // Handle conference message + if (evt.type === "conference_message") { + const message = eventToMessage(evt); + if (!message) { + return null; + } + + const activeConf = activeConferenceRef.current; + if (activeConf) { + // Add to active conference + const updated = { + ...activeConf, + messages: [...activeConf.messages, message] + }; + activeConferenceRef.current = updated; + setFeed(prev => prev.map(item => + item.type === "conference" && item.id === activeConf.id + ? { ...item, data: updated } + : item + )); + return message; + } else { + // No active conference, show as standalone + const feedItem = { type: "message", id: message.id, data: message }; + setFeed(prev => [feedItem, ...prev].slice(0, MAX_FEED_ITEMS)); + return feedItem; + } + } + + // Handle other feed events (agent_message, memory, system, etc.) + const feedEventTypes = ["agent_message", "memory", "system", "day_start", "day_complete", "day_error"]; + if (!feedEventTypes.includes(evt.type)) { + return null; + } + + const feedItem = eventToFeedItem(evt); + if (!feedItem) { + return null; + } + + const activeConf = activeConferenceRef.current; + if (activeConf) { + // Add to active conference + const updated = { + ...activeConf, + messages: [...activeConf.messages, feedItem.data] + }; + activeConferenceRef.current = updated; + setFeed(prev => prev.map(item => + item.type === "conference" && item.id === activeConf.id + ? { ...item, data: updated } + : item + )); + return feedItem.data; + } else { + // No active conference, add as standalone + setFeed(prev => [feedItem, ...prev].slice(0, MAX_FEED_ITEMS)); + return feedItem; + } + }, []); + + /** + * Add a system message to the feed + */ + const addSystemMessage = useCallback((content) => { + const message = { + id: generateId("sys"), + timestamp: Date.now(), + agent: "System", + role: "System", + content + }; + + const activeConf = activeConferenceRef.current; + if (activeConf) { + const updated = { + ...activeConf, + messages: [...activeConf.messages, message] + }; + activeConferenceRef.current = updated; + setFeed(prev => prev.map(item => + item.type === "conference" && item.id === activeConf.id + ? { ...item, data: updated } + : item + )); + } else { + const feedItem = { type: "message", id: message.id, data: message }; + setFeed(prev => [feedItem, ...prev].slice(0, MAX_FEED_ITEMS)); + } + return message; + }, []); + + /** + * Clear all feed items and reset active conference + */ + const clearFeed = useCallback(() => { + setFeed([]); + activeConferenceRef.current = null; + }, []); + + /** + * Check if there's an active conference + */ + const hasActiveConference = useCallback(() => { + return activeConferenceRef.current !== null; + }, []); + + return { + feed, + setFeed, + processHistoricalFeed, + processFeedEvent, + addSystemMessage, + clearFeed, + hasActiveConference + }; +} + +export default useFeedProcessor; diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..08a3ac9 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx new file mode 100644 index 0000000..44931db --- /dev/null +++ b/frontend/src/main.jsx @@ -0,0 +1,8 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import "./index.css"; + +ReactDOM.createRoot(document.getElementById('root')).render( + +) diff --git a/frontend/src/services/websocket.js b/frontend/src/services/websocket.js new file mode 100644 index 0000000..dc19fc1 --- /dev/null +++ b/frontend/src/services/websocket.js @@ -0,0 +1,192 @@ +/** + * WebSocket Client for Read-Only Connection + * Handles connection, reconnection, and heartbeat + */ + +import { WS_URL } from "../config/constants"; + +export class ReadOnlyClient { + constructor(onEvent, { wsUrl = WS_URL, reconnectDelay = 3000, heartbeatInterval = 5000 } = {}) { + this.onEvent = onEvent; + this.wsUrl = wsUrl; + this.baseReconnectDelay = reconnectDelay; + this.reconnectDelay = reconnectDelay; + this.maxReconnectDelay = 30000; + this.heartbeatInterval = heartbeatInterval; + this.ws = null; + this.shouldReconnect = false; + this.reconnectTimer = null; + this.heartbeatTimer = null; + this.reconnectAttempts = 0; + this.lastPongTime = 0; + } + + connect() { + this.shouldReconnect = true; + this.reconnectAttempts = 0; + this.reconnectDelay = this.baseReconnectDelay; + this._connect(); + } + + _connect() { + if (!this.shouldReconnect) { + return; + } + + // Clear any existing connection + if (this.ws) { + this.ws.onopen = null; + this.ws.onmessage = null; + this.ws.onerror = null; + this.ws.onclose = null; + if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) { + this.ws.close(); + } + this.ws = null; + } + + this.ws = new WebSocket(this.wsUrl); + + this.ws.onopen = () => { + this.reconnectAttempts = 0; + this.reconnectDelay = this.baseReconnectDelay; + this.lastPongTime = Date.now(); + this._safeEmit({ type: "system", content: "Connected to live server" }); + console.log("WebSocket connected"); + this._startHeartbeat(); + }; + + this.ws.onmessage = (ev) => { + try { + const msg = JSON.parse(ev.data); + + // Update pong time for any message (server is alive) + this.lastPongTime = Date.now(); + + if (msg.type === "pong") { + return; + } + + console.log("[WebSocket] Message received:", msg.type || "unknown"); + this._safeEmit(msg); + } catch (e) { + console.error("[WebSocket] Parse error:", e); + } + }; + + this.ws.onerror = (error) => { + console.error("WebSocket error:", error); + }; + + this.ws.onclose = (event) => { + const code = event.code || "Unknown"; + console.log(`[WebSocket] Connection closed: Code=${code}, WasClean=${event.wasClean}`); + + this._stopHeartbeat(); + this.ws = null; + + // Always attempt reconnect if shouldReconnect is true + if (this.shouldReconnect) { + this.reconnectAttempts++; + // Exponential backoff with cap + this.reconnectDelay = Math.min( + this.baseReconnectDelay * Math.pow(1.5, this.reconnectAttempts), + this.maxReconnectDelay + ); + + this._safeEmit({ + type: "system", + content: "Try to connect to data server..." + }); + + if (this.reconnectTimer) { + clearTimeout(this.reconnectTimer); + } + + this.reconnectTimer = setTimeout(() => { + console.log(`[WebSocket] Reconnect attempt ${this.reconnectAttempts}...`); + this._connect(); + }, this.reconnectDelay); + } + }; + } + + _safeEmit(msg) { + try { + this.onEvent(msg); + } catch (e) { + console.error("[WebSocket] Error in event handler:", e); + } + } + + _startHeartbeat() { + this._stopHeartbeat(); + this.lastPongTime = Date.now(); + + this.heartbeatTimer = setInterval(() => { + this._sendPing(); + + // Check for stale connection (no response in 60s) + const timeSinceLastPong = Date.now() - this.lastPongTime; + if (timeSinceLastPong > 60000 && this.ws) { + console.warn("[WebSocket] Connection appears stale, forcing reconnect"); + this.ws.close(); + } + }, this.heartbeatInterval); + } + + _sendPing() { + if (this.ws && this.ws.readyState === WebSocket.OPEN) { + try { + this.ws.send(JSON.stringify({ type: "ping" })); + } catch (e) { + console.error("Heartbeat send error:", e); + } + } + } + + _stopHeartbeat() { + if (this.heartbeatTimer) { + clearInterval(this.heartbeatTimer); + this.heartbeatTimer = null; + } + } + + send(message) { + if (this.ws && this.ws.readyState === WebSocket.OPEN) { + try { + const messageStr = typeof message === "string" ? message : JSON.stringify(message); + this.ws.send(messageStr); + return true; + } catch (e) { + console.error("Send error:", e); + return false; + } + } else { + console.warn("WebSocket is not connected, cannot send message"); + return false; + } + } + + disconnect() { + this.shouldReconnect = false; + this._stopHeartbeat(); + if (this.reconnectTimer) { + clearTimeout(this.reconnectTimer); + this.reconnectTimer = null; + } + if (this.ws) { + this.ws.onopen = null; + this.ws.onmessage = null; + this.ws.onerror = null; + this.ws.onclose = null; + try { + this.ws.close(); + } catch (e) { + console.error("Close error:", e); + } + } + this.ws = null; + } +} + diff --git a/frontend/src/styles/GlobalStyles.jsx b/frontend/src/styles/GlobalStyles.jsx new file mode 100644 index 0000000..df076b1 --- /dev/null +++ b/frontend/src/styles/GlobalStyles.jsx @@ -0,0 +1,1876 @@ +import React from 'react'; + +/** + * Global CSS Styles for the EvoTraders Platform + * Terminal-inspired, minimal, monochrome design + */ +export default function GlobalStyles() { + return ( + + ); +} + diff --git a/frontend/src/utils/formatters.js b/frontend/src/utils/formatters.js new file mode 100644 index 0000000..78364e8 --- /dev/null +++ b/frontend/src/utils/formatters.js @@ -0,0 +1,85 @@ +/** + * Formatting utility functions + */ + +/** + * Format time from timestamp + */ +export function formatTime(ts) { + try { + const d = new Date(ts); + return d.toLocaleString([], { + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }); + } catch { + return ""; + } +} + +/** + * Format date and time from timestamp + */ +export function formatDateTime(ts) { + try { + const d = new Date(ts); + const date = d.toLocaleDateString("en-US", { month: "short", day: "numeric" }); + const time = d.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", hour12: false }); + return `${date} ${time}`; + } catch { + return ""; + } +} + +/** + * Format number with commas (no decimals) + */ +export function formatNumber(num) { + if (!isFinite(num)) { + return "-"; + } + return Math.abs(num).toLocaleString(undefined, { maximumFractionDigits: 0 }); +} + +/** + * Format full number with commas for Y-axis + */ +export function formatFullNumber(num) { + if (!isFinite(num)) { + return "-"; + } + return num.toLocaleString(undefined, { maximumFractionDigits: 0 }); +} + +/** + * Format ticker price with appropriate decimal places + */ +export function formatTickerPrice(price) { + if (!isFinite(price)) { + return "-"; + } + if (price >= 1000) { + return price.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }); + } else if (price >= 1) { + return price.toFixed(2); + } else { + return price.toFixed(4); + } +} + +/** + * Calculate duration between two timestamps + */ +export function calculateDuration(start, end) { + const diff = end - start; + const minutes = Math.floor(diff / 60000); + if (minutes < 60) { + return `${minutes}m`; + } + const hours = Math.floor(minutes / 60); + const mins = minutes % 60; + return `${hours}h ${mins}m`; +} + diff --git a/frontend/src/utils/modelIcons.js b/frontend/src/utils/modelIcons.js new file mode 100644 index 0000000..c8b056d --- /dev/null +++ b/frontend/src/utils/modelIcons.js @@ -0,0 +1,396 @@ +/** + * Model Icons and Styling Utilities + * + * Provides icon and styling configuration for different LLM models + */ + +import { LLM_MODEL_LOGOS } from "../config/constants"; + +/** + * Get model icon and styling based on model name + * @param {string} modelName - The model name (e.g., "qwen-plus", "gpt-4o") + * @param {string} modelProvider - The model provider (e.g., "OPENAI", "ANTHROPIC") + * @returns {object} Icon configuration { logoPath, color, bgColor, label, provider } + */ +export function getModelIcon(modelName, modelProvider) { + if (!modelName) { + return { + logoPath: null, + color: "#666666", + bgColor: "#f5f5f5", + label: "Default", + provider: "Default" + }; + } + + const name = modelName.toLowerCase(); + const provider = (modelProvider || "").toUpperCase(); + + // ========== Priority 1: Model Name Based Detection (Highest Priority) ========== + // This ensures we infer the correct logo from model name even if provider is OPENAI + + // GLM Models (智谱AI) + if (name.includes("glm")) { + return { + logoPath: LLM_MODEL_LOGOS["Zhipu AI"], + color: "#4A90E2", + bgColor: "#E3F2FD", + label: "GLM-4.6", + provider: "Zhipu AI" + }; + } + + // Qwen Models (阿里云/通义千问) + if (name.includes("qwen")) { + return { + logoPath: LLM_MODEL_LOGOS["Alibaba"], + color: "#FF6A00", + bgColor: "#FFF3E0", + label: name.includes("max") ? "Qwen-Max" : name.includes("plus") ? "Qwen-Plus" : "Qwen", + provider: "Alibaba" + }; + } + + // DeepSeek Models + if (name.includes("deepseek")) { + return { + logoPath: LLM_MODEL_LOGOS["DeepSeek"], + color: "#1976D2", + bgColor: "#E3F2FD", + label: "DeepSeek-V3", + provider: "DeepSeek" + }; + } + + // Moonshot/Kimi Models (月之暗面) + if (name.includes("moonshot") || name.includes("kimi")) { + return { + logoPath: LLM_MODEL_LOGOS["Moonshot"], + color: "#7B68EE", + bgColor: "#F3E5F5", + label: "Kimi-K2", + provider: "Moonshot" + }; + } + + // Anthropic Claude Models (check model name first) + if (name.includes("claude")) { + return { + logoPath: LLM_MODEL_LOGOS["Anthropic"], + color: "#D97706", + bgColor: "#FEF3C7", + label: "Claude", + provider: "Anthropic" + }; + } + + // Google Gemini Models (check model name first) + if (name.includes("gemini")) { + return { + logoPath: LLM_MODEL_LOGOS["Google"], + color: "#4285F4", + bgColor: "#E8F0FE", + label: "Gemini", + provider: "Google" + }; + } + + // OpenAI GPT Models (check model name first) + if (name.includes("gpt") || name.includes("o1") || name.includes("o2") || name.includes("o3")) { + return { + logoPath: LLM_MODEL_LOGOS["OpenAI"], + color: "#10A37F", + bgColor: "#E8F5E9", + label: name.includes("4o") ? "GPT-4o" : name.includes("4.5") ? "GPT-4.5" : name.includes("4") ? "GPT-4" : name.includes("3.5") ? "GPT-3.5" : "OpenAI", + provider: "OpenAI" + }; + } + + // ========== Priority 2: Provider Based Detection (Fallback) ========== + // Only use provider if model name doesn't match any known patterns + + // Anthropic Claude Models (provider fallback) + if (provider === "ANTHROPIC") { + return { + logoPath: LLM_MODEL_LOGOS["Anthropic"], + color: "#D97706", + bgColor: "#FEF3C7", + label: "Claude", + provider: "Anthropic" + }; + } + + // Google Gemini Models (provider fallback) + if (provider === "GOOGLE") { + return { + logoPath: LLM_MODEL_LOGOS["Google"], + color: "#4285F4", + bgColor: "#E8F0FE", + label: "Gemini", + provider: "Google" + }; + } + + // OpenAI Models (provider fallback - only if model name doesn't match) + if (provider === "OPENAI") { + return { + logoPath: LLM_MODEL_LOGOS["OpenAI"], + color: "#10A37F", + bgColor: "#E8F5E9", + label: "OpenAI", + provider: "OpenAI" + }; + } + + // Groq Models + if (provider === "GROQ") { + return { + logoPath: LLM_MODEL_LOGOS["Groq"], + color: "#DC2626", + bgColor: "#FEE2E2", + label: "Groq", + provider: "Groq" + }; + } + + // Ollama Models + if (provider === "OLLAMA") { + return { + logoPath: LLM_MODEL_LOGOS["Ollama"], + color: "#000000", + bgColor: "#F5F5F5", + label: "Ollama", + provider: "Ollama" + }; + } + + // OpenRouter Models + if (provider === "OPENROUTER") { + return { + logoPath: null, + color: "#8B5CF6", + bgColor: "#F5F3FF", + label: "OpenRouter", + provider: "OpenRouter" + }; + } + + // GigaChat Models + if (provider === "GIGACHAT") { + return { + logoPath: null, + color: "#9333EA", + bgColor: "#FAF5FF", + label: "GigaChat", + provider: "GigaChat" + }; + } + + // Default fallback + return { + logoPath: null, + color: "#666666", + bgColor: "#f5f5f5", + label: modelName.substring(0, 15), + provider: provider || "Unknown" + }; +} + +/** + * Get short model name for display + * @param {string} modelName - The full model name + * @returns {string} Short version of the model name (preserves full version numbers and suffixes) + */ +export function getShortModelName(modelName) { + if (!modelName) { + return "N/A"; + } + + const name = modelName.toLowerCase(); + + // Helper function to capitalize first letter of each word + const capitalizeWords = (str) => { + return str.split(/[-_\s]/).map(word => + word.charAt(0).toUpperCase() + word.slice(1) + ).join("-"); + }; + + // GLM - preserve version numbers + if (name.includes("glm")) { + // Extract version number if present (e.g., glm-4.6, glm-4.5) + const versionMatch = name.match(/glm[_-]?(\d+\.\d+)/); + if (versionMatch) { + return `GLM-${versionMatch[1]}`; + } + return "GLM-4.6"; // Default + } + + // Qwen - preserve full version and suffixes + if (name.includes("qwen")) { + // Match patterns like: qwen3-max-preview, qwen-max, qwen-plus, qwen-flash + if (name.includes("qwen3-max")) { + // Extract suffix if present (e.g., -preview) + const fullMatch = name.match(/qwen3-max[_-]?([a-z0-9-]+)?/); + if (fullMatch && fullMatch[1]) { + return `Qwen3-Max-${capitalizeWords(fullMatch[1])}`; + } + return "Qwen3-Max"; + } + if (name.includes("qwen-max")) { + const fullMatch = name.match(/qwen-max[_-]?([a-z0-9-]+)?/); + if (fullMatch && fullMatch[1]) { + return `Qwen-Max-${capitalizeWords(fullMatch[1])}`; + } + return "Qwen-Max"; + } + if (name.includes("qwen-plus")) { + const fullMatch = name.match(/qwen-plus[_-]?([a-z0-9-]+)?/); + if (fullMatch && fullMatch[1]) { + return `Qwen-Plus-${capitalizeWords(fullMatch[1])}`; + } + return "Qwen-Plus"; + } + if (name.includes("qwen-flash")) { + const fullMatch = name.match(/qwen-flash[_-]?([a-z0-9-]+)?/); + if (fullMatch && fullMatch[1]) { + return `Qwen-Flash-${capitalizeWords(fullMatch[1])}`; + } + return "Qwen-Flash"; + } + // Generic qwen with version + const versionMatch = name.match(/qwen[_-]?(\d+[a-z0-9-]*)?/); + if (versionMatch && versionMatch[1]) { + return `Qwen-${capitalizeWords(versionMatch[1])}`; + } + return "Qwen"; + } + + // DeepSeek - preserve full version numbers and suffixes + if (name.includes("deepseek")) { + // Match patterns like: deepseek-v3.1, deepseek-v3.2-exp, deepseek-v3 + // First try to match with version and suffix + const fullMatch = name.match(/deepseek[_-]?v?(\d+\.\d+[a-z0-9]*)[_-]?([a-z0-9-]+)?/); + if (fullMatch) { + const version = fullMatch[1]; + const suffix = fullMatch[2]; + if (suffix) { + return `DeepSeek-V${version}-${capitalizeWords(suffix)}`; + } + return `DeepSeek-V${version}`; + } + // Try to match just version + const versionMatch = name.match(/deepseek[_-]?v?(\d+\.\d+)/); + if (versionMatch) { + return `DeepSeek-V${versionMatch[1]}`; + } + // Fallback to generic DeepSeek + return "DeepSeek"; + } + + // Moonshot/Kimi - preserve full model names + if (name.includes("moonshot") || name.includes("kimi")) { + // Match patterns like: moonshot-kimi-k2-instruct, kimi-k2-instruct + // First check if it contains k2 + if (name.includes("k2")) { + // Try to extract suffix after k2 (e.g., -instruct) + const k2Match = name.match(/k2[_-]?([a-z0-9-]+)?/); + if (k2Match && k2Match[1]) { + return `Moonshot-Kimi-K2-${capitalizeWords(k2Match[1])}`; + } + return "Moonshot-Kimi-K2"; + } + if (name.includes("kimi")) { + return "Kimi"; + } + return "Moonshot"; + } + + // OpenAI - preserve full version numbers + if (name.includes("gpt") || name.includes("o1") || name.includes("o2") || name.includes("o3")) { + // Match patterns like: gpt-4o, gpt-4.5, gpt-4, gpt-3.5-turbo + if (name.includes("gpt-4o")) { + const suffixMatch = name.match(/gpt-4o[_-]?([a-z0-9-]+)?/); + if (suffixMatch && suffixMatch[1]) { + return `GPT-4o-${capitalizeWords(suffixMatch[1])}`; + } + return "GPT-4o"; + } + if (name.includes("gpt-4.5")) { + const suffixMatch = name.match(/gpt-4\.5[_-]?([a-z0-9-]+)?/); + if (suffixMatch && suffixMatch[1]) { + return `GPT-4.5-${capitalizeWords(suffixMatch[1])}`; + } + return "GPT-4.5"; + } + if (name.includes("gpt-4")) { + const suffixMatch = name.match(/gpt-4[_-]?([a-z0-9-]+)?/); + if (suffixMatch && suffixMatch[1]) { + return `GPT-4-${capitalizeWords(suffixMatch[1])}`; + } + return "GPT-4"; + } + if (name.includes("gpt-3.5")) { + const suffixMatch = name.match(/gpt-3\.5[_-]?([a-z0-9-]+)?/); + if (suffixMatch && suffixMatch[1]) { + return `GPT-3.5-${capitalizeWords(suffixMatch[1])}`; + } + return "GPT-3.5"; + } + // O-series models + if (name.includes("o3")) { + return "O3"; + } + if (name.includes("o2")) { + return "O2"; + } + if (name.includes("o1")) { + return "O1"; + } + return "OpenAI"; + } + + // Claude - preserve full model names + if (name.includes("claude")) { + if (name.includes("claude-opus")) { + const versionMatch = name.match(/claude-opus[_-]?(\d+[a-z0-9-]*)?/); + if (versionMatch && versionMatch[1]) { + return `Claude-Opus-${capitalizeWords(versionMatch[1])}`; + } + return "Claude-Opus"; + } + if (name.includes("claude-sonnet")) { + const versionMatch = name.match(/claude-sonnet[_-]?(\d+[a-z0-9-]*)?/); + if (versionMatch && versionMatch[1]) { + return `Claude-Sonnet-${capitalizeWords(versionMatch[1])}`; + } + return "Claude-Sonnet"; + } + if (name.includes("claude-haiku")) { + const versionMatch = name.match(/claude-haiku[_-]?(\d+[a-z0-9-]*)?/); + if (versionMatch && versionMatch[1]) { + return `Claude-Haiku-${capitalizeWords(versionMatch[1])}`; + } + return "Claude-Haiku"; + } + return "Claude"; + } + + // Google Gemini + if (name.includes("gemini")) { + const versionMatch = name.match(/gemini[_-]?([a-z0-9.-]+)?/); + if (versionMatch && versionMatch[1]) { + return `Gemini-${capitalizeWords(versionMatch[1])}`; + } + return "Gemini"; + } + + // If no specific pattern matched, return formatted original name + // Truncate only if extremely long (over 30 chars) + if (modelName.length > 30) { + return capitalizeWords(modelName.substring(0, 27)) + "..."; + } + + // Return formatted original name + return capitalizeWords(modelName); +} + diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..cc653b7 --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,60 @@ +import tailwindcssAnimate from "tailwindcss-animate"; + +/** @type {import('tailwindcss').Config} */ +const config = { + darkMode: ["class"], + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: { + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)" + }, + colors: { + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))" + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))" + }, + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))" + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))" + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))" + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))" + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))" + }, + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + chart: { + "1": "hsl(var(--chart-1))", + "2": "hsl(var(--chart-2))", + "3": "hsl(var(--chart-3))", + "4": "hsl(var(--chart-4))", + "5": "hsl(var(--chart-5))" + } + } + } + }, + plugins: [tailwindcssAnimate, require("tailwindcss-animate")], +}; +export default config; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..b945d5f --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "paths": { + "@/*": ["*"] + }, + "module": "nodenext", + "target": "esnext", + "types": [], + "sourceMap": true, + "declaration": true, + "declarationMap": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "strict": true, + "jsx": "react-jsx", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true + } +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..7391a96 --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,16 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import tsconfigPaths from "vite-tsconfig-paths"; +import tailwindcss from "@tailwindcss/vite"; + +export default defineConfig({ + server: { + allowedHosts: ["localhost", "trading.evoagents.cn","www.evoagents.cn"] + }, + plugins: [react(), tsconfigPaths(),tailwindcss()], + preview: { + host: "0.0.0.0", + port: 4173 + }, +}); + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..468218c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,80 @@ +[build-system] +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "evotraders" +version = "0.1.0" +description = "EvoTraders: A self-evolving multi-agent trading system" +readme = "README.md" +requires-python = ">=3.9" +license = {text = "MIT"} +authors = [ + {name = "EvoTraders Team "} +] +keywords = ["trading", "ai", "multi-agent", "fintech", "algorithmic-trading"] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Financial and Insurance Industry", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Topic :: Office/Business :: Financial :: Investment", +] + +dependencies = [ + "agentscope>=1.0.8", + "reme-ai>=0.2.0.4", + "asyncio>=3.4.3", + "rich>=13.6.0", + "websockets>=12.0", + "websocket-client>=1.6.0", + "python-dotenv>=1.0.0", + "finnhub-python>=2.4.25", + "numpy>=1.24.0", + "pandas>=2.0.0", + "matplotlib>=3.7.0", + "seaborn>=0.12.0", + "pandas-market-calendars>=5.0.0", + "typer>=0.12.5", + "openai>=2.9.0", + "anthropic>=0.20.0", + "dotenv", + "typer", +] + + +[project.optional-dependencies] +dev = [ + "pytest>=8.3.3", + "ruff>=0.6.9", + "black>=25.0.0" +] + +[project.urls] +Homepage = "http://trading.evoagents.cn" +Repository = "https://github.com/agentscope-ai/agentscope-samples/evotraders" +Documentation = "https://github.com/agentscope-ai/agentscope-samples/evotraders/README.md" +"Bug Tracker" = "https://github.com/agentscope-ai/agentscope-samples/issues" + +[project.scripts] +evotraders = "backend.cli:app" + +[tool.setuptools] +packages = ["backend", "backend.agents", "backend.config", + "backend.data", "backend.llm", + "backend.tools", "backend.utils", "backend.services"] + +[tool.ruff] +line-length = 88 +target-version = "py39" + +[tool.pytest.ini_options] +testpaths = ["backend/tests"] +python_files = ["test_*.py"] +python_classes = ["Test*"] +python_functions = ["test_*"] +

uv9Q~?eBjBJmB?~ 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