{"id":"50234315-4c42-4243-936e-5ca10b10a52c","entityType":"agent","slug":"clawhub-mifochen-quant-all-mcp","name":"QuantAll","canonicalUrl":"https://www.xpersona.co/agent/clawhub-mifochen-quant-all-mcp","canonicalPath":"/agent/clawhub-mifochen-quant-all-mcp","generatedAt":"2026-10-12T14:48:22.574Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T02:22:27.116Z","emptyReason":null},"description":"QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。 AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。 让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。 触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。 不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。 能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、 修改 Skill: QuantAll Owner: mifochen Summary: QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。 AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。 让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。 触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。 不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。 能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、 修改 Tags: latest:1.0.4 Version history: v1.0.4 | 2026-08-10T10:57:27.431Z | user qu","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 955 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s17ez9j9adqc2m8d7g786vbkjd86fjsg:quant-all-mcp","sourceUrl":"https://clawhub.ai/mifochen/quant-all-mcp","homepage":"https://clawhub.ai/mifochen/skills/quant-all-mcp","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/mifochen/quant-all-mcp","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/mifochen/skills/quant-all-mcp","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。 AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。 让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。 触发：用"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T02:22:27.116Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T02:22:27.116Z","emptyReason":null},"stars":null,"forks":null,"downloads":955,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.4","tractionLabel":"955 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T02:22:27.108Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T02:22:27.116Z","lastCrawledAt":"2026-10-12T02:22:27.108Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T02:22:27.108Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.4","createdAt":"2026-08-10T10:57:27.431Z","changelog":"quant-all-mcp v1.0.4 - requirements.txt 更新为 ==1.0.8 - pip 安装和升级命令同步更新为 quantall==1.0.8 - 新增技能，增加对 MCP 2.0.0 版本的支持 - 移除 UpdateStock_script.py 和 skill-card.md 文件","fileCount":9,"zipByteSize":60248},{"version":"1.0.3","createdAt":"2026-08-01T01:58:22.699Z","changelog":"v1.0.3 — 小版本迭代，带来功能扩展与维护性提升。 - requirements.txt 升级为 quantall==1.0.4，需同步升级 Python 库。 - 新增工具：run_task_file（本地 JSON 任务流）与 execute_python_script（本地 Python 脚本扩展）。 - 批量工具 batch_factor_corr 与 batch_factor_analysis 增加本地 Excel 保存功能。 - 新增 UpdateStock_script.py 脚本，用于数据库数据更新（辅助 MCP）。 - 移除 skill-card.md，优化技能包结构与描述。","fileCount":10,"zipByteSize":69785},{"version":"1.0.2","createdAt":"2026-07-23T14:50:16.503Z","changelog":"- 触发条件收窄，仅在用户明确量化需求（如\"回测\"\"因子分析\"等）时启用，普通股市聊天不主动触发。 - 明确声明需在用户本地操作（创建 venv、pip 安装、mcp.json 配置、启动 HTTP 服务），AI 必须事前告知并获同意。 - 新增“AI 操作用户电脑行为规范”表，要求所有系统级操作前向用户说明并征得同意。 - 工具用法不再在 SKILL.md 展开，细节引导 AI 通过 ai_prompts.toml 获取。 - 新增批量工具：`batch_weight`, `batch_select`, `batch_factor_corr`，以及 `how_code`（代码执行环境说明）。 - 热力图/直方图统计等分析工具新增 summary 评估参数及提示。 - 内置函数扩展，支持 `row_top_n`, `row_bottom_n` 截面 Top/Bottom N 筛选。","fileCount":9,"zipByteSize":59473},{"version":"1.0.1","createdAt":"2026-07-15T09:47:42.096Z","changelog":"- Removed the file skill-card.md for a cleaner package structure. - No functional or code changes; this update is purely to remove documentation clutter. - All features, interfaces, and user-facing functionality remain unchanged.","fileCount":9,"zipByteSize":55762},{"version":"1.0.0","createdAt":"2026-07-08T08:12:40.110Z","changelog":"QuantAll MCP Skill v1.0.0 Changelog - Initial public release of QuantAll（全A解析）MCP: a full-market quant research engine for A股, supporting vectorized calculation across 5,000+ stocks, strategy backtest, factor IC analysis, and GPU visualization. - Introduced UpdateStock as an optional assistant MCP for DuckDB database management and QuantAll launch (requires tushare API). - Provided detailed guidance for independent installation and launch of QuantAll (no external API required). - QuantAll includes built-in test database (沪深300, recent 2 years); users are encouraged to set up their own full-market DuckDB database for production use. - Explicitly emphasized free use, local-first computation, user-controlled data, and streamlined Windows/Python install instructions.","fileCount":9,"zipByteSize":69015}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17ez9j9adqc2m8d7g786vbkjd86fjsg:quant-all-mcp","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T14:48:22.571Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-mifochen-quant-all-mcp/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-12T02:22:27.116Z","emptyReason":null},"readme":"Skill: QuantAll\n\nOwner: mifochen\n\nSummary: QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。 AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。 让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。 触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。 不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。 能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、 修改\n\nTags: latest:1.0.4\n\nVersion history:\n\nv1.0.4 | 2026-08-10T10:57:27.431Z | user\n\nquant-all-mcp v1.0.4\n\n- requirements.txt 更新为 ==1.0.8\n- pip 安装和升级命令同步更新为 quantall==1.0.8\n- 新增技能，增加对 MCP 2.0.0 版本的支持\n- 移除 UpdateStock_script.py 和 skill-card.md 文件\n\nv1.0.3 | 2026-08-01T01:58:22.699Z | user\n\nv1.0.3 — 小版本迭代，带来功能扩展与维护性提升。\n\n- requirements.txt 升级为 quantall==1.0.4，需同步升级 Python 库。\n- 新增工具：run_task_file（本地 JSON 任务流）与 execute_python_script（本地 Python 脚本扩展）。\n- 批量工具 batch_factor_corr 与 batch_factor_analysis 增加本地 Excel 保存功能。\n- 新增 UpdateStock_script.py 脚本，用于数据库数据更新（辅助 MCP）。\n- 移除 skill-card.md，优化技能包结构与描述。\n\nv1.0.2 | 2026-07-23T14:50:16.503Z | user\n\n- 触发条件收窄，仅在用户明确量化需求（如\"回测\"\"因子分析\"等）时启用，普通股市聊天不主动触发。\n- 明确声明需在用户本地操作（创建 venv、pip 安装、mcp.json 配置、启动 HTTP 服务），AI 必须事前告知并获同意。\n- 新增“AI 操作用户电脑行为规范”表，要求所有系统级操作前向用户说明并征得同意。\n- 工具用法不再在 SKILL.md 展开，细节引导 AI 通过 ai_prompts.toml 获取。\n- 新增批量工具：`batch_weight`, `batch_select`, `batch_factor_corr`，以及 `how_code`（代码执行环境说明）。\n- 热力图/直方图统计等分析工具新增 summary 评估参数及提示。\n- 内置函数扩展，支持 `row_top_n`, `row_bottom_n` 截面 Top/Bottom N 筛选。\n\nv1.0.1 | 2026-07-15T09:47:42.096Z | user\n\n- Removed the file skill-card.md for a cleaner package structure.\n- No functional or code changes; this update is purely to remove documentation clutter.\n- All features, interfaces, and user-facing functionality remain unchanged.\n\nv1.0.0 | 2026-07-08T08:12:40.110Z | auto\n\nQuantAll MCP Skill v1.0.0 Changelog\n\n- Initial public release of QuantAll（全A解析）MCP: a full-market quant research engine for A股, supporting vectorized calculation across 5,000+ stocks, strategy backtest, factor IC analysis, and GPU visualization.\n- Introduced UpdateStock as an optional assistant MCP for DuckDB database management and QuantAll launch (requires tushare API).\n- Provided detailed guidance for independent installation and launch of QuantAll (no external API required).\n- QuantAll includes built-in test database (沪深300, recent 2 years); users are encouraged to set up their own full-market DuckDB database for production use.\n- Explicitly emphasized free use, local-first computation, user-controlled data, and streamlined Windows/Python install instructions.\n\nArchive index:\n\nArchive v1.0.4: 9 files, 60248 bytes\n\nFiles: references/quantall_playbook.md (29159b), requirements.txt (17b), scripts/data/ai_prompts.toml (46045b), scripts/data/db_translate.json (11634b), scripts/Start_QuantAll.py (83b), scripts/UpdateStock_skill.py (89115b), skill-card.md (2732b), SKILL.md (12841b), _meta.json (132b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: quantall-mcp\ndescription: >\n  QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。\n  AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。\n  让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。\n  触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。\n  不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。\n  能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、\n  修改 MCP 配置、启动本地 HTTP 服务（localhost:8686）、创建配置文件和启动脚本。\n  所有涉及用户电脑的操作，AI 必须事先告知用户并获得同意。\n  UpdateStock 为可选辅助 MCP（数据库管理，需 tushare API），非 QuantAll 必需。\nagent_created: true\nlicense: MIT\n---\n\n# QuantAll（全A解析）MCP 技能\n\n---\n\n## 这是什么\n\nQuantAll 是一台运行在用户本地电脑上的**全市场向量化计算引擎**。它把 A 股 5000+ 只股票、150+ 维度的数据组织为统一矩阵，AI 只需编写简短的 Python 向量化代码片段，就能在数秒内完成全市场运算——因子计算、策略回测、IC 分析、多维可视化。\n\n**对 AI 的意义**：不再只是\"查询信息然后转述\"，而是能**用代码算出客观结果**。用户问\"小盘股是不是比大盘股表现好\"，AI 不需要去搜索别人的观点，而是直接用全市场数据算出 IC 指标、回测收益，给出有数据支撑的结论。这是从\"数据搬运工\"到\"数据分析师\"的根本转变。\n\n> **工具详细用法**（参数、触发场景、代码模板、核心函数）在 `scripts/data/ai_prompts.toml` 中，MCP 连接后 AI 自动获取。SKILL.md 只讲顶层定位、安装、启动、更新和 AI 行为规范。实战案例参见 `references/quantall_playbook.md`。\n\n---\n\n## 架构\n\n| 组件 | 类型 | 定位 | 依赖 |\n|------|------|------|------|\n| **QuantAll**（全A解析） | HTTP MCP (localhost:8686) | 计算引擎：因子计算/回测/IC分析/可视化 | 本地 DuckDB 数据库 |\n| **UpdateStock** | stdio MCP（可选） | 数据库管理：创建/更新/查询行情 | tushare API key |\n\n两者共用同一个 DuckDB 数据库，路径通过 `scripts/DB_setting.json` 管理。**QuantAll 独立可运行，UpdateStock 不是必需依赖**——有自己的数据库或仅用内置测试库即可。\n\n---\n\n## 📦 安装（首次安装，AI 必读）\n\n> ⚠️ **AI 行为规范**：安装前必须告知用户以下操作内容并获得同意：\n> - 在 `scripts/` 下创建 Python 虚拟环境（约 45 个依赖包，300MB+ 磁盘空间）\n> - 从清华 PyPI 镜像源下载安装 quantall 库\n> - 修改 `~/.workbuddy/mcp.json` 添加 MCP 服务配置\n> - 后续启动时会运行本地 HTTP 服务（localhost:8686）并可能弹出用户协议窗口\n\n```\n□ 1. 创建 venv：\n   <Python路径> -m venv <skill-dir>/scripts/.venv\n   推荐：C:/Users/<用户>/.workbuddy/binaries/python/versions/3.13.12/python.exe\n\n□ 2. pip 安装（务必用清华源，否则 PySide6 等大包下载超时）：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 3. 验证安装：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"from QuantAll import Start_main; print('OK')\"\n\n□ 4. 配置 MCP（修改 ~/.workbuddy/mcp.json）：\n   见下方 MCP 配置\n\n□ 5. 启动服务：\n   <skill-dir>/scripts/.venv/Scripts/python.exe <skill-dir>/scripts/Start_QuantAll.py\n   检查 8686 端口是否监听\n\n□ 6. ⚠️ 提醒用户重连 MCP 连接器（或重启 WorkBuddy）\n```\n\n**常见坑**：\n- **Git Bash 路径**：传参给 Python 必须用 `C:/` 前缀（非 `/c/`），否则双重转义找不到文件\n- **safe-delete 冲突**：WorkBuddy Python 运行时可能拦截 pip 文件覆盖，报 `SAFE_DELETE_FAIL_CLOSED`。解决：重建 venv（`rm -rf .venv && python -m venv .venv`）后重试，或用 `dangerouslyDisableSandbox: true`\n- **import 大小写**：`from QuantAll import ...`（大写 Q、A），`import quantall` 会失败\n\n### MCP 配置\n\n```json\n{\n  \"mcpServers\": {\n    \"全A解析\": { \"url\": \"http://127.0.0.1:8686/mcp\", \"disabled\": false },\n    \"UpdateStock\": {\n      \"command\": \"<skill-dir>/scripts/.venv/Scripts/python.exe\",\n      \"args\": [\"<skill-dir>/scripts/UpdateStock_skill.py\"],\n      \"disabled\": false\n    }\n  }\n}\n```\n\n> UpdateStock 可选——不配置也能用 QuantAll。仅需要计算引擎时只配「全A解析」。\n\n### 数据库\n\nQuantAll 首次启动自动创建 `scripts/DB_setting.json`，默认连接 pip 包内置的 Test.duckdb（仅沪深300近两年基础行情，**仅供测试，pip 更新会覆盖**）。\n\n正式使用需切换到自己的数据库（修改 `db_path`）：\n\n| 方案 | 说明 |\n|------|------|\n| A. 内置 Test.duckdb | pip 包自带，仅沪深300近两年基础行情，仅供测试 |\n| B. UpdateStock 创建 | 需 tushare：2000+ 积分全市场 / 200 积分免费精简版 |\n| C. 自有数据库 | 修改 `DB_setting.json` 的 `db_path` 直连 |\n\n> ⚠️ **AI 行为规范**：修改 `DB_setting.json` 前告知用户当前数据库路径和将要切换的目标路径。\n\n### 桌面快捷方式（可选，AI 主动询问）\n\n安装后 AI 应主动询问：\"是否需要创建桌面快捷方式？\"创建 `scripts/run.bat`（后台启动，无控制台窗口），再为它创建桌面 `.lnk`。\n\n> ⚠️ **不要在桌面创建 .bat 文件**——Windows cmd 以 GBK 读取 .bat，AI 写入的 UTF-8 中文会乱码。正确做法：先创建 `scripts/run.bat`，再创建指向它的桌面 `.lnk`。\n\n---\n\n## 🚀 启动\n\nQuantAll 是独立的 HTTP 服务，**不依赖 UpdateStock 启动**。三种方式任选其一：\n\n| 方式 | 操作 | 适用场景 |\n|------|------|---------|\n| AI 调用 | 通过 UpdateStock MCP 的 `Start_QuantAll` 工具 | AI 场景，可自动检测端口 |\n| 双击 run.bat | 后台启动，无控制台窗口 | 手动场景最方便 |\n| 命令行 | `<skill-dir>/scripts/.venv/Scripts/python.exe Start_QuantAll.py` | 调试或自定义 |\n\n> ⚠️ **AI 行为规范**：启动服务前告知用户——QuantAll 将在本地 8686 端口启动 HTTP 服务，并可能弹出用户协议确认窗口。\n\n**用户协议**：首次启动弹协议窗口，点击确认即\"激活\"（永久同意），功能无差异。未确认前除 `ping` 外所有工具被阻止（合规要求）。\n\n**MCP 重连**：QuantAll 后于 AI 启动时，需断开重连 MCP 连接器（或重启 WorkBuddy）。首次连接需点击\"信任\"授权。\n\n---\n\n## 🔄 更新/升级\n\n> **核心规则**：技能包文件更新后，Python 库 `quantall` 也必须同步升级，否则新接口在旧库上会报错。\n\n```\n□ 1. 升级库：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install --upgrade quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 2. 验证版本：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"import QuantAll; print(QuantAll.__version__)\"\n   确认 >= requirements.txt 要求的版本\n\n□ 3. 重启 QuantAll 服务（先关旧进程再启动）\n\n□ 4. ⚠️ 提醒用户重连 MCP\n```\n\n- safe-delete 冲突时：先 `pip uninstall quantall`，再 `pip install quantall`\n- `pip install --upgrade` 是幂等的，不确定是否需要升级时直接执行\n- 版本检测：对比 `_meta.json` 的 version 与已安装库 `QuantAll.__version__`\n\n---\n\n## ⚠️ AI 操作用户电脑的行为规范\n\n本技能涉及多项用户电脑操作。AI 执行前**必须告知用户**将要做什么、产生什么影响：\n\n| 操作 | 告知内容 |\n|------|---------|\n| 创建 venv | 将在 `scripts/` 下创建虚拟环境（约 300MB 磁盘空间） |\n| pip install | 从清华源下载约 45 个包（含 PySide6 等大型包） |\n| 修改 mcp.json | 将添加 MCP 服务配置到 `~/.workbuddy/mcp.json` |\n| 启动服务 | 将在 localhost:8686 启动 HTTP 后台服务 |\n| 创建文件 | 可能创建 `DB_setting.json`、`run.bat`、桌面 `.lnk` 快捷方式 |\n| 修改数据库路径 | 将修改 `DB_setting.json` 的 `db_path`，影响 QuantAll 读取的数据 |\n\n> **原则**：不在用户不知情的情况下执行任何系统操作。涉及文件创建、配置修改、服务启动等操作前，先说明意图，获得用户同意后再执行。\n\n---\n\n## 工具总览\n\n安装并连接 MCP 后，AI 通过 `scripts/data/ai_prompts.toml` 自动获取每个工具的详细用法（参数、触发场景、代码模板、核心函数）。以下是概览：\n\n| 工具 | 用途 |\n|------|------|\n| `ping` | 健康检查 |\n| `available_data` | 查看可用数据字段 |\n| `how_code` | 查看代码执行环境说明 |\n| `strategy_backtest` | 策略回测（收益/夏普/回撤/胜率） |\n| `factor_analysis` | 因子 IC 分析 |\n| `batch_factor_analysis` | 批量因子 IC 分析 |\n| `batch_factor_corr` | 因子间批量相关性计算 |\n| `save_factor_result` | 保存因子分析结果到数据库 |\n| `new_layer_from_code` | 创建可视化图层标记 |\n| `select_by_code` | 筛选股票（集合运算） |\n| `batch_select` | 批量筛选（多条件对比/交集/并集） |\n| `move_by_code` | 坐标平移映射 |\n| `weight_by_code` | 权重设置 |\n| `batch_weight` | 批量权重对比（多权重方案） |\n| `heat_map` | 热力图统计 |\n| `get_user_selection` | 获取用户 GUI 交互选中 |\n|`run_task_file`|执行本地json文件的任务，构建稳定任务流程|\n|`execute_python_script`|执行本地python脚本，在构建任务流程中可扩展功能|\n| `MCP_Close` | 关闭服务 ⚠️（仅不再需要时调用） |\n\n\n### AI 使用前必知\n\n- **先 ping 确认服务就绪**，未启动则引导用户启动\n- **先 available_data 确认字段**，不要假设字段名（数据库字段名经 `db_translate.json` 翻译层映射为中文）\n- **不支持并行调用**，所有工具串行执行（一个返回后再发下一个）\n- **代码必须向量化**：禁止 import / 循环 / lambda / axis=1，最后一行设 `out = ...`\n- **复权价格手动算**：`adj_close = d['close'] * d['adj_factor']`\n- **每股因子必须除以 close**（非复权价），比率类/增长率类不需要\n- **持仓矩阵必须用 `hold_until(buy, sell)`**，禁止手写逆序 cumsum\n- **内置函数**：`hold_until`/`entry_check`（持仓）、`time_at`/`time_between`/`time_in`（时间）、`row_rank`（截面排名）、`row_top_n`/`row_bottom_n`（截面 Top/Bottom N 筛选）\n- **detail 视图返回约 140 万字符**，AI 内部分析后只汇报结论，禁止直接展示\n\n> 详细参数说明、触发场景、代码模板、核心函数参考：`scripts/data/ai_prompts.toml`\n> 实战案例、模式对比、踩坑记录：`references/quantall_playbook.md`\n\n---\n\n## 版本历史\n\n- **v1.0** — 首版发布。13 个工具，配套 ai_prompts.toml 和 playbook 实战手册。PyPI 在线安装。\n- **v1.0.1** — 新增技能升级流程；requirements.txt 更新为 >=1.0.1；SKILL.md 精简至 500 行以内。\n- **v1.0.2** — 优化 clawhub 审查问题：触发条件收窄（仅明确量化需求时触发）、能力声明透明化（venv/pip/mcp.json/HTTP 服务全部显式声明）、新增 AI 操作用户电脑的行为规范表、详细工具用法指向 ai_prompts.toml 不在 SKILL.md 展开。新增批量分析工具 `batch_weight`/`batch_select`（对应 `weight_by_code`/`select_by_code` 的批量版本）。新增 `batch_factor_corr`（因子间批量相关性计算，支持自定义基准因子）。新增 `how_code`（代码执行环境说明，帮助 AI 快速上手）。新增 exec 内置函数 `row_top_n(df,n)`/`row_bottom_n(df,n)`（截面 Top/Bottom N 筛选）。热力图/直方图统计新增 `summary` 评估参数（分布均匀度/边缘突发等）。`batch_weight` 新增 `view` 参数（summary=评估参数/heatmap=完整矩阵）及\"权重未改变\"提示。`batch_select` mode 重命名为描述性名称（independent_summary/independent_heatmap/intersect/union）。修复批量因子分析执行异常及 batch_select intersect/union/independent 模式 bug。requirements.txt 固定版本号。\n-**v1.0.3**—requirements.txt 更新为 ==1.0.4，pip install --upgrade quantall 更新。新增技能`run_task_file`和`execute_python_script`。`batch_factor_corr`和`batch_factor_analysis`新增保存本地excel。新增`UpdateStock_script.py`数据库更新脚本。\n-**v1.0.4**—requirements.txt 更新为 ==1.0.8，pip install --upgrade quantall 更新。新增技能增加对mcp2.0.0版本的支持。\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn798etnj1hernzd0bqw4cg9yx86fkc9\",\n  \"slug\": \"quant-all-mcp\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1786359447431\n}\n\nFile v1.0.4:references/quantall_playbook.md\n\n# QuantAll 实战手册\n\n> 本文件是 QuantAll（全A解析）的使用经验积累文档。SKILL.md 负责\"怎么装、有什么工具\"，\n> 本文档负责\"怎么用好\"——实战模式、代码示例、踩坑记录。\n>\n> **AI 使用建议**：执行复杂分析任务前先快速浏览本文档，了解常见模式和陷阱。\n\n---\n\n## 1. 快速上手（5 分钟）\n\n### QuantAll 是什么\n\n一台本地计算引擎。你（AI）写一段向量化 Python 代码，它就在全市场 5000+ 只股票上并行执行，\n数秒内返回结果。**你不是在查询数据，你是在计算数据。**\n\n### 你能做什么\n\n| 你想要的 | 用什么工具 | 输出 |\n|----------|-----------|------|\n| 评估一个交易策略的收益 | `strategy_backtest` | 收益率/夏普/回撤/胜率 |\n| 验证某个因子是否有效 | `factor_analysis` | IC均值/IR/多空差 |\n| 找出符合条件的股票 | `select_by_code` | 股票列表 |\n| 探索数据的多维关系 | `move_by_code` + `heat_map` | 热力图统计矩阵 |\n| 标记事件/买点 | `new_layer_from_code` | 可视化短线 |\n\n### 你的代码执行环境\n\n```python\n# 可用的变量\nd          # dict[str, DataFrame] — 字段名 → 全市场面板数据（行=时间，列=股票）\ncol_attrs  # dict[str, Series]     — 股票属性（行业、市值等）\n\n# 内置模块\nnp, pd     # numpy + pandas\n\n# 内置函数\nhold_until(buy, sell)  # 生成持仓矩阵（回测必须用这个！）\nrow_rank(df)           # 截面排名 → 百分位值 0~1\nentry_check(window, conditions, mode=\"keep\")  # 买入窗口条件检测\ntime_at(rq)            # 匹配指定时间\ntime_between(srq, erq) # 匹配时间区间\ntime_in(rqs)           # 匹配多个时间\n\n# 复权价格（必须手动算！）\nadj_close = d['close'] * d['adj_factor']\nadj_high  = d['high']  * d['adj_factor']\nadj_low   = d['low']   * d['adj_factor']\n```\n\n### 数据库数据传播规则\n\n> **财报数据**（`stock_finance` 表）：会自动把公告日的数据**向后传播**（forward fill）到下一个公告日。也就是说，当你取任意日期的财报数据（如 ROE、营业收入），它会填充为最近一次公告的值——不会出现 NaN 空洞。\n>\n> **分红数据**（`dividend` 表）和**业绩预告数据**（`forecast` 表）：目前**只在公告日当天有数据，不会向后传播**。原因是\"传播到哪个日期\"存在技术细节难以确定（公告日和实际影响日之间的时间差不确定）。未来可能会增加相关操作，但目前这两张表取非公告日的数据就是 NaN。\n>\n> 含义：如果你在因子中使用分红率、预告净利润等字段，要意识到它们只存在于公告日期点上，不适合做连续的日频截面分析。\n\n### 三条铁律\n\n1. **禁止 import、for/while 循环、df.apply()、lambda、递归**\n2. **禁止 axis=1（行方向计算）**——各股票停牌时间不对齐\n3. **持仓矩阵必须用 `hold_until(buy, sell)`**，不能手写逆序 cumsum\n\n---\n\n## 2. strategy_backtest 四种视图详解\n\n> **关键认知**：`strategy_backtest` 有四个 view 模式，它们**不是\"选一个最好\"的关系**，而是**从不同维度拆解同一个策略**。标准分析流程是 `summary → segments → detail → timeline`（逐步深入）。\n\n### 四种视图对比\n\n| view | 粒度 | 回答什么问题 | 后续分析 | 绘图方式 |\n|------|------|-------------|----------|----------|\n| **summary** | 每只股票 | \"这个策略整体好不好？\" | ✅ select/move/weight/heat_map | 5585条收益曲线叠加 |\n| **segments** | 每次交易 | \"买入前什么因子影响收益？\" | ✅ 核心：分析因子与收益关系 | 持仓片段（起点=买入日） |\n| **detail** | 每只股票 | \"哪只股票表现最好/最差？\" | ✅ 同 summary | 和 summary 同一张图 |\n| **timeline** | 每日 | \"每日净值走势？时间分布？\" | ❌ **不支持二次分析** | 几条合成曲线（净值/排名/持仓比）\n\n### summary 输出结构\n\n```json\n{\n  \"分析的股票数量\": <N>,\n  \"时间范围\": \"<start> 至 <end>\",\n  \"盈利比率-%\": <百分比>,\n  \"跑赢基准比率-%\": <百分比>,\n  \"全局买入比\": <比率>,\n  \"全局持仓比\": <比率>,\n  \"统计分析\": {\n    \"总收益率-%\": { 平均值, 中位数, 最大值, 最小值, 标准差, 25%分位, 75%分位 },\n    \"年化收益率-%\": { ... },\n    \"最大回撤-%\": { ... },\n    \"夏普率\": { ... },\n    \"胜率-%\": { ... },\n    \"盈亏比\": { ... },\n    \"基准收益率(自身)-%\": { ... }\n  }\n}\n```\n\n> **如何使用 summary**：先看中位收益率和夏普率判断策略是否有价值，再看盈利比率和跑赢基准比率判断策略相对 buy&hold 的表现。分布偏度（均值 vs 中位数）可以判断是否少数牛股拉高均值。\n\n### segments 输出结构 + 绘图逻辑\n\n```json\n{\n  \"持仓片断总数\": <N>,\n  \"平均收益-%\": <平均>,\n  \"最大收益-%\": <最大值>,\n  \"最小收益-%\": <最小值>,\n  \"平均持仓时间\": <天数>,\n  \"最长持仓时间\": <天数>,\n  \"最短持仓时间\": <天数>\n}\n```\n\n**图形绘制方式**：\n\n```\nsegments 模式不是单只股票画一条线，而是把每段\"买入→卖出\"独立画成一条线。\n\n- 起点：每段买入日，坐标 (0, 1.0) —— 买入时收益为 1x（基准）\n- 终点：每段卖出日，坐标 (持仓天数, 卖出收益倍数)\n- X 轴：持仓天数（从 0 到 offset_days 或实际卖出天数）\n- Y 轴：收益倍数（1.0 = 买入点，向上 = 盈利，向下 = 亏损）\n- 红色：盈利片段（Y>1）\n- 绿色/青色：亏损片段（Y<1）\n- 一只股票多段持仓 → 被拆分成多条独立线段\n```\n\n**后续分析方法（每个片段的买入时间是关键日期）**：\n- `select_by_code`：按收益倍数筛选，或按持仓天数筛选——返回**片段维度**统计（权重=卖价/买价，非股票维度累计收益）\n- **核心设计**：segments 的真正价值不是看收益本身，而是分析\"**买入前**的各种参数和因子对最终收益的影响\"——把买入时的市值/换手率/估值等用 move_by_code 映射到坐标轴，再用 heat_map 做交叉分析\n- `move_by_code`：把买入时的因子值映射到 X/Y 轴（如买入时市盈率→X，买入时成交量→Y）\n- `weight_by_code`：调整权重（如按持仓天数加权）\n- `heat_map`：因子×收益的二维分布矩阵\n\n#### detail 输出结构\n\n```json\n{\n  \"总收益率-%\":    { \"000001\": <值>, \"000002\": <值>, ... },  // 每只股票逐一展开\n  \"年化收益率-%\":  { \"000001\": <值>, \"000002\": <值>, ... },\n  // 与 summary.statistics 的指标一一对应，但按股票逐一展开\n}\n```\n\n**⚠️ 重要警告**：\n- detail 返回数据量极大（全市场 × 多个指标），可能远超 AI 上下文窗口\n- **禁止直接向用户展示原始 detail 数据**——等于没展示\n- **正确做法**：AI 读取后自行分析（排序、筛选 Top/Bottom、找规律），只汇报结论\n- 推荐用法：筛选表现最好和最差的各 10 只 → 分析共性/原因\n\n#### timeline\n\n**绘制内容**：不画持仓片段，而是绘制 **5 条合成曲线**：\n\n| 曲线 | 颜色 | 含义 |\n|------|------|------|\n| **每日平均收益** | 🔴 红色 | 每天策略持仓的平均收益百分比 |\n| **平均收益排名** | 🟡 黄色 | 每天策略收益在全体股票中的排名均值 |\n| **持平股数/总股数** | 🔵 青色 | 当天持平（没变动）的股票占比 |\n| **买入股数/总股数** | ⚪ 白色 | 当天发出买入信号的股票占比 |\n| **卖出股数/总股数** | 🟣 紫色 | 当天发出卖出信号的股票占比 |\n\n**标题栏显示 5 条线的均值**，格式如：`收益%分布:X.XX 收益排序分布:X.XX 持仓比:X.XX 买点比:X.XX 卖点比:X.XX`\n\n**核心用途**：观察时间分布规律——哪些时间段收益好、哪些时间段回撤大、market timing 是否有效。\n\n**⚠️ 不支持二次分析**：timeline 是\"只读\"视图，不能用 `select_by_code`、`move_by_code`、`weight_by_code`、`heat_map` 等工具做进一步操作。看完就完了，想深入分析需要切到其他 view。\n\n### 四视图使用决策树\n\n```\n跑 strategy_backtest\n  │\n  ├─ view=summary → 总收益中位数为正？夏普>0.5？\n  │   ├─ 否 → 策略不行，换一个\n  │   └─ 是 → 继续\n  │\n  ├─ view=segments → 买入前因子对收益有什么影响？\n  │   核心操作：move_by_code（映射因子）+ heat_map（交叉分析）\n  │\n  ├─ view=detail → AI 内部分析 Top/Bottom 股票\n  │   给用户：Top 10 股票名称+收益、Bottom 10、行业分布规律\n  │   ⚠️ 绝不直接展示原始数据\n  │\n  └─ view=timeline → 查看时间分布规律\n      └─ ⚠️ 只读视图，不支持二次分析。看完切其他 view\n```\n\n### 从 summary 图开始的后续分析\n\n`strategy_backtest`（view=summary）执行后，软件端会绘制全市场持仓收益叠加图。这张图不是终点，而是后续深入分析的**起点**。\n\n#### 用 `select_by_code` 筛选图上数据\n\n`select_by_code` 可以对 summary 图上的所有股票进行条件筛选。**它不只是筛选器——天生自带统计功能**。返回结果中直接包含：\n\n```json\n{\n  \"全局平均\": <数值>,          // 选中股票的平均权重（默认=回测最终收益）\n  \"有效数量\": <N>,             // 实际命中的股票数\n  \"权重名称\": \"<指标名>\",      // 当前权重指标名称\n  \"Y轴统计\": [...],            // 如果有 move_by_code，按 Y 轴分 bin\n  \"Y轴细分\": [...],            // bin 边界\n  \"Y轴缩放\": <值>\n}\n```\n\n> 💡 **核心认知**：不用先 `select_by_code` 再 `heat_map`，select_by_code 本身就返回 `全局平均`——你可以直接知道\"这批股票的均值是多少\"。\n\n常见筛选维度：\n\n- **属性**：`col_attrs['所在城市']`、`col_attrs['所属行业']`（Series，直接对比）\n- **关键日**：用 `time_at` 取某一天的数值（如某日涨幅大的股票）→ bool DataFrame → 广播成全维度 DataFrame\n\n> ⚠️ **使用某一天数值的正确方法**：`select_by_code` 等工具要求 `out` 是与 `d['close']` 同维度的 DataFrame，不能直接用某天的 Series。**正确做法**是用 `time_at` 生成 bool DataFrame，把目标日数值广播到全维度——全程向量化，无需循环（`for` 循环在 exec 环境中本就禁止）：\n> ```python\n> # 筛选某日涨幅>阈值的股票（向量化方法）\n> ret = (d['close'] * d['adj_factor']).pct_change()\n> # 1. time_at 获取 bool DataFrame，True→1，False→NaN\n> mask = time_at('目标日期').astype(float)\n> mask = mask.where(mask > 0, np.nan)\n> # 2. 乘上对应因子的数值（目标日有值，其余为 NaN）\n> day_ret = mask * ret\n> # 3. 向前向后填充 NaN（把目标日数值传播到所有日期）\n> day_ret = day_ret.ffill().bfill()\n> # 4. 添加条件\n> out = day_ret > 阈值\n> ```\n\n> ⚠️ **select_by_code 不回测数据过滤**：`select_by_code` 只影响 GUI 图层显示，不会过滤 `strategy_backtest` 的股票范围。想只测某个子集 → 需要其他方式（或观察 select_by_code + heat_map 的统计结果）。\n\n#### 用 `move_by_code` 和 `weight_by_code` 控制绘图\n\nSummary 图的坐标和权重是可以调整的：\n- **平移（move_by_code）**：把其他维度映射到 X 或 Y 轴，实现多维视图。例如把市值映射到 X 轴，看市值与收益的关系\n- **权重（weight_by_code）**：默认按最终收益加权，一般不需要修改。但你可以按自定义规则加权（如按持仓天数加权）\n\n> 同样注意：平移/权重输出必须是和 `d['close']` 同维度的 DataFrame。若需用某一天数值，同样用 `time_at` + 填充广播（见上方方法），不要用 `for` 循环复制\n\n#### 做内力图（热力图分析）\n\n筛选出子集后，可以进一步做**内力图**（多维热力图）：\n\n```\nselect_by_code（筛选子集）\n  → move_by_code(x)（映射维度，如市值）\n  → move_by_code(y)（映射维度，如换手率）\n  → weight_by_code（可选：调整权重）\n  → heat_map（获取二维统计矩阵）\n  → 分析矩阵密度分布\n```\n\n#### 操作链：从 summary 到深度分析\n\n```\nstrategy_backtest(summary) → 画全市场图\n  ↓\nselect_by_code（筛选行业/城市/关键日）\n  ↓\n  ├─ 再跑 strategy_backtest（只测筛选子集）→ detail/segments 看明细\n  ├─ 或 move_by_code + weight_by_code → 调整绘图维度\n  ├─ 或 new_layer_from_code → 标记新事件\n  └─ 或 heat_map → 内力图做多维交叉分析\n```\n\n---\n\n## 3. factor_analysis 三项模式详解\n\n> **核心认知**：`factor_analysis` 有三个 mode，和 `strategy_backtest` 的 view 一样，是从不同维度评估因子有效性。\n\n### 三种模式对比\n\n| mode | MCP 返回 | 软件端绘图 | 后续分析 | 核心用途 |\n|------|---------|-----------|----------|---------|\n| **summary** | 聚合统计（IC均值/IR/正占比/多空差） | 散点图：X=收益排序，Y=因子排序，红=高收益，绿=低收益 | **支持** `move_by_code` + `heat_map` + `select_by_code` | **第一步必跑**，判断因子是否有效 |\n| **daily** | 每日IC时间序列 + 每日前/后10%IC | 时序曲线图：X=时间，Y=IC值，三条曲线（蓝=每日IC/红=前10%/绿=后10%） | **不支持**（只读视图） | 看IC时序稳定性、时段特征 |\n| **scatter** | 同 summary 的聚合统计 | 时序散点图：X=时间（按天排列，每天因子排序缩放到0-0.8）+ 因子排序，Y=因子排序，红=高收益，绿=低收益 | **支持** 在时间维度上进一步分析 | 观察因子-收益关系随时间的演变，局部放大可做切片分析 |\n\n> **关键区别**：\n> - `summary` 是**全局截面**散点——所有(日期,股票)混在一起，看整体因子-收益关系\n> - `scatter` 是**时序截面**散点——每个时间切片（一天）独立排列，能看到垂直条纹（不同日期的IC强度差异），局部放大可分析特定时段\n> - `daily` 是**纯时序曲线**——只看IC随时间的变化，不支持二次分析\n> \n> `scatter` 和 `summary` 返回同样的聚合统计数据，但绘图方式不同、后续分析能力不同。`daily` 是只读视图。\n\n### daily 模式返回格式\n\n```json\n{\n  \"每日IC信息\": \"                每日IC  每日前10%IC  每日后10%IC\\nYYYY-MM-DD -0.XXXXX -0.XXXXX -0.XXXXX\\n...\"\n}\n```\n\n- **每日IC**：每天的 Rank IC（Spearman 秩相关）\n- **每日前10%IC**：因子值最高 10% 股票的 IC 贡献\n- **每日后10%IC**：因子值最低 10% 股票的 IC 贡献\n- **最后 `feature_days` 行全为 NaN**——因为没有足够未来数据计算\n\n### 实战用法\n\n```python\n# 单因子分析\nfactor_analysis(name=\"换手率\", code=\"out = d['换手率']\", feature_days=20, mode=\"summary\")\n\n# 复合因子（各自排名后等权组合）\nfactor_analysis(\n    name=\"低换手小市值\",\n    code=\"turnover_rank = row_rank(d['换手率'])\\nsize_rank = row_rank(d['总市值'])\\nout = (1 - turnover_rank) + (1 - size_rank)\",\n    feature_days=20,\n    mode=\"summary\"\n)\n\n# 动量因子\nfactor_analysis(\n    name=\"20日动量\",\n    code=\"adj_close = d['close'] * d['adj_factor']\\nout = adj_close.pct_change(20)\",\n    feature_days=20,\n    mode=\"daily\"  # 看 IC 时序稳定性\n)\n```\n\n> ⚠️ **注意**：`factor_analysis` 内部已自动做排名转换（Spearman Rank IC），代码中不需要手动 `row_rank()`。但如果要组合多个因子，需要手动 rank 后再组合（确保量纲一致）。\n\n### 因子分析涉及的关键指标\n\n| 指标 | 含义 | 使用建议 |\n|------|------|---------|\n| IC均值 | 因子值与未来收益的 Spearman 秩相关系数均值 | 绝对值越大越好，正=因子值越高收益越高 |\n| IC_IR | IC均值 / IC标准差 | 衡量因子的风险调整后预测力，通常 \\|IR\\|>0.3 视为有效 |\n| IC正占比 | IC>0 的天数比例 | 偏离50%越多越好 |\n| 多空差 | 因子值最高组 vs 最低组的收益差 | 衡量因子区分度 |\n| feature_days | 评估未来第 N 天的收益 | 长周期（20d）通常比短周期（5d）IC更强 |\n\n### 因子分析 decision tree\n\n```\n跑 factor_analysis\n  │\n  ├─ mode=summary → |IC_IR| > 0.3？IC正占比偏离50%？\n  │   ├─ 否 → 因子无效，换一个\n  │   └─ 是 → 继续\n  │\n  ├─ mode=daily → IC 时序稳定？有没有长期同符号？\n  │   如果频繁正负翻转 → 因子不稳定，时效性强\n  │   ⚠️ 只读视图，不支持二次分析\n  │\n  └─ mode=scatter → 查看时序截面分布（软件端可视化）\n      全局看垂直条纹（时间维度IC差异），局部放大做切片分析\n      支持 move_by_code / heat_map 在时间维度上进一步挖掘\n```\n\n---\n\n## 4. 三大场景操作手册\n\n### 场景一：用户有明确需求\n\n用户直接要求回测、因子分析、选股等。\n\n**标准流程**：\n```\nping → available_data（确认字段存在）→ 写 code → 执行工具 → summary 快评 → 按需深入\n```\n\n**常见模式**：\n\n```python\n# 回测需求 → strategy_backtest（先 summary，再 detail/timeline）\nadj_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)\n```\n\n```python\n# 因子分析 → factor_analysis\nout = d['换手率']  # 简单因子直接输出字段\n# 或复合因子：\nm_rank = row_rank((d['close'] * d['adj_factor']).pct_change(20))\ns_rank = row_rank(d['总市值'])\nout = 0.6 * m_rank + 0.4 * (1 - s_rank)\n```\n\n### 场景二：用户模糊表述想法\n\n用户没说\"回测\"或\"因子分析\"，但表达了与股市相关的直觉或疑问。\n\n**关键原则**：把\"模糊想法\"翻译成\"可计算的量化问题\"。\n\n**判断清单**（用户说什么 → 你可以算什么）：\n\n| 用户的模糊表述 | 可量化的分析 | 用什么工具 |\n|-------------|------------|-----------|\n| \"XX 之后一般会涨还是跌？\" | 事件发生后 N 日收益的统计 | `strategy_backtest` |\n| \"XX 是不是影响收益？\" | 因子 IC 分析 | `factor_analysis` |\n| \"哪些股票最近 XX？\" | 条件筛选 | `select_by_code` + `new_layer_from_code` |\n| \"XX 和 YY 有什么关系？\" | 双因子多维分析 | `move_by_code` × 2 + `heat_map` |\n| \"最近 X 类型的股票表现如何？\" | 筛选 + 最近 N 日涨跌幅 | `select_by_code` + `move_by_code` |\n\n**标准流程**：\n```\n理解用户意图 → 翻译成可量化问题 → available_data（确认有对应字段）\n→ 写 code → 执行 → 读结果 → 用数据回答（而非\"网上说...\"）\n```\n\n### 场景三：AI 自主挖掘机会\n\n你主动设计分析假设，利用 QuantAll 的技术闭环验证。\n\n**技术闭环**：\n```\n假设 → code → QuantAll 执行 → 读返回数据 → 形成结论 → 可能迭代\n```\n\n**可以做的事情**：\n- 扫描多个因子的 IC，找出近期有效的因子\n- 测试常见技术指标在过去 N 年的胜率\n- 组合多因子看看有没有协同效应\n- 按行业分组分析因子表现差异\n\n**注意事项**：\n- 每个假设用独立的工具调用，不要一次跑太多\n- 先 `available_data` 确认字段可用\n- 把结论和原始数据一起呈现给用户（提供不确定性范围，不要过度自信）\n- 结论里标注用的是哪个参数、哪个时间段\n\n---\n\n## 5. 代码模式库\n\n### 穿越信号\n\n```python\n# 上穿阈值\ncross_up   = (val > threshold) & (val.shift(1) <= threshold)\n\n# 下穿阈值\ncross_down = (val < threshold) & (val.shift(1) >= threshold)\n\n# DataFrame vs DataFrame 金叉/死叉（两边都要 shift！）\ngolden_cross = (ma_short > ma_long) & (ma_short.shift(1) <= ma_long.shift(1))\ndead_cross   = (ma_short < ma_long) & (ma_short.shift(1) >= ma_long.shift(1))\n```\n\n### 技术指标实现\n\n```python\n# RSI (14)\nadj_close = d['close'] * d['adj_factor']\ndelta = adj_close.diff()\ngain  = delta.clip(lower=0).rolling(14).mean()\nloss  = (-delta.clip(upper=0)).rolling(14).mean()\nrsi   = 100 - 100 / (1 + gain / loss)\n\n# KDJ\nadj_close = d['close'] * d['adj_factor']\nlow_c  = d['low']  * d['adj_factor']\nhigh_c = d['high'] * d['adj_factor']\nlow9   = low_c.rolling(9).min()\nhigh9  = high_c.rolling(9).max()\nrsv    = (adj_close - low9) / (high9 - low9) * 100\nk_val  = rsv.ewm(com=2, adjust=False).mean()\nd_val  = k_val.ewm(com=2, adjust=False).mean()\nj_val  = 3 * k_val - 2 * d_val\n\n# 波动率\nret    = (d['close'] * d['adj_factor']).pct_change()\nvol_20 = ret.rolling(20).std()\n\n# 成交量放量\nvol_ma_20   = d['vol'].rolling(20).mean()\nvolume_spike = d['vol'] > vol_ma_20 * 2\n```\n\n### 持仓矩阵生成（必须用 hold_until）\n\n```python\n# 标准双信号\nbuy  = ...  # bool DataFrame\nsell = ...  # bool DataFrame\nout  = hold_until(buy, sell)\n\n# 多卖点（多个卖出条件自动 OR 合并）\nout = hold_until(buy, [sell1, sell2, sell3])\n```\n\n### 多因子组合\n\n```python\n# 各自排名 → 加权组合\nf1_rank = row_rank(d['因子1'])\nf2_rank = row_rank(d['因子2'])\nf3_rank = row_rank(1 - d['因子3'])  # 反向因子用 1 - rank\nout = 0.5 * f1_rank + 0.3 * f2_rank + 0.2 * f3_rank\n```\n\n---\n\n## 6. 常见错误和解决方案\n\n### E1：axis=1 行方向计算\n\n**症状**：代码里用了 `axis=1` 的聚合或排序\n**原因**：各股票停牌时间不同，行不对齐\n**解决**：所有计算按列方向（axis=0 / 默认），不要跨股票比较同一行\n\n### E2：忘记复权\n\n**症状**：回测结果看起来不对\n**原因**：直接用 `d['close']` 而没用 `d['close'] * d['adj_factor']`\n**解决**：所有价格运算前先手动乘 adj_factor\n\n### E3：手写逆序 cumsum 而非 hold_until\n\n**症状**：持仓矩阵逻辑错误，出现\"空仓但没卖\"、\"持仓但没买\"\n**原因**：逆序 fill/cumsum 的逻辑容易出错\n**解决**：全部改用 `hold_until(buy, sell)`\n\n### E4：穿越信号两边忘记 shift\n\n**症状**：信号在当天产生而非次日\n**原因**：DataFrame 交叉时只 shift 了一边\n**解决**：两边都 shift：`(A > B) & (A.shift(1) <= B.shift(1))`\n\n### E5：字段名不存在\n\n**症状**：代码引用了不存在的字段\n**解决**：先调用 `available_data` 确认字段名。数据库内原始字段名与 AI 看到的名称中间有 `db_translate.json` 翻译层\n\n### E6：factor_analysis 中重复 row_rank\n\n**症状**：因子分析不需要自己调 row_rank\n**原因**：`factor_analysis` 内部已自动做排名转换\n**解决**：`out = d['字段名']` 即可，不需要 `out = row_rank(d['字段名'])`\n\n### E7：并行调用返回 \"有其它任务在执行\"\n\n**症状**：同时对 QuantAll 发多个工具调用，后面的返回 `\"有其它任务在执行，稍后再试\"`\n**原因**：QuantAll 是单线程执行引擎，不支持并发\n**解决**：所有 QuantAll 工具调用必须**串行**——上一个返回后才发下一个。同一策略的不同 view 也要一个一个跑。\n\n### E8：timeline/factor_analysis pandas 3.0.3 兼容性问题（✅ 已修复）\n\n**症状1**：`strategy_backtest(view=\"timeline\")` 返回 `\"异常：call stack is not deep enough\"`\n**症状2**：`factor_analysis` 报 `Argument 'f_days' has incorrect type (expected str, got int)` 或 `feature_days` 参数不生效\n**根因**：**pandas 3.0.3 兼容性问题**。QuantAll 早期代码基于 pandas 2.* 开发，pandas 3.0+ 中部分行为变更（`str` 类型不再是 `object`、部分日期处理行为变更、`inplace` 参数废弃、类型签名更严格等）。\n**解决**：更新代码兼容 pandas 3.0.3。`factor_analysis` 三种 mode（summary/daily/scatter）和不同 `feature_days` 值均已验证正常。\n**⚠️ 重要提醒**：后续如果遇到任何 QuantAll 工具执行异常（非语法错误类），**可能是 pandas 3.0.3 兼容性问题**，应提醒用户检查。\n\n### E9：`select_by_code` / `move_by_code` / `weight_by_code` 传入 Series 报错\n\n**症状**：用了 `col_attrs['所属行业']` 或某个 Series 作为这些工具的 `out`，执行失败\n**原因**：这些工具要求 `out` 是**DataFrame**（行=时间，列=股票），和 `d['close']` 维度一致。`col_attrs` 返回的是 Series（一个值对应一只股票），维度不匹配\n**解决**：把 Series 复制成全量 DataFrame：\n```python\n# 错误：out 是 Series\ncode = \"out = col_attrs['所属行业'] == '银行'\"\n\n# 正确：复制到和 d['close'] 同维度\ns = (col_attrs['所属行业'] == '银行').astype(bool)\nout = d['close'].notna().copy()  # 先创建同维度模板\nfor col in out.columns:\n    out[col] = s[col]\n```\n\n### E10：`select_by_code` 筛选文本属性时报错\n\n**症状**：`col_attrs['所属行业']` 是文本字符串，直接比较报错或执行失败\n**原因**：exec 环境对文本操作有限制，或行业名称含中文/特殊字符\n**解决**：文本属性可以直接用 `.get(col, '') == '目标值'` 做字符串比较。如果失败，先查有哪些可用值。\n\n### E11：select_by_code 选了子集，回测仍然跑全市场\n\n**症状**：先 `select_by_code` 筛了某个子集，再 `strategy_backtest`，结果仍是全市场。\n**原因**：`select_by_code` 只影响 GUI 图层的选中状态，不过滤 `strategy_backtest` 的数据范围。\n**解决**：用 `select_by_code` + `heat_map` / `move_by_code` 的组合来分析子集，或直接用 `select_by_code` 的 `全局平均` 对比。不要期望 select 能过滤回测数据。\n\n### E12：stock_factor 表部分字段读取异常（⚠️ 已部分解决）\n\n**症状**：`d['换手率']`、`d['市盈率TTM']` 等 `stock_factor` 表中的字段在 `move_by_code` 中报读取异常。\n**解决**：`factor_analysis` 中可以正常使用这些字段（`d['换手率']`、`d['市盈率TTM']`、`d['市净率']`、`d['ROE']`、`d['股息率TTM']`、`d['总市值']` 等均实测正常）。`move_by_code` 场景下的兼容性待进一步验证。基础价量字段（`close`/`vol`/`amount`/`adj_factor`）始终稳定可用。\n\n---\n\n## 7. 热力图分析方法论\n\n热力图是 QuantAll 的核心可视化工具，通过 `move_by_code` + `weight_by_code` + `heat_map` 三件套实现多维分析。\n\n### 基本流程\n\n```\nnew_layer_from_code（标记事件/选股）\n→ move_by_code(direction=\"x\")（设置 X 轴维度）\n→ move_by_code(direction=\"y\")（设置 Y 轴维度）\n→ weight_by_code（可选：设置权重）\n→ heat_map（读取热力图统计）\n→ 分析矩阵数据，形成结论\n```\n\n### 典型用法\n\n```\n# 分析\"因子 A × 因子 B\"的多维关系\n1. new_layer_from_code：标记所有感兴趣的事件/买点\n2. move_by_code(x)：映射维度 A\n3. move_by_code(y)：映射维度 B\n4. heat_map：得到 A×B 的二维分布矩阵\n\n# 分析\"维度 × 收益率\"的关系\n1. new_layer_from_code：标记所有买入事件\n2. move_by_code(x)：放量倍数 = d['vol'] / vol_ma20\n3. move_by_code(y)：未来 N 日收益率\n4. heat_map：得到放量×收益的二维分布矩阵\n```\n\n### heat_map 返回数据格式\n\n```\nmatrix[i][j]: i=Y轴行, j=X轴列, origin=bottom-left\n```\n\n---\n\n## 8. 进阶技巧\n\n### 多步骤串联\n\n不要试图在一个 code 里做所有事。用多个工具串联：\n\n```\nselect_by_code（初筛）→ new_layer_from_code（标记）→ move_by_code（分析）\n→ heat_map（统计）→ 如果发现规律 → strategy_backtest（验证）\n```\n\n### 迭代分析\n\n同一个问题可以多轮迭代：\n\n```\n第一轮：factor_analysis(mode=summary) → 看 IC 概览\n第二轮：factor_analysis(mode=daily)   → 看 IC 时序稳定性\n第三轮：factor_analysis(mode=scatter) → 看截面分布\n第四轮：move_by_code + heat_map       → 多维交叉验证\n```\n\n### 善用 offset_days\n\n`strategy_backtest` 的 `offset_days` 跳过指标预热期，避免开头的 NaN 干扰：\n\n```python\n# MA20 至少需要 20 天数据才稳定\nstrategy_backtest(name=\"MA策略\", code=..., offset_days=20, view=\"summary\")\n```\n\n### 严格回测 vs 收盘操作\n\n- `use_price=\"close\"`：当日收盘价成交（实战可用性偏低）\n- `use_price=\"next_open\"`：次日开盘成交（推荐，更贴近实盘）\n\n量价分析用 close 没问题，但策略回测优先用 next_open。\n\n---\n\n## 附录：工具速查\n\n| 工具 | 一句话 | code 输出类型 |\n|------|--------|--------------|\n| `strategy_backtest` | 策略回测 | bool（持仓矩阵） |\n| `factor_analysis` | 因子有效性评估 | 数值（因子值） |\n| `new_layer_from_code` | 创建标记图层 | bool（True=标记） |\n| `select_by_code` | 筛选股票 | bool（True=选中） |\n| `move_by_code` | 坐标轴映射 | 数值（控制位置） |\n| `weight_by_code` | 统计权重 | 数值（控制权重） |\n| `heat_map` | 热力图统计 | 不需要 code |\n| `available_data` | 查看可用字段 | 不需要 code |\n| `ping` | 健康检查 | 不需要 code |\n| `get_user_selection` | 用户当前选中 | 不需要 code |\n\nFile v1.0.4:scripts/data/ai_prompts.toml\n\n# 注意！！！\r\n# 修改此文件，可能会影响AI的运行，导致的具体后果由用户自行负责\r\n# \r\n# 全A解析 AI 提示词配置文件\r\n# 可以自行调整和优化提示词\r\n# AI 工作规律：用 name 快速定位，用 description 第一句确认，再读细节执行\r\n# ==============================================\r\n\r\n# 顶层的提示词\r\nmcp = \"\"\"\r\n你是量化策略分析助手，【全A解析】是你的分析平台。\r\n\r\n【平台概述】\r\n全A解析覆盖A股5000+股票，提供统一的Python exec计算环境，\r\n你可以用代码片段直接计算全市场数据，平台自动完成绘制、排序、分组、统计。\r\n\r\n【数据结构】\r\n- d: dict，key=字段名，value=DataFrame（个股×时间面板）\r\n  - 列=股票代码，行=时间，停牌NaN已置顶或置底\r\n  - 各股时间不对齐，禁止行方向聚合（axis=1）\r\n- col_attrs: dict，key=属性名，value=Series（股票属性，数值或字符串）\r\n- 内置：np, pd；禁止：import / 循环 / df.apply / lambda / 递归 / axis=1\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 更多字段用 available_data 查看（130+字段，含财务、因子、行业等）\r\n\r\n【核心工作流】\r\n1. 画图层 — new_layer_from_code / strategy_backtest(segments)\r\n   代码输出 bool DataFrame，True 位置自动绘制短线（最小绘制单元=股票+时间点）\r\n2. 筛选/查询 — select_by_code\r\n   在已有图层中筛选符合条件的数据\r\n3. 排序/平移 — move_by_code\r\n   按算法计算值控制短线在轴上的位置，支持转百分位排名、分桶、自动缩放\r\n4. 统计 — heat_map\r\n   对当前图层进行分组统计，返回数量矩阵和权重矩阵（默认权重=数量等权）\r\n5. 策略回测 — strategy_backtest\r\n   生成持仓矩阵，评估收益、胜率、夏普、回撤等，四种视角：summary/detail/segments/timeline\r\n6. 因子分析 — factor_analysis\r\n   生成因子的数值矩阵，评估因子的IC\r\n7. 统计权重 — weight_by_code\r\n   对统计权重进行自定义计算，替代默认的数量等权\r\n8. 批量权重 — batch_weight\r\n   weight_by_code 的批量版本，一次对比多个权重方案，不改变活动权重。view=\"summary\"返回评估参数，view=\"heatmap\"返回完整矩阵\r\n9. 批量筛选 — batch_select\r\n   select_by_code 的批量版本，一次对比多个筛选条件或批量交集/并集。mode: independent_summary/independent_heatmap/intersect/union\r\n10. 因子相关性 — batch_factor_corr\r\n    批量计算多个因子与基准因子的相关性（IC/IR/time_potential + 分层IC），用于因子去冗余和互补性分析\r\n11. 计算环境 — how_code\r\n    查看代码执行环境说明（变量、函数、规则），首次使用时调用了解环境\r\n\r\n【软件自动处理】\r\n- 数值输出自动缩放、转排序、分组（不需要AI写代码）\r\n- bool输出自动绘制短线，不需要处理绘制逻辑\r\n\r\n【你的任务】\r\n理解用户意图，选择合适的工具组合完成任务。\r\n常见场景：\r\n- 画图分析：画图层 → 排序 → 统计 → 分析分布\r\n- 策略回测：strategy_backtest → 按结果画图层 → 排序统计 → 诊断优化\r\n- 挖掘机会：用条件筛选 → 画图层 → 观察分布 → 回测验证\r\n\"\"\"\r\n\r\n[tool]\r\n\r\nstrategy_backtest = \"\"\"\r\n【触发场景】\r\n策略回测的优先工具。涉及以下场景时应首先使用：\r\n- 评估策略收益、回测、跑赢基准\r\n- 生成买入/卖出信号并测试表现\r\n- 比较不同策略参数的效果\r\n- 任何需要\"用代码定义交易逻辑并看收益\"的需求\r\n该工具独立完成 信号生成→持仓构建→收益评估 的完整闭环，\r\n现阶段应作为策略分析的默认首选，而非最后手段。\r\n\r\n【功能说明】\r\n用策略代码生成持仓矩阵（bool DataFrame），评估收益、胜率、夏普、回撤等指标。\r\n执行价格默认 close（可在收盘前操作），可选 next_open（次日开盘买入，适合严格回测）。\r\n\r\n【Python exec 环境】\r\n- d: dict，key=字段名，value=pd.DataFrame（个股×时间面板）\r\n  - 停牌导致的 NaN 已置顶或置底，避免干扰窗口计算\r\n  - 因此各股票时间不对齐，禁止行方向计算（axis=1 的聚合/排序）\r\n- col_attrs: dict，key=属性名，value=pd.Series（股票属性，数值或字符串）\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 复权价格：adj_close = d['close'] * d['adj_factor']，high/low 同理\r\n- 内置：np, pd\r\n- 禁止：import / for/while循环 / df.apply() / lambda / 递归 / 行方向聚合（axis=1）\r\n- 更多字段用 available_data 工具查看\r\n\r\n【输出规则】\r\nout = bool DataFrame，True 表示持仓。连续 True 片段的第一个为买入，最后一个为卖出。\r\n\r\n【核心函数】\r\n\r\n1. hold_until(buy, sell) — 生成持仓矩阵\r\n   从买入信号开始持仓，直到遇到卖出信号。买卖同日则放弃该买点。\r\n   - buy: bool DataFrame，买入信号（仅取每段第一个）\r\n   - sell: bool DataFrame，或 list/tuple of DataFrame（多个卖点自动 OR 合并）\r\n   - 返回: bool DataFrame\r\n   示例：\r\n     # 单卖点\r\n     buy = (D.shift(1) <= 20) & (D > 20)\r\n     sell = (D.shift(1) >= 80) & (D < 80)\r\n     out = hold_until(buy, sell)\r\n     # 多卖点\r\n     out = hold_until(buy, [sell1, sell2])\r\n\r\n2. entry_check(window, conditions, mode=\"keep\") — 买入窗口条件检测\r\n   在连续窗口内检测条件信号，输出指定区域。用于过滤买入机会。\r\n   - window: bool DataFrame，连续评估区间\r\n   - conditions: bool DataFrame 或 list，要检测的信号（多个自动 OR）\r\n   - mode: keep / discard / left / right / start / end / next\r\n   示例：\r\n     # 买入前10天内是否出现过放量，只保留末尾有效买点\r\n     window = buy.shift(10, fill_value=False).rolling(11).max().astype(bool)\r\n     volume_spike = d['vol'] > d['vol'].rolling(20).mean() * 2\r\n     out = entry_check(window, volume_spike, mode=\"end\")\r\n\r\n【时间函数】\r\n\r\n3. get_time() — 返回 DataFrame，每个单元格为时间datetime64[us]\r\n4. get_time_id() — 返回 DataFrame，每个单元格为数据库内时间序号\r\n5. time_at(rq) — 匹配指定时间，rq 为整数或负数（如 time_at(-1) 最后一天）\r\n6. time_between(srq, erq) — 匹配时间区间（左闭右开）\r\n7. time_in(rqs) — 匹配多个指定时间\r\n\r\n【排名函数】\r\n\r\n8. row_rank(df, split=[]) — 按行截面排名，返回百分位值（0~1）\r\n   - split: 板块切分点，如 split=[400000, 700000] 按代码切为三组独立排名\r\n   示例：\r\n     rank_all = row_rank(d['vol'])\r\n     rank_by_board = row_rank(d['vol'], split=[400000, 700000])\r\n\r\n9. row_top_n(df, n) — 每行（同一时间截面）最大的 n 个为 True\r\n   - df: 数值 DataFrame\r\n   - n: 每行取前 n 个最大值\r\n   - 返回: bool DataFrame，True 位置为该时间截面值最大的 n 只股票\r\n   示例：\r\n     out = row_top_n(d['vol'], 3)       # 每天成交量最大的3只股票\r\n     out = row_top_n(d['总市值'], 10)    # 每天市值最大的10只股票\r\n\r\n10. row_bottom_n(df, n) — 每行（同一时间截面）最小的 n 个为 True\r\n    - df: 数值 DataFrame\r\n    - n: 每行取前 n 个最小值\r\n    - 返回: bool DataFrame，True 位置为该时间截面值最小的 n 只股票\r\n    示例：\r\n      out = row_bottom_n(d['vol'], 3)       # 每天成交量最小的3只股票\r\n      out = row_bottom_n(d['总市值'], 10)    # 每天市值最小的10只股票\r\n\r\n【重要提示】\r\n- 持仓生成必须用 hold_until，不要手写逆序 cumsum\r\n- 穿越（上穿/下穿）信号自己写 shift 比较：\r\n  上穿阈值：(val > threshold) & (val.shift(1) <= threshold)\r\n  下穿阈值：(val < threshold) & (val.shift(1) >= threshold)\r\n  DataFrame vs DataFrame 金叉/死叉：两边都要 shift\r\n- 所有数据操作必须向量化，禁止循环\r\n- row_rank 返回百分位值（0~1），可直接用于因子标准化\r\n\"\"\"\r\n\r\n\r\nping = \"健康检查\"\r\n\r\n\r\nnew_layer_from_code = \"\"\"\r\n【触发场景】创建图层 / 画图 / 绘制 / 画出 / 生成图层 / 标记买点 / 标记卖点 / 标记事件\r\n\r\n【功能说明】在活动画布上新建图层，本质是标记一批 (股票, 关键日期) 的**散点**。软件端对每个散点往后绘制 N 天行情（默认 5 天，GUI 可调），但那是给用户看的视觉呈现——AI 分析的是散点截面数据。\r\n\r\n【双视角关键理解】\r\n- AI 视角：每个 True = 一个离散的 (股票, 日期) 散点。散点本身只定位到标记日，但 move/weight/select 代码中可用 .shift() 将标记日前后任意天的数据拉到散点上计算。\r\n- 用户视角：GUI 端以标记日为起点自动绘制 N 天 K 线，方便直观观察形态。绘制模式只影响视觉呈现。\r\n\r\n【Shift 机制】AI 分析散点的核心能力\r\n  .shift(N)  → 取标记日**之前**第 N 天数据（如标记前估值水位、量能累积）\r\n  .shift(-N) → 取标记日**之后**第 N 天数据（如未来收益、最大回撤）\r\n示例：weight_by_code(code=\"adj_close.shift(-5)/adj_close - 1\") → 以\"标记后第5天收益\"为权重\r\n\r\n【图层机制】单图层，新替旧\r\n软件只维护一个活动图层：new_layer_from_code / strategy_backtest / factor_analysis(scatter) 都会创建图层，新图层替换旧图层。\r\n设计意图：\"聚焦\"——换条件 = 焦点转移，旧图层不再需要。不要同时维护多个图层。\r\n\r\n【默认状态】无平移 + 无权重（数量等权）\r\n\r\n【完整分析管道】\r\nnew_layer_from_code（标记散点）\r\n→ move_by_code(x)（X轴映射）→ move_by_code(y)（Y轴映射）\r\n→ weight_by_code（可选：调整权重）→ select_by_code（可选：筛选子集，支持集合运算）\r\n→ heat_map（获取二维统计矩阵）\r\n\r\n【三大场景模板】\r\n1. 买点分析：标记买入信号 → Y轴=未来收益\r\n2. 卖点分析：标记卖出信号 → Y轴=未来收益\r\n3. 因子视觉化：标记全日期 → X=因子, Y=未来收益 → 替代/补充 factor_analysis\r\n\r\n【输出规则】out = 布尔DataFrame，True位置绘制短线并标记为后续分析的数据点\r\n【关键规则】new_layer_from_code 之后必须跟上后续分析（move/weight/select/heat_map），单独的图层没有意义\r\n\"\"\"\r\n\r\nselect_by_code = \"\"\"\r\n【触发场景】找出 / 查询 / 筛选 / 标记 / 选择\r\n\r\n【功能说明】在当前图层中按条件筛选散点。6种集合运算。筛选后自动重新统计所有维度。\r\n在 move/weight 之后使用——继承 X/Y 轴映射和权重配置，筛选后自动重新分桶。\r\n\r\n【6种集合模式】\r\n  A       → 替换当前选中（初始筛选/切换视角）\r\n  AB      → 当前选中 ∩ 新条件（多条件收窄）\r\n  A+B     → 当前选中 ∪ 新条件（追加）\r\n  A-B     → 当前选中 - 新条件（移除）\r\n  B-A     → 新条件 - 当前选中（找不在已知集合中的）\r\n  A+B-AB  → 对称差（两集合不同部分）\r\n\r\n【关键规则】\r\n- select 不回测：只影响 GUI 图层统计，不影响 strategy_backtest 数据范围\r\n- select 后所有维度自动重新统计\r\n- 不需要 name 参数\r\n\r\n【输出规则】out = 布尔DataFrame → True位置选中\r\n\"\"\"\r\n\r\nmove_by_code = \"\"\"\r\n【触发场景】x轴映射/ y轴映射 / 平移 / 偏移/ 散开 / 移动 / X轴 / Y轴 / 分组 / 分布\r\n\r\n【功能说明】将散点的额外维度映射到坐标轴位置。new_layer 之后的核心步骤——没有 move，图层只是散点；有了 move，散点才有分析维度。\r\n\r\n【关键行为】\r\n- 同方向覆盖：第二次 direction=\"x\" 替换第一次的 X 映射（不叠加）\r\n- 双方向独立：X/Y 各自维护，互不干扰\r\n- shift 时效：.shift(-N) 有效，但尾部 NaN 会被丢弃导致有效数量减少\r\n- 返回完整热力图数据：有效数量、X/Y轴统计（10等分）、XY热力图数量+权重矩阵\r\n\r\n【to_percentile】\r\n- true（默认）：转排名值0~1，看\"高/中/低\"分段关联\r\n- false：保留原始值，⚠️ 金融数据天然偏态，分布不均是正常现象\r\n- 建议：先用 true 确认因子有效，再切 false 看真实值分布\r\n\r\n【optimized_display】大数据量（>10万点）或准备交互框选时开启，聚合优化显示不影响核心统计\r\n\r\n【与 shift 配合】move 中 .shift() 是分析\"标记后表现\"的核心手段\r\n  code=\"adj_close.shift(-N)/adj_close - 1\" → 未来 N 日收益（最常用）\r\n\r\n【代码模板】\r\n# X=市值排名, Y=未来20日收益\r\nmove_by_code(code=\"out = d['总市值']\", direction=\"x\")\r\nmove_by_code(code=\"adj_close.shift(-20)/adj_close - 1\", direction=\"y\", name=\"20日收益\")\r\n\r\n# 混合：X=标记前量比, Y=标记后最大涨幅\r\nmove_by_code(code=\"d['vol']/d['vol'].rolling(20).mean()\", direction=\"x\", name=\"量比\")\r\nmove_by_code(code=\"(adj_close.shift(-5)/adj_close).rolling(5,min_periods=1).max()-1\", direction=\"y\", name=\"5日最大涨幅\")\r\n\r\n【输出规则】out = 数值DataFrame → 用于控制平移分布\r\n【返回数据】matrix[i][j]: i=Y行, j=X列, origin=bottom-left\r\n\"\"\"\r\n\r\nweight_by_code = \"\"\"\r\n【触发场景】权重 / 统计权重 / 权重用* / 设置权重 / *作为权重\r\n\r\n【功能说明】控制散点的统计权重，影响 heat_map 的加权均值。默认\"数量\"等权。\r\n\r\n【关键行为】\r\n- 覆盖：新权重替换旧权重，不叠加\r\n- 全局平均：默认1.0（等权），加权后按实际量纲（数字大是数据本身量级，不是异常）\r\n- 轴统计→加权和，XY热力图新增权重矩阵，有效数量不变\r\n\r\n【权重选择建议】\r\n- 成交量/成交金额：反映市场参与度\r\n- 市值：反映经济规模\r\n- 未来收益：weight_by_code(code=\"adj_close.shift(-20)/adj_close - 1\")，按未来表现加权\r\n\r\n【代码模板】\r\nweight_by_code(code=\"out = d['vol']\", name=\"成交量加权\")\r\nweight_by_code(code=\"out = d['总市值']\", name=\"市值加权\")\r\n\r\n【输出规则】out = 数值DataFrame → 用于统计权重控制\r\n\"\"\"\r\n\r\nheat_map = \"\"\"\r\n【触发场景】统计 / 热力图 / 热力统计 / 分析 / 矩阵\r\n\r\n【功能说明】只读查询工具——获取当前图层的二维统计矩阵。不改变任何配置。\r\nmove/weight/select 返回中已嵌入默认10等分的热力图；heat_map 的额外价值是自定义范围+缩放粒度。\r\n\r\n【三种 mode】\r\n- auto：全部数据10等分统计（无参数，等于嵌入数据的默认值）\r\n- percent：指定排名范围[x_range, y_range]，在该范围内重新10等分\r\n- value：指定数值范围[x_range, y_range]，需配合 to_percentile=false 使用\r\n\r\n【矩阵结构】\r\nmatrix[i][j]: i=Y行(0=底=Y最小), j=X列(0=左=X最小), origin=bottom-left\r\n\r\n【使用时机】\r\n- 默认10等分数据已在 move/weight/select 返回中 → 通常无需单独调用\r\n- 需要放大某段、指定数值范围时 → 单独调用\r\n\"\"\"\r\n\r\nget_user_selection = \"\"\"\r\n【触发场景】分析选中的股票 / 这些点有什么特征 / 框选区域 / 分析选中 / 获取选中信息\r\n\r\n【功能说明】获取用户在 GUI 端通过鼠标框选的散点信息。QuantAll 支持用户交互——AI 绘制图层后，用户可对图形中感兴趣的区域直接框选，然后通过此工具让 AI 分析选中点的特征。构成\"AI 展示 → 用户观察 → 用户框选 → AI 深入分析\"的交互闭环。\r\n\r\n【GUI 交互操作速查】\r\n- 左键拖拽 = 平移画布\r\n- 中键滚轮/拖拽 = 缩放画布\r\n- 右键拖拽 = 框选（四色四向）：\r\n  ● 右下→左上（红色）= 重新选取（reset）\r\n  ● 右上→左下（绿色）= 清空选择（clear）\r\n  ● 左下→右上（紫色）= 添加选择（add）\r\n  ● 左上→右下（青色）= 扣除选择（subtract）\r\n- 选框仅对绘图散点有效，对中键连线无效；可设置为仅关键日期点有效\r\n- ≤20 选中点 → GUI 自动绘制 K线图 + 补全行情曲线\r\n- >20 选中点 → GUI 自动绘制热力统计图\r\n\r\n【设计意图】用户从\"被动看 AI 分析结果\"变为\"主动探索数据\"——看到异常区域、有趣分布，直接框选问 AI\"这些点有什么共同特征？\"。\r\n\r\n【返回结构】\r\n- 无选中：返回 \"当前用户无选中\"\r\n- 有选中：primary_code（主图股票/None）, top_100（选中的前100只代码）, select_count（选中散点数）, total_count（图层全部散点数——与 select_count 对比可知选中占比）\r\n- ⚠️ select_count > 100 时 top_100 仅为前100只，提醒用户\"选中范围过大，建议缩小后再分析\"\r\n- 实测示例：框选 4 条走势线 → select_count=4, total_count=36932（选中占比 ~0.01%）\r\n\"\"\"\r\n\r\navailable_data = \"\"\"\r\n【触发场景】AI获取可以的数据清单\r\n【功能说明】返回当前数据库中可用数据清单\r\n\"\"\"\r\n\r\n\r\nfactor_analysis = \"\"\"\r\n【触发场景】因子分析、评估因子、因子有效性、IC分析、因子IC\r\n\r\n【功能说明】\r\n评估因子与未来收益的关系。每个时间截面上，将因子值和未来收益分别转为截面排名百分位（0~1），再计算Spearman秩相关系数作为IC。\r\n\r\n【三种模式】\r\n\r\n| mode | 返回内容 | 软件端绘图 | 后续分析 | 用在哪 |\r\n|------|---------|-----------|----------|--------|\r\n| summary | 聚合统计（IC均值/IR/正占比/多空差） | 散点图：X=收益排序，Y=因子排序 | ✅ move+heat_map+select | 第一步，判断有没有效 |\r\n| daily | 每日IC序列 + 前/后10%IC | 三条时序曲线（蓝/红/绿） | ❌ 只读 | 看稳定性，看时段特征 |\r\n| scatter | 同summary统计 | 时序散点（每天独立排列） | ✅ 时间维度分析 | 看因子随时间演变 |\r\n\r\n关键区别：\r\n- summary=全局截面（所有日期混一起），scatter=时序截面（每天独立）\r\n- daily=纯时序曲线，只看IC波动，不能做后续操作\r\n\r\n标准流程：summary（判断有效）→ daily（看稳定性）→ scatter（看演变）→ move+heat_map（交叉验证）\r\n\r\n参数：\r\n- feature_days：评估未来第N天的收益，默认1。长周期（20d）通常比短周期IC更强\r\n\r\n⚠️【关键排名规则（必须遵守！）】\r\n- 单因子：工具内部已自动做排名转换，代码中直接输出原始值即可：\r\n  out = d['换手率']          ← 正确，不要加 row_rank\r\n  out = row_rank(d['换手率'])  ← 错误！工具会重复排名\r\n- 复合因子：多个子因子必须各自 row_rank 排名后再加权组合（确保量纲一致）：\r\n  f1 = row_rank(d['因子A'])\r\n  f2 = row_rank(1 - d['因子B'])   ← 反向因子用 1-rank\r\n  out = 0.5 * f1 + 0.5 * f2      ← 排名后再加权\r\n\r\n⚠️【每股因子必须除以股价（实测验证！）】\r\n每股类因子（EPS/BPS/每股资本公积/每股未分配利润等）是绝对值，受股价规模影响极大。\r\n必须除以 d['close']（非复权价）转换为比率，否则 IC 被价格规模噪声淹没：\r\n  out = d['每股收益'] / d['close']           ← 正确！E/P（盈利收益率）\r\n  out = d['每股净资产'] / d['close']          ← 正确！B/P（账面市值比）\r\n  out = d['每股资本公积'] / d['close']         ← 正确！IR 从 0.05→0.59（实测最强因子）\r\n  out = d['每股收益']                         ← 错误！IR≈0，绝对值无预测力\r\n- 比率类/增长率类因子（换手率、ROE、营收增速等）不需要除以 close\r\n- 规则：因子值是\"每股X元\"这种绝对值 → 除以 close → 变成\"每元股价含X元\"的比率\r\n\r\n【核心函数】\r\nrow_rank(df) — 按行截面排名，返回百分位值（0~1）\r\n用于构建复合因子：多个子因子各自排名后按比例加权组合。\r\n单因子无需调用，工具外部会自动排名。\r\n\r\n【实战代码模板】\r\n\r\n# 单因子（最简单）\r\nout = d['换手率']\r\n\r\n# 动量因子\r\nadj_close = d['close'] * d['adj_factor']\r\nout = adj_close.pct_change(20)\r\n\r\n# 复合因子：低换手 + 小市值\r\nt = row_rank(d['换手率'])\r\ns = row_rank(d['总市值'])\r\nout = (1 - t) + (1 - s)\r\n\r\n# 复合因子：动量 + 小市值（加权）\r\nadj_close = d['close'] * d['adj_factor']\r\nm = row_rank(adj_close.pct_change(20))\r\ns = row_rank(d['总市值'])\r\nout = 0.6 * m + 0.4 * (1 - s)\r\n\r\n【返回字段】\r\n- IC均值/IC标准差/IC_IR：全样本IC统计，IC_IR=均值/标准差。|IR|>0.3 视为有效\r\n- IC正占比：IC为正的天数占比，偏离50%越多方向越稳定\r\n- 多空排名差：因子值最高组与最低组的收益排名差，越大区分度越好\r\n- 前10%平均排名/后10%平均排名：因子极端分组在收益排名上的表现（0.5为平均）\r\n- 前10%IC/后10%IC：仅保留极端10%因子值后计算的IC，评估尾部信号集中度\r\n- 极端IC差：前10%IC与后10%IC之差\r\n\r\n【daily 模式返回格式】\r\n每日IC信息字段返回三列TSV：每日IC  每日前10%IC  每日后10%IC\r\n- 每日IC：当天的 Rank IC\r\n- 前/后10%IC：仅保留极端10%因子值的IC\r\n- 最后 feature_days 行全为NaN（无足够未来数据）\r\n\r\n【输出规则】\r\nout = 数值 DataFrame，作为因子值输入。\r\n\"\"\"\r\n\r\nbatch_factor_analysis = \"\"\"\r\n【触发场景】批量因子分析、同时分析多个因子、批量评估因子有效性、批量IC分析、把多个因子都分析一下、逐个分析这些因子\r\n\r\n【功能说明】\r\nfactor_analysis 的批量版本。一次传入多个因子（factor_dict: 因子名称→因子代码），逐个计算IC，每完成一个因子立即报告该因子的IC指标（增量流式），全部完成后输出汇总对比表。\r\n\r\n与 factor_analysis 的区别：\r\n- factor_analysis：单因子，每次传一个 name+code\r\n- batch_factor_analysis：多因子，一次传 factor_dict（name→code 字典），自动逐个分析并逐个报告\r\n\r\n【参数说明】\r\n- feature_days：未来多少天后的收益，≥1，默认1。对所有因子统一生效\r\n- factor_dict：因子名称→因子代码 的字典。key 为因子名称（用于报告标识），value 为因子代码（Python exec 表达式）\r\n  示例：{\"换手率\": \"out = d['换手率']\", \"动量20日\": \"out = adj_close.pct_change(20)\", \"低换手+小市值\": \"t=row_rank(d['换手率']);s=row_rank(d['总市值']);out=(1-t)+(1-s)\"}\r\n\r\n【返回机制】\r\n引擎逐个因子计算，GUI端可看到中间进度（1/3、2/3等），但 AI 层只收到最终完整结果——一个 list，包含所有因子的结果字典。\r\n\r\n⚠️ AI 行为要求：\r\n- 收到完整结果后，逐个向用户报告每个因子的有效性结论（不要只报综合结论）\r\n- 重点标注有效因子（|IR|>0.3）和无效因子\r\n- 全部报告完毕后，给出综合对比结论\r\n\r\n【Python exec 环境】（与 factor_analysis 完全一致）\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 复权价格：adj_close = d['close'] * d['adj_factor']\r\n- 内置：np, pd；禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n\r\n⚠️【关键排名规则（与 factor_analysis 一致）】\r\n- 单因子：工具内部已自动做排名转换，代码中直接输出原始值即可：\r\n  out = d['换手率']          ← 正确\r\n  out = row_rank(d['换手率'])  ← 错误！重复排名\r\n- 复合因子：多个子因子必须各自 row_rank 排名后再加权组合：\r\n  f1 = row_rank(d['因子A'])\r\n  f2 = row_rank(1 - d['因子B'])\r\n  out = 0.5 * f1 + 0.5 * f2\r\n\r\n⚠️【每股因子必须除以股价（实测验证！）】\r\n每股类因子（EPS/BPS/每股资本公积/每股未分配利润等）是绝对值，必须除以 d['close']（非复权价）：\r\n  \"每股收益\": \"out = d['每股收益'] / d['close']\"        ← 正确\r\n  \"每股资本公积\": \"out = d['每股资本公积'] / d['close']\" ← 正确（IR=0.59最强）\r\n  \"每股收益\": \"out = d['每股收益']\"                      ← 错误（IR≈0）\r\n比率类/增长率类因子不需要除以 close。\r\n\r\n【代码模板（factor_dict 值的写法）】\r\n\r\n# 单因子（最简单）\r\n\"换手率\": \"out = d['换手率']\"\r\n\"市盈率\": \"out = d['市盈率TTM']\"\r\n\"总市值\": \"out = d['总市值']\"\r\n\r\n# 动量因子\r\n\"动量20日\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.pct_change(20)\"\r\n\r\n# 复合因子\r\n\"低换手+小市值\": \"t=row_rank(d['换手率']);s=row_rank(d['总市值']);out=(1-t)+(1-s)\"\r\n\r\n# 批量调用示例\r\nbatch_factor_analysis(feature_days=20, factor_dict={\r\n    \"换手率\": \"out = d['换手率']\",\r\n    \"动量20日\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.pct_change(20)\",\r\n    \"低换手+小市值\": \"t=row_rank(d['换手率']);s=row_rank(d['总市值']);out=(1-t)+(1-s)\"\r\n})\r\n\r\n【返回格式】\r\n返回 list，每个元素是一个单因子结果字典（与 factor_analysis summary 模式返回结构完全一致）。\r\n示例：[\r\n  {\"name\": \"换手率\", \"code\": \"out = d['换手率']\", \"feature_days\": 20, \"IC\": -0.0684, \"IR\": -0.4064, ...},\r\n  {\"name\": \"动量20日\", \"code\": \"...\", \"feature_days\": 20, \"IC\": -0.0587, \"IR\": -0.4329, ...}\r\n]\r\n\r\n⚠️ 与 save_factor_result 的对接：\r\nbatch_factor_analysis 的 result 可以直接传给 save_factor_result 的 result 参数（无需格式转换）。\r\n典型流程：batch_factor_analysis → 拿到 result list → 逐个向用户报告结论 → save_factor_result(result=result, note=\"备注\")\r\nAI 也可以选择性保存——从 result list 中筛选有效因子（|IR|>0.3），只保存有意义的因子。\r\n\r\n【返回字段】\r\n（每个元素与 factor_analysis summary 模式一致）\r\n- IC均值/IC标准差/IC_IR：IC_IR=均值/标准差。|IR|>0.3 视为有效\r\n- IC正占比：偏离50%越多方向越稳定\r\n- 多空排名差：越大区分度越好\r\n- 前10%平均排名/后10%平均排名：0.5为平均线\r\n- 前10%IC/后10%IC/极端IC差\r\n- time_potential：时间维度潜力，越接近1越稳定\r\n- top10%/bottom10% 子指标：极端分组的IC/IR/time_potential\r\n- error_code：0=成功，非0=失败（含 names 列表追踪失败因子）\r\n\r\n【输出规则】\r\nfactor_dict 中每个 value 的代码必须以 out = 数值 DataFrame 结尾，作为因子值输入。\r\n\"\"\"\r\n\r\nsave_factor_result = \"\"\"\r\n【触发场景】保存因子结果、保存因子分析结果、保存IC数据、批量保存因子\r\n\r\n【功能说明】\r\n把因子分析结果保存到数据库中。支持单因子和批量保存。\r\n保存技能和分析技能相互独立，保存技能间会相互阻塞。\r\n\r\n【参数说明】\r\n- result：接受两种格式，无需格式转换：\r\n  1. 单因子结果字典（factor_analysis 的返回值）\r\n  2. 多因子结果列表（batch_factor_analysis 的返回值）\r\n- note：备注。批量保存时此备注将在所有结果中添加\r\n\r\n【典型用法】\r\n# 单因子保存\r\nfactor_analysis(name=\"换手率\", code=\"out = d['换手率']\", feature_days=20)\r\n→ save_factor_result(result=<返回值>, note=\"测试\")\r\n\r\n# 批量保存\r\nbatch_factor_analysis(factor_dict={...}, feature_days=20)\r\n→ save_factor_result(result=<返回值>, note=\"批量测试\")\r\n\r\n# 选择性保存（只保存有效因子）\r\nresult_list = batch_factor_analysis(...)\r\neffective = [r for r in result_list if abs(r[\"IR\"]) > 0.3]\r\n→ save_factor_result(result=effective, note=\"有效因子\")\r\n\r\n【AI 行为建议】\r\n- 批量分析后先逐个向用户报告因子有效性结论，再保存\r\n- 用户未明确要求时，可只保存有效因子（|IR|>0.3）\r\n\"\"\"\r\n\r\nbatch_weight = \"\"\"\r\n【触发场景】批量切换权重、同时分析多个统计权重、对比不同权重方案、多种加权方式对比\r\n\r\n【功能说明】\r\nweight_by_code 的批量版本。一次传入多个权重（code_dict: 权重名称→权重代码），同时计算每个权重的热力图权重矩阵，用于对比不同加权方案的效果。不改变当前活动权重——纯对比工具。\r\n\r\n与 weight_by_code 的区别：\r\n- weight_by_code：单权重，每次传一个 name+code，设置为当前活动权重\r\n- batch_weight：多权重，一次传 code_dict（名称→代码字典），同时计算所有权重矩阵供对比\r\n\r\n【参数说明】\r\n- code_dict：权重名称→权重代码 的字典。key 为权重名称（用于报告标识），value 为权重代码（Python exec 表达式）\r\n  示例：{\"成交量加权\": \"out = d['vol']\", \"市值加权\": \"out = d['总市值']\"}\r\n- 代码禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n- to_percentile：所有权重统一转排序值(0~1)，默认 true。消除不同权重间的量纲差异\r\n- target：统计目标，默认 \"All\"\r\n  - \"All\"：对所有散点计算权重矩阵\r\n  - \"Select\"：仅对当前选中的散点计算权重矩阵（需先用 select_by_code 或 batch_select 设置选中）\r\n- view：返回数据类型，默认 \"summary\"\r\n  - \"summary\"：返回热力图评估参数（精简模式，适合快速对比多个权重的效果）\r\n  - \"heatmap\"：返回完整 10×10 权重矩阵+数量矩阵（详细模式，适合深入研究单个权重）\r\n\r\n【关键行为】\r\n- 不改变活动权重：batch_weight 是只读对比工具，计算后当前活动权重不变\r\n- 统一百分位：to_percentile 对所有权重统一生效，无法单独设置\r\n- target=\"Select\" 时 statistic_count < total，仅统计选中散点\r\n- view=\"summary\" 返回精简评估参数，view=\"heatmap\" 返回完整矩阵\r\n\r\n【summary 评估参数解读】（view=\"summary\" 时返回）\r\n每个权重返回以下参数：\r\n- slope_x：X方向斜率，Y均值随X档位的变化率。正值=Y随X增大而增大。这是最关键的参数——slope_x 绝对值越大，说明该权重下 X→Y 的预测关系越强\r\n- slope_y：Y方向斜率，X均值随Y档位的变化率\r\n- burst：突发度，热力图中是否有局部突发区域\r\n- spike：尖峰度，热力图分布的尖峰程度\r\n- validity：有效性得分，综合评估该权重下热力图的信号强度\r\n- gini：权重分布的基尼系数（负值表示方向性偏斜）\r\n- weighted_mean：加权均值\r\n- valid_count：有效数据点数量\r\n\r\n【代码模板】\r\n# 快速对比多个权重的效果（summary 模式）\r\nbatch_weight(code_dict={\r\n    \"成交量加权\": \"out = d['vol']\",\r\n    \"市值加权\": \"out = d['总市值']\"\r\n}, target=\"All\", to_percentile=true, view=\"summary\")\r\n\r\n# 深入研究单个权重的完整矩阵（heatmap 模式）\r\nbatch_weight(code_dict={\r\n    \"成交量加权\": \"out = d['vol']\"\r\n}, target=\"All\", to_percentile=true, view=\"heatmap\")\r\n\r\n# 仅对选中散点对比权重\r\nbatch_weight(code_dict={\r\n    \"成交量加权\": \"out = d['vol']\",\r\n    \"未来收益加权\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.shift(-20) / adj_close - 1\"\r\n}, target=\"Select\")\r\n\r\n【返回结构】\r\n- base_info：图层上下文（layer_name, total, statistic_count, X/Y 名称和代码, statistic_mode, Note）\r\n  - Note 字段提示\"当前活动权重未改变，如需应用请调用 weight_by_code\"\r\n- result：\r\n  - view=\"summary\"：dict，key=权重名称，value=评估参数 dict（slope_x/slope_y/burst/spike/validity/gini/weighted_mean/valid_count）\r\n  - view=\"heatmap\"：dict，key=权重名称，value={weighted_mean, valid_count, values(10×10权重矩阵), counts(10×10数量矩阵)}\r\n    - values[i][j]: i=Y行, j=X列, origin=bottom-left\r\n- error_code：{\"names\": []}，空列表=全部成功，非空=失败的权重名称列表\r\n\r\n【输出规则】\r\ncode_dict 中每个 value 的代码必须以 out = 数值 DataFrame 结尾，作为权重值输入。\r\n\"\"\"\r\n\r\nbatch_select = \"\"\"\r\n【触发场景】批量选中、同时分析多个选择、批量切片分析、对比多个筛选条件\r\n\r\n【功能说明】\r\nselect_by_code 的批量版本。一次传入多个筛选条件（code_dict: 名称→代码），根据 mode 进行独立计算或集合运算，返回各条件的热力图统计或评估参数。\r\n\r\n与 select_by_code 的区别：\r\n- select_by_code：单条件，每次传一个 code，6种集合模式（A/AB/A+B/A-B/B-A/A+B-AB）\r\n- batch_select：多条件，一次传 code_dict（名称→代码字典），4种模式\r\n- batch_select 的 independent 模式：各自独立计算并返回多个结果（用于对比），不改变选中状态\r\n- select_by_code 的 mode \"A\"：替换当前选中。两者语义不同，注意区分\r\n\r\n【参数说明】\r\n- code_dict：名称→筛选代码 的字典。key 为筛选名称（用于报告标识），value 为筛选代码（Python exec 表达式，out=bool DataFrame）\r\n  示例：{\"高市值\": \"out = d['总市值'] > d['总市值'].median()\", \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"}\r\n- 代码禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n- mode：集合运算模式，4种：\r\n  - \"independent_summary\"（默认）：每个条件独立筛选，返回各自的热力图评估参数（精简模式，快速对比各切片效果）\r\n  - \"independent_heatmap\"：每个条件独立筛选，返回各自完整热力图统计（详细模式，含10×10矩阵）\r\n  - \"intersect\"：所有条件求交集，返回单个完整热力图统计（用于多条件收窄）\r\n  - \"union\"：所有条件求并集，返回单个完整热力图统计（用于扩大范围）\r\n\r\n【关键行为】\r\n- ⚠️ independent 模式前置条件：图层必须先设置 X/Y 轴平移（move_by_code）和权重（weight_by_code），否则散点集中在一个位置无法统计。base_info 中 weight_name 为空代表无权重，X/Y 无细分代表未散开\r\n- independent 模式：返回多个独立结果，用于对比不同筛选条件各自的效果。不改变选中状态。使用全局细分（X/Y全局细分）评估各条件子集的分布\r\n- intersect 模式：交集结果，有效数量 ≤ 各单独条件数量，自动调整细分\r\n- union 模式：并集结果，有效数量 ≥ 各单独条件数量，自动调整细分\r\n- 无差集模式（A-B/B-A/A+B-AB），差集操作用 select_by_code\r\n- independent_summary 返回全局细分下的分布评估参数（cv/gini/entropy_ratio/max_min_ratio/edge_burst/edge_density_ratio）\r\n\r\n【summary 评估参数解读】（independent_summary 模式返回）\r\n每个条件返回以下分布评估参数：\r\n- cv：变异系数，各档样本量的离散度。越小越均匀\r\n- gini：基尼系数，分布不均匀程度。0=完全均匀\r\n- entropy_ratio：熵比率，信息分布均匀度。接近1=均匀\r\n- max_min_ratio：最大档/最小档样本量比\r\n- edge_burst：边缘突发。正值=尾部集中，负值=中间集中\r\n- edge_density_ratio：边缘/中心密度比。>1=边缘密，<1=中心密\r\n- valid_count：有效数据点数量\r\n\r\n【代码模板】\r\n# 快速对比两个筛选条件各自的效果（summary 模式）\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"independent_summary\")\r\n\r\n# 获取各条件完整热力图（heatmap 模式）\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"independent_heatmap\")\r\n\r\n# 多条件交集\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"intersect\")\r\n\r\n# 多条件并集\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"union\")\r\n\r\n【返回结构】\r\n- base_info：图层上下文（layer_name, total, X/Y 名称, weight_name, mode）\r\n  - independent 模式额外包含：X/Y全局细分（用于评估各条件子集分布的全局参考框架）\r\n  - intersect/union 模式：无全局细分（自动调整细分）\r\n  - ⚠️ weight_name 为空或 X/Y 无细分时，independent 模式无法统计\r\n- result：\r\n  - independent_summary：dict，key=筛选名称，value=分布评估参数（cv/gini/entropy_ratio/max_min_ratio/edge_burst/edge_density_ratio/valid_count）\r\n  - independent_heatmap：dict，key=筛选名称，value=完整热力图统计（valid_count + 10×10 counts矩阵）\r\n  - intersect/union：单个完整热力图统计（交集/并集结果，含 summary 评估参数）\r\n- error_code：{\"names\": []}，空列表=全部成功，非空=失败的筛选名称列表\r\n\r\n【输出规则】\r\ncode_dict 中每个 value 的代码必须以 out = 布尔 DataFrame 结尾，True 位置为选中。\r\n\"\"\"\r\n\r\nbatch_factor_corr = \"\"\"\r\n【触发场景】因子间相关性分析、因子冗余度检查、因子筛选前的去相关、基准因子对比\r\n\r\n【功能说明】\r\n批量计算多个因子与一个基准因子之间的相关性。一次传入一个基准因子(benchmark)和多个待评估因子(factor_dict)，\r\n返回每个因子与基准因子的 IC（信息系数）、IR（信息比率）、time_potential（时间潜力），以及基准因子极端档位下的分层 IC。\r\n\r\n与 batch_factor_analysis 的区别：\r\n- batch_factor_analysis：基准固定为未来收益（feature_days 期），评估因子对未来收益的预测力\r\n- batch_factor_corr：基准因子可自定义，评估因子之间的相关性/冗余度\r\n- 典型用途：用市值作为基准，检查成交量/换手率/振幅等因子与市值的相关性，发现冗余因子\r\n\r\n【参数说明】\r\n- benchmark_name：基准因子名称（用于报告标识），默认\"未命名\"\r\n- benchmark_code：基准因子代码（Python exec 表达式，out=数值 DataFrame）\r\n  示例：\"out = d['总市值']\"\r\n- factor_dict：因子名称→因子代码 的字典。key 为因子名称，value 为因子代码\r\n  示例：{\"成交量\": \"out = d['vol']\", \"换手率\": \"out = d['换手率']\"}\r\n- 代码禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n- 每股类因子无需除以 close（与 factor_analysis 不同，这里只算相关性，不做因子标准化）\r\n\r\n【返回结构】\r\n返回列表，每个因子一个 dict：\r\n- name：因子名称\r\n- code：因子代码\r\n- start_date / end_date：数据时间范围\r\n- universe：股票池（\"全市场\"）\r\n- stock_count：参与计算的股票数量\r\n- IC：与基准因子的整体 Spearman 秩相关系数（-1~1）\r\n- IR：IC 的信息比率（IC均值/IC标准差），衡量 IC 的稳定性。|IR|>0.3 较稳定\r\n- time_potential：时间潜力（0~1），IC 的时间一致性。越接近 1 表示因子相关性在时间上越稳定\r\n- top10%_IC：基准因子 top10% 档位下的 IC（揭示非线性关系）\r\n- top10%_IR：top10% 档位下的 IR\r\n- top10%_time_potential：top10% 的时间潜力\r\n- bottom10%_IC：基准因子 bottom10% 档位下的 IC\r\n- bottom10%_IR：bottom10% 档位下的 IR\r\n- bottom10%_time_potential：bottom10% 的时间潜力\r\n- benchmark_name：基准因子名称\r\n- error_code：{\"names\": []}，空列表=全部成功，非空=失败的因子名称列表\r\n\r\n【评估参数解读】\r\n- |IC| > 0.03：因子间有显著相关性。IC > 0 = 正相关，IC < 0 = 负相关\r\n- |IR| > 0.3：相关性稳定（不是偶尔出现的相关）\r\n- time_potential > 0.8：相关性在时间上高度一致\r\n- top10%/bottom10% IC 差异大：因子关系是非线性的（极端档位下行为不同）\r\n- 用途1（去冗余）：如果两个因子 IC > 0.8，说明高度冗余，保留一个即可\r\n- 用途2（找互补）：IC 接近 0 的因子提供独立信息，适合组合使用\r\n- 用途3（分层分析）：top10%/bottom10% IC 差异大时，因子在不同市值区间表现不同\r\n\r\n【代码模板】\r\n# 检查因子与市值的相关性（去冗余）\r\nbatch_factor_corr(\r\n    benchmark_name=\"市值\",\r\n    benchmark_code=\"out = d['总市值']\",\r\n    factor_dict={\r\n        \"成交量\": \"out = d['vol']\",\r\n        \"换手率\": \"out = d['换手率']\",\r\n        \"振幅\": \"out = (d['high'] - d['low']) / d['close']\"\r\n    }\r\n)\r\n\r\n# 用未来收益作为基准（等价于 batch_factor_analysis 的 IC 部分）\r\nbatch_factor_corr(\r\n    benchmark_name=\"20日收益\",\r\n    benchmark_code=\"adj_close = d['close'] * d['adj_factor']; out = adj_close.shift(-20) / adj_close - 1\",\r\n    factor_dict={\r\n        \"换手率\": \"out = d['换手率']\",\r\n        \"动量\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.pct_change(20)\"\r\n    }\r\n)\r\n\r\n【输出规则】\r\nbenchmark_code 和 factor_dict 中每个 value 的代码必须以 out = 数值 DataFrame 结尾。\r\n因子值和基准值都自动做排名转换（Spearman），不需要手动 row_rank。\r\n\"\"\"\r\n\r\nhow_code = \"\"\"\r\n【背景】代码在python的exec环境中运行，常用的数据和函数已经配置好了，不需要额外的数据读取和import，直接写算法代码。\r\n数据是pd.DataFrame，每一列是一只股票的数据，为避免停牌问题，计算数据的nan置底处理了，行时间不对齐禁止axis=1的计算。\r\n结果由out=***带出，会自动恢复行时间对齐结构。所有技能使用同一代码环境。\r\n【Python exec环境】\r\n- d 是字典，key=字段名，value=pd.DataFrame,默认数据：close, open, high, low, vol, amount, adj_factor\r\n- col_attrs 是字典，key=属性名，value=pd.Series,数据为和股票属性相关的，是数值或字符串\r\n- 可用字段：由用户数据库决定，使用available_data查询\r\n- 复权价格 = d['close'] * d['adj_factor']\r\n- 可用自定义函数：hold_until, time_at, time_between, time_in, row_rank, row_top_n, row_bottom_n\r\n- 禁止：import / for/while循环 / df.apply() / lambda / 递归/ axis=1/ df.loc/df.iloc\r\n- 内置：np, pd\r\n【输出规则】\r\nout = 布尔DataFrame → True位置绘制短线/回测\r\nout = 数值DataFrame → 用于颜色/权重/平移控制/因子\r\n\r\n【自定义函数】\r\n1. hold_until(buy, sell) — 生成持仓矩阵\r\n   从买入信号开始持仓，直到遇到卖出信号。买卖同日则放弃该买点。\r\n   - buy: bool DataFrame，买入信号（仅取每段第一个）\r\n   - sell: bool DataFrame，或 list/tuple of DataFrame（多个卖点自动 OR 合并）\r\n   - 返回: bool DataFrame\r\n   示例：\r\n     # 单卖点\r\n     buy = (D.shift(1) <= 20) & (D > 20)\r\n     sell = (D.shift(1) >= 80) & (D < 80)\r\n     out = hold_until(buy, sell)\r\n     # 多卖点\r\n     out = hold_until(buy, [sell1, sell2])\r\n\r\n2. entry_check(window, conditions, mode=\"keep\") — 买入窗口条件检测\r\n   在连续窗口内检测条件信号，输出指定区域。用于过滤买入机会。\r\n   - window: bool DataFrame，连续评估区间\r\n   - conditions: bool DataFrame 或 list，要检测的信号（多个自动 OR）\r\n   - mode: keep / discard / left / right / start / end / next\r\n   示例：\r\n     # 买入前10天内是否出现过放量，只保留末尾有效买点\r\n     window = buy.shift(10, fill_value=False).rolling(11).max().astype(bool)\r\n     volume_spike = d['vol'] > d['vol'].rolling(20).mean() * 2\r\n     out = entry_check(window, volume_spike, mode=\"end\")\r\n\r\n【时间函数】\r\n\r\n3. get_time() — 返回 DataFrame，每个单元格为时间datetime64[us]\r\n4. get_time_id() — 返回 DataFrame，每个单元格为数据库内时间序号，需要按时间排序使用这个函数\r\n5. time_at(rq) — 匹配指定时间，rq 为整数或负数（如 time_at(-1) 最后一天）\r\n6. time_between(srq, erq) — 匹配时间区间（左闭右开）\r\n7. time_in(rqs) — 匹配多个指定时间\r\n\r\n【排名函数】\r\n\r\n8. row_rank(df, split=[]) — 按行截面排名，返回百分位值（0~1）\r\n   - split: 板块切分点，如 split=[400000, 700000] 按代码切为三组独立排名\r\n   示例：\r\n     rank_all = row_rank(d['vol'])\r\n     rank_by_board = row_rank(d['vol'], split=[400000, 700000])\r\n\r\n9. row_top_n(df, n) — 每行（同一时间截面）最大的 n 个为 True\r\n   - df: 数值 DataFrame\r\n   - n: 每行取前 n 个最大值\r\n   - 返回: bool DataFrame，True 位置为该时间截面值最大的 n 只股票\r\n   示例：\r\n     out = row_top_n(d['vol'], 3)       # 每天成交量最大的3只股票\r\n     out = row_top_n(d['总市值'], 10)    # 每天市值最大的10只股票\r\n\r\n10. row_bottom_n(df, n) — 每行（同一时间截面）最小的 n 个为 True\r\n    - df: 数值 DataFrame\r\n    - n: 每行取前 n 个最小值\r\n    - 返回: bool DataFrame，True 位置为该时间截面值最小的 n 只股票\r\n    示例：\r\n      out = row_bottom_n(d['vol'], 3)       # 每天成交量最小的3只股票\r\n      out = row_bottom_n(d['总市值'], 10)    # 每天市值最小的10只股票\r\n\"\"\"\r\nrun_task_file = \"\"\"\r\n【触发条件】禁止主动使用，明确要执行`run_task_file`才使用。\r\n【功能描述】\r\n- 读取本地 JSON 文件，解析其中的 `tool_name`（必填）和对应参数（可选），然后调用 QuantALL 的对应技能执行。\r\n- 若某技能无参数，JSON 仅写 `{\"tool_name\": \"技能名\"}` 即可。\r\n- 此技能专用于“流程固化”：将复杂任务参数预先保存为文件，后续直接执行，保证每次结果一致。\r\n【典型 JSON 结构】{\"tool_name\": \"factor_analysis\", \"name\": \"换手率反转\", ...}\r\n【使用约束】\r\n1. 除非用户主动要求“使用任务文件”，否则绝对不要生成或调用此技能。\r\n2. 在对话中，请直接调用相应技能，不要用本技能绕路。\r\n3. 已制作好明确的任务流程，并保存好本地json文件，才使用本技能。\r\n\"\"\"\r\n\r\nexecute_python_script = \"\"\"\r\n【触发条件】禁止主动使用，明确要执行`execute_python_script`才使用。\r\n【功能描述】\r\n- 使用QuantAll的python环境，执行本地的python文件\r\n- print会给AI发送info\r\n- 此技能专用于“流程固化”时，扩展数据处理功能。\r\n\"\"\"\n\nFile v1.0.4:scripts/data/db_translate.json\n\n{\r\n    \"stock_basic\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"name\": \"股票名称\",\r\n        \"update_date\": \"数据更新日期\",\r\n        \"list_date\": \"上市日期\",\r\n        \"act_name\": \"实控人名称\",\r\n        \"act_ent_type\": \"实控人企业性质\",\r\n        \"industry\": \"所属行业\",\r\n        \"com_name\": \"公司名称\",\r\n        \"com_id\": \"统一社会信用代码\",\r\n        \"chairman\": \"法人代表\",\r\n        \"manager\": \"总经理\",\r\n        \"secretary\": \"董秘\",\r\n        \"reg_capital\": \"注册资本\",\r\n        \"setup_date\": \"注册日期\",\r\n        \"province\": \"所在省份\",\r\n        \"city\": \"所在城市\",\r\n        \"introduction\": \"公司介绍\",\r\n        \"website\": \"公司主页\",\r\n        \"email\": \"电子邮件\",\r\n        \"office\": \"办公室\",\r\n        \"business_scope\": \"经营范围\",\r\n        \"employees\": \"员工人数\",\r\n        \"main_business\": \"主要业务及产品\",\r\n        \"exchange\": \"交易所\",\r\n        \"concept\":\"所属概念\"\r\n    },\r\n    \"stock_factor\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"trade_date\": \"交易日期\",\r\n        \"close\": \"当日收盘价\",\r\n        \"turnover_rate\": \"换手率\",\r\n        \"turnover_rate_f\": \"换手率-自由流通股\",\r\n        \"volume_ratio\": \"量比\",\r\n        \"pe\": \"市盈率\",\r\n        \"pe_ttm\": \"市盈率TTM\",\r\n        \"pb\": \"市净率\",\r\n        \"ps\": \"市销率\",\r\n        \"ps_ttm\": \"市销率TTM\",\r\n        \"dv_ratio\": \"股息率\",\r\n        \"dv_ttm\": \"股息率TTM\",\r\n        \"total_share\": \"总股本\",\r\n        \"float_share\": \"流通股本\",\r\n        \"free_share\": \"自由流通股本\",\r\n        \"total_mv\": \"总市值\",\r\n        \"circ_mv\": \"流通市值\",\r\n        \"limit_status\": \"涨跌停状态\"\r\n    },\r\n    \"stock_forecast\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"ann_date\": \"公告日期\",\r\n        \"end_date\": \"报告期\",\r\n        \"type\": \"业绩预告类型\",\r\n        \"p_change_min\": \"预告净利润变动下限-%\",\r\n        \"p_change_max\": \"预告净利润变动上限-%\",\r\n        \"net_profit_min\": \"预告净利润下限-万元\",\r\n        \"net_profit_max\": \"预告净利润上限-万元\",\r\n        \"last_parent_net\": \"上年同期归母净利润-万元\",\r\n        \"notice_times\": \"公布次数\",\r\n        \"first_ann_date\": \"首次公告日\",\r\n        \"summary\": \"业绩预告摘要\",\r\n        \"change_reason\": \"业绩变动原因\",\r\n        \"update_flag\": \"更新标志\"\r\n    },\r\n    \"stock_dividend\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"end_date\": \"分送年度\",\r\n        \"ann_date\": \"预案公告日\",\r\n        \"div_proc\": \"实施进度\",\r\n        \"stk_div\": \"每股送转合计\",\r\n        \"stk_bo_rate\": \"每股送股比例\",\r\n        \"stk_co_rate\": \"每股转增比例\",\r\n        \"cash_div\": \"每股分红-税后\",\r\n        \"cash_div_tax\": \"每股分红-税前\",\r\n        \"record_date\": \"股权登记日\",\r\n        \"ex_date\": \"除权除息日\",\r\n        \"pay_date\": \"派息日\",\r\n        \"div_listdate\": \"红股上市日\",\r\n        \"imp_ann_date\": \"实施公告日\",\r\n        \"base_date\": \"基准日\",\r\n        \"base_share\": \"实施基准股本-万\",\r\n        \"update_flag\": \"是否变更过\"\r\n    },\r\n    \"stock_report\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"ann_date\": \"公告日期\",\r\n        \"end_date\": \"报告期\",\r\n        \"eps\": \"每股收益\",\r\n        \"dt_eps\": \"稀释每股收益\",\r\n        \"total_revenue_ps\": \"每股营业总收入\",\r\n        \"revenue_ps\": \"每股营业收入\",\r\n        \"capital_rese_ps\": \"每股资本公积\",\r\n        \"surplus_rese_ps\": \"每股盈余公积\",\r\n        \"undist_profit_ps\": \"每股未分配利润\",\r\n        \"extra_item\": \"非经常性损益\",\r\n        \"profit_dedt\": \"扣非净利润\",\r\n        \"gross_margin\": \"毛利\",\r\n        \"current_ratio\": \"流动比率\",\r\n        \"quick_ratio\": \"速动比率\",\r\n        \"cash_ratio\": \"保守速动比率\",\r\n        \"invturn_days\": \"存货周转天数\",\r\n        \"arturn_days\": \"应收账款周转天数\",\r\n        \"inv_turn\": \"存货周转率\",\r\n        \"ar_turn\": \"应收账款周转率\",\r\n        \"ca_turn\": \"流动资产周转率\",\r\n        \"fa_turn\": \"固定资产周转率\",\r\n        \"assets_turn\": \"总资产周转率\",\r\n        \"op_income\": \"经营活动净收益\",\r\n        \"valuechange_income\": \"价值变动净收益\",\r\n        \"interst_income\": \"利息费用\",\r\n        \"daa\": \"折旧与摊销\",\r\n        \"ebit\": \"息税前利润\",\r\n        \"ebitda\": \"息税折旧摊销前利润\",\r\n        \"fcff\": \"企业自由现金流量\",\r\n        \"fcfe\": \"股权自由现金流量\",\r\n        \"current_exint\": \"无息流动负债\",\r\n        \"noncurrent_exint\": \"无息非流动负债\",\r\n        \"interestdebt\": \"带息债务\",\r\n        \"netdebt\": \"净债务\",\r\n        \"tangible_asset\": \"有形资产\",\r\n        \"working_capital\": \"营运资金\",\r\n        \"networking_capital\": \"营运流动资本\",\r\n        \"invest_capital\": \"全部投入资本\",\r\n        \"retained_earnings\": \"留存收益\",\r\n        \"diluted2_eps\": \"期末摊薄每股收益\",\r\n        \"bps\": \"每股净资产\",\r\n        \"ocfps\": \"每股经营现金流净额\",\r\n        \"retainedps\": \"每股留存收益\",\r\n        \"cfps\": \"每股现金流量净额\",\r\n        \"ebit_ps\": \"每股息税前利润\",\r\n        \"fcff_ps\": \"每股企业自由现金流量\",\r\n        \"fcfe_ps\": \"每股股东自由现金流量\",\r\n        \"netprofit_margin\": \"销售净利率\",\r\n        \"grossprofit_margin\": \"销售毛利率\",\r\n        \"cogs_of_sales\": \"销售成本率\",\r\n        \"expense_of_sales\": \"销售期间费用率\",\r\n        \"profit_to_gr\": \"净利润/营业总收入\",\r\n        \"saleexp_to_gr\": \"销售费用率\",\r\n        \"adminexp_of_gr\": \"管理费用率\",\r\n        \"finaexp_of_gr\": \"财务费用率\",\r\n        \"impai_ttm\": \"资产减值损失/营收\",\r\n        \"gc_of_gr\": \"营业总成本/营收\",\r\n        \"op_of_gr\": \"营业利润/营收\",\r\n        \"ebit_of_gr\": \"息税前利润/营收\",\r\n        \"roe\": \"ROE\",\r\n        \"roe_waa\": \"加权平均ROE\",\r\n        \"roe_dt\": \"扣非ROE\",\r\n        \"roa\": \"ROA\",\r\n        \"npta\": \"总资产净利润率\",\r\n        \"roic\": \"投入资本回报率\",\r\n        \"roe_yearly\": \"年化ROE\",\r\n        \"roa2_yearly\": \"年化ROA\",\r\n        \"roe_avg\": \"平均ROE\",\r\n        \"opincome_of_ebt\": \"经营净收益/利润总额\",\r\n        \"investincome_of_ebt\": \"价值变动净收益/利润总额\",\r\n        \"n_op_profit_of_ebt\": \"营业外收支净额/利润总额\",\r\n        \"tax_to_ebt\": \"所得税/利润总额\",\r\n        \"dtprofit_to_profit\": \"扣非净利润/净利润\",\r\n        \"salescash_to_or\": \"销售收现/营业收入\",\r\n        \"ocf_to_or\": \"经营现金流/营业收入\",\r\n        \"ocf_to_opincome\": \"经营现金流/经营净收益\",\r\n        \"capitalized_to_da\": \"资本支出/折旧摊销\",\r\n        \"debt_to_assets\": \"资产负债率\",\r\n        \"assets_to_eqt\": \"权益乘数\",\r\n        \"dp_assets_to_eqt\": \"权益乘数-杜邦\",\r\n        \"ca_to_assets\": \"流动资产/总资产\",\r\n        \"nca_to_assets\": \"非流动资产/总资产\",\r\n        \"tbassets_to_totalassets\": \"有形资产/总资产\",\r\n        \"int_to_talcap\": \"带息债务/投入资本\",\r\n        \"eqt_to_talcapital\": \"归母权益/投入资本\",\r\n        \"currentdebt_to_debt\": \"流动负债/负债合计\",\r\n        \"longdeb_to_debt\": \"非流动负债/负债合计\",\r\n        \"ocf_to_shortdebt\": \"经营现金流/流动负债\",\r\n        \"debt_to_eqt\": \"产权比率\",\r\n        \"eqt_to_debt\": \"归母权益/负债合计\",\r\n        \"eqt_to_interestdebt\": \"归母权益/带息债务\",\r\n        \"tangibleasset_to_debt\": \"有形资产/负债合计\",\r\n        \"tangasset_to_intdebt\": \"有形资产/带息债务\",\r\n        \"tangibleasset_to_netdebt\": \"有形资产/净债务\",\r\n        \"ocf_to_debt\": \"经营现金流/负债合计\",\r\n        \"ocf_to_interestdebt\": \"经营现金流/带息债务\",\r\n        \"ocf_to_netdebt\": \"经营现金流/净债务\",\r\n        \"ebit_to_interest\": \"已获利息倍数\",\r\n        \"longdebt_to_workingcapital\": \"长期债务/营运资金\",\r\n        \"ebitda_to_debt\": \"息税折旧摊销前利润/负债\",\r\n        \"turn_days\": \"营业周期\",\r\n        \"roa_yearly\": \"年化总资产净利率\",\r\n        \"roa_dp\": \"总资产净利率-杜邦\",\r\n        \"fixed_assets\": \"固定资产合计\",\r\n        \"profit_prefin_exp\": \"扣除财务费用前营业利润\",\r\n        \"non_op_profit\": \"非营业利润\",\r\n        \"op_to_ebt\": \"营业利润/利润总额\",\r\n        \"nop_to_ebt\": \"非营业利润/利润总额\",\r\n        \"ocf_to_profit\": \"经营现金流/营业利润\",\r\n        \"cash_to_liqdebt\": \"货币资金/流动负债\",\r\n        \"cash_to_liqdebt_withinterest\": \"货币资金/带息流动负债\",\r\n        \"op_to_liqdebt\": \"营业利润/流动负债\",\r\n        \"op_to_debt\": \"营业利润/负债合计\",\r\n        \"roic_yearly\": \"年化投入资本回报率\",\r\n        \"total_fa_trun\": \"固定资产周转率\",\r\n        \"profit_to_op\": \"利润总额/营业收入\",\r\n        \"q_opincome\": \"单季度经营净收益\",\r\n        \"q_investincome\": \"单季度价值变动净收益\",\r\n        \"q_dtprofit\": \"单季度扣非净利润\",\r\n        \"q_eps\": \"单季度每股收益\",\r\n        \"q_netprofit_margin\": \"单季度销售净利率\",\r\n        \"q_gsprofit_margin\": \"单季度销售毛利率\",\r\n        \"q_exp_to_sales\": \"单季度销售期间费用率\",\r\n        \"q_profit_to_gr\": \"单季度净利润/营收\",\r\n        \"q_saleexp_to_gr\": \"单季度销售费用率\",\r\n        \"q_adminexp_to_gr\": \"单季度管理费用率\",\r\n        \"q_finaexp_to_gr\": \"单季度财务费用率\",\r\n        \"q_impair_to_gr_ttm\": \"单季度资产减值/营收\",\r\n        \"q_gc_to_gr\": \"单季度营业总成本/营收\",\r\n        \"q_op_to_gr\": \"单季度营业利润/营收\",\r\n        \"q_roe\": \"单季度ROE\",\r\n        \"q_dt_roe\": \"单季度扣非ROE\",\r\n        \"q_npta\": \"单季度总资产净利润率\",\r\n        \"q_opincome_to_ebt\": \"单季度经营净收益/利润总额\",\r\n        \"q_investincome_to_ebt\": \"单季度价值变动净收益/利润总额\",\r\n        \"q_dtprofit_to_profit\": \"单季度扣非净利润/净利润\",\r\n        \"q_salescash_to_or\": \"单季度销售收现/营收\",\r\n        \"q_ocf_to_sales\": \"单季度经营现金流/营收\",\r\n        \"q_ocf_to_or\": \"单季度经营现金流/经营净收益\",\r\n        \"basic_eps_yoy\": \"每股收益同比-%\",\r\n        \"dt_eps_yoy\": \"稀释每股收益同比-%\",\r\n        \"cfps_yoy\": \"每股经营现金流同比-%\",\r\n        \"op_yoy\": \"营业利润同比-%\",\r\n        \"ebt_yoy\": \"利润总额同比-%\",\r\n        \"netprofit_yoy\": \"归母净利润同比-%\",\r\n        \"dt_netprofit_yoy\": \"扣非净利润同比-%\",\r\n        \"ocf_yoy\": \"经营现金流同比-%\",\r\n        \"roe_yoy\": \"ROE同比-%\",\r\n        \"bps_yoy\": \"每股净资产较年初增长-%\",\r\n        \"assets_yoy\": \"总资产较年初增长-%\",\r\n        \"eqt_yoy\": \"归母权益较年初增长-%\",\r\n        \"tr_yoy\": \"营业总收入同比-%\",\r\n        \"or_yoy\": \"营业收入同比-%\",\r\n        \"q_gr_yoy\": \"单季度营业总收入同比-%\",\r\n        \"q_gr_qoq\": \"单季度营业总收入环比-%\",\r\n        \"q_sales_yoy\": \"单季度营业收入同比-%\",\r\n        \"q_sales_qoq\": \"单季度营业收入环比-%\",\r\n        \"q_op_yoy\": \"单季度营业利润同比-%\",\r\n        \"q_op_qoq\": \"单季度营业利润环比-%\",\r\n        \"q_profit_yoy\": \"单季度净利润同比-%\",\r\n        \"q_profit_qoq\": \"单季度净利润环比-%\",\r\n        \"q_netprofit_yoy\": \"单季度归母净利润同比-%\",\r\n        \"q_netprofit_qoq\": \"单季度归母净利润环比-%\",\r\n        \"equity_yoy\": \"净资产同比-%\",\r\n        \"rd_exp\": \"研发费用\",\r\n        \"update_flag\": \"更新标识\"\r\n    }\r\n}\n\nFile v1.0.4:skill-card.md\n\n## Description:\n\nQuantAll gives an agent a local A-share market analysis workflow for vectorized factor analysis, strategy backtesting, IC analysis, stock screening, visualization, and optional DuckDB data maintenance through MCP tools.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[mifochen](https://clawhub.ai/user/mifochen)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill when they explicitly need quantitative A-share analysis, such as factor testing, strategy backtesting, IC analysis, stock selection, visualization, or preparing a local DuckDB-backed market database.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill asks the agent to create a local virtual environment, install packages, modify MCP configuration, and start a localhost MCP service.\n\nMitigation: Require explicit user consent before local setup or service startup, and review all configuration changes before applying them.\n\nRisk: The optional UpdateStock workflow reads and writes DuckDB databases and uses a Tushare token that may be stored locally.\n\nMitigation: Use a dedicated database path, back up important data, store the Tushare token carefully, and rotate it if exposure is suspected.\n\nRisk: The security review warns against running untrusted JSON task files or Python scripts through QuantAll.\n\nMitigation: Only execute task files or Python scripts from trusted sources after reviewing their contents and expected filesystem effects.\n\nRisk: The security review specifically advises against using the sandbox-disable workaround.\n\nMitigation: Keep sandbox protections enabled and resolve installation conflicts by rebuilding the virtual environment or using standard package management steps.\n\n## Reference(s):\n\n- [QuantAll playbook](references/quantall_playbook.md)\n- [ClawHub release page](https://clawhub.ai/mifochen/skills/quant-all-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline commands, Python snippets, MCP configuration JSON, and summarized analysis results.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May guide local process startup, local file creation, MCP configuration changes, DuckDB reads/writes, and summarized quantitative analysis outputs.]\n\n## Skill Version(s):\n\n1.0.4 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.4:requirements.txt\n\nquantall==1.0.8\n\nArchive v1.0.3: 10 files, 69785 bytes\n\nFiles: references/quantall_playbook.md (29159b), requirements.txt (17b), scripts/data/ai_prompts.toml (46045b), scripts/data/db_translate.json (11634b), scripts/Start_QuantAll.py (83b), scripts/UpdateStock_script.py (50880b), scripts/UpdateStock_skill.py (89115b), skill-card.md (2905b), SKILL.md (12702b), _meta.json (132b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: quantall-mcp\ndescription: >\n  QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。\n  AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。\n  让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。\n  触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。\n  不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。\n  能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、\n  修改 MCP 配置、启动本地 HTTP 服务（localhost:8686）、创建配置文件和启动脚本。\n  所有涉及用户电脑的操作，AI 必须事先告知用户并获得同意。\n  UpdateStock 为可选辅助 MCP（数据库管理，需 tushare API），非 QuantAll 必需。\nagent_created: true\nlicense: MIT\n---\n\n# QuantAll（全A解析）MCP 技能\n\n---\n\n## 这是什么\n\nQuantAll 是一台运行在用户本地电脑上的**全市场向量化计算引擎**。它把 A 股 5000+ 只股票、150+ 维度的数据组织为统一矩阵，AI 只需编写简短的 Python 向量化代码片段，就能在数秒内完成全市场运算——因子计算、策略回测、IC 分析、多维可视化。\n\n**对 AI 的意义**：不再只是\"查询信息然后转述\"，而是能**用代码算出客观结果**。用户问\"小盘股是不是比大盘股表现好\"，AI 不需要去搜索别人的观点，而是直接用全市场数据算出 IC 指标、回测收益，给出有数据支撑的结论。这是从\"数据搬运工\"到\"数据分析师\"的根本转变。\n\n> **工具详细用法**（参数、触发场景、代码模板、核心函数）在 `scripts/data/ai_prompts.toml` 中，MCP 连接后 AI 自动获取。SKILL.md 只讲顶层定位、安装、启动、更新和 AI 行为规范。实战案例参见 `references/quantall_playbook.md`。\n\n---\n\n## 架构\n\n| 组件 | 类型 | 定位 | 依赖 |\n|------|------|------|------|\n| **QuantAll**（全A解析） | HTTP MCP (localhost:8686) | 计算引擎：因子计算/回测/IC分析/可视化 | 本地 DuckDB 数据库 |\n| **UpdateStock** | stdio MCP（可选） | 数据库管理：创建/更新/查询行情 | tushare API key |\n\n两者共用同一个 DuckDB 数据库，路径通过 `scripts/DB_setting.json` 管理。**QuantAll 独立可运行，UpdateStock 不是必需依赖**——有自己的数据库或仅用内置测试库即可。\n\n---\n\n## 📦 安装（首次安装，AI 必读）\n\n> ⚠️ **AI 行为规范**：安装前必须告知用户以下操作内容并获得同意：\n> - 在 `scripts/` 下创建 Python 虚拟环境（约 45 个依赖包，300MB+ 磁盘空间）\n> - 从清华 PyPI 镜像源下载安装 quantall 库\n> - 修改 `~/.workbuddy/mcp.json` 添加 MCP 服务配置\n> - 后续启动时会运行本地 HTTP 服务（localhost:8686）并可能弹出用户协议窗口\n\n```\n□ 1. 创建 venv：\n   <Python路径> -m venv <skill-dir>/scripts/.venv\n   推荐：C:/Users/<用户>/.workbuddy/binaries/python/versions/3.13.12/python.exe\n\n□ 2. pip 安装（务必用清华源，否则 PySide6 等大包下载超时）：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 3. 验证安装：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"from QuantAll import Start_main; print('OK')\"\n\n□ 4. 配置 MCP（修改 ~/.workbuddy/mcp.json）：\n   见下方 MCP 配置\n\n□ 5. 启动服务：\n   <skill-dir>/scripts/.venv/Scripts/python.exe <skill-dir>/scripts/Start_QuantAll.py\n   检查 8686 端口是否监听\n\n□ 6. ⚠️ 提醒用户重连 MCP 连接器（或重启 WorkBuddy）\n```\n\n**常见坑**：\n- **Git Bash 路径**：传参给 Python 必须用 `C:/` 前缀（非 `/c/`），否则双重转义找不到文件\n- **safe-delete 冲突**：WorkBuddy Python 运行时可能拦截 pip 文件覆盖，报 `SAFE_DELETE_FAIL_CLOSED`。解决：重建 venv（`rm -rf .venv && python -m venv .venv`）后重试，或用 `dangerouslyDisableSandbox: true`\n- **import 大小写**：`from QuantAll import ...`（大写 Q、A），`import quantall` 会失败\n\n### MCP 配置\n\n```json\n{\n  \"mcpServers\": {\n    \"全A解析\": { \"url\": \"http://127.0.0.1:8686/mcp\", \"disabled\": false },\n    \"UpdateStock\": {\n      \"command\": \"<skill-dir>/scripts/.venv/Scripts/python.exe\",\n      \"args\": [\"<skill-dir>/scripts/UpdateStock_skill.py\"],\n      \"disabled\": false\n    }\n  }\n}\n```\n\n> UpdateStock 可选——不配置也能用 QuantAll。仅需要计算引擎时只配「全A解析」。\n\n### 数据库\n\nQuantAll 首次启动自动创建 `scripts/DB_setting.json`，默认连接 pip 包内置的 Test.duckdb（仅沪深300近两年基础行情，**仅供测试，pip 更新会覆盖**）。\n\n正式使用需切换到自己的数据库（修改 `db_path`）：\n\n| 方案 | 说明 |\n|------|------|\n| A. 内置 Test.duckdb | pip 包自带，仅沪深300近两年基础行情，仅供测试 |\n| B. UpdateStock 创建 | 需 tushare：2000+ 积分全市场 / 200 积分免费精简版 |\n| C. 自有数据库 | 修改 `DB_setting.json` 的 `db_path` 直连 |\n\n> ⚠️ **AI 行为规范**：修改 `DB_setting.json` 前告知用户当前数据库路径和将要切换的目标路径。\n\n### 桌面快捷方式（可选，AI 主动询问）\n\n安装后 AI 应主动询问：\"是否需要创建桌面快捷方式？\"创建 `scripts/run.bat`（后台启动，无控制台窗口），再为它创建桌面 `.lnk`。\n\n> ⚠️ **不要在桌面创建 .bat 文件**——Windows cmd 以 GBK 读取 .bat，AI 写入的 UTF-8 中文会乱码。正确做法：先创建 `scripts/run.bat`，再创建指向它的桌面 `.lnk`。\n\n---\n\n## 🚀 启动\n\nQuantAll 是独立的 HTTP 服务，**不依赖 UpdateStock 启动**。三种方式任选其一：\n\n| 方式 | 操作 | 适用场景 |\n|------|------|---------|\n| AI 调用 | 通过 UpdateStock MCP 的 `Start_QuantAll` 工具 | AI 场景，可自动检测端口 |\n| 双击 run.bat | 后台启动，无控制台窗口 | 手动场景最方便 |\n| 命令行 | `<skill-dir>/scripts/.venv/Scripts/python.exe Start_QuantAll.py` | 调试或自定义 |\n\n> ⚠️ **AI 行为规范**：启动服务前告知用户——QuantAll 将在本地 8686 端口启动 HTTP 服务，并可能弹出用户协议确认窗口。\n\n**用户协议**：首次启动弹协议窗口，点击确认即\"激活\"（永久同意），功能无差异。未确认前除 `ping` 外所有工具被阻止（合规要求）。\n\n**MCP 重连**：QuantAll 后于 AI 启动时，需断开重连 MCP 连接器（或重启 WorkBuddy）。首次连接需点击\"信任\"授权。\n\n---\n\n## 🔄 更新/升级\n\n> **核心规则**：技能包文件更新后，Python 库 `quantall` 也必须同步升级，否则新接口在旧库上会报错。\n\n```\n□ 1. 升级库：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install --upgrade quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 2. 验证版本：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"import QuantAll; print(QuantAll.__version__)\"\n   确认 >= requirements.txt 要求的版本\n\n□ 3. 重启 QuantAll 服务（先关旧进程再启动）\n\n□ 4. ⚠️ 提醒用户重连 MCP\n```\n\n- safe-delete 冲突时：先 `pip uninstall quantall`，再 `pip install quantall`\n- `pip install --upgrade` 是幂等的，不确定是否需要升级时直接执行\n- 版本检测：对比 `_meta.json` 的 version 与已安装库 `QuantAll.__version__`\n\n---\n\n## ⚠️ AI 操作用户电脑的行为规范\n\n本技能涉及多项用户电脑操作。AI 执行前**必须告知用户**将要做什么、产生什么影响：\n\n| 操作 | 告知内容 |\n|------|---------|\n| 创建 venv | 将在 `scripts/` 下创建虚拟环境（约 300MB 磁盘空间） |\n| pip install | 从清华源下载约 45 个包（含 PySide6 等大型包） |\n| 修改 mcp.json | 将添加 MCP 服务配置到 `~/.workbuddy/mcp.json` |\n| 启动服务 | 将在 localhost:8686 启动 HTTP 后台服务 |\n| 创建文件 | 可能创建 `DB_setting.json`、`run.bat`、桌面 `.lnk` 快捷方式 |\n| 修改数据库路径 | 将修改 `DB_setting.json` 的 `db_path`，影响 QuantAll 读取的数据 |\n\n> **原则**：不在用户不知情的情况下执行任何系统操作。涉及文件创建、配置修改、服务启动等操作前，先说明意图，获得用户同意后再执行。\n\n---\n\n## 工具总览\n\n安装并连接 MCP 后，AI 通过 `scripts/data/ai_prompts.toml` 自动获取每个工具的详细用法（参数、触发场景、代码模板、核心函数）。以下是概览：\n\n| 工具 | 用途 |\n|------|------|\n| `ping` | 健康检查 |\n| `available_data` | 查看可用数据字段 |\n| `how_code` | 查看代码执行环境说明 |\n| `strategy_backtest` | 策略回测（收益/夏普/回撤/胜率） |\n| `factor_analysis` | 因子 IC 分析 |\n| `batch_factor_analysis` | 批量因子 IC 分析 |\n| `batch_factor_corr` | 因子间批量相关性计算 |\n| `save_factor_result` | 保存因子分析结果到数据库 |\n| `new_layer_from_code` | 创建可视化图层标记 |\n| `select_by_code` | 筛选股票（集合运算） |\n| `batch_select` | 批量筛选（多条件对比/交集/并集） |\n| `move_by_code` | 坐标平移映射 |\n| `weight_by_code` | 权重设置 |\n| `batch_weight` | 批量权重对比（多权重方案） |\n| `heat_map` | 热力图统计 |\n| `get_user_selection` | 获取用户 GUI 交互选中 |\n|`run_task_file`|执行本地json文件的任务，构建稳定任务流程|\n|`execute_python_script`|执行本地python脚本，在构建任务流程中可扩展功能|\n| `MCP_Close` | 关闭服务 ⚠️（仅不再需要时调用） |\n\n\n### AI 使用前必知\n\n- **先 ping 确认服务就绪**，未启动则引导用户启动\n- **先 available_data 确认字段**，不要假设字段名（数据库字段名经 `db_translate.json` 翻译层映射为中文）\n- **不支持并行调用**，所有工具串行执行（一个返回后再发下一个）\n- **代码必须向量化**：禁止 import / 循环 / lambda / axis=1，最后一行设 `out = ...`\n- **复权价格手动算**：`adj_close = d['close'] * d['adj_factor']`\n- **每股因子必须除以 close**（非复权价），比率类/增长率类不需要\n- **持仓矩阵必须用 `hold_until(buy, sell)`**，禁止手写逆序 cumsum\n- **内置函数**：`hold_until`/`entry_check`（持仓）、`time_at`/`time_between`/`time_in`（时间）、`row_rank`（截面排名）、`row_top_n`/`row_bottom_n`（截面 Top/Bottom N 筛选）\n- **detail 视图返回约 140 万字符**，AI 内部分析后只汇报结论，禁止直接展示\n\n> 详细参数说明、触发场景、代码模板、核心函数参考：`scripts/data/ai_prompts.toml`\n> 实战案例、模式对比、踩坑记录：`references/quantall_playbook.md`\n\n---\n\n## 版本历史\n\n- **v1.0** — 首版发布。13 个工具，配套 ai_prompts.toml 和 playbook 实战手册。PyPI 在线安装。\n- **v1.0.1** — 新增技能升级流程；requirements.txt 更新为 >=1.0.1；SKILL.md 精简至 500 行以内。\n- **v1.0.2** — 优化 clawhub 审查问题：触发条件收窄（仅明确量化需求时触发）、能力声明透明化（venv/pip/mcp.json/HTTP 服务全部显式声明）、新增 AI 操作用户电脑的行为规范表、详细工具用法指向 ai_prompts.toml 不在 SKILL.md 展开。新增批量分析工具 `batch_weight`/`batch_select`（对应 `weight_by_code`/`select_by_code` 的批量版本）。新增 `batch_factor_corr`（因子间批量相关性计算，支持自定义基准因子）。新增 `how_code`（代码执行环境说明，帮助 AI 快速上手）。新增 exec 内置函数 `row_top_n(df,n)`/`row_bottom_n(df,n)`（截面 Top/Bottom N 筛选）。热力图/直方图统计新增 `summary` 评估参数（分布均匀度/边缘突发等）。`batch_weight` 新增 `view` 参数（summary=评估参数/heatmap=完整矩阵）及\"权重未改变\"提示。`batch_select` mode 重命名为描述性名称（independent_summary/independent_heatmap/intersect/union）。修复批量因子分析执行异常及 batch_select intersect/union/independent 模式 bug。requirements.txt 固定版本号。\n-**v1.0.3**—requirements.txt 更新为 ==1.0.4，pip install --upgrade quantall 更新。新增技能`run_task_file`和`execute_python_script`。`batch_factor_corr`和`batch_factor_analysis`新增保存本地excel。新增`UpdateStock_script.py`数据库更新脚本。\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn798etnj1hernzd0bqw4cg9yx86fkc9\",\n  \"slug\": \"quant-all-mcp\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1785549502699\n}\n\nFile v1.0.3:references/quantall_playbook.md\n\n# QuantAll 实战手册\n\n> 本文件是 QuantAll（全A解析）的使用经验积累文档。SKILL.md 负责\"怎么装、有什么工具\"，\n> 本文档负责\"怎么用好\"——实战模式、代码示例、踩坑记录。\n>\n> **AI 使用建议**：执行复杂分析任务前先快速浏览本文档，了解常见模式和陷阱。\n\n---\n\n## 1. 快速上手（5 分钟）\n\n### QuantAll 是什么\n\n一台本地计算引擎。你（AI）写一段向量化 Python 代码，它就在全市场 5000+ 只股票上并行执行，\n数秒内返回结果。**你不是在查询数据，你是在计算数据。**\n\n### 你能做什么\n\n| 你想要的 | 用什么工具 | 输出 |\n|----------|-----------|------|\n| 评估一个交易策略的收益 | `strategy_backtest` | 收益率/夏普/回撤/胜率 |\n| 验证某个因子是否有效 | `factor_analysis` | IC均值/IR/多空差 |\n| 找出符合条件的股票 | `select_by_code` | 股票列表 |\n| 探索数据的多维关系 | `move_by_code` + `heat_map` | 热力图统计矩阵 |\n| 标记事件/买点 | `new_layer_from_code` | 可视化短线 |\n\n### 你的代码执行环境\n\n```python\n# 可用的变量\nd          # dict[str, DataFrame] — 字段名 → 全市场面板数据（行=时间，列=股票）\ncol_attrs  # dict[str, Series]     — 股票属性（行业、市值等）\n\n# 内置模块\nnp, pd     # numpy + pandas\n\n# 内置函数\nhold_until(buy, sell)  # 生成持仓矩阵（回测必须用这个！）\nrow_rank(df)           # 截面排名 → 百分位值 0~1\nentry_check(window, conditions, mode=\"keep\")  # 买入窗口条件检测\ntime_at(rq)            # 匹配指定时间\ntime_between(srq, erq) # 匹配时间区间\ntime_in(rqs)           # 匹配多个时间\n\n# 复权价格（必须手动算！）\nadj_close = d['close'] * d['adj_factor']\nadj_high  = d['high']  * d['adj_factor']\nadj_low   = d['low']   * d['adj_factor']\n```\n\n### 数据库数据传播规则\n\n> **财报数据**（`stock_finance` 表）：会自动把公告日的数据**向后传播**（forward fill）到下一个公告日。也就是说，当你取任意日期的财报数据（如 ROE、营业收入），它会填充为最近一次公告的值——不会出现 NaN 空洞。\n>\n> **分红数据**（`dividend` 表）和**业绩预告数据**（`forecast` 表）：目前**只在公告日当天有数据，不会向后传播**。原因是\"传播到哪个日期\"存在技术细节难以确定（公告日和实际影响日之间的时间差不确定）。未来可能会增加相关操作，但目前这两张表取非公告日的数据就是 NaN。\n>\n> 含义：如果你在因子中使用分红率、预告净利润等字段，要意识到它们只存在于公告日期点上，不适合做连续的日频截面分析。\n\n### 三条铁律\n\n1. **禁止 import、for/while 循环、df.apply()、lambda、递归**\n2. **禁止 axis=1（行方向计算）**——各股票停牌时间不对齐\n3. **持仓矩阵必须用 `hold_until(buy, sell)`**，不能手写逆序 cumsum\n\n---\n\n## 2. strategy_backtest 四种视图详解\n\n> **关键认知**：`strategy_backtest` 有四个 view 模式，它们**不是\"选一个最好\"的关系**，而是**从不同维度拆解同一个策略**。标准分析流程是 `summary → segments → detail → timeline`（逐步深入）。\n\n### 四种视图对比\n\n| view | 粒度 | 回答什么问题 | 后续分析 | 绘图方式 |\n|------|------|-------------|----------|----------|\n| **summary** | 每只股票 | \"这个策略整体好不好？\" | ✅ select/move/weight/heat_map | 5585条收益曲线叠加 |\n| **segments** | 每次交易 | \"买入前什么因子影响收益？\" | ✅ 核心：分析因子与收益关系 | 持仓片段（起点=买入日） |\n| **detail** | 每只股票 | \"哪只股票表现最好/最差？\" | ✅ 同 summary | 和 summary 同一张图 |\n| **timeline** | 每日 | \"每日净值走势？时间分布？\" | ❌ **不支持二次分析** | 几条合成曲线（净值/排名/持仓比）\n\n### summary 输出结构\n\n```json\n{\n  \"分析的股票数量\": <N>,\n  \"时间范围\": \"<start> 至 <end>\",\n  \"盈利比率-%\": <百分比>,\n  \"跑赢基准比率-%\": <百分比>,\n  \"全局买入比\": <比率>,\n  \"全局持仓比\": <比率>,\n  \"统计分析\": {\n    \"总收益率-%\": { 平均值, 中位数, 最大值, 最小值, 标准差, 25%分位, 75%分位 },\n    \"年化收益率-%\": { ... },\n    \"最大回撤-%\": { ... },\n    \"夏普率\": { ... },\n    \"胜率-%\": { ... },\n    \"盈亏比\": { ... },\n    \"基准收益率(自身)-%\": { ... }\n  }\n}\n```\n\n> **如何使用 summary**：先看中位收益率和夏普率判断策略是否有价值，再看盈利比率和跑赢基准比率判断策略相对 buy&hold 的表现。分布偏度（均值 vs 中位数）可以判断是否少数牛股拉高均值。\n\n### segments 输出结构 + 绘图逻辑\n\n```json\n{\n  \"持仓片断总数\": <N>,\n  \"平均收益-%\": <平均>,\n  \"最大收益-%\": <最大值>,\n  \"最小收益-%\": <最小值>,\n  \"平均持仓时间\": <天数>,\n  \"最长持仓时间\": <天数>,\n  \"最短持仓时间\": <天数>\n}\n```\n\n**图形绘制方式**：\n\n```\nsegments 模式不是单只股票画一条线，而是把每段\"买入→卖出\"独立画成一条线。\n\n- 起点：每段买入日，坐标 (0, 1.0) —— 买入时收益为 1x（基准）\n- 终点：每段卖出日，坐标 (持仓天数, 卖出收益倍数)\n- X 轴：持仓天数（从 0 到 offset_days 或实际卖出天数）\n- Y 轴：收益倍数（1.0 = 买入点，向上 = 盈利，向下 = 亏损）\n- 红色：盈利片段（Y>1）\n- 绿色/青色：亏损片段（Y<1）\n- 一只股票多段持仓 → 被拆分成多条独立线段\n```\n\n**后续分析方法（每个片段的买入时间是关键日期）**：\n- `select_by_code`：按收益倍数筛选，或按持仓天数筛选——返回**片段维度**统计（权重=卖价/买价，非股票维度累计收益）\n- **核心设计**：segments 的真正价值不是看收益本身，而是分析\"**买入前**的各种参数和因子对最终收益的影响\"——把买入时的市值/换手率/估值等用 move_by_code 映射到坐标轴，再用 heat_map 做交叉分析\n- `move_by_code`：把买入时的因子值映射到 X/Y 轴（如买入时市盈率→X，买入时成交量→Y）\n- `weight_by_code`：调整权重（如按持仓天数加权）\n- `heat_map`：因子×收益的二维分布矩阵\n\n#### detail 输出结构\n\n```json\n{\n  \"总收益率-%\":    { \"000001\": <值>, \"000002\": <值>, ... },  // 每只股票逐一展开\n  \"年化收益率-%\":  { \"000001\": <值>, \"000002\": <值>, ... },\n  // 与 summary.statistics 的指标一一对应，但按股票逐一展开\n}\n```\n\n**⚠️ 重要警告**：\n- detail 返回数据量极大（全市场 × 多个指标），可能远超 AI 上下文窗口\n- **禁止直接向用户展示原始 detail 数据**——等于没展示\n- **正确做法**：AI 读取后自行分析（排序、筛选 Top/Bottom、找规律），只汇报结论\n- 推荐用法：筛选表现最好和最差的各 10 只 → 分析共性/原因\n\n#### timeline\n\n**绘制内容**：不画持仓片段，而是绘制 **5 条合成曲线**：\n\n| 曲线 | 颜色 | 含义 |\n|------|------|------|\n| **每日平均收益** | 🔴 红色 | 每天策略持仓的平均收益百分比 |\n| **平均收益排名** | 🟡 黄色 | 每天策略收益在全体股票中的排名均值 |\n| **持平股数/总股数** | 🔵 青色 | 当天持平（没变动）的股票占比 |\n| **买入股数/总股数** | ⚪ 白色 | 当天发出买入信号的股票占比 |\n| **卖出股数/总股数** | 🟣 紫色 | 当天发出卖出信号的股票占比 |\n\n**标题栏显示 5 条线的均值**，格式如：`收益%分布:X.XX 收益排序分布:X.XX 持仓比:X.XX 买点比:X.XX 卖点比:X.XX`\n\n**核心用途**：观察时间分布规律——哪些时间段收益好、哪些时间段回撤大、market timing 是否有效。\n\n**⚠️ 不支持二次分析**：timeline 是\"只读\"视图，不能用 `select_by_code`、`move_by_code`、`weight_by_code`、`heat_map` 等工具做进一步操作。看完就完了，想深入分析需要切到其他 view。\n\n### 四视图使用决策树\n\n```\n跑 strategy_backtest\n  │\n  ├─ view=summary → 总收益中位数为正？夏普>0.5？\n  │   ├─ 否 → 策略不行，换一个\n  │   └─ 是 → 继续\n  │\n  ├─ view=segments → 买入前因子对收益有什么影响？\n  │   核心操作：move_by_code（映射因子）+ heat_map（交叉分析）\n  │\n  ├─ view=detail → AI 内部分析 Top/Bottom 股票\n  │   给用户：Top 10 股票名称+收益、Bottom 10、行业分布规律\n  │   ⚠️ 绝不直接展示原始数据\n  │\n  └─ view=timeline → 查看时间分布规律\n      └─ ⚠️ 只读视图，不支持二次分析。看完切其他 view\n```\n\n### 从 summary 图开始的后续分析\n\n`strategy_backtest`（view=summary）执行后，软件端会绘制全市场持仓收益叠加图。这张图不是终点，而是后续深入分析的**起点**。\n\n#### 用 `select_by_code` 筛选图上数据\n\n`select_by_code` 可以对 summary 图上的所有股票进行条件筛选。**它不只是筛选器——天生自带统计功能**。返回结果中直接包含：\n\n```json\n{\n  \"全局平均\": <数值>,          // 选中股票的平均权重（默认=回测最终收益）\n  \"有效数量\": <N>,             // 实际命中的股票数\n  \"权重名称\": \"<指标名>\",      // 当前权重指标名称\n  \"Y轴统计\": [...],            // 如果有 move_by_code，按 Y 轴分 bin\n  \"Y轴细分\": [...],            // bin 边界\n  \"Y轴缩放\": <值>\n}\n```\n\n> 💡 **核心认知**：不用先 `select_by_code` 再 `heat_map`，select_by_code 本身就返回 `全局平均`——你可以直接知道\"这批股票的均值是多少\"。\n\n常见筛选维度：\n\n- **属性**：`col_attrs['所在城市']`、`col_attrs['所属行业']`（Series，直接对比）\n- **关键日**：用 `time_at` 取某一天的数值（如某日涨幅大的股票）→ bool DataFrame → 广播成全维度 DataFrame\n\n> ⚠️ **使用某一天数值的正确方法**：`select_by_code` 等工具要求 `out` 是与 `d['close']` 同维度的 DataFrame，不能直接用某天的 Series。**正确做法**是用 `time_at` 生成 bool DataFrame，把目标日数值广播到全维度——全程向量化，无需循环（`for` 循环在 exec 环境中本就禁止）：\n> ```python\n> # 筛选某日涨幅>阈值的股票（向量化方法）\n> ret = (d['close'] * d['adj_factor']).pct_change()\n> # 1. time_at 获取 bool DataFrame，True→1，False→NaN\n> mask = time_at('目标日期').astype(float)\n> mask = mask.where(mask > 0, np.nan)\n> # 2. 乘上对应因子的数值（目标日有值，其余为 NaN）\n> day_ret = mask * ret\n> # 3. 向前向后填充 NaN（把目标日数值传播到所有日期）\n> day_ret = day_ret.ffill().bfill()\n> # 4. 添加条件\n> out = day_ret > 阈值\n> ```\n\n> ⚠️ **select_by_code 不回测数据过滤**：`select_by_code` 只影响 GUI 图层显示，不会过滤 `strategy_backtest` 的股票范围。想只测某个子集 → 需要其他方式（或观察 select_by_code + heat_map 的统计结果）。\n\n#### 用 `move_by_code` 和 `weight_by_code` 控制绘图\n\nSummary 图的坐标和权重是可以调整的：\n- **平移（move_by_code）**：把其他维度映射到 X 或 Y 轴，实现多维视图。例如把市值映射到 X 轴，看市值与收益的关系\n- **权重（weight_by_code）**：默认按最终收益加权，一般不需要修改。但你可以按自定义规则加权（如按持仓天数加权）\n\n> 同样注意：平移/权重输出必须是和 `d['close']` 同维度的 DataFrame。若需用某一天数值，同样用 `time_at` + 填充广播（见上方方法），不要用 `for` 循环复制\n\n#### 做内力图（热力图分析）\n\n筛选出子集后，可以进一步做**内力图**（多维热力图）：\n\n```\nselect_by_code（筛选子集）\n  → move_by_code(x)（映射维度，如市值）\n  → move_by_code(y)（映射维度，如换手率）\n  → weight_by_code（可选：调整权重）\n  → heat_map（获取二维统计矩阵）\n  → 分析矩阵密度分布\n```\n\n#### 操作链：从 summary 到深度分析\n\n```\nstrategy_backtest(summary) → 画全市场图\n  ↓\nselect_by_code（筛选行业/城市/关键日）\n  ↓\n  ├─ 再跑 strategy_backtest（只测筛选子集）→ detail/segments 看明细\n  ├─ 或 move_by_code + weight_by_code → 调整绘图维度\n  ├─ 或 new_layer_from_code → 标记新事件\n  └─ 或 heat_map → 内力图做多维交叉分析\n```\n\n---\n\n## 3. factor_analysis 三项模式详解\n\n> **核心认知**：`factor_analysis` 有三个 mode，和 `strategy_backtest` 的 view 一样，是从不同维度评估因子有效性。\n\n### 三种模式对比\n\n| mode | MCP 返回 | 软件端绘图 | 后续分析 | 核心用途 |\n|------|---------|-----------|----------|---------|\n| **summary** | 聚合统计（IC均值/IR/正占比/多空差） | 散点图：X=收益排序，Y=因子排序，红=高收益，绿=低收益 | **支持** `move_by_code` + `heat_map` + `select_by_code` | **第一步必跑**，判断因子是否有效 |\n| **daily** | 每日IC时间序列 + 每日前/后10%IC | 时序曲线图：X=时间，Y=IC值，三条曲线（蓝=每日IC/红=前10%/绿=后10%） | **不支持**（只读视图） | 看IC时序稳定性、时段特征 |\n| **scatter** | 同 summary 的聚合统计 | 时序散点图：X=时间（按天排列，每天因子排序缩放到0-0.8）+ 因子排序，Y=因子排序，红=高收益，绿=低收益 | **支持** 在时间维度上进一步分析 | 观察因子-收益关系随时间的演变，局部放大可做切片分析 |\n\n> **关键区别**：\n> - `summary` 是**全局截面**散点——所有(日期,股票)混在一起，看整体因子-收益关系\n> - `scatter` 是**时序截面**散点——每个时间切片（一天）独立排列，能看到垂直条纹（不同日期的IC强度差异），局部放大可分析特定时段\n> - `daily` 是**纯时序曲线**——只看IC随时间的变化，不支持二次分析\n> \n> `scatter` 和 `summary` 返回同样的聚合统计数据，但绘图方式不同、后续分析能力不同。`daily` 是只读视图。\n\n### daily 模式返回格式\n\n```json\n{\n  \"每日IC信息\": \"                每日IC  每日前10%IC  每日后10%IC\\nYYYY-MM-DD -0.XXXXX -0.XXXXX -0.XXXXX\\n...\"\n}\n```\n\n- **每日IC**：每天的 Rank IC（Spearman 秩相关）\n- **每日前10%IC**：因子值最高 10% 股票的 IC 贡献\n- **每日后10%IC**：因子值最低 10% 股票的 IC 贡献\n- **最后 `feature_days` 行全为 NaN**——因为没有足够未来数据计算\n\n### 实战用法\n\n```python\n# 单因子分析\nfactor_analysis(name=\"换手率\", code=\"out = d['换手率']\", feature_days=20, mode=\"summary\")\n\n# 复合因子（各自排名后等权组合）\nfactor_analysis(\n    name=\"低换手小市值\",\n    code=\"turnover_rank = row_rank(d['换手率'])\\nsize_rank = row_rank(d['总市值'])\\nout = (1 - turnover_rank) + (1 - size_rank)\",\n    feature_days=20,\n    mode=\"summary\"\n)\n\n# 动量因子\nfactor_analysis(\n    name=\"20日动量\",\n    code=\"adj_close = d['close'] * d['adj_factor']\\nout = adj_close.pct_change(20)\",\n    feature_days=20,\n    mode=\"daily\"  # 看 IC 时序稳定性\n)\n```\n\n> ⚠️ **注意**：`factor_analysis` 内部已自动做排名转换（Spearman Rank IC），代码中不需要手动 `row_rank()`。但如果要组合多个因子，需要手动 rank 后再组合（确保量纲一致）。\n\n### 因子分析涉及的关键指标\n\n| 指标 | 含义 | 使用建议 |\n|------|------|---------|\n| IC均值 | 因子值与未来收益的 Spearman 秩相关系数均值 | 绝对值越大越好，正=因子值越高收益越高 |\n| IC_IR | IC均值 / IC标准差 | 衡量因子的风险调整后预测力，通常 \\|IR\\|>0.3 视为有效 |\n| IC正占比 | IC>0 的天数比例 | 偏离50%越多越好 |\n| 多空差 | 因子值最高组 vs 最低组的收益差 | 衡量因子区分度 |\n| feature_days | 评估未来第 N 天的收益 | 长周期（20d）通常比短周期（5d）IC更强 |\n\n### 因子分析 decision tree\n\n```\n跑 factor_analysis\n  │\n  ├─ mode=summary → |IC_IR| > 0.3？IC正占比偏离50%？\n  │   ├─ 否 → 因子无效，换一个\n  │   └─ 是 → 继续\n  │\n  ├─ mode=daily → IC 时序稳定？有没有长期同符号？\n  │   如果频繁正负翻转 → 因子不稳定，时效性强\n  │   ⚠️ 只读视图，不支持二次分析\n  │\n  └─ mode=scatter → 查看时序截面分布（软件端可视化）\n      全局看垂直条纹（时间维度IC差异），局部放大做切片分析\n      支持 move_by_code / heat_map 在时间维度上进一步挖掘\n```\n\n---\n\n## 4. 三大场景操作手册\n\n### 场景一：用户有明确需求\n\n用户直接要求回测、因子分析、选股等。\n\n**标准流程**：\n```\nping → available_data（确认字段存在）→ 写 code → 执行工具 → summary 快评 → 按需深入\n```\n\n**常见模式**：\n\n```python\n# 回测需求 → strategy_backtest（先 summary，再 detail/timeline）\nadj_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)\n```\n\n```python\n# 因子分析 → factor_analysis\nout = d['换手率']  # 简单因子直接输出字段\n# 或复合因子：\nm_rank = row_rank((d['close'] * d['adj_factor']).pct_change(20))\ns_rank = row_rank(d['总市值'])\nout = 0.6 * m_rank + 0.4 * (1 - s_rank)\n```\n\n### 场景二：用户模糊表述想法\n\n用户没说\"回测\"或\"因子分析\"，但表达了与股市相关的直觉或疑问。\n\n**关键原则**：把\"模糊想法\"翻译成\"可计算的量化问题\"。\n\n**判断清单**（用户说什么 → 你可以算什么）：\n\n| 用户的模糊表述 | 可量化的分析 | 用什么工具 |\n|-------------|------------|-----------|\n| \"XX 之后一般会涨还是跌？\" | 事件发生后 N 日收益的统计 | `strategy_backtest` |\n| \"XX 是不是影响收益？\" | 因子 IC 分析 | `factor_analysis` |\n| \"哪些股票最近 XX？\" | 条件筛选 | `select_by_code` + `new_layer_from_code` |\n| \"XX 和 YY 有什么关系？\" | 双因子多维分析 | `move_by_code` × 2 + `heat_map` |\n| \"最近 X 类型的股票表现如何？\" | 筛选 + 最近 N 日涨跌幅 | `select_by_code` + `move_by_code` |\n\n**标准流程**：\n```\n理解用户意图 → 翻译成可量化问题 → available_data（确认有对应字段）\n→ 写 code → 执行 → 读结果 → 用数据回答（而非\"网上说...\"）\n```\n\n### 场景三：AI 自主挖掘机会\n\n你主动设计分析假设，利用 QuantAll 的技术闭环验证。\n\n**技术闭环**：\n```\n假设 → code → QuantAll 执行 → 读返回数据 → 形成结论 → 可能迭代\n```\n\n**可以做的事情**：\n- 扫描多个因子的 IC，找出近期有效的因子\n- 测试常见技术指标在过去 N 年的胜率\n- 组合多因子看看有没有协同效应\n- 按行业分组分析因子表现差异\n\n**注意事项**：\n- 每个假设用独立的工具调用，不要一次跑太多\n- 先 `available_data` 确认字段可用\n- 把结论和原始数据一起呈现给用户（提供不确定性范围，不要过度自信）\n- 结论里标注用的是哪个参数、哪个时间段\n\n---\n\n## 5. 代码模式库\n\n### 穿越信号\n\n```python\n# 上穿阈值\ncross_up   = (val > threshold) & (val.shift(1) <= threshold)\n\n# 下穿阈值\ncross_down = (val < threshold) & (val.shift(1) >= threshold)\n\n# DataFrame vs DataFrame 金叉/死叉（两边都要 shift！）\ngolden_cross = (ma_short > ma_long) & (ma_short.shift(1) <= ma_long.shift(1))\ndead_cross   = (ma_short < ma_long) & (ma_short.shift(1) >= ma_long.shift(1))\n```\n\n### 技术指标实现\n\n```python\n# RSI (14)\nadj_close = d['close'] * d['adj_factor']\ndelta = adj_close.diff()\ngain  = delta.clip(lower=0).rolling(14).mean()\nloss  = (-delta.clip(upper=0)).rolling(14).mean()\nrsi   = 100 - 100 / (1 + gain / loss)\n\n# KDJ\nadj_close = d['close'] * d['adj_factor']\nlow_c  = d['low']  * d['adj_factor']\nhigh_c = d['high'] * d['adj_factor']\nlow9   = low_c.rolling(9).min()\nhigh9  = high_c.rolling(9).max()\nrsv    = (adj_close - low9) / (high9 - low9) * 100\nk_val  = rsv.ewm(com=2, adjust=False).mean()\nd_val  = k_val.ewm(com=2, adjust=False).mean()\nj_val  = 3 * k_val - 2 * d_val\n\n# 波动率\nret    = (d['close'] * d['adj_factor']).pct_change()\nvol_20 = ret.rolling(20).std()\n\n# 成交量放量\nvol_ma_20   = d['vol'].rolling(20).mean()\nvolume_spike = d['vol'] > vol_ma_20 * 2\n```\n\n### 持仓矩阵生成（必须用 hold_until）\n\n```python\n# 标准双信号\nbuy  = ...  # bool DataFrame\nsell = ...  # bool DataFrame\nout  = hold_until(buy, sell)\n\n# 多卖点（多个卖出条件自动 OR 合并）\nout = hold_until(buy, [sell1, sell2, sell3])\n```\n\n### 多因子组合\n\n```python\n# 各自排名 → 加权组合\nf1_rank = row_rank(d['因子1'])\nf2_rank = row_rank(d['因子2'])\nf3_rank = row_rank(1 - d['因子3'])  # 反向因子用 1 - rank\nout = 0.5 * f1_rank + 0.3 * f2_rank + 0.2 * f3_rank\n```\n\n---\n\n## 6. 常见错误和解决方案\n\n### E1：axis=1 行方向计算\n\n**症状**：代码里用了 `axis=1` 的聚合或排序\n**原因**：各股票停牌时间不同，行不对齐\n**解决**：所有计算按列方向（axis=0 / 默认），不要跨股票比较同一行\n\n### E2：忘记复权\n\n**症状**：回测结果看起来不对\n**原因**：直接用 `d['close']` 而没用 `d['close'] * d['adj_factor']`\n**解决**：所有价格运算前先手动乘 adj_factor\n\n### E3：手写逆序 cumsum 而非 hold_until\n\n**症状**：持仓矩阵逻辑错误，出现\"空仓但没卖\"、\"持仓但没买\"\n**原因**：逆序 fill/cumsum 的逻辑容易出错\n**解决**：全部改用 `hold_until(buy, sell)`\n\n### E4：穿越信号两边忘记 shift\n\n**症状**：信号在当天产生而非次日\n**原因**：DataFrame 交叉时只 shift 了一边\n**解决**：两边都 shift：`(A > B) & (A.shift(1) <= B.shift(1))`\n\n### E5：字段名不存在\n\n**症状**：代码引用了不存在的字段\n**解决**：先调用 `available_data` 确认字段名。数据库内原始字段名与 AI 看到的名称中间有 `db_translate.json` 翻译层\n\n### E6：factor_analysis 中重复 row_rank\n\n**症状**：因子分析不需要自己调 row_rank\n**原因**：`factor_analysis` 内部已自动做排名转换\n**解决**：`out = d['字段名']` 即可，不需要 `out = row_rank(d['字段名'])`\n\n### E7：并行调用返回 \"有其它任务在执行\"\n\n**症状**：同时对 QuantAll 发多个工具调用，后面的返回 `\"有其它任务在执行，稍后再试\"`\n**原因**：QuantAll 是单线程执行引擎，不支持并发\n**解决**：所有 QuantAll 工具调用必须**串行**——上一个返回后才发下一个。同一策略的不同 view 也要一个一个跑。\n\n### E8：timeline/factor_analysis pandas 3.0.3 兼容性问题（✅ 已修复）\n\n**症状1**：`strategy_backtest(view=\"timeline\")` 返回 `\"异常：call stack is not deep enough\"`\n**症状2**：`factor_analysis` 报 `Argument 'f_days' has incorrect type (expected str, got int)` 或 `feature_days` 参数不生效\n**根因**：**pandas 3.0.3 兼容性问题**。QuantAll 早期代码基于 pandas 2.* 开发，pandas 3.0+ 中部分行为变更（`str` 类型不再是 `object`、部分日期处理行为变更、`inplace` 参数废弃、类型签名更严格等）。\n**解决**：更新代码兼容 pandas 3.0.3。`factor_analysis` 三种 mode（summary/daily/scatter）和不同 `feature_days` 值均已验证正常。\n**⚠️ 重要提醒**：后续如果遇到任何 QuantAll 工具执行异常（非语法错误类），**可能是 pandas 3.0.3 兼容性问题**，应提醒用户检查。\n\n### E9：`select_by_code` / `move_by_code` / `weight_by_code` 传入 Series 报错\n\n**症状**：用了 `col_attrs['所属行业']` 或某个 Series 作为这些工具的 `out`，执行失败\n**原因**：这些工具要求 `out` 是**DataFrame**（行=时间，列=股票），和 `d['close']` 维度一致。`col_attrs` 返回的是 Series（一个值对应一只股票），维度不匹配\n**解决**：把 Series 复制成全量 DataFrame：\n```python\n# 错误：out 是 Series\ncode = \"out = col_attrs['所属行业'] == '银行'\"\n\n# 正确：复制到和 d['close'] 同维度\ns = (col_attrs['所属行业'] == '银行').astype(bool)\nout = d['close'].notna().copy()  # 先创建同维度模板\nfor col in out.columns:\n    out[col] = s[col]\n```\n\n### E10：`select_by_code` 筛选文本属性时报错\n\n**症状**：`col_attrs['所属行业']` 是文本字符串，直接比较报错或执行失败\n**原因**：exec 环境对文本操作有限制，或行业名称含中文/特殊字符\n**解决**：文本属性可以直接用 `.get(col, '') == '目标值'` 做字符串比较。如果失败，先查有哪些可用值。\n\n### E11：select_by_code 选了子集，回测仍然跑全市场\n\n**症状**：先 `select_by_code` 筛了某个子集，再 `strategy_backtest`，结果仍是全市场。\n**原因**：`select_by_code` 只影响 GUI 图层的选中状态，不过滤 `strategy_backtest` 的数据范围。\n**解决**：用 `select_by_code` + `heat_map` / `move_by_code` 的组合来分析子集，或直接用 `select_by_code` 的 `全局平均` 对比。不要期望 select 能过滤回测数据。\n\n### E12：stock_factor 表部分字段读取异常（⚠️ 已部分解决）\n\n**症状**：`d['换手率']`、`d['市盈率TTM']` 等 `stock_factor` 表中的字段在 `move_by_code` 中报读取异常。\n**解决**：`factor_analysis` 中可以正常使用这些字段（`d['换手率']`、`d['市盈率TTM']`、`d['市净率']`、`d['ROE']`、`d['股息率TTM']`、`d['总市值']` 等均实测正常）。`move_by_code` 场景下的兼容性待进一步验证。基础价量字段（`close`/`vol`/`amount`/`adj_factor`）始终稳定可用。\n\n---\n\n## 7. 热力图分析方法论\n\n热力图是 QuantAll 的核心可视化工具，通过 `move_by_code` + `weight_by_code` + `heat_map` 三件套实现多维分析。\n\n### 基本流程\n\n```\nnew_layer_from_code（标记事件/选股）\n→ move_by_code(direction=\"x\")（设置 X 轴维度）\n→ move_by_code(direction=\"y\")（设置 Y 轴维度）\n→ weight_by_code（可选：设置权重）\n→ heat_map（读取热力图统计）\n→ 分析矩阵数据，形成结论\n```\n\n### 典型用法\n\n```\n# 分析\"因子 A × 因子 B\"的多维关系\n1. new_layer_from_code：标记所有感兴趣的事件/买点\n2. move_by_code(x)：映射维度 A\n3. move_by_code(y)：映射维度 B\n4. heat_map：得到 A×B 的二维分布矩阵\n\n# 分析\"维度 × 收益率\"的关系\n1. new_layer_from_code：标记所有买入事件\n2. move_by_code(x)：放量倍数 = d['vol'] / vol_ma20\n3. move_by_code(y)：未来 N 日收益率\n4. heat_map：得到放量×收益的二维分布矩阵\n```\n\n### heat_map 返回数据格式\n\n```\nmatrix[i][j]: i=Y轴行, j=X轴列, origin=bottom-left\n```\n\n---\n\n## 8. 进阶技巧\n\n### 多步骤串联\n\n不要试图在一个 code 里做所有事。用多个工具串联：\n\n```\nselect_by_code（初筛）→ new_layer_from_code（标记）→ move_by_code（分析）\n→ heat_map（统计）→ 如果发现规律 → strategy_backtest（验证）\n```\n\n### 迭代分析\n\n同一个问题可以多轮迭代：\n\n```\n第一轮：factor_analysis(mode=summary) → 看 IC 概览\n第二轮：factor_analysis(mode=daily)   → 看 IC 时序稳定性\n第三轮：factor_analysis(mode=scatter) → 看截面分布\n第四轮：move_by_code + heat_map       → 多维交叉验证\n```\n\n### 善用 offset_days\n\n`strategy_backtest` 的 `offset_days` 跳过指标预热期，避免开头的 NaN 干扰：\n\n```python\n# MA20 至少需要 20 天数据才稳定\nstrategy_backtest(name=\"MA策略\", code=..., offset_days=20, view=\"summary\")\n```\n\n### 严格回测 vs 收盘操作\n\n- `use_price=\"close\"`：当日收盘价成交（实战可用性偏低）\n- `use_price=\"next_open\"`：次日开盘成交（推荐，更贴近实盘）\n\n量价分析用 close 没问题，但策略回测优先用 next_open。\n\n---\n\n## 附录：工具速查\n\n| 工具 | 一句话 | code 输出类型 |\n|------|--------|--------------|\n| `strategy_backtest` | 策略回测 | bool（持仓矩阵） |\n| `factor_analysis` | 因子有效性评估 | 数值（因子值） |\n| `new_layer_from_code` | 创建标记图层 | bool（True=标记） |\n| `select_by_code` | 筛选股票 | bool（True=选中） |\n| `move_by_code` | 坐标轴映射 | 数值（控制位置） |\n| `weight_by_code` | 统计权重 | 数值（控制权重） |\n| `heat_map` | 热力图统计 | 不需要 code |\n| `available_data` | 查看可用字段 | 不需要 code |\n| `ping` | 健康检查 | 不需要 code |\n| `get_user_selection` | 用户当前选中 | 不需要 code |\n\nFile v1.0.3:scripts/data/ai_prompts.toml\n\n# 注意！！！\r\n# 修改此文件，可能会影响AI的运行，导致的具体后果由用户自行负责\r\n# \r\n# 全A解析 AI 提示词配置文件\r\n# 可以自行调整和优化提示词\r\n# AI 工作规律：用 name 快速定位，用 description 第一句确认，再读细节执行\r\n# ==============================================\r\n\r\n# 顶层的提示词\r\nmcp = \"\"\"\r\n你是量化策略分析助手，【全A解析】是你的分析平台。\r\n\r\n【平台概述】\r\n全A解析覆盖A股5000+股票，提供统一的Python exec计算环境，\r\n你可以用代码片段直接计算全市场数据，平台自动完成绘制、排序、分组、统计。\r\n\r\n【数据结构】\r\n- d: dict，key=字段名，value=DataFrame（个股×时间面板）\r\n  - 列=股票代码，行=时间，停牌NaN已置顶或置底\r\n  - 各股时间不对齐，禁止行方向聚合（axis=1）\r\n- col_attrs: dict，key=属性名，value=Series（股票属性，数值或字符串）\r\n- 内置：np, pd；禁止：import / 循环 / df.apply / lambda / 递归 / axis=1\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 更多字段用 available_data 查看（130+字段，含财务、因子、行业等）\r\n\r\n【核心工作流】\r\n1. 画图层 — new_layer_from_code / strategy_backtest(segments)\r\n   代码输出 bool DataFrame，True 位置自动绘制短线（最小绘制单元=股票+时间点）\r\n2. 筛选/查询 — select_by_code\r\n   在已有图层中筛选符合条件的数据\r\n3. 排序/平移 — move_by_code\r\n   按算法计算值控制短线在轴上的位置，支持转百分位排名、分桶、自动缩放\r\n4. 统计 — heat_map\r\n   对当前图层进行分组统计，返回数量矩阵和权重矩阵（默认权重=数量等权）\r\n5. 策略回测 — strategy_backtest\r\n   生成持仓矩阵，评估收益、胜率、夏普、回撤等，四种视角：summary/detail/segments/timeline\r\n6. 因子分析 — factor_analysis\r\n   生成因子的数值矩阵，评估因子的IC\r\n7. 统计权重 — weight_by_code\r\n   对统计权重进行自定义计算，替代默认的数量等权\r\n8. 批量权重 — batch_weight\r\n   weight_by_code 的批量版本，一次对比多个权重方案，不改变活动权重。view=\"summary\"返回评估参数，view=\"heatmap\"返回完整矩阵\r\n9. 批量筛选 — batch_select\r\n   select_by_code 的批量版本，一次对比多个筛选条件或批量交集/并集。mode: independent_summary/independent_heatmap/intersect/union\r\n10. 因子相关性 — batch_factor_corr\r\n    批量计算多个因子与基准因子的相关性（IC/IR/time_potential + 分层IC），用于因子去冗余和互补性分析\r\n11. 计算环境 — how_code\r\n    查看代码执行环境说明（变量、函数、规则），首次使用时调用了解环境\r\n\r\n【软件自动处理】\r\n- 数值输出自动缩放、转排序、分组（不需要AI写代码）\r\n- bool输出自动绘制短线，不需要处理绘制逻辑\r\n\r\n【你的任务】\r\n理解用户意图，选择合适的工具组合完成任务。\r\n常见场景：\r\n- 画图分析：画图层 → 排序 → 统计 → 分析分布\r\n- 策略回测：strategy_backtest → 按结果画图层 → 排序统计 → 诊断优化\r\n- 挖掘机会：用条件筛选 → 画图层 → 观察分布 → 回测验证\r\n\"\"\"\r\n\r\n[tool]\r\n\r\nstrategy_backtest = \"\"\"\r\n【触发场景】\r\n策略回测的优先工具。涉及以下场景时应首先使用：\r\n- 评估策略收益、回测、跑赢基准\r\n- 生成买入/卖出信号并测试表现\r\n- 比较不同策略参数的效果\r\n- 任何需要\"用代码定义交易逻辑并看收益\"的需求\r\n该工具独立完成 信号生成→持仓构建→收益评估 的完整闭环，\r\n现阶段应作为策略分析的默认首选，而非最后手段。\r\n\r\n【功能说明】\r\n用策略代码生成持仓矩阵（bool DataFrame），评估收益、胜率、夏普、回撤等指标。\r\n执行价格默认 close（可在收盘前操作），可选 next_open（次日开盘买入，适合严格回测）。\r\n\r\n【Python exec 环境】\r\n- d: dict，key=字段名，value=pd.DataFrame（个股×时间面板）\r\n  - 停牌导致的 NaN 已置顶或置底，避免干扰窗口计算\r\n  - 因此各股票时间不对齐，禁止行方向计算（axis=1 的聚合/排序）\r\n- col_attrs: dict，key=属性名，value=pd.Series（股票属性，数值或字符串）\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 复权价格：adj_close = d['close'] * d['adj_factor']，high/low 同理\r\n- 内置：np, pd\r\n- 禁止：import / for/while循环 / df.apply() / lambda / 递归 / 行方向聚合（axis=1）\r\n- 更多字段用 available_data 工具查看\r\n\r\n【输出规则】\r\nout = bool DataFrame，True 表示持仓。连续 True 片段的第一个为买入，最后一个为卖出。\r\n\r\n【核心函数】\r\n\r\n1. hold_until(buy, sell) — 生成持仓矩阵\r\n   从买入信号开始持仓，直到遇到卖出信号。买卖同日则放弃该买点。\r\n   - buy: bool DataFrame，买入信号（仅取每段第一个）\r\n   - sell: bool DataFrame，或 list/tuple of DataFrame（多个卖点自动 OR 合并）\r\n   - 返回: bool DataFrame\r\n   示例：\r\n     # 单卖点\r\n     buy = (D.shift(1) <= 20) & (D > 20)\r\n     sell = (D.shift(1) >= 80) & (D < 80)\r\n     out = hold_until(buy, sell)\r\n     # 多卖点\r\n     out = hold_until(buy, [sell1, sell2])\r\n\r\n2. entry_check(window, conditions, mode=\"keep\") — 买入窗口条件检测\r\n   在连续窗口内检测条件信号，输出指定区域。用于过滤买入机会。\r\n   - window: bool DataFrame，连续评估区间\r\n   - conditions: bool DataFrame 或 list，要检测的信号（多个自动 OR）\r\n   - mode: keep / discard / left / right / start / end / next\r\n   示例：\r\n     # 买入前10天内是否出现过放量，只保留末尾有效买点\r\n     window = buy.shift(10, fill_value=False).rolling(11).max().astype(bool)\r\n     volume_spike = d['vol'] > d['vol'].rolling(20).mean() * 2\r\n     out = entry_check(window, volume_spike, mode=\"end\")\r\n\r\n【时间函数】\r\n\r\n3. get_time() — 返回 DataFrame，每个单元格为时间datetime64[us]\r\n4. get_time_id() — 返回 DataFrame，每个单元格为数据库内时间序号\r\n5. time_at(rq) — 匹配指定时间，rq 为整数或负数（如 time_at(-1) 最后一天）\r\n6. time_between(srq, erq) — 匹配时间区间（左闭右开）\r\n7. time_in(rqs) — 匹配多个指定时间\r\n\r\n【排名函数】\r\n\r\n8. row_rank(df, split=[]) — 按行截面排名，返回百分位值（0~1）\r\n   - split: 板块切分点，如 split=[400000, 700000] 按代码切为三组独立排名\r\n   示例：\r\n     rank_all = row_rank(d['vol'])\r\n     rank_by_board = row_rank(d['vol'], split=[400000, 700000])\r\n\r\n9. row_top_n(df, n) — 每行（同一时间截面）最大的 n 个为 True\r\n   - df: 数值 DataFrame\r\n   - n: 每行取前 n 个最大值\r\n   - 返回: bool DataFrame，True 位置为该时间截面值最大的 n 只股票\r\n   示例：\r\n     out = row_top_n(d['vol'], 3)       # 每天成交量最大的3只股票\r\n     out = row_top_n(d['总市值'], 10)    # 每天市值最大的10只股票\r\n\r\n10. row_bottom_n(df, n) — 每行（同一时间截面）最小的 n 个为 True\r\n    - df: 数值 DataFrame\r\n    - n: 每行取前 n 个最小值\r\n    - 返回: bool DataFrame，True 位置为该时间截面值最小的 n 只股票\r\n    示例：\r\n      out = row_bottom_n(d['vol'], 3)       # 每天成交量最小的3只股票\r\n      out = row_bottom_n(d['总市值'], 10)    # 每天市值最小的10只股票\r\n\r\n【重要提示】\r\n- 持仓生成必须用 hold_until，不要手写逆序 cumsum\r\n- 穿越（上穿/下穿）信号自己写 shift 比较：\r\n  上穿阈值：(val > threshold) & (val.shift(1) <= threshold)\r\n  下穿阈值：(val < threshold) & (val.shift(1) >= threshold)\r\n  DataFrame vs DataFrame 金叉/死叉：两边都要 shift\r\n- 所有数据操作必须向量化，禁止循环\r\n- row_rank 返回百分位值（0~1），可直接用于因子标准化\r\n\"\"\"\r\n\r\n\r\nping = \"健康检查\"\r\n\r\n\r\nnew_layer_from_code = \"\"\"\r\n【触发场景】创建图层 / 画图 / 绘制 / 画出 / 生成图层 / 标记买点 / 标记卖点 / 标记事件\r\n\r\n【功能说明】在活动画布上新建图层，本质是标记一批 (股票, 关键日期) 的**散点**。软件端对每个散点往后绘制 N 天行情（默认 5 天，GUI 可调），但那是给用户看的视觉呈现——AI 分析的是散点截面数据。\r\n\r\n【双视角关键理解】\r\n- AI 视角：每个 True = 一个离散的 (股票, 日期) 散点。散点本身只定位到标记日，但 move/weight/select 代码中可用 .shift() 将标记日前后任意天的数据拉到散点上计算。\r\n- 用户视角：GUI 端以标记日为起点自动绘制 N 天 K 线，方便直观观察形态。绘制模式只影响视觉呈现。\r\n\r\n【Shift 机制】AI 分析散点的核心能力\r\n  .shift(N)  → 取标记日**之前**第 N 天数据（如标记前估值水位、量能累积）\r\n  .shift(-N) → 取标记日**之后**第 N 天数据（如未来收益、最大回撤）\r\n示例：weight_by_code(code=\"adj_close.shift(-5)/adj_close - 1\") → 以\"标记后第5天收益\"为权重\r\n\r\n【图层机制】单图层，新替旧\r\n软件只维护一个活动图层：new_layer_from_code / strategy_backtest / factor_analysis(scatter) 都会创建图层，新图层替换旧图层。\r\n设计意图：\"聚焦\"——换条件 = 焦点转移，旧图层不再需要。不要同时维护多个图层。\r\n\r\n【默认状态】无平移 + 无权重（数量等权）\r\n\r\n【完整分析管道】\r\nnew_layer_from_code（标记散点）\r\n→ move_by_code(x)（X轴映射）→ move_by_code(y)（Y轴映射）\r\n→ weight_by_code（可选：调整权重）→ select_by_code（可选：筛选子集，支持集合运算）\r\n→ heat_map（获取二维统计矩阵）\r\n\r\n【三大场景模板】\r\n1. 买点分析：标记买入信号 → Y轴=未来收益\r\n2. 卖点分析：标记卖出信号 → Y轴=未来收益\r\n3. 因子视觉化：标记全日期 → X=因子, Y=未来收益 → 替代/补充 factor_analysis\r\n\r\n【输出规则】out = 布尔DataFrame，True位置绘制短线并标记为后续分析的数据点\r\n【关键规则】new_layer_from_code 之后必须跟上后续分析（move/weight/select/heat_map），单独的图层没有意义\r\n\"\"\"\r\n\r\nselect_by_code = \"\"\"\r\n【触发场景】找出 / 查询 / 筛选 / 标记 / 选择\r\n\r\n【功能说明】在当前图层中按条件筛选散点。6种集合运算。筛选后自动重新统计所有维度。\r\n在 move/weight 之后使用——继承 X/Y 轴映射和权重配置，筛选后自动重新分桶。\r\n\r\n【6种集合模式】\r\n  A       → 替换当前选中（初始筛选/切换视角）\r\n  AB      → 当前选中 ∩ 新条件（多条件收窄）\r\n  A+B     → 当前选中 ∪ 新条件（追加）\r\n  A-B     → 当前选中 - 新条件（移除）\r\n  B-A     → 新条件 - 当前选中（找不在已知集合中的）\r\n  A+B-AB  → 对称差（两集合不同部分）\r\n\r\n【关键规则】\r\n- select 不回测：只影响 GUI 图层统计，不影响 strategy_backtest 数据范围\r\n- select 后所有维度自动重新统计\r\n- 不需要 name 参数\r\n\r\n【输出规则】out = 布尔DataFrame → True位置选中\r\n\"\"\"\r\n\r\nmove_by_code = \"\"\"\r\n【触发场景】x轴映射/ y轴映射 / 平移 / 偏移/ 散开 / 移动 / X轴 / Y轴 / 分组 / 分布\r\n\r\n【功能说明】将散点的额外维度映射到坐标轴位置。new_layer 之后的核心步骤——没有 move，图层只是散点；有了 move，散点才有分析维度。\r\n\r\n【关键行为】\r\n- 同方向覆盖：第二次 direction=\"x\" 替换第一次的 X 映射（不叠加）\r\n- 双方向独立：X/Y 各自维护，互不干扰\r\n- shift 时效：.shift(-N) 有效，但尾部 NaN 会被丢弃导致有效数量减少\r\n- 返回完整热力图数据：有效数量、X/Y轴统计（10等分）、XY热力图数量+权重矩阵\r\n\r\n【to_percentile】\r\n- true（默认）：转排名值0~1，看\"高/中/低\"分段关联\r\n- false：保留原始值，⚠️ 金融数据天然偏态，分布不均是正常现象\r\n- 建议：先用 true 确认因子有效，再切 false 看真实值分布\r\n\r\n【optimized_display】大数据量（>10万点）或准备交互框选时开启，聚合优化显示不影响核心统计\r\n\r\n【与 shift 配合】move 中 .shift() 是分析\"标记后表现\"的核心手段\r\n  code=\"adj_close.shift(-N)/adj_close - 1\" → 未来 N 日收益（最常用）\r\n\r\n【代码模板】\r\n# X=市值排名, Y=未来20日收益\r\nmove_by_code(code=\"out = d['总市值']\", direction=\"x\")\r\nmove_by_code(code=\"adj_close.shift(-20)/adj_close - 1\", direction=\"y\", name=\"20日收益\")\r\n\r\n# 混合：X=标记前量比, Y=标记后最大涨幅\r\nmove_by_code(code=\"d['vol']/d['vol'].rolling(20).mean()\", direction=\"x\", name=\"量比\")\r\nmove_by_code(code=\"(adj_close.shift(-5)/adj_close).rolling(5,min_periods=1).max()-1\", direction=\"y\", name=\"5日最大涨幅\")\r\n\r\n【输出规则】out = 数值DataFrame → 用于控制平移分布\r\n【返回数据】matrix[i][j]: i=Y行, j=X列, origin=bottom-left\r\n\"\"\"\r\n\r\nweight_by_code = \"\"\"\r\n【触发场景】权重 / 统计权重 / 权重用* / 设置权重 / *作为权重\r\n\r\n【功能说明】控制散点的统计权重，影响 heat_map 的加权均值。默认\"数量\"等权。\r\n\r\n【关键行为】\r\n- 覆盖：新权重替换旧权重，不叠加\r\n- 全局平均：默认1.0（等权），加权后按实际量纲（数字大是数据本身量级，不是异常）\r\n- 轴统计→加权和，XY热力图新增权重矩阵，有效数量不变\r\n\r\n【权重选择建议】\r\n- 成交量/成交金额：反映市场参与度\r\n- 市值：反映经济规模\r\n- 未来收益：weight_by_code(code=\"adj_close.shift(-20)/adj_close - 1\")，按未来表现加权\r\n\r\n【代码模板】\r\nweight_by_code(code=\"out = d['vol']\", name=\"成交量加权\")\r\nweight_by_code(code=\"out = d['总市值']\", name=\"市值加权\")\r\n\r\n【输出规则】out = 数值DataFrame → 用于统计权重控制\r\n\"\"\"\r\n\r\nheat_map = \"\"\"\r\n【触发场景】统计 / 热力图 / 热力统计 / 分析 / 矩阵\r\n\r\n【功能说明】只读查询工具——获取当前图层的二维统计矩阵。不改变任何配置。\r\nmove/weight/select 返回中已嵌入默认10等分的热力图；heat_map 的额外价值是自定义范围+缩放粒度。\r\n\r\n【三种 mode】\r\n- auto：全部数据10等分统计（无参数，等于嵌入数据的默认值）\r\n- percent：指定排名范围[x_range, y_range]，在该范围内重新10等分\r\n- value：指定数值范围[x_range, y_range]，需配合 to_percentile=false 使用\r\n\r\n【矩阵结构】\r\nmatrix[i][j]: i=Y行(0=底=Y最小), j=X列(0=左=X最小), origin=bottom-left\r\n\r\n【使用时机】\r\n- 默认10等分数据已在 move/weight/select 返回中 → 通常无需单独调用\r\n- 需要放大某段、指定数值范围时 → 单独调用\r\n\"\"\"\r\n\r\nget_user_selection = \"\"\"\r\n【触发场景】分析选中的股票 / 这些点有什么特征 / 框选区域 / 分析选中 / 获取选中信息\r\n\r\n【功能说明】获取用户在 GUI 端通过鼠标框选的散点信息。QuantAll 支持用户交互——AI 绘制图层后，用户可对图形中感兴趣的区域直接框选，然后通过此工具让 AI 分析选中点的特征。构成\"AI 展示 → 用户观察 → 用户框选 → AI 深入分析\"的交互闭环。\r\n\r\n【GUI 交互操作速查】\r\n- 左键拖拽 = 平移画布\r\n- 中键滚轮/拖拽 = 缩放画布\r\n- 右键拖拽 = 框选（四色四向）：\r\n  ● 右下→左上（红色）= 重新选取（reset）\r\n  ● 右上→左下（绿色）= 清空选择（clear）\r\n  ● 左下→右上（紫色）= 添加选择（add）\r\n  ● 左上→右下（青色）= 扣除选择（subtract）\r\n- 选框仅对绘图散点有效，对中键连线无效；可设置为仅关键日期点有效\r\n- ≤20 选中点 → GUI 自动绘制 K线图 + 补全行情曲线\r\n- >20 选中点 → GUI 自动绘制热力统计图\r\n\r\n【设计意图】用户从\"被动看 AI 分析结果\"变为\"主动探索数据\"——看到异常区域、有趣分布，直接框选问 AI\"这些点有什么共同特征？\"。\r\n\r\n【返回结构】\r\n- 无选中：返回 \"当前用户无选中\"\r\n- 有选中：primary_code（主图股票/None）, top_100（选中的前100只代码）, select_count（选中散点数）, total_count（图层全部散点数——与 select_count 对比可知选中占比）\r\n- ⚠️ select_count > 100 时 top_100 仅为前100只，提醒用户\"选中范围过大，建议缩小后再分析\"\r\n- 实测示例：框选 4 条走势线 → select_count=4, total_count=36932（选中占比 ~0.01%）\r\n\"\"\"\r\n\r\navailable_data = \"\"\"\r\n【触发场景】AI获取可以的数据清单\r\n【功能说明】返回当前数据库中可用数据清单\r\n\"\"\"\r\n\r\n\r\nfactor_analysis = \"\"\"\r\n【触发场景】因子分析、评估因子、因子有效性、IC分析、因子IC\r\n\r\n【功能说明】\r\n评估因子与未来收益的关系。每个时间截面上，将因子值和未来收益分别转为截面排名百分位（0~1），再计算Spearman秩相关系数作为IC。\r\n\r\n【三种模式】\r\n\r\n| mode | 返回内容 | 软件端绘图 | 后续分析 | 用在哪 |\r\n|------|---------|-----------|----------|--------|\r\n| summary | 聚合统计（IC均值/IR/正占比/多空差） | 散点图：X=收益排序，Y=因子排序 | ✅ move+heat_map+select | 第一步，判断有没有效 |\r\n| daily | 每日IC序列 + 前/后10%IC | 三条时序曲线（蓝/红/绿） | ❌ 只读 | 看稳定性，看时段特征 |\r\n| scatter | 同summary统计 | 时序散点（每天独立排列） | ✅ 时间维度分析 | 看因子随时间演变 |\r\n\r\n关键区别：\r\n- summary=全局截面（所有日期混一起），scatter=时序截面（每天独立）\r\n- daily=纯时序曲线，只看IC波动，不能做后续操作\r\n\r\n标准流程：summary（判断有效）→ daily（看稳定性）→ scatter（看演变）→ move+heat_map（交叉验证）\r\n\r\n参数：\r\n- feature_days：评估未来第N天的收益，默认1。长周期（20d）通常比短周期IC更强\r\n\r\n⚠️【关键排名规则（必须遵守！）】\r\n- 单因子：工具内部已自动做排名转换，代码中直接输出原始值即可：\r\n  out = d['换手率']          ← 正确，不要加 row_rank\r\n  out = row_rank(d['换手率'])  ← 错误！工具会重复排名\r\n- 复合因子：多个子因子必须各自 row_rank 排名后再加权组合（确保量纲一致）：\r\n  f1 = row_rank(d['因子A'])\r\n  f2 = row_rank(1 - d['因子B'])   ← 反向因子用 1-rank\r\n  out = 0.5 * f1 + 0.5 * f2      ← 排名后再加权\r\n\r\n⚠️【每股因子必须除以股价（实测验证！）】\r\n每股类因子（EPS/BPS/每股资本公积/每股未分配利润等）是绝对值，受股价规模影响极大。\r\n必须除以 d['close']（非复权价）转换为比率，否则 IC 被价格规模噪声淹没：\r\n  out = d['每股收益'] / d['close']           ← 正确！E/P（盈利收益率）\r\n  out = d['每股净资产'] / d['close']          ← 正确！B/P（账面市值比）\r\n  out = d['每股资本公积'] / d['close']         ← 正确！IR 从 0.05→0.59（实测最强因子）\r\n  out = d['每股收益']                         ← 错误！IR≈0，绝对值无预测力\r\n- 比率类/增长率类因子（换手率、ROE、营收增速等）不需要除以 close\r\n- 规则：因子值是\"每股X元\"这种绝对值 → 除以 close → 变成\"每元股价含X元\"的比率\r\n\r\n【核心函数】\r\nrow_rank(df) — 按行截面排名，返回百分位值（0~1）\r\n用于构建复合因子：多个子因子各自排名后按比例加权组合。\r\n单因子无需调用，工具外部会自动排名。\r\n\r\n【实战代码模板】\r\n\r\n# 单因子（最简单）\r\nout = d['换手率']\r\n\r\n# 动量因子\r\nadj_close = d['close'] * d['adj_factor']\r\nout = adj_close.pct_change(20)\r\n\r\n# 复合因子：低换手 + 小市值\r\nt = row_rank(d['换手率'])\r\ns = row_rank(d['总市值'])\r\nout = (1 - t) + (1 - s)\r\n\r\n# 复合因子：动量 + 小市值（加权）\r\nadj_close = d['close'] * d['adj_factor']\r\nm = row_rank(adj_close.pct_change(20))\r\ns = row_rank(d['总市值'])\r\nout = 0.6 * m + 0.4 * (1 - s)\r\n\r\n【返回字段】\r\n- IC均值/IC标准差/IC_IR：全样本IC统计，IC_IR=均值/标准差。|IR|>0.3 视为有效\r\n- IC正占比：IC为正的天数占比，偏离50%越多方向越稳定\r\n- 多空排名差：因子值最高组与最低组的收益排名差，越大区分度越好\r\n- 前10%平均排名/后10%平均排名：因子极端分组在收益排名上的表现（0.5为平均）\r\n- 前10%IC/后10%IC：仅保留极端10%因子值后计算的IC，评估尾部信号集中度\r\n- 极端IC差：前10%IC与后10%IC之差\r\n\r\n【daily 模式返回格式】\r\n每日IC信息字段返回三列TSV：每日IC  每日前10%IC  每日后10%IC\r\n- 每日IC：当天的 Rank IC\r\n- 前/后10%IC：仅保留极端10%因子值的IC\r\n- 最后 feature_days 行全为NaN（无足够未来数据）\r\n\r\n【输出规则】\r\nout = 数值 DataFrame，作为因子值输入。\r\n\"\"\"\r\n\r\nbatch_factor_analysis = \"\"\"\r\n【触发场景】批量因子分析、同时分析多个因子、批量评估因子有效性、批量IC分析、把多个因子都分析一下、逐个分析这些因子\r\n\r\n【功能说明】\r\nfactor_analysis 的批量版本。一次传入多个因子（factor_dict: 因子名称→因子代码），逐个计算IC，每完成一个因子立即报告该因子的IC指标（增量流式），全部完成后输出汇总对比表。\r\n\r\n与 factor_analysis 的区别：\r\n- factor_analysis：单因子，每次传一个 name+code\r\n- batch_factor_analysis：多因子，一次传 factor_dict（name→code 字典），自动逐个分析并逐个报告\r\n\r\n【参数说明】\r\n- feature_days：未来多少天后的收益，≥1，默认1。对所有因子统一生效\r\n- factor_dict：因子名称→因子代码 的字典。key 为因子名称（用于报告标识），value 为因子代码（Python exec 表达式）\r\n  示例：{\"换手率\": \"out = d['换手率']\", \"动量20日\": \"out = adj_close.pct_change(20)\", \"低换手+小市值\": \"t=row_rank(d['换手率']);s=row_rank(d['总市值']);out=(1-t)+(1-s)\"}\r\n\r\n【返回机制】\r\n引擎逐个因子计算，GUI端可看到中间进度（1/3、2/3等），但 AI 层只收到最终完整结果——一个 list，包含所有因子的结果字典。\r\n\r\n⚠️ AI 行为要求：\r\n- 收到完整结果后，逐个向用户报告每个因子的有效性结论（不要只报综合结论）\r\n- 重点标注有效因子（|IR|>0.3）和无效因子\r\n- 全部报告完毕后，给出综合对比结论\r\n\r\n【Python exec 环境】（与 factor_analysis 完全一致）\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 复权价格：adj_close = d['close'] * d['adj_factor']\r\n- 内置：np, pd；禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n\r\n⚠️【关键排名规则（与 factor_analysis 一致）】\r\n- 单因子：工具内部已自动做排名转换，代码中直接输出原始值即可：\r\n  out = d['换手率']          ← 正确\r\n  out = row_rank(d['换手率'])  ← 错误！重复排名\r\n- 复合因子：多个子因子必须各自 row_rank 排名后再加权组合：\r\n  f1 = row_rank(d['因子A'])\r\n  f2 = row_rank(1 - d['因子B'])\r\n  out = 0.5 * f1 + 0.5 * f2\r\n\r\n⚠️【每股因子必须除以股价（实测验证！）】\r\n每股类因子（EPS/BPS/每股资本公积/每股未分配利润等）是绝对值，必须除以 d['close']（非复权价）：\r\n  \"每股收益\": \"out = d['每股收益'] / d['close']\"        ← 正确\r\n  \"每股资本公积\": \"out = d['每股资本公积'] / d['close']\" ← 正确（IR=0.59最强）\r\n  \"每股收益\": \"out = d['每股收益']\"                      ← 错误（IR≈0）\r\n比率类/增长率类因子不需要除以 close。\r\n\r\n【代码模板（factor_dict 值的写法）】\r\n\r\n# 单因子（最简单）\r\n\"换手率\": \"out = d['换手率']\"\r\n\"市盈率\": \"out = d['市盈率TTM']\"\r\n\"总市值\": \"out = d['总市值']\"\r\n\r\n# 动量因子\r\n\"动量20日\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.pct_change(20)\"\r\n\r\n# 复合因子\r\n\"低换手+小市值\": \"t=row_rank(d['换手率']);s=row_rank(d['总市值']);out=(1-t)+(1-s)\"\r\n\r\n# 批量调用示例\r\nbatch_factor_analysis(feature_days=20, factor_dict={\r\n    \"换手率\": \"out = d['换手率']\",\r\n    \"动量20日\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.pct_change(20)\",\r\n    \"低换手+小市值\": \"t=row_rank(d['换手率']);s=row_rank(d['总市值']);out=(1-t)+(1-s)\"\r\n})\r\n\r\n【返回格式】\r\n返回 list，每个元素是一个单因子结果字典（与 factor_analysis summary 模式返回结构完全一致）。\r\n示例：[\r\n  {\"name\": \"换手率\", \"code\": \"out = d['换手率']\", \"feature_days\": 20, \"IC\": -0.0684, \"IR\": -0.4064, ...},\r\n  {\"name\": \"动量20日\", \"code\": \"...\", \"feature_days\": 20, \"IC\": -0.0587, \"IR\": -0.4329, ...}\r\n]\r\n\r\n⚠️ 与 save_factor_result 的对接：\r\nbatch_factor_analysis 的 result 可以直接传给 save_factor_result 的 result 参数（无需格式转换）。\r\n典型流程：batch_factor_analysis → 拿到 result list → 逐个向用户报告结论 → save_factor_result(result=result, note=\"备注\")\r\nAI 也可以选择性保存——从 result list 中筛选有效因子（|IR|>0.3），只保存有意义的因子。\r\n\r\n【返回字段】\r\n（每个元素与 factor_analysis summary 模式一致）\r\n- IC均值/IC标准差/IC_IR：IC_IR=均值/标准差。|IR|>0.3 视为有效\r\n- IC正占比：偏离50%越多方向越稳定\r\n- 多空排名差：越大区分度越好\r\n- 前10%平均排名/后10%平均排名：0.5为平均线\r\n- 前10%IC/后10%IC/极端IC差\r\n- time_potential：时间维度潜力，越接近1越稳定\r\n- top10%/bottom10% 子指标：极端分组的IC/IR/time_potential\r\n- error_code：0=成功，非0=失败（含 names 列表追踪失败因子）\r\n\r\n【输出规则】\r\nfactor_dict 中每个 value 的代码必须以 out = 数值 DataFrame 结尾，作为因子值输入。\r\n\"\"\"\r\n\r\nsave_factor_result = \"\"\"\r\n【触发场景】保存因子结果、保存因子分析结果、保存IC数据、批量保存因子\r\n\r\n【功能说明】\r\n把因子分析结果保存到数据库中。支持单因子和批量保存。\r\n保存技能和分析技能相互独立，保存技能间会相互阻塞。\r\n\r\n【参数说明】\r\n- result：接受两种格式，无需格式转换：\r\n  1. 单因子结果字典（factor_analysis 的返回值）\r\n  2. 多因子结果列表（batch_factor_analysis 的返回值）\r\n- note：备注。批量保存时此备注将在所有结果中添加\r\n\r\n【典型用法】\r\n# 单因子保存\r\nfactor_analysis(name=\"换手率\", code=\"out = d['换手率']\", feature_days=20)\r\n→ save_factor_result(result=<返回值>, note=\"测试\")\r\n\r\n# 批量保存\r\nbatch_factor_analysis(factor_dict={...}, feature_days=20)\r\n→ save_factor_result(result=<返回值>, note=\"批量测试\")\r\n\r\n# 选择性保存（只保存有效因子）\r\nresult_list = batch_factor_analysis(...)\r\neffective = [r for r in result_list if abs(r[\"IR\"]) > 0.3]\r\n→ save_factor_result(result=effective, note=\"有效因子\")\r\n\r\n【AI 行为建议】\r\n- 批量分析后先逐个向用户报告因子有效性结论，再保存\r\n- 用户未明确要求时，可只保存有效因子（|IR|>0.3）\r\n\"\"\"\r\n\r\nbatch_weight = \"\"\"\r\n【触发场景】批量切换权重、同时分析多个统计权重、对比不同权重方案、多种加权方式对比\r\n\r\n【功能说明】\r\nweight_by_code 的批量版本。一次传入多个权重（code_dict: 权重名称→权重代码），同时计算每个权重的热力图权重矩阵，用于对比不同加权方案的效果。不改变当前活动权重——纯对比工具。\r\n\r\n与 weight_by_code 的区别：\r\n- weight_by_code：单权重，每次传一个 name+code，设置为当前活动权重\r\n- batch_weight：多权重，一次传 code_dict（名称→代码字典），同时计算所有权重矩阵供对比\r\n\r\n【参数说明】\r\n- code_dict：权重名称→权重代码 的字典。key 为权重名称（用于报告标识），value 为权重代码（Python exec 表达式）\r\n  示例：{\"成交量加权\": \"out = d['vol']\", \"市值加权\": \"out = d['总市值']\"}\r\n- 代码禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n- to_percentile：所有权重统一转排序值(0~1)，默认 true。消除不同权重间的量纲差异\r\n- target：统计目标，默认 \"All\"\r\n  - \"All\"：对所有散点计算权重矩阵\r\n  - \"Select\"：仅对当前选中的散点计算权重矩阵（需先用 select_by_code 或 batch_select 设置选中）\r\n- view：返回数据类型，默认 \"summary\"\r\n  - \"summary\"：返回热力图评估参数（精简模式，适合快速对比多个权重的效果）\r\n  - \"heatmap\"：返回完整 10×10 权重矩阵+数量矩阵（详细模式，适合深入研究单个权重）\r\n\r\n【关键行为】\r\n- 不改变活动权重：batch_weight 是只读对比工具，计算后当前活动权重不变\r\n- 统一百分位：to_percentile 对所有权重统一生效，无法单独设置\r\n- target=\"Select\" 时 statistic_count < total，仅统计选中散点\r\n- view=\"summary\" 返回精简评估参数，view=\"heatmap\" 返回完整矩阵\r\n\r\n【summary 评估参数解读】（view=\"summary\" 时返回）\r\n每个权重返回以下参数：\r\n- slope_x：X方向斜率，Y均值随X档位的变化率。正值=Y随X增大而增大。这是最关键的参数——slope_x 绝对值越大，说明该权重下 X→Y 的预测关系越强\r\n- slope_y：Y方向斜率，X均值随Y档位的变化率\r\n- burst：突发度，热力图中是否有局部突发区域\r\n- spike：尖峰度，热力图分布的尖峰程度\r\n- validity：有效性得分，综合评估该权重下热力图的信号强度\r\n- gini：权重分布的基尼系数（负值表示方向性偏斜）\r\n- weighted_mean：加权均值\r\n- valid_count：有效数据点数量\r\n\r\n【代码模板】\r\n# 快速对比多个权重的效果（summary 模式）\r\nbatch_weight(code_dict={\r\n    \"成交量加权\": \"out = d['vol']\",\r\n    \"市值加权\": \"out = d['总市值']\"\r\n}, target=\"All\", to_percentile=true, view=\"summary\")\r\n\r\n# 深入研究单个权重的完整矩阵（heatmap 模式）\r\nbatch_weight(code_dict={\r\n    \"成交量加权\": \"out = d['vol']\"\r\n}, target=\"All\", to_percentile=true, view=\"heatmap\")\r\n\r\n# 仅对选中散点对比权重\r\nbatch_weight(code_dict={\r\n    \"成交量加权\": \"out = d['vol']\",\r\n    \"未来收益加权\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.shift(-20) / adj_close - 1\"\r\n}, target=\"Select\")\r\n\r\n【返回结构】\r\n- base_info：图层上下文（layer_name, total, statistic_count, X/Y 名称和代码, statistic_mode, Note）\r\n  - Note 字段提示\"当前活动权重未改变，如需应用请调用 weight_by_code\"\r\n- result：\r\n  - view=\"summary\"：dict，key=权重名称，value=评估参数 dict（slope_x/slope_y/burst/spike/validity/gini/weighted_mean/valid_count）\r\n  - view=\"heatmap\"：dict，key=权重名称，value={weighted_mean, valid_count, values(10×10权重矩阵), counts(10×10数量矩阵)}\r\n    - values[i][j]: i=Y行, j=X列, origin=bottom-left\r\n- error_code：{\"names\": []}，空列表=全部成功，非空=失败的权重名称列表\r\n\r\n【输出规则】\r\ncode_dict 中每个 value 的代码必须以 out = 数值 DataFrame 结尾，作为权重值输入。\r\n\"\"\"\r\n\r\nbatch_select = \"\"\"\r\n【触发场景】批量选中、同时分析多个选择、批量切片分析、对比多个筛选条件\r\n\r\n【功能说明】\r\nselect_by_code 的批量版本。一次传入多个筛选条件（code_dict: 名称→代码），根据 mode 进行独立计算或集合运算，返回各条件的热力图统计或评估参数。\r\n\r\n与 select_by_code 的区别：\r\n- select_by_code：单条件，每次传一个 code，6种集合模式（A/AB/A+B/A-B/B-A/A+B-AB）\r\n- batch_select：多条件，一次传 code_dict（名称→代码字典），4种模式\r\n- batch_select 的 independent 模式：各自独立计算并返回多个结果（用于对比），不改变选中状态\r\n- select_by_code 的 mode \"A\"：替换当前选中。两者语义不同，注意区分\r\n\r\n【参数说明】\r\n- code_dict：名称→筛选代码 的字典。key 为筛选名称（用于报告标识），value 为筛选代码（Python exec 表达式，out=bool DataFrame）\r\n  示例：{\"高市值\": \"out = d['总市值'] > d['总市值'].median()\", \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"}\r\n- 代码禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n- mode：集合运算模式，4种：\r\n  - \"independent_summary\"（默认）：每个条件独立筛选，返回各自的热力图评估参数（精简模式，快速对比各切片效果）\r\n  - \"independent_heatmap\"：每个条件独立筛选，返回各自完整热力图统计（详细模式，含10×10矩阵）\r\n  - \"intersect\"：所有条件求交集，返回单个完整热力图统计（用于多条件收窄）\r\n  - \"union\"：所有条件求并集，返回单个完整热力图统计（用于扩大范围）\r\n\r\n【关键行为】\r\n- ⚠️ independent 模式前置条件：图层必须先设置 X/Y 轴平移（move_by_code）和权重（weight_by_code），否则散点集中在一个位置无法统计。base_info 中 weight_name 为空代表无权重，X/Y 无细分代表未散开\r\n- independent 模式：返回多个独立结果，用于对比不同筛选条件各自的效果。不改变选中状态。使用全局细分（X/Y全局细分）评估各条件子集的分布\r\n- intersect 模式：交集结果，有效数量 ≤ 各单独条件数量，自动调整细分\r\n- union 模式：并集结果，有效数量 ≥ 各单独条件数量，自动调整细分\r\n- 无差集模式（A-B/B-A/A+B-AB），差集操作用 select_by_code\r\n- independent_summary 返回全局细分下的分布评估参数（cv/gini/entropy_ratio/max_min_ratio/edge_burst/edge_density_ratio）\r\n\r\n【summary 评估参数解读】（independent_summary 模式返回）\r\n每个条件返回以下分布评估参数：\r\n- cv：变异系数，各档样本量的离散度。越小越均匀\r\n- gini：基尼系数，分布不均匀程度。0=完全均匀\r\n- entropy_ratio：熵比率，信息分布均匀度。接近1=均匀\r\n- max_min_ratio：最大档/最小档样本量比\r\n- edge_burst：边缘突发。正值=尾部集中，负值=中间集中\r\n- edge_density_ratio：边缘/中心密度比。>1=边缘密，<1=中心密\r\n- valid_count：有效数据点数量\r\n\r\n【代码模板】\r\n# 快速对比两个筛选条件各自的效果（summary 模式）\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"independent_summary\")\r\n\r\n# 获取各条件完整热力图（heatmap 模式）\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"independent_heatmap\")\r\n\r\n# 多条件交集\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"intersect\")\r\n\r\n# 多条件并集\r\nbatch_select(code_dict={\r\n    \"高市值\": \"out = d['总市值'] > d['总市值'].median()\",\r\n    \"高换手\": \"out = d['换手率'] > d['换手率'].rolling(60).mean()\"\r\n}, mode=\"union\")\r\n\r\n【返回结构】\r\n- base_info：图层上下文（layer_name, total, X/Y 名称, weight_name, mode）\r\n  - independent 模式额外包含：X/Y全局细分（用于评估各条件子集分布的全局参考框架）\r\n  - intersect/union 模式：无全局细分（自动调整细分）\r\n  - ⚠️ weight_name 为空或 X/Y 无细分时，independent 模式无法统计\r\n- result：\r\n  - independent_summary：dict，key=筛选名称，value=分布评估参数（cv/gini/entropy_ratio/max_min_ratio/edge_burst/edge_density_ratio/valid_count）\r\n  - independent_heatmap：dict，key=筛选名称，value=完整热力图统计（valid_count + 10×10 counts矩阵）\r\n  - intersect/union：单个完整热力图统计（交集/并集结果，含 summary 评估参数）\r\n- error_code：{\"names\": []}，空列表=全部成功，非空=失败的筛选名称列表\r\n\r\n【输出规则】\r\ncode_dict 中每个 value 的代码必须以 out = 布尔 DataFrame 结尾，True 位置为选中。\r\n\"\"\"\r\n\r\nbatch_factor_corr = \"\"\"\r\n【触发场景】因子间相关性分析、因子冗余度检查、因子筛选前的去相关、基准因子对比\r\n\r\n【功能说明】\r\n批量计算多个因子与一个基准因子之间的相关性。一次传入一个基准因子(benchmark)和多个待评估因子(factor_dict)，\r\n返回每个因子与基准因子的 IC（信息系数）、IR（信息比率）、time_potential（时间潜力），以及基准因子极端档位下的分层 IC。\r\n\r\n与 batch_factor_analysis 的区别：\r\n- batch_factor_analysis：基准固定为未来收益（feature_days 期），评估因子对未来收益的预测力\r\n- batch_factor_corr：基准因子可自定义，评估因子之间的相关性/冗余度\r\n- 典型用途：用市值作为基准，检查成交量/换手率/振幅等因子与市值的相关性，发现冗余因子\r\n\r\n【参数说明】\r\n- benchmark_name：基准因子名称（用于报告标识），默认\"未命名\"\r\n- benchmark_code：基准因子代码（Python exec 表达式，out=数值 DataFrame）\r\n  示例：\"out = d['总市值']\"\r\n- factor_dict：因子名称→因子代码 的字典。key 为因子名称，value 为因子代码\r\n  示例：{\"成交量\": \"out = d['vol']\", \"换手率\": \"out = d['换手率']\"}\r\n- 代码禁止：import / 循环 / apply / lambda / 递归 / axis=1\r\n- 每股类因子无需除以 close（与 factor_analysis 不同，这里只算相关性，不做因子标准化）\r\n\r\n【返回结构】\r\n返回列表，每个因子一个 dict：\r\n- name：因子名称\r\n- code：因子代码\r\n- start_date / end_date：数据时间范围\r\n- universe：股票池（\"全市场\"）\r\n- stock_count：参与计算的股票数量\r\n- IC：与基准因子的整体 Spearman 秩相关系数（-1~1）\r\n- IR：IC 的信息比率（IC均值/IC标准差），衡量 IC 的稳定性。|IR|>0.3 较稳定\r\n- time_potential：时间潜力（0~1），IC 的时间一致性。越接近 1 表示因子相关性在时间上越稳定\r\n- top10%_IC：基准因子 top10% 档位下的 IC（揭示非线性关系）\r\n- top10%_IR：top10% 档位下的 IR\r\n- top10%_time_potential：top10% 的时间潜力\r\n- bottom10%_IC：基准因子 bottom10% 档位下的 IC\r\n- bottom10%_IR：bottom10% 档位下的 IR\r\n- bottom10%_time_potential：bottom10% 的时间潜力\r\n- benchmark_name：基准因子名称\r\n- error_code：{\"names\": []}，空列表=全部成功，非空=失败的因子名称列表\r\n\r\n【评估参数解读】\r\n- |IC| > 0.03：因子间有显著相关性。IC > 0 = 正相关，IC < 0 = 负相关\r\n- |IR| > 0.3：相关性稳定（不是偶尔出现的相关）\r\n- time_potential > 0.8：相关性在时间上高度一致\r\n- top10%/bottom10% IC 差异大：因子关系是非线性的（极端档位下行为不同）\r\n- 用途1（去冗余）：如果两个因子 IC > 0.8，说明高度冗余，保留一个即可\r\n- 用途2（找互补）：IC 接近 0 的因子提供独立信息，适合组合使用\r\n- 用途3（分层分析）：top10%/bottom10% IC 差异大时，因子在不同市值区间表现不同\r\n\r\n【代码模板】\r\n# 检查因子与市值的相关性（去冗余）\r\nbatch_factor_corr(\r\n    benchmark_name=\"市值\",\r\n    benchmark_code=\"out = d['总市值']\",\r\n    factor_dict={\r\n        \"成交量\": \"out = d['vol']\",\r\n        \"换手率\": \"out = d['换手率']\",\r\n        \"振幅\": \"out = (d['high'] - d['low']) / d['close']\"\r\n    }\r\n)\r\n\r\n# 用未来收益作为基准（等价于 batch_factor_analysis 的 IC 部分）\r\nbatch_factor_corr(\r\n    benchmark_name=\"20日收益\",\r\n    benchmark_code=\"adj_close = d['close'] * d['adj_factor']; out = adj_close.shift(-20) / adj_close - 1\",\r\n    factor_dict={\r\n        \"换手率\": \"out = d['换手率']\",\r\n        \"动量\": \"adj_close = d['close'] * d['adj_factor']; out = adj_close.pct_change(20)\"\r\n    }\r\n)\r\n\r\n【输出规则】\r\nbenchmark_code 和 factor_dict 中每个 value 的代码必须以 out = 数值 DataFrame 结尾。\r\n因子值和基准值都自动做排名转换（Spearman），不需要手动 row_rank。\r\n\"\"\"\r\n\r\nhow_code = \"\"\"\r\n【背景】代码在python的exec环境中运行，常用的数据和函数已经配置好了，不需要额外的数据读取和import，直接写算法代码。\r\n数据是pd.DataFrame，每一列是一只股票的数据，为避免停牌问题，计算数据的nan置底处理了，行时间不对齐禁止axis=1的计算。\r\n结果由out=***带出，会自动恢复行时间对齐结构。所有技能使用同一代码环境。\r\n【Python exec环境】\r\n- d 是字典，key=字段名，value=pd.DataFrame,默认数据：close, open, high, low, vol, amount, adj_factor\r\n- col_attrs 是字典，key=属性名，value=pd.Series,数据为和股票属性相关的，是数值或字符串\r\n- 可用字段：由用户数据库决定，使用available_data查询\r\n- 复权价格 = d['close'] * d['adj_factor']\r\n- 可用自定义函数：hold_until, time_at, time_between, time_in, row_rank, row_top_n, row_bottom_n\r\n- 禁止：import / for/while循环 / df.apply() / lambda / 递归/ axis=1/ df.loc/df.iloc\r\n- 内置：np, pd\r\n【输出规则】\r\nout = 布尔DataFrame → True位置绘制短线/回测\r\nout = 数值DataFrame → 用于颜色/权重/平移控制/因子\r\n\r\n【自定义函数】\r\n1. hold_until(buy, sell) — 生成持仓矩阵\r\n   从买入信号开始持仓，直到遇到卖出信号。买卖同日则放弃该买点。\r\n   - buy: bool DataFrame，买入信号（仅取每段第一个）\r\n   - sell: bool DataFrame，或 list/tuple of DataFrame（多个卖点自动 OR 合并）\r\n   - 返回: bool DataFrame\r\n   示例：\r\n     # 单卖点\r\n     buy = (D.shift(1) <= 20) & (D > 20)\r\n     sell = (D.shift(1) >= 80) & (D < 80)\r\n     out = hold_until(buy, sell)\r\n     # 多卖点\r\n     out = hold_until(buy, [sell1, sell2])\r\n\r\n2. entry_check(window, conditions, mode=\"keep\") — 买入窗口条件检测\r\n   在连续窗口内检测条件信号，输出指定区域。用于过滤买入机会。\r\n   - window: bool DataFrame，连续评估区间\r\n   - conditions: bool DataFrame 或 list，要检测的信号（多个自动 OR）\r\n   - mode: keep / discard / left / right / start / end / next\r\n   示例：\r\n     # 买入前10天内是否出现过放量，只保留末尾有效买点\r\n     window = buy.shift(10, fill_value=False).rolling(11).max().astype(bool)\r\n     volume_spike = d['vol'] > d['vol'].rolling(20).mean() * 2\r\n     out = entry_check(window, volume_spike, mode=\"end\")\r\n\r\n【时间函数】\r\n\r\n3. get_time() — 返回 DataFrame，每个单元格为时间datetime64[us]\r\n4. get_time_id() — 返回 DataFrame，每个单元格为数据库内时间序号，需要按时间排序使用这个函数\r\n5. time_at(rq) — 匹配指定时间，rq 为整数或负数（如 time_at(-1) 最后一天）\r\n6. time_between(srq, erq) — 匹配时间区间（左闭右开）\r\n7. time_in(rqs) — 匹配多个指定时间\r\n\r\n【排名函数】\r\n\r\n8. row_rank(df, split=[]) — 按行截面排名，返回百分位值（0~1）\r\n   - split: 板块切分点，如 split=[400000, 700000] 按代码切为三组独立排名\r\n   示例：\r\n     rank_all = row_rank(d['vol'])\r\n     rank_by_board = row_rank(d['vol'], split=[400000, 700000])\r\n\r\n9. row_top_n(df, n) — 每行（同一时间截面）最大的 n 个为 True\r\n   - df: 数值 DataFrame\r\n   - n: 每行取前 n 个最大值\r\n   - 返回: bool DataFrame，True 位置为该时间截面值最大的 n 只股票\r\n   示例：\r\n     out = row_top_n(d['vol'], 3)       # 每天成交量最大的3只股票\r\n     out = row_top_n(d['总市值'], 10)    # 每天市值最大的10只股票\r\n\r\n10. row_bottom_n(df, n) — 每行（同一时间截面）最小的 n 个为 True\r\n    - df: 数值 DataFrame\r\n    - n: 每行取前 n 个最小值\r\n    - 返回: bool DataFrame，True 位置为该时间截面值最小的 n 只股票\r\n    示例：\r\n      out = row_bottom_n(d['vol'], 3)       # 每天成交量最小的3只股票\r\n      out = row_bottom_n(d['总市值'], 10)    # 每天市值最小的10只股票\r\n\"\"\"\r\nrun_task_file = \"\"\"\r\n【触发条件】禁止主动使用，明确要执行`run_task_file`才使用。\r\n【功能描述】\r\n- 读取本地 JSON 文件，解析其中的 `tool_name`（必填）和对应参数（可选），然后调用 QuantALL 的对应技能执行。\r\n- 若某技能无参数，JSON 仅写 `{\"tool_name\": \"技能名\"}` 即可。\r\n- 此技能专用于“流程固化”：将复杂任务参数预先保存为文件，后续直接执行，保证每次结果一致。\r\n【典型 JSON 结构】{\"tool_name\": \"factor_analysis\", \"name\": \"换手率反转\", ...}\r\n【使用约束】\r\n1. 除非用户主动要求“使用任务文件”，否则绝对不要生成或调用此技能。\r\n2. 在对话中，请直接调用相应技能，不要用本技能绕路。\r\n3. 已制作好明确的任务流程，并保存好本地json文件，才使用本技能。\r\n\"\"\"\r\n\r\nexecute_python_script = \"\"\"\r\n【触发条件】禁止主动使用，明确要执行`execute_python_script`才使用。\r\n【功能描述】\r\n- 使用QuantAll的python环境，执行本地的python文件\r\n- print会给AI发送info\r\n- 此技能专用于“流程固化”时，扩展数据处理功能。\r\n\"\"\"\n\nFile v1.0.3:scripts/data/db_translate.json\n\n{\r\n    \"stock_basic\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"name\": \"股票名称\",\r\n        \"update_date\": \"数据更新日期\",\r\n        \"list_date\": \"上市日期\",\r\n        \"act_name\": \"实控人名称\",\r\n        \"act_ent_type\": \"实控人企业性质\",\r\n        \"industry\": \"所属行业\",\r\n        \"com_name\": \"公司名称\",\r\n        \"com_id\": \"统一社会信用代码\",\r\n        \"chairman\": \"法人代表\",\r\n        \"manager\": \"总经理\",\r\n        \"secretary\": \"董秘\",\r\n        \"reg_capital\": \"注册资本\",\r\n        \"setup_date\": \"注册日期\",\r\n        \"province\": \"所在省份\",\r\n        \"city\": \"所在城市\",\r\n        \"introduction\": \"公司介绍\",\r\n        \"website\": \"公司主页\",\r\n        \"email\": \"电子邮件\",\r\n        \"office\": \"办公室\",\r\n        \"business_scope\": \"经营范围\",\r\n        \"employees\": \"员工人数\",\r\n        \"main_business\": \"主要业务及产品\",\r\n        \"exchange\": \"交易所\",\r\n        \"concept\":\"所属概念\"\r\n    },\r\n    \"stock_factor\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"trade_date\": \"交易日期\",\r\n        \"close\": \"当日收盘价\",\r\n        \"turnover_rate\": \"换手率\",\r\n        \"turnover_rate_f\": \"换手率-自由流通股\",\r\n        \"volume_ratio\": \"量比\",\r\n        \"pe\": \"市盈率\",\r\n        \"pe_ttm\": \"市盈率TTM\",\r\n        \"pb\": \"市净率\",\r\n        \"ps\": \"市销率\",\r\n        \"ps_ttm\": \"市销率TTM\",\r\n        \"dv_ratio\": \"股息率\",\r\n        \"dv_ttm\": \"股息率TTM\",\r\n        \"total_share\": \"总股本\",\r\n        \"float_share\": \"流通股本\",\r\n        \"free_share\": \"自由流通股本\",\r\n        \"total_mv\": \"总市值\",\r\n        \"circ_mv\": \"流通市值\",\r\n        \"limit_status\": \"涨跌停状态\"\r\n    },\r\n    \"stock_forecast\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"ann_date\": \"公告日期\",\r\n        \"end_date\": \"报告期\",\r\n        \"type\": \"业绩预告类型\",\r\n        \"p_change_min\": \"预告净利润变动下限-%\",\r\n        \"p_change_max\": \"预告净利润变动上限-%\",\r\n        \"net_profit_min\": \"预告净利润下限-万元\",\r\n        \"net_profit_max\": \"预告净利润上限-万元\",\r\n        \"last_parent_net\": \"上年同期归母净利润-万元\",\r\n        \"notice_times\": \"公布次数\",\r\n        \"first_ann_date\": \"首次公告日\",\r\n        \"summary\": \"业绩预告摘要\",\r\n        \"change_reason\": \"业绩变动原因\",\r\n        \"update_flag\": \"更新标志\"\r\n    },\r\n    \"stock_dividend\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"end_date\": \"分送年度\",\r\n        \"ann_date\": \"预案公告日\",\r\n        \"div_proc\": \"实施进度\",\r\n        \"stk_div\": \"每股送转合计\",\r\n        \"stk_bo_rate\": \"每股送股比例\",\r\n        \"stk_co_rate\": \"每股转增比例\",\r\n        \"cash_div\": \"每股分红-税后\",\r\n        \"cash_div_tax\": \"每股分红-税前\",\r\n        \"record_date\": \"股权登记日\",\r\n        \"ex_date\": \"除权除息日\",\r\n        \"pay_date\": \"派息日\",\r\n        \"div_listdate\": \"红股上市日\",\r\n        \"imp_ann_date\": \"实施公告日\",\r\n        \"base_date\": \"基准日\",\r\n        \"base_share\": \"实施基准股本-万\",\r\n        \"update_flag\": \"是否变更过\"\r\n    },\r\n    \"stock_report\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"ann_date\": \"公告日期\",\r\n        \"end_date\": \"报告期\",\r\n        \"eps\": \"每股收益\",\r\n        \"dt_eps\": \"稀释每股收益\",\r\n        \"total_revenue_ps\": \"每股营业总收入\",\r\n        \"revenue_ps\": \"每股营业收入\",\r\n        \"capital_rese_ps\": \"每股资本公积\",\r\n        \"surplus_rese_ps\": \"每股盈余公积\",\r\n        \"undist_profit_ps\": \"每股未分配利润\",\r\n        \"extra_item\": \"非经常性损益\",\r\n        \"profit_dedt\": \"扣非净利润\",\r\n        \"gross_margin\": \"毛利\",\r\n        \"current_ratio\": \"流动比率\",\r\n        \"quick_ratio\": \"速动比率\",\r\n        \"cash_ratio\": \"保守速动比率\",\r\n        \"invturn_days\": \"存货周转天数\",\r\n        \"arturn_days\": \"应收账款周转天数\",\r\n        \"inv_turn\": \"存货周转率\",\r\n        \"ar_turn\": \"应收账款周转率\",\r\n        \"ca_turn\": \"流动资产周转率\",\r\n        \"fa_turn\": \"固定资产周转率\",\r\n        \"assets_turn\": \"总资产周转率\",\r\n        \"op_income\": \"经营活动净收益\",\r\n        \"valuechange_income\": \"价值变动净收益\",\r\n        \"interst_income\": \"利息费用\",\r\n        \"daa\": \"折旧与摊销\",\r\n        \"ebit\": \"息税前利润\",\r\n        \"ebitda\": \"息税折旧摊销前利润\",\r\n        \"fcff\": \"企业自由现金流量\",\r\n        \"fcfe\": \"股权自由现金流量\",\r\n        \"current_exint\": \"无息流动负债\",\r\n        \"noncurrent_exint\": \"无息非流动负债\",\r\n        \"interestdebt\": \"带息债务\",\r\n        \"netdebt\": \"净债务\",\r\n        \"tangible_asset\": \"有形资产\",\r\n        \"working_capital\": \"营运资金\",\r\n        \"networking_capital\": \"营运流动资本\",\r\n        \"invest_capital\": \"全部投入资本\",\r\n        \"retained_earnings\": \"留存收益\",\r\n        \"diluted2_eps\": \"期末摊薄每股收益\",\r\n        \"bps\": \"每股净资产\",\r\n        \"ocfps\": \"每股经营现金流净额\",\r\n        \"retainedps\": \"每股留存收益\",\r\n        \"cfps\": \"每股现金流量净额\",\r\n        \"ebit_ps\": \"每股息税前利润\",\r\n        \"fcff_ps\": \"每股企业自由现金流量\",\r\n        \"fcfe_ps\": \"每股股东自由现金流量\",\r\n        \"netprofit_margin\": \"销售净利率\",\r\n        \"grossprofit_margin\": \"销售毛利率\",\r\n        \"cogs_of_sales\": \"销售成本率\",\r\n        \"expense_of_sales\": \"销售期间费用率\",\r\n        \"profit_to_gr\": \"净利润/营业总收入\",\r\n        \"saleexp_to_gr\": \"销售费用率\",\r\n        \"adminexp_of_gr\": \"管理费用率\",\r\n        \"finaexp_of_gr\": \"财务费用率\",\r\n        \"impai_ttm\": \"资产减值损失/营收\",\r\n        \"gc_of_gr\": \"营业总成本/营收\",\r\n        \"op_of_gr\": \"营业利润/营收\",\r\n        \"ebit_of_gr\": \"息税前利润/营收\",\r\n        \"roe\": \"ROE\",\r\n        \"roe_waa\": \"加权平均ROE\",\r\n        \"roe_dt\": \"扣非ROE\",\r\n        \"roa\": \"ROA\",\r\n        \"npta\": \"总资产净利润率\",\r\n        \"roic\": \"投入资本回报率\",\r\n        \"roe_yearly\": \"年化ROE\",\r\n        \"roa2_yearly\": \"年化ROA\",\r\n        \"roe_avg\": \"平均ROE\",\r\n        \"opincome_of_ebt\": \"经营净收益/利润总额\",\r\n        \"investincome_of_ebt\": \"价值变动净收益/利润总额\",\r\n        \"n_op_profit_of_ebt\": \"营业外收支净额/利润总额\",\r\n        \"tax_to_ebt\": \"所得税/利润总额\",\r\n        \"dtprofit_to_profit\": \"扣非净利润/净利润\",\r\n        \"salescash_to_or\": \"销售收现/营业收入\",\r\n        \"ocf_to_or\": \"经营现金流/营业收入\",\r\n        \"ocf_to_opincome\": \"经营现金流/经营净收益\",\r\n        \"capitalized_to_da\": \"资本支出/折旧摊销\",\r\n        \"debt_to_assets\": \"资产负债率\",\r\n        \"assets_to_eqt\": \"权益乘数\",\r\n        \"dp_assets_to_eqt\": \"权益乘数-杜邦\",\r\n        \"ca_to_assets\": \"流动资产/总资产\",\r\n        \"nca_to_assets\": \"非流动资产/总资产\",\r\n        \"tbassets_to_totalassets\": \"有形资产/总资产\",\r\n        \"int_to_talcap\": \"带息债务/投入资本\",\r\n        \"eqt_to_talcapital\": \"归母权益/投入资本\",\r\n        \"currentdebt_to_debt\": \"流动负债/负债合计\",\r\n        \"longdeb_to_debt\": \"非流动负债/负债合计\",\r\n        \"ocf_to_shortdebt\": \"经营现金流/流动负债\",\r\n        \"debt_to_eqt\": \"产权比率\",\r\n        \"eqt_to_debt\": \"归母权益/负债合计\",\r\n        \"eqt_to_interestdebt\": \"归母权益/带息债务\",\r\n        \"tangibleasset_to_debt\": \"有形资产/负债合计\",\r\n        \"tangasset_to_intdebt\": \"有形资产/带息债务\",\r\n        \"tangibleasset_to_netdebt\": \"有形资产/净债务\",\r\n        \"ocf_to_debt\": \"经营现金流/负债合计\",\r\n        \"ocf_to_interestdebt\": \"经营现金流/带息债务\",\r\n        \"ocf_to_netdebt\": \"经营现金流/净债务\",\r\n        \"ebit_to_interest\": \"已获利息倍数\",\r\n        \"longdebt_to_workingcapital\": \"长期债务/营运资金\",\r\n        \"ebitda_to_debt\": \"息税折旧摊销前利润/负债\",\r\n        \"turn_days\": \"营业周期\",\r\n        \"roa_yearly\": \"年化总资产净利率\",\r\n        \"roa_dp\": \"总资产净利率-杜邦\",\r\n        \"fixed_assets\": \"固定资产合计\",\r\n        \"profit_prefin_exp\": \"扣除财务费用前营业利润\",\r\n        \"non_op_profit\": \"非营业利润\",\r\n        \"op_to_ebt\": \"营业利润/利润总额\",\r\n        \"nop_to_ebt\": \"非营业利润/利润总额\",\r\n        \"ocf_to_profit\": \"经营现金流/营业利润\",\r\n        \"cash_to_liqdebt\": \"货币资金/流动负债\",\r\n        \"cash_to_liqdebt_withinterest\": \"货币资金/带息流动负债\",\r\n        \"op_to_liqdebt\": \"营业利润/流动负债\",\r\n        \"op_to_debt\": \"营业利润/负债合计\",\r\n        \"roic_yearly\": \"年化投入资本回报率\",\r\n        \"total_fa_trun\": \"固定资产周转率\",\r\n        \"profit_to_op\": \"利润总额/营业收入\",\r\n        \"q_opincome\": \"单季度经营净收益\",\r\n        \"q_investincome\": \"单季度价值变动净收益\",\r\n        \"q_dtprofit\": \"单季度扣非净利润\",\r\n        \"q_eps\": \"单季度每股收益\",\r\n        \"q_netprofit_margin\": \"单季度销售净利率\",\r\n        \"q_gsprofit_margin\": \"单季度销售毛利率\",\r\n        \"q_exp_to_sales\": \"单季度销售期间费用率\",\r\n        \"q_profit_to_gr\": \"单季度净利润/营收\",\r\n        \"q_saleexp_to_gr\": \"单季度销售费用率\",\r\n        \"q_adminexp_to_gr\": \"单季度管理费用率\",\r\n        \"q_finaexp_to_gr\": \"单季度财务费用率\",\r\n        \"q_impair_to_gr_ttm\": \"单季度资产减值/营收\",\r\n        \"q_gc_to_gr\": \"单季度营业总成本/营收\",\r\n        \"q_op_to_gr\": \"单季度营业利润/营收\",\r\n        \"q_roe\": \"单季度ROE\",\r\n        \"q_dt_roe\": \"单季度扣非ROE\",\r\n        \"q_npta\": \"单季度总资产净利润率\",\r\n        \"q_opincome_to_ebt\": \"单季度经营净收益/利润总额\",\r\n        \"q_investincome_to_ebt\": \"单季度价值变动净收益/利润总额\",\r\n        \"q_dtprofit_to_profit\": \"单季度扣非净利润/净利润\",\r\n        \"q_salescash_to_or\": \"单季度销售收现/营收\",\r\n        \"q_ocf_to_sales\": \"单季度经营现金流/营收\",\r\n        \"q_ocf_to_or\": \"单季度经营现金流/经营净收益\",\r\n        \"basic_eps_yoy\": \"每股收益同比-%\",\r\n        \"dt_eps_yoy\": \"稀释每股收益同比-%\",\r\n        \"cfps_yoy\": \"每股经营现金流同比-%\",\r\n        \"op_yoy\": \"营业利润同比-%\",\r\n        \"ebt_yoy\": \"利润总额同比-%\",\r\n        \"netprofit_yoy\": \"归母净利润同比-%\",\r\n        \"dt_netprofit_yoy\": \"扣非净利润同比-%\",\r\n        \"ocf_yoy\": \"经营现金流同比-%\",\r\n        \"roe_yoy\": \"ROE同比-%\",\r\n        \"bps_yoy\": \"每股净资产较年初增长-%\",\r\n        \"assets_yoy\": \"总资产较年初增长-%\",\r\n        \"eqt_yoy\": \"归母权益较年初增长-%\",\r\n        \"tr_yoy\": \"营业总收入同比-%\",\r\n        \"or_yoy\": \"营业收入同比-%\",\r\n        \"q_gr_yoy\": \"单季度营业总收入同比-%\",\r\n        \"q_gr_qoq\": \"单季度营业总收入环比-%\",\r\n        \"q_sales_yoy\": \"单季度营业收入同比-%\",\r\n        \"q_sales_qoq\": \"单季度营业收入环比-%\",\r\n        \"q_op_yoy\": \"单季度营业利润同比-%\",\r\n        \"q_op_qoq\": \"单季度营业利润环比-%\",\r\n        \"q_profit_yoy\": \"单季度净利润同比-%\",\r\n        \"q_profit_qoq\": \"单季度净利润环比-%\",\r\n        \"q_netprofit_yoy\": \"单季度归母净利润同比-%\",\r\n        \"q_netprofit_qoq\": \"单季度归母净利润环比-%\",\r\n        \"equity_yoy\": \"净资产同比-%\",\r\n        \"rd_exp\": \"研发费用\",\r\n        \"update_flag\": \"更新标识\"\r\n    }\r\n}\n\nFile v1.0.3:skill-card.md\n\n## Description: <br>\nQuantAll helps an agent use a local Python-based stock-market computation environment for full-market factor analysis, strategy backtesting, IC analysis, screening, visualization, and database-assisted workflows. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[mifochen](https://clawhub.ai/user/mifochen) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and developers use this skill when they want an agent to install, configure, start, and operate QuantAll for quantitative A-share market analysis. It supports local factor computation, backtesting, stock screening, heat-map exploration, database update workflows, and scripted task execution after user approval. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The release includes a local MCP service, local database writes, Tushare credential-file use, and Python/package execution on the user's machine. <br>\nMitigation: Install and enable it only after the user understands those local effects, reviews the configuration changes, and accepts package execution and database-write behavior. <br>\nRisk: The execute_python_script and run_task_file capabilities are high-risk if untrusted prompts or files influence tool use. <br>\nMitigation: Run only trusted files that have been inspected, and avoid enabling the skill in conversations where untrusted prompts or files may steer execution. <br>\nRisk: The security verdict is suspicious because the skill combines disclosed stock-analysis behavior with under-scoped local code execution and background service capabilities. <br>\nMitigation: Review the skill and its security guidance before deployment, and keep the skill disabled unless those local execution capabilities are required for the task. <br>\n\n\n## Reference(s): <br>\n- [QuantAll ClawHub Skill Page](https://clawhub.ai/mifochen/skills/quant-all-mcp) <br>\n- [QuantAll Playbook](references/quantall_playbook.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with inline code, shell commands, and JSON configuration snippets] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May direct the agent to create a Python virtual environment, install packages, update MCP configuration, start a localhost service, write local configuration files, and run trusted local task or script files with user consent.] <br>\n\n## Skill Version(s): <br>\n1.0.3 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.0.3:requirements.txt\n\nquantall==1.0.4\n\nArchive v1.0.2: 9 files, 59473 bytes\n\nFiles: references/quantall_playbook.md (29159b), requirements.txt (17b), scripts/data/ai_prompts.toml (44865b), scripts/data/db_translate.json (11634b), scripts/Start_QuantAll.py (83b), scripts/UpdateStock_skill.py (89115b), skill-card.md (2636b), SKILL.md (12259b), _meta.json (132b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: quantall-mcp\ndescription: >\n  QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。\n  AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。\n  让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。\n  触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。\n  不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。\n  能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、\n  修改 MCP 配置、启动本地 HTTP 服务（localhost:8686）、创建配置文件和启动脚本。\n  所有涉及用户电脑的操作，AI 必须事先告知用户并获得同意。\n  UpdateStock 为可选辅助 MCP（数据库管理，需 tushare API），非 QuantAll 必需。\nagent_created: true\nlicense: MIT\n---\n\n# QuantAll（全A解析）MCP 技能\n\n---\n\n## 这是什么\n\nQuantAll 是一台运行在用户本地电脑上的**全市场向量化计算引擎**。它把 A 股 5000+ 只股票、150+ 维度的数据组织为统一矩阵，AI 只需编写简短的 Python 向量化代码片段，就能在数秒内完成全市场运算——因子计算、策略回测、IC 分析、多维可视化。\n\n**对 AI 的意义**：不再只是\"查询信息然后转述\"，而是能**用代码算出客观结果**。用户问\"小盘股是不是比大盘股表现好\"，AI 不需要去搜索别人的观点，而是直接用全市场数据算出 IC 指标、回测收益，给出有数据支撑的结论。这是从\"数据搬运工\"到\"数据分析师\"的根本转变。\n\n> **工具详细用法**（参数、触发场景、代码模板、核心函数）在 `scripts/data/ai_prompts.toml` 中，MCP 连接后 AI 自动获取。SKILL.md 只讲顶层定位、安装、启动、更新和 AI 行为规范。实战案例参见 `references/quantall_playbook.md`。\n\n---\n\n## 架构\n\n| 组件 | 类型 | 定位 | 依赖 |\n|------|------|------|------|\n| **QuantAll**（全A解析） | HTTP MCP (localhost:8686) | 计算引擎：因子计算/回测/IC分析/可视化 | 本地 DuckDB 数据库 |\n| **UpdateStock** | stdio MCP（可选） | 数据库管理：创建/更新/查询行情 | tushare API key |\n\n两者共用同一个 DuckDB 数据库，路径通过 `scripts/DB_setting.json` 管理。**QuantAll 独立可运行，UpdateStock 不是必需依赖**——有自己的数据库或仅用内置测试库即可。\n\n---\n\n## 📦 安装（首次安装，AI 必读）\n\n> ⚠️ **AI 行为规范**：安装前必须告知用户以下操作内容并获得同意：\n> - 在 `scripts/` 下创建 Python 虚拟环境（约 45 个依赖包，300MB+ 磁盘空间）\n> - 从清华 PyPI 镜像源下载安装 quantall 库\n> - 修改 `~/.workbuddy/mcp.json` 添加 MCP 服务配置\n> - 后续启动时会运行本地 HTTP 服务（localhost:8686）并可能弹出用户协议窗口\n\n```\n□ 1. 创建 venv：\n   <Python路径> -m venv <skill-dir>/scripts/.venv\n   推荐：C:/Users/<用户>/.workbuddy/binaries/python/versions/3.13.12/python.exe\n\n□ 2. pip 安装（务必用清华源，否则 PySide6 等大包下载超时）：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 3. 验证安装：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"from QuantAll import Start_main; print('OK')\"\n\n□ 4. 配置 MCP（修改 ~/.workbuddy/mcp.json）：\n   见下方 MCP 配置\n\n□ 5. 启动服务：\n   <skill-dir>/scripts/.venv/Scripts/python.exe <skill-dir>/scripts/Start_QuantAll.py\n   检查 8686 端口是否监听\n\n□ 6. ⚠️ 提醒用户重连 MCP 连接器（或重启 WorkBuddy）\n```\n\n**常见坑**：\n- **Git Bash 路径**：传参给 Python 必须用 `C:/` 前缀（非 `/c/`），否则双重转义找不到文件\n- **safe-delete 冲突**：WorkBuddy Python 运行时可能拦截 pip 文件覆盖，报 `SAFE_DELETE_FAIL_CLOSED`。解决：重建 venv（`rm -rf .venv && python -m venv .venv`）后重试，或用 `dangerouslyDisableSandbox: true`\n- **import 大小写**：`from QuantAll import ...`（大写 Q、A），`import quantall` 会失败\n\n### MCP 配置\n\n```json\n{\n  \"mcpServers\": {\n    \"全A解析\": { \"url\": \"http://127.0.0.1:8686/mcp\", \"disabled\": false },\n    \"UpdateStock\": {\n      \"command\": \"<skill-dir>/scripts/.venv/Scripts/python.exe\",\n      \"args\": [\"<skill-dir>/scripts/UpdateStock_skill.py\"],\n      \"disabled\": false\n    }\n  }\n}\n```\n\n> UpdateStock 可选——不配置也能用 QuantAll。仅需要计算引擎时只配「全A解析」。\n\n### 数据库\n\nQuantAll 首次启动自动创建 `scripts/DB_setting.json`，默认连接 pip 包内置的 Test.duckdb（仅沪深300近两年基础行情，**仅供测试，pip 更新会覆盖**）。\n\n正式使用需切换到自己的数据库（修改 `db_path`）：\n\n| 方案 | 说明 |\n|------|------|\n| A. 内置 Test.duckdb | pip 包自带，仅沪深300近两年基础行情，仅供测试 |\n| B. UpdateStock 创建 | 需 tushare：2000+ 积分全市场 / 200 积分免费精简版 |\n| C. 自有数据库 | 修改 `DB_setting.json` 的 `db_path` 直连 |\n\n> ⚠️ **AI 行为规范**：修改 `DB_setting.json` 前告知用户当前数据库路径和将要切换的目标路径。\n\n### 桌面快捷方式（可选，AI 主动询问）\n\n安装后 AI 应主动询问：\"是否需要创建桌面快捷方式？\"创建 `scripts/run.bat`（后台启动，无控制台窗口），再为它创建桌面 `.lnk`。\n\n> ⚠️ **不要在桌面创建 .bat 文件**——Windows cmd 以 GBK 读取 .bat，AI 写入的 UTF-8 中文会乱码。正确做法：先创建 `scripts/run.bat`，再创建指向它的桌面 `.lnk`。\n\n---\n\n## 🚀 启动\n\nQuantAll 是独立的 HTTP 服务，**不依赖 UpdateStock 启动**。三种方式任选其一：\n\n| 方式 | 操作 | 适用场景 |\n|------|------|---------|\n| AI 调用 | 通过 UpdateStock MCP 的 `Start_QuantAll` 工具 | AI 场景，可自动检测端口 |\n| 双击 run.bat | 后台启动，无控制台窗口 | 手动场景最方便 |\n| 命令行 | `<skill-dir>/scripts/.venv/Scripts/python.exe Start_QuantAll.py` | 调试或自定义 |\n\n> ⚠️ **AI 行为规范**：启动服务前告知用户——QuantAll 将在本地 8686 端口启动 HTTP 服务，并可能弹出用户协议确认窗口。\n\n**用户协议**：首次启动弹协议窗口，点击确认即\"激活\"（永久同意），功能无差异。未确认前除 `ping` 外所有工具被阻止（合规要求）。\n\n**MCP 重连**：QuantAll 后于 AI 启动时，需断开重连 MCP 连接器（或重启 WorkBuddy）。首次连接需点击\"信任\"授权。\n\n---\n\n## 🔄 更新/升级\n\n> **核心规则**：技能包文件更新后，Python 库 `quantall` 也必须同步升级，否则新接口在旧库上会报错。\n\n```\n□ 1. 升级库：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install --upgrade quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 2. 验证版本：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"import QuantAll; print(QuantAll.__version__)\"\n   确认 >= requirements.txt 要求的版本\n\n□ 3. 重启 QuantAll 服务（先关旧进程再启动）\n\n□ 4. ⚠️ 提醒用户重连 MCP\n```\n\n- safe-delete 冲突时：先 `pip uninstall quantall`，再 `pip install quantall`\n- `pip install --upgrade` 是幂等的，不确定是否需要升级时直接执行\n- 版本检测：对比 `_meta.json` 的 version 与已安装库 `QuantAll.__version__`\n\n---\n\n## ⚠️ AI 操作用户电脑的行为规范\n\n本技能涉及多项用户电脑操作。AI 执行前**必须告知用户**将要做什么、产生什么影响：\n\n| 操作 | 告知内容 |\n|------|---------|\n| 创建 venv | 将在 `scripts/` 下创建虚拟环境（约 300MB 磁盘空间） |\n| pip install | 从清华源下载约 45 个包（含 PySide6 等大型包） |\n| 修改 mcp.json | 将添加 MCP 服务配置到 `~/.workbuddy/mcp.json` |\n| 启动服务 | 将在 localhost:8686 启动 HTTP 后台服务 |\n| 创建文件 | 可能创建 `DB_setting.json`、`run.bat`、桌面 `.lnk` 快捷方式 |\n| 修改数据库路径 | 将修改 `DB_setting.json` 的 `db_path`，影响 QuantAll 读取的数据 |\n\n> **原则**：不在用户不知情的情况下执行任何系统操作。涉及文件创建、配置修改、服务启动等操作前，先说明意图，获得用户同意后再执行。\n\n---\n\n## 工具总览\n\n安装并连接 MCP 后，AI 通过 `scripts/data/ai_prompts.toml` 自动获取每个工具的详细用法（参数、触发场景、代码模板、核心函数）。以下是概览：\n\n| 工具 | 用途 |\n|------|------|\n| `ping` | 健康检查 |\n| `available_data` | 查看可用数据字段 |\n| `how_code` | 查看代码执行环境说明 |\n| `strategy_backtest` | 策略回测（收益/夏普/回撤/胜率） |\n| `factor_analysis` | 因子 IC 分析 |\n| `batch_factor_analysis` | 批量因子 IC 分析 |\n| `batch_factor_corr` | 因子间批量相关性计算 |\n| `save_factor_result` | 保存因子分析结果到数据库 |\n| `new_layer_from_code` | 创建可视化图层标记 |\n| `select_by_code` | 筛选股票（集合运算） |\n| `batch_select` | 批量筛选（多条件对比/交集/并集） |\n| `move_by_code` | 坐标平移映射 |\n| `weight_by_code` | 权重设置 |\n| `batch_weight` | 批量权重对比（多权重方案） |\n| `heat_map` | 热力图统计 |\n| `get_user_selection` | 获取用户 GUI 交互选中 |\n| `MCP_Close` | 关闭服务 ⚠️（仅不再需要时调用） |\n\n### AI 使用前必知\n\n- **先 ping 确认服务就绪**，未启动则引导用户启动\n- **先 available_data 确认字段**，不要假设字段名（数据库字段名经 `db_translate.json` 翻译层映射为中文）\n- **不支持并行调用**，所有工具串行执行（一个返回后再发下一个）\n- **代码必须向量化**：禁止 import / 循环 / lambda / axis=1，最后一行设 `out = ...`\n- **复权价格手动算**：`adj_close = d['close'] * d['adj_factor']`\n- **每股因子必须除以 close**（非复权价），比率类/增长率类不需要\n- **持仓矩阵必须用 `hold_until(buy, sell)`**，禁止手写逆序 cumsum\n- **内置函数**：`hold_until`/`entry_check`（持仓）、`time_at`/`time_between`/`time_in`（时间）、`row_rank`（截面排名）、`row_top_n`/`row_bottom_n`（截面 Top/Bottom N 筛选）\n- **detail 视图返回约 140 万字符**，AI 内部分析后只汇报结论，禁止直接展示\n\n> 详细参数说明、触发场景、代码模板、核心函数参考：`scripts/data/ai_prompts.toml`\n> 实战案例、模式对比、踩坑记录：`references/quantall_playbook.md`\n\n---\n\n## 版本历史\n\n- **v1.0** — 首版发布。13 个工具，配套 ai_prompts.toml 和 playbook 实战手册。PyPI 在线安装。\n- **v1.0.1** — 新增技能升级流程；requirements.txt 更新为 >=1.0.1；SKILL.md 精简至 500 行以内。\n- **v1.0.2** — 优化 clawhub 审查问题：触发条件收窄（仅明确量化需求时触发）、能力声明透明化（venv/pip/mcp.json/HTTP 服务全部显式声明）、新增 AI 操作用户电脑的行为规范表、详细工具用法指向 ai_prompts.toml 不在 SKILL.md 展开。新增批量分析工具 `batch_weight`/`batch_select`（对应 `weight_by_code`/`select_by_code` 的批量版本）。新增 `batch_factor_corr`（因子间批量相关性计算，支持自定义基准因子）。新增 `how_code`（代码执行环境说明，帮助 AI 快速上手）。新增 exec 内置函数 `row_top_n(df,n)`/`row_bottom_n(df,n)`（截面 Top/Bottom N 筛选）。热力图/直方图统计新增 `summary` 评估参数（分布均匀度/边缘突发等）。`batch_weight` 新增 `view` 参数（summary=评估参数/heatmap=完整矩阵）及\"权重未改变\"提示。`batch_select` mode 重命名为描述性名称（independent_summary/independent_heatmap/intersect/union）。修复批量因子分析执行异常及 batch_select intersect/union/independent 模式 bug。requirements.txt 固定版本号。\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn798etnj1hernzd0bqw4cg9yx86fkc9\",\n  \"slug\": \"quant-all-mcp\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1784818216503\n}\n\nFile v1.0.2:references/quantall_playbook.md\n\n# QuantAll 实战手册\n\n> 本文件是 QuantAll（全A解析）的使用经验积累文档。SKILL.md 负责\"怎么装、有什么工具\"，\n> 本文档负责\"怎么用好\"——实战模式、代码示例、踩坑记录。\n>\n> **AI 使用建议**：执行复杂分析任务前先快速浏览本文档，了解常见模式和陷阱。\n\n---\n\n## 1. 快速上手（5 分钟）\n\n### QuantAll 是什么\n\n一台本地计算引擎。你（AI）写一段向量化 Python 代码，它就在全市场 5000+ 只股票上并行执行，\n数秒内返回结果。**你不是在查询数据，你是在计算数据。**\n\n### 你能做什么\n\n| 你想要的 | 用什么工具 | 输出 |\n|----------|-----------|------|\n| 评估一个交易策略的收益 | `strategy_backtest` | 收益率/夏普/回撤/胜率 |\n| 验证某个因子是否有效 | `factor_analysis` | IC均值/IR/多空差 |\n| 找出符合条件的股票 | `select_by_code` | 股票列表 |\n| 探索数据的多维关系 | `move_by_code` + `heat_map` | 热力图统计矩阵 |\n| 标记事件/买点 | `new_layer_from_code` | 可视化短线 |\n\n### 你的代码执行环境\n\n```python\n# 可用的变量\nd          # dict[str, DataFrame] — 字段名 → 全市场面板数据（行=时间，列=股票）\ncol_attrs  # dict[str, Series]     — 股票属性（行业、市值等）\n\n# 内置模块\nnp, pd     # numpy + pandas\n\n# 内置函数\nhold_until(buy, sell)  # 生成持仓矩阵（回测必须用这个！）\nrow_rank(df)           # 截面排名 → 百分位值 0~1\nentry_check(window, conditions, mode=\"keep\")  # 买入窗口条件检测\ntime_at(rq)            # 匹配指定时间\ntime_between(srq, erq) # 匹配时间区间\ntime_in(rqs)           # 匹配多个时间\n\n# 复权价格（必须手动算！）\nadj_close = d['close'] * d['adj_factor']\nadj_high  = d['high']  * d['adj_factor']\nadj_low   = d['low']   * d['adj_factor']\n```\n\n### 数据库数据传播规则\n\n> **财报数据**（`stock_finance` 表）：会自动把公告日的数据**向后传播**（forward fill）到下一个公告日。也就是说，当你取任意日期的财报数据（如 ROE、营业收入），它会填充为最近一次公告的值——不会出现 NaN 空洞。\n>\n> **分红数据**（`dividend` 表）和**业绩预告数据**（`forecast` 表）：目前**只在公告日当天有数据，不会向后传播**。原因是\"传播到哪个日期\"存在技术细节难以确定（公告日和实际影响日之间的时间差不确定）。未来可能会增加相关操作，但目前这两张表取非公告日的数据就是 NaN。\n>\n> 含义：如果你在因子中使用分红率、预告净利润等字段，要意识到它们只存在于公告日期点上，不适合做连续的日频截面分析。\n\n### 三条铁律\n\n1. **禁止 import、for/while 循环、df.apply()、lambda、递归**\n2. **禁止 axis=1（行方向计算）**——各股票停牌时间不对齐\n3. **持仓矩阵必须用 `hold_until(buy, sell)`**，不能手写逆序 cumsum\n\n---\n\n## 2. strategy_backtest 四种视图详解\n\n> **关键认知**：`strategy_backtest` 有四个 view 模式，它们**不是\"选一个最好\"的关系**，而是**从不同维度拆解同一个策略**。标准分析流程是 `summary → segments → detail → timeline`（逐步深入）。\n\n### 四种视图对比\n\n| view | 粒度 | 回答什么问题 | 后续分析 | 绘图方式 |\n|------|------|-------------|----------|----------|\n| **summary** | 每只股票 | \"这个策略整体好不好？\" | ✅ select/move/weight/heat_map | 5585条收益曲线叠加 |\n| **segments** | 每次交易 | \"买入前什么因子影响收益？\" | ✅ 核心：分析因子与收益关系 | 持仓片段（起点=买入日） |\n| **detail** | 每只股票 | \"哪只股票表现最好/最差？\" | ✅ 同 summary | 和 summary 同一张图 |\n| **timeline** | 每日 | \"每日净值走势？时间分布？\" | ❌ **不支持二次分析** | 几条合成曲线（净值/排名/持仓比）\n\n### summary 输出结构\n\n```json\n{\n  \"分析的股票数量\": <N>,\n  \"时间范围\": \"<start> 至 <end>\",\n  \"盈利比率-%\": <百分比>,\n  \"跑赢基准比率-%\": <百分比>,\n  \"全局买入比\": <比率>,\n  \"全局持仓比\": <比率>,\n  \"统计分析\": {\n    \"总收益率-%\": { 平均值, 中位数, 最大值, 最小值, 标准差, 25%分位, 75%分位 },\n    \"年化收益率-%\": { ... },\n    \"最大回撤-%\": { ... },\n    \"夏普率\": { ... },\n    \"胜率-%\": { ... },\n    \"盈亏比\": { ... },\n    \"基准收益率(自身)-%\": { ... }\n  }\n}\n```\n\n> **如何使用 summary**：先看中位收益率和夏普率判断策略是否有价值，再看盈利比率和跑赢基准比率判断策略相对 buy&hold 的表现。分布偏度（均值 vs 中位数）可以判断是否少数牛股拉高均值。\n\n### segments 输出结构 + 绘图逻辑\n\n```json\n{\n  \"持仓片断总数\": <N>,\n  \"平均收益-%\": <平均>,\n  \"最大收益-%\": <最大值>,\n  \"最小收益-%\": <最小值>,\n  \"平均持仓时间\": <天数>,\n  \"最长持仓时间\": <天数>,\n  \"最短持仓时间\": <天数>\n}\n```\n\n**图形绘制方式**：\n\n```\nsegments 模式不是单只股票画一条线，而是把每段\"买入→卖出\"独立画成一条线。\n\n- 起点：每段买入日，坐标 (0, 1.0) —— 买入时收益为 1x（基准）\n- 终点：每段卖出日，坐标 (持仓天数, 卖出收益倍数)\n- X 轴：持仓天数（从 0 到 offset_days 或实际卖出天数）\n- Y 轴：收益倍数（1.0 = 买入点，向上 = 盈利，向下 = 亏损）\n- 红色：盈利片段（Y>1）\n- 绿色/青色：亏损片段（Y<1）\n- 一只股票多段持仓 → 被拆分成多条独立线段\n```\n\n**后续分析方法（每个片段的买入时间是关键日期）**：\n- `select_by_code`：按收益倍数筛选，或按持仓天数筛选——返回**片段维度**统计（权重=卖价/买价，非股票维度累计收益）\n- **核心设计**：segments 的真正价值不是看收益本身，而是分析\"**买入前**的各种参数和因子对最终收益的影响\"——把买入时的市值/换手率/估值等用 move_by_code 映射到坐标轴，再用 heat_map 做交叉分析\n- `move_by_code`：把买入时的因子值映射到 X/Y 轴（如买入时市盈率→X，买入时成交量→Y）\n- `weight_by_code`：调整权重（如按持仓天数加权）\n- `heat_map`：因子×收益的二维分布矩阵\n\n#### detail 输出结构\n\n```json\n{\n  \"总收益率-%\":    { \"000001\": <值>, \"000002\": <值>, ... },  // 每只股票逐一展开\n  \"年化收益率-%\":  { \"000001\": <值>, \"000002\": <值>, ... },\n  // 与 summary.statistics 的指标一一对应，但按股票逐一展开\n}\n```\n\n**⚠️ 重要警告**：\n- detail 返回数据量极大（全市场 × 多个指标），可能远超 AI 上下文窗口\n- **禁止直接向用户展示原始 detail 数据**——等于没展示\n- **正确做法**：AI 读取后自行分析（排序、筛选 Top/Bottom、找规律），只汇报结论\n- 推荐用法：筛选表现最好和最差的各 10 只 → 分析共性/原因\n\n#### timeline\n\n**绘制内容**：不画持仓片段，而是绘制 **5 条合成曲线**：\n\n| 曲线 | 颜色 | 含义 |\n|------|------|------|\n| **每日平均收益** | 🔴 红色 | 每天策略持仓的平均收益百分比 |\n| **平均收益排名** | 🟡 黄色 | 每天策略收益在全体股票中的排名均值 |\n| **持平股数/总股数** | 🔵 青色 | 当天持平（没变动）的股票占比 |\n| **买入股数/总股数** | ⚪ 白色 | 当天发出买入信号的股票占比 |\n| **卖出股数/总股数** | 🟣 紫色 | 当天发出卖出信号的股票占比 |\n\n**标题栏显示 5 条线的均值**，格式如：`收益%分布:X.XX 收益排序分布:X.XX 持仓比:X.XX 买点比:X.XX 卖点比:X.XX`\n\n**核心用途**：观察时间分布规律——哪些时间段收益好、哪些时间段回撤大、market timing 是否有效。\n\n**⚠️ 不支持二次分析**：timeline 是\"只读\"视图，不能用 `select_by_code`、`move_by_code`、`weight_by_code`、`heat_map` 等工具做进一步操作。看完就完了，想深入分析需要切到其他 view。\n\n### 四视图使用决策树\n\n```\n跑 strategy_backtest\n  │\n  ├─ view=summary → 总收益中位数为正？夏普>0.5？\n  │   ├─ 否 → 策略不行，换一个\n  │   └─ 是 → 继续\n  │\n  ├─ view=segments → 买入前因子对收益有什么影响？\n  │   核心操作：move_by_code（映射因子）+ heat_map（交叉分析）\n  │\n  ├─ view=detail → AI 内部分析 Top/Bottom 股票\n  │   给用户：Top 10 股票名称+收益、Bottom 10、行业分布规律\n  │   ⚠️ 绝不直接展示原始数据\n  │\n  └─ view=timeline → 查看时间分布规律\n      └─ ⚠️ 只读视图，不支持二次分析。看完切其他 view\n```\n\n### 从 summary 图开始的后续分析\n\n`strategy_backtest`（view=summary）执行后，软件端会绘制全市场持仓收益叠加图。这张图不是终点，而是后续深入分析的**起点**。\n\n#### 用 `select_by_code` 筛选图上数据\n\n`select_by_code` 可以对 summary 图上的所有股票进行条件筛选。**它不只是筛选器——天生自带统计功能**。返回结果中直接包含：\n\n```json\n{\n  \"全局平均\": <数值>,          // 选中股票的平均权重（默认=回测最终收益）\n  \"有效数量\": <N>,             // 实际命中的股票数\n  \"权重名称\": \"<指标名>\",      // 当前权重指标名称\n  \"Y轴统计\": [...],            // 如果有 move_by_code，按 Y 轴分 bin\n  \"Y轴细分\": [...],            // bin 边界\n  \"Y轴缩放\": <值>\n}\n```\n\n> 💡 **核心认知**：不用先 `select_by_code` 再 `heat_map`，select_by_code 本身就返回 `全局平均`——你可以直接知道\"这批股票的均值是多少\"。\n\n常见筛选维度：\n\n- **属性**：`col_attrs['所在城市']`、`col_attrs['所属行业']`（Series，直接对比）\n- **关键日**：用 `time_at` 取某一天的数值（如某日涨幅大的股票）→ bool DataFrame → 广播成全维度 DataFrame\n\n> ⚠️ **使用某一天数值的正确方法**：`select_by_code` 等工具要求 `out` 是与 `d['close']` 同维度的 DataFrame，不能直接用某天的 Series。**正确做法**是用 `time_at` 生成 bool DataFrame，把目标日数值广播到全维度——全程向量化，无需循环（`for` 循环在 exec 环境中本就禁止）：\n> ```python\n> # 筛选某日涨幅>阈值的股票（向量化方法）\n> ret = (d['close'] * d['adj_factor']).pct_change()\n> # 1. time_at 获取 bool DataFrame，True→1，False→NaN\n> mask = time_at('目标日期').astype(float)\n> mask = mask.where(mask > 0, np.nan)\n> # 2. 乘上对应因子的数值（目标日有值，其余为 NaN）\n> day_ret = mask * ret\n> # 3. 向前向后填充 NaN（把目标日数值传播到所有日期）\n> day_ret = day_ret.ffill().bfill()\n> # 4. 添加条件\n> out = day_ret > 阈值\n> ```\n\n> ⚠️ **select_by_code 不回测数据过滤**：`select_by_code`\n\nArchive v1.0.1: 9 files, 55762 bytes\n\nFiles: references/quantall_playbook.md (29159b), requirements.txt (17b), scripts/data/ai_prompts.toml (26771b), scripts/data/db_translate.json (11634b), scripts/Start_QuantAll.py (83b), scripts/UpdateStock_skill.py (89115b), skill-card.md (3096b), SKILL.md (15401b), _meta.json (132b)\n\nArchive v1.0.0: 9 files, 69015 bytes\n\nFiles: references/quantall_playbook.md (29159b), requirements.txt (17b), scripts/data/ai_prompts.toml (25585b), scripts/data/db_translate.json (11634b), scripts/Start_QuantAll.py (83b), scripts/UpdateStock_skill.py (86088b), skill-card.md (2748b), SKILL.md (59719b), _meta.json (132b)","readmeExcerpt":"Skill: QuantAll Owner: mifochen Summary: QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。 AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。 让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。 触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。 不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。 能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、 修改 Tags: latest:1.0.4 Version history: v1.0.4 | 2026-08-10T10:57:27.431Z | user qu","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"□ 1. 创建 venv：\n   <Python路径> -m venv <skill-dir>/scripts/.venv\n   推荐：C:/Users/<用户>/.workbuddy/binaries/python/versions/3.13.12/python.exe\n\n□ 2. pip 安装（务必用清华源，否则 PySide6 等大包下载超时）：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 3. 验证安装：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"from QuantAll import Start_main; print('OK')\"\n\n□ 4. 配置 MCP（修改 ~/.workbuddy/mcp.json）：\n   见下方 MCP 配置\n\n□ 5. 启动服务：\n   <skill-dir>/scripts/.venv/Scripts/python.exe <skill-dir>/scripts/Start_QuantAll.py\n   检查 8686 端口是否监听\n\n□ 6. ⚠️ 提醒用户重连 MCP 连接器（或重启 WorkBuddy）"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"全A解析\": { \"url\": \"http://127.0.0.1:8686/mcp\", \"disabled\": false },\n    \"UpdateStock\": {\n      \"command\": \"<skill-dir>/scripts/.venv/Scripts/python.exe\",\n      \"args\": [\"<skill-dir>/scripts/UpdateStock_skill.py\"],\n      \"disabled\": false\n    }\n  }\n}"},{"language":"text","snippet":"□ 1. 升级库：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install --upgrade quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 2. 验证版本：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"import QuantAll; print(QuantAll.__version__)\"\n   确认 >= requirements.txt 要求的版本\n\n□ 3. 重启 QuantAll 服务（先关旧进程再启动）\n\n□ 4. ⚠️ 提醒用户重连 MCP"},{"language":"python","snippet":"# 可用的变量\nd          # dict[str, DataFrame] — 字段名 → 全市场面板数据（行=时间，列=股票）\ncol_attrs  # dict[str, Series]     — 股票属性（行业、市值等）\n\n# 内置模块\nnp, pd     # numpy + pandas\n\n# 内置函数\nhold_until(buy, sell)  # 生成持仓矩阵（回测必须用这个！）\nrow_rank(df)           # 截面排名 → 百分位值 0~1\nentry_check(window, conditions, mode=\"keep\")  # 买入窗口条件检测\ntime_at(rq)            # 匹配指定时间\ntime_between(srq, erq) # 匹配时间区间\ntime_in(rqs)           # 匹配多个时间\n\n# 复权价格（必须手动算！）\nadj_close = d['close'] * d['adj_factor']\nadj_high  = d['high']  * d['adj_factor']\nadj_low   = d['low']   * d['adj_factor']"},{"language":"json","snippet":"{\n  \"分析的股票数量\": <N>,\n  \"时间范围\": \"<start> 至 <end>\",\n  \"盈利比率-%\": <百分比>,\n  \"跑赢基准比率-%\": <百分比>,\n  \"全局买入比\": <比率>,\n  \"全局持仓比\": <比率>,\n  \"统计分析\": {\n    \"总收益率-%\": { 平均值, 中位数, 最大值, 最小值, 标准差, 25%分位, 75%分位 },\n    \"年化收益率-%\": { ... },\n    \"最大回撤-%\": { ... },\n    \"夏普率\": { ... },\n    \"胜率-%\": { ... },\n    \"盈亏比\": { ... },\n    \"基准收益率(自身)-%\": { ... }\n  }\n}"},{"language":"json","snippet":"{\n  \"持仓片断总数\": <N>,\n  \"平均收益-%\": <平均>,\n  \"最大收益-%\": <最大值>,\n  \"最小收益-%\": <最小值>,\n  \"平均持仓时间\": <天数>,\n  \"最长持仓时间\": <天数>,\n  \"最短持仓时间\": <天数>\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: quantall-mcp\ndescription: >\n  QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。\n  AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。\n  让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。\n  触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。\n  不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。\n  能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、\n  修改 MCP 配置、启动本地 HTTP 服务（localhost:8686）、创建配置文件和启动脚本。\n  所有涉及用户电脑的操作，AI 必须事先告知用户并获得同意。\n  UpdateStock 为可选辅助 MCP（数据库管理，需 tushare API），非 QuantAll 必需。\nagent_created: true\nlicense: MIT\n---\n\n# QuantAll（全A解析）MCP 技能\n\n---\n\n## 这是什么\n\nQuantAll 是一台运行在用户本地电脑上的**全市场向量化计算引擎**。它把 A 股 5000+ 只股票、150+ 维度的数据组织为统一矩阵，AI 只需编写简短的 Python 向量化代码片段，就能在数秒内完成全市场运算——因子计算、策略回测、IC 分析、多维可视化。\n\n**对 AI 的意义**：不再只是\"查询信息然后转述\"，而是能**用代码算出客观结果**。用户问\"小盘股是不是比大盘股表现好\"，AI 不需要去搜索别人的观点，而是直接用全市场数据算出 IC 指标、回测收益，给出有数据支撑的结论。这是从\"数据搬运工\"到\"数据分析师\"的根本转变。\n\n> **工具详细用法**（参数、触发场景、代码模板、核心函数）在 `scripts/data/ai_prompts.toml` 中，MCP 连接后 AI 自动获取。SKILL.md 只讲顶层定位、安装、启动、更新和 AI 行为规范。实战案例参见 `references/quantall_playbook.md`。\n\n---\n\n## 架构\n\n| 组件 | 类型 | 定位 | 依赖 |\n|------|------|------|------|\n| **QuantAll**（全A解析） | HTTP MCP (localhost:8686) | 计算引擎：因子计算/回测/IC分析/可视化 | 本地 DuckDB 数据库 |\n| **UpdateStock** | stdio MCP（可选） | 数据库管理：创建/更新/查询行情 | tushare API key |\n\n两者共用同一个 DuckDB 数据库，路径通过 `scripts/DB_setting.json` 管理。**QuantAll 独立可运行，UpdateStock 不是必需依赖**——有自己的数据库或仅用内置测试库即可。\n\n---\n\n## 📦 安装（首次安装，AI 必读）\n\n> ⚠️ **AI 行为规范**：安装前必须告知用户以下操作内容并获得同意：\n> - 在 `scripts/` 下创建 Python 虚拟环境（约 45 个依赖包，300MB+ 磁盘空间）\n> - 从清华 PyPI 镜像源下载安装 quantall 库\n> - 修改 `~/.workbuddy/mcp.json` 添加 MCP 服务配置\n> - 后续启动时会运行本地 HTTP 服务（localhost:8686）并可能弹出用户协议窗口\n\n```\n□ 1. 创建 venv：\n   <Python路径> -m venv <skill-dir>/scripts/.venv\n   推荐：C:/Users/<用户>/.workbuddy/binaries/python/versions/3.13.12/python.exe\n\n□ 2. pip 安装（务必用清华源，否则 PySide6 等大包下载超时）：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -m pip install quantall -i https://pypi.tuna.tsinghua.edu.cn/simple\n\n□ 3. 验证安装：\n   <skill-dir>/scripts/.venv/Scripts/python.exe -c \"from QuantAll import Start_main; print('OK')\"\n\n□ 4. 配置 MCP（修改 ~/.workbuddy/mcp.json）：\n   见下方 MCP 配置\n\n□ 5. 启动服务：\n   <skill-dir>/scripts/.venv/Scripts/python.exe <skill-dir>/scripts/Start_QuantAll.py\n   检查 8686 端口是否监听\n\n□ 6. ⚠️ 提醒用户重连 MCP 连接器（或重启 WorkBuddy）\n```\n\n**常见坑**：\n- **Git Bash 路径**：传参给 Python 必须用 `C:/` 前缀（非 `/c/`），否则双重转义找不到文件\n- **safe-delete 冲突**：WorkBuddy Python 运行时可能拦截 pip 文件覆盖，报 `SAFE_DELETE_FAIL_CLOSED`。解决：重建 venv（`rm -rf .venv && python -m venv .venv`）后重试，或用 `dangerouslyDisableSandbox: true`\n- **import 大小写**：`from QuantAll import ...`（大写 Q、A），`import quantall` 会失败\n\n### MCP 配置\n\n```json\n{\n  \"mcpServers\": {\n    \"全A解析\": { \"url\": \"http://127.0.0.1:8686/mcp\", \"disabled\": false },\n    \"UpdateStock\": {\n      \"command\": \"<skill-dir>/scripts/.venv/Scripts/python.exe\",\n      \"args\": [\"<skill-dir>/scripts/UpdateStock_skill.py\"],\n      \"disabled\": false\n    }\n  }\n}\n```\n\n> UpdateStock 可选——不配置也能用 QuantAll。仅需要计算引擎时只配「全A解析」。\n\n### 数据库\n\nQuantAll 首次启动自动创建 `scripts/DB_setting.json`，默认连接 pip 包内置的 Test.duckdb（仅沪深300近两年基础行情，**仅供测试，pip 更新会覆盖**"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn798etnj1hernzd0bqw4cg9yx86fkc9\",\n  \"slug\": \"quant-all-mcp\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1786359447431\n}"},{"path":"references/quantall_playbook.md","content":"# QuantAll 实战手册\n\n> 本文件是 QuantAll（全A解析）的使用经验积累文档。SKILL.md 负责\"怎么装、有什么工具\"，\n> 本文档负责\"怎么用好\"——实战模式、代码示例、踩坑记录。\n>\n> **AI 使用建议**：执行复杂分析任务前先快速浏览本文档，了解常见模式和陷阱。\n\n---\n\n## 1. 快速上手（5 分钟）\n\n### QuantAll 是什么\n\n一台本地计算引擎。你（AI）写一段向量化 Python 代码，它就在全市场 5000+ 只股票上并行执行，\n数秒内返回结果。**你不是在查询数据，你是在计算数据。**\n\n### 你能做什么\n\n| 你想要的 | 用什么工具 | 输出 |\n|----------|-----------|------|\n| 评估一个交易策略的收益 | `strategy_backtest` | 收益率/夏普/回撤/胜率 |\n| 验证某个因子是否有效 | `factor_analysis` | IC均值/IR/多空差 |\n| 找出符合条件的股票 | `select_by_code` | 股票列表 |\n| 探索数据的多维关系 | `move_by_code` + `heat_map` | 热力图统计矩阵 |\n| 标记事件/买点 | `new_layer_from_code` | 可视化短线 |\n\n### 你的代码执行环境\n\n```python\n# 可用的变量\nd          # dict[str, DataFrame] — 字段名 → 全市场面板数据（行=时间，列=股票）\ncol_attrs  # dict[str, Series]     — 股票属性（行业、市值等）\n\n# 内置模块\nnp, pd     # numpy + pandas\n\n# 内置函数\nhold_until(buy, sell)  # 生成持仓矩阵（回测必须用这个！）\nrow_rank(df)           # 截面排名 → 百分位值 0~1\nentry_check(window, conditions, mode=\"keep\")  # 买入窗口条件检测\ntime_at(rq)            # 匹配指定时间\ntime_between(srq, erq) # 匹配时间区间\ntime_in(rqs)           # 匹配多个时间\n\n# 复权价格（必须手动算！）\nadj_close = d['close'] * d['adj_factor']\nadj_high  = d['high']  * d['adj_factor']\nadj_low   = d['low']   * d['adj_factor']\n```\n\n### 数据库数据传播规则\n\n> **财报数据**（`stock_finance` 表）：会自动把公告日的数据**向后传播**（forward fill）到下一个公告日。也就是说，当你取任意日期的财报数据（如 ROE、营业收入），它会填充为最近一次公告的值——不会出现 NaN 空洞。\n>\n> **分红数据**（`dividend` 表）和**业绩预告数据**（`forecast` 表）：目前**只在公告日当天有数据，不会向后传播**。原因是\"传播到哪个日期\"存在技术细节难以确定（公告日和实际影响日之间的时间差不确定）。未来可能会增加相关操作，但目前这两张表取非公告日的数据就是 NaN。\n>\n> 含义：如果你在因子中使用分红率、预告净利润等字段，要意识到它们只存在于公告日期点上，不适合做连续的日频截面分析。\n\n### 三条铁律\n\n1. **禁止 import、for/while 循环、df.apply()、lambda、递归**\n2. **禁止 axis=1（行方向计算）**——各股票停牌时间不对齐\n3. **持仓矩阵必须用 `hold_until(buy, sell)`**，不能手写逆序 cumsum\n\n---\n\n## 2. strategy_backtest 四种视图详解\n\n> **关键认知**：`strategy_backtest` 有四个 view 模式，它们**不是\"选一个最好\"的关系**，而是**从不同维度拆解同一个策略**。标准分析流程是 `summary → segments → detail → timeline`（逐步深入）。\n\n### 四种视图对比\n\n| view | 粒度 | 回答什么问题 | 后续分析 | 绘图方式 |\n|------|------|-------------|----------|----------|\n| **summary** | 每只股票 | \"这个策略整体好不好？\" | ✅ select/move/weight/heat_map | 5585条收益曲线叠加 |\n| **segments** | 每次交易 | \"买入前什么因子影响收益？\" | ✅ 核心：分析因子与收益关系 | 持仓片段（起点=买入日） |\n| **detail** | 每只股票 | \"哪只股票表现最好/最差？\" | ✅ 同 summary | 和 summary 同一张图 |\n| **timeline** | 每日 | \"每日净值走势？时间分布？\" | ❌ **不支持二次分析** | 几条合成曲线（净值/排名/持仓比）\n\n### summary 输出结构\n\n```json\n{\n  \"分析的股票数量\": <N>,\n  \"时间范围\": \"<start> 至 <end>\",\n  \"盈利比率-%\": <百分比>,\n  \"跑赢基准比率-%\": <百分比>,\n  \"全局买入比\": <比率>,\n  \"全局持仓比\": <比率>,\n  \"统计分析\": {\n    \"总收益率-%\": { 平均值, 中位数, 最大值, 最小值, 标准差, 25%分位, 75%分位 },\n    \"年化收益率-%\": { ... },\n    \"最大回撤-%\": { ... },\n    \"夏普率\": { ... },\n    \"胜率-%\": { ... },\n    \"盈亏比\": { ... },\n    \"基准收益率(自身)-%\": { ... }\n  }\n}\n```\n\n> **如何使用 summary**：先看中位收益率和夏普率判断策略是否有价值，再看盈利比率和跑赢基准比率判断策略相对 buy&hold 的表现。分布偏度（均值 vs 中位数）可以判断是否少数牛股拉高均值。\n\n### segments 输出结构 + 绘图逻辑\n\n```json\n{\n  \"持仓片断总数\": <N>,\n  \"平均收益-%\": <平均>,\n  \"最大收益-%\": <最大值>,\n  \"最小收益-%\": <最小值>,\n  \"平均持仓时间\": <天数>,\n  \"最长持仓时间\": <天数>,\n  \"最短持仓时间\": <天数>\n}\n```\n\n**图形绘制方式**：\n\n```\nsegments 模式不是单只股票画一条线，而是把每段\"买入→卖出\"独立画成一条线。\n\n- 起点：每段买入日，坐标 (0, 1.0) —— 买入时收益为 1x（基准）\n- 终点：每段卖出日，坐标 (持仓天数, 卖出收益倍"},{"path":"scripts/data/ai_prompts.toml","content":"# 注意！！！\r\n# 修改此文件，可能会影响AI的运行，导致的具体后果由用户自行负责\r\n# \r\n# 全A解析 AI 提示词配置文件\r\n# 可以自行调整和优化提示词\r\n# AI 工作规律：用 name 快速定位，用 description 第一句确认，再读细节执行\r\n# ==============================================\r\n\r\n# 顶层的提示词\r\nmcp = \"\"\"\r\n你是量化策略分析助手，【全A解析】是你的分析平台。\r\n\r\n【平台概述】\r\n全A解析覆盖A股5000+股票，提供统一的Python exec计算环境，\r\n你可以用代码片段直接计算全市场数据，平台自动完成绘制、排序、分组、统计。\r\n\r\n【数据结构】\r\n- d: dict，key=字段名，value=DataFrame（个股×时间面板）\r\n  - 列=股票代码，行=时间，停牌NaN已置顶或置底\r\n  - 各股时间不对齐，禁止行方向聚合（axis=1）\r\n- col_attrs: dict，key=属性名，value=Series（股票属性，数值或字符串）\r\n- 内置：np, pd；禁止：import / 循环 / df.apply / lambda / 递归 / axis=1\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 更多字段用 available_data 查看（130+字段，含财务、因子、行业等）\r\n\r\n【核心工作流】\r\n1. 画图层 — new_layer_from_code / strategy_backtest(segments)\r\n   代码输出 bool DataFrame，True 位置自动绘制短线（最小绘制单元=股票+时间点）\r\n2. 筛选/查询 — select_by_code\r\n   在已有图层中筛选符合条件的数据\r\n3. 排序/平移 — move_by_code\r\n   按算法计算值控制短线在轴上的位置，支持转百分位排名、分桶、自动缩放\r\n4. 统计 — heat_map\r\n   对当前图层进行分组统计，返回数量矩阵和权重矩阵（默认权重=数量等权）\r\n5. 策略回测 — strategy_backtest\r\n   生成持仓矩阵，评估收益、胜率、夏普、回撤等，四种视角：summary/detail/segments/timeline\r\n6. 因子分析 — factor_analysis\r\n   生成因子的数值矩阵，评估因子的IC\r\n7. 统计权重 — weight_by_code\r\n   对统计权重进行自定义计算，替代默认的数量等权\r\n8. 批量权重 — batch_weight\r\n   weight_by_code 的批量版本，一次对比多个权重方案，不改变活动权重。view=\"summary\"返回评估参数，view=\"heatmap\"返回完整矩阵\r\n9. 批量筛选 — batch_select\r\n   select_by_code 的批量版本，一次对比多个筛选条件或批量交集/并集。mode: independent_summary/independent_heatmap/intersect/union\r\n10. 因子相关性 — batch_factor_corr\r\n    批量计算多个因子与基准因子的相关性（IC/IR/time_potential + 分层IC），用于因子去冗余和互补性分析\r\n11. 计算环境 — how_code\r\n    查看代码执行环境说明（变量、函数、规则），首次使用时调用了解环境\r\n\r\n【软件自动处理】\r\n- 数值输出自动缩放、转排序、分组（不需要AI写代码）\r\n- bool输出自动绘制短线，不需要处理绘制逻辑\r\n\r\n【你的任务】\r\n理解用户意图，选择合适的工具组合完成任务。\r\n常见场景：\r\n- 画图分析：画图层 → 排序 → 统计 → 分析分布\r\n- 策略回测：strategy_backtest → 按结果画图层 → 排序统计 → 诊断优化\r\n- 挖掘机会：用条件筛选 → 画图层 → 观察分布 → 回测验证\r\n\"\"\"\r\n\r\n[tool]\r\n\r\nstrategy_backtest = \"\"\"\r\n【触发场景】\r\n策略回测的优先工具。涉及以下场景时应首先使用：\r\n- 评估策略收益、回测、跑赢基准\r\n- 生成买入/卖出信号并测试表现\r\n- 比较不同策略参数的效果\r\n- 任何需要\"用代码定义交易逻辑并看收益\"的需求\r\n该工具独立完成 信号生成→持仓构建→收益评估 的完整闭环，\r\n现阶段应作为策略分析的默认首选，而非最后手段。\r\n\r\n【功能说明】\r\n用策略代码生成持仓矩阵（bool DataFrame），评估收益、胜率、夏普、回撤等指标。\r\n执行价格默认 close（可在收盘前操作），可选 next_open（次日开盘买入，适合严格回测）。\r\n\r\n【Python exec 环境】\r\n- d: dict，key=字段名，value=pd.DataFrame（个股×时间面板）\r\n  - 停牌导致的 NaN 已置顶或置底，避免干扰窗口计算\r\n  - 因此各股票时间不对齐，禁止行方向计算（axis=1 的聚合/排序）\r\n- col_attrs: dict，key=属性名，value=pd.Series（股票属性，数值或字符串）\r\n- 默认字段：close, open, high, low, vol, amount, adj_factor\r\n- 复权价格：adj_close = d['close'] * d['adj_factor']，high/low 同理\r\n- 内置：np, pd\r\n- 禁止：import / for/while循环 / df.apply() / lambda / 递归 / 行方向聚合（axis=1）\r\n- 更多字段用 available_data 工具查看\r\n\r\n【输出规则】\r\nout = bool DataFrame，True 表示持仓。连续 True 片段的第一个为买入，最后一个为卖出。\r\n\r\n【核心函数】\r\n\r\n1. hold_until(buy, sell) — 生成持仓矩阵\r\n   从买入信号开始持仓，直到遇到卖出信号。买卖同日则放弃该买点。\r\n   - buy: bool DataFrame，买入信号（仅取每段第一个）\r\n   - sell: bool DataFrame，或 list/tuple of DataFrame（多个卖点自动 OR 合并）\r\n   - 返回: bool DataFrame\r\n   示例：\r\n     # 单卖点\r\n     buy = (D.shift(1) <= 20) & (D > 20)\r\n     sell = (D.shift(1) >= 80) & (D < 80)\r\n     out = hold_until(buy, sell)\r\n     # 多卖点\r\n     out = hold_until(buy, [sell1, sell2])\r\n\r\n2. entry_check(window, conditio"},{"path":"scripts/data/db_translate.json","content":"{\r\n    \"stock_basic\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"name\": \"股票名称\",\r\n        \"update_date\": \"数据更新日期\",\r\n        \"list_date\": \"上市日期\",\r\n        \"act_name\": \"实控人名称\",\r\n        \"act_ent_type\": \"实控人企业性质\",\r\n        \"industry\": \"所属行业\",\r\n        \"com_name\": \"公司名称\",\r\n        \"com_id\": \"统一社会信用代码\",\r\n        \"chairman\": \"法人代表\",\r\n        \"manager\": \"总经理\",\r\n        \"secretary\": \"董秘\",\r\n        \"reg_capital\": \"注册资本\",\r\n        \"setup_date\": \"注册日期\",\r\n        \"province\": \"所在省份\",\r\n        \"city\": \"所在城市\",\r\n        \"introduction\": \"公司介绍\",\r\n        \"website\": \"公司主页\",\r\n        \"email\": \"电子邮件\",\r\n        \"office\": \"办公室\",\r\n        \"business_scope\": \"经营范围\",\r\n        \"employees\": \"员工人数\",\r\n        \"main_business\": \"主要业务及产品\",\r\n        \"exchange\": \"交易所\",\r\n        \"concept\":\"所属概念\"\r\n    },\r\n    \"stock_factor\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"trade_date\": \"交易日期\",\r\n        \"close\": \"当日收盘价\",\r\n        \"turnover_rate\": \"换手率\",\r\n        \"turnover_rate_f\": \"换手率-自由流通股\",\r\n        \"volume_ratio\": \"量比\",\r\n        \"pe\": \"市盈率\",\r\n        \"pe_ttm\": \"市盈率TTM\",\r\n        \"pb\": \"市净率\",\r\n        \"ps\": \"市销率\",\r\n        \"ps_ttm\": \"市销率TTM\",\r\n        \"dv_ratio\": \"股息率\",\r\n        \"dv_ttm\": \"股息率TTM\",\r\n        \"total_share\": \"总股本\",\r\n        \"float_share\": \"流通股本\",\r\n        \"free_share\": \"自由流通股本\",\r\n        \"total_mv\": \"总市值\",\r\n        \"circ_mv\": \"流通市值\",\r\n        \"limit_status\": \"涨跌停状态\"\r\n    },\r\n    \"stock_forecast\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"ann_date\": \"公告日期\",\r\n        \"end_date\": \"报告期\",\r\n        \"type\": \"业绩预告类型\",\r\n        \"p_change_min\": \"预告净利润变动下限-%\",\r\n        \"p_change_max\": \"预告净利润变动上限-%\",\r\n        \"net_profit_min\": \"预告净利润下限-万元\",\r\n        \"net_profit_max\": \"预告净利润上限-万元\",\r\n        \"last_parent_net\": \"上年同期归母净利润-万元\",\r\n        \"notice_times\": \"公布次数\",\r\n        \"first_ann_date\": \"首次公告日\",\r\n        \"summary\": \"业绩预告摘要\",\r\n        \"change_reason\": \"业绩变动原因\",\r\n        \"update_flag\": \"更新标志\"\r\n    },\r\n    \"stock_dividend\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"end_date\": \"分送年度\",\r\n        \"ann_date\": \"预案公告日\",\r\n        \"div_proc\": \"实施进度\",\r\n        \"stk_div\": \"每股送转合计\",\r\n        \"stk_bo_rate\": \"每股送股比例\",\r\n        \"stk_co_rate\": \"每股转增比例\",\r\n        \"cash_div\": \"每股分红-税后\",\r\n        \"cash_div_tax\": \"每股分红-税前\",\r\n        \"record_date\": \"股权登记日\",\r\n        \"ex_date\": \"除权除息日\",\r\n        \"pay_date\": \"派息日\",\r\n        \"div_listdate\": \"红股上市日\",\r\n        \"imp_ann_date\": \"实施公告日\",\r\n        \"base_date\": \"基准日\",\r\n        \"base_share\": \"实施基准股本-万\",\r\n        \"update_flag\": \"是否变更过\"\r\n    },\r\n    \"stock_report\": {\r\n        \"symbol\": \"股票代码\",\r\n        \"ann_date\": \"公告日期\",\r\n        \"end_date\": \"报告期\",\r\n        \"eps\": \"每股收益\",\r\n        \"dt_eps\": \"稀释每股收益\",\r\n        \"total_revenue_ps\": \"每股营业总收入\",\r\n        \"revenue_ps\": \"每股营业收入\",\r\n        \"capital_rese_ps\": \"每股资本公积\",\r\n        \"surplus_rese_ps\": \"每股盈余公积\",\r\n        \"undist_profit_ps\": \"每股未分配利润\",\r\n        \"extra_item\": \"非经常性损益\",\r\n        \"profit_dedt\": \"扣非净利润\",\r\n        \"gross_margin\": \"毛利\",\r\n        \"current_ratio\": \"流动比率\",\r\n        \"quick_ratio\": \"速动比率\",\r\n        \"cash_ratio\": \"保守速动比率\",\r\n        \"i"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。 AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。 让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。 触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。 不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。 能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、 修改 Skill: QuantAll Owner: mifochen Summary: QuantAll（全A解析）MCP —— 股市全市场向量化计算引擎，为 AI 提供本地 Python 计算环境。 AI 编写向量化代码片段，数秒内完成 5000+ 股票的因子计算、策略回测、IC 分析和 GPU 可视化。 让 AI 从\"信息查询者\"升级为\"数据计算者\"——用代码算出客观结果，而非搬运网络观点。 触发：用户明确提到\"回测\"\"因子分析\"\"IC分析\"\"选股策略\"\"QuantAll\"\"全A解析\"等量化关键词时。 不主动在普通股市聊天中触发，仅在用户有明确量化分析需求时使用。 能力声明：本技能需在用户电脑上创建 Python 虚拟环境（300MB+）、安装 quantall 库、 修改 Tags: latest:1.0.4 Version history: v1.0.4 | 2026-08-10T10:57:27.431Z | user qu","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1147,"uniquenessScore":50,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T02:22:27.116Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T02:22:27.116Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T14:48:22.574Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}