知识
← 返回

DSA 深度调研报告

2026-05-15 金融
#金融 #股票研究

daily-stock-analysis(DSA)深度调研报告

文档类型: 技术调研报告
调研时间: 2026-05-15
调研范围: /opt/vendor/daily-stock-analysis/ 全项目源码
代码总量: ~12,000+ 行 Python(不含前端和测试)


一、项目概览

daily-stock-analysis(简称 DSA) 是一个基于 AI 大模型的 A股/港股/美股自选股智能分析系统。核心能力包括:

  • 每日自动分析自选股,生成”决策仪表盘”(一句话核心结论 + 评分 + 买卖点位 + 风险警报)
  • 内置 11 种交易策略(缠论、波浪、龙头、情绪周期等),YAML 文件定义,无需写代码
  • 多数据源自动 fallback(akshare、efinance、baostock、tushare、yfinance 等 10+ 数据源)
  • 多 Agent 协作分析体系(technical → intel → risk → decision)
  • 多渠道推送(企业微信、飞书、TG、Discord、Slack、邮件)
  • 回测验证系统(对历史分析做事后验证,追踪方向准确率)

技术栈:Python 3.11、FastAPI、SQLAlchemy + SQLite、LiteLLM(多 LLM 适配)、Jinja2(报告模板)


二、架构树

DSA 采用分层架构,从上到下分为:入口层、服务层、核心层、数据层、存储层。

daily-stock-analysis/
├── 入口层(多种调用方式)
   ├── main.py                  # CLI 入口(命令行分析、定时任务)
   ├── server.py                # FastAPI 服务入口(端口 8000)
   ├── analyzer_service.py      # 程序化调用封装(可被 import)
   ├── webui.py                 # WebUI 入口
   └── bot/                     # 机器人入口(TG/Discord/飞书/钉钉)
       ├── dispatcher.py        # 命令分发器
       ├── handler.py           # 消息处理器
       ├── commands/            # 命令实现(/ask /analyze /chat 等)
       └── platforms/           # 平台适配(各聊天平台)

├── API 层(RESTful 接口)
   └── api/v1/endpoints/
       ├── analysis.py          # 股票分析接口
       ├── agent.py             # Agent 策略问答接口
       ├── history.py           # 历史报告查询
       ├── portfolio.py         # 持仓管理接口
       ├── backtest.py          # 回测接口
       └── system_config.py     # 系统配置接口

├── 服务层(业务服务)
   └── src/services/
       ├── analysis_service.py  # 分析服务编排
       ├── portfolio_service.py # 持仓管理(买卖/成本/分红/拆股)
       ├── backtest_service.py  # 回测服务
       ├── history_service.py   # 历史报告管理
       ├── report_renderer.py   # Jinja2 报告渲染
       └── social_sentiment_service.py # 社交舆情(美股)

├── 核心层(分析引擎)
   ├── src/core/
      ├── pipeline.py          # 分析流水线(1775行,核心中的核心)
      ├── market_review.py     # 大盘复盘
      ├── market_strategy.py   # 市场策略
      ├── backtest_engine.py   # 回测引擎
      ├── trading_calendar.py  # 交易日历
      └── config_registry.py   # 配置注册表(所有配置项定义)
   
   ├── src/agent/               # Agent 体系
      ├── agents/              # 6个专用 Agent
         ├── base_agent.py    # 抽象基类(system_prompt + run)
         ├── technical_agent.py   # 技术面分析(max_steps=6)
         ├── intel_agent.py       # 情报分析(max_steps=4)
         ├── risk_agent.py        # 风险评估(max_steps=4)
         ├── decision_agent.py    # 决策合成(max_steps=3)
         └── portfolio_agent.py   # 持仓分析
      ├── orchestrator.py      # 多 Agent 流水线调度器
      ├── runner.py            # ReAct 执行循环
      ├── executor.py          # AgentExecutor(单 Agent 模式)
      ├── factory.py           # AgentExecutor 工厂(build_agent_executor)
      ├── llm_adapter.py       # 多 LLM 适配器(via LiteLLM)
      ├── memory.py            # AgentMemory(分析历史 + 校准)
      ├── conversation.py      # 会话管理
      ├── skills/              # Skill 系统
         ├── router.py        # Skill 路由器
         ├── skill_agent.py   # Skill 执行 Agent
         ├── aggregator.py    # Skill 意见聚合
         └── defaults.py      # 默认策略
      └── tools/               # Tool 系统
          ├── registry.py      # Tool 注册表
          ├── data_tools.py    # 数据工具(行情/K线/筹码/持仓)
          ├── market_tools.py  # 市场工具(指数/板块)
          ├── search_tools.py  # 搜索工具(新闻/情报)
          ├── analysis_tools.py # 分析工具(趋势/均线/形态)
          └── backtest_tools.py # 回测工具
   
   └── src/analyzer.py          # 传统分析器(GeminiAnalyzer,2547行)

