<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Henry Lin</title>
    <description>The latest articles on DEV Community by Henry Lin (@henry_lin_3ac6363747f45b4).</description>
    <link>https://dev.to/henry_lin_3ac6363747f45b4</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3446346%2F27539de0-e3e2-4103-a99b-86d7a0f03d57.png</url>
      <title>DEV Community: Henry Lin</title>
      <link>https://dev.to/henry_lin_3ac6363747f45b4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/henry_lin_3ac6363747f45b4"/>
    <language>en</language>
    <item>
      <title>美股-后端服务模块</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 14 Jun 2026 09:19:45 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-hou-duan-fu-wu-mo-kuai-19j9</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-hou-duan-fu-wu-mo-kuai-19j9</guid>
      <description>&lt;h1&gt;
  
  
  后端服务模块（backend/）
&lt;/h1&gt;

&lt;p&gt;FastAPI 后端负责加载离线快照数据，提供查询、过滤、排序等 API，支持实时数据推送、预警系统、信号产品系统、因子回测和宏观/板块数据接口。&lt;/p&gt;

&lt;h2&gt;
  
  
  目录结构
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend/
├── main.py               # FastAPI 应用入口，路由注册，生命周期管理
├── prod_app.py           # 生产环境应用（含静态文件服务）
├── loader.py             # 数据加载、缓存、查询引擎
├── meta.py               # 元数据与筛选分组定义
├── presets.py            # 多时间周期预设策略定义
├── market_hours.py       # 美股交易时段与假日日历
│
│  # ── 实时数据 ──
├── rt_api.py             # 实时数据 API 路由
├── rt_hub.py             # 实时推送中心（WebSocket 编排）
├── rt_ws.py              # WebSocket 端点（设备注册、订阅管理）
├── rt_aliyun_ticker.py   # 阿里云行情后台 Ticker
│
│  # ── 预警系统 ──
├── alerts_api.py         # 预警 API 路由（CRUD + 事件查询）
├── alerts_db.py          # SQLite 存储层（规则、事件、设备）
├── alert_engine.py       # 预警引擎（规则评估、状态管理）
├── alert_dispatcher.py   # 预警分发器（WebSocket 推送）
├── alert_evaluators.py   # 规则评估器（6 种预警类型）
├── alert_models.py       # 数据结构（AlertRule, AlertEvent 等）
├── alerts_presets.py     # 预警模板（6 种预设规则）
│
│  # ── 信号产品系统 ──
├── signal_product_api.py    # 信号产品 API 路由（候选池、信号、绩效、模拟交易）
├── signal_product_models.py # 信号数据模型（Candidate/Signal/Outcome/Position）
├── signal_product_db.py     # 信号 SQLite 持久化（4 表：candidates/signals/outcomes/positions）
├── signal_entry_engine.py   # 盘中信号入场评估引擎
│
│  # ── 回测系统 ──
├── backtest_api.py       # 因子回测 API 路由（IC 评估、绩效分析）
│
│  # ── 数据接口 ──
├── screener_api.py       # 选股器 API（排名、评分）
├── macro.py              # 宏观经济指标接口
├── sectors.py            # 板块轮动数据接口
│
│  # ── 工具 ──
├── app/factors/
│   └── date_utils.py     # 日期格式工具（YYYYMMDD 标准化）
└── test_*.py             # 测试文件
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  启动流程
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;应用启动
  ↓
加载 config.yaml（实时数据 + 预警配置）
  ↓
load_snapshot()  → 缓存到 _SNAPSHOT_CACHE
load_history()   → 缓存到 _HISTORY_CACHE
  ↓
初始化 RTManager（实时数据管理器）
初始化 RTHub（推送中心）
初始化 AlertEngine + AlertDispatcher（预警引擎）
初始化 DeviceRegistry（WebSocket 设备注册）
初始化 SignalProductRepository（信号产品 SQLite）
  ↓
注册路由 + CORS 中间件
  ↓
可选：启动 Aliyun Ticker（后台定时获取行情）
  ↓
uvicorn 启动，监听 8000 端口
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  各文件详解
&lt;/h2&gt;

&lt;h3&gt;
  
  
  main.py — 应用入口
&lt;/h3&gt;

&lt;p&gt;FastAPI 应用的主入口，管理生命周期和路由。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生命周期&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;启动时：加载配置、初始化实时数据管理器、RTHub 推送中心、预警引擎、信号产品仓库、加载快照和历史数据&lt;/li&gt;
&lt;li&gt;关闭时：停止 Aliyun Ticker、清理资源&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;API 端点&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/meta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;返回筛选元数据（分组、标签、统计）&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/stocks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;查询股票列表&lt;/td&gt;
&lt;td&gt;filters, conditions, sort_by, sort_asc, offset, limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/pattern-stats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;形态统计（触发次数、胜率、收益率）&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/combo-stats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;多信号组合统计&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/stocks/{symbol}/history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;单只股票历史 K 线&lt;/td&gt;
&lt;td&gt;range (3m/6m/1y/2y)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/stock/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;单只股票快照数据&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/stocks/{symbol}/fundamentals&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;单只股票基本面数据&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/presets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;多时间周期预设策略列表&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  loader.py — 数据引擎
&lt;/h3&gt;

&lt;p&gt;核心数据模块，负责 parquet 加载、内存缓存和查询处理。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;缓存机制&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data.parquet  →  _SNAPSHOT_CACHE (DataFrame)  →  内存常驻
history.parquet → _HISTORY_CACHE (DataFrame)  →  内存常驻
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;全局变量 &lt;code&gt;_SNAPSHOT_CACHE&lt;/code&gt; / &lt;code&gt;_HISTORY_CACHE&lt;/code&gt; 实现懒加载&lt;/li&gt;
&lt;li&gt;首次访问时从磁盘加载，后续直接读内存&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;查询流程&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query_stocks(filters, conditions, sort_by, sort_asc, offset, limit)
  ↓
_apply_filters()      →  按标志列筛选（value=1）
  ↓
_parse_conditions()   →  解析 JSON 条件（支持 &amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;=, =）
  ↓
_apply_conditions()   →  应用连续值条件过滤
  ↓
排序 + 分页
  ↓
_to_records()         →  转换为 JSON 格式返回
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;列分类&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;REQUIRED_COLUMNS&lt;/td&gt;
&lt;td&gt;必需字段&lt;/td&gt;
&lt;td&gt;trade_date, symbol, name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CONTINUOUS_FILTER_COLUMNS&lt;/td&gt;
&lt;td&gt;连续值列&lt;/td&gt;
&lt;td&gt;ret_1d, ma5, forward_pe, piotroski_score, value_quality_score, altman_z_score, rsi_14, macd_dif, mfi_14...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SORTABLE_COLUMNS&lt;/td&gt;
&lt;td&gt;可排序字段&lt;/td&gt;
&lt;td&gt;signal_score, market_cap, piotroski_score, value_quality_score, altman_z_score...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATTERN_FLAG_COLUMNS&lt;/td&gt;
&lt;td&gt;形态标志列&lt;/td&gt;
&lt;td&gt;96+ 个二值指标（含 ind_macd_bull_cross, ind_rsi_oversold, ind_bb_squeeze 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  meta.py — 元数据定义
&lt;/h3&gt;

&lt;p&gt;定义前端的筛选分组结构和统计信息。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;筛选分组&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;分组 ID&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;指标数&lt;/th&gt;
&lt;th&gt;示例指标&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;single_candle&lt;/td&gt;
&lt;td&gt;单 K 形态&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;bull_candle, hammer, doji&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double_candle&lt;/td&gt;
&lt;td&gt;双 K 形态&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;bullish_engulfing, inside_bar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;triple_candle&lt;/td&gt;
&lt;td&gt;三 K 形态&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;three_white_soldiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;trend_structure&lt;/td&gt;
&lt;td&gt;趋势结构&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;ma_bull, platform_breakout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;volume_volatility&lt;/td&gt;
&lt;td&gt;量价波动&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;volume_breakout, vol_contraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;momentum&lt;/td&gt;
&lt;td&gt;动量&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;break_high_20, consec_up_3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;valuation&lt;/td&gt;
&lt;td&gt;估值指标&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;forward_pe, peg_ratio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;financials&lt;/td&gt;
&lt;td&gt;财务指标&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;roe, profit_margin, revenue_growth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fundamental_quality&lt;/td&gt;
&lt;td&gt;基本面质量&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;fund_piotroski_strong, fund_value_quality, risk_financial_distress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;advanced_indicators&lt;/td&gt;
&lt;td&gt;高级技术指标&lt;/td&gt;
&lt;td&gt;20+&lt;/td&gt;
&lt;td&gt;ind_macd_bull_cross, ind_rsi_oversold, ind_bb_squeeze, ind_mfi_oversold 等&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;核心函数&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;build_meta_response()&lt;/code&gt; — 构建完整的元数据响应（含统计）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build_pattern_stats_response()&lt;/code&gt; — 形态命中统计和标签&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_count_indicator_hits()&lt;/code&gt; — 计算各指标命中数量&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  signal_product_api.py — 信号产品 API
&lt;/h3&gt;

&lt;p&gt;信号产品系统的 REST API，覆盖候选池、入场信号、绩效追踪和模拟交易全流程。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;信号系统状态（活跃信号数、今日候选数、日期）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/candidates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;每日候选股列表（支持按日期/自选股/股票代码过滤）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/active&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;当前活跃（持仓中）信号列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;信号历史（分页，含已平仓信号）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/performance/summary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;聚合绩效指标（胜率、收益率、Sharpe）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/evaluate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;用实时数据评估今日全部候选股&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/evaluate/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;用实时数据评估单只候选股&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/portfolio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;模拟持仓列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/portfolio/follow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;跟随信号开仓（模拟交易）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/signals/portfolio/{position_id}/close&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;平仓（模拟交易）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  signal_product_models.py — 信号数据模型
&lt;/h3&gt;

&lt;p&gt;信号产品管线的全部数据结构。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心数据类&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据类&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;关键字段&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CandidateRecord&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每日候选股&lt;/td&gt;
&lt;td&gt;candidate_id, symbol, rank, offline_score, 各维度评分, 风险标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SignalRecord&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;盘中入场信号&lt;/td&gt;
&lt;td&gt;signal_id, candidate_id, symbol, entry/stop/target 价格, trigger_reasons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SignalOutcome&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;信号绩效追踪&lt;/td&gt;
&lt;td&gt;forward_return_1d/3d/5d/10d, MFE, MAE, hit_stop, hit_target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PaperPosition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;模拟交易仓位&lt;/td&gt;
&lt;td&gt;symbol, entry_price, quantity, stop/target, unrealized_pnl&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;CandidateRecord 风险门控&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HARD_RISK_FLAGS = {"low_liquidity", "abnormal_volatility", "weekly_downtrend"}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;is_eligible()&lt;/code&gt; — 检查评分阈值和无硬性风险标记&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  signal_product_db.py — 信号 SQLite 存储
&lt;/h3&gt;

&lt;p&gt;信号产品系统的持久化层，使用 SQLite WAL 模式。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据表&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;表&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;关键索引&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;candidates&lt;/td&gt;
&lt;td&gt;每日候选股打分结果&lt;/td&gt;
&lt;td&gt;date, symbol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;signals&lt;/td&gt;
&lt;td&gt;盘中入场信号&lt;/td&gt;
&lt;td&gt;date, symbol, status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;signal_outcomes&lt;/td&gt;
&lt;td&gt;后验绩效（MFE/MAE/前向收益）&lt;/td&gt;
&lt;td&gt;signal_id, symbol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;paper_positions&lt;/td&gt;
&lt;td&gt;模拟交易仓位&lt;/td&gt;
&lt;td&gt;symbol, status&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;特性&lt;/strong&gt;：WAL 模式并发、JSON 序列化、UPSERT 更新。&lt;/p&gt;




&lt;h3&gt;
  
  
  signal_entry_engine.py — 盘中信号入场引擎
&lt;/h3&gt;

&lt;p&gt;评估是否为候选股生成盘中入场信号。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 重入场门控&lt;/strong&gt;（全部通过才生成信号）：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;门控&lt;/th&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;条件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VWAP 门控&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_gate_price_above_vwap()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前价 &amp;gt; VWAP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;动量门控&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_gate_momentum()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;最新价 &amp;gt; 3根 Bar 前价格&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量能门控&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_gate_volume_surge()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;成交量 ≥ 1.5 × 近期均量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;波动率门控&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_gate_realized_volatility()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;实现波动率 &amp;lt; 4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;可配置参数&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;min_offline_score&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;最低离线评分阈值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;min_intraday_score&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;最低盘中评分阈值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;default_stop_pct&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;td&gt;默认止损比例（4%）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;default_reward_risk_ratio&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;默认盈亏比&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;volume_surge_threshold&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;量能突破倍数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max_realized_volatility&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;td&gt;最大允许实现波动率（4%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;核心函数&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;evaluate_entry_signal()&lt;/code&gt; — 主评估函数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;compute_intraday_score()&lt;/code&gt; — 计算 0-100 盘中评分&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build_trade_plan()&lt;/code&gt; — 根据配置计算止损/目标价&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  backtest_api.py — 因子回测 API
&lt;/h3&gt;

&lt;p&gt;因子评估和策略绩效的 REST API。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/backtest/factors&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;因子评估（IC/ICIR 统计、IC 分布）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/backtest/performance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;策略绩效（NAV、Sharpe、回撤、月度收益）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/backtest/compare&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;多策略对比&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/backtest/cache/clear&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;清除计算缓存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;预定义因子&lt;/strong&gt;：momentum_20d, momentum_5d, rsi_14, volume_ratio_5&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;绩效指标&lt;/strong&gt;：NAV 曲线、Sharpe/Calmar 比率、最大回撤、年化收益/波动率、胜率、超额收益&lt;/p&gt;




&lt;h3&gt;
  
  
  presets.py — 多时间周期预设策略
&lt;/h3&gt;

&lt;p&gt;定义跨日/周/60 分钟的多时间周期共振策略。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 种预设策略&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;预设&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;trend_following&lt;/td&gt;
&lt;td&gt;趋势追踪（多周期均线共振）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pullback_buy&lt;/td&gt;
&lt;td&gt;回调买入（趋势确认 + 回踩支撑）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;momentum_breakout&lt;/td&gt;
&lt;td&gt;动量突破（多周期突破共振）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value_quality&lt;/td&gt;
&lt;td&gt;价值质量（基本面 + 技术面共振）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;每个预设在日/周/60 分钟三个周期分别定义 conditions，后端根据快照数据计算匹配度并返回评分。&lt;/p&gt;




&lt;h3&gt;
  
  
  market_hours.py — 交易时段
&lt;/h3&gt;

&lt;p&gt;美股交易时段感知工具。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;判断当前交易时段（盘前/盘中/盘后/空闲）&lt;/li&gt;
&lt;li&gt;美东时区处理（America/New_York）&lt;/li&gt;
&lt;li&gt;内置假日日历（2026-2027 年）&lt;/li&gt;
&lt;li&gt;决定实时数据获取策略（空闲时段暂停）&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  rt_api.py — 实时数据路由
&lt;/h3&gt;

&lt;p&gt;提供盘中实时数据的 API 端点。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;可用性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rt/quotes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取实时报价&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rt/ranking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;实时排名&lt;/td&gt;
&lt;td&gt;付费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rt/kline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;分钟 K 线&lt;/td&gt;
&lt;td&gt;付费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rt/scan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全市场扫描&lt;/td&gt;
&lt;td&gt;付费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rt/status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;服务状态查询&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/rt-prices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;轻量价格轮询端点&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  rt_hub.py — 实时推送中心
&lt;/h3&gt;

&lt;p&gt;实时报价的核心编排模块，连接上游数据源和下游 WebSocket 客户端。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;管理所有 WebSocket 客户端连接&lt;/li&gt;
&lt;li&gt;处理订阅/取消订阅（每个客户端可订阅不同股票）&lt;/li&gt;
&lt;li&gt;接收上游推送并广播给订阅的客户端&lt;/li&gt;
&lt;li&gt;交易时段感知（非交易时段自动暂停推送）&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  rt_ws.py — WebSocket 端点
&lt;/h3&gt;

&lt;p&gt;提供 &lt;code&gt;/ws/rt&lt;/code&gt; WebSocket 端点供前端连接。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;设备注册与断线清理&lt;/li&gt;
&lt;li&gt;subscribe/unsubscribe 消息处理&lt;/li&gt;
&lt;li&gt;ping/pong 心跳检测&lt;/li&gt;
&lt;li&gt;连接状态追踪&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  rt_aliyun_ticker.py — 阿里云 Ticker
&lt;/h3&gt;

&lt;p&gt;后台定时任务，通过阿里云 API 获取实时行情并合并到快照缓存。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;特性&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;可配置更新间隔（默认 60 秒）&lt;/li&gt;
&lt;li&gt;交易时段感知（盘前显示 after_price，盘中显示 price，盘后显示 after_price）&lt;/li&gt;
&lt;li&gt;支持启动/停止控制&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;config.yaml&lt;/code&gt; 中的 &lt;code&gt;aliyun_ticker_enabled&lt;/code&gt; 开关&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  alerts_api.py — 预警 API
&lt;/h3&gt;

