Skip to content

Latest commit

 

History

History
176 lines (147 loc) · 11.7 KB

File metadata and controls

176 lines (147 loc) · 11.7 KB

StockLens 系统架构

分层架构

┌─────────────────────────────────────────────────────────────┐
│                      接入层 (Access)                         │
│  CLI (main.py) · Bot (钉钉/飞书 Stream) · REST API (FastAPI) │
├─────────────────────────────────────────────────────────────┤
│                    API 层 (api/)                             │
│  FastAPI 路由 · 可选认证 · 错误处理中间件 · 依赖注入         │
│  端点: analysis · agent · history · portfolio · backtest    │
│        stocks · system_config · auth · usage                │
│  双 executor: long_pool (LLM/Agent) + io_pool (轻 IO)        │
├─────────────────────────────────────────────────────────────┤
│                     契约层 (Contracts)                        │
│  stocklens/contracts/ — 核心层 ⇄ 适配层共享数据类             │
│  BotMessage / ChatType ; bot/ 与 api/ 反向引用此处            │
├─────────────────────────────────────────────────────────────┤
│                   业务编排层 (Orchestration)                  │
│  ┌───────────────────────────────────────────────────────┐  │
│  │       StockAnalysisPipeline (核心调度,流水线)          │  │
│  │  Phase 1 共享数据预取 → Phase 2 数据预采集              │  │
│  │  Phase 3 enrich 池 + LLM 池 并行运行                    │  │
│  │  → 报告保存 → 10 渠道推送 → [可选] 自动回测            │  │
│  └───────────────────────────────────────────────────────┘  │
│  ┌─────────────┐ ┌─────────────┐ ┌───────────────────────┐ │
│  │ Agent 编排器 │ │ LLM 分析器  │ │ 评分引擎 (18 模型)    │ │
│  │ 5 Agent 协作 │ │ Prompt 构建 │ │ Piotroski/Altman/...  │ │
│  └─────────────┘ └─────────────┘ └───────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│                    服务层 (Services)                          │
│  评分引擎 · 任务队列 · 系统配置 · 历史服务 · 布林带服务      │
│  Finviz · 行业分析 · 社交情绪 · 技术指标 · 报告渲染         │
├─────────────────────────────────────────────────────────────┤
│                    数据层 (Data)                              │
│  ┌─────────────────────┐  ┌────────────────────────────┐   │
│  │ 10 Data Fetchers     │  │ SQLite + SQLAlchemy ORM    │   │
│  │ yfinance · xueqiu    │  │ PRAGMA WAL/mmap/cache=64MB │   │
│  │ akshare · tushare    │  │ ON CONFLICT 批量 upsert   │   │
│  │ efinance · baostock  │  │ 9 个 Repository           │   │
│  │ openbb · twelvedata  │  │ TTL(L1) + SQLite(L2) 缓存 │   │
│  │ pytdx · tickflow     │  └────────────────────────────┘   │
│  │ (auto failover)      │  ┌────────────────────────────┐   │
│  └─────────────────────┘  │ 7 搜索引擎 Provider         │   │
│                            │ Tavily · SerpAPI · Bocha   │   │
│                            │ MiniMax · Brave · SearXNG   │   │
│                            │ AkshareNews                 │   │
│                            └────────────────────────────┘   │
├─────────────────────────────────────────────────────────────┤
│                    基础设施 (Infrastructure)                  │
│  utils/concurrency.py — 11 个池统一通过 STOCKLENS_*_WORKERS  │
│  utils/cache.py        — TTLCache + thread-local SQLiteCache│
│  utils/logging_setup   — 文件/控制台双输出 + DEBUG 级日志    │
├─────────────────────────────────────────────────────────────┤
│                    输出层 (Output)                            │
│  报告生成器 (Markdown/微信/简报模板,Jinja2)                  │
│  10 推送渠道: 微信企业 · 飞书 · Telegram · Email · Discord   │
│              Pushover · PushPlus · ServerChan3 · AstrBot    │
│              自定义 Webhook                                  │
├─────────────────────────────────────────────────────────────┤
│                    测试层 (Tests)                            │
│  tests/unit/ — pytest 246 用例                                │
│  scoring helpers · composite score · concurrency · code 归一化│
└─────────────────────────────────────────────────────────────┘

关键设计决策

1. 多数据源 Failover

  • 10 个 Fetcher 实现统一的 BaseFetcher 接口
  • DataFetcherManager 按优先级({SOURCE}_PRIORITY 环境变量)逐个尝试
  • 每个 Fetcher 声明支持的市场(A/港/美),路由时自动跳过不支持的源
  • 熔断机制:连续失败后冷却 CIRCUIT_BREAKER_COOLDOWN

2. LLM 通道管理

