Install
openclaw skills install @mifochen/quant-all-mcpQuantAll(全A解析)MCP 技能 —— A股全市场向量化并行计算引擎, 支持5000+股票的全市场因子计算、策略回测、因子IC分析及GPU多维可视化。 核心价值:为 AI 配置本地计算引擎,让 AI 从"数据搬运工"升级为"数据分析师"—— 不再只是查询不知真假的信息,而是用代码算出客观结果。 三大使用场景:①用户明确需求(回测/因子分析)→ AI 直接计算给结果; ②用户模糊表述股市想法 → AI 主动用 QuantAll 算出客观数据回应; ③AI 自主挖掘机会 → 写代码→执行→读热力图→形成结论,技术闭环。 触发条件:用户提到"全A解析"、"回测"、"因子分析"、"选股"、"策略"、"QuantAll"、 "全市场计算"、"因子有效性"、"IC分析"等量化研究场景; 也包括用户表述股市相关想法时,AI 判断可用 QuantAll 计算验证的场景。 QuantAll 是独立的本地计算引擎,依赖用户本地 DuckDB 数据库运行。 UpdateStock 技能提供数据库管理辅助和启动管理,需 tushare API(非 QuantAll 必需)。 QuantAll 目前完全免费。
openclaw skills install @mifochen/quant-all-mcpQuantAll(全A解析)和 UpdateStock 是两个独立但可协作的 MCP 服务:
┌──────────────────────────────────────────────┐
│ WorkBuddy/AI │
│ │ │
│ ┌────────────┴────────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ UpdateStock │ ──可启动→│ QuantAll │ │
│ │ (stdio MCP) │ │ (HTTP MCP) │ │
│ │ │ │ 8686端口 │ │
│ │ 数据库管理 │ │ 计算引擎 │ │
│ │ 安装/卸载 │ │ 可视化 │ │
│ │ 数据库设置 │ │ 回测/因子 │ │
│ │ (需tushare) │ │ (完全免费) │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ DuckDB 数据库 (.duckdb) │ │
│ │ 5500+ 股票 × 150+ 维度 × 日频 │ │
│ └──────────────────────────────────────┘ │
└──────────────────────────────────────────────┘
DB_setting.json 统一管理。核心定位:QuantAll 是独立可运行的计算引擎,只需要本地数据库(DuckDB)即可工作。UpdateStock 是一个便利工具,帮你管理数据库和启动 QuantAll,但不是 QuantAll 的必需依赖——你可以不用 UpdateStock,自己手动启动 QuantAll、用自己的数据库,完全没问题。
在 ~/.workbuddy/mcp.json 中配置(UpdateStock 可选,QuantAll 必须):
{
"mcpServers": {
"全A解析": {
"url": "http://127.0.0.1:8686/mcp",
"disabled": false
},
"UpdateStock": {
"command": "<skill-dir>/scripts/.venv/Scripts/python.exe",
"args": ["<skill-dir>/scripts/UpdateStock_skill.py"],
"disabled": false,
"disabledTools": []
}
}
}
注意:UpdateStock 可选配置——如果你有自己的数据库且不需要通过 AI 更新数据,可以只配 QuantAll 的 HTTP MCP。
UpdateStock 是 QuantAll 的可选辅助 MCP,提供数据库管理和 QuantAll 启动管理。需要 tushare API key。如果你已有自己的 DuckDB 数据库且不需要通过 AI 更新数据,可以跳过此部分,直接阅读第二部分。
UpdateStock 提供以下工具:
| 工具 | 用途 | 关键参数 |
|---|---|---|
ping | 健康检查 | 无 |
Creat_DB | 创建默认格式数据库 | DB_path(留空=同目录 Test.duckdb) |
Update_Stock_Data | 全量更新(需 tushare 2000+ 积分) | ignore_check |
Update_Stock_Data_easy | 增量更新(需 tushare 200 积分,免费可获取) | DB_path, API |
get_stock | 查询非复权行情 | symbol, start_date, end_date |
get_adj_stock | 查询前复权行情 | symbol, start_date, end_date |
Start_QuantAll | 启动 QuantAll MCP 服务 | 无 |
Install_QuantAll | 安装/更新 QuantAll 包(pip install quantall) | 无 |
Uninstall_QuantAll | 卸载 QuantAll | 无 |
Set_QuantAll_DataBase | 设置数据库路径和加载天数 | path, days |
-i https://pypi.tuna.tsinghua.edu.cn/simpleQuantAll 已发布至 PyPI,通过
pip install quantall即可安装,无需本地 whl 文件。
在 skill 的 scripts/ 目录下创建 Python 虚拟环境:
cd <skill-dir>/scripts
<你的Python路径> -m venv .venv
推荐使用 WorkBuddy 自带的管理版 Python(如 C:\Users\<用户>\.workbuddy\binaries\python\versions\3.13.12\python.exe),或系统已安装的 Python 3.12+。
⚠️ 务必使用清华镜像源。QuantAll 有 45 个依赖包,其中 PySide6_Addons(169MB)、PySide6_Essentials(78MB)等大型包从默认源下载极慢甚至超时。始终添加
-i https://pypi.tuna.tsinghua.edu.cn/simple。
# 安装 QuantAll(从 PyPI,务必加镜像源)
.venv/Scripts/python.exe -m pip install quantall -i https://pypi.tuna.tsinghua.edu.cn/simple
安装时长约 2-3 分钟(取决于网络),共约 45 个包。主要大包:
PySide6_Addons:169MBPySide6_Essentials:78MBduckdb:13MBnumpy:12MB验证安装:
.venv/Scripts/python.exe -c "import QuantAll; print('OK')"
仅在需要通过 AI 管理数据库时安装。 QuantAll 作为独立计算引擎,不依赖 tushare/baostock。如果你已有自己的 DuckDB 数据库,或仅使用自带 Test.duckdb 测试,可以跳过此步。
# tushare、baostock 是 UpdateStock 的依赖,不在 QuantAll 的 pip 依赖中
.venv/Scripts/python.exe -m pip install tushare baostock -i https://pypi.tuna.tsinghua.edu.cn/simple
⚠️ WorkBuddy 环境安装注意事项:WorkBuddy 的 Python 运行时注入了 safe-delete 机制(通过
sitecustomize.py拦截文件删除操作),可能导致 PySide6 安装时文件覆盖失败。如遇到[safe-delete][SAFE_DELETE_FAIL_CLOSED]错误,需清除环境变量后重试:bash CODEBUDDY_SESSION_ID= CLAUDE_SESSION_ID= CODEBUDDY_SAFE_DELETE_SANDBOX= .venv/Scripts/python.exe -m pip install quantall -i https://pypi.tuna.tsinghua.edu.cn/simple普通用户在命令行直接
pip install不受此影响。
修改 ~/.workbuddy/mcp.json,将 UpdateStock 的 command 指向虚拟环境的 Python,args 指向 UpdateStock_skill.py:
{
"mcpServers": {
"全A解析": {
"url": "http://127.0.0.1:8686/mcp",
"disabled": false
},
"UpdateStock": {
"command": "C:/Users/<用户>/.workbuddy/skills/QuantAll-mcp/scripts/.venv/Scripts/python.exe",
"args": [
"C:/Users/<用户>/.workbuddy/skills/QuantAll-mcp/scripts/UpdateStock_skill.py"
],
"disabled": false,
"disabledTools": []
}
}
}
路径格式:Windows 上使用正斜杠
/,避免反斜杠转义问题。
DB_setting.json:QuantAll 首次启动时自动创建,默认
db_path指向 quantall pip 安装包内置的Test.duckdb(仅含沪深 300 近两年基础行情)。如你已有自己的 DuckDB 数据库,务必修改db_path切换到自己的数据库路径,否则反复启动可能被内置测试库覆盖。
⚠️ Test.duckdb 仅供测试:quantall pip 安装包内置
Test.duckdb,仅含沪深 300 成分股近两年的基础行情数据(open/high/low/close/vol),仅用于软件功能验证。pip 更新 quantall 时可能覆盖此文件,切勿用于正式研究。正式使用请创建独立数据库(方案 B/C),并通过DB_setting.json的db_path切换过去。
QuantAll 是独立的计算引擎,不依赖 UpdateStock 启动。以下三种方式任选其一:
通过 mcp__UpdateStock__Start_QuantAll 工具启动,AI 可自动检测端口确认启动状态。
mcp__UpdateStock__Start_QuantAll,在 localhost:8686 启动 HTTP 服务mcp__全A解析__ping 确认返回 "pong"在 scripts/ 目录下创建 run.bat(内容见下方 Step 5),双击运行即可。QuantAll 将在后台启动(无控制台窗口),监听 8686 端口。
在 scripts/ 目录下,用命令行运行:
.venv\Scripts\python.exe Start_QuantAll.py
这是最底层的方式,适合调试或自定义启动。
三种方式总结:方式一通过 AI 工具调用、自动检测端口,最省心但需要 UpdateStock;方式二双击 bat 后台启动,最方便;方式三直接运行 Python,最灵活。不论哪种方式,启动后 QuantAll 都在 8686 端口提供 HTTP MCP 服务——功能完全一致。
QuantAll 目前完全免费。启动时会弹出用户协议确认窗口:
- 激活(推荐):点击确认同意协议即视为"激活",表示永久同意用户协议,后续启动不再弹出协议窗口。激活与否在功能上完全一致,无任何限制或差异。
- 不激活:每次启动都需要手动确认用户协议。
在用户点击确认之前,除
ping外的所有 MCP 工具(回测、因子分析等)都将被阻止——这是金融技能的合规要求。
⚠️ MCP 重连:QuantAll 后于 AI-Agent 启动时,MCP 连接可能需要断开重连才能生效。重连方式同上(连接器管理页面 / 重启智能体)。
安装完成后,建议创建 run.bat 启动脚本并制作桌面快捷方式,双击即可启动 QuantAll,无需每次通过命令行操作。
💡 行为规范:安装完成后,AI 应主动提醒用户:"是否需要帮你创建 run.bat 和桌面快捷方式?"用户同意后,AI 依次创建 run.bat(Write 工具写入)和桌面快捷方式(pywin32 创建 .lnk)。
在 scripts/ 目录下创建 run.bat 文件(技能包不携带此文件,需用户或 AI 自行创建):
@echo off
cd /d "%~dp0"
start /B .venv\Scripts\pythonw.exe Start_QuantAll.py %*
run.bat 设计要点:
%~dp0:自动定位到 bat 文件所在目录(即 scripts/),无需硬编码路径start /B:后台启动,不创建新窗口,bat 执行后立即退出pythonw.exe(非 python.exe):无控制台窗口运行,适合 GUI 应用(QuantAll 使用 PySide6)%*:原样传递所有命令行参数为刚创建的 run.bat 创建一个 Windows 快捷方式(.lnk),放到桌面即可双击启动。
⚠️ 重要:不要在桌面创建 .bat 文件。Windows cmd 以 GBK 编码读取 .bat 文件,而 AI 工具写入的 .bat 通常是 UTF-8 编码,中文注释和中文路径会乱码,导致 cmd 将乱码文本当作命令执行而报错(如
'鐜' 不是内部或外部命令)。正确做法是先创建scripts/run.bat,再为它创建桌面.lnk快捷方式。
方式一:Windows 右键创建(最简单,推荐用户手动操作)
scripts\run.batrun.bat - 快捷方式,可重命名为 QuantAll启动方式二:AI 通过 Python 创建(用户要求时) 如果用户要求 AI 帮忙创建,可使用 venv 中的 pywin32(QuantAll 依赖包自带):
import win32com.client
import os
desktop = os.path.join(os.environ["USERPROFILE"], "Desktop")
lnk_path = os.path.join(desktop, "QuantAll.lnk")
target = r"<skill-dir>\scripts\run.bat"
working_dir = r"<skill-dir>\scripts"
shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortcut(lnk_path)
shortcut.TargetPath = target
shortcut.WorkingDirectory = working_dir
shortcut.Description = "Start QuantAll MCP Service"
shortcut.Save()
注意:PowerShell
New-Object -ComObject WScript.Shell和cscript/wscript执行 VBS 可能被安全策略阻止。使用 venv 中的 Python + pywin32 是最可靠的方式。
核心认知:QuantAll 只是计算引擎,自动读取和管理用户本地数据库的数据。AI 能使用的数据维度多少,完全取决于用户本地数据库的内容——数据库里有什么字段,QuantAll 就能算什么。QuantAll 本身不生产数据。
quantall pip 安装包内置 Test.duckdb,包含沪深 300 成分股近两年的基础行情数据(open/high/low/close/vol),仅用于软件功能测试。QuantAll 首次启动时自动生成的 DB_setting.json 默认连接此数据库。
⚠️ Test.duckdb 会被 pip 更新 quantall 时覆盖,切勿用于正式研究。正式使用请创建独立数据库(方案 B/C),并通过修改
DB_setting.json的db_path切换过去。数据非常有限(仅沪深 300 + 基础行情),不适合严肃的量化研究。
两个档次,按 tushare 积分选择:
| 方案 | tushare积分 | 数据范围 | 调用工具 | 耗时 |
|---|---|---|---|---|
| 完整版 | 2000+ | 全市场 5500+ 股票,全部表(行情/财务/因子/预告/分红) | Update_Stock_Data | 首次数小时 |
| 精简版 | 200(免费认证即可获得) | 指数行情 + 股票行情(仅 OHLCV),通过 baostock + tushare 免费接口获取 | Update_Stock_Data_easy | 较快 |
更新速度说明:即使是增量更新也不快——部分数据需要从最新缺失日期开始逐天确认是否有新数据,且 tushare 部分接口本身响应较慢。请耐心等待,不要中途中断。
进度通知:更新过程中会持续发送 MCP 进度通知(
ctx.report_progress+ctx.info),格式为[phase/total] 阶段名 日期: 结果 (current/total)。完整版有 7 个阶段(指数→股票行情→基础数据→行情因子→业绩预告→分红→财报),精简版有 2 个阶段(指数→股票行情)。API 配置:tushare API key 存放在
scripts/API_tushare.txt(纯文本,一行)。Update_Stock_Data和Update_Stock_Data_easy会自动读取此文件。pandas 3.x 兼容性:pandas 3.0+ 中
str类型不再是object,pd.to_datetime(df['trade_date'], errors='coerce').dt.date需在前面先.astype(object)转换,否则日期处理会报错。
操作步骤:
Creat_DB 创建独立数据库(指定新路径,不要覆盖 Test.duckdb)Set_QuantAll_DataBase 将新数据库路径写入设置Update_Stock_Data 或 Update_Stock_Data_easy 填充数据如果用户已有 DuckDB 股票数据库,可以通过修改 DB_setting.json 直连:
{
"db_path": "D:/你的数据库路径/your_db.duckdb",
"days": 730,
"stock": "stock",
"map_stock": {
"trade_date": "trade_date",
"symbol": "symbol",
"open": "open",
"high": "high",
"low": "low",
"close": "close",
"vol": "vol",
"voe": "voe"
}
// ... 其他表的映射 ...
}
调用 Set_QuantAll_DataBase 工具或在 scripts/DB_setting.json 中手动修改。
字段名翻译层:数据库内的原始字段名与 AI 看到的字段名之间,隔着
scripts/data/db_translate.json翻译文件。该文件将数据库字段名映射为中文描述(如turnover_rate→换手率、pe_ttm→市盈率TTM),供 AI 理解字段含义。用户使用自有数据库时,可自行调整此翻译文件以匹配实际字段名。
将全市场 5500+ 只股票、150+ 维度的数据抽象为统一的二维矩阵(行=日期,列=股票)。AI 只需编写向量化代码片段,数秒内完成全市场运算。
⚠️ 关键机制(AI 必须在首次使用前理解):
- 不支持并行工具调用——同时发多个工具会返回"有其它任务在执行"。所有调用必须串行(一个返回后再发下一个)
- select_by_code 只影响 GUI 图层,不筛选回测数据——选了北京股再跑 strategy_backtest,结果仍是全市场 5585 只。想对子集回测需在 code 中直接写筛选逻辑
- select_by_code 自带统计——返回
全局平均和有效数量,无需再跑 heat_map 即可知道子集均值- Series → DataFrame 转换:绘图模式下每只股票只有一条收益线,对应一个关键日期(目前默认第一天)。从 DataFrame 取某天数据拿到的是 Series,需复制成与
d['close']同维度的 DataFrame
核心理念:QuantAll 为 AI 配置了一台本地计算引擎。AI 不再只是"查询信息然后转述"——而是能用代码算出客观结果。这是从"数据搬运工"到"数据分析师"的根本转变。
用户直接要求回测、因子分析、选股等。
AI 行为:直接调用对应工具,先 summary 快评再深入分析。流程清晰,按"典型工作流程"执行即可。
用户:"帮我回测一下双均线策略"
→ AI:写 code → strategy_backtest(summary) → 汇报收益率/夏普/回撤
→ 用户感兴趣 → AI:切换 detail/segments/timeline 深挖
用户没有直接说"回测"或"因子分析",但表达了与股市相关的想法、疑问或直觉。
AI 行为:主动判断能否用 QuantAll 计算验证,而不是去搜索一些不知真假的信息来回答。如果用户的想法可以被量化表达,就写成代码跑出客观结果。
用户:"最近小盘股是不是比大盘股表现好?"
→ AI 判断:这是市值因子 vs 收益的关系,可量化
→ AI:用 row_rank 按市值分组 → factor_analysis 计算市值因子 IC
→ AI:给用户客观数据(IC 均值、多空差),而非网上观点搬运
用户:"放量上涨之后一般会怎么走?"
→ AI 判断:这是"放量+上涨"事件与未来收益的关系,可回测
→ AI:写条件代码 → strategy_backtest → 给出胜率、平均收益
→ AI:用 heat_map 做多维验证(放量程度 × 未来收益)
关键:AI 要有意识地把用户的"模糊想法"翻译成"可计算的量化问题"。这是 QuantAll 最大的价值——让 AI 的回答从"我搜到的信息说..."变成"我算出来的结果是..."。
AI 主动提出分析方向,写代码计算,读取热力图结果,形成结论——构成技术闭环。
AI 行为:基于市场常识或用户历史偏好,主动设计实验。关键在于 AI 能读到计算结果(通过 heat_map 返回的统计数据、factor_analysis 返回的 IC 指标等),据此形成有数据支撑的结论。
技术闭环:
AI 设计假设 → 写 code → QuantAll 执行 → 工具返回统计数据
→ AI 读取结果 → 形成结论 → 可能继续迭代(调整参数/换维度)
示例:
AI:"我想验证低换手率股票是否长期跑赢高换手率股票"
→ factor_analysis(code=换手率, feature_days=20) → IC=-0.03
→ 结论:换手率与未来20日收益呈弱负相关,低换手率确实略占优
→ 进一步:move_by_code(换手率) + heat_map → 验证不同换手率区间的收益分布
→ 进一步:strategy_backtest → 量化这个策略的实际收益
技术闭环的意义:AI 不是在"猜"或"编",每一步结论都有 QuantAll 返回的客观数据支撑。用户可以质疑代码逻辑,但不能质疑数据本身——因为它是用全市场真实数据算出来的。
ping,未启动则引导用户启动available_data 确认所需字段存在,不要假设字段名所有需要 code 参数的工具共享相同的 exec 环境。
| 变量 | 类型 | 说明 |
|---|---|---|
d | dict[str, DataFrame] | key=字段名,value=个股×时间面板 DF(行=时间,列=股票) |
col_attrs | dict[str, Series] | key=属性名,value=股票属性 Series(如行业、省份) |
np | module | numpy |
pd | module | pandas |
行情类:close, open, high, low, vol, amount, adj_factor
复权价格:
adj_close = d['close'] * d['adj_factor'],high/low 同理
其他可用字段通过 available_data 工具查看,涵盖估值、财务、成长、交易、预告等 150+ 维度的数据,数据量的多少取决于你的本地数据库。
股票代码, 股票名称, 所属行业, 所在省份, 所在城市, 交易所, 所属概念, 实控人名称, 实控人企业性质, 员工人数 等
import / for/while 循环 / df.apply() / lambda / 递归axis=1 的聚合/排序),各股票停牌时间不对齐out = ...| 工具 | 是什么 | 核心输出 |
|---|---|---|
ping | 健康检查 | "pong" |
available_data | 查看可用数据字段 | 字段名列表 |
strategy_backtest | 策略回测 | 收益/夏普/回撤/胜率 |
factor_analysis | 因子IC分析 | IC均值/IR/正占比/多空差 |
new_layer_from_code | 创建图层标记 | bool → 可视化短线 |
select_by_code | 筛选股票(支持集合运算) | bool → 选中集合 |
move_by_code | 坐标平移映射 | 数值 → 热力图 |
weight_by_code | 权重设置 | 数值 → 加权统计 |
heat_map | 热力图统计 | 矩阵统计 |
get_user_selection | 获取用户当前选中 | 股票代码列表 |
MCP_Close | 关闭服务 ⚠️ | 无 |
首选策略分析工具。用代码生成持仓矩阵(bool DataFrame),自动计算绩效。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | 策略名称 |
code | string | 必填 | 策略代码,out = bool DataFrame(True=持仓) |
use_price | enum | close | close=当日收盘,next_open=次日开盘(严格回测推荐) |
view | enum | summary | summary/detail/segments/timeline |
offset_days | int | 0 | 跳过头部 N 天(避开指标预热期 NaN) |
open_commission | float | 0.00025 | 买入手续费(万分之2.5) |
close_commission | float | 0.00075 | 卖出手续费(万分之7.5) |
view 视角:
| view | 软件端绘图 | MCP 返回 | 后续分析 | 核心用途 |
|---|---|---|---|---|
summary | 5585 条收益线叠加(红=持仓/绿=非持仓) | 聚合统计 | ✅ select/move/heat_map | 第一步必跑,判断策略价值 |
segments | 72095 条持仓片段散点(X=买入时间, Y=收益) | 聚合统计 | ✅ 核心:因子分析 | 分析买入前因子对收益的影响 |
detail | 同 summary(同一张图) | 5585 只股票逐一指标 | ✅ 同 summary | AI 内部分析 Top/Bottom 股票 |
timeline | 5 条合成曲线(红=收益%/黄=排名/青=持平比/白=买比/紫=卖比) | 5 列每日序列 | ❌ 只读 | 观察时间分布规律 |
⚠️ 关键认知:
detail返回约 140 万字符的原始数据,绝不能直接展示给用户——AI 必须内部分析后只汇报结论segments的灵魂不是看收益,是看买入前因子对收益的影响——用move_by_code映射因子后用heat_map做交叉验证timeline是只读视图,不能用 select/move/weight/heat_map 做二次分析- 四个 view 的绘图方式不同,但 summary/detail 共用同一张叠加图,segments 是散点图,timeline 是合成曲线图
持仓矩阵必须用
hold_until(buy, sell)生成,不能手写逆序 cumsum。
DeferExecuteTool(toolName="mcp__全A解析__strategy_backtest", params={
"name": "双均线交叉_MA5_MA20",
"code": "adj_close = d['close'] * d['adj_factor']\nma5 = adj_close.rolling(5).mean()\nma20 = adj_close.rolling(20).mean()\nbuy = (ma5 > ma20) & (ma5.shift(1) <= ma20.shift(1))\nsell = (ma5 < ma20) & (ma5.shift(1) >= ma20.shift(1))\nout = hold_until(buy, sell)",
"use_price": "next_open",
"offset_days": 20,
"view": "summary"
})
评估因子与未来收益的 Spearman 秩相关(Rank IC)。核心认知:和 strategy_backtest 类似,factor_analysis 有三个 mode,从不同维度评估因子有效性。标准流程是 summary → daily → scatter(逐步深入)。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | 因子名称 |
code | string | 必填 | out = 数值 DataFrame |
feature_days | int | 1 | 评估未来第 N 天收益 |
mode | enum | summary | summary/daily/scatter |
| mode | MCP 返回 | 软件端绘图 | 后续分析 | 核心用途 |
|---|---|---|---|---|
| summary | 聚合统计(IC均值/IR/正占比/多空差) | 散点图:X=收益排序,Y=因子排序,红=高收益,绿=低收益 | 支持 move_by_code + heat_map + select_by_code | 第一步必跑,判断因子是否有效 |
| daily | 每日IC时间序列 + 每日前/后10%IC | 时序曲线图:X=时间,Y=IC值,三条曲线(蓝=每日IC/红=前10%/绿=后10%) | 不支持(只读视图) | 看IC时序稳定性、时段特征 |
| scatter | 同 summary 的聚合统计 | 时序散点图:X=时间(按天排列,每天因子排序缩放到0-0.8),Y=因子排序,红=高收益,绿=低收益 | 支持 在时间维度上进一步分析 | 观察因子-收益关系随时间的演变 |
关键区别:
summary是全局截面散点——所有(日期,股票)混在一起,看整体因子-收益关系scatter是时序截面散点——每个时间切片独立排列,能看到垂直条纹(不同日期的IC强度差异),局部放大可分析特定时段daily是纯时序曲线——只看IC随时间的变化,不支持二次分析
| 指标 | 含义 | 判断标准 |
|---|---|---|
| IC均值 | 因子值与未来收益的 Spearman 秩相关系数均值 | 绝对值越大越好;正=因子值越高收益越高 |
| IC标准差 | IC 的波动性 | 越小越稳定 |
| IC_IR | IC均值 / IC标准差 | 衡量因子风险调整后预测力;通常 |IR|>0.3 视为有效 |
| IC正占比 | IC>0 的天数比例 | 偏离50%越多方向越稳定 |
| 多空排名差 | 因子值最高组 vs 最低组的收益排名差 | 越大区分度越好 |
| 前/后10%平均排名 | 因子极端分组的平均收益排名(0.5=平均) | 偏离0.5越多尾部信号越强 |
| feature_days | 评估未来第 N 天收益 | 长周期(20d)通常比短周期(5d)IC更强 |
# 单因子分析
factor_analysis(name="换手率", code="out = d['换手率']", feature_days=20, mode="summary")
# 复合因子(各自排名后等权组合)
factor_analysis(
name="低换手小市值",
code="turnover_rank = row_rank(d['换手率'])\nsize_rank = row_rank(d['总市值'])\nout = (1 - turnover_rank) + (1 - size_rank)",
feature_days=20,
mode="summary"
)
# 动量因子 → 用 daily 模式看 IC 时序稳定性
factor_analysis(
name="20日动量",
code="adj_close = d['close'] * d['adj_factor']\nout = adj_close.pct_change(20)",
feature_days=20,
mode="daily"
)
⚠️ 关键规则:
factor_analysis内部已自动做排名转换(Spearman Rank IC),单因子代码中不需要手动row_rank()——out = d['字段名']直接输出即可。但如果要组合多个因子,必须手动 rank 后再组合(确保量纲一致),如上面的复合因子示例。
跑 factor_analysis(summary)
│
├─ |IC_IR| > 0.3?IC正占比偏离50%?
│ ├─ 否 → 因子无效,换一个
│ └─ 是 → 继续
│
├─ mode=daily → IC 时序稳定?长期同符号?
│ 频繁正负翻转 → 因子不稳定,时效性强
│ ⚠️ 只读视图,不支持二次分析
│
└─ mode=scatter → 时序截面分布分析
支持 move_by_code / heat_map 在时间维度进一步挖掘
{
"每日IC信息": " 每日IC 每日前10%IC 每日后10%IC\nYYYY-MM-DD -0.XXXXX -0.XXXXX -0.XXXXX\n..."
}
feature_days 行全为 NaN——没有足够未来数据计算定位:量化分析的视觉探索入口。将用户感兴趣的条件(买点、卖点、事件、因子极值等)直接绘制到软件端,然后通过平移、权重、筛选、热力图等工具进行多维深度分析。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | 必填 | 图层名称 |
code | string | 必填 | out = bool DataFrame(True 位置绘制短线) |
new_layer_from_code 的本质是标记一批 (股票, 关键日期) 散点。每个 True = 一个离散数据点。后续 move_by_code、weight_by_code、select_by_code 都基于这些散点做截面计算。
双视角理解:
| 视角 | 看到的是什么 | 分析对象 |
|---|---|---|
| AI(散点视图) | 每个 True = 一个离散的 (股票, 日期) 数据点 | 散点的截面数据,用于 move/weight/select |
| 用户(走势线视图) | GUI 端以标记日为起点,往后自动绘制 N 天 K 线走势 | 短期价格形态,用于直观验证 |
💡 绘制天数和绘制模式是 GUI 端参数,不在 MCP 参数中——它们只影响用户端的视觉呈现,不影响 AI 的分析数据。
虽然散点本身只定位到标记日,但 move_by_code、weight_by_code、select_by_code 的代码中可以使用 .shift() 将标记日之前或之后的数据拉到散点上参与计算。
时间轴: T-5 T-4 T-3 T-2 T-1 T(标记日) T+1 T+2 T+3 T+4 T+5
↑ .shift(3) │ .shift(-2) ↑
可将 T-3 日 │ 可将 T+2 日
数据拉到标记日 │ 数据拉到标记日
┌─┴─┐
散点位置
| shift 方向 | 含义 | 典型用途 |
|---|---|---|
.shift(N) | 取标记日之前第 N 天的数据 | 标记前的估值水位、量能累积 |
.shift(-N) | 取标记日之后第 N 天的数据 | 未来收益、止损距离、最大回撤 |
⚠️ 这意味着 AI 可以分析标记前后的任何数据——只要在 move/weight/select 代码中显式
.shift()即可。例如weight_by_code(code="adj_close.shift(-5)/adj_close - 1")就是把"标记后第 5 天收益"作为权重。
软件只维护一个活动图层。新的 new_layer_from_code 会替换旧的绘制内容。
| 版本 | 设计 | 取舍 |
|---|---|---|
| 当前(推荐) | 单图层,新替旧 | AI 复杂度低,每次分析聚焦一个条件 |
| 早期(已废弃) | 多图层,各自独立 | AI 复杂度爆炸——每次 move/weight/select 都得指定目标图层 |
💡 "聚焦"是设计意图:如果用户换了条件(新
new_layer),说明分析焦点已转移,旧图层不再需要。这倒逼 AI 在一个图层上完成深度分析,而不是维护多个半成品图层。
会创建图层的工具(仅以下三个):
| 工具 | 创建的图层内容 |
|---|---|
new_layer_from_code | 自定义条件标记的散点 + 走势线 |
strategy_backtest | 回测的买卖点 + 收益曲线 |
factor_analysis (scatter 模式) | 因子值 × 收益的散点分布 |
早期版本有更多图层创建方法,暂时未导入——避免 AI 认知复杂度。后续可能逐步导入。
new_layer_from_code 不是一个终点,而是后续分析的起点:
new_layer_from_code(标记感兴趣的事件)
│
├─ move_by_code(direction="x") → 将维度 A 映射到 X 轴
├─ move_by_code(direction="y") → 将维度 B 映射到 Y 轴
│ └─ 此时已可看到二维分布
│
├─ weight_by_code → 调整统计权重(默认等权)
│ └─ 权重影响 heat_map 中的加权统计
│
├─ select_by_code → 筛选特定子集(支持集合运算)
│ └─ 自带"全局平均"和"有效数量"统计
│
└─ heat_map → 获取 XY 二维热力图统计矩阵
└─ matrix[i][j]: i=Y行, j=X列, origin=bottom-left
标记买入信号(金叉、突破、超卖等),用未来收益做 Y 轴平移,观察"买入后 N 天表现"的分布。
# 标记:放量突破20日均线
new_layer_from_code(name="放量突破", code="""
adj_close = d['close'] * d['adj_factor']
ma20 = adj_close.rolling(20).mean()
breakout = (adj_close > ma20) & (adj_close.shift(1) <= ma20.shift(1))
vol_ma = d['vol'].rolling(20).mean()
volume_spike = d['vol'] > vol_ma * 1.5
out = breakout & volume_spike
""")
# 后续分析:Y轴 = 未来10日收益,X轴 = 突破时成交量倍数
move_by_code(code="d['vol'] / d['vol'].rolling(20).mean()", direction="x", name="量比")
move_by_code(code="adj_close.shift(-10)/adj_close - 1", direction="y", name="10日收益")
# → heat_map 查看"量比 × 10日收益"的二维分布
标记卖出信号(死叉、破位、超买等),观察卖出后走势。逻辑同上,只是标记条件不同。
# 标记:RSI 超买后回落
new_layer_from_code(name="RSI超买回落", code="""
adj_close = d['close'] * d['adj_factor']
delta = adj_close.diff()
gain = delta.clip(lower=0).rolling(14).mean()
loss = (-delta.clip(upper=0)).rolling(14).mean()
rsi = 100 - 100 / (1 + gain / loss)
out = (rsi.shift(1) >= 70) & (rsi < 70)
""")
将所有股票在所有日期的数据全部标记出来,然后用因子值控制平移(move_by_code),用热力图观察因子×收益的分布关系。这是对 factor_analysis 的视觉化补充——能看到具体分布形态而不只是统计量。
# 第一步:标记所有日期(260万+ 数据点)
new_layer_from_code(name="全市场遍历", code="out = d['close'].notna()")
# 第二步:X轴 = 市值因子,Y轴 = 未来20日收益
move_by_code(code="out = d['总市值']", direction="x", name="市值")
move_by_code(code="adj_close.shift(-20)/adj_close - 1", direction="y", name="20日收益")
# 第三步:筛选高收益分段,进一步分析
select_by_code(mode="A", code="""
adj_close = d['close'] * d['adj_factor']
out = adj_close.shift(-20) / adj_close > 1.2
""")
| 搭配工具 | 作用 | 典型问题 |
|---|---|---|
move_by_code (x) | 用因子值控制 X 轴位置 | "放量程度如何影响后续收益?" |
move_by_code (y) | 用因子值控制 Y 轴位置 | "不同市值分组的收益分布?" |
weight_by_code | 调整统计权重 | "按成交金额加权看全局均值" |
select_by_code | 筛选子集 | "哪些段位的放量后收益最高?" |
heat_map | 获取二维统计矩阵 | "XX × YY 的密度分布" |
⚠️ 注意:
new_layer_from_code标记的点数可能非常大(全市场遍历 ≈ 260 万点)。这是正常的——QuantAll 的向量化引擎就是为此设计的。move_by_code 和 heat_map 会自动降维统计,不会因数据量大而卡顿。
将散点的额外维度映射到坐标轴位置,使空间分布反映数据特征。是 new_layer_from_code 之后的核心分析步骤。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
code | string | 必填 | out = 数值 DataFrame,映射到 X/Y 轴 |
direction | enum | y | x 或 y(双向独立,互不干扰) |
name | string | — | 维度名称(显示在返回结果中) |
to_percentile | bool | true | 是否转排名值(0~1),消除量纲差异 |
optimized_display | bool | false | 是否通过比率调整和分组优化显示 |
| 行为 | 说明 |
|---|---|
| 同方向覆盖 | 第二次 direction="x" 会替换第一次的 X 轴映射;Y 同理 |
| 双方向独立 | X 和 Y 各自维护,互不影响 |
| shift 时效 | .shift(-N) 有效(如 adj_close.shift(-20)/adj_close - 1),但会丢弃尾部 NaN 导致有效数量减少 |
| 多次 shift | 同一 code 中可多次 shift,如同时计算标记日前后的变化 |
optimized_display=True 时,通过比率调整和分组将散点聚合优化显示——数据量很大时(如全市场 260 万点),GUI 端的散点过于密集,开启后自动压缩聚合,观察分布形态更方便。建议在以下场景使用:
get_user_selection 交互做准备(框选更容易)💡 聚合优化后细分的含义不变(仍然是排名百分位),只是视觉上合并了邻近的稀疏区域,核心统计(热力图矩阵、轴统计)不受影响。
to_percentile | 轴细分 | 轴统计 | 适用场景 |
|---|---|---|---|
true(默认) | 等距(0.0, 0.1, …, 1.0) | 各段均匀(排名后等分) | 看"高/中/低"分段的关联 |
false | 按真实值范围 | 分布不均 | 看原始量纲的实际分布 |
⚠️
false时分布不均是正常现象:金融数据的真实值天然极端不均——少数大市值股票占据绝大部分总市值、成交量集中在头部、大量股票换手率极低。false就是直接用这些真实值做轴,分布不均是数据本身的特征,不是 bug。正因如此,默认才开启
true——先用排名消除量纲和分布偏度,确认因子有效后,再切false看真实值里的实际情况。
move_by_code 返回完整的热力图数据(无需单独调 heat_map):
有效数量, X/Y轴统计(10等分), X/Y轴细分, X/Y轴缩放,
XY热力图数量[10×10], XY热力图权重[10×10](如有加权)
matrix[i][j]: i=Y行, j=X列, origin=bottom-left
move 中的 .shift() 是分析"标记后表现"的核心手段:
# 基础:直接映射当前数据
move_by_code(code="d['换手率']", direction="x", name="换手率")
# 进阶:映射未来 N 日收益(最常用)
move_by_code(
code="adj_close.shift(-10)/adj_close - 1",
direction="y", name="10日收益"
)
# 混合:X=标记前量比,Y=标记后最大涨幅
move_by_code(code="d['vol']/d['vol'].rolling(20).mean()", direction="x", name="量比")
move_by_code(
code="(adj_close.shift(-5)/adj_close).rolling(5, min_periods=1).max() - 1",
direction="y", name="5日最大涨幅"
)
控制散点的统计权重,影响 heat_map 中的加权均值。默认"数量"(等权)。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
code | string | 必填 | out = 数值 DataFrame |
name | string | — | 权重名称 |
to_percentile | bool | true | 是否转排名值 |
| 行为 | 说明 |
|---|---|
| 覆盖 | 新权重替换旧权重,不会叠加 |
| 全局平均 | 返回散点的加权均值。默认为 1.0(等权),加权后按实际量纲(如成交量可能数万~数亿,取决于数据库单位) |
| 轴统计变加权和 | X/Y 轴统计从点数变为该段的总权重 |
| 增加 XY热力图权重矩阵 | 与 XY热力图数量并排显示,每个格子显示格子内总权重 |
| 不改变点数量 | 有效数量不变,只改变权重值 |
# 默认(等权)
→ 全局平均: 1.0, X轴统计每段 ~258k(均等)
# 成交量加权(数据库单位:千股)
weight_by_code(code="out = d['vol']", name="成交量加权")
→ 全局平均: 234713(正常——成交量本身是大数,千股单位下数十万属常规范围)
💡 加权后的全局平均和轴统计是原始量纲的客观计算结果,数字大是数据本身量级决定的(如成交量千股/股、市值亿元),不是异常。
⚠️ 如果运行时直接报错拿不到数据(而非拿到数据但数字不对),可能是 pandas 2.x → 3.0.3 升级导致的兼容性问题。数据本身不会因版本变化而"算错"——能拿到就一定是客观结果。
只读查询工具——获取当前图层的二维统计矩阵,不改变任何配置。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode | enum | auto | auto(全部10等分)/ percent(指定排名范围)/ value(指定数值范围) |
x_range | [num, num] | — | X 轴范围(percent/value 模式) |
y_range | [num, num] | — | Y 轴范围(percent/value 模式) |
move/weight/select 返回中已经包含了 heat_map 数据(10×10 矩阵),那是"当前配置下的默认 10 等分"。heat_map 工具的额外价值是自定义范围和缩放粒度:
# 只看中间段:X=0.2~0.8排名, Y=0.4~0.9排名
heat_map(mode="percent", x_range=[0.2, 0.8], y_range=[0.4, 0.9])
# → 在该子范围内重新 10 等分统计
# 指定数值范围(需确保 X/Y 有用 to_percentile=false 映射)
heat_map(mode="value", x_range=[-0.05, 0.15], y_range=[-0.1, 0.3])
matrix[i][j]: i=Y行(从下往上:0=Y最小值段, 9=Y最大值段)
j=X列(从左往右:0=X最小值段, 9=X最大值段)
origin=bottom-left → matrix[0][0] = 左下角(X最小, Y最小)
在当前图层中按条件筛选散点,支持 6 种集合运算。筛选后自动重新统计所有维度(X/Y 轴、热力图)。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode | enum | 必填 | A(新选) / AB(∩) / A+B(∪) / A-B / B-A / A+B-AB(对称差) |
code | string | 必填 | out = bool DataFrame |
| mode | 运算 | 结果说明 | 典型用途 |
|---|---|---|---|
A | B = A | 用新条件替换当前选中 | 初始筛选、切换分析视角 |
AB | B = B ∩ A | 在当前选中中进一步筛选 | 多条件收窄:先选高收益→再选低市值 |
A+B | B = B ∪ A | 在当前选中中追加 | 合并两个条件的点 |
A-B | B = B - A | 从当前选中中移除 | 排除干扰项 |
B-A | B = A - B | 从新条件中排除当前选中 | 找"不在已知集合中"的点 |
A+B-AB | B = B ⊕ A | 对称差(异或) | 找两集合不同的部分 |
select 在 move/weight 之后使用——它继承当前图层的所有配置,筛选后自动重新分桶统计:
# 完整管道示例
new_layer_from_code(name="全市场", code="out = d['close'].notna()")
move_by_code(code="d['总市值']", direction="x", name="市值")
move_by_code(code="adj_close.shift(-20)/adj_close - 1", direction="y", name="20日收益")
# 筛选:高收益 + 小市值(AB 模式,在 move 之后)
select_by_code(mode="A", code="adj_close.shift(-20)/adj_close > 1.2") # 25万点
select_by_code(mode="AB", code="row_rank(d['总市值']) < 0.3") # 进一步收窄
# → 返回筛选后的 X/Y 轴统计和热力图(自动用筛选后的点重新分桶)
⚠️ select 不回测:select 只影响 GUI 图层的选中状态和统计,不影响 strategy_backtest 的数据范围。
QuantAll 不只是绘图工具,也支持用户在 GUI 端的交互操作。用户可以通过鼠标直接与图层内容互动,get_user_selection 将用户的交互选中结果返回给 AI,构成从"AI 展示 → 用户观察 → 用户框选 → AI 深入分析"的闭环。
| 操作 | 方式 | 功能 |
|---|---|---|
| 拖拽画布 | 鼠标左键拖拽 | 平移画布视角 |
| 缩放画布 | 鼠标中键滚轮 / 中键拖拽 | 放大/缩小视图 |
| 🚩 框选(重新选取) | 右键从右下→左上拖拽(红色选框) | 放弃之前选中,重新框选 |
| 清空选择 | 右键从右上→左下拖拽(绿色选框) | 清空所有已选中内容 |
| 添加选择 | 右键从左下→右上拖拽(紫色选框) | 在现有选中基础上追加 |
| 扣除选择 | 右键从左上→右下拖拽(青色选框) | 从现有选中中移除 |
💡 四色记忆口诀:红=重选(reset)、绿=清空(clear)、紫=加(add)、青=减(subtract)。方向决定颜色,颜色决定操作。
选择范围规则:
| 场景 | 用户操作 | AI 响应 |
|---|---|---|
| 看到异常区域 | 右键框选那片散点 | get_user_selection → AI 分析被选中点的共性特征 |
| 验证某个想法 | 选中特定条件区间的点 | AI 读取代码列表后进一步查询/统计 |
| 对比两个区域 | 依次框选两组散点 | AI 分别获取后对比差异 |
无选中时 → "当前用户无选中"
有选中时 → primary_code(K线图主图股票代码,可为 None)
top_100(选中的前 100 只股票代码列表)
select_count(用户框选的散点数)
total_count(当前图层的全部散点数——用于对比选中占比)
⚠️ 注意区分:
select_count是用户选中的数量,total_count是图层总数(提供上下文参照)。select_count > 100时top_100仅为前 100 只,AI 应提醒"选中范围过大(XX 个点),建议缩小选框后再分析"。
这是 QuantAll 交互闭环的最后一步:AI 绘制图层 → 用户观察 → 用户框选感兴趣的区域 → AI 获取选中内容深入分析。它让用户从"被动看 AI 分析结果"变为**"主动探索数据"**——用户看到图形中的异常区域、有趣分布,可以直接框选问 AI"这些点有什么共同特征?"。
⚠️ 警告:非常规任务不要调用!会关闭 QuantAll MCP 服务并回收资源。
# 单卖点
buy = (D.shift(1) <= 20) & (D > 20)
sell = (D.shift(1) >= 80) & (D < 80)
out = hold_until(buy, sell)
# 多卖点(自动 OR 合并)
out = hold_until(buy, [sell1, sell2])
在连续窗口内检测条件信号。mode: keep/discard/left/right/start/end/next
window = buy.shift(10, fill_value=False).rolling(11).max().astype(bool)
volume_spike = d['vol'] > d['vol'].rolling(20).mean() * 2
out = entry_check(window, volume_spike, mode="end")
返回百分位值(0~1)。split 可按代码分组独立排名。
| 函数 | 说明 |
|---|---|
get_time() | 返回每个单元格的时间整数 |
time_at(rq) | 匹配指定时间(负数=倒数第N天) |
time_between(srq, erq) | 匹配时间区间(左闭右开) |
time_in(rqs) | 匹配多个指定时间 |
adj_close = d['close'] * d['adj_factor']
ma5 = adj_close.rolling(5).mean()
ma20 = adj_close.rolling(20).mean()
buy = (ma5 > ma20) & (ma5.shift(1) <= ma20.shift(1))
sell = (ma5 < ma20) & (ma5.shift(1) >= ma20.shift(1))
out = hold_until(buy, sell)
adj_close = d['close'] * d['adj_factor']
delta = adj_close.diff()
gain = delta.clip(lower=0).rolling(14).mean()
loss = (-delta.clip(upper=0)).rolling(14).mean()
rs = gain / loss
rsi = 100 - 100 / (1 + rs)
buy = (rsi.shift(1) <= 30) & (rsi > 30)
sell = (rsi.shift(1) >= 70) & (rsi < 70)
out = hold_until(buy, sell)
adj_close = d['close'] * d['adj_factor']
ma20 = adj_close.rolling(20).mean()
vol_ma = d['vol'].rolling(20).mean()
breakout = (adj_close > ma20) & (adj_close.shift(1) <= ma20.shift(1))
volume_spike = d['vol'] > vol_ma * 2
buy = breakout & volume_spike
sell = adj_close < ma20
out = hold_until(buy, sell)
adj_close = d['close'] * d['adj_factor']
low_c = d['low'] * d['adj_factor']
high_c = d['high'] * d['adj_factor']
lowest = low_c.rolling(9).min()
highest = high_c.rolling(9).max()
rsv = (adj_close - lowest) / (highest - lowest) * 100
k = rsv.ewm(com=2, adjust=False).mean()
d_val = k.ewm(com=2, adjust=False).mean()
j = 3 * k - 2 * d_val
buy = (k > d_val) & (k.shift(1) <= d_val.shift(1)) & (j < 50)
sell = (k < d_val) & (k.shift(1) >= d_val.shift(1)) & (j > 50)
out = hold_until(buy, sell)
adj_close = d['close'] * d['adj_factor']
momentum = adj_close.pct_change(20)
m_rank = row_rank(momentum)
size_rank = row_rank(d['总市值'])
out = 0.7 * m_rank + 0.3 * (1 - size_rank)
UpdateStock.ping → 确认数据库管理服务正常全A解析.ping → 确认计算引擎就绪(如未启动,参考 Step 4 三种启动方式)全A解析.available_data → 确认所需字段可用全A解析.strategy_backtest → 先 view=summary 快评,再 detail/segments/timeline 深挖全A解析.available_data → 确认因子字段可用(数据库字段名与 AI 看到的名称中间有翻译层,别假设字段名)全A解析.factor_analysis → 先 mode=summary 看 IC 概览,判断因子是否有效(|IC_IR|>0.3)mode=daily → 看 IC 时序稳定性(频繁正负翻转则因子不稳定,加注时效性警告)mode=scatter → 软件端观察因子-收益关系随时间的演变move_by_code + heat_map → 多维交叉验证(如因子值 × 换手率的二维分布)strategy_backtest 验证基于此因子的策略收益核心思路:标记 → 平移 → 加权 → 统计 → 筛选 → 迭代。每一步都是可选的,按需组合。
1. new_layer_from_code → 标记感兴趣的事件/买点/卖点
2. move_by_code → 将额外维度映射到坐标轴(一维或二维)
3. weight_by_code → 设置统计权重(可选,默认等权)
4. heat_map → 获取多维关系统计矩阵
5. select_by_code → 筛选子集,迭代分析
1. new_layer_from_code → 标记所有(股票, 日期)点(out = d['close'].notna())
2. move_by_code(x) → X轴 = 因子A(如市值、换手率)
3. move_by_code(y) → Y轴 = 未来N日收益
4. weight_by_code → 可选加权(默认"数量")
5. heat_map → 获取 "因子A × 未来收益" 的二维分布
6. select_by_code → 筛选特定因子段位+收益段位 → 深入分析
这个路径是
factor_analysis的视觉化补充:factor_analysis 告诉你 IC 多大,但这个路径让你看到分布形态——收益是均匀分布还是集中在某个因子段位。
实战经验文档:详细使用模式、代码模板、踩坑记录和实战案例,参见
references/quantall_playbook.md。执行复杂分析任务前建议先阅读。本文档随使用经验持续积累更新。
hold_until,禁止手写逆序 cumsum(val > t) & (val.shift(1) <= t),DataFrame 交叉两边都 shiftadj_close = d['close'] * d['adj_factor']use_price="next_open" + offset_days 跳过预热期row_rank 返回百分位值(0~1),可直接用于因子标准化pip install quantall),安装方式从本地 whl 改为在线 pip 安装。包内内置 ai_prompts.toml 和 Test.duckdb。tushare/baostock 不在 pip 依赖中,需单独安装。run.bat 和 Test.duckdb。SKILL.md 更新:Step 5 改为指导用户自行创建 run.bat 后再制作桌面快捷方式;Test.duckdb 改为 quantall pip 安装包内置(默认数据库),用户需修改 DB_setting.json 的 db_path 切换到自有数据库。