&lt;p&gt;预警系统的 REST API 接口。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/alerts/rules&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;获取预警规则列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/alerts/rules&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;创建预警规则&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/alerts/rules/{id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;删除预警规则&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/alerts/events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;获取触发事件历史（分页）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/alerts/presets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;获取预警模板列表&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;参数验证&lt;/strong&gt;：每设备最多 50 条规则，规则类型和参数校验。&lt;/p&gt;




&lt;h3&gt;
  
  
  alerts_db.py — 预警 SQLite 存储
&lt;/h3&gt;

&lt;p&gt;预警系统的持久化存储层。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据表&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;表&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;devices&lt;/td&gt;
&lt;td&gt;设备注册信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alert_rules&lt;/td&gt;
&lt;td&gt;预警规则（类型、参数、状态）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alert_events&lt;/td&gt;
&lt;td&gt;触发事件记录&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;特性&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WAL 模式支持并发读写&lt;/li&gt;
&lt;li&gt;事件自动清理（默认保留 30 天）&lt;/li&gt;
&lt;li&gt;外键级联删除&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  alert_engine.py — 预警引擎
&lt;/h3&gt;

&lt;p&gt;核心预警处理模块，负责规则评估、状态管理和事件分发。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;工作流&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;实时报价到达
  ↓
遍历所有 armed 状态的规则
  ↓
alert_evaluators 评估条件
  ↓
条件满足 → 触发事件
  ├── 状态变为 fired
  ├── 写入 SQLite (alert_events)
  └── alert_dispatcher → WebSocket 推送到前端
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  alert_evaluators.py — 规则评估器
&lt;/h3&gt;

&lt;p&gt;6 种预警类型的条件评估逻辑。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;评估器&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;价格变动&lt;/td&gt;
&lt;td&gt;price_change&lt;/td&gt;
&lt;td&gt;涨跌幅超过阈值（如 ±3%）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;突破新高&lt;/td&gt;
&lt;td&gt;breakout_high&lt;/td&gt;
&lt;td&gt;价格突破指定高点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跌破新低&lt;/td&gt;
&lt;td&gt;breakout_low&lt;/td&gt;
&lt;td&gt;价格跌破指定低点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成交量异动&lt;/td&gt;
&lt;td&gt;volume_spike&lt;/td&gt;
&lt;td&gt;成交量超过 N 倍均值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;均线交叉&lt;/td&gt;
&lt;td&gt;ma_cross&lt;/td&gt;
&lt;td&gt;短期均线穿越长期均线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52 周高低&lt;/td&gt;
&lt;td&gt;week52_high_low&lt;/td&gt;
&lt;td&gt;接近或突破 52 周高低点&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  alert_models.py — 数据结构
&lt;/h3&gt;

&lt;p&gt;预警系统的类型定义。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AlertRule&lt;/strong&gt; — 用户创建的预警规则&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CompiledRule&lt;/strong&gt; — 编译后的规则（含评估器）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AlertEvent&lt;/strong&gt; — 触发的事件记录&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AlertPreset&lt;/strong&gt; — 预警模板&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  alerts_presets.py — 预警模板
&lt;/h3&gt;

&lt;p&gt;6 种预定义预警模板，方便用户快速创建规则：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模板&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;急涨急跌&lt;/td&gt;
&lt;td&gt;涨跌幅超过阈值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;突破新高&lt;/td&gt;
&lt;td&gt;价格突破近期高点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跌破新低&lt;/td&gt;
&lt;td&gt;价格跌破近期低点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;放量异动&lt;/td&gt;
&lt;td&gt;成交量异常放大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;均线金叉&lt;/td&gt;
&lt;td&gt;短期均线上穿长期均线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52 周新高&lt;/td&gt;
&lt;td&gt;接近 52 周最高价&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  alert_dispatcher.py — 预警分发器
&lt;/h3&gt;

&lt;p&gt;将触发的预警事件通过 WebSocket 推送到对应设备的前端。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;维护设备 ID → WebSocket 连接的映射&lt;/li&gt;
&lt;li&gt;Best-effort 交付（连接断开则跳过）&lt;/li&gt;
&lt;li&gt;与 AlertEngine 事件回调对接&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  screener_api.py — 选股器 API
&lt;/h3&gt;

&lt;p&gt;提供选股结果和评分排名接口。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/screener/status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;选股器运行状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/screener/results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;排名结果列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/screener/stock/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;单只股票评分详情&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  macro.py — 宏观指标接口
&lt;/h3&gt;

&lt;p&gt;读取 &lt;code&gt;macro.parquet&lt;/code&gt; 并提供宏观指标 API。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/macro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;获取宏观指标数据&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;返回内容&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;各指标（VIX、10Y、DXY、SPX）的最新值和变化&lt;/li&gt;
&lt;li&gt;风险等级分类：calm（平静）/ normal（正常）/ risk（风险）&lt;/li&gt;
&lt;li&gt;缓存机制（mtime 感知，文件更新自动刷新）&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  sectors.py — 板块轮动接口
&lt;/h3&gt;

&lt;p&gt;读取 &lt;code&gt;sectors.parquet&lt;/code&gt; 并提供板块轮动数据 API。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/sectors&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;获取板块轮动数据&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;返回内容&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;11 个板块 ETF + 3 个风格 ETF 的排名&lt;/li&gt;
&lt;li&gt;20 日 / 60 日收益率&lt;/li&gt;
&lt;li&gt;相对 SPY 基准的相对强弱&lt;/li&gt;
&lt;li&gt;动量评分&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  prod_app.py — 生产环境包装
&lt;/h3&gt;

&lt;p&gt;在主应用基础上增加静态文件服务。如果 &lt;code&gt;static/&lt;/code&gt; 目录存在，自动挂载为静态资源路由。&lt;/p&gt;




&lt;h2&gt;
  
  
  运行命令
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>美股-数据管线模块</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 14 Jun 2026 09:19:26 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-shu-ju-guan-xian-mo-kuai-3e10</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-shu-ju-guan-xian-mo-kuai-3e10</guid>
      <description>&lt;h1&gt;
  
  
  数据管线模块（scripts/）
&lt;/h1&gt;

&lt;p&gt;数据管线负责从外部数据源获取股票行情和财务数据，计算技术指标和基本面评分，并构建离线快照文件供后端服务使用。同时包含宏观指标、板块数据、信号候选池和信号绩效的构建脚本。&lt;/p&gt;

&lt;h2&gt;
  
  
  目录结构
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scripts/
├── config.yaml            # 股票池与获取配置
├── yfinance_client.py     # yfinance API 封装
├── feature_engine.py      # 技术指标与形态识别
├── scorer.py              # 综合评分 + 价值-成长复合评分
├── build_snapshot.py      # 快照构建入口（编排器）
├── build_macro.py         # 宏观指标数据构建
├── build_sectors.py       # 板块 ETF 数据构建
├── rt_manager.py          # 实时数据管理器
├── rt_providers.py        # 实时数据源抽象层（yfinance / 阿里云）
├── rt_push_providers.py   # 实时推送源实现（TickFlow / Ashen / 阿里云）
├── ashen_ws_client.py     # Ashen WebSocket 客户端
├── signal_candidate_pool.py # 信号候选池离线打分
├── signal_outcomes.py     # 信号绩效计算（MFE/MAE/前向收益）
├── dev_server.sh          # 开发服务器管理脚本
└── daily5_alpha_select.py # Alpha 因子选股脚本
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  数据流
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config.yaml
    ↓
yfinance_client.py  ──获取──→  原始行情 + 股票信息 + 财务指标
    ↓
feature_engine.py   ──计算──→  技术指标（~80 列）+ 高级指标（MACD/RSI/BB/VWAP/MFI/Williams %R/ADX/CCI/Stochastic/OBV/Chaikin/ATR）
    ↓
scorer.py           ──评分──→  signal_score（0-100）+ value_quality_score + piotroski_score
    ↓
build_snapshot.py   ──输出──→  data.parquet + history.parquet

build_macro.py      ──获取──→  macro.parquet（VIX / 10Y / DXY / SPX）
build_sectors.py    ──获取──→  sectors.parquet（14 个板块/风格 ETF）

signal_candidate_pool.py ──打分──→  candidates.parquet / candidates.csv（每日 Top 20）
signal_outcomes.py       ──计算──→  MFE/MAE + 1/3/5/10 日前向收益
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  各文件详解
&lt;/h2&gt;

&lt;h3&gt;
  
  
  config.yaml — 配置中心
&lt;/h3&gt;

&lt;p&gt;定义股票池、数据获取参数、实时数据配置和预警配置。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;股票池&lt;/strong&gt;（约 200 只，分 9 组）：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;分组&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;tech&lt;/td&gt;
&lt;td&gt;科技/半导体（70+只）&lt;/td&gt;
&lt;td&gt;AAPL, NVDA, MSFT, TSLA, ARM, TSM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;finance&lt;/td&gt;
&lt;td&gt;金融/支付&lt;/td&gt;
&lt;td&gt;JPM, V, MA, BRK-B, COIN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;healthcare&lt;/td&gt;
&lt;td&gt;医疗/生物科技&lt;/td&gt;
&lt;td&gt;JNJ, UNH, LLY, MRNA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;energy&lt;/td&gt;
&lt;td&gt;能源/资源&lt;/td&gt;
&lt;td&gt;XOM, CVX, COP, NEM, FCX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;industrial&lt;/td&gt;
&lt;td&gt;工业/航空/国防&lt;/td&gt;
&lt;td&gt;CAT, BA, GE, HON, RTX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;consumer&lt;/td&gt;
&lt;td&gt;消费/零售/餐饮&lt;/td&gt;
&lt;td&gt;PG, KO, MCD, WMT, NFLX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;infra&lt;/td&gt;
&lt;td&gt;通信/公用事业/REIT&lt;/td&gt;
&lt;td&gt;T, VZ, NEE, AMT, EQIX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aerospace&lt;/td&gt;
&lt;td&gt;太空/航空/国防&lt;/td&gt;
&lt;td&gt;RKLB, ASTS, LUNR, LHX, HEI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;other&lt;/td&gt;
&lt;td&gt;汽车/交通/其他&lt;/td&gt;
&lt;td&gt;F, RIVN, UBER, BIDU, PDD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;获取参数&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;history_period&lt;/td&gt;
&lt;td&gt;2y&lt;/td&gt;
&lt;td&gt;历史数据时间跨度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;batch_size&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;每批获取股票数量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;batch_delay&lt;/td&gt;
&lt;td&gt;2.0s&lt;/td&gt;
&lt;td&gt;批次间隔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max_retries&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;最大重试次数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;request_timeout&lt;/td&gt;
&lt;td&gt;30s&lt;/td&gt;
&lt;td&gt;单次请求超时&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;多时间周期配置&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;时间周期&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;period&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;日线&lt;/td&gt;
&lt;td&gt;1d&lt;/td&gt;
&lt;td&gt;2y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;周线&lt;/td&gt;
&lt;td&gt;1wk&lt;/td&gt;
&lt;td&gt;5y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60 分钟&lt;/td&gt;
&lt;td&gt;60m&lt;/td&gt;
&lt;td&gt;730d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30 分钟&lt;/td&gt;
&lt;td&gt;30m&lt;/td&gt;
&lt;td&gt;60d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 分钟&lt;/td&gt;
&lt;td&gt;15m&lt;/td&gt;
&lt;td&gt;60d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 分钟&lt;/td&gt;
&lt;td&gt;5m&lt;/td&gt;
&lt;td&gt;60d&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;实时数据配置&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;realtime.provider&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据源选择：free (yfinance) / premium (aliyun)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;realtime.push.provider&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;推送源选择：tickflow / ashen / aliyun&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;realtime.trading_hours&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;交易时段定义（盘前/盘中/盘后）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;realtime.update_interval_sec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;报价更新间隔（秒）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alerts.enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;预警引擎开关&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alerts.db_path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQLite 数据库路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alerts.max_rules_per_device&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每设备最大规则数（50）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;alerts.retention_days&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;事件保留天数（30）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  yfinance_client.py — 数据获取
&lt;/h3&gt;

&lt;p&gt;封装 yfinance API，提供批量获取、重试和标准化功能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心函数&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;返回&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;load_config()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;加载 config.yaml&lt;/td&gt;
&lt;td&gt;dict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_stock_pool()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提取去重后的股票列表&lt;/td&gt;
&lt;td&gt;list[str]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fetch_history_batch()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;批量下载历史行情&lt;/td&gt;
&lt;td&gt;dict[str, DataFrame]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fetch_stock_info()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取单只股票基本信息&lt;/td&gt;
&lt;td&gt;StockInfo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fetch_financial_metrics()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;获取财务指标&lt;/td&gt;
&lt;td&gt;dict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fetch_all_data()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主入口，获取全部数据&lt;/td&gt;
&lt;td&gt;(history, info, financials)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;数据类&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FetchConfig&lt;/code&gt; — 获取参数（history_period, batch_size 等）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StockInfo&lt;/code&gt; — 股票基本信息（symbol, name, market_cap, total_share）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;处理逻辑&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;分批下载避免 API 限流&lt;/li&gt;
&lt;li&gt;自动重试失败请求&lt;/li&gt;
&lt;li&gt;列名标准化（yfinance 格式 → 统一格式）&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  feature_engine.py — 技术指标计算
&lt;/h3&gt;

&lt;p&gt;从原始 OHLCV 数据中计算约 80 个技术指标列。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;指标分类&lt;/strong&gt;：&lt;/p&gt;

&lt;h4&gt;
  
  
  移动平均与趋势
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ma5, ma10, ma20, ma60&lt;/td&gt;
&lt;td&gt;简单移动平均线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ret_1d, ret_5d, ret_20d&lt;/td&gt;
&lt;td&gt;收益率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;amplitude&lt;/td&gt;
&lt;td&gt;振幅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  K 线形态识别（二值标志列，0/1）
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;单 K 形态&lt;/strong&gt;：bull_candle, bear_candle, hammer, shooting_star, doji, dragonfly_doji, gravestone_doji&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;双 K 形态&lt;/strong&gt;：bullish_engulfing, bearish_engulfing, inside_bar&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;三 K 形态&lt;/strong&gt;：three_white_soldiers, three_black_crows&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;趋势形态&lt;/strong&gt;：ma_bull, trend_confirm, pullback_hold, break_high_20, break_high_60, platform_breakout, false_breakout, double_bottom&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;量价形态&lt;/strong&gt;：volume_breakout, volume_shrink_pullback&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;波动率形态&lt;/strong&gt;：volatility_contraction, volatility_expansion&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;连续上涨&lt;/strong&gt;：consec_up_3, consec_up_5&lt;/p&gt;

&lt;h4&gt;
  
  
  高级技术指标（连续值 + 信号标志）
&lt;/h4&gt;

&lt;h5&gt;
  
  
  MACD（移动平均收敛发散）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;macd_dif&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;DIF 线（12日 EMA - 26日 EMA）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macd_dea&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;DEA 信号线（DIF 的 9日 EMA）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macd_hist&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;MACD 柱状图 = 2 × (DIF - DEA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_macd_bull_cross&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;金叉（DIF 上穿 DEA）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_macd_bear_cross&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;死叉（DIF 下穿 DEA）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_macd_hist_positive&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;柱状图由负转正&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  RSI（相对强弱指数）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rsi_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;14日 RSI（Wilder 平滑）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_rsi_oversold&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;RSI &amp;lt; 30（超卖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_rsi_overbought&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;RSI &amp;gt; 70（超买）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_rsi_bull_divergence&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;价格新低但 RSI 未新低（看涨背离）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  Bollinger Bands（布林带）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bb_upper&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;上轨 = MA20 + 2 × 标准差&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bb_mid&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;中轨 = 20日 SMA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bb_lower&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;下轨 = MA20 - 2 × 标准差&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bb_width&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;带宽百分比 = (上轨 - 下轨) / 中轨 × 100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_bb_squeeze&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;带宽处于 20日最低值（即将突破）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_bb_upper_touch&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;价格触及或超过上轨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_bb_lower_touch&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;价格触及或跌破下轨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  VWAP（成交量加权平均价）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vwap&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;当日成交量加权均价（日内累计，每个交易日重置）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_price_above_vwap&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;收盘价 &amp;gt; VWAP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  MFI（资金流量指数）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mfi_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;14日 MFI（带量的 RSI）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_mfi_oversold&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;MFI &amp;lt; 20（超卖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_mfi_overbought&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;MFI &amp;gt; 80（超买）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  Williams %R（威廉指标）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;willr_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;14日 Williams %R（范围 -100 ~ 0）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_willr_oversold&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;Williams %R &amp;lt; -80（超卖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_willr_overbought&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;Williams %R &amp;gt; -20（超买）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  ADX（平均趋向指数）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;adx_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;14日 ADX（趋势强度）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;di_plus_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;+DI（正向趋向指标）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;di_minus_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;-DI（负向趋向指标）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_adx_strong_trend&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;ADX &amp;gt; 25（强趋势）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_di_bull_cross&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;+DI 上穿 -DI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  CCI（商品通道指数）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cci_20&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;20日 CCI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_cci_oversold&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;CCI &amp;lt; -100（超卖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_cci_overbought&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;CCI &amp;gt; 100（超买）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  Stochastic（随机指标）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;stoch_k_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;14日 %K（快速）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stoch_d_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;%K 的 3日 SMA（慢速）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_stoch_oversold&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;%K &amp;lt; 20（超卖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_stoch_overbought&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;%K &amp;gt; 80（超买）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_stoch_bull_cross&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;%K 上穿 %D（且 %K &amp;lt; 80）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  OBV（能量潮）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;obv&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;累计能量潮&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_obv_uptrend&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;OBV &amp;gt; 5日前 OBV&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  Chaikin Oscillator（佳庆振荡器）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;chaikin_osc&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;A/D 线的 3日 EMA - 10日 EMA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ind_chaikin_bullish&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;Chaikin 振荡器上穿零线&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  ATR（平均真实范围）
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;atr_14&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;14日 ATR（Wilder 平滑）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;atr_stop_long&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;Chandelier 止损 = 周期最高价 - 3 × ATR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  成交量与波动率
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vol_ratio_5&lt;/td&gt;
&lt;td&gt;5 日量比&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;body_ratio&lt;/td&gt;
&lt;td&gt;实体比率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;upper/lower_shadow_ratio&lt;/td&gt;
&lt;td&gt;上下影线比率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;risk_ma20_dev, risk_ma60_dev&lt;/td&gt;
&lt;td&gt;均线偏离度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;risk_dd_20d&lt;/td&gt;
&lt;td&gt;20 日最大回撤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;risk_vol_20d&lt;/td&gt;
&lt;td&gt;20 日波动率&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  基本面评分指标
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;piotroski_score&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;Piotroski F-Score (0-9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fund_piotroski_strong&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;Piotroski ≥ 7（财务强健）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;altman_z_score&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;Altman Z-Score（破产预警）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;risk_financial_distress&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;Altman Z &amp;lt; 1.81（财务困境）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value_quality_score&lt;/td&gt;
&lt;td&gt;连续值&lt;/td&gt;
&lt;td&gt;价值-成长复合评分 (0-100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fund_value_quality&lt;/td&gt;
&lt;td&gt;标志&lt;/td&gt;
&lt;td&gt;复合评分 ≥ 70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;核心函数&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;add_features(df)&lt;/code&gt; — 主入口，给历史 DataFrame 添加全部技术指标&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;add_financial_features(df, metrics)&lt;/code&gt; — 将财务指标合并到最新行（含 Piotroski 评分）&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  scorer.py — 综合评分
&lt;/h3&gt;

&lt;p&gt;计算每只股票的信号评分（0-100 分）和价值-成长复合评分。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;信号评分组成&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;分值范围&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;标志指标&lt;/td&gt;
&lt;td&gt;多头信号加分，空头信号减分&lt;/td&gt;
&lt;td&gt;-20 ~ +50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连续指标&lt;/td&gt;
&lt;td&gt;收益率、ROE、利润率等百分位排名&lt;/td&gt;
&lt;td&gt;0 ~ +25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PE 惩罚&lt;/td&gt;
&lt;td&gt;forward_pe 过高时扣分&lt;/td&gt;
&lt;td&gt;-10 ~ 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;关键权重&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;信号&lt;/th&gt;
&lt;th&gt;权重&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pattern_ma_bull&lt;/td&gt;
&lt;td&gt;+15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;trend_confirm&lt;/td&gt;
&lt;td&gt;+12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;break_high_60&lt;/td&gt;
&lt;td&gt;+10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;false_breakout&lt;/td&gt;
&lt;td&gt;-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;three_black_crows&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;价值-成长复合评分&lt;/strong&gt;（&lt;code&gt;compute_value_quality_score()&lt;/code&gt;）：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;权重&lt;/th&gt;
&lt;th&gt;排名方向&lt;/th&gt;
&lt;th&gt;包含指标&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;估值质量&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;反向&lt;/strong&gt;（低估值 = 高分）&lt;/td&gt;
&lt;td&gt;forward_pe, price_to_book, peg_ratio, ps_ratio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;盈利能力&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;td&gt;roe, roa, profit_margin, operating_margin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成长性&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;td&gt;revenue_growth, earnings_growth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  build_snapshot.py — 快照编排器
&lt;/h3&gt;

&lt;p&gt;协调数据获取 → 特征计算 → 基本面评分 → Altman Z-Score → 输出的完整流程。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心函数&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build_snapshot()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主入口，输出 parquet 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build_snapshot_dataframe()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;构建快照 DataFrame（每只股票一行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build_history_dataframe()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;构建历史 DataFrame（全部日期）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_compute_altman_z(balance_sheet)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;计算 Altman Z-Score（破产预警）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Altman Z-Score 公式&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Z = 1.2×X1 + 1.4×X2 + 3.3×X3 + 0.6×X4 + 1.0×X5&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;定义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X1&lt;/td&gt;
&lt;td&gt;营运资本 / 总资产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X2&lt;/td&gt;
&lt;td&gt;留存收益 / 总资产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X3&lt;/td&gt;
&lt;td&gt;EBIT / 总资产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X4&lt;/td&gt;
&lt;td&gt;市值 / 总负债&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X5&lt;/td&gt;
&lt;td&gt;营收 / 总资产&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Piotroski F-Score&lt;/strong&gt;（在 &lt;code&gt;add_financial_features()&lt;/code&gt; 中调用 &lt;code&gt;_add_piotroski_score()&lt;/code&gt;）：&lt;/p&gt;

&lt;p&gt;9 项评分标准：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;条件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;盈利能力&lt;/td&gt;
&lt;td&gt;ROA &amp;gt; 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;现金流&lt;/td&gt;
&lt;td&gt;经营利润率 &amp;gt; 0（作为经营现金流代理）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;ROA 改善&lt;/td&gt;
&lt;td&gt;盈利增长 &amp;gt; 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;应计项目&lt;/td&gt;
&lt;td&gt;经营利润率 &amp;gt; ROA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;杠杆&lt;/td&gt;
&lt;td&gt;负债权益比 &amp;lt; 1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;流动性&lt;/td&gt;
&lt;td&gt;流动比率 &amp;gt; 1.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;股本稀释&lt;/td&gt;
&lt;td&gt;ROA &amp;gt; 0.05（代理）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;利润率&lt;/td&gt;
&lt;td&gt;净利润率 &amp;gt; 0.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;营收增长&lt;/td&gt;
&lt;td&gt;营收增长 &amp;gt; 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;输出文件&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;data.parquet&lt;/code&gt; — 最新交易日的快照（~200 行 × 80+ 列）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;history.parquet&lt;/code&gt; — 全部历史技术指标数据&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  build_macro.py — 宏观指标构建
&lt;/h3&gt;

&lt;p&gt;获取宏观经济指标历史数据，输出 &lt;code&gt;macro.parquet&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;跟踪指标&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;^VIX&lt;/td&gt;
&lt;td&gt;VIX 恐慌指数&lt;/td&gt;
&lt;td&gt;市场波动率预期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;^TNX&lt;/td&gt;
&lt;td&gt;10 年期美债收益率&lt;/td&gt;
&lt;td&gt;无风险利率基准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DX-Y.NYB&lt;/td&gt;
&lt;td&gt;美元指数 DXY&lt;/td&gt;
&lt;td&gt;美元强弱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;^GSPC&lt;/td&gt;
&lt;td&gt;标普 500 指数&lt;/td&gt;
&lt;td&gt;大盘基准&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;处理逻辑&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10Y 收益率自动转换为百分比格式&lt;/li&gt;
&lt;li&gt;每个指标独立获取，单个失败不影响其他&lt;/li&gt;
&lt;li&gt;输出格式：date, symbol, close, change_pct&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  build_sectors.py — 板块数据构建
&lt;/h3&gt;

&lt;p&gt;获取板块 ETF 和风格 ETF 的历史数据，输出 &lt;code&gt;sectors.parquet&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11 个板块 ETF&lt;/strong&gt;：XLK, XLF, XLV, XLE, XLI, XLY, XLU, XLRE, XLB, XLC, IBB&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 个风格 ETF&lt;/strong&gt;：SPY（大盘基准）, QQQ（科技基准）, IWM（小盘基准）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;输出格式&lt;/strong&gt;：date, symbol, close, volume&lt;/p&gt;




&lt;h3&gt;
  
  
  signal_candidate_pool.py — 信号候选池
&lt;/h3&gt;

&lt;p&gt;离线多因子打分脚本，输出每日信号候选股 Top 20。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;评分维度与权重&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;权重&lt;/th&gt;
&lt;th&gt;包含因子&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;基本面&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;盈利增长、ROE、利润率、PE 惩罚&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;周线&lt;/td&gt;
&lt;td&gt;0.20&lt;/td&gt;
&lt;td&gt;20日动量、signal_score、MA 排列&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日频 Alpha&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;signal_score、量能突破、突破信号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技术面&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;ADX 趋势、MA 排列、风险指标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;风险门控&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;低流动性：20日日均成交额 &amp;lt; $5M → 标记&lt;/li&gt;
&lt;li&gt;高波动率：20日波动率 &amp;gt; 4.0% → 标记&lt;/li&gt;
&lt;li&gt;周线下跌趋势 → 标记&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CLI 用法&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 scripts/signal_candidate_pool.py &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--snapshot&lt;/span&gt; data.parquet &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--output&lt;/span&gt; tmp/signals/candidates.parquet &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--csv&lt;/span&gt; tmp/signals/candidates.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  signal_outcomes.py — 信号绩效计算
&lt;/h3&gt;

&lt;p&gt;计算已入场信号的后验绩效指标。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;产出指标&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;forward_return_1d&lt;/td&gt;
&lt;td&gt;1 日前向收益&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forward_return_3d&lt;/td&gt;
&lt;td&gt;3 日前向收益&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forward_return_5d&lt;/td&gt;
&lt;td&gt;5 日前向收益&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forward_return_10d&lt;/td&gt;
&lt;td&gt;10 日前向收益&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFE&lt;/td&gt;
&lt;td&gt;最大有利偏移（Maximum Favorable Excursion）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAE&lt;/td&gt;
&lt;td&gt;最大不利偏移（Maximum Adverse Excursion）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hit_stop&lt;/td&gt;
&lt;td&gt;是否触及止损&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hit_target&lt;/td&gt;
&lt;td&gt;是否触及目标价&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;CLI 用法&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 scripts/signal_outcomes.py &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--db&lt;/span&gt; tmp/signals/signals.db &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--history&lt;/span&gt; history.parquet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  rt_manager.py &amp;amp; rt_providers.py — 实时数据
&lt;/h3&gt;

&lt;p&gt;提供盘中实时数据的统一接口。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rt_providers.py&lt;/strong&gt; 定义两种数据源：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据源&lt;/th&gt;
&lt;th&gt;延迟&lt;/th&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;分钟 K 线&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;YFinanceProvider（免费）&lt;/td&gt;
&lt;td&gt;~15 分钟&lt;/td&gt;
&lt;td&gt;不支持&lt;/td&gt;
&lt;td&gt;不支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AliyunProvider（付费）&lt;/td&gt;
&lt;td&gt;实时&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;rt_manager.py&lt;/strong&gt; 提供缓存层：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LRU 缓存（报价 200 条，K 线 50 条）&lt;/li&gt;
&lt;li&gt;统一的异步 API 接口&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  rt_push_providers.py — 实时推送源
&lt;/h3&gt;

&lt;p&gt;可插拔的实时推送上游数据源架构，支持多种供应商。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;支持的供应商&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;供应商&lt;/th&gt;
&lt;th&gt;协议&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TickFlowProvider&lt;/td&gt;
&lt;td&gt;HTTP 轮询&lt;/td&gt;
&lt;td&gt;默认供应商，API Key 认证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AshenProvider&lt;/td&gt;
&lt;td&gt;WebSocket&lt;/td&gt;
&lt;td&gt;增量订阅，自动重连&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AliyunProvider&lt;/td&gt;
&lt;td&gt;HTTP 轮询&lt;/td&gt;
&lt;td&gt;阿里云金融 API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;特性&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;统一的 Provider 接口（工厂模式）&lt;/li&gt;
&lt;li&gt;可配置轮询间隔和推送频率&lt;/li&gt;
&lt;li&gt;自动重连与退避策略&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ashen_ws_client.py — Ashen WebSocket 客户端
&lt;/h3&gt;

&lt;p&gt;Ashen 实时行情服务的 WebSocket 客户端实现。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;增量订阅管理（add/remove symbols）&lt;/li&gt;
&lt;li&gt;自动重连（指数退避：1s → 2s → 5s → 10s）&lt;/li&gt;
&lt;li&gt;心跳检测与超时处理&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  运行命令
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 构建数据快照&lt;/span&gt;
python3 scripts/build_snapshot.py

&lt;span class="c"&gt;# 构建宏观指标&lt;/span&gt;
python3 scripts/build_macro.py

&lt;span class="c"&gt;# 构建板块数据&lt;/span&gt;
python3 scripts/build_sectors.py

&lt;span class="c"&gt;# 生成信号候选池&lt;/span&gt;
python3 scripts/signal_candidate_pool.py &lt;span class="nt"&gt;--snapshot&lt;/span&gt; data.parquet &lt;span class="nt"&gt;--output&lt;/span&gt; tmp/signals/candidates.parquet

&lt;span class="c"&gt;# 计算信号绩效&lt;/span&gt;
python3 scripts/signal_outcomes.py &lt;span class="nt"&gt;--db&lt;/span&gt; tmp/signals/signals.db &lt;span class="nt"&gt;--history&lt;/span&gt; history.parquet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>美股日线选股器 — 项目概览</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 14 Jun 2026 09:19:01 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-ri-xian-xuan-gu-qi-xiang-mu-gai-lan-2ao4</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-ri-xian-xuan-gu-qi-xiang-mu-gai-lan-2ao4</guid>
      <description>&lt;h1&gt;
  
  
  美股日线选股器 — 项目概览
&lt;/h1&gt;

&lt;h2&gt;
  
  
  项目简介
&lt;/h2&gt;

&lt;p&gt;美股日线选股器（US Stock Screener）是一个基于技术形态和价值指标的股票筛选工具。系统从 yfinance 获取约 200 只美股的日线数据，计算 80+ 个技术指标和形态信号，通过 FastAPI 后端和 React 前端提供交互式筛选、排序和对比功能。&lt;/p&gt;

&lt;p&gt;系统还集成了实时行情推送（WebSocket）、预警系统（6种规则类型）、宏观指标监控、板块轮动分析、多时间周期共振策略、基本面评分体系、信号产品系统（候选池→盘中信号→模拟交易→绩效分析）和因子回测等高级功能。&lt;/p&gt;

&lt;h2&gt;
  
  
  技术栈
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层级&lt;/th&gt;
&lt;th&gt;技术&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;数据获取&lt;/td&gt;
&lt;td&gt;yfinance&lt;/td&gt;
&lt;td&gt;免费 API，无需密钥&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;特征工程&lt;/td&gt;
&lt;td&gt;pandas + numpy&lt;/td&gt;
&lt;td&gt;技术指标计算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后端&lt;/td&gt;
&lt;td&gt;FastAPI + uvicorn&lt;/td&gt;
&lt;td&gt;异步 API 服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;前端&lt;/td&gt;
&lt;td&gt;Vite + React 18 + TypeScript&lt;/td&gt;
&lt;td&gt;SPA 单页应用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据存储&lt;/td&gt;
&lt;td&gt;Parquet 文件&lt;/td&gt;
&lt;td&gt;列式存储，高效压缩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;信号存储&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;td&gt;候选池、信号、模拟仓位持久化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;预警存储&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;td&gt;规则与事件持久化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实时数据&lt;/td&gt;
&lt;td&gt;yfinance / 阿里云 / TickFlow&lt;/td&gt;
&lt;td&gt;免费（延迟）/ 付费（实时）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实时推送&lt;/td&gt;
&lt;td&gt;WebSocket&lt;/td&gt;
&lt;td&gt;服务端主动推送报价&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K线图表&lt;/td&gt;
&lt;td&gt;lightweight-charts&lt;/td&gt;
&lt;td&gt;交互式技术图表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;路由&lt;/td&gt;
&lt;td&gt;react-router-dom&lt;/td&gt;
&lt;td&gt;SPA 页面路由&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  架构总览
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────┐
│                      Frontend (React 18 SPA)                        │
│  筛选面板 │ 股票表格 │ 详情抽屉 │ K线图 │ 对比分析 │ 预警中心      │
│  宏观指标 │ 板块轮动 │ 多周期预设 │ 数值筛选 │ 实时扫描器            │
│  信号中心 │ 信号绩效 │ 模拟组合 │ 回测报告 │ 形态统计               │
└─────────────────────────────┬────────────────────────────────────┘
                              │ HTTP + WebSocket (proxy :5173 → :8000)
┌─────────────────────────────▼────────────────────────────────────┐
│                    Backend (FastAPI + uvicorn)                       │
│  /api/meta │ /api/stocks │ /api/rt/* │ /api/alerts │ /api/macro     │
│  /api/sectors │ /api/pattern-stats │ /api/presets │ /ws/rt          │
│  /api/signals/* │ /api/backtest/*                                   │
│  loader.py (内存缓存) ← data.parquet (200+行 × 80+列)               │
│  history.parquet │ fundamentals.parquet │ macro/sectors parquet       │
│  RTHub (推送中心) │ AlertEngine (预警引擎) │ SQLite (规则/信号存储)    │
│  SignalEntryEngine (信号入场引擎) │ SignalProductRepository           │
└─────────────────────────────┬────────────────────────────────────┘
                              ↑ 构建时生成
┌─────────────────────────────┴────────────────────────────────────┐
│                  Data Pipeline (scripts/)                            │
│  yfinance_client → feature_engine → scorer → parquet output         │
│  rt_manager → rt_providers → rt_push_providers (实时数据)            │
│  build_macro → macro.parquet │ build_sectors → sectors.parquet      │
│  signal_candidate_pool → candidates │ signal_outcomes → MFE/MAE     │
└──────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  模块说明
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模块&lt;/th&gt;
&lt;th&gt;文档&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;scripts/&lt;/td&gt;
&lt;td&gt;&lt;a href="//01-data-pipeline.md"&gt;01-data-pipeline.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;数据获取、特征工程、快照构建、宏观/板块数据、信号候选池&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;backend/&lt;/td&gt;
&lt;td&gt;&lt;a href="//02-backend-api.md"&gt;02-backend-api.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;API 服务、查询引擎、实时推送、预警系统、信号产品、回测接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;frontend/&lt;/td&gt;
&lt;td&gt;&lt;a href="//03-frontend-ui.md"&gt;03-frontend-ui.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;筛选界面、详情、图表、对比、预警、信号中心、回测报告&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;demo/&lt;/td&gt;
&lt;td&gt;&lt;a href="//04-factor-backtest.md"&gt;04-factor-backtest.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Alpha101 因子回测、中性化、多空选股、多信号共振&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scripts/screener/&lt;/td&gt;
&lt;td&gt;&lt;a href="//05-realtime-screener.md"&gt;05-realtime-screener.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多因子实时选股引擎（基本面/周线/Alpha/盘中）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;a href="//06-deployment.md"&gt;06-deployment.md&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;部署、开发服务器、测试体系、配置管理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  核心功能
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 技术形态筛选
&lt;/h3&gt;

&lt;p&gt;支持 30+ 种 K 线形态和技术信号的组合筛选，包括单 K 形态、双 K 形态、三 K 形态、趋势结构、量价关系和波动率形态。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 高级技术指标
&lt;/h3&gt;

&lt;p&gt;80+ 个技术指标覆盖 6 大类别：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;信号列&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;趋势&lt;/td&gt;
&lt;td&gt;MACD (DIF/DEA/Histogram)、ADX (+DI/-DI)&lt;/td&gt;
&lt;td&gt;金叉/死叉、强趋势&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;动量&lt;/td&gt;
&lt;td&gt;RSI-14、Stochastic (%K/%D)、CCI-20、Williams %R&lt;/td&gt;
&lt;td&gt;超买/超卖、背离&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;波动率&lt;/td&gt;
&lt;td&gt;Bollinger Bands (上/中/下/宽度)、ATR + 止损&lt;/td&gt;
&lt;td&gt;挤压信号、触及上下轨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量能&lt;/td&gt;
&lt;td&gt;OBV、Chaikin Oscillator、MFI-14、VWAP&lt;/td&gt;
&lt;td&gt;量价背离、资金进出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;财务健康&lt;/td&gt;
&lt;td&gt;Piotroski F-Score (0-9)、Altman Z-Score&lt;/td&gt;
&lt;td&gt;财务强健/财务困境&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;综合评分&lt;/td&gt;
&lt;td&gt;Value-Growth Composite (0-100)&lt;/td&gt;
&lt;td&gt;价值质量&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. 基本面评分体系
&lt;/h3&gt;

&lt;p&gt;三维度基本面分析框架：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Piotroski F-Score&lt;/strong&gt;：9 项财务健康指标评分（0-9 分），≥7 分标记为"财务强健"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Altman Z-Score&lt;/strong&gt;：破产预警模型，&amp;lt;1.81 标记为"财务困境"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;价值-成长复合评分&lt;/strong&gt;：估值质量 (40%) + 盈利能力 (30%) + 成长性 (30%)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 信号产品系统
&lt;/h3&gt;

&lt;p&gt;完整的交易信号管线，从离线候选到盘中信号到绩效追踪：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;候选池生成&lt;/strong&gt;：离线多因子打分，输出每日 Top 20 候选股&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;盘中信号入场&lt;/strong&gt;：4 重入场门控（VWAP、动量、量能、波动率）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;模拟交易&lt;/strong&gt;：Paper Trading 跟踪开仓/平仓/盈亏&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;绩效分析&lt;/strong&gt;：MFE/MAE、多周期前向收益 (1/3/5/10 日)、胜率&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. 综合评分
&lt;/h3&gt;

&lt;p&gt;基于多维度的信号评分系统（0-100 分），综合考虑技术形态、连续指标和估值水平。&lt;/p&gt;

&lt;h3&gt;
  
  
  6. 股票详情
&lt;/h3&gt;

&lt;p&gt;详情抽屉展示完整的股票信息，包含基本面、技术指标、财务数据和风险指标。研究页面提供 K 线图、技术面分析、财务面分析和形态历史回溯。&lt;/p&gt;

&lt;h3&gt;
  
  
  7. 多股对比
&lt;/h3&gt;

&lt;p&gt;最多 5 只股票的并列对比分析，按 7 个维度比较并高亮最优/最差值。&lt;/p&gt;

&lt;h3&gt;
  
  
  8. 实时行情
&lt;/h3&gt;

&lt;p&gt;盘中实时数据支持：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;免费源&lt;/strong&gt;：yfinance（~15 分钟延迟）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;付费源&lt;/strong&gt;：阿里云金融 API（真正实时）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket 推送&lt;/strong&gt;：服务端主动推送报价到前端&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;实时排名&lt;/strong&gt;：按成交额/涨跌幅/成交量排序&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;异动扫描&lt;/strong&gt;：涨幅榜、跌幅榜、成交量异动&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. 预设策略
&lt;/h3&gt;

&lt;p&gt;内置 5 种选股策略（趋势突破、回调低吸、质量成长、估值修复、风险预警），一键应用筛选组合。&lt;/p&gt;

&lt;h3&gt;
  
  
  10. 多时间周期共振
&lt;/h3&gt;

&lt;p&gt;支持日线、周线、60 分钟、30 分钟、15 分钟、5 分钟多周期分析，提供跨周期预设策略与共振评分。&lt;/p&gt;

&lt;h3&gt;
  
  
  11. 预警系统
&lt;/h3&gt;

&lt;p&gt;6 种预警规则类型（价格变动、突破新高/新低、成交量异动、均线交叉、52 周高低），通过 WebSocket 实时推送 Toast 通知。&lt;/p&gt;

&lt;h3&gt;
  
  
  12. 宏观指标监控
&lt;/h3&gt;

&lt;p&gt;实时展示 VIX 恐慌指数、10 年期美债收益率、美元指数 DXY、标普 500 等宏观指标，自动计算风险等级（平静/正常/风险）。&lt;/p&gt;

&lt;h3&gt;
  
  
  13. 板块轮动分析
&lt;/h3&gt;

&lt;p&gt;11 个板块 ETF + 3 个风格 ETF 的相对强弱排名，展示动量和相对 SPY 基准的表现。&lt;/p&gt;

&lt;h3&gt;
  
  
  14. 因子回测与回测报告
&lt;/h3&gt;

&lt;p&gt;Alpha101 因子评估和多因子选股回测系统：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;因子 IC/ICIR 评估与中性化&lt;/li&gt;
&lt;li&gt;多空组合绩效分析（Sharpe、回撤、Calmar）&lt;/li&gt;
&lt;li&gt;多信号共振回测（形态组合胜率统计）&lt;/li&gt;
&lt;li&gt;交易成本建模（佣金、滑点、融券成本）&lt;/li&gt;
&lt;li&gt;前端可视化回测报告页面&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  快速启动
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. 构建数据快照&lt;/span&gt;
python3 scripts/build_snapshot.py

&lt;span class="c"&gt;# 2. 构建宏观与板块数据&lt;/span&gt;
python3 scripts/build_macro.py
python3 scripts/build_sectors.py

&lt;span class="c"&gt;# 3. 启动后端&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 8000

&lt;span class="c"&gt;# 4. 启动前端&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev

&lt;span class="c"&gt;# 或使用统一脚本&lt;/span&gt;
bash scripts/dev_server.sh start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  数据说明
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;股票池&lt;/strong&gt;：约 200 只美股，覆盖科技、金融、医疗、能源、工业、消费、基建、太空、汽车等 9 个板块&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;数据源&lt;/strong&gt;：yfinance（免费，无需 API Key），可选阿里云（付费，实时）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;更新频率&lt;/strong&gt;：手动运行 build_snapshot.py 更新快照&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;技术指标&lt;/strong&gt;：约 80 个，包含移动平均、K 线形态、量价关系、波动率、动量、趋势等&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;财务指标&lt;/strong&gt;：PE、PEG、ROE、利润率、营收增长、Piotroski F-Score、Altman Z-Score 等&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;实时推送&lt;/strong&gt;：WebSocket 服务端推送，支持 TickFlow / Ashen / 阿里云三种上游源&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;预警规则&lt;/strong&gt;：SQLite 存储，每设备最多 50 条规则，30 天事件保留&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;信号系统&lt;/strong&gt;：SQLite 持久化候选池、入场信号、模拟仓位和绩效追踪&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>开源量化分析软件功能介绍</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Mon, 08 Jun 2026 06:37:06 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/kai-yuan-liang-hua-fen-xi-ruan-jian-gong-neng-jie-shao-i2m</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/kai-yuan-liang-hua-fen-xi-ruan-jian-gong-neng-jie-shao-i2m</guid>
      <description>&lt;h1&gt;
  
  
  📈 多因子选股系统 — 项目功能介绍
&lt;/h1&gt;

&lt;p&gt;观看地址:&lt;a href="https://youtu.be/SpHsZdlyii8" rel="noopener noreferrer"&gt;https://youtu.be/SpHsZdlyii8&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;面向 A 股市场的全链路量化分析平台 — 因子计算 · 机器学习 · 组合优化 · 回测验证 · 实时行情&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;数据&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python 模块&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;业务代码&lt;/td&gt;
&lt;td&gt;15,600+ 行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;服务模块&lt;/td&gt;
&lt;td&gt;30+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API 蓝图&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内置因子&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  一、整体功能介绍
&lt;/h2&gt;

&lt;p&gt;多因子选股系统是一个覆盖量化研究全流程的分析平台，从数据管理到策略回测一站式完成。系统采用 &lt;strong&gt;Flask + SQLAlchemy + SocketIO&lt;/strong&gt; 技术栈，基于 &lt;strong&gt;Parquet + SQLite&lt;/strong&gt; 双层存储架构，零外部数据库依赖，克隆即可运行。&lt;/p&gt;

&lt;h3&gt;
  
  
  核心能力总览
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;实时行情分析&lt;/strong&gt;：通达信分钟数据接入，MACD、KDJ、RSI、布林带等技术指标实时计算&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;因子与选股&lt;/strong&gt;：12 个内置因子 + 自定义因子表达式引擎，支持白名单安全校验&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;机器学习建模&lt;/strong&gt;：XGBoost、LightGBM、RandomForest 三大算法的完整模型生命周期&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;组合优化&lt;/strong&gt;：等权重、均值方差、风险平价、因子中性四种经典优化方法&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;回测验证&lt;/strong&gt;：单策略与多策略回测，丰富的绩效指标（年化收益、夏普比率、最大回撤等）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;风险管理&lt;/strong&gt;：组合持仓管理、实时价格刷新、风险指标监控、预警管理、压力测试&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  请求流程
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP / WebSocket → Blueprint (app/api/*.py) → Service (app/services/*.py) → ParquetDataReader (行情数据)
                                                                             ↕
                                                               SQLAlchemy Models (SQLite 应用状态)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  技术栈
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;技术&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;后端框架&lt;/td&gt;
&lt;td&gt;Python 3.8–3.11、Flask、Flask-SocketIO、Flask-SQLAlchemy、Celery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据处理&lt;/td&gt;
&lt;td&gt;Pandas、NumPy、PyArrow、SciPy、Scikit-learn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;机器学习&lt;/td&gt;
&lt;td&gt;XGBoost、LightGBM、RandomForest、CVXPY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;前端 &amp;amp; 可视化&lt;/td&gt;
&lt;td&gt;Bootstrap 5、ECharts、Plotly、Matplotlib / MPLFinance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据源&lt;/td&gt;
&lt;td&gt;通达信（实时行情）、Baostock（历史数据）、Tushare（可选）、Parquet 离线数据包&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI 能力&lt;/td&gt;
&lt;td&gt;Ollama（本地 LLM）、OpenAI API（可选）、Text2SQL、Qwen2.5-Coder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  二、各模块功能介绍
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 实时行情分析模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/realtime-analysis/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RealtimeIndicatorEngine&lt;/code&gt;（&lt;code&gt;services/realtime_indicator_engine.py&lt;/code&gt;）：实时技术指标计算&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RealtimeTradingSignalEngine&lt;/code&gt;（&lt;code&gt;services/realtime_trading_signal_engine.py&lt;/code&gt;）：多策略交易信号生成与融合&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;功能特性&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;实时指标计算&lt;/td&gt;
&lt;td&gt;支持 MACD、KDJ、RSI、布林带等经典技术指标的实时计算与展示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多策略信号生成&lt;/td&gt;
&lt;td&gt;基于不同策略的交易信号生成，支持信号融合与综合研判&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;信号监控&lt;/td&gt;
&lt;td&gt;交易信号的实时监控与历史回溯&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;策略回测&lt;/td&gt;
&lt;td&gt;对生成的信号进行历史回测验证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;板块分析&lt;/td&gt;
&lt;td&gt;板块表现统计与异动检测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;市场情绪&lt;/td&gt;
&lt;td&gt;市场情绪指标的实时追踪&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;数据源&lt;/strong&gt;：通达信分钟级行情数据，存储于 &lt;code&gt;data/stock_minute/&lt;/code&gt;（Parquet 格式）。&lt;/p&gt;




&lt;h3&gt;
  
  
  2.2 因子与选股模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/ml-factor/*&lt;/code&gt;、&lt;code&gt;/api&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FactorEngine&lt;/code&gt;（&lt;code&gt;services/factor_engine.py&lt;/code&gt;）：内置因子计算与自定义因子管理&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FactorExpressionEngine&lt;/code&gt;（&lt;code&gt;services/factor_expression_engine.py&lt;/code&gt;）：白名单校验的自定义因子公式引擎&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StockScoringEngine&lt;/code&gt;（&lt;code&gt;services/stock_scoring.py&lt;/code&gt;）：因子评分与 ML 评分的综合选股引擎&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  内置因子（12 个）
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;因子名&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;动量&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;momentum_1d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 日动量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;动量&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;momentum_5d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5 日动量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;动量&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;momentum_20d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20 日动量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;波动率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;volatility_20d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20 日波动率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;技术指标&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rsi_14&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RSI 相对强弱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;技术指标&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;turnover_rate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换手率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基本面&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pe_ratio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;市盈率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基本面&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pb_ratio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;市净率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基本面&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;roe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;净资产收益率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基本面&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;debt_ratio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;资产负债率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基本面&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;current_ratio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;流动比率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基本面&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gross_margin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;毛利率&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  自定义因子
&lt;/h4&gt;

&lt;p&gt;支持用户通过表达式语法定义自定义因子，表达式引擎采用&lt;strong&gt;白名单校验机制&lt;/strong&gt;，确保安全性。用户可在因子管理界面创建、编辑和管理自定义因子公式。&lt;/p&gt;

&lt;h4&gt;
  
  
  选股评分
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;StockScoringEngine&lt;/code&gt; 提供两种评分模式：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;因子评分&lt;/strong&gt;：基于多个因子的加权综合评分&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ML 评分&lt;/strong&gt;：基于机器学习模型的预测评分&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2.3 机器学习建模模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/ml-factor/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;MLModelManager&lt;/code&gt;（&lt;code&gt;services/ml_models.py&lt;/code&gt;）：XGBoost / LightGBM / RandomForest 模型生命周期管理&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ModelTrainingJobService&lt;/code&gt;（&lt;code&gt;services/model_training_job_service.py&lt;/code&gt;）：异步训练任务轮询与管理&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;功能特性&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模型创建&lt;/td&gt;
&lt;td&gt;支持 XGBoost、LightGBM、RandomForest 三大算法的模型创建&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型训练&lt;/td&gt;
&lt;td&gt;支持同步与异步训练，异步训练通过 Celery 或内联模式执行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型预测&lt;/td&gt;
&lt;td&gt;训练完成的模型可直接用于股票预测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;特征工程&lt;/td&gt;
&lt;td&gt;因子组合与特征选择&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性能评估&lt;/td&gt;
&lt;td&gt;模型性能评估与多模型比较&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练任务管理&lt;/td&gt;
&lt;td&gt;异步训练任务的提交、状态查询与管理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2.4 组合优化模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/ml-factor/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PortfolioOptimizer&lt;/code&gt;（&lt;code&gt;services/portfolio_optimizer.py&lt;/code&gt;）：等权 / 均值方差 / 风险平价 / 因子中性&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;优化方法&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;等权重优化&lt;/td&gt;
&lt;td&gt;所有股票分配相同权重&lt;/td&gt;
&lt;td&gt;简单基准、等权组合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;均值方差优化&lt;/td&gt;
&lt;td&gt;基于 Markowitz 理论的均值-方差优化&lt;/td&gt;
&lt;td&gt;追求风险调整后收益最大化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;风险平价优化&lt;/td&gt;
&lt;td&gt;基于风险贡献均衡的权重分配&lt;/td&gt;
&lt;td&gt;风险均衡配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;因子中性组合&lt;/td&gt;
&lt;td&gt;控制因子暴露度在中性水平&lt;/td&gt;
&lt;td&gt;消除特定因子风险暴露&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2.5 回测验证模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/ml-factor/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BacktestEngine&lt;/code&gt;（&lt;code&gt;services/backtest_engine.py&lt;/code&gt;）：单策略与多策略回测&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;回测能力&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;单策略回测&lt;/td&gt;
&lt;td&gt;对单个选股策略进行历史回测验证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多策略比较&lt;/td&gt;
&lt;td&gt;同时运行多个策略并比较绩效表现&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;年化收益率&lt;/td&gt;
&lt;td&gt;计算策略的年化收益&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;夏普比率&lt;/td&gt;
&lt;td&gt;风险调整后收益指标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最大回撤&lt;/td&gt;
&lt;td&gt;策略的最大净值回撤幅度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;胜率&lt;/td&gt;
&lt;td&gt;盈利交易占比&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;卡尔玛比率&lt;/td&gt;
&lt;td&gt;年化收益与最大回撤的比值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;回测结果以可视化图表形式展示，支持净值曲线、收益分布等多种视图。&lt;/p&gt;




&lt;h3&gt;
  
  
  2.6 风险管理模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/realtime-analysis/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RealtimeRiskManager&lt;/code&gt;（&lt;code&gt;services/realtime_risk_manager.py&lt;/code&gt;）：风险指标、预警管理、压力测试&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;功能特性&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;投资组合持仓 CRUD&lt;/td&gt;
&lt;td&gt;创建、查询、更新、删除投资组合持仓记录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实时价格刷新&lt;/td&gt;
&lt;td&gt;通过通达信接口获取实时行情价格&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;风险指标监控&lt;/td&gt;
&lt;td&gt;实时计算并展示组合风险指标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;预警管理&lt;/td&gt;
&lt;td&gt;设定预警规则，触发时自动通知&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;压力测试&lt;/td&gt;
&lt;td&gt;模拟极端市场场景，分析组合表现&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2.7 数据管理模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/data-jobs/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DataJobs&lt;/code&gt;（&lt;code&gt;services/data_jobs/&lt;/code&gt;）：数据下载任务执行器&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;数据架构&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;存储&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parquet 文件&lt;/td&gt;
&lt;td&gt;市场行情数据&lt;/td&gt;
&lt;td&gt;高性能列式存储，承载日线/分钟线行情、基本面、技术面、资金流数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQLite 数据库&lt;/td&gt;
&lt;td&gt;应用状态&lt;/td&gt;
&lt;td&gt;轻量级存储，管理持仓、报告、预警等低并发元数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis 缓存&lt;/td&gt;
&lt;td&gt;任务队列 &amp;amp; 缓存&lt;/td&gt;
&lt;td&gt;Celery 任务 Broker、实时数据缓存、WebSocket 消息分发（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;数据下载工具&lt;/strong&gt;（位于 &lt;code&gt;app/utils/&lt;/code&gt;）：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;数据源&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trade_calendar.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tushare / Baostock&lt;/td&gt;
&lt;td&gt;交易日历下载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stock_basic.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tushare / Baostock&lt;/td&gt;
&lt;td&gt;股票基本信息下载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他数据脚本&lt;/td&gt;
&lt;td&gt;Tushare / Baostock&lt;/td&gt;
&lt;td&gt;行情、财务等数据下载&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：下载顺序为 &lt;code&gt;trade_calendar.py&lt;/code&gt; → &lt;code&gt;stock_basic.py&lt;/code&gt; → 其他脚本。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;任务执行模式&lt;/strong&gt;（通过 &lt;code&gt;DATA_JOB_EXECUTION_MODE&lt;/code&gt; 环境变量控制）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;inline&lt;/code&gt;（默认开发模式）：在 Web 进程中直接执行，无需 Celery&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;celery&lt;/code&gt;（默认生产模式）：通过 Celery Worker 异步执行，需要 Redis&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2.8 Text2SQL 自然语言查询模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Text2SQLEngine&lt;/code&gt;（&lt;code&gt;services/text2sql_engine.py&lt;/code&gt;）：LLM 驱动的自然语言转 SQL 查询&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LLMService&lt;/code&gt;（&lt;code&gt;services/llm_service.py&lt;/code&gt;）：LLM 服务封装（Ollama / OpenAI）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;功能说明&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;用户可以使用自然语言描述查询需求，系统通过 LLM 将自然语言转换为 SQL 查询语句，直接查询股票数据。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM 配置&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;默认提供商&lt;/td&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;本地 LLM 服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;默认模型&lt;/td&gt;
&lt;td&gt;qwen2.5-coder&lt;/td&gt;
&lt;td&gt;阿里通义千问代码模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可选提供商&lt;/td&gt;
&lt;td&gt;OpenAI API&lt;/td&gt;
&lt;td&gt;通过 &lt;code&gt;LLM_CONFIG&lt;/code&gt; 配置切换&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2.9 实时分析报告模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/realtime-analysis/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RealtimeReportGenerator&lt;/code&gt;（&lt;code&gt;services/realtime_report_generator.py&lt;/code&gt;）：分析报告生成器&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：基于实时行情数据和分析结果，自动生成可视化分析报告，涵盖市场概况、板块表现、个股分析等内容。&lt;/p&gt;




&lt;h3&gt;
  
  
  2.10 WebSocket 推送模块
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API 蓝图前缀&lt;/strong&gt;：&lt;code&gt;/api/websocket/*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;核心服务&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;WebSocketPushService&lt;/code&gt;（&lt;code&gt;app/websocket/websocket_push_service.py&lt;/code&gt;）：WebSocket 推送服务&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：通过 WebSocket 实现数据的实时推送，支持实时行情、交易信号、风险预警等信息的即时通知。&lt;/p&gt;




&lt;h2&gt;
  
  
  三、系统架构概览
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quantitative_analysis/
├── app/                              # 应用主目录
│   ├── __init__.py                  # Flask 工厂模式 (create_app)
│   ├── extensions.py                # 扩展初始化 (SQLAlchemy, SocketIO, Redis)
│   ├── api/                         # API 蓝图
│   │   ├── analysis_api.py          #   市场分析 API
│   │   ├── ml_factor_api.py         #   ML 因子管理 API
│   │   ├── realtime_analysis.py     #   实时分析 API
│   │   ├── realtime_indicators.py   #   实时指标 API
│   │   ├── realtime_signals.py      #   交易信号 API
│   │   ├── realtime_monitor.py      #   实时监控 API
│   │   ├── realtime_risk.py         #   风险管理 API
│   │   ├── realtime_report.py       #   分析报告 API
│   │   ├── text2sql_api.py          #   自然语言查询 API
│   │   ├── data_jobs_api.py         #   数据下载任务 API
│   │   └── websocket_api.py         #   WebSocket 管理 API
│   ├── models/                      # 数据模型 (SQLAlchemy + Parquet 事件)
│   ├── services/                    # 核心业务服务
│   ├── routes/                      # 页面路由 (HTML 渲染)
│   ├── templates/                   # Jinja2 HTML 模板
│   ├── static/                      # CSS / JS / 图片
│   ├── utils/                       # 数据下载脚本 (通达信/Baostock/Tushare)
│   ├── websocket/                   # WebSocket 推送服务
│   └── services/tongdaxin/          # 通达信行情客户端
├── data/                            # 数据目录
│   ├── stock_minute/                #   分钟级行情 Parquet
│   ├── ml_factor_state/             #   ML 因子状态 Parquet
│   └── realtime_events/            #   实时事件 Parquet
├── tests/                           # 测试用例
├── acceptance/                      # 验收标准与里程碑
├── config.py                        # 配置管理
├── run.py                           # Web 启动入口
└── run_system.py                    # 初始化与诊断工具
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  四、核心服务一览
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;服务&lt;/th&gt;
&lt;th&gt;文件&lt;/th&gt;
&lt;th&gt;职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FactorEngine&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/factor_engine.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;内置因子计算与自定义因子管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FactorExpressionEngine&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/factor_expression_engine.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;白名单校验的自定义因子公式引擎&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MLModelManager&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/ml_models.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XGBoost / LightGBM / RandomForest 模型生命周期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ModelTrainingJobService&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/model_training_job_service.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;异步训练任务轮询与管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StockScoringEngine&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/stock_scoring.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;因子评分与 ML 评分的综合选股引擎&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PortfolioOptimizer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/portfolio_optimizer.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;等权 / 均值方差 / 风险平价 / 因子中性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BacktestEngine&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/backtest_engine.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;单策略与多策略回测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text2SQLEngine&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/text2sql_engine.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LLM 驱动的自然语言转 SQL 查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RealtimeIndicatorEngine&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/realtime_indicator_engine.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;实时技术指标计算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RealtimeTradingSignalEngine&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/realtime_trading_signal_engine.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多策略交易信号生成与融合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RealtimeRiskManager&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/realtime_risk_manager.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;风险指标、预警管理、压力测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataJobs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;services/data_jobs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据下载任务执行器（Inline / Celery）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  五、API 蓝图一览
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;URL 前缀&lt;/th&gt;
&lt;th&gt;功能域&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主 API — 股票、分析、Text2SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/ml-factor/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;因子管理、ML 模型、选股评分、组合优化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/data-jobs/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据下载任务提交与状态查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/realtime-analysis/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;实时指标、信号、监控、风险、报告&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/api/websocket/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WebSocket 管理端点&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  六、快速开始
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 克隆 &amp;amp; 安装
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;repository-url&amp;gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;quantitative_analysis

&lt;span class="c"&gt;# 安装依赖&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# 如遇兼容问题，使用最小依赖&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements_minimal.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 下载数据
&lt;/h3&gt;

&lt;p&gt;下载预打包的 A 股历史数据，解压到 &lt;code&gt;data/&lt;/code&gt; 目录即可。也可通过系统内的数据管理页面在线更新。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 启动系统
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 启动 Web 服务&lt;/span&gt;
python run.py

&lt;span class="c"&gt;# 访问地址&lt;/span&gt;
http://localhost:5000    &lt;span class="c"&gt;# Web 界面&lt;/span&gt;
http://localhost:5000/api &lt;span class="c"&gt;# API 入口&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  容器化启动（可选）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;默认启动 Web + SQLite + Redis；市场数据和 ML 因子状态仍使用本地 Parquet 文件。&lt;/p&gt;




&lt;h2&gt;
  
  
  七、配置说明
&lt;/h2&gt;

&lt;p&gt;所有配置通过 &lt;code&gt;config.py&lt;/code&gt; 管理，支持环境变量 &lt;code&gt;.env&lt;/code&gt; 文件覆盖。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置项&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DATA_SOURCE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;parquet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据源类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SQLALCHEMY_DATABASE_URI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;td&gt;应用状态数据库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REDIS_HOST / REDIS_PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localhost:6379&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Redis 连接（Celery/缓存）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FLASK_ENV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;development&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;运行环境&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DATA_JOB_EXECUTION_MODE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;inline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;任务执行模式（inline / celery）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LLM_CONFIG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ollama (qwen2.5-coder)&lt;/td&gt;
&lt;td&gt;LLM 提供商配置&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  八、项目定位
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ 适用场景
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;量化交易入门学习&lt;/li&gt;
&lt;li&gt;策略研究与验证&lt;/li&gt;
&lt;li&gt;二次开发与定制&lt;/li&gt;
&lt;li&gt;量化系统架构参考&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ 不适用场景
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;直接用于实盘交易&lt;/li&gt;
&lt;li&gt;高频交易系统&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  九、版本历史
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;日期&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v1.0.0&lt;/td&gt;
&lt;td&gt;2025-06-01&lt;/td&gt;
&lt;td&gt;多因子选股系统初始版本：因子管理和计算、机器学习模型集成、组合优化、回测验证引擎、Web 界面和 API 接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v2.0.0-parquet&lt;/td&gt;
&lt;td&gt;2026-06-06&lt;/td&gt;
&lt;td&gt;架构升级：从 MySQL 迁移到 Parquet + SQLite，零外部数据库依赖。新增实时行情分析模块、通达信行情接入、日频数据中心、投资组合管理完整闭环、报告可视化、离线数据包&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;多因子选股系统 — 面向 A 股市场的全链路量化分析平台&lt;/em&gt;&lt;br&gt;
&lt;em&gt;MIT License&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quantitative</category>
      <category>analysis</category>
    </item>
    <item>
      <title>用hermes agent开发的每日市场简报</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sat, 23 May 2026 13:59:22 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/yong-hermes-agentkai-fa-de-mei-ri-shi-chang-jian-bao-3c0h</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/yong-hermes-agentkai-fa-de-mei-ri-shi-chang-jian-bao-3c0h</guid>
      <description>&lt;p&gt;第一次开发token消耗900K左右，后面复用，只需要调用脚本生成，不需要再消耗token。&lt;/p&gt;

&lt;h1&gt;
  
  
  📊 每日市场简报
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-21（周四）&lt;/strong&gt;  ·  共 5501 只股票&lt;/p&gt;

&lt;p&gt;全市场成交额 &lt;strong&gt;35,072.80亿&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  一、涨跌概览
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;数值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;上涨家数&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;695&lt;/strong&gt; (12.6%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下跌家数&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4773&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平盘家数&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;涨停数&lt;/td&gt;
&lt;td&gt;🔴 &lt;strong&gt;40&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跌停数&lt;/td&gt;
&lt;td&gt;🟢 &lt;strong&gt;46&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;涨跌比&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.15:1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  二、成交额 TOP10
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;成交额(亿)&lt;/th&gt;
&lt;th&gt;涨跌幅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;688008.SH&lt;/td&gt;
&lt;td&gt;澜起科技&lt;/td&gt;
&lt;td&gt;306.55亿&lt;/td&gt;
&lt;td&gt;+1.89%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;603986.SH&lt;/td&gt;
&lt;td&gt;兆易创新&lt;/td&gt;
&lt;td&gt;281.99亿&lt;/td&gt;
&lt;td&gt;-2.95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;300308.SZ&lt;/td&gt;
&lt;td&gt;中际旭创&lt;/td&gt;
&lt;td&gt;243.95亿&lt;/td&gt;
&lt;td&gt;-4.21%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;600584.SH&lt;/td&gt;
&lt;td&gt;长电科技&lt;/td&gt;
&lt;td&gt;213.24亿&lt;/td&gt;
&lt;td&gt;+0.94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;688981.SH&lt;/td&gt;
&lt;td&gt;中芯国际&lt;/td&gt;
&lt;td&gt;206.02亿&lt;/td&gt;
&lt;td&gt;-4.92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;688256.SH&lt;/td&gt;
&lt;td&gt;寒武纪-U&lt;/td&gt;
&lt;td&gt;205.30亿&lt;/td&gt;
&lt;td&gt;-5.25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;002281.SZ&lt;/td&gt;
&lt;td&gt;光迅科技&lt;/td&gt;
&lt;td&gt;199.59亿&lt;/td&gt;
&lt;td&gt;-8.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;002384.SZ&lt;/td&gt;
&lt;td&gt;东山精密&lt;/td&gt;
&lt;td&gt;193.85亿&lt;/td&gt;
&lt;td&gt;-7.19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;000988.SZ&lt;/td&gt;
&lt;td&gt;华工科技&lt;/td&gt;
&lt;td&gt;193.22亿&lt;/td&gt;
&lt;td&gt;-5.79%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;300502.SZ&lt;/td&gt;
&lt;td&gt;新易盛&lt;/td&gt;
&lt;td&gt;192.60亿&lt;/td&gt;
&lt;td&gt;-3.74%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  三、行业涨跌排名
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;行业&lt;/th&gt;
&lt;th&gt;均涨幅&lt;/th&gt;
&lt;th&gt;上涨&lt;/th&gt;
&lt;th&gt;下跌&lt;/th&gt;
&lt;th&gt;总数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;空运&lt;/td&gt;
&lt;td&gt;+1.98%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;公共交通&lt;/td&gt;
&lt;td&gt;+0.93%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;银行&lt;/td&gt;
&lt;td&gt;+0.17%&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;白酒&lt;/td&gt;
&lt;td&gt;+0.10%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;路桥&lt;/td&gt;
&lt;td&gt;-0.01%&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;水运&lt;/td&gt;
&lt;td&gt;-0.03%&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;证券&lt;/td&gt;
&lt;td&gt;-0.14%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;摩托车&lt;/td&gt;
&lt;td&gt;-0.24%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;玻璃&lt;/td&gt;
&lt;td&gt;-0.32%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;汽车整车&lt;/td&gt;
&lt;td&gt;-0.35%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;生物制药&lt;/td&gt;
&lt;td&gt;-0.47%&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;旅游服务&lt;/td&gt;
&lt;td&gt;-0.57%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;港口&lt;/td&gt;
&lt;td&gt;-0.58%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;酒店餐饮&lt;/td&gt;
&lt;td&gt;-0.67%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;机场&lt;/td&gt;
&lt;td&gt;-0.78%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;红黄酒&lt;/td&gt;
&lt;td&gt;-0.90%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;旅游景点&lt;/td&gt;
&lt;td&gt;-0.91%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;汽车配件&lt;/td&gt;
&lt;td&gt;-0.91%&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;174&lt;/td&gt;
&lt;td&gt;258&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;保险&lt;/td&gt;
&lt;td&gt;-0.94%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;纺织机械&lt;/td&gt;
&lt;td&gt;-1.13%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;火力发电&lt;/td&gt;
&lt;td&gt;-1.26%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;公路&lt;/td&gt;
&lt;td&gt;-1.30%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;铁路&lt;/td&gt;
&lt;td&gt;-1.48%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;水力发电&lt;/td&gt;
&lt;td&gt;-1.49%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;家用电器&lt;/td&gt;
&lt;td&gt;-1.51%&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;电器连锁&lt;/td&gt;
&lt;td&gt;-1.65%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;普钢&lt;/td&gt;
&lt;td&gt;-1.67%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;机床制造&lt;/td&gt;
&lt;td&gt;-1.69%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;工程机械&lt;/td&gt;
&lt;td&gt;-1.77%&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;化学制药&lt;/td&gt;
&lt;td&gt;-1.80%&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;园区开发&lt;/td&gt;
&lt;td&gt;-1.81%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;中成药&lt;/td&gt;
&lt;td&gt;-1.88%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;医疗保健&lt;/td&gt;
&lt;td&gt;-1.93%&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;153&lt;/td&gt;
&lt;td&gt;181&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;水泥&lt;/td&gt;
&lt;td&gt;-2.06%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;多元金融&lt;/td&gt;
&lt;td&gt;-2.11%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;机械基件&lt;/td&gt;
&lt;td&gt;-2.23%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;134&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;服饰&lt;/td&gt;
&lt;td&gt;-2.26%&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;特种钢&lt;/td&gt;
&lt;td&gt;-2.26%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;造纸&lt;/td&gt;
&lt;td&gt;-2.29%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;仓储物流&lt;/td&gt;
&lt;td&gt;-2.31%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;日用化工&lt;/td&gt;
&lt;td&gt;-2.33%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;汽车服务&lt;/td&gt;
&lt;td&gt;-2.33%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;农业综合&lt;/td&gt;
&lt;td&gt;-2.34%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;新型电力&lt;/td&gt;
&lt;td&gt;-2.35%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;食品&lt;/td&gt;
&lt;td&gt;-2.43%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;医药商业&lt;/td&gt;
&lt;td&gt;-2.44%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;百货&lt;/td&gt;
&lt;td&gt;-2.44%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;水务&lt;/td&gt;
&lt;td&gt;-2.45%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;家居用品&lt;/td&gt;
&lt;td&gt;-2.49%&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;饲料&lt;/td&gt;
&lt;td&gt;-2.54%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;元器件&lt;/td&gt;
&lt;td&gt;-2.56%&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;242&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;纺织&lt;/td&gt;
&lt;td&gt;-2.58%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;石油加工&lt;/td&gt;
&lt;td&gt;-2.59%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;渔业&lt;/td&gt;
&lt;td&gt;-2.61%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;小金属&lt;/td&gt;
&lt;td&gt;-2.67%&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;铝&lt;/td&gt;
&lt;td&gt;-2.70%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;啤酒&lt;/td&gt;
&lt;td&gt;-2.71%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;轻工机械&lt;/td&gt;
&lt;td&gt;-2.74%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;黄金&lt;/td&gt;
&lt;td&gt;-2.86%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;农药化肥&lt;/td&gt;
&lt;td&gt;-2.91%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;影视音像&lt;/td&gt;
&lt;td&gt;-2.92%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;乳制品&lt;/td&gt;
&lt;td&gt;-2.95%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;煤炭开采&lt;/td&gt;
&lt;td&gt;-2.97%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;农用机械&lt;/td&gt;
&lt;td&gt;-3.00%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;超市连锁&lt;/td&gt;
&lt;td&gt;-3.02%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;林业&lt;/td&gt;
&lt;td&gt;-3.06%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;出版业&lt;/td&gt;
&lt;td&gt;-3.07%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;建筑工程&lt;/td&gt;
&lt;td&gt;-3.12%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;电器仪表&lt;/td&gt;
&lt;td&gt;-3.14%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;航空&lt;/td&gt;
&lt;td&gt;-3.16%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;电信运营&lt;/td&gt;
&lt;td&gt;-3.17%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;文教休闲&lt;/td&gt;
&lt;td&gt;-3.23%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;矿物制品&lt;/td&gt;
&lt;td&gt;-3.24%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;环境保护&lt;/td&gt;
&lt;td&gt;-3.26%&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;其他商业&lt;/td&gt;
&lt;td&gt;-3.26%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;供气供热&lt;/td&gt;
&lt;td&gt;-3.31%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;塑料&lt;/td&gt;
&lt;td&gt;-3.36%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;种植业&lt;/td&gt;
&lt;td&gt;-3.43%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;广告包装&lt;/td&gt;
&lt;td&gt;-3.44%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;运输设备&lt;/td&gt;
&lt;td&gt;-3.47%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;化纤&lt;/td&gt;
&lt;td&gt;-3.47%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;互联网&lt;/td&gt;
&lt;td&gt;-3.52%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;专用机械&lt;/td&gt;
&lt;td&gt;-3.53%&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;td&gt;280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;商贸代理&lt;/td&gt;
&lt;td&gt;-3.54%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;船舶&lt;/td&gt;
&lt;td&gt;-3.55%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;铜&lt;/td&gt;
&lt;td&gt;-3.56%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;铅锌&lt;/td&gt;
&lt;td&gt;-3.59%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;IT设备&lt;/td&gt;
&lt;td&gt;-3.67%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;电气设备&lt;/td&gt;
&lt;td&gt;-3.69%&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;303&lt;/td&gt;
&lt;td&gt;342&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;批发业&lt;/td&gt;
&lt;td&gt;-3.71%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;软件服务&lt;/td&gt;
&lt;td&gt;-3.77%&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;279&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;全国地产&lt;/td&gt;
&lt;td&gt;-3.80%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;染料涂料&lt;/td&gt;
&lt;td&gt;-3.84%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;钢加工&lt;/td&gt;
&lt;td&gt;-3.84%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;其他建材&lt;/td&gt;
&lt;td&gt;-3.84%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;陶瓷&lt;/td&gt;
&lt;td&gt;-3.93%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;房产服务&lt;/td&gt;
&lt;td&gt;-3.97%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;化工原料&lt;/td&gt;
&lt;td&gt;-4.00%&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;238&lt;/td&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;化工机械&lt;/td&gt;
&lt;td&gt;-4.08%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;焦炭加工&lt;/td&gt;
&lt;td&gt;-4.13%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;综合类&lt;/td&gt;
&lt;td&gt;-4.14%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;橡胶&lt;/td&gt;
&lt;td&gt;-4.19%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;装修装饰&lt;/td&gt;
&lt;td&gt;-4.20%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;商品城&lt;/td&gt;
&lt;td&gt;-4.28%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;区域地产&lt;/td&gt;
&lt;td&gt;-4.38%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;通信设备&lt;/td&gt;
&lt;td&gt;-4.69%&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;124&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;石油贸易&lt;/td&gt;
&lt;td&gt;-4.76%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;软饮料&lt;/td&gt;
&lt;td&gt;-4.83%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;石油开采&lt;/td&gt;
&lt;td&gt;-5.36%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;半导体&lt;/td&gt;
&lt;td&gt;-5.76%&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;176&lt;/td&gt;
&lt;td&gt;193&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  四、主力资金动向
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔥 净流入 TOP5
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;净流入(亿)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;002050.SZ&lt;/td&gt;
&lt;td&gt;三花智控&lt;/td&gt;
&lt;td&gt;3.00亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;688008.SH&lt;/td&gt;
&lt;td&gt;澜起科技&lt;/td&gt;
&lt;td&gt;1.99亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;300274.SZ&lt;/td&gt;
&lt;td&gt;阳光电源&lt;/td&gt;
&lt;td&gt;1.91亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;600745.SH&lt;/td&gt;
&lt;td&gt;闻泰科技&lt;/td&gt;
&lt;td&gt;1.35亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;300059.SZ&lt;/td&gt;
&lt;td&gt;东方财富&lt;/td&gt;
&lt;td&gt;1.03亿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  💧 净流出 TOP5
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;净流出(亿)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;000725.SZ&lt;/td&gt;
&lt;td&gt;京东方Ａ&lt;/td&gt;
&lt;td&gt;-4.86亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;603986.SH&lt;/td&gt;
&lt;td&gt;兆易创新&lt;/td&gt;
&lt;td&gt;-3.08亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;600522.SH&lt;/td&gt;
&lt;td&gt;中天科技&lt;/td&gt;
&lt;td&gt;-2.57亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;601138.SH&lt;/td&gt;
&lt;td&gt;工业富联&lt;/td&gt;
&lt;td&gt;-2.18亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;002384.SZ&lt;/td&gt;
&lt;td&gt;东山精密&lt;/td&gt;
&lt;td&gt;-1.87亿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  五、特殊形态统计
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;形态&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;首板（首次涨停）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连板（连续涨停）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阳包阴&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连涨≥3天&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;142&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🎯 连板个股明细
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;连板天数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;603779.SH&lt;/td&gt;
&lt;td&gt;威龙股份&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603316.SH&lt;/td&gt;
&lt;td&gt;诚邦股份&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;000518.SZ&lt;/td&gt;
&lt;td&gt;*ST四环&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002442.SZ&lt;/td&gt;
&lt;td&gt;龙星科技&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;003004.SZ&lt;/td&gt;
&lt;td&gt;*ST声迅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300069.SZ&lt;/td&gt;
&lt;td&gt;金利华电&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;301139.SZ&lt;/td&gt;
&lt;td&gt;元道通信&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600611.SH&lt;/td&gt;
&lt;td&gt;大众交通&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🌅 阳包阴个股（TOP20）
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;涨跌幅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;920100.BJ&lt;/td&gt;
&lt;td&gt;三协电机&lt;/td&gt;
&lt;td&gt;+14.18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;301488.SZ&lt;/td&gt;
&lt;td&gt;豪恩汽电&lt;/td&gt;
&lt;td&gt;+10.64%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600936.SH&lt;/td&gt;
&lt;td&gt;北投科技&lt;/td&gt;
&lt;td&gt;+10.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600156.SH&lt;/td&gt;
&lt;td&gt;华升股份&lt;/td&gt;
&lt;td&gt;+10.04%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600360.SH&lt;/td&gt;
&lt;td&gt;*ST华微&lt;/td&gt;
&lt;td&gt;+10.03%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002888.SZ&lt;/td&gt;
&lt;td&gt;惠威科技&lt;/td&gt;
&lt;td&gt;+10.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002940.SZ&lt;/td&gt;
&lt;td&gt;昂利康&lt;/td&gt;
&lt;td&gt;+10.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603373.SH&lt;/td&gt;
&lt;td&gt;安邦护卫&lt;/td&gt;
&lt;td&gt;+9.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600578.SH&lt;/td&gt;
&lt;td&gt;京能电力&lt;/td&gt;
&lt;td&gt;+9.95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;000404.SZ&lt;/td&gt;
&lt;td&gt;长虹华意&lt;/td&gt;
&lt;td&gt;+8.46%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;001331.SZ&lt;/td&gt;
&lt;td&gt;胜通能源&lt;/td&gt;
&lt;td&gt;+7.86%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603037.SH&lt;/td&gt;
&lt;td&gt;凯众股份&lt;/td&gt;
&lt;td&gt;+6.82%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300276.SZ&lt;/td&gt;
&lt;td&gt;三丰智能&lt;/td&gt;
&lt;td&gt;+6.60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600481.SH&lt;/td&gt;
&lt;td&gt;双良节能&lt;/td&gt;
&lt;td&gt;+6.56%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603040.SH&lt;/td&gt;
&lt;td&gt;新坐标&lt;/td&gt;
&lt;td&gt;+6.31%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603693.SH&lt;/td&gt;
&lt;td&gt;江苏新能&lt;/td&gt;
&lt;td&gt;+6.29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;001270.SZ&lt;/td&gt;
&lt;td&gt;*ST铖昌&lt;/td&gt;
&lt;td&gt;+6.19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;601127.SH&lt;/td&gt;
&lt;td&gt;赛力斯&lt;/td&gt;
&lt;td&gt;+6.14%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002471.SZ&lt;/td&gt;
&lt;td&gt;中超控股&lt;/td&gt;
&lt;td&gt;+5.71%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002284.SZ&lt;/td&gt;
&lt;td&gt;亚太股份&lt;/td&gt;
&lt;td&gt;+5.65%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📈 连涨≥3天个股（TOP10）
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;3日累计涨幅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;301020.SZ&lt;/td&gt;
&lt;td&gt;密封科技&lt;/td&gt;
&lt;td&gt;+32.53%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603316.SH&lt;/td&gt;
&lt;td&gt;诚邦股份&lt;/td&gt;
&lt;td&gt;+30.02%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603779.SH&lt;/td&gt;
&lt;td&gt;威龙股份&lt;/td&gt;
&lt;td&gt;+29.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;001259.SZ&lt;/td&gt;
&lt;td&gt;利仁科技&lt;/td&gt;
&lt;td&gt;+29.28%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;605288.SH&lt;/td&gt;
&lt;td&gt;凯迪股份&lt;/td&gt;
&lt;td&gt;+28.65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;688585.SH&lt;/td&gt;
&lt;td&gt;上纬新材&lt;/td&gt;
&lt;td&gt;+28.29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;688610.SH&lt;/td&gt;
&lt;td&gt;埃科光电&lt;/td&gt;
&lt;td&gt;+27.44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300152.SZ&lt;/td&gt;
&lt;td&gt;ST新动力&lt;/td&gt;
&lt;td&gt;+25.67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;301322.SZ&lt;/td&gt;
&lt;td&gt;绿通科技&lt;/td&gt;
&lt;td&gt;+25.19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300715.SZ&lt;/td&gt;
&lt;td&gt;凯伦股份&lt;/td&gt;
&lt;td&gt;+25.10%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;由 Hermes Quant 每日市场简报生成器自动生成&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;生成时间: 2026-05-23 21:39:23&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hermes</category>
      <category>agents</category>
    </item>
    <item>
      <title>第 1 章：什么是 FreqAI / 安装与首次运行</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 17 May 2026 07:21:23 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/di-1-zhang-shi-yao-shi-freqai-an-zhuang-yu-shou-ci-yun-xing-1535</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/di-1-zhang-shi-yao-shi-freqai-an-zhuang-yu-shou-ci-yun-xing-1535</guid>
      <description>&lt;h1&gt;
  
  
  第 1 章：什么是 FreqAI / 安装与首次运行
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;对应官方文档：&lt;a href="https://www.freqtrade.io/en/stable/freqai/" rel="noopener noreferrer"&gt;https://www.freqtrade.io/en/stable/freqai/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  学习目标
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;用一句话说清 FreqAI 解决什么问题&lt;/li&gt;
&lt;li&gt;理解 FreqAI 的"训练—预测—再训练"循环&lt;/li&gt;
&lt;li&gt;完成 FreqAI 依赖安装&lt;/li&gt;
&lt;li&gt;跑通一个&lt;strong&gt;最小&lt;/strong&gt;可运行的 LightGBM 回归示例，看到 backtest 报告&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1.1 FreqAI 是什么
&lt;/h2&gt;

&lt;p&gt;官方原话：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;FreqAI is a software designed to &lt;strong&gt;automate a variety of tasks associated with training a predictive machine learning model&lt;/strong&gt; to generate market forecasts given a set of input features.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;人话版：&lt;strong&gt;FreqAI 是给 Freqtrade 策略加上"机器学习预测能力"的官方框架&lt;/strong&gt;。你只要在策略里写几个钩子说明"我要用哪些特征、要预测什么"，FreqAI 就自动负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;拉数据、构造特征、对齐时间戳&lt;/li&gt;
&lt;li&gt;切分训练/测试集&lt;/li&gt;
&lt;li&gt;训练模型并保存到磁盘&lt;/li&gt;
&lt;li&gt;推理出预测列（&lt;code&gt;&amp;amp;-&lt;/code&gt; 开头）回填到 dataframe&lt;/li&gt;
&lt;li&gt;按时间窗口&lt;strong&gt;自动再训练&lt;/strong&gt;适应市场漂移&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你在策略里像用普通 indicator 一样使用预测列就行。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 FreqAI 的工作循环
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────┐
│  Freqtrade Pair Dataframe (OHLCV + base indicators)              │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌──────────────────────────────────────────────────────────────────┐
│  Strategy hooks (你写的):                                        │
│    feature_engineering_expand_all   ──▶ %- 特征（按period展开） │
│    feature_engineering_expand_basic ──▶ %- 特征（不随period展开）│
│    feature_engineering_standard     ──▶ %- 特征（最终统一处理） │
│    set_freqai_targets               ──▶ &amp;amp;- 标签（必须）          │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌──────────────────────────────────────────────────────────────────┐
│  FreqAI 引擎自动完成：                                           │
│    1. 按 train_period_days 切训练窗口                            │
│    2. 标准化 / 异常值检测 / PCA（可选）                          │
│    3. 调用模型 fit() 训练                                        │
│    4. 保存模型到 user_data/models/&amp;lt;identifier&amp;gt;/                  │
│    5. 在 backtest_period_days 范围内做 predict() 回填到 df       │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌──────────────────────────────────────────────────────────────────┐
│  策略 populate_entry_trend / populate_exit_trend：               │
│    用 df["&amp;amp;-s_close"] 或 df["do_predict"] 当作普通指标使用       │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
                       下单 / 平仓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;%-&lt;/code&gt; 前缀&lt;/strong&gt;：模型用作输入的特征&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;amp;-&lt;/code&gt; 前缀&lt;/strong&gt;：模型要预测的目标（label）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;无前缀&lt;/strong&gt;：中间计算列，不进入模型&lt;/li&gt;
&lt;li&gt;窗口每滚动 &lt;code&gt;backtest_period_days&lt;/code&gt; 天就&lt;strong&gt;重新训练一次&lt;/strong&gt;（实盘里改用 &lt;code&gt;live_retrain_hours&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1.3 安装
&lt;/h2&gt;

&lt;p&gt;FreqAI 不在 Freqtrade 默认依赖里，需要单独装：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda activate freqtrade

&lt;span class="c"&gt;# 进入你的 freqtrade 源码或安装目录&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements-freqai.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这会装上：&lt;code&gt;lightgbm&lt;/code&gt;、&lt;code&gt;catboost&lt;/code&gt;、&lt;code&gt;xgboost&lt;/code&gt;、&lt;code&gt;scikit-learn&lt;/code&gt;、&lt;code&gt;datasieve&lt;/code&gt; 等。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docker 用户改用镜像 &lt;code&gt;freqtradeorg/freqtrade:stable_freqai&lt;/code&gt; 即可。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;第 7 章的强化学习需要额外的 &lt;code&gt;requirements-freqai-rl.txt&lt;/code&gt;（含 &lt;code&gt;stable-baselines3&lt;/code&gt; 与 &lt;code&gt;torch&lt;/code&gt;，大约 700MB，按需安装）。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.4 最小可运行示例
&lt;/h2&gt;

&lt;p&gt;我们要做的事情非常简单：&lt;strong&gt;预测未来 12 根 5m K 线的平均收盘价相对当前 close 的偏移&lt;/strong&gt;。本质是一个回归问题，预测出来的值约等于 "未来一小时的预期回报率"。&lt;/p&gt;

&lt;p&gt;策略文件：&lt;a href="//examples/ch01/FreqaiHelloStrategy.py"&gt;&lt;code&gt;examples/ch01/FreqaiHelloStrategy.py&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;配置文件：&lt;a href="//examples/ch01/config_ch01.json"&gt;&lt;code&gt;examples/ch01/config_ch01.json&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4.1 策略代码精读
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FreqaiHelloStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;timeframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;can_short&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;process_only_new_candles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;startup_candle_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;           &lt;span class="c1"&gt;# &amp;gt;= indicator_periods_candles 最大值 * 2
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;feature_engineering_expand_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 每个 period（10, 20）都会被自动展开一遍
&lt;/span&gt;        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%-rsi-period_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RSI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeperiod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%-ema-period_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;EMA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeperiod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_freqai_targets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 必须实现：定义 &amp;amp;- 开头的列作为预测目标
&lt;/span&gt;        &lt;span class="n"&gt;horizon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;freqai_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;feature_parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label_period_candles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;-s_close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;horizon&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;horizon&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;populate_indicators&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 把 freqai 引擎接进来——这是必须的一行
&lt;/span&gt;        &lt;span class="n"&gt;dataframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;freqai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;populate_entry_trend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 预测值 &amp;gt; 0 且预测置信度 ok 就开多
&lt;/span&gt;        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;-s_close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;do_predict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enter_long&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;populate_exit_trend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;-s_close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exit_long&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;记住两个魔法字段：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;do_predict&lt;/code&gt;：FreqAI 自动加在 dataframe 上的"这一行预测是否有效"标记（1 表示在 DI 阈值内可信）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;-s_close&lt;/code&gt;：你定义的 label 在推理阶段会被同名列自动覆盖为预测值&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.4.2 配置文件精读
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;config_ch01.json&lt;/code&gt; 的 &lt;code&gt;freqai&lt;/code&gt; 块：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"freqai"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"identifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ch01_hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"train_period_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"backtest_period_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"live_retrain_hours"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"purge_old_models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"feature_parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"include_timeframes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"5m"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"include_corr_pairlist"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"label_period_candles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"include_shifted_candles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"indicator_periods_candles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data_split_parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"test_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"shuffle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model_training_parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"n_estimators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;最小可运行配置：单时间框架、无相关币种、两个指标周期。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.5 运行命令
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda activate freqtrade

&lt;span class="c"&gt;# 1. 预下载数据（带 35 天 buffer，给 train_period_days=15 + startup=40 留余地）&lt;/span&gt;
freqtrade download-data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--exchange&lt;/span&gt; binance &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pairs&lt;/span&gt; BTC/USDT ETH/USDT &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeframes&lt;/span&gt; 5m &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timerange&lt;/span&gt; 20240501-20240801

&lt;span class="c"&gt;# 2. 跑回测&lt;/span&gt;
freqtrade backtesting &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--config&lt;/span&gt; freqai-tutorial/examples/ch01/config_ch01.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--strategy&lt;/span&gt; FreqaiHelloStrategy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--strategy-path&lt;/span&gt; freqai-tutorial/examples/ch01 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--freqaimodel&lt;/span&gt; LightGBMRegressor &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timerange&lt;/span&gt; 20240601-20240731
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;期待输出（节选）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;=========== FREQAI ENABLED ===========
Found XX historical candles for BTC/USDT 5m
Training model for BTC/USDT
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="go"&gt;============================ BACKTESTING REPORT ============================
| Pair        | Entries | Avg Profit % | ... |
| BTC/USDT    | XX      | X.XX         | ... |
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;只要看到 "Training model for ..." 与最终的 BACKTESTING REPORT 表格，就说明跑通了。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.6 常见错误
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;报错&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解决&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KeyError: 'freqai'&lt;/code&gt; 或 &lt;code&gt;freqai_info is None&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;配置里没启用 freqai 块&lt;/td&gt;
&lt;td&gt;检查 &lt;code&gt;freqai.enabled: true&lt;/code&gt;，且 &lt;code&gt;freqaimodel&lt;/code&gt; 命令行参数已传&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;No model found in user_data/models/&amp;lt;identifier&amp;gt;/...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;训练窗口不够 / 数据没下载完&lt;/td&gt;
&lt;td&gt;把 &lt;code&gt;--timerange&lt;/code&gt; 起点往后挪到 &lt;code&gt;train_period_days + startup&lt;/code&gt; 之后&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KeyError: '&amp;amp;-s_close'&lt;/code&gt; 在 populate_entry_trend&lt;/td&gt;
&lt;td&gt;忘了在 populate_indicators 里调 &lt;code&gt;self.freqai.start(...)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;加上那一行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cannot use VolumePairList with FreqAI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用了动态币池&lt;/td&gt;
&lt;td&gt;改成静态 &lt;code&gt;StaticPairList&lt;/code&gt; 或 &lt;code&gt;ShufflePairList&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1.7 验证情况
&lt;/h2&gt;

&lt;p&gt;✅ 本章示例在 &lt;code&gt;conda activate freqtrade&lt;/code&gt; 环境下完整跑通了 backtesting（见教程仓库 README）。如果你的环境跑不起来，多半是数据没下全或 freqtrade 版本太老（建议 ≥ 2024.x）。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.8 小结与下一章
&lt;/h2&gt;

&lt;p&gt;你已经会跑一个最小 FreqAI 策略了。但很多配置字段是直接照抄的，第 2 章会&lt;strong&gt;逐项&lt;/strong&gt;拆解 &lt;code&gt;freqai&lt;/code&gt; 块每个字段的含义，让你能根据自己的需求改配置。&lt;/p&gt;

</description>
      <category>freqai</category>
    </item>
    <item>
      <title>为什么长期做量化，一定要先搭建自己的“数据中台”</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Tue, 12 May 2026 11:24:30 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/wei-shi-yao-chang-qi-zuo-liang-hua-ding-yao-xian-da-jian-zi-ji-de-shu-ju-zhong-tai--44bm</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/wei-shi-yao-chang-qi-zuo-liang-hua-ding-yao-xian-da-jian-zi-ji-de-shu-ju-zhong-tai--44bm</guid>
      <description>&lt;h1&gt;
  
  
  为什么长期做量化，一定要先搭建自己的数据中台
&lt;/h1&gt;

&lt;p&gt;很多人做量化，第一步就开始研究策略。&lt;/p&gt;

&lt;p&gt;今天学一个 MACD，明天学一个 AI 选股，后天开始回测。结果半年后，策略越来越多，代码越来越乱，数据越来越碎，整个系统根本没法扩展。&lt;/p&gt;

&lt;p&gt;尤其是个人开发者、独立量化团队，经常会踩一个坑：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;把量化系统当成了策略工程，而不是数据工程。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;但说实话，真正长期跑得起来的量化系统，重心其实不在策略上，而在数据层。&lt;/p&gt;




&lt;h1&gt;
  
  
  为什么数据底座这么重要？
&lt;/h1&gt;

&lt;p&gt;量化系统本质上就是数据驱动。所有策略、因子、回测、AI 模型、风控、选股，全都建在数据之上。&lt;/p&gt;

&lt;p&gt;数据层一旦出问题，后面什么都跟着乱：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;指标没法统一，同一个 PE 不同来源数值不一样&lt;/li&gt;
&lt;li&gt;股票代码混乱，有的表叫 code，有的叫 symbol，有的叫 ts_code&lt;/li&gt;
&lt;li&gt;时间周期对不上，日线周线分钟线混在一起&lt;/li&gt;
&lt;li&gt;财务数据缺失，财报更新不及时&lt;/li&gt;
&lt;li&gt;因子重复计算，好几个策略各算一遍一样的东西&lt;/li&gt;
&lt;li&gt;回测和实盘用的数据不一致，结果根本没法复现&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;很多人刚开始只有几十只股票的数据，觉得 CSV 就够了。但做半年以后你会发现，日线、分钟线、基本面、财报、资金流、技术指标、因子库、AI 特征、新闻舆情、宏观数据……数据量增长得比你想的快得多。这时候如果没有统一的数据管理方式，后面几乎没法维护。&lt;/p&gt;




&lt;h1&gt;
  
  
  一个成熟量化系统需要哪些数据？
&lt;/h1&gt;

&lt;p&gt;长期来看，建议至少把下面这些数据管起来：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌─────────────────────┐
                    │    数据中台 / DataHub │
                    └─────────────────────┘
                               │
 ┌────────────────────────────────────────────────────────┐
 │                                                        │
 │ • daily_history   (日线行情 OHLCV)                      │
 │ • daily_basic    (基本面 PE/PB/换手率)                  │
 │ • moneyflow      (资金流向)                             │
 │ • stk_factor     (技术指标 MACD/KDJ/RSI)                │
 │ • stock_basic    (股票基础信息)                         │
 │ • balance_sheet  (资产负债表)                           │
 │ • income_statement (利润表)                             │
 │ • cash_flow      (现金流量表)                           │
 │                                                        │
 └────────────────────────────────────────────────────────┘
                               │
        ┌──────────────────────────────────┐
        │                                  │
        │  因子系统 / 回测 / AI / 策略引擎   │
        │                                  │
        └──────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  为什么建议一开始就搭？
&lt;/h1&gt;

&lt;p&gt;有开发者会说："我策略还没跑通，先不用那么复杂吧。"&lt;/p&gt;

&lt;p&gt;这想法挺正常的，但后期再重构数据层，代价真的很大。&lt;/p&gt;

&lt;p&gt;量化有个特点：数据只会越来越多。你今天可能只有 500 只股票的日线，但早晚要加全市场、分钟线、Tick、期货、ETF、美股、港股、AI 特征、另类数据。&lt;/p&gt;

&lt;p&gt;如果一开始没设计好数据结构，后面大概率会遇到：表结构崩坏、查询变慢、指标重复计算、Redis 缓存失控、CSV 满天飞、Python 脚本互相依赖改一个挂一片。等你想整理的时候，已经理不清了。&lt;/p&gt;




&lt;h1&gt;
  
  
  量化的核心其实不是策略，是数据复用
&lt;/h1&gt;

&lt;p&gt;大部分刚入门的人觉得策略最重要。但实际上，成熟的量化团队花在数据一致性、数据清洗、数据标准化、因子复用、特征工程上的精力，远比调参多。&lt;/p&gt;

&lt;p&gt;原因很简单：一份数据可以反复用。&lt;/p&gt;

&lt;p&gt;比如同一份 &lt;code&gt;daily_history&lt;/code&gt;，动量策略用得着，AI 训练用得着，因子分析用得着，行业轮动用得着，回测用得着，择时用得着，可视化展示用得着，选股器也用得着。&lt;/p&gt;

&lt;p&gt;所以长期来看，真正有价值的是持续积累的数据资产，不是某一个短期能赚钱的策略。策略会过时，数据不会。&lt;/p&gt;




&lt;h1&gt;
  
  
  推荐的数据中台设计思路
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. 原始数据层（ODS）
&lt;/h2&gt;

&lt;p&gt;保持原始数据，不做修改。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ods_daily_history
ods_moneyflow
ods_financial
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;核心原则就是三条：可追溯、不污染、永远保留原始源数据。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 标准化层（DWD）
&lt;/h2&gt;

&lt;p&gt;统一字段。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ts_code
trade_date
open
high
low
close
volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这一层要解决的问题就是命名不一致——有的表叫 code，有的叫 symbol，有的叫 stock_code，到后面你会疯掉。统一规范非常重要。&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 因子层（DWS）
&lt;/h2&gt;

&lt;p&gt;这里放计算后的东西：技术指标、Alpha 因子、AI 特征、行业特征、横截面特征。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;factor_momentum_20
factor_turnover_ratio
factor_pe_rank
factor_volume_breakout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. 策略层（ADS）
&lt;/h2&gt;

&lt;p&gt;直接给回测、AI 模型、选股器、前端接口用的。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;top_factors_daily
strategy_signals
stock_scores
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  AI 和量化的关系
&lt;/h1&gt;

&lt;p&gt;AI 深度介入量化已经是大趋势了。但 AI 有个硬需求：它要吃数据，而且是干净、结构化、能对齐的数据。&lt;/p&gt;

&lt;p&gt;没有稳定的数据底座，特征工程做不了，时序训练做不了，多周期融合做不了，Walk-Forward 做不了，因子挖掘做不了，AutoML 也做不了。&lt;/p&gt;

&lt;p&gt;我见过不少人，最后卡住的不是策略能力，是数据根本接不起来。&lt;/p&gt;




&lt;h1&gt;
  
  
  个人开发者推荐的技术架构
&lt;/h1&gt;

&lt;p&gt;个人或者小团队没必要上来就搞 Hadoop。以下这些够用了：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据存储：&lt;/strong&gt; PostgreSQL / ClickHouse / DuckDB / Parquet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;缓存层：&lt;/strong&gt; Redis&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;任务调度：&lt;/strong&gt; Airflow / Celery / Cron&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据处理：&lt;/strong&gt; Python + Pandas + Polars&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;因子计算：&lt;/strong&gt; TA-Lib / vectorbt / Qlib&lt;/p&gt;




&lt;h1&gt;
  
  
  两条不同的路
&lt;/h1&gt;

&lt;p&gt;很多人的路径是这样的：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;策略 → 回测 → 亏钱 → 放弃
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;而把数据当核心资产的人，路径大概是这样：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;数据底座 → 因子平台 → 回测框架 → AI 特征工程 → 自动选股 → 多策略组合 → 风控系统 → 实盘交易
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;区别就在于你把数据当成附属品，还是当成核心资产。&lt;/p&gt;




&lt;h1&gt;
  
  
  总结
&lt;/h1&gt;

&lt;p&gt;长期做量化，与其急着写策略、做回测、研究 AI，不如先把数据中台搭起来。&lt;/p&gt;

&lt;p&gt;策略会失效，市场会变，模型会过时。但数据资产会一直积累，越往后越值钱。&lt;/p&gt;

&lt;p&gt;量化这件事，拼到最后，壁垒往往不是什么策略秘密，而是你手里有没有一套长期积累、持续迭代的数据底座。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>US Stock Screener</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Wed, 06 May 2026 00:44:39 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/us-stock-screener-4jpf</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/us-stock-screener-4jpf</guid>
      <description>&lt;h1&gt;
  
  
  US Stock Screener
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Access address
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://usstockscreener-production-6b89.up.railway.app/" rel="noopener noreferrer"&gt;https://usstockscreener-production-6b89.up.railway.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A daily US stock screener built with FastAPI + React. Fetches a curated tech/value stock pool via yfinance, computes daily technical patterns and rolling indicators into a single &lt;code&gt;data.parquet&lt;/code&gt; snapshot, and serves a full-featured filter/sort/research UI with &lt;strong&gt;real-time data support&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main Screener
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pattern filters&lt;/strong&gt; — single/double/triple candlestick patterns, MA trend patterns, volume/volatility signals, momentum signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numeric filters&lt;/strong&gt; — range conditions on any continuous metric (PE, ROE, market cap, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preset strategies&lt;/strong&gt; — one-click strategy presets combining multiple filters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sortable table&lt;/strong&gt; — sort by any column; paginated results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal score&lt;/strong&gt; — composite ranking score shown per stock&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Watchlist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Star any stock to add it to your watchlist (persisted via &lt;code&gt;localStorage&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchlist-only mode&lt;/strong&gt; — filter the table to show only starred stocks&lt;/li&gt;
&lt;li&gt;Watchlist bar shows count and quick actions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stock Research Page (&lt;code&gt;/stock/:symbol&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Price chart with candlestick + volume&lt;/li&gt;
&lt;li&gt;Technical indicators panel (MA, volatility, drawdown)&lt;/li&gt;
&lt;li&gt;Financials panel (PE, PB, ROE, margins, growth)&lt;/li&gt;
&lt;li&gt;Pattern history panel — win-rate and average return for triggered patterns&lt;/li&gt;
&lt;li&gt;Previous / next navigation within current filtered results&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compare Page (&lt;code&gt;/compare&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Select 2–5 stocks via checkboxes in the screener or "Add to Compare" on research pages&lt;/li&gt;
&lt;li&gt;Side-by-side metric table across 7 categories: Overview, Price Momentum, Valuation, Profitability, Growth, Financial Health, Risk&lt;/li&gt;
&lt;li&gt;Best value highlighted green, worst highlighted red per metric row&lt;/li&gt;
&lt;li&gt;Selection persists across page navigations (sessionStorage), resets on filter/sort change&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pattern Stats Page (&lt;code&gt;/pattern-stats&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Historical win-rate and average return for every pattern signal in the stock pool&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>datascience</category>
      <category>python</category>
      <category>react</category>
      <category>showdev</category>
    </item>
    <item>
      <title>美股日线选股器</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Wed, 06 May 2026 00:42:30 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-ri-xian-xuan-gu-qi-3nln</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-ri-xian-xuan-gu-qi-3nln</guid>
      <description>&lt;h1&gt;
  
  
  美股日线选股器
&lt;/h1&gt;

&lt;p&gt;访问地址：&lt;a href="https://usstockscreener-production-6b89.up.railway.app/" rel="noopener noreferrer"&gt;https://usstockscreener-production-6b89.up.railway.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;基于 FastAPI + React 构建的美股每日选股工具。通过 yfinance 拉取精选科技/价值股票池，计算日线技术形态与滚动指标，生成 &lt;code&gt;data.parquet&lt;/code&gt; 快照文件，并提供功能完整的筛选、排序与研究页面，支持&lt;strong&gt;实时数据显示&lt;/strong&gt;。&lt;/p&gt;




&lt;h2&gt;
  
  
  功能介绍
&lt;/h2&gt;

&lt;h3&gt;
  
  
  主页选股器
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;形态筛选&lt;/strong&gt; — 单日/双日/三日 K 线形态，均线趋势形态，量能/波动率信号，动量信号&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;数值筛选&lt;/strong&gt; — 对任意连续指标（PE、ROE、市值等）设置范围条件&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;预设策略&lt;/strong&gt; — 一键应用组合多个筛选条件的策略预设&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可排序表格&lt;/strong&gt; — 按任意列排序，支持分页&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;综合评分&lt;/strong&gt; — 每只股票显示合成信号评分&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  观察列表
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;点击星标将股票加入观察列表（通过 &lt;code&gt;localStorage&lt;/code&gt; 持久化）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;仅看观察列表模式&lt;/strong&gt; — 过滤表格只展示已收藏的股票&lt;/li&gt;
&lt;li&gt;观察列表栏显示数量及快捷操作&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  个股研究页（&lt;code&gt;/stock/:symbol&lt;/code&gt;）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;K 线图 + 成交量图表&lt;/li&gt;
&lt;li&gt;技术指标面板（均线、波动率、最大回撤）&lt;/li&gt;
&lt;li&gt;财务指标面板（PE、PB、ROE、利润率、增长率）&lt;/li&gt;
&lt;li&gt;形态历史面板 — 展示每个触发形态的历史胜率与平均收益&lt;/li&gt;
&lt;li&gt;在当前筛选结果内前后翻页导航&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  对比页（&lt;code&gt;/compare&lt;/code&gt;）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;在选股器勾选复选框或在研究页点击"添加对比"，最多选取 5 只股票进行对比&lt;/li&gt;
&lt;li&gt;7 大类别横向对比指标：综合、价格动量、估值、盈利能力、成长性、财务健康、风险&lt;/li&gt;
&lt;li&gt;每行最优值标绿、最差值标红&lt;/li&gt;
&lt;li&gt;选择状态跨页保留（sessionStorage），切换筛选/排序条件时自动清空&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  形态统计页（&lt;code&gt;/pattern-stats&lt;/code&gt;）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;展示股票池中每个形态信号的历史胜率与平均收益&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  页面使用说明
&lt;/h2&gt;

&lt;h3&gt;
  
  
  主页选股器
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;左侧&lt;strong&gt;筛选面板&lt;/strong&gt;点击形态标签进行筛选，激活的筛选条件显示在顶部标签栏&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;数值筛选&lt;/strong&gt;图标可对 PE、ROE、市值等连续指标设置范围&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;预设策略&lt;/strong&gt;按钮一键应用组合策略&lt;/li&gt;
&lt;li&gt;表格列头可点击排序，底部分页切换&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;星标（☆）&lt;/strong&gt;将股票加入观察列表&lt;/li&gt;
&lt;li&gt;勾选&lt;strong&gt;复选框&lt;/strong&gt;将股票加入对比列表（最多 5 只）&lt;/li&gt;
&lt;li&gt;选满 2 只后，顶部出现&lt;strong&gt;比较(N)→&lt;/strong&gt; 按钮，底部出现&lt;strong&gt;对比栏&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  实时数据功能
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;顶部状态栏显示当前数据源类型（FREE/PREMIUM）和延迟状态&lt;/li&gt;
&lt;li&gt;点击"排名"按钮可展开/收起实时排名面板（仅付费版）&lt;/li&gt;
&lt;li&gt;股票表格中带有闪烁绿点的股票为实时数据&lt;/li&gt;
&lt;li&gt;点击"刷新"按钮手动更新实时报价&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  个股研究页
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;点击任意股票行进入研究页&lt;/li&gt;
&lt;li&gt;顶部可切换到上一只/下一只（在当前筛选结果内）&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;添加对比&lt;/strong&gt;将该股加入对比列表&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  对比页
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;选好 2–5 只股票后，点击对比栏的&lt;strong&gt;查看对比 →&lt;/strong&gt; 或顶部 &lt;strong&gt;比较(N)→&lt;/strong&gt; 进入&lt;/li&gt;
&lt;li&gt;逐行对比 17 项指标，绿色为同行最优，红色为同行最差&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;重新选择&lt;/strong&gt;清空列表并返回主页&lt;/li&gt;
&lt;/ul&gt;




</description>
    </item>
    <item>
      <title>Hermes Agent 项目思维导图</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 19 Apr 2026 13:38:57 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-xiang-mu-si-wei-dao-tu-27i6</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-xiang-mu-si-wei-dao-tu-27i6</guid>
      <description>&lt;h1&gt;
  
  
  Hermes Agent 项目思维导图
&lt;/h1&gt;

&lt;p&gt;这份文档用于导入 XMind 或其他支持 Markdown 层级导入的思维导图工具。主体内容尽量使用稳定的分级结构，减少长段解释，方便直接转换为脑图。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hermes Agent

&lt;ul&gt;
&lt;li&gt;项目定位&lt;/li&gt;
&lt;li&gt;自主型 AI Agent 运行时&lt;/li&gt;
&lt;li&gt;不只是聊天界面&lt;/li&gt;
&lt;li&gt;不只是 IDE copilot&lt;/li&gt;
&lt;li&gt;目标

&lt;ul&gt;
&lt;li&gt;调用工具完成任务&lt;/li&gt;
&lt;li&gt;跨会话保留长期能力&lt;/li&gt;
&lt;li&gt;跨平台运行&lt;/li&gt;
&lt;li&gt;支持自动化与扩展&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;典型场景

&lt;ul&gt;
&lt;li&gt;本地开发助手&lt;/li&gt;
&lt;li&gt;远程消息平台代理&lt;/li&gt;
&lt;li&gt;定时任务与监控&lt;/li&gt;
&lt;li&gt;企业内部系统接入&lt;/li&gt;
&lt;li&gt;研究与批处理&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;用户入口&lt;/li&gt;

&lt;li&gt;CLI

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;交互式主入口&lt;/li&gt;
&lt;li&gt;最完整的调试与观察界面&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Gateway

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes gateway&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Discord&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Signal&lt;/li&gt;
&lt;li&gt;其他平台适配器&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;ACP

&lt;ul&gt;
&lt;li&gt;编辑器集成&lt;/li&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;Zed&lt;/li&gt;
&lt;li&gt;JetBrains&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;API Server / Python Library / Batch Runner

&lt;ul&gt;
&lt;li&gt;程序化调用&lt;/li&gt;
&lt;li&gt;轨迹批处理&lt;/li&gt;
&lt;li&gt;研究与训练相关入口&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;核心能力&lt;/li&gt;

&lt;li&gt;Tools

&lt;ul&gt;
&lt;li&gt;文件操作&lt;/li&gt;
&lt;li&gt;终端执行&lt;/li&gt;
&lt;li&gt;Web 搜索与抽取&lt;/li&gt;
&lt;li&gt;Browser 自动化&lt;/li&gt;
&lt;li&gt;Vision / TTS / Image Gen&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Messaging&lt;/li&gt;
&lt;li&gt;Delegation&lt;/li&gt;
&lt;li&gt;Cron&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Toolsets

&lt;ul&gt;
&lt;li&gt;核心 toolset&lt;/li&gt;
&lt;li&gt;组合 toolset&lt;/li&gt;
&lt;li&gt;平台 toolset&lt;/li&gt;
&lt;li&gt;动态 toolset&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Skills

&lt;ul&gt;
&lt;li&gt;按需加载的流程知识&lt;/li&gt;
&lt;li&gt;本地 skills&lt;/li&gt;
&lt;li&gt;Skills Hub&lt;/li&gt;
&lt;li&gt;动态 slash commands&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Memory

&lt;ul&gt;
&lt;li&gt;跨会话事实信息&lt;/li&gt;
&lt;li&gt;MEMORY.md / USER.md&lt;/li&gt;
&lt;li&gt;外部 memory provider&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Context Files

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.cursorrules&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.cursor/rules/*.mdc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;MCP

&lt;ul&gt;
&lt;li&gt;外部工具接入&lt;/li&gt;
&lt;li&gt;stdio server&lt;/li&gt;
&lt;li&gt;HTTP server&lt;/li&gt;
&lt;li&gt;动态工具注册&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Cron

&lt;ul&gt;
&lt;li&gt;定时运行新 session&lt;/li&gt;
&lt;li&gt;delivery 到平台&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Delegation

&lt;ul&gt;
&lt;li&gt;子代理&lt;/li&gt;
&lt;li&gt;并行任务&lt;/li&gt;
&lt;li&gt;上下文隔离&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;核心运行系统&lt;/li&gt;

&lt;li&gt;AIAgent

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chat()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_conversation()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;同步 agent loop&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Prompt Builder

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_builder.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;组装系统提示词&lt;/li&gt;
&lt;li&gt;注入 personality / memory / context / skills&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Prompt Caching

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_caching.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;保持 prefix cache&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Context Compression

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/context_compressor.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;长会话压缩&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Provider / Runtime Resolution

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/runtime_provider.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/auth.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;provider 选择&lt;/li&gt;
&lt;li&gt;credentials 解析&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tool Dispatch

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;schema 收集&lt;/li&gt;
&lt;li&gt;handle function call&lt;/li&gt;
&lt;li&gt;tool availability gating&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Session Storage

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/session.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SQLite + FTS5&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Response Delivery

&lt;ul&gt;
&lt;li&gt;CLI display&lt;/li&gt;
&lt;li&gt;gateway delivery&lt;/li&gt;
&lt;li&gt;cron delivery&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;核心模块&lt;/li&gt;

&lt;li&gt;顶层核心文件

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cli.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toolsets.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;batch_runner.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;agent/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;prompt builder&lt;/li&gt;
&lt;li&gt;context compressor&lt;/li&gt;
&lt;li&gt;prompt caching&lt;/li&gt;
&lt;li&gt;auxiliary client&lt;/li&gt;
&lt;li&gt;display&lt;/li&gt;
&lt;li&gt;skill commands&lt;/li&gt;
&lt;li&gt;trajectory&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;hermes_cli/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commands.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools_config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skills_config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model_switch.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;tools/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;registry.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terminal_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code_execution_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delegate_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcp_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;environments/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;gateway/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delivery.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pairing.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;platforms/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;cron/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jobs.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scheduler.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;其他关键目录

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;acp_adapter/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;plugins/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skills/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;optional-skills/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;website/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tests/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;配置与状态体系&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/SOUL.md&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/skills/&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/sessions/&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;HERMES_HOME&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;Profiles

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes profile list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes profile create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes profile use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes profile show&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;关键规则&lt;/li&gt;

&lt;li&gt;Prompt cache 不应随意打破&lt;/li&gt;

&lt;li&gt;不要中途重建系统提示&lt;/li&gt;

&lt;li&gt;Toolset 不应在会话中随意变化&lt;/li&gt;

&lt;li&gt;profile-safe 路径规则

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_hermes_home()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display_hermes_home()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tool / Skill / MCP 的选择边界

&lt;ul&gt;
&lt;li&gt;流程优先 skill&lt;/li&gt;
&lt;li&gt;外部系统优先 MCP&lt;/li&gt;
&lt;li&gt;原生底层能力再做 tool&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;测试不要写到真实 &lt;code&gt;~/.hermes&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;关键文件&lt;/li&gt;

&lt;li&gt;入口

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cli.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;工具系统

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toolsets.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/registry.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;配置系统

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/main.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_constants.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;会话与状态

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/session.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;扩展系统

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tools/mcp_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent/skill_commands.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/commands.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;关键流程&lt;/li&gt;

&lt;li&gt;CLI 请求流程

&lt;ul&gt;
&lt;li&gt;用户输入&lt;/li&gt;
&lt;li&gt;CLI&lt;/li&gt;
&lt;li&gt;AIAgent&lt;/li&gt;
&lt;li&gt;Prompt Builder&lt;/li&gt;
&lt;li&gt;Provider / Runtime Resolution&lt;/li&gt;
&lt;li&gt;Model API Call&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Built-in Tools / MCP Tools&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;CLI display&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Gateway 请求流程

&lt;ul&gt;
&lt;li&gt;平台消息&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;li&gt;会话解析与授权&lt;/li&gt;
&lt;li&gt;AIAgent&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;平台回传&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Cron 请求流程

&lt;ul&gt;
&lt;li&gt;Scheduler Tick&lt;/li&gt;
&lt;li&gt;新 session&lt;/li&gt;
&lt;li&gt;AIAgent&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;Delivery target&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;MCP 工具接入流程

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mcp_servers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;server connect&lt;/li&gt;
&lt;li&gt;tool discovery&lt;/li&gt;
&lt;li&gt;dynamic toolset&lt;/li&gt;
&lt;li&gt;model 可调用&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tool 调用流程

&lt;ul&gt;
&lt;li&gt;schema collection&lt;/li&gt;
&lt;li&gt;model tool call&lt;/li&gt;
&lt;li&gt;&lt;code&gt;handle_function_call()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;registry dispatch&lt;/li&gt;
&lt;li&gt;tool result&lt;/li&gt;
&lt;li&gt;loop continuation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;常用命令与观察点&lt;/li&gt;

&lt;li&gt;CLI

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes setup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes gateway&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes cron&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Session Commands

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/toolsets&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/reload-mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/background&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Debug

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes doctor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/verbose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python -m pytest tests/ -q&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Hermes Agent 核心运行系统调用流程--源码分析</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Tue, 14 Apr 2026 12:44:22 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-he-xin-yun-xing-xi-tong-diao-yong-liu-cheng-yuan-ma-fen-xi-1ojp</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-he-xin-yun-xing-xi-tong-diao-yong-liu-cheng-yuan-ma-fen-xi-1ojp</guid>
      <description>&lt;h1&gt;
  
  
  Hermes Agent 核心运行系统调用流程
&lt;/h1&gt;

&lt;p&gt;本文基于当前仓库实现梳理 Hermes Agent 从入口层到结果交付的真实调用链，重点覆盖：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;核心运行系统 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Prompt Builder / Prompt Caching / Context Compression&lt;/li&gt;
&lt;li&gt;Provider / Runtime Resolution&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;Response Delivery（CLI / gateway / cron）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;不展开单个 tool 的内部业务逻辑，重点描述“谁调用谁、数据如何流动、哪些状态被缓存或持久化”。&lt;/p&gt;




&lt;h2&gt;
  
  
  1. 总体分层
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;入口层
  CLI: cli.py
  Gateway: gateway/run.py
  Cron: cron/scheduler.py
      ↓
运行时解析
  hermes_cli/runtime_provider.py
  hermes_cli/auth.py
      ↓
核心 Agent 初始化
  run_agent.py -&amp;gt; AIAgent.__init__()
      ↓
系统提示词装配
  AIAgent._build_system_prompt()
  agent/prompt_builder.py
      ↓
同步 agent loop
  AIAgent.run_conversation()
      ↓
模型响应二分
  无 tool_calls -&amp;gt; 最终响应
  有 tool_calls -&amp;gt; tool dispatch -&amp;gt; tool result 回填 -&amp;gt; 下一轮
      ↓
上下文管理
  agent/prompt_caching.py
  agent/context_compressor.py
      ↓
持久化
  hermes_state.py / gateway/session.py
      ↓
结果交付
  CLI Rich/TUI
  Gateway adapter.send(...)
  Cron output file + auto delivery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. 三个入口如何进入 AIAgent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 CLI 路径
&lt;/h3&gt;

&lt;p&gt;入口主要在 &lt;code&gt;cli.py&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;HermesCLI.chat()&lt;/code&gt; 先调用 &lt;code&gt;_ensure_runtime_credentials()&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_ensure_runtime_credentials()&lt;/code&gt; 通过 &lt;code&gt;resolve_runtime_provider()&lt;/code&gt; 解析 provider、api_mode、base_url、api_key。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_init_agent()&lt;/code&gt; 在首次使用或路由变化时创建 &lt;code&gt;AIAgent(...)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HermesCLI.chat()&lt;/code&gt; 调用 &lt;code&gt;self.agent.run_conversation(...)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;返回结果后，CLI 负责把 reasoning / response / TTS / streaming 内容显示到终端。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI 会在 provider、model、route、credential 变化时重建 agent，而不是复用旧 client。&lt;/li&gt;
&lt;li&gt;CLI 恢复会话时，会先从 &lt;code&gt;SessionDB&lt;/code&gt; 取历史消息，再交给 &lt;code&gt;AIAgent&lt;/code&gt; 继续运行。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cli.py:2169&lt;/code&gt; &lt;code&gt;_ensure_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:2269&lt;/code&gt; &lt;code&gt;_init_agent()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6309&lt;/code&gt; &lt;code&gt;HermesCLI.chat()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2 Gateway 路径
&lt;/h3&gt;

&lt;p&gt;入口主要在 &lt;code&gt;gateway/run.py&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;收到平台消息后，&lt;code&gt;SessionStore.get_or_create_session(source)&lt;/code&gt; 建立/获取会话。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build_session_context(...)&lt;/code&gt; 和 &lt;code&gt;build_session_context_prompt(...)&lt;/code&gt; 生成平台上下文。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session_store.load_transcript(session_id)&lt;/code&gt; 读取历史对话。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_run_agent(...)&lt;/code&gt; 内部解析 runtime、构造或复用 &lt;code&gt;AIAgent&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;agent.run_conversation(message, conversation_history=agent_history, ...)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将新消息写回 transcript / SQLite，并把最终结果返回给 adapter。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gateway 不把 session context 写进持久化的 system prompt，而是作为 &lt;code&gt;ephemeral_system_prompt&lt;/code&gt; 每轮临时注入，避免破坏 prompt cache 前缀。&lt;/li&gt;
&lt;li&gt;Gateway 会按 &lt;code&gt;session_key + agent config signature&lt;/code&gt; 缓存 &lt;code&gt;AIAgent&lt;/code&gt;，尽量复用同一个 agent 实例，保持 system prompt 和 tool schema 稳定。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:2308&lt;/code&gt; 获取/创建 session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:2342&lt;/code&gt; 构造 context prompt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:2435&lt;/code&gt; 加载 transcript&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:6647&lt;/code&gt; 创建/复用 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:6856&lt;/code&gt; 调用 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 Cron 路径
&lt;/h3&gt;

&lt;p&gt;入口主要在 &lt;code&gt;cron/scheduler.py&lt;/code&gt; 的 &lt;code&gt;run_job(job)&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;构造 cron 专用 prompt（包含 skill 展开、cron 执行提示）。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_runtime_provider()&lt;/code&gt; 解析运行时 provider。&lt;/li&gt;
&lt;li&gt;创建 &lt;code&gt;AIAgent(..., platform="cron", disabled_toolsets=["cronjob", "messaging", "clarify"], skip_memory=True)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在线程池里执行 &lt;code&gt;agent.run_conversation(prompt)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;生成 markdown output 文档并保存到 &lt;code&gt;~/.hermes/cron/output/...&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如配置了 &lt;code&gt;deliver&lt;/code&gt;，调用 &lt;code&gt;_deliver_result()&lt;/code&gt; 发送到目标平台。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cron 是 headless 执行，不允许 clarify。&lt;/li&gt;
&lt;li&gt;cron 同样接入 &lt;code&gt;SessionDB&lt;/code&gt;，因此历史可被 &lt;code&gt;session_search&lt;/code&gt; 检索。&lt;/li&gt;
&lt;li&gt;cron 有“无活动超时”机制，不是简单 wall-clock timeout。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:512&lt;/code&gt; &lt;code&gt;run_job()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:623&lt;/code&gt; runtime 解析&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:643&lt;/code&gt; 创建 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:678&lt;/code&gt; 调用 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:199&lt;/code&gt; &lt;code&gt;_deliver_result()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Provider / Runtime Resolution 调用链
&lt;/h2&gt;

&lt;p&gt;运行时解析由 &lt;code&gt;hermes_cli/runtime_provider.py&lt;/code&gt; 统一封装，CLI / gateway / cron 都走这里。&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 入口函数
&lt;/h3&gt;

&lt;p&gt;统一入口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resolve_runtime_provider(...)&lt;/code&gt; in &lt;code&gt;hermes_cli/runtime_provider.py:566&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它返回一个 runtime dict，典型字段包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api_mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;command&lt;/code&gt; / &lt;code&gt;args&lt;/code&gt;（外部进程型 provider）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;credential_pool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requested_provider&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2 解析步骤
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;resolve_runtime_provider()&lt;/code&gt; 的主流程：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;resolve_requested_provider()&lt;/code&gt; 先决定“用户想要哪个 provider”。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_resolve_named_custom_runtime()&lt;/code&gt; 先尝试命名 custom provider。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_provider()&lt;/code&gt; in &lt;code&gt;hermes_cli/auth.py&lt;/code&gt; 解析最终 provider 名称。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_resolve_explicit_runtime()&lt;/code&gt; 处理显式 api_key/base_url 覆盖。&lt;/li&gt;
&lt;li&gt;如有 credential pool，优先从 pool 取 runtime credential。&lt;/li&gt;
&lt;li&gt;按 provider 类型进入对应分支：

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nous&lt;/code&gt; -&amp;gt; &lt;code&gt;resolve_nous_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openai-codex&lt;/code&gt; -&amp;gt; &lt;code&gt;resolve_codex_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;copilot-acp&lt;/code&gt; -&amp;gt; &lt;code&gt;resolve_external_process_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic&lt;/code&gt; -&amp;gt; 走 Anthropic token 解析&lt;/li&gt;
&lt;li&gt;API-key provider -&amp;gt; &lt;code&gt;resolve_api_key_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;其他 -&amp;gt; &lt;code&gt;_resolve_openrouter_runtime()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.3 &lt;code&gt;auth.py&lt;/code&gt; 的职责
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;hermes_cli/auth.py&lt;/code&gt; 主要负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resolve_provider()&lt;/code&gt;：决定 provider 名称&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_codex_runtime_credentials()&lt;/code&gt;：读取/刷新 Codex token&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_nous_runtime_credentials()&lt;/code&gt;：刷新 Nous portal access token，并确保短期 inference key 可用&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_api_key_provider_credentials()&lt;/code&gt;：读取 API-key 类 provider 的密钥和 base_url&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_external_process_provider_credentials()&lt;/code&gt;：解析 &lt;code&gt;copilot-acp&lt;/code&gt; 这类本地子进程 provider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:790&lt;/code&gt; &lt;code&gt;resolve_provider()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:1174&lt;/code&gt; &lt;code&gt;resolve_codex_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:1683&lt;/code&gt; &lt;code&gt;resolve_nous_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:2084&lt;/code&gt; &lt;code&gt;resolve_api_key_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:2122&lt;/code&gt; &lt;code&gt;resolve_external_process_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.4 运行时解析的输出如何进入 AIAgent
&lt;/h3&gt;

&lt;p&gt;三个入口都会把 runtime dict 展开为 &lt;code&gt;AIAgent(...)&lt;/code&gt; 参数：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api_mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;command&lt;/code&gt; / &lt;code&gt;args&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;credential_pool&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;随后 &lt;code&gt;AIAgent.__init__()&lt;/code&gt; 决定使用哪类 client：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;anthropic_messages&lt;/code&gt; -&amp;gt; Anthropic native client&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;codex_responses&lt;/code&gt; -&amp;gt; Responses API / raw codex path&lt;/li&gt;
&lt;li&gt;其他 -&amp;gt; OpenAI-compatible client&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. AIAgent 初始化阶段
&lt;/h2&gt;

&lt;p&gt;核心类位于 &lt;code&gt;run_agent.py&lt;/code&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AIAgent&lt;/code&gt; 定义：&lt;code&gt;run_agent.py:470&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__init__()&lt;/code&gt;：&lt;code&gt;run_agent.py:487&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_conversation()&lt;/code&gt;：&lt;code&gt;run_agent.py:6801&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat()&lt;/code&gt;：&lt;code&gt;run_agent.py:9170&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.1 初始化时完成的事情
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent.__init__()&lt;/code&gt; 不是只做 client 构造，它会一次性初始化整套运行时状态：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;保存 model / provider / api_mode / iteration budget。&lt;/li&gt;
&lt;li&gt;基于 provider/base_url 判断实际 API 模式。&lt;/li&gt;
&lt;li&gt;创建底层 LLM client。&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;get_tool_definitions(...)&lt;/code&gt; 加载当前会话可用工具。&lt;/li&gt;
&lt;li&gt;初始化 &lt;code&gt;SessionDB&lt;/code&gt; 会话行（如果传入了 &lt;code&gt;session_db&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;初始化 todo store、memory store、memory provider plugin。&lt;/li&gt;
&lt;li&gt;初始化 context compressor。&lt;/li&gt;
&lt;li&gt;计算 prompt caching 开关。&lt;/li&gt;
&lt;li&gt;建立 &lt;code&gt;_cached_system_prompt&lt;/code&gt; 缓存槽。&lt;/li&gt;
&lt;li&gt;建立 session log 文件路径和 &lt;code&gt;_session_messages&lt;/code&gt; 缓冲区。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4.2 初始化时和本题流程直接相关的状态
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;self.tools&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;来自 &lt;code&gt;model_tools.get_tool_definitions()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self.valid_tool_names&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;当前会话真实可调用的工具名集合&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._cached_system_prompt&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;会话级稳定 system prompt 快照&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self.context_compressor&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;长会话压缩器&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._session_db&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;SQLite 会话存储&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._memory_store&lt;/code&gt; / &lt;code&gt;self._memory_manager&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;memory 注入和外部 memory provider&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._use_prompt_caching&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;是否启用 Anthropic/OpenRouter prompt cache 标记&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Prompt Builder：系统提示词如何被组装
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AIAgent._build_system_prompt()&lt;/code&gt; 是总装函数，位于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:2609&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;真正的提示词拼装细节在：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_builder.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.1 组装顺序
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_build_system_prompt()&lt;/code&gt; 的拼接顺序非常明确：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent identity&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;优先 &lt;code&gt;SOUL.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;否则 &lt;code&gt;DEFAULT_AGENT_IDENTITY&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tool-aware guidance&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;仅当对应 tool 存在时才注入 memory/session_search/skills guidance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nous subscription prompt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tool-use enforcement&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;按模型名和 config 决定是否注入&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调用方传入的 &lt;code&gt;system_message&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内建 memory / user profile&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部 memory provider prompt block&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skills system prompt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;project context files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冻结时间戳 / session id / model / provider&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;platform hint&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5.2 &lt;code&gt;prompt_builder.py&lt;/code&gt; 提供的核心能力
&lt;/h3&gt;

&lt;h4&gt;
  
  
  5.2.1 上下文文件发现与注入
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;build_context_files_prompt()&lt;/code&gt; 负责扫描并注入项目上下文文件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.hermes.md&lt;/code&gt; / &lt;code&gt;HERMES.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.cursorrules&lt;/code&gt; / &lt;code&gt;.cursor/rules/*.mdc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键特性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;有 prompt injection 扫描：&lt;code&gt;_scan_context_content()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;有截断：&lt;code&gt;_truncate_content()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;有优先级：只取一种 project context 类型&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:55&lt;/code&gt; &lt;code&gt;_scan_context_content()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:807&lt;/code&gt; &lt;code&gt;load_soul_md()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:920&lt;/code&gt; &lt;code&gt;build_context_files_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5.2.2 Skills 注入
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;build_skills_system_prompt()&lt;/code&gt; 会构建“可用技能索引”，供模型在系统提示词里看到。&lt;/p&gt;

&lt;p&gt;它有两层缓存：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;进程内 LRU cache&lt;/li&gt;
&lt;li&gt;磁盘 snapshot：&lt;code&gt;.skills_prompt_snapshot.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;这是“skills 索引构建缓存”，不是模型 provider 的 prefix cache。&lt;/li&gt;
&lt;li&gt;它的目标是减少每次扫描 &lt;code&gt;skills/&lt;/code&gt; 目录的成本。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:505&lt;/code&gt; &lt;code&gt;build_skills_system_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.3 会话级 system prompt 稳定策略
&lt;/h3&gt;

&lt;p&gt;Hermes 为了维持 prefix cache 命中，不会每轮都重建 system prompt。&lt;/p&gt;

&lt;p&gt;策略是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;首轮调用时构建并缓存到 &lt;code&gt;self._cached_system_prompt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;持续会话时，如果有 &lt;code&gt;SessionDB.system_prompt&lt;/code&gt;，优先复用库里的快照&lt;/li&gt;
&lt;li&gt;只有在 context compression 后才调用 &lt;code&gt;_invalidate_system_prompt()&lt;/code&gt; 并重建&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6953&lt;/code&gt; 首轮构建/复用 system prompt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:2929&lt;/code&gt; &lt;code&gt;_invalidate_system_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Prompt Caching：prefix cache 如何保持稳定
&lt;/h2&gt;

&lt;p&gt;这一层涉及三种“缓存”，需要区分：&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 会话级 system prompt 缓存
&lt;/h3&gt;

&lt;p&gt;由 &lt;code&gt;AIAgent._cached_system_prompt&lt;/code&gt; 管理。&lt;/p&gt;

&lt;p&gt;作用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;保证同一 session 内 system prompt 文本稳定&lt;/li&gt;
&lt;li&gt;避免 memory/context/skills 每轮重建后发生微小漂移&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 Skills prompt 构建缓存
&lt;/h3&gt;

&lt;p&gt;由 &lt;code&gt;agent/prompt_builder.py&lt;/code&gt; 内部管理。&lt;/p&gt;

&lt;p&gt;作用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;加速 skills 索引生成&lt;/li&gt;
&lt;li&gt;不直接参与 provider prefix cache&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.3 Provider 级 prompt cache
&lt;/h3&gt;

&lt;p&gt;真正的 provider prefix cache 逻辑在：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_caching.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;入口函数：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apply_anthropic_cache_control()&lt;/code&gt;：&lt;code&gt;agent/prompt_caching.py:41&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;策略：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最多放 4 个 &lt;code&gt;cache_control&lt;/code&gt; 断点&lt;/li&gt;
&lt;li&gt;system prompt 1 个&lt;/li&gt;
&lt;li&gt;最近 3 条非 system message 3 个&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在 &lt;code&gt;run_conversation()&lt;/code&gt; 里，API 消息构造完成后，如果当前 session 启用了 prompt caching，则调用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:7239-7244&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这就是当前仓库里“保持 prefix cache”的实际执行点。&lt;/p&gt;




&lt;h2&gt;
  
  
  7. &lt;code&gt;run_conversation()&lt;/code&gt; 的同步 agent loop
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AIAgent.run_conversation()&lt;/code&gt; 是核心同步循环，整体是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;准备消息
  ↓
拼 API payload
  ↓
调用模型
  ↓
有 tool_calls ?
  ├─ 否 -&amp;gt; 最终响应 -&amp;gt; 持久化 -&amp;gt; 返回
  └─ 是 -&amp;gt; 执行 tools -&amp;gt; tool result 写回 messages -&amp;gt; 下一轮
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.1 进入循环前的准备
&lt;/h3&gt;

&lt;p&gt;主要步骤：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;恢复 primary runtime（如果上轮触发了 fallback）。&lt;/li&gt;
&lt;li&gt;清洗用户输入中的 surrogate 字符。&lt;/li&gt;
&lt;li&gt;拷贝 &lt;code&gt;conversation_history&lt;/code&gt; 到本轮 &lt;code&gt;messages&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;去掉旧 budget warning。&lt;/li&gt;
&lt;li&gt;从历史中恢复 todo store。&lt;/li&gt;
&lt;li&gt;追加本轮 user message。&lt;/li&gt;
&lt;li&gt;复用或构建 &lt;code&gt;_cached_system_prompt&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;进行 preflight compression。&lt;/li&gt;
&lt;li&gt;从 memory provider / plugin hook 获取额外上下文。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:6833-6938&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:6953-6991&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:6994-7050&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:7064-7085&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.2 单轮 API 调用前，如何拼 payload
&lt;/h3&gt;

&lt;p&gt;每次循环会把内部 &lt;code&gt;messages&lt;/code&gt; 转成 &lt;code&gt;api_messages&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;对当前 user message 注入 external memory / plugin context&lt;/li&gt;
&lt;li&gt;assistant message 里的 &lt;code&gt;reasoning&lt;/code&gt; 映射成 provider 能理解的字段&lt;/li&gt;
&lt;li&gt;移除内部字段：&lt;code&gt;reasoning&lt;/code&gt;、&lt;code&gt;finish_reason&lt;/code&gt;、&lt;code&gt;_thinking_prefill&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;对 strict provider 清理 Codex 专用 tool fields&lt;/li&gt;
&lt;li&gt;前置 system prompt&lt;/li&gt;
&lt;li&gt;注入 &lt;code&gt;prefill_messages&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;应用 Anthropic/OpenRouter prompt cache 标记&lt;/li&gt;
&lt;li&gt;做 tool_call/tool_result 完整性修复&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;_build_api_kwargs()&lt;/code&gt; 产出 provider-specific kwargs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:7169-7250&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5256&lt;/code&gt; &lt;code&gt;_build_api_kwargs()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.3 &lt;code&gt;_build_api_kwargs()&lt;/code&gt; 如何分发到不同 API 形态
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_build_api_kwargs()&lt;/code&gt; 按 &lt;code&gt;self.api_mode&lt;/code&gt; 分三路：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;anthropic_messages&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;走 Anthropic adapter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;codex_responses&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;system prompt 变成 &lt;code&gt;instructions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;history 变成 Responses &lt;code&gt;input&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tools 转成 Responses schema&lt;/li&gt;
&lt;li&gt;带 &lt;code&gt;parallel_tool_calls=True&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat_completions&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;标准 OpenAI-compatible &lt;code&gt;messages + tools&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;对 GPT-5 / Codex 会把第一条 &lt;code&gt;system&lt;/code&gt; role 改写成 &lt;code&gt;developer&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:5256-5330&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:5367-5379&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.4 模型返回后，先做什么
&lt;/h3&gt;

&lt;p&gt;模型返回后会进入一系列规范化/防御逻辑：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;处理 incomplete / empty / reasoning-only 情况&lt;/li&gt;
&lt;li&gt;修正 hallucinated tool name&lt;/li&gt;
&lt;li&gt;校验 tool args JSON&lt;/li&gt;
&lt;li&gt;去重 tool calls&lt;/li&gt;
&lt;li&gt;限制同轮 &lt;code&gt;delegate_task&lt;/code&gt; 数量&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;然后才决定进入：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tool 分支&lt;/li&gt;
&lt;li&gt;final response 分支&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:8590-8775&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:8845-8977&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.5 &lt;code&gt;chat()&lt;/code&gt; 只是外层薄封装
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent.chat()&lt;/code&gt; 只是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;调 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;取出 &lt;code&gt;result["final_response"]&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:9170&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Tool Dispatch：schema 收集、availability gating、function call 分发
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 tool schema 收集
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;model_tools.py&lt;/code&gt; 在 import 时就会执行 &lt;code&gt;_discover_tools()&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;import &lt;code&gt;tools/*.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;每个 tool 模块通过 &lt;code&gt;registry.register(...)&lt;/code&gt; 自注册&lt;/li&gt;
&lt;li&gt;之后构建 &lt;code&gt;TOOL_TO_TOOLSET_MAP&lt;/code&gt; 和 &lt;code&gt;TOOLSET_REQUIREMENTS&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:132&lt;/code&gt; &lt;code&gt;_discover_tools()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:170&lt;/code&gt; 调用 &lt;code&gt;_discover_tools()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.2 &lt;code&gt;get_tool_definitions()&lt;/code&gt; 如何做 availability gating
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;get_tool_definitions(...)&lt;/code&gt; 负责给模型暴露“当前会话真实可见的 tools”。&lt;/p&gt;

&lt;p&gt;步骤：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;根据 &lt;code&gt;enabled_toolsets&lt;/code&gt; / &lt;code&gt;disabled_toolsets&lt;/code&gt; 解析 tool 名集合&lt;/li&gt;
&lt;li&gt;调 &lt;code&gt;registry.get_definitions(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;用每个 tool 的 &lt;code&gt;check_fn&lt;/code&gt; 做可用性过滤&lt;/li&gt;
&lt;li&gt;对 &lt;code&gt;execute_code&lt;/code&gt; 动态重建 schema，只列出当前 sandbox 中真实可用的 tools&lt;/li&gt;
&lt;li&gt;对 &lt;code&gt;browser_navigate&lt;/code&gt; 清理失效的 cross-tool 描述&lt;/li&gt;
&lt;li&gt;把最终可用 tool 名写入 &lt;code&gt;_last_resolved_tool_names&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:234&lt;/code&gt; &lt;code&gt;get_tool_definitions()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.3 模型发出 tool_calls 后的调用链
&lt;/h3&gt;

&lt;p&gt;在 &lt;code&gt;run_conversation()&lt;/code&gt; 中，如果 &lt;code&gt;assistant_message.tool_calls&lt;/code&gt; 非空：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;先校验 tool name 和 JSON 参数&lt;/li&gt;
&lt;li&gt;生成 assistant message 并附加到 &lt;code&gt;messages&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;调 &lt;code&gt;_execute_tool_calls(...)&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:8590-8775&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5948&lt;/code&gt; &lt;code&gt;_execute_tool_calls()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.4 并行与串行执行策略
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_execute_tool_calls()&lt;/code&gt; 会根据 &lt;code&gt;_should_parallelize_tool_batch()&lt;/code&gt; 决定走：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_execute_tool_calls_sequential()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_execute_tool_calls_concurrent()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;并行条件大致是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;多个 tool call&lt;/li&gt;
&lt;li&gt;不包含 &lt;code&gt;clarify&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;只包含并行安全工具&lt;/li&gt;
&lt;li&gt;或 path-scoped tool 且目标路径不冲突&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:262&lt;/code&gt; &lt;code&gt;_should_parallelize_tool_batch()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5948&lt;/code&gt; &lt;code&gt;_execute_tool_calls()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6045&lt;/code&gt; &lt;code&gt;_execute_tool_calls_concurrent()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6261&lt;/code&gt; &lt;code&gt;_execute_tool_calls_sequential()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.5 agent-level tool 与 registry-level tool 的分界
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent._invoke_tool()&lt;/code&gt; 先拦截 agent 级工具：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;todo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session_search&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clarify&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delegate_task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;memory provider tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其他工具才走：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;handle_function_call(...)&lt;/code&gt; in &lt;code&gt;model_tools.py&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5971&lt;/code&gt; &lt;code&gt;_invoke_tool()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:459&lt;/code&gt; &lt;code&gt;handle_function_call()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.6 &lt;code&gt;handle_function_call()&lt;/code&gt; 做什么
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;handle_function_call()&lt;/code&gt; 是 registry 的同步分发入口：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;coerce_tool_args()&lt;/code&gt; 按 JSON Schema 纠正参数类型&lt;/li&gt;
&lt;li&gt;对 read/search loop 做计数重置&lt;/li&gt;
&lt;li&gt;执行 plugin &lt;code&gt;pre_tool_call&lt;/code&gt; hook&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registry.dispatch(...)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;执行 plugin &lt;code&gt;post_tool_call&lt;/code&gt; hook&lt;/li&gt;
&lt;li&gt;返回 JSON string&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;todo&lt;/code&gt; / &lt;code&gt;memory&lt;/code&gt; / &lt;code&gt;session_search&lt;/code&gt; / &lt;code&gt;delegate_task&lt;/code&gt; 在这里会返回“必须由 agent loop 处理”的 stub，因为它们依赖 agent-level state。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:372&lt;/code&gt; &lt;code&gt;coerce_tool_args()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:459&lt;/code&gt; &lt;code&gt;handle_function_call()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Context Compression：长会话压缩如何接入主流程
&lt;/h2&gt;

&lt;p&gt;核心类：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:53&lt;/code&gt; &lt;code&gt;ContextCompressor&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.1 初始化
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent.__init__()&lt;/code&gt; 会创建 &lt;code&gt;self.context_compressor&lt;/code&gt;，传入：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model&lt;/li&gt;
&lt;li&gt;provider&lt;/li&gt;
&lt;li&gt;base_url&lt;/li&gt;
&lt;li&gt;api_key&lt;/li&gt;
&lt;li&gt;context_length override&lt;/li&gt;
&lt;li&gt;threshold / protect_last_n / summary_model 等 config&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:1186&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.2 压缩触发点
&lt;/h3&gt;

&lt;p&gt;当前实现里至少有三类触发：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preflight compression&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;本轮 API 还没发出，粗估请求已经超过阈值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;正常循环中的 post-tool compression&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;本轮 tool 执行后，根据真实 token 使用量判断&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;上下文错误恢复&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;provider 返回 payload too large / context length exceeded 等错误时，进入压缩重试路径&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;本题主链里最核心的是前两种。&lt;/p&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6994&lt;/code&gt; preflight compression&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:8827&lt;/code&gt; post-tool compression&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.3 &lt;code&gt;_compress_context()&lt;/code&gt; 的动作
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_compress_context()&lt;/code&gt; 不是只改 &lt;code&gt;messages&lt;/code&gt;，它还会处理 session 边界。&lt;/p&gt;

&lt;p&gt;主流程：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;flush_memories()&lt;/code&gt; 先给模型一次机会把值得保留的信息写入 memory&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;ContextCompressor.compress(messages, current_tokens=...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;追加 todo snapshot&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_invalidate_system_prompt()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重建 system prompt&lt;/li&gt;
&lt;li&gt;若启用 &lt;code&gt;SessionDB&lt;/code&gt;：

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;end_session(old_session_id, "compression")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;创建新 &lt;code&gt;session_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_session(parent_session_id=old_session_id)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;继承并自动编号 title&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_system_prompt(new_session_id, new_system_prompt)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;更新压缩后的 token 估算&lt;/li&gt;
&lt;li&gt;重置 file read dedup cache&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5853&lt;/code&gt; &lt;code&gt;_compress_context()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.4 &lt;code&gt;ContextCompressor.compress()&lt;/code&gt; 的内部算法
&lt;/h3&gt;

&lt;p&gt;真实算法不是“简单保留头尾 + 做摘要”，而是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;先裁剪老旧 tool result&lt;/li&gt;
&lt;li&gt;保护头部消息&lt;/li&gt;
&lt;li&gt;按 token budget 保护尾部消息&lt;/li&gt;
&lt;li&gt;对中间消息做结构化摘要&lt;/li&gt;
&lt;li&gt;修复 tool_call / tool_result 配对完整性&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;摘要模板包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Goal&lt;/li&gt;
&lt;li&gt;Constraints &amp;amp; Preferences&lt;/li&gt;
&lt;li&gt;Progress&lt;/li&gt;
&lt;li&gt;Key Decisions&lt;/li&gt;
&lt;li&gt;Relevant Files&lt;/li&gt;
&lt;li&gt;Next Steps&lt;/li&gt;
&lt;li&gt;Critical Context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:155&lt;/code&gt; &lt;code&gt;_prune_old_tool_results()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:253&lt;/code&gt; &lt;code&gt;_generate_summary()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:565&lt;/code&gt; &lt;code&gt;compress()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Session Storage：SQLite + FTS5 与 gateway session index 的分工
&lt;/h2&gt;

&lt;p&gt;这里有两套相关但不重复的状态层。&lt;/p&gt;

&lt;h3&gt;
  
  
  10.1 &lt;code&gt;SessionDB&lt;/code&gt;：结构化、可检索的长期存储
&lt;/h3&gt;

&lt;p&gt;实现位于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;核心设计：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;WAL mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sessions&lt;/code&gt; 表 + &lt;code&gt;messages&lt;/code&gt; 表&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages_fts&lt;/code&gt; FTS5 虚表&lt;/li&gt;
&lt;li&gt;支持 parent_session_id 链接 compression continuation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:41&lt;/code&gt; &lt;code&gt;sessions&lt;/code&gt; 表&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:71&lt;/code&gt; &lt;code&gt;messages&lt;/code&gt; 表&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:93&lt;/code&gt; FTS5 定义&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:115&lt;/code&gt; &lt;code&gt;SessionDB&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;主要接口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create_session()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;end_session()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_system_prompt()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;append_message()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_messages_as_conversation()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;search_messages()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.2 &lt;code&gt;AIAgent&lt;/code&gt; 如何写入 &lt;code&gt;SessionDB&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;每次 turn 结束时调用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_persist_session()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它会做两件事：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;_save_session_log()&lt;/code&gt; 写 JSON session snapshot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_flush_messages_to_session_db()&lt;/code&gt; 把未刷新的消息增量写入 SQLite&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;_flush_messages_to_session_db()&lt;/code&gt; 用 &lt;code&gt;_last_flushed_db_idx&lt;/code&gt; 避免重复写入。&lt;/p&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:1869&lt;/code&gt; &lt;code&gt;_persist_session()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:1882&lt;/code&gt; &lt;code&gt;_flush_messages_to_session_db()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.3 &lt;code&gt;SessionStore&lt;/code&gt;：gateway 的会话路由与 transcript 兼容层
&lt;/h3&gt;

&lt;p&gt;实现位于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gateway/session.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;根据 &lt;code&gt;SessionSource&lt;/code&gt; 生成 &lt;code&gt;session_key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;管理 session reset policy&lt;/li&gt;
&lt;li&gt;维护 &lt;code&gt;SessionEntry&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;管理 transcript（SQLite + JSONL）&lt;/li&gt;
&lt;li&gt;生成 gateway 用的 session context prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:202&lt;/code&gt; &lt;code&gt;build_session_context_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:692&lt;/code&gt; &lt;code&gt;get_or_create_session()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:942&lt;/code&gt; &lt;code&gt;append_to_transcript()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:970&lt;/code&gt; &lt;code&gt;rewrite_transcript()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:1002&lt;/code&gt; &lt;code&gt;load_transcript()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.4 &lt;code&gt;SessionDB&lt;/code&gt; 与 &lt;code&gt;SessionStore&lt;/code&gt; 的关系
&lt;/h3&gt;

&lt;p&gt;可以把两者理解成：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SessionDB&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;面向 agent / search / 压缩 continuation&lt;/li&gt;
&lt;li&gt;是结构化 SQLite 正式存储&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;SessionStore&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;面向 gateway 平台 session 生命周期&lt;/li&gt;
&lt;li&gt;维护 session_key 与当前 session_id 的映射&lt;/li&gt;
&lt;li&gt;同时保留 JSONL transcript 兼容层&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;也就是说：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AIAgent&lt;/code&gt; 直接写 &lt;code&gt;SessionDB&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway&lt;/code&gt; 通过 &lt;code&gt;SessionStore&lt;/code&gt; 管理“当前聊天应该落在哪个 session_id 上”&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Response Delivery：CLI、gateway、cron 三条出口
&lt;/h2&gt;

&lt;h3&gt;
  
  
  11.1 CLI display
&lt;/h3&gt;

&lt;p&gt;CLI 的交付不是简单 &lt;code&gt;print(final_response)&lt;/code&gt;，而是一套 callback + streaming UI：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;_init_agent()&lt;/code&gt; 给 &lt;code&gt;AIAgent&lt;/code&gt; 注入：

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tool_progress_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_start_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_complete_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream_delta_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;thinking_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reasoning_callback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HermesCLI.chat()&lt;/code&gt; 在线程中执行 &lt;code&gt;agent.run_conversation(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;运行过程中：

&lt;ul&gt;
&lt;li&gt;streaming token 通过 &lt;code&gt;_stream_delta(...)&lt;/code&gt; 渲染&lt;/li&gt;
&lt;li&gt;reasoning 可单独显示&lt;/li&gt;
&lt;li&gt;tool progress 可实时显示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;结束后：

&lt;ul&gt;
&lt;li&gt;若没走 streaming，则用 Rich &lt;code&gt;Panel(...)&lt;/code&gt; 包裹最终响应&lt;/li&gt;
&lt;li&gt;可选 TTS 播放&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cli.py:2340-2378&lt;/code&gt; 注入 callbacks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6481&lt;/code&gt; 调用 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6621-6644&lt;/code&gt; reasoning display&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6645-6678&lt;/code&gt; 最终 response panel&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11.2 Gateway delivery
&lt;/h3&gt;

&lt;p&gt;Gateway 的交付链分两段：&lt;/p&gt;

&lt;h4&gt;
  
  
  第一段：&lt;code&gt;_run_agent()&lt;/code&gt; 负责生成 agent 结果
&lt;/h4&gt;

&lt;p&gt;它会：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;构造/复用 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;绑定 &lt;code&gt;tool_progress_callback&lt;/code&gt; / &lt;code&gt;step_callback&lt;/code&gt; / &lt;code&gt;stream_delta_callback&lt;/code&gt; / &lt;code&gt;status_callback&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;调 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;处理 transcript 持久化&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;SessionStore.last_prompt_tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;返回最终 &lt;code&gt;response&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py:6647-6683&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py:6856&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py:2996-3078&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  第二段：平台 adapter 负责真正发送
&lt;/h4&gt;

&lt;p&gt;Gateway 外层收到 &lt;code&gt;_run_agent()&lt;/code&gt; 的返回值后，会：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在普通模式下调用 &lt;code&gt;adapter.send(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;在 streaming 模式下由 stream consumer 边生成边发送&lt;/li&gt;
&lt;li&gt;如响应里包含 &lt;code&gt;MEDIA:&lt;/code&gt; 或本地文件路径，调用 &lt;code&gt;_deliver_media_from_response(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;如需要自动语音回复，走 &lt;code&gt;_send_voice_reply(...)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:7273&lt;/code&gt; queued message 场景下的 &lt;code&gt;adapter.send(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:3080-3098&lt;/code&gt; already streamed 场景下的后处理&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:4287&lt;/code&gt; &lt;code&gt;_send_voice_reply()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:4345&lt;/code&gt; &lt;code&gt;_deliver_media_from_response()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11.3 Cron delivery
&lt;/h3&gt;

&lt;p&gt;cron 的结果交付分三步：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;run_job()&lt;/code&gt; 返回 &lt;code&gt;(success, output_doc, final_response, error)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;save_job_output()&lt;/code&gt; 先把 markdown 文档落盘&lt;/li&gt;
&lt;li&gt;如果需要对外发送，&lt;code&gt;_deliver_result(job, content, adapters, loop)&lt;/code&gt; 再做平台投递&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;_deliver_result()&lt;/code&gt; 细节：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;先 &lt;code&gt;_resolve_delivery_target(job)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;优先使用 gateway live adapter（支持 E2EE 等）&lt;/li&gt;
&lt;li&gt;失败时 fallback 到 standalone &lt;code&gt;_send_to_platform(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;先抽取 &lt;code&gt;MEDIA:&lt;/code&gt; 标签，附件作为原生文件发送&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:199&lt;/code&gt; &lt;code&gt;_deliver_result()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:856-873&lt;/code&gt; tick 内触发保存与投递&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. 一条完整调用链示例
&lt;/h2&gt;

&lt;p&gt;下面用“gateway 收到一条普通文本消息”举例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant User
    participant Adapter
    participant Gateway as gateway/run.py
    participant Store as gateway/session.py
    participant Runtime as runtime_provider.py
    participant Agent as run_agent.py:AIAgent
    participant Prompt as agent/prompt_builder.py
    participant Tools as model_tools.py
    participant DB as hermes_state.py

    User-&amp;gt;&amp;gt;Adapter: 发送消息
    Adapter-&amp;gt;&amp;gt;Gateway: MessageEvent
    Gateway-&amp;gt;&amp;gt;Store: get_or_create_session(source)
    Gateway-&amp;gt;&amp;gt;Store: load_transcript(session_id)
    Gateway-&amp;gt;&amp;gt;Runtime: resolve_runtime_provider()
    Gateway-&amp;gt;&amp;gt;Agent: AIAgent(...)
    Agent-&amp;gt;&amp;gt;Tools: get_tool_definitions(...)
    Agent-&amp;gt;&amp;gt;DB: create_session(...) / update_system_prompt(...)
    Gateway-&amp;gt;&amp;gt;Agent: run_conversation(message, history)
    Agent-&amp;gt;&amp;gt;Prompt: _build_system_prompt()
    Prompt--&amp;gt;&amp;gt;Agent: system prompt
    Agent-&amp;gt;&amp;gt;Agent: 同步 loop，调用模型
    alt 模型返回 tool_calls
        Agent-&amp;gt;&amp;gt;Tools: handle_function_call(...) / agent-level tool
        Tools--&amp;gt;&amp;gt;Agent: tool result JSON
        Agent-&amp;gt;&amp;gt;DB: append_message(...)
        Agent-&amp;gt;&amp;gt;Agent: 下一轮 API 调用
    else 模型返回最终文本
        Agent-&amp;gt;&amp;gt;DB: flush messages / token counts
    end
    Agent--&amp;gt;&amp;gt;Gateway: {final_response, messages, tokens...}
    Gateway-&amp;gt;&amp;gt;Store: append_to_transcript(...) / update_session(...)
    Gateway-&amp;gt;&amp;gt;Adapter: send(response)
    Adapter--&amp;gt;&amp;gt;User: 最终消息
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. 本系统里最重要的几个“稳定性约束”
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13.1 system prompt 必须尽量稳定
&lt;/h3&gt;

&lt;p&gt;这直接关系到：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic/OpenRouter prefix cache&lt;/li&gt;
&lt;li&gt;多轮会话成本&lt;/li&gt;
&lt;li&gt;gateway 复用 cached agent 的收益&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;因此：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gateway 的动态上下文放到 &lt;code&gt;ephemeral_system_prompt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;plugin context 放到 user message&lt;/li&gt;
&lt;li&gt;只有 compression 后才主动重建 system prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  13.2 tool_call / tool_result 配对必须完整
&lt;/h3&gt;

&lt;p&gt;Hermes 在两个地方都做了防御：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API 调用前 &lt;code&gt;_sanitize_api_messages()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;compression 后 &lt;code&gt;ContextCompressor._sanitize_tool_pairs()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;否则 Anthropic / OpenAI / strict provider 都可能拒绝请求。&lt;/p&gt;

&lt;h3&gt;
  
  
  13.3 session persistence 不是“最后一次统一保存”，而是多层增量保存
&lt;/h3&gt;

&lt;p&gt;当前实现同时维护：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON session snapshot&lt;/li&gt;
&lt;li&gt;SQLite messages/session rows&lt;/li&gt;
&lt;li&gt;gateway transcript JSONL 兼容层&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;目标是：即使中途中断、压缩、provider 异常，也尽量不丢会话。&lt;/p&gt;




&lt;h2&gt;
  
  
  14. 一句话总结
&lt;/h2&gt;

&lt;p&gt;Hermes 的核心运行系统可以概括为：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;入口层先通过 &lt;code&gt;runtime_provider + auth&lt;/code&gt; 解析可执行 runtime，再由 &lt;code&gt;AIAgent&lt;/code&gt; 初始化稳定的 tool surface、system prompt 和 context compressor；随后 &lt;code&gt;run_conversation()&lt;/code&gt; 以同步 loop 反复执行“模型调用 -&amp;gt; tool dispatch -&amp;gt; tool result 回填”，并在整个过程中用 &lt;code&gt;SessionDB/SessionStore&lt;/code&gt; 持久化状态，最后由 CLI、gateway 或 cron 各自的 display/delivery 层把结果送到用户。&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Hermes Agent 06. 技能、记忆与上下文文件</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:30:46 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-06-ji-neng-ji-yi-yu-shang-xia-wen-wen-jian-38fd</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-06-ji-neng-ji-yi-yu-shang-xia-wen-wen-jian-38fd</guid>
      <description>&lt;h1&gt;
  
  
  06. 技能、记忆与上下文文件
&lt;/h1&gt;

&lt;p&gt;如果说工具决定 Hermes “能不能做”，那么技能、记忆和上下文文件决定它“会不会持续做对”。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章目标
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;理解 skill、memory、context file 的边界&lt;/li&gt;
&lt;li&gt;学会查找、安装和使用 skill&lt;/li&gt;
&lt;li&gt;学会用 &lt;code&gt;AGENTS.md&lt;/code&gt; 和 &lt;code&gt;SOUL.md&lt;/code&gt; 提升稳定性&lt;/li&gt;
&lt;li&gt;理解 prompt caching 与上下文注入的约束&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  适用读者
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;想长期高效使用 Hermes 的所有用户&lt;/li&gt;
&lt;li&gt;想把重复流程沉淀下来的进阶用户&lt;/li&gt;
&lt;li&gt;开发者&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前置条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;已理解 CLI 和工具系统&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Skill 是“怎么做”
&lt;/h3&gt;

&lt;p&gt;Skill 是按需加载的流程知识。它更像一份可执行的说明书，而不是一条记忆条目。&lt;/p&gt;

&lt;p&gt;适合做成 skill 的内容：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;固定工作流&lt;/li&gt;
&lt;li&gt;多步骤操作规范&lt;/li&gt;
&lt;li&gt;领域知识流程&lt;/li&gt;
&lt;li&gt;常见排错套路&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Memory 是“是什么”
&lt;/h3&gt;

&lt;p&gt;Memory 适合保存事实信息，例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你的偏好&lt;/li&gt;
&lt;li&gt;环境事实&lt;/li&gt;
&lt;li&gt;常用项目位置&lt;/li&gt;
&lt;li&gt;团队约定&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;经验法则很简单：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;可复用流程放 skill&lt;/li&gt;
&lt;li&gt;长期事实放 memory&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Context File 是“默认注入的背景”
&lt;/h3&gt;

&lt;p&gt;Hermes 会自动读取某些上下文文件，例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.cursor/*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些文件会直接影响每次会话的系统上下文，所以质量和长度都很重要。&lt;/p&gt;

&lt;h2&gt;
  
  
  操作步骤
&lt;/h2&gt;

&lt;h3&gt;
  
  
  查看和使用 skill
&lt;/h3&gt;

&lt;p&gt;最常用的方式：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skills
/skills search docker
/skills browse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;技能安装后通常会直接变成 slash command，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plan 设计一个 REST API
/ascii-art Make a banner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI 外也可以：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes skills list
hermes skills &lt;span class="nb"&gt;install &lt;/span&gt;official/research/arxiv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  自己创建 skill
&lt;/h3&gt;

&lt;p&gt;用户自定义 skill 放在：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.hermes/skills/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;典型结构：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.hermes/skills/my-category/my-skill/
└── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果 skill 还需要参考文件、模板或脚本，也可以加 &lt;code&gt;references/&lt;/code&gt;、&lt;code&gt;templates/&lt;/code&gt;、&lt;code&gt;scripts/&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  使用 memory
&lt;/h3&gt;

&lt;p&gt;Memory 用于跨会话保存信息。你可以直接要求 Hermes 记住某个事实，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;记住：我们的 CI 用 GitHub Actions，主工作流文件是 deploy.yml。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  写好 &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;对于代码项目，&lt;code&gt;AGENTS.md&lt;/code&gt; 非常重要。它适合写：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;架构约定&lt;/li&gt;
&lt;li&gt;测试方式&lt;/li&gt;
&lt;li&gt;代码规范&lt;/li&gt;
&lt;li&gt;禁止事项&lt;/li&gt;
&lt;li&gt;特定目录行为&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它不是 README 的替代，而是“给 agent 的项目说明书”。&lt;/p&gt;

&lt;h3&gt;
  
  
  区分 &lt;code&gt;SOUL.md&lt;/code&gt; 和 &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SOUL.md&lt;/code&gt;：定义 Hermes 的长期人格和表达倾向&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt;：定义当前项目或工作区的约束&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一个偏“说话风格”，一个偏“做事规则”。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  场景 1：重复做同一种工作流
&lt;/h3&gt;

&lt;p&gt;如果某个任务总要 5 步以上，而且你会重复做，优先考虑做成 skill，而不是每次重写 prompt。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 2：希望 Hermes 一直遵守项目约定
&lt;/h3&gt;

&lt;p&gt;优先写 &lt;code&gt;AGENTS.md&lt;/code&gt;，而不是每次聊天都重新说一遍。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 3：希望 Hermes 长期记住偏好
&lt;/h3&gt;

&lt;p&gt;例如“回答尽量简洁”“默认用 pytest”“某仓库路径固定在某位置”，这些更适合进 memory。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题与排错
&lt;/h2&gt;

&lt;h3&gt;
  
  
  为什么安装了 skill，当前会话却没看到
&lt;/h3&gt;

&lt;p&gt;有些 skill 需要新会话才能稳定进入 prompt。必要时重开会话或 &lt;code&gt;/reset&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么不建议把 &lt;code&gt;AGENTS.md&lt;/code&gt; 写得特别长
&lt;/h3&gt;

&lt;p&gt;因为它会被反复注入上下文，太长会拖慢会话、增加 token 消耗，并降低重点信息密度。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么 memory 改了但当前会话感觉没变
&lt;/h3&gt;

&lt;p&gt;memory 是跨会话生效的长期上下文。很多情况下写入后要到下一个会话，系统提示里才会以稳定方式体现出来。&lt;/p&gt;

&lt;h3&gt;
  
  
  什么是 prompt cache 不该被打破
&lt;/h3&gt;

&lt;p&gt;Hermes 很依赖稳定的系统提示前缀来命中缓存。频繁改系统提示、技能载入方式、上下文文件或模型，会降低缓存命中率，提高成本和延迟。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章总结
&lt;/h2&gt;

&lt;p&gt;工具解决“做事”，skill、memory 和 context file 解决“长期稳定地做对”。高质量的长期使用，离不开这三者的正确分工。&lt;/p&gt;

&lt;h2&gt;
  
  
  下一步建议
&lt;/h2&gt;

&lt;p&gt;继续看 &lt;a href="//./07-mcp-and-extensions.md"&gt;MCP 与扩展能力&lt;/a&gt;，学习如何把 Hermes 接到外部系统。&lt;/p&gt;

</description>
      <category>hermesagent</category>
    </item>
  </channel>
</rss>