三种配置方式(优先级从高到低):

  1. LiteLLM YAMLLITELLM_CONFIG=litellm_config.yaml,完整的 Router 配置
  2. 多通道环境变量LLM_CHANNELS=deepseek,gemini,每通道独立配置
  3. Legacy 单 KeyGEMINI_API_KEY / OPENAI_API_KEY,自动转换为 Router

所有方式最终统一为 LiteLLM Router,支持多模型负载均衡和 fallback。

3. 量化评分引擎

  • 18 个独立模型,每个模型输出标准化分数
  • 综合评分公式:宏观 25 + 基本面 20 + 估值 20 + 技术+动量 15 + 困境 10 + 情绪 10(满分 100)
  • 评分由 Python 确定性计算,LLM 不可修改,只负责解读
  • 已被 246 单测中的 14 用例锁定行为(tests/unit/test_composite_score.py

4. 多 Agent 架构

  • single 模式:单个 ReAct Agent,循环调用工具
  • multi 模式:编排器协调 5 个专业 Agent
    • Technical Agent → 技术面分析
    • Intel Agent → 情报搜索
    • Risk Agent → 风险评估(可一票否决)
    • Strategy Agent × N → 策略回测
    • Decision Agent → 最终决策
  • Agent 工具并行执行(线程池 AGENT_TOOLS,默认 5)

5. 二级缓存

  • L1:进程内 TTLCache,热数据秒级访问
  • L2:SQLite 持久化缓存,跨进程/重启保留;thread-local 连接复用,避免每次 get/put 重建连接 + PRAGMA
  • 缓存 key 基于函数签名 + 参数哈希

6. 流水线编排(核心性能优化)

  • Pipeline 把"数据增强"和"LLM 调用"拆为两个独立线程池
  • enrichment 完成一只 → 通过 add_done_callback 立即向 LLM 池提交任务
  • 消除"全部 enrich 完成才开始 LLM"的空闲等待
  • 详见 modules/pipeline.md

7. SQLite PRAGMA 全启

DatabaseManager._setup_sqlite_pragmas() 注册 SQLAlchemy connect 事件,每个新物理连接自动应用:

PRAGMA 作用
journal_mode WAL 写不阻塞读,并发读 2-5×
synchronous NORMAL 比 FULL 快 ~2×
busy_timeout 5000 锁竞争最多等 5 秒
cache_size -64000 每连接 64MB 页缓存
temp_store MEMORY 临时表/索引内存中
foreign_keys ON 启用 FK 约束
mmap_size 268435456 256MB 内存映射
wal_autocheckpoint 2000 F4: 8 MiB 触发 checkpoint(默认 4 MiB 太频繁)
optimize 每次新连接 + atexit 各跑一次,刷新 planner 统计

8. 批量 Upsert

save_dataframe(日线)/ save_weekly_data / save_pe_history 用 SQLite INSERT ... ON CONFLICT DO UPDATE 一次性 upsert,相比逐行 select-then-insert 快 10-20×。

9. 并发可调

所有 ThreadPoolExecutor 通过 stocklens.utils.concurrency.get_pool_workers(name) 取 worker 数:

  1. STOCKLENS_<NAME>_WORKERS 具名覆盖
  2. STOCKLENS_DEFAULT_WORKERS 全局覆盖
  3. os.cpu_count() or 4 fallback

11 个池接入:PIPELINE / PREFETCH / DATA_FETCH / DC_IO / US_ENRICH / US_MACRO / AGENT_TOOLS / SEARCH / STOCK_INFO / TASK_QUEUE / TASK_SERVICE。

10. 层级解耦

  • 核心层 (stocklens/) 不依赖适配层 (bot/, api/)
  • BotMessage / ChatType 等跨层类型放在 stocklens.contracts
  • bot/models.py 改为 re-export,保持向后兼容

目录与模块映射

目录 模块 详细文档
main.py CLI 入口 modules/main.md
api/ REST API modules/api.md
bot/ Bot 平台 modules/bot.md
tickbridge/ 统一数据层(独立可发布) modules/tickbridge.md
stocklens/contracts/ 跨层契约 modules/contracts.md
stocklens/config/ 配置管理 modules/config.md
stocklens/storage/ 数据库 ORM modules/storage.md
stocklens/pipeline/ 流水线编排 modules/pipeline.md
stocklens/analyzer/ LLM 分析器 modules/analyzer.md
stocklens/agent/ 多 Agent modules/agent.md
stocklens/services/ 业务服务 modules/services.md
stocklens/search/ 搜索引擎 modules/search.md
stocklens/market/ 市场环境 modules/market.md
stocklens/notification/ 推送通知 modules/notification.md
stocklens/portfolio/ 组合管理 modules/portfolio.md
stocklens/backtest/ 回测系统 modules/backtest.md
stocklens/utils/concurrency.py 并发池配置 modules/concurrency.md
strategies/ 策略定义 modules/agent.md
templates/ 报告模板 modules/notification.md
tests/ 单测 (pytest tests/)