面向个人量化研究者与半自动交易的散户的量化交易智能体:把「我想验证一个策略」收敛成 口径清楚、可复现、经独立风控复核的一条链路 —— 取数入库 → 行业研判 → 因子筛选 → 回测 → 信号复核 → 风控限额 → 受限下单。要动真金白银之前,先过独立风控复核与本地下单闸门。
这是一个跑在 DeerFlow(字节跳动开源、基于 LangGraph 的 Agent 框架)之上的行业 Agent 资产包, 也可以不依赖 DeerFlow,用仓库自带的
cli/quantctl.py直接运行。 本仓库不包含、也不是 DeerFlow 框架本体,而是一套可一键挂载到已有 DeerFlow 实例上的「人设 + 技能 + 领域库 + 子智能体」原创配置与内容。运行时、模型调用、工具与 Web UI 均由 DeerFlow 提供。
| 能力 | 说明 |
|---|---|
| 🗄️ 数据运维 | 查本地覆盖度 → 只补缺口 → 落 quant-db;代码统一 code.exchange、复权口径显式声明、退市标的不丢、基本面必带公告日 |
| 🔍 市场研究 | 行业/标的/ETF 的基本面与量价研判,结论先行、证据可追溯、带反方证据与不确定性;不产出下单指令 |
| 🧮 因子筛选 | 给定 universe 与因子做横截面打分排名、产出候选池,落 factor_values(必要时落 signals);不评历史收益 |
| 📈 策略回测 | 含成本模型、数据快照日与复现哈希,强制做「信号后移 1 日」对照与样本外验证;结论必须经 risk-reviewer 复核 |
| 📋 信号复核 | 读 signals、核可成交性(停牌/涨跌停/一字板/T+1/最小单位)、对照限额编排调仓执行清单;不含下单 |
| 🛡️ 风控限额 | 维护 strategies.risk_limits_json,给单标的/行业集中度与流动性约束;不给放宽风控或加杠杆的捷径 |
| 🔐 受限下单 | 唯一持有 trade-gateway_* 工具的技能;强制「看模式 → 验凭证 → 拿确认码 → 用户贴回 → 下单」五步,四道代码闸门 |
主助手(lead agent)与一个只读、不可再委托的 risk-reviewer 子智能体协作。它不是装饰性的
「二次确认」,而是下单凭证的唯一来源:
用户提问 / 回测交付 / 调仓计划
│
▼
quant-agent(主助手:7 技能 + 3 MCP,temperature=0.2)
│ 回测跑完要交付,或执行清单要进入下单
│ 通过 task 工具委托(白名单:仅 risk-reviewer)
▼
risk-reviewer(资深量化风控,只读复算)
│ 工具:read_file + quant-db_list_tables / describe_table / read_query
│ disallowed_tools: task / write_file / quant-db_write_query
│ 11 个维度逐条核对;只审风控,不改写策略逻辑
▼
三档结论:通过 / 补充措施后可执行 / 不建议执行
│
▼
主助手用 quant-db_write_query 落 risk_reviews
(review_id + verdict + findings_json + lag_shift_test)
│
▼
trade-gateway_prepare_order 去查这张表
│ 可执行档 → 生成 6 位确认码
│ 否则 → 直接拒绝,不生成确认码
复核覆盖的 11 个维度:前视偏差、幸存者偏差、过拟合、样本内外、绩效、集中度、流动性、 可成交性、交易成本、杠杆与资金、红线。
复核结论是硬凭证而非装饰。 它会真的写进 risk_reviews 表,而 trade-gateway_prepare_order
会真的去查这张表 —— 少了 risk_review_id、记录不存在、结论不是可执行档、或凭证指向的标的
与本次下单不一致,都不会生成确认码。子智能体本身没有任何写库工具,所以「自己给自己发一张
通过凭证」这条路在代码层就被堵死了。
| # | 闸门 | 落点 | 具体约束 |
|---|---|---|---|
| 1 | 默认关闭 | extensions_config.json + 环境变量 |
MCP 条目 enabled:false;只有 install.ps1 -EnableTrading 才写 true;QUANT_TRADE_DRY_RUN 默认 1 —— 即便打开也只写本地 orders 表、不报券商 |
| 2 | 风控凭证硬闸门 | gates.check_risk_review |
prepare_order 必须带 risk_review_id,且记录真实存在、verdict 落在可执行档(通过 / 补充措施后可执行),不建议执行 一律拒绝;给定 signal_id 时还要求凭证目标一致(防「拿 A 的复核下 B 的单」) |
| 3 | 6 位人工确认码 | gates.create_intent / consume_intent |
prepare_order 返回 intent_id + 6 位数字 confirm_token,TTL 120 秒、单次消费,完整生命周期落 order_intents;确认码必须由用户从对话里贴回,模型不得编造、不得循环重试 |
| 4 | 下单前重校验 | gates.consume_intent + check_limits |
place_order 重查 token 时效与消费状态、风控凭证、单笔金额上限、最小交易单位整数倍、涨跌停越界、停牌/退市;dry_run=1 时只写 orders 且 xt_order_id 必须为空 |
闸门落在 MCP 代码层,而不是提示词层。 提示词里写「必须先复核」「不许自己下单」是可以被
模型绕过的 —— 换一种说法、多轮诱导、跳过某个技能,都可能让软约束失效。所以真正拦人的是
prepare_order / place_order 里的 Python 分支与 GateReject 异常码,他们不认识「模型觉得
可以」,只认 risk_reviews 里的记录和 order_intents 里的状态位。
通过 uvx --with mcp==1.2.1 mcp-server-sqlite 挂载一个本地 SQLite 库,工具以
quant-db_ 为前缀暴露。主链路:
instruments ─┬─► bars_daily ─┐
├─► fundamentals ┼─► factor_values ─► strategies
└─► trading_calendar │
├─► backtests ─► equity_curve
│ │
│ ▼
└─► signals
│
risk_reviews ◄──── 复核结论落库 ──┤
▼
order_intents(确认码)
│
orders ─► trades
│
positions_daily(日终快照)
| 表名 | 关键字段 | 设计要点 |
|---|---|---|
instruments |
symbol PK, exchange, asset_type, board, industry_sw1, list_date, delist_date, lot_size, is_st, index_code, status |
保留 delist_date 非空的退市标的 —— 治幸存者偏差;board 决定涨跌幅(main ±10%、chinext/star ±20%、bse ±30%、etf ±10%);lot_size 科创板为 200 |
trading_calendar |
cal_date PK, is_open, prev_open, note |
prev_open 是 T+1 成交与「信号后移对照」的基础 |
bars_daily |
symbol+trade_date PK, OHLC, pre_close, volume, amount, turnover_rate, adj_factor, adjust_mode, source |
价格带累计复权因子;volume/amount 恒为未复权原始口径;source 记录 akshare / baostock / manual |
fundamentals |
symbol+report_period PK, pub_date, pe_ttm, pb, roe, revenue_yoy, profit_yoy, mkt_cap |
pub_date 是防前视的锚点:as-of 查询只允许看到 pub_date <= as_of 的财报,无公告日的记录直接丢弃 |
factor_definitions |
factor_name PK, formula, direction, params_json, lookback_days, category |
公式与方向落库,禁止凭记忆编造因子 |
factor_values |
factor_name+symbol+trade_date PK, raw_value, z_score, pct_rank |
横截面标准化只在同一 trade_date 内进行 |
strategies |
strategy_id PK, universe_json, params_json, risk_limits_json, rebalance_rule |
参数与风控限额同库同源 |
backtests |
run_id PK, cost_model_json, param_grid_size, data_snapshot_date, repro_hash, lag_shift_checked |
可复现:数据快照日 + 代码/参数/快照哈希;未做后移对照降档,成本缺失直接不通过 |
equity_curve |
run_id+trade_date PK, nav, bench_nav, drawdown |
净值与基准同表对齐,回撤逐日留痕 |
signals |
signal_id PK, trade_date, symbol, side, score, target_weight, status, risk_review_id |
trade_date 是信号生成日,成交必须在下一交易日;status 走 new → reviewed → approved |
risk_reviews |
review_id PK, target_type, target_id, verdict, findings_json, lag_shift_test |
下单硬闸门的唯一凭证来源 |
order_intents |
intent_id PK, expires_at, consumed_at, status, confirm_token, risk_review_id |
确认码的完整生命周期:TTL / 单次消费 / 拒绝原因 |
orders |
order_id PK, intent_id, status, is_dry_run, xt_order_id, fee, tax, transfer_fee |
dry_run 单必须 status='dry_run' 且 xt_order_id 为空 |
trades |
trade_id PK, order_id, price, qty, fee, tax, trade_time |
成交明细,xt_trade_id 对得上券商回报 |
positions_daily |
account_id+trade_date+symbol PK, qty, avail_qty, avg_cost, market_value, weight |
日终快照;avail_qty 体现 T+1 可卖约束 |
单位约定:金额=人民币元;数量=股/份;比率类字段一律小数(0.12 表示 12%);日期 YYYY-MM-DD;
时间戳为 Unix 秒。
口径错了,后面所有因子、回测与复核都是错的 —— 这是量化里最贵的一类 bug。
- 价格复权:
get_daily_bars的adjust取none/qfq/hfq,默认qfq。库里adj_factor统一存累计复权因子(后复权口径),qfq = price × adj_factor / latest_factor。 - 量恒未复权:
volume/amount永远是原始未复权口径,任何情况下都不要对成交量做复权 换算;同一组计算里的价格必须声明口径(none/qfq/hfq),不可中途换口径。 - 基本面必带
as_of_date:工具只返回pub_date <= as_of_date的记录;无处公告日的记录丢弃 并计入 warnings。回测调仓取数不带as_of_date即为前视。 - 信号 T+1 成交:
signals.trade_date是信号生成日,成交必须在下一交易日;回测不允许用 当日收盘价成交。 - 最小交易单位:A股 / ETF 100 股(份);科创板
688开头 200 股(以instruments.lot_size为准)。 - 成本模型:佣金万 2.5(最低 5 元)、卖出印花税 0.05%、过户费 0.001%、滑点;
backtests.cost_model_json与gates.estimate_costs必须同口径。 - 指数成分:免费源多只提供当前成分股,
get_index_members会如实返回point_in_time=false, 历史回测据此判定引入成分股前视。 - 不可判定即不可交易:
get_limit_status取不到前收、或tradable=false,一律按不可成交处理。
quant-agent/
├─ README.md # 中文主文档
├─ README_EN.md # 英文完整版
├─ LICENSE # MIT + 投资风险附加声明
├─ .gitignore # 排除 *.db / venv / 本机配置
├─ persona/SOUL.md # 人设:角色、口径纪律、复核委托规则、免责
├─ config/agent.config.yaml # Agent 配置(7 技能 / 3 MCP / 子代理白名单 / temperature=0.2)
├─ skills/ # 7 个领域技能(SKILL.md + 可填写模板)
│ ├─ data-ops/ # 取数入库(templates/dataset_template.md)
│ ├─ market-research/ # 行业与标的研判(templates/research_template.md)
│ ├─ factor-screening/ # 因子打分与候选池(templates/screening_template.md)
│ ├─ strategy-backtest/ # 回测与绩效评估(templates/backtest_template.md)
│ ├─ signal-review/ # 信号复核与执行清单(templates/execution_template.md)
│ ├─ live-trading/ # 受限下单(templates/order_template.md)
│ └─ risk-limits/ # 风控参数与限额(templates/risk_limits_template.md)
├─ mcp-servers/ # 2 个自建 MCP server(Python / stdio)
│ ├─ quant-data/ # server.py + normalize.py(口径与错误信封)
│ └─ trade-gateway/ # server.py + gates.py(四道闸的纯函数实现)
├─ integrations/
│ ├─ quant-data/mcp.example.json # 取数 MCP 配置片段(含 UTF-8 关键设置)
│ ├─ quant-db/
│ │ ├─ schema.sql # 15 张表 DDL + 常用检索 SQL
│ │ ├─ seed.sql # 演示种子(不含任何行情/财务数值)
│ │ └─ mcp.example.json # 状态库 MCP 配置片段
│ └─ trade-gateway/mcp.example.json # 交易 MCP 片段(enabled:false + PYTHONPATH 注入 xtquant)
├─ subagents/risk-reviewer.yaml # 风控复核子智能体(4 空格缩进片段 + 幂等标记块)
├─ cli/ # 独立运行入口(不依赖 DeerFlow)
│ ├─ quantctl.py # MCP 桥 + 工具循环 + 技能收窄 + 复核委托
│ ├─ config.example.json # 配置模板(本机路径请用 config.local.json)
│ └─ requirements.txt # mcp / httpx
├─ scripts/
│ ├─ install.ps1 # Windows 一键安装器(9 步,幂等)
│ └─ check_consistency.py # 一致性校验(离线,8 类检查)
├─ tests/ # pytest(离线,不联网、不需要 QMT)
│ ├─ conftest.py # 用真实 schema.sql 建库,按文件路径加载被测模块
│ ├─ test_order_gate.py # 四道闸的拒绝路径
│ ├─ test_data_ops.py # 代码/板块/涨跌停/复权/错误信封
│ ├─ test_risk_reviewer_fixtures.py # 复核提示词覆盖度 + 3 错 1 对判定回归
│ └─ fixtures/risk_reviewer/ # clean / future_function / missing_cost_model / no_out_of_sample
├─ examples/ # 3 个可复现操作样例(runbook,非伪造对话)
│ ├─ 01-data-ops-runbook.md
│ ├─ 02-backtest-with-risk-review.md
│ └─ 03-dry-run-order-two-step.md
└─ docs/architecture.md # 架构、闸门设计、挂载点与踩坑记录
- 一个可运行的 DeerFlow 实例(本仓库在 DeerFlow 主分支 后端 + Web 网关上验证)
- Python 3.12、uv/uvx(用于拉起 MCP server 与建独立 venv)
- 一个 LLM API Key(DeerFlow 支持的模型均可;不需要联网搜索专用 Key,默认走免 Key 的 DuckDuckGo)
- 实盘可选:QMT / MiniQMT 客户端(xtquant 随客户端分发,不在 PyPI),以及券商开通的量化 交易权限
- Windows / macOS / Linux 均可;安装脚本与排障说明主要面向 Windows + 中文系统
以普通 PowerShell 运行(脚本默认对接 d:\...\deepflow\deer-flow,可用 -DeerFlowRoot 覆盖):
.\scripts\install.ps1
# 或指定实例与用户:
.\scripts\install.ps1 -DeerFlowRoot "D:\path\to\deer-flow" -UserId "<your-user-id>"
# 启用实盘网关(仍然默认 dry_run,不报券商):
.\scripts\install.ps1 -EnableTrading -QmtPath "C:\国金QMT" -QmtAccount "你的资金账号"
# 卸载(保留 quant.db 与 venv):
.\scripts\install.ps1 -Uninstall安装器幂等地完成 9 步:
- 复制 Agent(
SOUL.md+config.yaml)与 7 个技能到用户空间agents/quant-agent/与skills/custom/; - 把
mcp-servers/*复制到<deer-flow>\backend\.deer-flow\mcp\quant-agent\(此后仓库可移动,安装不再依赖仓库路径); - 为
quant-data建独立 venv 并安装akshare/baostock/mcp>=1.28,<2(与 machine-db 锁定的mcp==1.2.1环境隔离;此步联网且最慢,失败不阻塞后续); - 合并
quant-data/quant-db/trade-gateway三个 MCP 与 7 个 skill 开关到extensions_config.json(写入本机绝对路径,trade-gateway默认enabled:false); - 创建
quant.db(15 张表),仅在instruments为空时灌入演示种子; - 以
# BEGIN/END quant-agent managed block幂等注入risk-reviewer,插到既有custom_agents:之下,不新增第二个顶层subagents:键; - 环境自检(
uv.exe/uvx.exe/ QMT 路径 / 8001 端口占用); - 把
web_search由 tavily(需 Key)切换为 DuckDuckGo(-UseDuckDuckGo:$false可保留原后端); - 收尾提示:重启 Gateway、先跑一次 data-ops 取数、校验子代理键、卸载方式。
可用参数:-DeerFlowRoot、-UserId、-EnableTrading、-QmtPath、-QmtAccount、-UseDuckDuckGo、
-SkipSubagent(仅调试用)、-Uninstall。
随后重启 Gateway(配置不热加载),在新会话中选择「量化交易助手」。安装前会备份被改动的
config.yaml 与 extensions_config.json(同目录 *.bak_<时间戳>)。
- 把
persona/SOUL.md与config/agent.config.yaml放到用户空间agents/quant-agent/(配置文件重命名为config.yaml); - 把
skills/*整目录复制到用户空间skills/custom/; - 把
mcp-servers/复制到<deer-flow>\backend\.deer-flow\mcp\quant-agent\; - 按三个
integrations/*/mcp.example.json注释,把mcpServers与skills两段合并进deer-flow/extensions_config.json,并把command、QUANT_DB_PATH、PYTHONPATH换成你本机的 绝对路径; sqlite3 <db> < integrations/quant-db/schema.sql,空库时再灌seed.sql;- 把
subagents/risk-reviewer.yaml两个标记之间的 4 空格缩进片段插到config.yaml既有subagents.custom_agents:之下。
细节与挂载点见 docs/architecture.md。
DeerFlow 提供编排、UI 与登录,但不是运行前提。三个 MCP server 本身就是 stdio 独立进程,
cli/quantctl.py 把它们直接挂起来跑同一套资产:
# 1. 准备依赖(mcp + httpx;也可直接用 quant-data 的 venv)
pip install -r cli/requirements.txt
# 2. 复制配置并改成你本机的绝对路径
copy cli\config.example.json cli\config.local.json
# 3. 自检:MCP 连接数 / 技能与子代理加载 / 模型连通性
python cli\quantctl.py --config cli\config.local.json doctor
# 4. 一次性执行 / 交互式会话
python cli\quantctl.py --config cli\config.local.json run "查一下本地 510300 的日线覆盖到哪一天"
python cli\quantctl.py --config cli\config.local.json chat它复用了同一批资产,行为与 DeerFlow 内一致:
| 环节 | quantctl 的做法 |
|---|---|
| 人设 | persona/SOUL.md 作为系统提示词 |
| 技能 | 系统提示词只放 name + description;模型调 describe_skill 时才读入全文,并按技能 allowed-tools 收窄工具集 |
| 取数 / 状态库 / 下单 | 三个 MCP 经 stdio 挂载,工具名带 server 前缀(quant-data_*、quant-db_*、trade-gateway_*) |
| 风控复核 | task 工具只接受 risk-reviewer,子代理提示词取自 subagents/risk-reviewer.yaml,工具白名单只有 read_file + quant-db 的三个只读工具 |
| 四道闸 | 完全在 MCP 代码层,quantctl 不绕过、也不重复实现 |
cli/config.local.json 已被 .gitignore 覆盖(含本机路径),不要提交。模型默认
deepseek-v4-pro,API key 从 DEEPSEEK_API_KEY 读取;换成任何 OpenAI 兼容端点只需改
base_url 与 model。
两条命令,都离线可跑,不需要联网、不需要 QMT、不需要模型:
python scripts/check_consistency.py # 跨文件一致性(8 类检查)
python -m pytest tests -q # 单元与回归测试check_consistency.py 校验的 8 类:① 配置里引用的技能 / MCP / 子代理都有对应文件;
② 每个 SKILL.md 的 allowed-tools 逐项在已声明工具清单内;③ 除 live-trading 外任何技能
都不得含 trade-gateway_ 前缀工具;④ schema.sql 建出的表覆盖技能与 MCP 里 SQL 引用的表名;
⑤ install.ps1 引用的仓库路径真实存在、开关与默认值正确;⑥ trade-gateway 在示例与安装器里
都默认关闭;⑦ risk-reviewer.yaml 是缩进片段、工具在清单内、禁写禁再委托;⑧ schema.sql 恰好
15 张表、交付物齐全。
tests/ 的 88 个用例覆盖三类:
- 下单闸门(
test_order_gate.py):确认码 TTL 过期、重复消费、缺risk_review_id、verdict非可执行档、dry_run不报单这五种拒绝路径,外加猜错确认码不消耗、过期 pending 意图清理、单笔限额 / 整手 / 停牌 / 涨跌停越界、仓位上限与费用模型口径。 - 口径归一化(
test_data_ops.py):代码归一化(含000001沪深同号)、板块推断、涨跌幅 限制、涨跌停价四舍五入、复权换算、上游中英文行归一化、结构化错误信封与拒绝码稳定性。 - 风控复核(
test_risk_reviewer_fixtures.py):断言提示词写全 11 个维度与三档结论、必须 含「信号后移 1 个交易日」与「cost_model_json缺失直接不通过」,并用 4 个 fixture (3 错 1 对)验证硬判据不会把已知错误样例判过。
只报告可复现的工程结果:
python -m pytest tests -q→ 88 passed;python scripts/check_consistency.py→ 全部检查通过;- 两个自建 MCP server 可被 MCP 客户端正常拉起,含中文的结果(如「沪深300ETF」「通过」)在
PYTHONUTF8=1下正常返回,不出现 60 秒超时; trade-gateway在dry_run=1下可以完整走通prepare_order→ 用户贴回确认码 →place_order,orders表出现status='dry_run'且xt_order_id为空、券商无报单。
这里不提供任何回测收益、夏普、回撤或行情数字 —— 那些必须由你用自己的数据跑出来。 不同模型在工具调用与委托触发上可能有差异,生产使用前请按自己的数据与制度自行验收。
examples/ 下是 3 个可复现的操作样例(runbook),不是伪造的对话记录或回测结果:
01 演示建标的池并补齐日线并核对覆盖度与口径;02 演示一次 ETF 动量轮动回测如何落库并送
risk-reviewer 复核;03 演示 dry_run 下单的两步走与各类拒绝码。
- 本项目是量化研究与自动化工具,不构成任何投资建议。
SOUL.md明确禁止给出「稳赚」「必涨」 之类的确定性承诺,也禁止编造行情、收益率、因子 IC 或回测结果。 - 历史回测不代表未来收益。 实盘盈亏与由此产生的任何后果由使用者自行承担。
- 默认不启用交易网关(
enabled:false),且启用后仍默认QUANT_TRADE_DRY_RUN=1,只写本地orders表不报券商。要真报单必须显式改QUANT_TRADE_DRY_RUN=0,并自行确认已按券商与监管 要求开通量化交易权限、签署相关协议。 - 演示种子(
seed.sql)只含公开的代码 / 名称 / 板块 / 行业等事实,不含任何行情价格与财务 数值;backtests/signals/orders等表刻意留空,必须由真实流程写入。 - 本项目以 MIT 许可发布;DeerFlow 框架遵照其各自许可。
-
现象:MCP 工具在纯 ASCII 结果上正常,一旦返回含中文的内容就 60 秒超时。 原因:stdio 子进程在中文 Windows 默认按 GBK(cp936) 写 stdout,MCP 客户端按 UTF-8 解码失败。 解决:三个 MCP 的
env都要写PYTHONUTF8=1(最好再加PYTHONIOENCODING=utf-8), 不是只给 sqlite 加;安装器已自动注入,手工安装别漏。 -
现象:技能加载后,MCP 或
task工具报 “not allowed by the active skill policy”。 原因:技能allowed-tools是精确白名单,YAML 列表形式不做别名归一化。写Read/Write/WebSearch不会匹配任何运行时工具。 解决:一律写运行时真名,如read_file、write_file、web_search、task、quant-data_get_daily_bars、quant-db_read_query、trade-gateway_prepare_order。 -
现象:
quant-dbMCP 起不来或工具列表为空。 原因:新版 MCP SDK 移除了旧 sqlite server 依赖的Server.list_resources装饰器。 解决:锁定uvx --with mcp==1.2.1 mcp-server-sqlite;quant-data用独立 venv 装mcp>=1.28,<2,两者互不影响。 -
现象:装完
risk-reviewer后config.yaml解析失败,或原有safety-reviewer消失。 原因:本机config.yaml已有 machine-problems 注入的顶层subagents:键,再追加第二个 同名顶层键会重复 / 静默覆盖。 解决:subagents/risk-reviewer.yaml只是 4 空格缩进的片段,必须插到既有custom_agents:行之后(安装器已这么做);校验方法:uv run --with pyyaml python -c "import yaml;d=yaml.safe_load(open(r'<deer-flow>\config.yaml',encoding='utf-8'));print(list(d['subagents']['custom_agents'].keys()))" # 应同时看到 safety-reviewer 与 risk-reviewer
注意:
risk-reviewer是自定义custom_agents条目,allowed_subagents只授权这一个 —— 主助手看不到也不能调用其它子智能体。 -
现象:
quant-data首次调用任一取数工具(交易日历、日线、基本面)卡 60100 秒后超时, 而同一台机器上直接100 秒);在 Python 3.14 的 venv 上尤其明显。 解决:一是 venv 锁 Python 3.12(安装器已用python -c "import akshare"只要 2 秒左右。 原因:在 MCP 的工作线程里首次导入 akshare 时,其依赖numpy._core._multiarray_umath在该上下文下初始化异常缓慢(实测 76uv venv --python 3.12);二是server.py在mcp.run()前于主线程预热akshare/baostock,把导入成本挪到 会话初始化阶段(session_init_timeout为 180 秒,足够)。 -
xtquant 不在 PyPI:它随 QMT 客户端分发,同名包多为非官方上传。安装器不执行任何
pip install,而是把<QmtPath>\bin.x64\Lib\site-packages通过PYTHONPATH注入。
MIT © 2026 chen1255