├── 数据层(多数据源适配)
   └── data_provider/
       ├── base.py              # DataFetcherManager + BaseFetcher(2500行)
       ├── akshare_fetcher.py   # 东方财富接口(免费)
       ├── efinance_fetcher.py  # 东方财富另一接口(免费)
       ├── baostock_fetcher.py  #  baostock(免费)
       ├── pytdx_fetcher.py     # 通达信协议(免费)
       ├── yfinance_fetcher.py  # Yahoo Finance(免费)
       ├── tushare_fetcher.py   # Tushare(免费额度 80次/分钟)
       ├── tickflow_fetcher.py  # TickFlow(付费)
       └── longbridge_fetcher.py # Longbridge(付费港股/美股)

├── 存储层
   ├── data/stock_analysis.db   # SQLite 主数据库
   └── src/storage.py           # SQLAlchemy 模型 + DatabaseManager

├── 策略层
   └── strategies/*.yaml        # 11 种策略定义文件

└── 配置层
    ├── .env.example             # 完整环境变量配置模板
    ├── src/config.py            # 配置加载器(2581行)
    └── src/core/config_registry.py # 配置项注册表(所有配置定义)

三、典型 Query 动线:一次股票分析的全流程

analyzer_service.analyze_stock("600519") 为例,代码执行链路如下。

3.1 入口阶段

analyzer_service.analyze_stock(code="600519")
  └─→ 创建 StockAnalysisPipeline(config, query_id, query_source="cli")
        └─→ pipeline.process_single_stock(code, report_type, query_id, ...)

3.2 数据获取阶段(pipeline.py Step 1-3)

Step 1: 实时行情获取

  • fetcher_manager.get_realtime_quote("600519")
  • 按优先级遍历所有 fetcher:tushare → efinance → akshare → …(自动 fallback)
  • 返回:price、change_pct、volume、turnover、pe、pb 等

Step 2: 历史K线获取

  • fetcher_manager.get_daily_history("600519", days=60)
  • 优先从 SQLite DB 缓存读取,缺失时调用 fetcher,成功后写入缓存

Step 2.5: 基本面聚合

  • fetcher_manager.get_fundamental_context("600519")
  • 获取 PE/PB/ROE/营收/净利润等

Step 3: 趋势分析(本地计算,不调用 LLM)

  • trend_analyzer.analyze(df_historical, code)
  • 计算 MA5/MA10/MA20/MA60、MACD、RSI、布林带
  • 判断趋势状态,生成买入信号评分(0-100)

3.3 分支点:Agent 模式判断

use_agent = config.agent_mode  # 默认 False
if not use_agent:
    configured_skills = config.agent_skills  # 默认空
    if configured_skills and configured_skills != ["all"]:
        use_agent = True  # 配置了特定策略时自动启用 Agent 模式

分支 A — 传统分析路径(默认,agent_mode=false)

Step 4: 多维度情报搜索(最多 5 次搜索,新闻/公告/研报/舆情)
Step 5-6: 上下文增强(聚合所有数据到 enhanced_context)
Step 7: AI 分析 — 只调 1 次 LLM

  • analyzer.analyze(enhanced_context, news_context)
  • 通过 LiteLLM Router 调用配置的 LLM
  • LLM 返回 JSON 格式决策仪表盘

分支 B — Agent 分析路径(agent_mode=true)

Step 7’: Agent 分析链路

  • build_agent_executor(config, skills) 创建执行器
  • 根据 AGENT_ARCH 选择:single(单 Agent ReAct)或 multi(多 Agent 流水线)

Multi-Agent 模式执行流程:

  • Stage 1: technical_agent.run() — 技术面分析(最多 6 步 ReAct)
  • Stage 2: intel_agent.run() — 情报分析(最多 4 步)
  • Stage 3: risk_agent.run() — 风险评估(full/specialist 模式,最多 4 步)
  • Stage 3.5: skill_agent.run() — 策略执行(specialist 模式,最多 3 个并行 skill)
  • Stage N: decision_agent.run() — 决策合成(无工具权限,纯汇总)

3.4 结果输出阶段

两种路径最终都生成 AnalysisResult:

  • dashboard(决策仪表盘 JSON): core_conclusion / data_perspective / intelligence / battle_plan
  • sentiment_score(0-100 情绪评分)
  • operation_advice(买入/加仓/持有/减仓/卖出/观望)
  • confidence_level(高/中/低)

如果配置了 notifier,通过 Matrix/企业微信/飞书/TG/… 推送报告。


四、Skill 系统:自然语言策略引擎

4.1 Skill 是什么

Skill 是 DSA 的”策略能力包”,用 YAML 文件定义交易策略的分析逻辑和判断规则。用户写自然语言即可定义策略,无需写任何代码。

DSA 的 strategies/​ 目录与代码中的 skill 是同一概念:代码里叫 skill,用户文档里叫策略。

4.2 Skill 文件结构

strategies/dragon_head.yaml(龙头策略)为例:

name: dragon_head              # 唯一标识(英文,下划线)
display_name: 龙头策略          # 显示名称(中文)
description: 板块轮动中识别龙头股  # 简短描述
category: trend                # 分类:trend/pattern/reversal/framework
core_rules: [2, 7]             # 关联核心交易理念编号
required_tools:                # 该策略需要使用的工具
  - get_realtime_quote
  - get_sector_rankings
  - search_stock_news
aliases: [龙头, 龙头战法]       # 用户可用别名调用
default_priority: 90           # 展示优先级(越小越靠前)
market_regimes: [sector_hot]   # 适用市场状态

instructions: |
  **龙头策略(Dragon Head Strategy)**

  评估标准:
  1. 板块领涨地位:使用 get_sector_rankings 检查板块排名...
  2. 换手率与动能:使用 get_realtime_quote 检查换手率...
  3. 相对强度:对比个股涨跌幅与板块平均值...
  4. 新闻催化:使用 search_stock_news 搜索催化剂...

  评分调整:
  - 确认为龙头股:sentiment_score +10
  - 板块轮动期:额外 +5

4.3 Skill 加载机制

SkillManagersrc/agent/skills/base.py)负责加载和管理 Skill:

  1. 系统启动时扫描 strategies/​ 目录(或 AGENT_SKILL_DIR 配置目录)
  2. 解析所有 .yaml 文件,构建 Skill 原型对象
  3. 通过 deepcopy 克隆给每个请求使用(线程安全)
  4. Skill 内容以自然语言形式注入 Agent 的 System Prompt

SkillRoutersrc/agent/skills/router.py)负责选择适用 Skill:

  • auto 模式:根据市场状态(market_regime)自动选择匹配的 Skill
  • manual​ 模式:只使用 AGENT_SKILLS 配置列表中的 Skill

4.4 Skill 执行流程

  1. SkillRouter 选择适用 Skill(如缠论策略)
  2. 创建 SkillAgent(src/agent/skills/skill_agent.py),封装该 Skill
  3. SkillAgent 的 tool_names​ 被限制为 Skill YAML 中 required_tools 声明的子集
  4. SkillAgent 执行 ReAct 循环,LLM 按 Skill instructions 自主调用所需 Tool
  5. 输出 Skill 意见(AgentOpinion),注入共享上下文

4.5 Skill 意见聚合

当多个 Skill 同时执行时(specialist 模式最多 3 个并行),SkillAggregatorsrc/agent/skills/aggregator.py)会:

  1. 收集每个 SkillAgent 的 AgentOpinion
  2. 根据历史回测胜率(BacktestService)动态加权
  3. 合成一份共识意见(consensus),供 decision_agent 使用

4.6 内置 Skill 清单

Skill ID 名称 分类 适用市场状态 核心逻辑
bull_trend 默认多头趋势 trend trending_up 识别多头排列、趋势延续与回踩低吸
ma_golden_cross 均线金叉 trend trending_up 均线金叉 + 量能确认
volume_breakout 放量突破 trend trending_up 放量突破阻力位
shrink_pullback 缩量回踩 trend trending_down, sideways 缩量回踩均线支撑
dragon_head 龙头策略 trend sector_hot 板块轮动中识别龙头股
emotion_cycle 情绪周期 framework sector_hot 识别情绪低点与高点,逆情绪布局
chan_theory 缠论 framework volatile 笔、线段、中枢、背驰
wave_theory 波浪理论 framework volatile 推动浪与调整浪结构
box_oscillation 箱体震荡 framework sideways 箱底买入、箱顶减仓
bottom_volume 底部放量 reversal trending_down 长期下跌后底部放量反转
one_yang_three_yin 一阳夹三阴 pattern - K线整理形态,趋势延续

五、Tool 系统:数据与计算的武器库

5.1 Tool 是什么

Tool 是 DSA 中可被 LLM 调用的数据获取和计算函数。每个 Tool 都是一个 Python 函数,通过 @tool​ 装饰器或 ToolDefinition 包装后注册到 ToolRegistry。

5.2 Tool 注册与发现

ToolRegistrysrc/agent/tools/registry.py)是 Tool 的中央注册表:

# factory.py 中模块级缓存,所有 Agent 共享
_TOOL_REGISTRY = None

def get_tool_registry():
    global _TOOL_REGISTRY
    if _TOOL_REGISTRY is None:
        registry = ToolRegistry()
        for tool_fn in (ALL_DATA_TOOLS + ALL_ANALYSIS_TOOLS + 
                        ALL_SEARCH_TOOLS + ALL_MARKET_TOOLS + ALL_BACKTEST_TOOLS):
            registry.register(tool_fn)
        _TOOL_REGISTRY = registry
    return _TOOL_REGISTRY

注册后的 Tool 会被转换为 OpenAI function schema,供 LLM 在 ReAct 循环中调用。

5.3 Tool 分类清单(共 17+ 个)

数据工具 data_tools.py

  • get_realtime_quote — 实时行情(价格、涨跌幅、量比、PE/PB、市值)
  • get_daily_history — 日线 OHLCV 历史数据(含 MA5/10/20)
  • get_chip_distribution — 筹码分布(获利比例、平均成本、集中度)
  • get_analysis_context — 从数据库获取历史分析上下文
  • get_stock_info — 基本面信息(估值、成长、板块归属)
  • get_capital_flow — 主力资金流向(净流入、5日/10日累计)
  • get_portfolio_snapshot — 持仓组合快照与风险摘要

分析工具 analysis_tools.py

  • analyze_trend — 综合技术分析(MA排列、MACD、RSI、乖离率、支撑阻力)
  • calculate_ma — 计算任意周期均线(5/10/20/30/60/120/250)
  • get_volume_analysis — 量价关系分析(量比、量价配合/背离)
  • analyze_pattern — K线形态识别(十字星、锤子线、吞没、双底、箱体等)

搜索工具 search_tools.py

  • search_stock_news — 搜索个股最新新闻
  • search_comprehensive_intel — 多维度情报搜索(新闻、风险、业绩、行业趋势)

市场工具 market_tools.py

  • get_market_indices — 大盘指数(上证、深证、沪深300 / 标普、纳指)
  • get_sector_rankings — 板块涨幅排行(领涨/领跌板块)

回测工具 backtest_tools.py

  • get_skill_backtest_summary — Skill 级回测统计
  • get_strategy_backtest_summary — 整体回测统计
  • get_stock_backtest_summary — 个股回测历史记录

5.4 Tool 执行机制

在 ReAct 循环中(src/agent/runner.py):

  1. LLM 收到 System Prompt + 当前上下文 + Tool 声明列表
  2. LLM 自主决定调用哪些 Tool(可一次请求多个,并行执行)
  3. runner 通过 ThreadPoolExecutor 并行执行(最多 5 个并发)
  4. 工具结果返回给 LLM,LLM 继续推理或给出最终答案
  5. 缓存机制:相同参数的工具调用会被缓存,避免重复执行

5.5 Agent 工具权限隔离

每个 Agent 可以声明自己需要的 Tool 子集:

class TechnicalAgent(BaseAgent):
    agent_name = "technical"
    max_steps = 6
    tool_names = ["get_realtime_quote", "get_daily_history", 
                  "analyze_trend", "calculate_ma", "get_volume_analysis"]

class DecisionAgent(BaseAgent):
    agent_name = "decision"
    max_steps = 3
    tool_names = []  # 无工具权限,纯合成

BaseAgent.run() 在启动 ReAct 循环前,通过 _filtered_registry() 构建只包含所需 Tool 的临时注册表,实现最小权限原则。


六、Skill 与 Tool 的关系

一句话总结:Skill 是”策略意图”(分析什么、按什么规则判断),Tool 是”数据动作”(获取什么数据、执行什么计算)。

Skill 通过 YAML 描述策略规则,Agent 将 Skill 的 instructions 注入 System Prompt 后,LLM 在 ReAct 循环中自主决定调用哪些 Tool 来获取数据、验证条件,最终按照 Skill 的策略规则生成分析结论。

6.1 核心差异

维度 Skill Tool
本质 策略意图 数据动作
载体 YAML 自然语言文件 Python 函数
是否执行代码 不执行,仅作为 Prompt 注入 执行实际的数据获取/计算
可扩展方式 写 YAML(零代码) 写 Python 函数 + 注册
被谁使用 Agent System Prompt LLM 在 ReAct 循环中调用

6.2 协作流程示例

以”缠论分析 600519”为例:

  1. SkillRouter 选择 chan_theory.yaml
  2. SkillAgent 创建,tool_names 限制为 [get_daily_history, analyze_trend, get_realtime_quote]
  3. ReAct 执行:
  • Step 1: LLM 调用 get_daily_history 获取 60 日 K 线
  • Step 2: LLM 调用 analyze_trend 获取 MACD/RSI
  • Step 3: LLM 按缠论规则判断背驰 → 调用 get_realtime_quote 验证当前价 4. 输出缠论分析结论

七、功能实现清单

功能模块 实现位置 关键文件
实时行情获取 data_provider base.py + 各 fetcher
历史K线获取 data_provider base.py + 各 fetcher
筹码分布分析 data_provider base.py: get_chip_distribution
基本面聚合 data_provider fundamental_adapter.py
趋势分析(本地计算) core pipeline.py trend_analyzer
新闻/情报搜索 services search_service + social_sentiment_service
传统 LLM 分析 core analyzer.py GeminiAnalyzer
Agent ReAct 分析 agent runner.py + orchestrator.py
多 Agent 流水线 agent orchestrator.py
决策仪表盘生成 agent decision_agent.py
策略系统(Skill) agent/skills SkillManager + SkillRouter + SkillAgent
工具系统(Tool) agent/tools ToolRegistry + 各 tools 文件
持仓管理 services portfolio_service.py + portfolio_repo.py
回测验证 core/services backtest_engine.py + backtest_service.py
交易日历 core trading_calendar.py
大盘复盘 core market_review.py
报告渲染 services report_renderer.py (Jinja2)
历史记录管理 services history_service.py
多渠道推送 notification_sender 各 sender 文件
FastAPI 服务 api server.py + api/v1/endpoints
机器人接入 bot dispatcher.py + commands + platforms
数据库管理 storage storage.py (SQLAlchemy + SQLite)
配置管理 core/config config_registry.py + config.py

八、DSA 与 financial-team 的架构映射

8.1 功能映射

financial-team DSA 对应模块 关系
router.py(路由分发) bot/dispatcher.py + api/v1/endpoints DSA 更完善,支持多平台
expert_runner.py(专家执行) agent/orchestrator.py + agent/executor.py DSA 是多 Agent 流水线
strategy.md(策略专家 prompt) strategies/*.yaml + decision_agent.py DSA 策略可零代码扩展
research.md(调研专家 prompt) intel_agent.py + search_service DSA 有专门情报 Agent
risk.md(风控专家 prompt) risk_agent.py + portfolio_agent.py DSA 有专门风险 Agent
real_tools.py(工具集) agent/tools/*.py DSA 工具更丰富(17+ vs 7)
memory_manager.py(记忆管理) agent/memory.py + conversation.py DSA 有预测校准,但无跨 session 记忆
portfolio.json(持仓数据) portfolio_service.py + SQLite DSA 更专业(FIFO/avg/分红/拆股)
read_portfolio / write_portfolio portfolio_repo.py + API DSA 支持多账户多市场
save_to_siyuan(报告存储) history_service.py + DB DSA 有完整历史报告查询
Matrix 推送 notification_sender/ DSA 不支持 Matrix,支持其他渠道

8.2 架构差异

维度 financial-team DSA
用户隔离 FT_CALLER + 物理目录隔离 无多用户概念,单实例
对话历史 conversation_history.jsonl(跨 session) conversation_manager(单 session)
投资画像 investment_memory.json(长期) AgentMemory(分析历史 + 校准)
LLM 配置 仅 DeepSeek 15+ 渠道 + 自定义端点 + Ollama
数据源 新浪+腾讯+akshare(3个) 10+ 数据源 + 自动 fallback
策略系统 无(纯 prompt) 11 种 YAML 策略 + 可自定义
回测验证 有(方向准确率 + 模拟收益)
分析深度 单专家单轮 多 Agent 协作 + ReAct 多步
推送渠道 仅 Matrix 企业微信/飞书/TG/Discord/Slack/邮件
时间感知 无(计划修复) trading_calendar.py(A/H/美股)

8.3 互补关系

financial-team 的优势:多用户隔离、对话历史、Matrix 推送、OpenClaw 集成
DSA 的优势:数据源丰富、策略系统、多 Agent 分析、决策仪表盘、回测验证

最佳结合方式:financial-team 作为”交互管理层”,DSA 作为”分析引擎层”。


九、关键设计决策与可借鉴点

9.1 双路径分析设计

DSA 同时支持”传统 LLM 直调”和”Agent ReAct”两种分析路径,通过 agent_mode 配置无缝切换:

  • 默认走传统路径(成本低,1 次 LLM)
  • 需要深度分析时走 Agent 路径(成本高,4-7 次 LLM)

可借鉴:financial-team 的 hunter 也可以设计双路径 — 日常查询走轻量路径,深度分析时启用 Agent 路径。

9.2 多数据源自动 fallback

DataFetcherManager 按优先级排序所有 fetcher,逐个尝试直到成功:

  • 实时行情:tushare → tencent → akshare_sina → efinance → akshare_em
  • 历史K线:akshare → baostock → yfinance → sina

可借鉴:financial-team 的 get_stock_spot​ 和 get_stock_history 也可以引入 fallback 机制,避免单点故障。

9.3 自然语言策略(YAML Skill)

用户写 YAML 文件即可定义交易策略,无需写代码。策略内容以自然语言注入 Agent Prompt,LLM 按策略规则自主调用 Tool。

可借鉴:financial-team 的 hunter 也可以支持 YAML 策略文件,让用户(或我们)自定义短线策略规则。

9.4 Agent 工具权限隔离

每个 Agent 声明自己的 tool_names 子集,BaseAgent.run() 在启动 ReAct 循环前过滤注册表,实现最小权限。

可借鉴:financial-team 的 expert_runner 也可以为不同专家分配不同的工具子集(如 research 只能调用 news,strategy 可以调用 technical)。

9.5 模块级缓存 + deepcopy 复用

ToolRegistry 和 SkillManager 原型在模块级别缓存,每个请求通过 deepcopy 克隆,兼顾性能和线程安全。

可借鉴:financial-team 的 prompt 加载也可以引入缓存,避免每次请求都重新读文件。

9.6 决策仪表盘标准化输出

无论走传统路径还是 Agent 路径,最终都输出标准化的 AnalysisResult,包含 dashboard(核心结论/数据透视/情报/作战计划)等结构化字段。

可借鉴:financial-team 的专家输出也可以标准化为类似的结构化格式,便于下游解析和存储。

9.7 回测验证闭环

DSA 支持对历史分析做事后验证,追踪方向准确率和模拟收益。AgentMemory 根据历史准确率自动校准置信度。

可借鉴:financial-team 可以引入类似的回测机制,追踪专家推荐的实际表现,逐步优化策略。