{"id":"87a96853-eeda-4874-8998-1b95836747a8","entityType":"agent","slug":"clawhub-listolany-quant-strategy-assistant","name":"量化策略助手","canonicalUrl":"https://www.xpersona.co/agent/clawhub-listolany-quant-strategy-assistant","canonicalPath":"/agent/clawhub-listolany-quant-strategy-assistant","generatedAt":"2026-10-11T00:32:04.866Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T22:28:42.697Z","emptyReason":null},"description":"量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。 Skill: 量化策略助手 Owner: listolany Summary: 量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。 Tags: latest:1.0.2 Version history: v1.0.2 | 2026-04-16T10:23:04.566Z | auto quant-strategy-assistant 1.0.2 - Initial public release with full OpenClaw three-round interactive workflow for quant strategy development. - Added 175 files, including backtest orchestrator, data capability guard, and extensive QGDATA API documentation. - Suppor","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17a7chdzm1hkmyebcb2fd07x583g5kd:quant-strategy-assistant","sourceUrl":"https://clawhub.ai/listolany/quant-strategy-assistant","homepage":"https://clawhub.ai/listolany/skills/quant-strategy-assistant","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/listolany/quant-strategy-assistant","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/listolany/skills/quant-strategy-assistant","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。 Skill: 量化策略助手 Owner: listolany Summary: 量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。 Tags: latest:1.0.2 Version history: v1.0"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:28:42.697Z","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-10T22:28:42.697Z","emptyReason":null},"stars":null,"forks":null,"downloads":1242,"packageName":null,"latestVersion":"1.0.2","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:28:42.628Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T22:28:42.697Z","lastCrawledAt":"2026-10-10T22:28:42.628Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T22:28:42.628Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.2","createdAt":"2026-04-16T10:23:04.566Z","changelog":"quant-strategy-assistant 1.0.2 - Initial public release with full OpenClaw three-round interactive workflow for quant strategy development. - Added 175 files, including backtest orchestrator, data capability guard, and extensive QGDATA API documentation. - Supports natural language to code generation, automatic backtesting, parameter optimization, and QMT simulated/real trading. - Comprehensive documentation provided for engine configuration, trigger words, routing rules, environment checks, and core principles. - Enforced strict separation of CTA and portfolio routes with strong compliance rules for code generation and environment validation.","fileCount":336,"zipByteSize":316727},{"version":"1.0.1","createdAt":"2026-04-16T09:14:52.408Z","changelog":"修复小问题优化，更新说明","fileCount":160,"zipByteSize":102552},{"version":"1.0.0","createdAt":"2026-04-16T08:27:43.058Z","changelog":"初始版本：支持自然语言转策略、回测、参数优化、QMT实盘对接，三轮交互闭环","fileCount":160,"zipByteSize":102551}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17a7chdzm1hkmyebcb2fd07x583g5kd:quant-strategy-assistant","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-listolany-quant-strategy-assistant/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/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-11T00:32:04.865Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-listolany-quant-strategy-assistant/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-10T22:28:42.697Z","emptyReason":null},"readme":"Skill: 量化策略助手\n\nOwner: listolany\n\nSummary: 量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。\n\nTags: latest:1.0.2\n\nVersion history:\n\nv1.0.2 | 2026-04-16T10:23:04.566Z | auto\n\nquant-strategy-assistant 1.0.2\n\n- Initial public release with full OpenClaw three-round interactive workflow for quant strategy development.\n- Added 175 files, including backtest orchestrator, data capability guard, and extensive QGDATA API documentation.\n- Supports natural language to code generation, automatic backtesting, parameter optimization, and QMT simulated/real trading.\n- Comprehensive documentation provided for engine configuration, trigger words, routing rules, environment checks, and core principles.\n- Enforced strict separation of CTA and portfolio routes with strong compliance rules for code generation and environment validation.\n\nv1.0.1 | 2026-04-16T09:14:52.408Z | user\n\n修复小问题优化，更新说明\n\nv1.0.0 | 2026-04-16T08:27:43.058Z | user\n\n初始版本：支持自然语言转策略、回测、参数优化、QMT实盘对接，三轮交互闭环\n\nArchive index:\n\nArchive v1.0.2: 336 files, 316727 bytes\n\nFiles: qgdata-reference.md (9358b), QMT-TradingClaw/backtests/backtest_runner.py (59760b), QMT-TradingClaw/backtests/data_capability_guard.py (11075b), QMT-TradingClaw/backtests/monitor_server.py (57439b), QMT-TradingClaw/backtests/pipeline_orchestrator.py (133283b), QMT-TradingClaw/backtests/qg_constants.py (3155b), QMT-TradingClaw/backtests/test_sector_date.py (10051b), QMT-TradingClaw/backtests/trade_runner.py (22811b), QMT-TradingClaw/qgdata_docs/apis/adj_factor.md (496b), QMT-TradingClaw/qgdata_docs/apis/anns_d.md (600b), QMT-TradingClaw/qgdata_docs/apis/bak_basic.md (576b), QMT-TradingClaw/qgdata_docs/apis/balancesheet.md (703b), QMT-TradingClaw/qgdata_docs/apis/block_trade.md (443b), QMT-TradingClaw/qgdata_docs/apis/broker_recommend.md (495b), QMT-TradingClaw/qgdata_docs/apis/bse_mapping.md (455b), QMT-TradingClaw/qgdata_docs/apis/cashflow.md (749b), QMT-TradingClaw/qgdata_docs/apis/ccass_hold_detail.md (813b), QMT-TradingClaw/qgdata_docs/apis/ccass_hold.md (579b), QMT-TradingClaw/qgdata_docs/apis/cctv_news.md (447b), QMT-TradingClaw/qgdata_docs/apis/ci_daily.md (571b), QMT-TradingClaw/qgdata_docs/apis/cn_cpi.md (460b), QMT-TradingClaw/qgdata_docs/apis/cn_gdp.md (410b), QMT-TradingClaw/qgdata_docs/apis/cn_m.md (402b), QMT-TradingClaw/qgdata_docs/apis/cn_pmi.md (485b), QMT-TradingClaw/qgdata_docs/apis/cn_ppi.md (519b), QMT-TradingClaw/qgdata_docs/apis/cyq_chips.md (722b), QMT-TradingClaw/qgdata_docs/apis/cyq_perf.md (506b), QMT-TradingClaw/qgdata_docs/apis/daily_basic.md (637b), QMT-TradingClaw/qgdata_docs/apis/daily_info.md (623b), QMT-TradingClaw/qgdata_docs/apis/daily.md (575b), QMT-TradingClaw/qgdata_docs/apis/dc_daily.md (595b), QMT-TradingClaw/qgdata_docs/apis/dc_hot.md (599b), QMT-TradingClaw/qgdata_docs/apis/dc_index.md (611b), QMT-TradingClaw/qgdata_docs/apis/dc_member.md (485b), QMT-TradingClaw/qgdata_docs/apis/disclosure_date.md (667b), QMT-TradingClaw/qgdata_docs/apis/dividend.md (707b), QMT-TradingClaw/qgdata_docs/apis/etf_basic.md (487b), QMT-TradingClaw/qgdata_docs/apis/etf_index.md (503b), QMT-TradingClaw/qgdata_docs/apis/etf_share_size.md (606b), QMT-TradingClaw/qgdata_docs/apis/etf_stk_mins.md (801b), QMT-TradingClaw/qgdata_docs/apis/express.md (627b), QMT-TradingClaw/qgdata_docs/apis/fina_audit.md (619b), QMT-TradingClaw/qgdata_docs/apis/fina_indicator.md (648b), QMT-TradingClaw/qgdata_docs/apis/fina_mainbz.md (609b), QMT-TradingClaw/qgdata_docs/apis/forecast.md (657b), QMT-TradingClaw/qgdata_docs/apis/fund_adj.md (496b), QMT-TradingClaw/qgdata_docs/apis/fund_basic.md (469b), QMT-TradingClaw/qgdata_docs/apis/fund_company.md (453b), QMT-TradingClaw/qgdata_docs/apis/fund_daily.md (566b), QMT-TradingClaw/qgdata_docs/apis/fund_div.md (579b), QMT-TradingClaw/qgdata_docs/apis/fund_factor_pro.md (586b), QMT-TradingClaw/qgdata_docs/apis/fund_manager.md (571b), QMT-TradingClaw/qgdata_docs/apis/fund_nav.md (579b), QMT-TradingClaw/qgdata_docs/apis/fund_portfolio.md (585b), QMT-TradingClaw/qgdata_docs/apis/fund_share.md (490b), QMT-TradingClaw/qgdata_docs/apis/ggt_daily.md (587b), QMT-TradingClaw/qgdata_docs/apis/ggt_monthly.md (639b), QMT-TradingClaw/qgdata_docs/apis/ggt_top10.md (648b), QMT-TradingClaw/qgdata_docs/apis/gz_index.md (586b), QMT-TradingClaw/qgdata_docs/apis/hibor.md (505b), QMT-TradingClaw/qgdata_docs/apis/hk_adjfactor.md (537b), QMT-TradingClaw/qgdata_docs/apis/hk_basic.md (449b), QMT-TradingClaw/qgdata_docs/apis/hk_daily_adj.md (563b), QMT-TradingClaw/qgdata_docs/apis/hk_daily.md (545b), QMT-TradingClaw/qgdata_docs/apis/hk_hold.md (550b), QMT-TradingClaw/qgdata_docs/apis/hk_mins.md (870b), QMT-TradingClaw/qgdata_docs/apis/hk_tradecal.md (448b), QMT-TradingClaw/qgdata_docs/apis/hm_detail.md (608b), QMT-TradingClaw/qgdata_docs/apis/hm_list.md (339b), QMT-TradingClaw/qgdata_docs/apis/hsgt_top10.md (650b), QMT-TradingClaw/qgdata_docs/apis/idx_factor_pro.md (739b), QMT-TradingClaw/qgdata_docs/apis/idx_mins.md (794b), QMT-TradingClaw/qgdata_docs/apis/income.md (708b), QMT-TradingClaw/qgdata_docs/apis/index_basic.md (518b), QMT-TradingClaw/qgdata_docs/apis/index_classify.md (444b), QMT-TradingClaw/qgdata_docs/apis/index_daily.md (566b), QMT-TradingClaw/qgdata_docs/apis/index_dailybasic.md (611b), QMT-TradingClaw/qgdata_docs/apis/index_global.md (575b), QMT-TradingClaw/qgdata_docs/apis/index_member_all.md (521b), QMT-TradingClaw/qgdata_docs/apis/index_monthly.md (605b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: quant-strategy-assistant\ndescription: \"量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。\"\nmetadata:\n  requires:\n    bins: [\"python3\"]\n  openclaw:\n    requires:\n      bins: [\"python3\"]\n---\n\n# 量化策略助手\n\n> **兼容说明**：本文档既是 OpenClaw Skill，也可作为任意 AI Agent 的操作手册。只要 Agent 能读取文件、执行命令、生成代码，即可按下方协议使用。YAML 头部的 `metadata.openclaw` 为 OpenClaw 平台专用字段，其他 Agent 忽略即可。\n\n回测三轮交互闭环 → 用户按需选择参数优化 / 模拟实盘。\n\n## 能力分层\n\n| 能力 | 引擎 | 依赖 | 说明 |\n|------|------|------|------|\n| **CTA回测** | vnpy_ctastrategy | python3 + qgdata | 单标的择时策略，任意平台 |\n| **Portfolio回测** | vnpy_portfoliostrategy | python3 + qgdata | 多标的组合/轮动策略，任意平台 |\n| **参数优化** | vnpy OptimizationSetting | 同回测 | 回测后由用户触发，穷举/遗传算法 |\n| **模拟/实盘** | miniQMT + vnpy CTA引擎 | QMT 交易端 | `qmt-check` 检测 → `trade` 启动自动交易，含探针单验证 |\n\n回测是核心能力，不依赖 QMT。用户请求模拟/实盘时才运行 `qmt-check`。\n\n### CTA vs Portfolio 自动路由（强制）\n\n| 条件 | 模式 | 策略基类 |\n|------|------|----------|\n| 单一标的 + 无组合关键词 | `cta` | `CtaTemplate` |\n| 以下任一条件满足 | `portfolio` | `StrategyTemplate`（vnpy_portfoliostrategy） |\n\n**portfolio 判定规则（分层，LLM 和 `parse_requirement()` 均遵循）**：\n1. **强信号**（任一出现即 portfolio）：`轮动/组合/多标的/全市场/等权/仓位分配/前N名`\n2. **弱信号 + 多标的上下文**（二者共现才 portfolio）：弱信号 `排序/筛选/选股/调仓/排列/持仓周期` 需同时存在多标的上下文（`板块/成分股/指数/行业/概念/股票池`）\n3. **标的数量 > 1**：`--symbols` 含 2 只以上自动 portfolio\n\n注意：\"多头排列\"中的\"排列\"、\"均线排序\"在单标的场景不触发 portfolio。\n\n路由由 `parse_requirement()` 自动判定并写入 `parsed[\"mode\"]`，agent 生成策略代码时必须使用对应基类。\n\n**Portfolio 引擎驱动约束**：Portfolio 回测引擎仅支持 DAILY 和分钟级驱动。周级策略用 `--interval DAILY`，在 `on_bars(bars)` 中按 `list(bars.values())[0].datetime.weekday()==0`（周一）判断调仓日；周线指标直接用 `pro.weekly()` 获取，无需从日线合成。\n\n**股票池所有权契约（强制）**：股票池由 `--symbols` 参数唯一定义 → 引擎加载数据 → 策略通过 `self.vt_symbols` 接收。策略代码 `__init__` 中**禁止覆盖 `vt_symbols`**，必须使用引擎传入的列表。所有标的代码使用 vnpy 格式（`600519.SSE`/`000858.SZSE`），不可使用 qgdata 格式（`.SH/.SZ`）。选股逻辑在 `on_bars(bars)` 中基于 `self.vt_symbols` 遍历和筛选。\n\n**板块/指数成分股由引擎自动解析（强制）**：用户说\"人工智能板块\"/\"沪深300成分股\"/\"银行行业\"等时，引擎会自动解析出完整成分股列表到 `--symbols`。策略代码中**禁止**自行调用 `pro.ths_member()`/`pro.ths_index()`/`pro.dc_member()` 等板块 API。\n\n**回测日期约束（强制）**：用户的回测日期意图必须由你转换为标准 `--start YYYYMMDD --end YYYYMMDD` 参数。例如用户说\"最近1年\"则根据当天日期计算 today-365 输出对应日期。用户未提及任何日期时，**不传** `--start/--end`（引擎默认最近1年，即 today-365 ~ today）。第1轮确认摘要中日期栏必须写\"引擎默认最近1年\"而非自行编造\"近2年\"等。**禁止**编造与用户意图不符的固定日期。\n\n### 模拟/实盘交易（独立流程，不走三轮协议）\n\n用户提及 `模拟`/`实盘`/`模拟交易`/`开始交易`/`QMT` 时触发。**前提：至少有一次成功的回测（status=completed）。**\n\n**第 1 步：环境检测**（自动发现 QMT 路径，无需用户手动配置路径）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" qmt-check\n```\n\n输出 JSON 含 `ready`（布尔）和 `hint`（状态说明）：\n- `platform != Windows` → 提示用户在 Windows + QMT 环境运行\n- QMT 路径自动扫描失败 → 提示确认 QMT 已安装\n- QMT 终端未运行 → 提示\"请先打开 QMT 并以极简模式登录\"\n- 缺少资金账号 → 提示通过 `--account-id` 或 `QMT_ACCOUNT_ID` 提供\n- `ready=true` → 进入第 2 步\n\n**第 2 步：启动交易**（内含自动探针验证：100股跌停价挂单→确认→撤单，可选单独跑 `probe --symbol {代码} --account-id {账号}`）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade \\\n  --run-id \"{最近成功回测的 run_id}\"\n```\n\n返回 JSON 分流：\n- `status=trading_started` → 告知用户：✅ 交易已启动，附带日志路径\n- `status=platform_redirect` → 告知用户：需在 Windows + QMT 环境运行，给出命令\n- `status=error` → 告知具体错误\n\n**第 3 步：停止交易**（用户说「停止交易」时）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade-stop --run-id \"{run_id}\"\n```\n\n仅需用户提供 **资金账号**（`--account-id` 或 `QMT_ACCOUNT_ID`）；QMT 路径自动扫描各盘符下 `userdata_mini` 目录（可通过 `QMT_PATH` 覆盖）。\n\n## 环境\n\n| 项目 | 值 |\n|------|---|\n| 项目根目录 | `QUANTCLAW_ROOT`（兼容 `QMT_PROJECT_ROOT`） |\n| vnpy_qmt源码 | `$QUANTCLAW_ROOT/vnpy_qmt` |\n| 策略输出 | `$QUANTCLAW_ROOT/strategies/` |\n| 回测输出 | `$QUANTCLAW_ROOT/backtests/` |\n| 回测数据源 | qgdata（建议预先配置 `QGDATA_TOKEN`） |\n| 实盘交易 | miniQMT (xt_gateway.py)，需 QMT 交易端已启动 |\n| Python解释器 | `PYTHON_BIN`（默认 `python3`） |\n\n回测默认参数：`capital=1000000 / rate=0.0003 / slippage=0.01 / size=1 / pricetick=0.01`\n\n配置指南: https://gitee.com/GuojinQuant/quant-claw#第四步配置环境变量 （仓库自带 `.env.example`）\n\n关键变量（优先从 `.env` / 环境变量自动推导，不需要写死）：\n- `QUANTCLAW_ROOT`：项目根目录（兼容 `QMT_PROJECT_ROOT`）\n- `MONITOR_PUBLIC_BASE`：监控公网基址（可留空；OpenClaw 环境下可由 `OPENCLAW_CONTROL_URL` 自动推导）\n- `ORCH_MONITOR_PORT_CANDIDATES`：白名单端口（默认 `8767`，必须在防火墙放通）\n- `QGDATA_TOKEN`：数据 Token（可选；未配置时自动使用内置共享试用Token，有每日额度限制）\n\n**Token 自动提取规则（强制）**：若用户对话中出现 60~70 位连续字母数字串（如\"我的token是 Mj9mN2xP...\"），自动提取并通过 `--token` 参数传给 submit 命令。日志和回复中只显示前 6 位+`***`，**绝不回显完整 Token**。提取到个人 Token 后提示用户：`已使用您的个人Token，不消耗共享试用额度`。\n\n---\n\n## 核心原则（强制）\n\n- 回测请求走三轮交互协议（见下方工作流）。\n- 编排器路径：`\"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\"`。\n- 严禁读取或引用历史报告文件（`.html`/`.png`/`.json`），只使用 orchestrator 的 `status` 命令输出获取结果。\n- 策略代码由 agent 在第 2 轮使用 LLM 生成，写入 `${QUANTCLAW_ROOT}/strategies/` 目录。\n- 禁止在首条回复前做长轮询。\n- 监控页是透明主通道，聊天页只给里程碑与结论。\n- 失败时必须回复 `status` + `error` + `next_action`，禁止只说\"失败了\"不给下一步。\n- 实盘能力保留，默认不进入实盘；用户请求模拟/实盘时执行 `qmt-check` 检测。\n- 触发词分四类：\n  - **回测第1轮**：`回测`、`策略`、`自动编排`、`均线`、`上穿`、`下穿`、`买入`、`卖出` → 进入三轮交互协议\n  - **回测第2轮**：`开始生成`、`生成策略`、`好`、`开始`、`继续`、`1`（或任何第1轮确认后的用户消息）；若同条消息同时包含完整需求+第2轮触发词，直接视为已确认并进入第2轮\n  - **参数优化**：`优化`、`调参`、`参数优化`、`网格搜索` → 执行 `optimize`（回测完成后触发）\n  - **模拟/实盘**：`模拟`、`模拟盘`、`模拟交易`、`开始交易`、`实盘`、`实盘交易`、`QMT` → 执行 `qmt-check` + `trade`（独立流程，不走三轮协议）\n\n---\n\n## 第 0 步：环境预检（每次会话首次触发时执行一次）\n\n运行 Skill 内置预检脚本（`scripts/preflight.py`，相对于本 Skill 目录）。脚本内部使用 `sys.executable` 自适应解释器，直接调用即可：\n\nLinux/macOS：\n```bash\npython3 \"<本Skill目录>/scripts/preflight.py\"\n```\nWindows PowerShell：\n```powershell\npython \"<本Skill目录>\\scripts\\preflight.py\"\n```\n\n输出 JSON，按字段消费：\n- `ready=true` → 取 `engine_root` 作为 `QUANTCLAW_ROOT`，进入第 1 轮\n- `ready=false` + `engine_found=true` → 依赖缺失，向用户展示 `blockers` 和 `fix_cmd`\n- `ready=false` + `engine_found=false` → 引擎未找到，返回 `status=config_missing` + 配置指南链接。**禁止降级为手动脚本。**\n- `hints` 非空 → 非阻塞提示（如 Token 状态），向用户如实展示\n- 预检通过后可选执行 `doctor_cmd` 做深度配置诊断（端口/Token/公网等）\n\n退出码：`0`=就绪　`1`=引擎未找到　`2`=依赖缺失可修复\n\n编排器脚本内置路径回退（`Path(__file__).parents[1]`），即使环境变量未设置，只要找到脚本就能正常运行。\n\n---\n\n## 三轮交互协议\n\n### 第 1 轮：需求确认\n\n**目标**：理解用户意图，确认关键参数，引导进入代码生成轮。\n\n1. **解析需求**：提取标的、周期、信号（仓位/风控缺失时使用默认并说明）\n2. **做数据能力检查**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/data_capability_guard.py\" \\\n  --requirement \"{用户原始需求}\"\n```\n3. **确认并引导**：回复至少包含：\n   - 已理解的参数摘要（标的/周期/信号/方向）\n   - 若 `data_capability_guard` 输出含 `token_hint`（非空字符串），**必须**在确认摘要之后、引导词之前如实告知用户。这表示检测到 Portfolio 策略 +（未传 Token 将回退共享试用 Token / 正在使用共享试用 Token）的组合，数据调用量大可能触发频率限制。直接呈现 `token_hint` 内容即可，不要包装为广告\n   - 明确引导用户触发下一轮：\n\n```\n需求已确认：{标的} / {模式cta或portfolio} / {日线/分钟线} / {做多/做空} / {回测区间或\"引擎默认最近1年\"}\n{若有token_hint则在此呈现，无则省略此行}\n请回复「开始生成」，我来为你生成策略代码并提交回测。\n```\n\n**第 1 轮禁止**：不做代码生成、不调用 submit、不创建文件。\n**第 1 轮最多命令**：`data_capability_guard.py`（1条）。\n\n### 第 2 轮：代码生成 + 提交（极速流程）\n\n**触发**：第 1 轮确认后，用户发送任意消息（`开始生成`/`好`/`1` 等）；若同条消息同时包含完整需求+第2轮触发词，也可直通第2轮。\n\n**直通首响（强制）**：直通第2轮时先立即回复一句 `已收到，开始生成中...`，再执行代码生成与提交，避免长时间无反馈。\n\n**第 2 轮速度约束（强制）**：\n- **禁止**重跑 `data_capability_guard`（第 1 轮已检查）\n- **禁止**单独跑 `py_compile`（submit 内部已含编译+静态检查+冒烟测试）\n- 理想路径 **2 次工具调用**：① 写策略文件 ② submit\n- submit **同步等待预检**（compile→lint→dryrun，通常 10~60 秒）再返回结果：\n  - 预检通过 → 返回 `status: \"accepted\"` + `monitor_url`（回测已在后台运行）\n  - 预检失败 → 返回 `status: \"lint_error\"/\"compile_error\"/\"dryrun_error\"` + `error` + `strategy_file`（**不返回 monitor_url**）\n- 预检失败时 **在 Round 2 内立即修复**：\n  1. **先告知用户**当前情况（如\"检测到 import 路径错误，正在自动修复...\"），保持透明\n  2. 读 `error` + `strategy_file` → 修复代码 → 重新 submit\n  3. 最多 **6 轮**修复重试，超过交由用户决策\n- submit 返回 `accepted` 后若回测运行时/超时/数据失败 → 已有 `monitor_url`，在第 3 轮处理\n\n1. **生成策略代码**（agent 使用 LLM 能力，直接写入文件）：\n   - 根据 `parsed[\"mode\"]` 选择正确模板：\n     - `cta` → 继承 `CtaTemplate`，`on_bar(self, bar)`，`self.buy(price, vol)` / `self.sell(price, vol)`，`self.pos`，初始化用 `self.load_bar(N)`（**单数**，N=bar 数量）\n     - `portfolio` → 继承 `StrategyTemplate`（vnpy_portfoliostrategy），`on_bars(self, bars: dict)`，`self.buy(vt_symbol, price, vol)` / `self.sell(vt_symbol, price, vol)`，`self.get_pos(vt_symbol)`，初始化用 `self.load_bars(days)`（**复数**，days=天数）\n   - **严禁混用**：CTA 策略禁止用 `load_bars`，Portfolio 策略禁止用 `load_bar`\n   - **仓位计算（强制——用户未指定时默认全仓）**：\n     - 用户明确说了手数/股数/仓位比例 → 按用户要求\n     - 用户未提仓位 → **默认全仓**（用 `self.available_cash` 动态计算最大可买手数）\n     - **绝对禁止** `fixed_size = 100` 或任何硬编码固定股数作为默认仓位（这是 vnpy 教程示例值，不是真实交易逻辑）\n     - CTA 全仓计算参考：\n       ```python\n       vol = int(self.available_cash / (bar.close_price * 1.0003)) // 100 * 100  # 主板100股整数倍\n       if vol >= 100:\n           self.buy(bar.close_price, vol)\n       ```\n     - Portfolio 等权全仓参考：\n       ```python\n       per_capital = self.available_cash / max(len(target_symbols), 1)\n       vol = int(per_capital / (bar.close_price * 1.0003)) // 100 * 100\n       if vol >= 100:\n           self.buy(vt_symbol, bar.close_price, vol)\n       ```\n     - 引擎会自动管理资金扣减/回款，并在资金不足时自动调减到可买最大手数\n   - **账户属性（引擎自动注入，策略直接用）**：\n     - `self.available_cash` — 可用现金（买入扣减，卖出回款）\n     - `self.total_value` — 账户总值（现金+持仓市值）\n     - `self.closable_pos` — CTA可卖数量（T+1 自动扣减当日买入）\n     - `self.closable_positions` — Portfolio per-symbol可卖量dict（`self.closable_positions.get(vt_symbol, 0)`）\n     - `self.capital` — 等于 available_cash（兼容）\n     - `self.trade_calendar` — 交易日历（set of \"YYYYMMDD\"），可用 `date_str in self.trade_calendar` 判断交易日\n     - `self.last_order_status` — 最近一次下单结果（`{\"ok\":True/False,\"reason\":\"...\",\"symbol\":\"...\"}`）\n     - `self.order_reject_log` — 最近200条被拒订单记录（停牌/涨跌停/资金不足等）\n   - **资金不足兜底**：引擎会自动调减买入量到可用现金能买的最大手数，无需策略手动检查\n   - **停牌/涨跌停兜底**：引擎自动拦截停牌日下单和触及涨跌停价格的委托，返回空列表。**策略判断下单是否成功应优先检查 `buy()/sell()` 返回值**（空列表=被拒），而非假设一定成功\n   - **交易所合规（强制）**：沪深主板/创业板 100 股整数倍，科创板(688xxx) 200 股起步+1 股递增（205 股合法）\n   - **ArrayManager API**：均线用 `am.sma()`，禁止用 `am.ma()`（vnpy 不存在此方法）\n   - **CTA 必须在 `on_bar` 开头调用 `am.update_bar(bar)`**：否则 ArrayManager 永远不会 `inited`，导致全程 0 交易。引擎有运行时兜底但不能依赖\n   - 写入 `${QUANTCLAW_ROOT}/strategies/{module_name}.py`\n\n**Portfolio 轮动策略速查**（减少生成思考时间）：\n- 周轮动：`on_bars(self, bars)` 中 `list(bars.values())[0].datetime.weekday()==0` 判断周一调仓\n- 排序选股：遍历 `self.vt_symbols` 计算因子 → `sorted()` → 取前N名\n- 等权全仓：每只 `self.available_cash / N`，按交易所规则取整手\n- 周线数据：`pro.weekly(ts_code=code, start_date=..., end_date=...)` 直取，无需从日线合成\n\n2. **直接提交**（submit 内置编译+静态检查+预导入，无需单独 py_compile）：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" submit \\\n  --requirement \"{用户原始需求}\" \\\n  --strategy-file \"${QUANTCLAW_ROOT}/strategies/{module_name}.py\" \\\n  --strategy-module \"{module_name}\" \\\n  --strategy-class \"{class_name}\" \\\n  --symbols \"{策略中所有vt_symbol逗号分隔}\" \\\n  --monitor-public-base \"${MONITOR_PUBLIC_BASE:-}\" \\\n  --monitor-port-candidates \"${ORCH_MONITOR_PORT_CANDIDATES:-8767}\" \\\n  --timeout-sec 1200\n```\n   - submit 内部同步执行预检：py_compile → _lint_strategy → _preflight_import → dryrun\n   - 预检通过后自动启动回测，返回 `status: \"accepted\"` + `monitor_url`\n   - 预检失败返回 `status: \"<error_type>\"` + `error` + `strategy_file`，**不启动回测、不返回 monitor_url**\n   - agent 判断 submit 输出：\n     - `status == \"accepted\"` → 进入步骤 3（回复用户）\n     - `status` 为 `compile_error`/`lint_error`/`dryrun_error` → **先输出一句话告知用户**（如\"检测到 xxx 错误，正在修复第 N/6 次...\"）→ 读 error + strategy_file → 修复代码 → 重新 submit（最多 6 轮）\n     - 6 轮后仍失败 → 将最后一次错误信息告知用户，交由用户决策\n\n3. **回复用户**（仅在 submit 返回 `accepted` 后）：\n   - `run_id` + `monitor_url` + 当前状态\n   - 引导词（必须覆盖两个语义点）：\n     - A：打开监控页实时查看策略代码/曲线/交易\n     - B：完成后发送「查看结果」获取摘要与报告链接\n\n### 第 3 轮：查看结果 / 诊断修复\n\n**触发词**：`查看结果`、`结果`、`status`、`重新生成`\n\n1. **查询状态**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" status --run-id \"{run_id}\"\n```\n\n2. **根据状态分流**：\n\n| status | 处理 |\n|--------|------|\n| `running` | 告知当前进度，提示继续等待 |\n| `completed` | 输出摘要 + 强制输出 `report_url`，不用 `monitor_url` 表述完整报告 |\n| `failed` | 根据 `last_error.error_type` 分流处理（见下方错误分流表） |\n\n3. **错误分流（agent 决策表）**：\n\n| error_type | 含义 | agent 策略 |\n|-----------|------|-----------:|\n| `compile_error` | py_compile 失败 | 读 strategy_file + traceback → LLM 修复代码 → 重新提交 |\n| `lint_error` | 静态检查 blocker（如 am.ma()、vnpy.trading 导入） | 同 compile_error 处理 |\n| `dryrun_error` | 冒烟测试失败（50根K线采样回放运行时异常） | 同 compile_error 处理：读 strategy_file + traceback → LLM 修复 → 重新提交 |\n| `runtime_error` | 回测运行时异常 | 读 strategy_file + traceback → LLM 分析修复 → 重新提交 |\n| `compat_error` | 引擎兼容性（如 portfolio+WEEKLY 未降级） | 提示用户调整参数，通常不应出现（parse_requirement 已自动降级） |\n| `data_error` | 数据加载失败/为空 | 提示用户检查标的代码/日期范围/token |\n| `config_error` | 环境/配置问题 | 提示用户检查配置 |\n| `timeout_error` | 超时 | 建议缩短日期范围或标的数量 |\n\n- 只对 `compile_error`、`lint_error`、`dryrun_error` 和 `runtime_error` 尝试自动修复，其余直接报告用户。\n- Round 2 预检失败（compile/lint/dryrun）自动修复最多 **6 轮**；Round 3 运行时修复最多 **3 轮**。超过交由用户决策。\n\n3.5 **结果校验告警（status=completed 时优先检查）**：\n\n`status` 输出中若包含 `result_warnings` 字段（非空列表），说明回测结果校验发现语义异常：\n- 读 `result_warnings` + `strategy_file` → LLM 分析是否为策略 bug\n  - 若判断为 bug → 修复策略代码 → 重新提交\n  - 若判断为正常行为（如趋势策略在熊市期间无反向信号）→ 照常输出结果，附带告警说明\n\n常见告警类型：零交易、单边信号（有买无卖/有卖无买）、胜率极端值（100%/0%）。\n\n4. **完成后引导**（status=completed 时必须附带）：\n\n```\n回测已完成，{摘要}。您可以：\n1. 回复「优化参数」对策略参数进行网格搜索\n2. 回复「模拟交易」在 QMT 中启动自动交易（需 Windows + QMT 环境）\n```\n\n---\n\n## 参数优化流程（回测完成后由用户触发）\n\n**触发词**：`优化`、`调参`、`参数优化`、`网格搜索`\n\n**前提**：已完成至少一次回测（数据已缓存在数据库中）。\n\n1. **确认优化方案**：agent 分析当前策略的可调参数，向用户确认：\n   - 优化目标（默认 `sharpe_ratio`，可选 `total_return`/`annual_return`/`max_ddpercent`）\n   - 参数范围（`[起始, 终止, 步长]`）\n   - 预估组合数\n\n2. **执行优化**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" optimize \\\n  --strategy-file \"${QUANTCLAW_ROOT}/strategies/{module_name}.py\" \\\n  --strategy-class \"{class_name}\" \\\n  --symbols \"{vt_symbol}\" \\\n  --start \"{YYYYMMDD}\" --end \"{YYYYMMDD}\" \\\n  --optimize-params '{\"target\":\"sharpe_ratio\",\"params\":{\"fast_window\":[5,30,5],\"slow_window\":[10,60,10]}}'\n```\n\n支持 `\"algorithm\":\"ga\"` 使用遗传算法（大参数空间时推荐）。\n\n3. **展示结果**：输出 JSON 含 `best`（最优参数+指标）和 `results`（Top N），agent 以表格形式呈现。\n\n4. **后续选择**：用户可选择用最优参数重新回测验证，或继续调整参数范围。\n\n---\n\n## 绝对禁止清单（违反任何一条 = 严重事故）\n\n### 链路禁止\n- **禁止**在项目目录或工作目录下创建 `.html` 报告文件\n- **禁止**读取、搜索、引用 `reports/` 目录下的历史文件\n- **禁止**直接调用 `backtest_runner.py`、`monitor_server.py`、`/api/code`\n- **禁止**使用 `python -m http.server` 或任何临时 HTTP 服务\n- **禁止**生成临时回测脚本或手工拼接回测执行流程\n- **禁止**在 submit 之前检查\"策略是否已存在\"\n- **禁止**在编排器找不到时降级为手动脚本、akshare/yfinance 临时方案、或任何非编排器回测方式\n\n### 输出禁止\n- **禁止**寒暄/自我介绍/营销文案\n- **禁止**承诺\"完成后自动推送摘要\"或\"跨轮次自动再回复\"\n- **禁止**使用\"模拟数据演示\"口径替代真实回测\n- **禁止**硬编码市场数据\n- **禁止**繁琐状态输出 `[run_id][N/M][状态]`\n- **禁止**发了\"请确认\"却自动继续\n- **禁止**前台启动长驻进程\n\n### 安全禁止\n- **禁止**硬编码绝对路径（统一使用 `QUANTCLAW_ROOT`）\n- **禁止**在 SKILL 或脚本中提交明文凭据\n- **禁止**策略文件路径指向 `strategies/` 目录之外\n\nFile v1.0.2:QMT-TradingClaw/vnpy_qmt/README.md\n\n# VeighNa框架的QMT数据服务与交易接口\r\n\r\n<p align=\"center\">\r\n  <img src =\"https://vnpy.oss-cn-shanghai.aliyuncs.com/vnpy-logo.png\"/>\r\n</p>\r\n\r\n<p align=\"center\">\r\n    <img src =\"https://img.shields.io/badge/version-2.0.0-blueviolet.svg\"/>\r\n    <img src =\"https://img.shields.io/badge/platform-windows|linux-yellow.svg\"/>\r\n    <img src =\"https://img.shields.io/badge/python-3.10|3.11|3.12-blue.svg\" />\r\n    <img src =\"https://img.shields.io/github/license/vnpy/vnpy.svg?color=orange\"/>\r\n</p>\r\n\r\n## 说明\r\n\r\n基于迅投XtQuant和qgdata封装开发的数据服务与交易接口，提供双数据源支持：\r\n\r\n* **qgdata数据源（回测首选）**：A股日线/分钟线/周线行情，跨平台支持\r\n* **迅投研(XT)数据源**：实时行情、Tick数据、期货/期权市场，Windows平台\r\n\r\n支持以下中国金融市场：\r\n\r\n* 股票、基金、债券、ETF期权：\r\n  * SSE：上海证券交易所\r\n  * SZSE：深圳证券交易所\r\n  * BSE：北京证券交易所\r\n* 期货、期货期权（仅XT数据源）：\r\n  * CFFEX：中国金融期货交易所\r\n  * SHFE：上海期货交易所\r\n  * DCE：大连商品交易所\r\n  * CZCE：郑州商品交易所\r\n  * INE：上海国际能源交易中心\r\n  * GFEX：广州期货交易所\r\n\r\n\r\n## 安装\r\n\r\n安装环境推荐基于3.9.0版本以上的【[**VeighNa Studio**](https://www.vnpy.com/)】。\r\n\r\n直接使用pip命令：\r\n\r\n```\r\npip install vnpy_xt qgdata\r\n```\r\n\r\n完成基础安装后，克隆本项目代码并替换官方文件：\r\n```bash\r\ngit clone https://gitee.com/GuojinQuant/vnpy_qmt.git\r\n\r\n# 将 vnpy_qmt/vnpy_xt/ 目录内文件覆盖至官方安装路径：\r\n#   Linux/Mac: /usr/local/lib/python3.x/site-packages/vnpy_xt/\r\n#   Windows:   %PYTHON_HOME%\\Lib\\site-packages\\vnpy_xt\\\r\n#   提示：可通过 pip show vnpy_xt 查询确切安装路径\r\n```\r\n\r\n## 使用\r\n\r\n### qgdata数据源连接（回测首选）\r\n\r\nqgdata为回测默认数据源，支持A股日线、分钟线、周线行情查询，无需启动本地客户端，跨平台可用。\r\n\r\n1. 安装qgdata：`pip install qgdata`\r\n2. 获取token：访问 [**quantgo.ai/data**](https://quantgo.ai/data) 注册获取数据服务token\r\n3. 在VeighNa Trader的【全局配置】处进行数据服务配置：\r\n    * datafeed.name：qg\r\n    * datafeed.username：留空\r\n    * datafeed.password：填写您的qgdata token（请勿将token提交到版本控制）\r\n4. 支持的数据周期：1分钟(MINUTE)、1小时(HOUR)、日线(DAILY)、周线(WEEKLY)\r\n5. 支持的市场：**仅A股** — 上交所(SSE)、深交所(SZSE)、北交所(BSE)\r\n6. 注意事项：\r\n    * qgdata暂不支持Tick数据，如需Tick请切换至迅投研(XT)数据源\r\n    * 期货/期权市场（CFFEX/SHFE/DCE/CZCE/INE/GFEX）不在qgdata覆盖范围，请使用迅投研(XT)数据源\r\n\r\n若需切换数据源，修改 `vnpy_xt/__init__.py` 中的导入：\r\n```python\r\n# 切换为迅投研数据源\r\nfrom .xt_datafeed import XtDatafeed as Datafeed\r\n# 切换为qgdata数据源（默认）\r\n# from .qg_datafeed import QgDatafeed as Datafeed\r\n```\r\n\r\n### 迅投研(XT)数据源连接\r\n\r\n**Token连接**\r\n\r\n- 请使用官方版本\r\n\r\n**客户端连接**\r\n\r\n- 请使用官方版本\r\n\r\n**券商miniQMT连接**\r\n\r\n1. 连接请先登录迅投极速交易终端，同时确保xtquant模块可以正常加载（点击【下载Python库】-【Python库下载】，下载完成后拷贝\"Python库路径\"下Lib\\site-packages文件夹中的xtquant包到自己使用的Python环境的site_packages文件夹下）。\r\n2. 在VeighNa Trader的【全局配置】处进行数据服务配置：\r\n    * datafeed.name：xt\r\n    * datafeed.username：client\r\n    * datafeed.password：留空\r\n3. 连接XT中配置：\r\n    * token：留空\r\n    * QMT路径：C:\\国金QMT交易端模拟\r\n    * 资金账户：填写您在券商开户的资金账号\r\n4. 请注意以客户端方式连接时，需要保持迅投客户端的运行。\r\n\r\n## OpenClaw 回测报告公网持久化（新增）\r\n\r\n在 `pipeline_orchestrator.py submit` 中，除短时 `monitor_url` 外，现可同时产出长期 `report_url`（静态报告）。\r\n\r\n### 环境变量\r\n\r\n- `MONITOR_PUBLIC_BASE`：短时监控页公网基址（可选，优先级最高）\r\n- `OPENCLAW_CONTROL_URL`：OpenClaw 会话入口地址（可选；当 `MONITOR_PUBLIC_BASE` 为空时，系统会自动从该地址推导监控公网基址）\r\n- `REPORT_PUBLIC_BASE`：长期静态报告公网基址（例如 `http://8.211.147.124/reports`）\r\n- `REPORT_PUBLIC_DIR`：静态报告落盘目录（默认 `backtests/public_reports`，需由 Nginx/Caddy 映射到 `REPORT_PUBLIC_BASE`）\r\n\r\n推荐做法（开源友好）：\r\n\r\n- 不在代码里写死任何机器 IP/路径；\r\n- `cp .env.example QMT-TradingClaw/.env` 后填值即可，详见 [配置指南](https://gitee.com/GuojinQuant/quant-claw#第四步配置环境变量)；\r\n- 端口采用白名单策略（默认 `8767`），公网不可达时 submit 立即失败，不会\"白跑\"；\r\n- 一键诊断: `python3 backtests/pipeline_orchestrator.py config-doctor`。\r\n\r\n### 产出文件\r\n\r\n每次 run 结束后会发布（按 run_id 重命名）：\r\n\r\n- `{run_id}.html`：交互报告\r\n- `{run_id}_replay.html`：回放报告\r\n- `{run_id}_summary.json`：指标摘要\r\n- `{run_id}.png`：静态图（若生成）\r\n\r\n### 返回字段\r\n\r\n`submit` 返回和 `state.json` 中会包含：\r\n\r\n- `monitor_url`：短时监控链接\r\n- `report_url`：长期静态报告链接\r\n- `report_replay_url`：长期回放链接\r\n- `report_summary_url`：长期摘要链接\r\n\r\n---\r\n\r\n## OpenClaw量化策略助手\r\n\r\n本项目集成了OpenClaw Skill，通过**三轮交互闭环**实现：需求确认 → LLM代码生成 → 自动回测 → 结果诊断/修复。\r\n\r\n### 三轮交互协议\r\n\r\n| 轮次 | 触发 | 说明 |\r\n|------|------|------|\r\n| 第1轮：需求确认 | 用户描述回测需求 | 解析标的/周期/信号，确认参数，引导回复「开始生成」 |\r\n| 第2轮：代码生成+提交 | 用户回复「开始生成」 | LLM生成策略代码 → py_compile校验（最多3轮修复） → submit提交 → 返回monitor_url |\r\n| 第3轮：查看结果 | 用户回复「查看结果」 | 成功→摘要+report_url / 失败→按error_type分流修复 |\r\n\r\n### 外部策略文件支持（Shift-Left模式）\r\n\r\n`pipeline_orchestrator.py submit` 新增参数：\r\n\r\n```bash\r\n--strategy-file  \"strategies/my_strategy.py\"  # 预生成的策略文件（必须在strategies/目录内）\r\n--strategy-module \"my_strategy\"                # 模块名（默认从文件名推导）\r\n--strategy-class  \"MyStrategy\"                 # 类名（默认从文件自动检测）\r\n```\r\n\r\n- 策略文件路径安全校验：只允许 `strategies/` 目录内的 `.py` 文件\r\n- Worker启动时自动将策略文件快照到 `run_dir/strategy_snapshot.py`，保证复现性\r\n\r\n### 结构化错误报告\r\n\r\nWorker失败时保存结构化error到 `state.json`：\r\n\r\n| error_type | 含义 | Agent策略 |\r\n|-----------|------|----------|\r\n| `compile_error` | 编译失败 | 读代码+traceback → LLM修复 |\r\n| `runtime_error` | 运行时异常 | 读代码+traceback → LLM分析 |\r\n| `data_error` | 数据缺失/为空 | 提示检查标的/日期/token |\r\n| `config_error` | 配置问题 | 提示检查配置 |\r\n| `timeout_error` | 超时 | 建议缩短日期范围 |\r\n\r\n失败时也会生成最小 report HTML，确保 `report_url` 始终有内容。\r\n\r\n### 监控页错误面板\r\n\r\n运行时失败会在监控页顶部弹出醒目错误卡片，包含：错误类型、错误消息、可展开的堆栈详情、引导用户回对话页处理。\r\n\r\n### 执行协议\r\n\r\n- **防重入**：通过`backtests/.run_lock`锁文件防止重复执行\r\n- **幂等重试**：自动修复最多3轮，超限交由用户决策\r\n- **失败快照**：结构化错误含error_type/traceback/step\r\n\r\n### 实盘风控熔断\r\n\r\n无需二次确认下单，但以下阈值强制生效：\r\n\r\n| 阈值 | 默认值 | 触发动作 |\r\n|------|--------|---------|\r\n| 单笔最大金额 | 总资金20% | 拒绝下单 |\r\n| 单日最大亏损 | 总资金5% | 自动停止策略 |\r\n| 单日最大交易次数 | 50次 | 停止下单 |\r\n| 连续亏损次数 | 5次 | 暂停策略 |\r\n| 异常价格偏离 | 涨跌停价外 | 拒绝下单 |\r\n\r\n可通过 `backtests/risk_config.json` 自定义阈值覆盖默认值。\r\n\r\n### 回测执行 + 实时监控\r\n\r\n回测使用通用执行器，支持实时监控页面：\r\n\r\n```powershell\r\n# 前台执行（等待完成）\r\npy backtests\\backtest_runner.py --strategy 模块名 --class 类名 --symbols \"标的\" --mode cta|portfolio\r\n\r\n# 后台执行 + 实时监控页（推荐，立即返回监控链接）\r\nStart-Process py -ArgumentList \"backtests\\backtest_runner.py --strategy 模块名 --class 类名 --symbols 标的 --mode cta --monitor-port 8765 --run-id 自定义ID\" -RedirectStandardOutput \"backtests\\run.log\" -NoNewWindow\r\n# 浏览器打开 http://127.0.0.1:8765/runs/自定义ID 即可看到：\r\n#   - 实时进度条\r\n#   - 每10根K线更新的估算净值曲线（CTA模式）\r\n#   - 完成后自动替换为精确净值+沪深300基准\r\n#   - 统计指标卡片 + 日志流\r\n```\r\n\r\n执行器内置：防重入锁、token预检、本地缓存优先、monitor自动启停、HTML+PNG曲线（含沪深300基准）、摘要JSON。\r\n\r\n### 文件结构\r\n\r\n```\r\nd:\\AGIclass\\QMT-TradingClaw\\\r\n├── vnpy_qmt/               # vnpy_qmt源码\r\n├── strategies/              # 生成的策略文件\r\n├── backtests/               # 回测结果(PNG/HTML)\r\n│   ├── backtest_runner.py   # 通用回测执行器（含monitor集成）\r\n│   ├── monitor_server.py    # 实时监控HTTP服务（SSE推送+ECharts页面）\r\n│   ├── .run_lock            # 防重入锁（运行时自动生成/清除）\r\n│   └── risk_config.json     # 实盘风控阈值（可选自定义）\r\n└── README.md                # 本文档\r\n```\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn73ayd2pc6dgzpyqhpanbgax58244zz\",\n  \"slug\": \"quant-strategy-assistant\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1776334984566\n}\n\nFile v1.0.2:references/apis/adj_factor.md\n\n# `adj_factor` 接口文档\n\n## 接口说明\n\n- 中文说明：复权因子\n- 动态方法：`pro.adj_factor(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ts_code`, `trade_date`, `adj_factor`\n\n## 调用示例\n\n```python\ndf = pro.adj_factor(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ts_code,trade_date,adj_factor\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.2:references/apis/anns_d.md\n\n# `anns_d` 接口文档\n\n## 接口说明\n\n- 中文说明：上市公司全量公告\n- 动态方法：`pro.anns_d(...)`\n- 默认时间字段：无\n- 典型过滤参数：`ann_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ann_date`, `ts_code`, `name`, `title`, `url`, `rec_time`\n\n## 调用示例\n\n```python\ndf = pro.anns_d(\n    ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ann_date,ts_code,name,title,url,rec_time\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\n## 备注\n\n该接口当前未启用，原因：抱歉，您没有接口访问权限。\n\nFile v1.0.2:references/apis/bak_basic.md\n\n# `bak_basic` 接口文档\n\n## 接口说明\n\n- 中文说明：股票历史列表\n- 动态方法：`pro.bak_basic(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`, `start_date`(必填), `end_date`\n- 主要字段：`trade_date`, `ts_code`, `name`, `industry`, `area`, `pe`, `float_share`, `total_share`\n\n## 调用示例\n\n```python\ndf = pro.bak_basic(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"trade_date,ts_code,name,industry,area,pe,float_share,total_share\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.2:references/apis/balancesheet.md\n\n# `balancesheet` 接口文档\n\n## 接口说明\n\n- 中文说明：资产负债表\n- 动态方法：`pro.balancesheet_vip(...)`\n- 默认时间字段：`ann_date`\n- 典型过滤参数：`ann_date`, `start_date`(必填), `end_date`, `period`, `report_type`, `comp_type`\n- 主要字段：`ts_code`, `ann_date`, `f_ann_date`, `end_date`, `report_type`, `comp_type`, `end_type`, `total_share`\n\n## 调用示例\n\n```python\ndf = pro.balancesheet_vip(\n    ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    period=\"\",\n    report_type=\"\",\n    comp_type=\"\",\n    fields=\"ts_code,ann_date,f_ann_date,end_date,report_type,comp_type,end_type,total_share\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.2:references/apis/block_trade.md\n\n# `block_trade` 接口文档\n\n## 接口说明\n\n- 中文说明：大宗交易\n- 动态方法：`pro.block_trade(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：无\n- 主要字段：`ts_code`, `trade_date`, `price`, `vol`, `amount`, `buyer`, `seller`\n\n## 调用示例\n\n```python\ndf = pro.block_trade(\n    fields=\"ts_code,trade_date,price,vol,amount,buyer,seller\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.2:references/apis/broker_recommend.md\n\n# `broker_recommend` 接口文档\n\n## 接口说明\n\n- 中文说明：券商月度金股\n- 动态方法：`pro.broker_recommend(...)`\n- 默认时间字段：`month`\n- 典型过滤参数：`month`(必填), `start_date`(必填), `end_date`\n- 主要字段：`month`, `broker`, `ts_code`, `name`\n\n## 调用示例\n\n```python\ndf = pro.broker_recommend(\n    month=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"month,broker,ts_code,name\",\n    order_by=\"month\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.2:references/apis/bse_mapping.md\n\n# `bse_mapping` 接口文档\n\n## 接口说明\n\n- 中文说明：北交所新旧代码对照表\n- 动态方法：`pro.bse_mapping(...)`\n- 默认时间字段：`list_date`\n- 典型过滤参数：`o_code`, `n_code`\n- 主要字段：`name`, `o_code`, `n_code`, `list_date`\n\n## 调用示例\n\n```python\ndf = pro.bse_mapping(\n    o_code=\"\",\n    n_code=\"\",\n    fields=\"name,o_code,n_code,list_date\",\n    order_by=\"list_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.2:references/apis/cashflow.md\n\n# `cashflow` 接口文档\n\n## 接口说明\n\n- 中文说明：现金流量表\n- 动态方法：`pro.cashflow_vip(...)`\n- 默认时间字段：`ann_date`\n- 典型过滤参数：`ann_date`, `f_ann_date`, `start_date`(必填), `end_date`, `period`, `report_type`, `comp_type`, `is_calc`\n- 主要字段：`ts_code`, `ann_date`, `f_ann_date`, `end_date`, `comp_type`, `report_type`, `end_type`, `net_profit`\n\n## 调用示例\n\n```python\ndf = pro.cashflow_vip(\n    ann_date=\"\",\n    f_ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    period=\"\",\n    report_type=\"\",\n    comp_type=\"\",\n    is_calc=\"\",\n    fields=\"ts_code,ann_date,f_ann_date,end_date,comp_type,report_type,end_type,net_profit\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.2:references/apis/ccass_hold_detail.md\n\n# `ccass_hold_detail` 接口文档\n\n## 接口说明\n\n- 中文说明：中央结算系统持股明细\n- 动态方法：`pro.ccass_hold_detail(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：无\n- 主要字段：`trade_date`, `ts_code`, `name`, `col_participant_id`, `col_participant_name`, `col_shareholding`, `col_shareholding_percent`\n\n## 调用示例\n\n```python\ndf = pro.ccass_hold_detail(\n    fields=\"trade_date,ts_code,name,col_participant_id,col_participant_name,col_shareholding,col_shareholding_percent\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\n## 备注\n\n- 该接口为分表查询，必须同时传 `freq` 与 `ts_code`\n- 建议始终传 `start_date/end_date` 控制查询范围\n- 当时间字段为 `trade_time` 时，服务端会自动补齐交易时段边界\n\nArchive v1.0.1: 160 files, 102552 bytes\n\nFiles: qgdata-reference.md (9358b), references/apis/adj_factor.md (496b), references/apis/anns_d.md (600b), references/apis/bak_basic.md (576b), references/apis/balancesheet.md (703b), references/apis/block_trade.md (443b), references/apis/broker_recommend.md (495b), references/apis/bse_mapping.md (455b), references/apis/cashflow.md (749b), references/apis/ccass_hold_detail.md (813b), references/apis/ccass_hold.md (579b), references/apis/cctv_news.md (447b), references/apis/ci_daily.md (571b), references/apis/cn_cpi.md (460b), references/apis/cn_gdp.md (410b), references/apis/cn_m.md (402b), references/apis/cn_pmi.md (485b), references/apis/cn_ppi.md (519b), references/apis/cyq_chips.md (722b), references/apis/cyq_perf.md (506b), references/apis/daily_basic.md (637b), references/apis/daily_info.md (623b), references/apis/daily.md (575b), references/apis/dc_daily.md (595b), references/apis/dc_hot.md (599b), references/apis/dc_index.md (611b), references/apis/dc_member.md (485b), references/apis/disclosure_date.md (667b), references/apis/dividend.md (707b), references/apis/etf_basic.md (487b), references/apis/etf_index.md (503b), references/apis/etf_share_size.md (606b), references/apis/etf_stk_mins.md (801b), references/apis/express.md (627b), references/apis/fina_audit.md (619b), references/apis/fina_indicator.md (648b), references/apis/fina_mainbz.md (609b), references/apis/forecast.md (657b), references/apis/fund_adj.md (496b), references/apis/fund_basic.md (469b), references/apis/fund_company.md (453b), references/apis/fund_daily.md (566b), references/apis/fund_div.md (579b), references/apis/fund_factor_pro.md (586b), references/apis/fund_manager.md (571b), references/apis/fund_nav.md (579b), references/apis/fund_portfolio.md (585b), references/apis/fund_share.md (490b), references/apis/ggt_daily.md (587b), references/apis/ggt_monthly.md (639b), references/apis/ggt_top10.md (648b), references/apis/gz_index.md (586b), references/apis/hibor.md (505b), references/apis/hk_adjfactor.md (537b), references/apis/hk_basic.md (449b), references/apis/hk_daily_adj.md (563b), references/apis/hk_daily.md (545b), references/apis/hk_hold.md (550b), references/apis/hk_mins.md (870b), references/apis/hk_tradecal.md (448b), references/apis/hm_detail.md (608b), references/apis/hm_list.md (339b), references/apis/hsgt_top10.md (650b), references/apis/idx_factor_pro.md (739b), references/apis/idx_mins.md (794b), references/apis/income.md (708b), references/apis/index_basic.md (518b), references/apis/index_classify.md (444b), references/apis/index_daily.md (566b), references/apis/index_dailybasic.md (611b), references/apis/index_global.md (575b), references/apis/index_member_all.md (521b), references/apis/index_monthly.md (605b), references/apis/index_weekly.md (569b), references/apis/index_weight.md (555b), references/apis/irm_qa_sh.md (598b), references/apis/irm_qa_sz.md (621b), references/apis/kpl_concept_cons.md (585b), references/apis/kpl_list.md (590b), references/apis/libor.md (605b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: quant-strategy-assistant\ndescription: \"量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。\"\nmetadata:\n  requires:\n    bins: [\"python3\"]\n  openclaw:\n    requires:\n      bins: [\"python3\"]\n---\n\n# 量化策略助手\n\n> **兼容说明**：本文档既是 OpenClaw Skill，也可作为任意 AI Agent 的操作手册。只要 Agent 能读取文件、执行命令、生成代码，即可按下方协议使用。YAML 头部的 `metadata.openclaw` 为 OpenClaw 平台专用字段，其他 Agent 忽略即可。\n\n回测三轮交互闭环 → 用户按需选择参数优化 / 模拟实盘。\n\n## 能力分层\n\n| 能力 | 引擎 | 依赖 | 说明 |\n|------|------|------|------|\n| **CTA回测** | vnpy_ctastrategy | python3 + qgdata | 单标的择时策略，任意平台 |\n| **Portfolio回测** | vnpy_portfoliostrategy | python3 + qgdata | 多标的组合/轮动策略，任意平台 |\n| **参数优化** | vnpy OptimizationSetting | 同回测 | 回测后由用户触发，穷举/遗传算法 |\n| **模拟/实盘** | miniQMT + vnpy CTA引擎 | QMT 交易端 | `qmt-check` 检测 → `trade` 启动自动交易，含探针单验证 |\n\n回测是核心能力，不依赖 QMT。用户请求模拟/实盘时才运行 `qmt-check`。\n\n### CTA vs Portfolio 自动路由（强制）\n\n| 条件 | 模式 | 策略基类 |\n|------|------|----------|\n| 单一标的 + 无组合关键词 | `cta` | `CtaTemplate` |\n| 以下任一条件满足 | `portfolio` | `StrategyTemplate`（vnpy_portfoliostrategy） |\n\n**portfolio 判定规则（分层，LLM 和 `parse_requirement()` 均遵循）**：\n1. **强信号**（任一出现即 portfolio）：`轮动/组合/多标的/全市场/等权/仓位分配/前N名`\n2. **弱信号 + 多标的上下文**（二者共现才 portfolio）：弱信号 `排序/筛选/选股/调仓/排列/持仓周期` 需同时存在多标的上下文（`板块/成分股/指数/行业/概念/股票池`）\n3. **标的数量 > 1**：`--symbols` 含 2 只以上自动 portfolio\n\n注意：\"多头排列\"中的\"排列\"、\"均线排序\"在单标的场景不触发 portfolio。\n\n路由由 `parse_requirement()` 自动判定并写入 `parsed[\"mode\"]`，agent 生成策略代码时必须使用对应基类。\n\n**Portfolio 引擎驱动约束**：Portfolio 回测引擎仅支持 DAILY 和分钟级驱动。周级策略用 `--interval DAILY`，在 `on_bars(bars)` 中按 `list(bars.values())[0].datetime.weekday()==0`（周一）判断调仓日；周线指标直接用 `pro.weekly()` 获取，无需从日线合成。\n\n**股票池所有权契约（强制）**：股票池由 `--symbols` 参数唯一定义 → 引擎加载数据 → 策略通过 `self.vt_symbols` 接收。策略代码 `__init__` 中**禁止覆盖 `vt_symbols`**，必须使用引擎传入的列表。所有标的代码使用 vnpy 格式（`600519.SSE`/`000858.SZSE`），不可使用 qgdata 格式（`.SH/.SZ`）。选股逻辑在 `on_bars(bars)` 中基于 `self.vt_symbols` 遍历和筛选。\n\n**板块/指数成分股由引擎自动解析（强制）**：用户说\"人工智能板块\"/\"沪深300成分股\"/\"银行行业\"等时，引擎会自动解析出完整成分股列表到 `--symbols`。策略代码中**禁止**自行调用 `pro.ths_member()`/`pro.ths_index()`/`pro.dc_member()` 等板块 API。\n\n**回测日期约束（强制）**：用户的回测日期意图必须由你转换为标准 `--start YYYYMMDD --end YYYYMMDD` 参数。例如用户说\"最近1年\"则根据当天日期计算 today-365 输出对应日期。用户未提及任何日期时，**不传** `--start/--end`（引擎默认最近1年，即 today-365 ~ today）。第1轮确认摘要中日期栏必须写\"引擎默认最近1年\"而非自行编造\"近2年\"等。**禁止**编造与用户意图不符的固定日期。\n\n### 模拟/实盘交易（独立流程，不走三轮协议）\n\n用户提及 `模拟`/`实盘`/`模拟交易`/`开始交易`/`QMT` 时触发。**前提：至少有一次成功的回测（status=completed）。**\n\n**第 1 步：环境检测**（自动发现 QMT 路径，无需用户手动配置路径）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" qmt-check\n```\n\n输出 JSON 含 `ready`（布尔）和 `hint`（状态说明）：\n- `platform != Windows` → 提示用户在 Windows + QMT 环境运行\n- QMT 路径自动扫描失败 → 提示确认 QMT 已安装\n- QMT 终端未运行 → 提示\"请先打开 QMT 并以极简模式登录\"\n- 缺少资金账号 → 提示通过 `--account-id` 或 `QMT_ACCOUNT_ID` 提供\n- `ready=true` → 进入第 2 步\n\n**第 2 步：启动交易**（内含自动探针验证：100股跌停价挂单→确认→撤单，可选单独跑 `probe --symbol {代码} --account-id {账号}`）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade \\\n  --run-id \"{最近成功回测的 run_id}\"\n```\n\n返回 JSON 分流：\n- `status=trading_started` → 告知用户：✅ 交易已启动，附带日志路径\n- `status=platform_redirect` → 告知用户：需在 Windows + QMT 环境运行，给出命令\n- `status=error` → 告知具体错误\n\n**第 3 步：停止交易**（用户说「停止交易」时）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade-stop --run-id \"{run_id}\"\n```\n\n仅需用户提供 **资金账号**（`--account-id` 或 `QMT_ACCOUNT_ID`）；QMT 路径自动扫描各盘符下 `userdata_mini` 目录（可通过 `QMT_PATH` 覆盖）。\n\n## 环境\n\n| 项目 | 值 |\n|------|---|\n| 项目根目录 | `QUANTCLAW_ROOT`（兼容 `QMT_PROJECT_ROOT`） |\n| vnpy_qmt源码 | `$QUANTCLAW_ROOT/vnpy_qmt` |\n| 策略输出 | `$QUANTCLAW_ROOT/strategies/` |\n| 回测输出 | `$QUANTCLAW_ROOT/backtests/` |\n| 回测数据源 | qgdata（建议预先配置 `QGDATA_TOKEN`） |\n| 实盘交易 | miniQMT (xt_gateway.py)，需 QMT 交易端已启动 |\n| Python解释器 | `PYTHON_BIN`（默认 `python3`） |\n\n回测默认参数：`capital=1000000 / rate=0.0003 / slippage=0.01 / size=1 / pricetick=0.01`\n\n配置指南: https://gitee.com/GuojinQuant/quant-claw#第四步配置环境变量 （仓库自带 `.env.example`）\n\n关键变量（优先从 `.env` / 环境变量自动推导，不需要写死）：\n- `QUANTCLAW_ROOT`：项目根目录（兼容 `QMT_PROJECT_ROOT`）\n- `MONITOR_PUBLIC_BASE`：监控公网基址（可留空；OpenClaw 环境下可由 `OPENCLAW_CONTROL_URL` 自动推导）\n- `ORCH_MONITOR_PORT_CANDIDATES`：白名单端口（默认 `8767`，必须在防火墙放通）\n- `QGDATA_TOKEN`：数据 Token（可选；未配置时自动使用内置共享试用Token，有每日额度限制）\n\n**Token 自动提取规则（强制）**：若用户对话中出现 60~70 位连续字母数字串（如\"我的token是 Mj9mN2xP...\"），自动提取并通过 `--token` 参数传给 submit 命令。日志和回复中只显示前 6 位+`***`，**绝不回显完整 Token**。提取到个人 Token 后提示用户：`已使用您的个人Token，不消耗共享试用额度`。\n\n---\n\n## 核心原则（强制）\n\n- 回测请求走三轮交互协议（见下方工作流）。\n- 编排器路径：`\"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\"`。\n- 严禁读取或引用历史报告文件（`.html`/`.png`/`.json`），只使用 orchestrator 的 `status` 命令输出获取结果。\n- 策略代码由 agent 在第 2 轮使用 LLM 生成，写入 `${QUANTCLAW_ROOT}/strategies/` 目录。\n- 禁止在首条回复前做长轮询。\n- 监控页是透明主通道，聊天页只给里程碑与结论。\n- 失败时必须回复 `status` + `error` + `next_action`，禁止只说\"失败了\"不给下一步。\n- 实盘能力保留，默认不进入实盘；用户请求模拟/实盘时执行 `qmt-check` 检测。\n- 触发词分四类：\n  - **回测第1轮**：`回测`、`策略`、`自动编排`、`均线`、`上穿`、`下穿`、`买入`、`卖出` → 进入三轮交互协议\n  - **回测第2轮**：`开始生成`、`生成策略`、`好`、`开始`、`继续`、`1`（或任何第1轮确认后的用户消息）；若同条消息同时包含完整需求+第2轮触发词，直接视为已确认并进入第2轮\n  - **参数优化**：`优化`、`调参`、`参数优化`、`网格搜索` → 执行 `optimize`（回测完成后触发）\n  - **模拟/实盘**：`模拟`、`模拟盘`、`模拟交易`、`开始交易`、`实盘`、`实盘交易`、`QMT` → 执行 `qmt-check` + `trade`（独立流程，不走三轮协议）\n\n---\n\n## 第 0 步：环境预检（每次会话首次触发时执行一次）\n\n运行 Skill 内置预检脚本（`scripts/preflight.py`，相对于本 Skill 目录）。脚本内部使用 `sys.executable` 自适应解释器，直接调用即可：\n\nLinux/macOS：\n```bash\npython3 \"<本Skill目录>/scripts/preflight.py\"\n```\nWindows PowerShell：\n```powershell\npython \"<本Skill目录>\\scripts\\preflight.py\"\n```\n\n输出 JSON，按字段消费：\n- `ready=true` → 取 `engine_root` 作为 `QUANTCLAW_ROOT`，进入第 1 轮\n- `ready=false` + `engine_found=true` → 依赖缺失，向用户展示 `blockers` 和 `fix_cmd`\n- `ready=false` + `engine_found=false` → 引擎未找到，返回 `status=config_missing` + 配置指南链接。**禁止降级为手动脚本。**\n- `hints` 非空 → 非阻塞提示（如 Token 状态），向用户如实展示\n- 预检通过后可选执行 `doctor_cmd` 做深度配置诊断（端口/Token/公网等）\n\n退出码：`0`=就绪　`1`=引擎未找到　`2`=依赖缺失可修复\n\n编排器脚本内置路径回退（`Path(__file__).parents[1]`），即使环境变量未设置，只要找到脚本就能正常运行。\n\n---\n\n## 三轮交互协议\n\n### 第 1 轮：需求确认\n\n**目标**：理解用户意图，确认关键参数，引导进入代码生成轮。\n\n1. **解析需求**：提取标的、周期、信号（仓位/风控缺失时使用默认并说明）\n2. **做数据能力检查**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/data_capability_guard.py\" \\\n  --requirement \"{用户原始需求}\"\n```\n3. **确认并引导**：回复至少包含：\n   - 已理解的参数摘要（标的/周期/信号/方向）\n   - 若 `data_capability_guard` 输出含 `token_hint`（非空字符串），**必须**在确认摘要之后、引导词之前如实告知用户。这表示检测到 Portfolio 策略 +（未传 Token 将回退共享试用 Token / 正在使用共享试用 Token）的组合，数据调用量大可能触发频率限制。直接呈现 `token_hint` 内容即可，不要包装为广告\n   - 明确引导用户触发下一轮：\n\n```\n需求已确认：{标的} / {模式cta或portfolio} / {日线/分钟线} / {做多/做空} / {回测区间或\"引擎默认最近1年\"}\n{若有token_hint则在此呈现，无则省略此行}\n请回复「开始生成」，我来为你生成策略代码并提交回测。\n```\n\n**第 1 轮禁止**：不做代码生成、不调用 submit、不创建文件。\n**第 1 轮最多命令**：`data_capability_guard.py`（1条）。\n\n### 第 2 轮：代码生成 + 提交（极速流程）\n\n**触发**：第 1 轮确认后，用户发送任意消息（`开始生成`/`好`/`1` 等）；若同条消息同时包含完整需求+第2轮触发词，也可直通第2轮。\n\n**直通首响（强制）**：直通第2轮时先立即回复一句 `已收到，开始生成中...`，再执行代码生成与提交，避免长时间无反馈。\n\n**第 2 轮速度约束（强制）**：\n- **禁止**重跑 `data_capability_guard`（第 1 轮已检查）\n- **禁止**单独跑 `py_compile`（submit 内部已含编译+静态检查+冒烟测试）\n- 理想路径 **2 次工具调用**：① 写策略文件 ② submit\n- submit **同步等待预检**（compile→lint→dryrun，通常 10~60 秒）再返回结果：\n  - 预检通过 → 返回 `status: \"accepted\"` + `monitor_url`（回测已在后台运行）\n  - 预检失败 → 返回 `status: \"lint_error\"/\"compile_error\"/\"dryrun_error\"` + `error` + `strategy_file`（**不返回 monitor_url**）\n- 预检失败时 **在 Round 2 内立即修复**：\n  1. **先告知用户**当前情况（如\"检测到 import 路径错误，正在自动修复...\"），保持透明\n  2. 读 `error` + `strategy_file` → 修复代码 → 重新 submit\n  3. 最多 **6 轮**修复重试，超过交由用户决策\n- submit 返回 `accepted` 后若回测运行时/超时/数据失败 → 已有 `monitor_url`，在第 3 轮处理\n\n1. **生成策略代码**（agent 使用 LLM 能力，直接写入文件）：\n   - 根据 `parsed[\"mode\"]` 选择正确模板：\n     - `cta` → 继承 `CtaTemplate`，`on_bar(self, bar)`，`self.buy(price, vol)` / `self.sell(price, vol)`，`self.pos`，初始化用 `self.load_bar(N)`（**单数**，N=bar 数量）\n     - `portfolio` → 继承 `StrategyTemplate`（vnpy_portfoliostrategy），`on_bars(self, bars: dict)`，`self.buy(vt_symbol, price, vol)` / `self.sell(vt_symbol, price, vol)`，`self.get_pos(vt_symbol)`，初始化用 `self.load_bars(days)`（**复数**，days=天数）\n   - **严禁混用**：CTA 策略禁止用 `load_bars`，Portfolio 策略禁止用 `load_bar`\n   - **仓位计算（强制——用户未指定时默认全仓）**：\n     - 用户明确说了手数/股数/仓位比例 → 按用户要求\n     - 用户未提仓位 → **默认全仓**（用 `self.available_cash` 动态计算最大可买手数）\n     - **绝对禁止** `fixed_size = 100` 或任何硬编码固定股数作为默认仓位（这是 vnpy 教程示例值，不是真实交易逻辑）\n     - CTA 全仓计算参考：\n       ```python\n       vol = int(self.available_cash / (bar.close_price * 1.0003)) // 100 * 100  # 主板100股整数倍\n       if vol >= 100:\n           self.buy(bar.close_price, vol)\n       ```\n     - Portfolio 等权全仓参考：\n       ```python\n       per_capital = self.available_cash / max(len(target_symbols), 1)\n       vol = int(per_capital / (bar.close_price * 1.0003)) // 100 * 100\n       if vol >= 100:\n           self.buy(vt_symbol, bar.close_price, vol)\n       ```\n     - 引擎会自动管理资金扣减/回款，并在资金不足时自动调减到可买最大手数\n   - **账户属性（引擎自动注入，策略直接用）**：\n     - `self.available_cash` — 可用现金（买入扣减，卖出回款）\n     - `self.total_value` — 账户总值（现金+持仓市值）\n     - `self.closable_pos` — CTA可卖数量（T+1 自动扣减当日买入）\n     - `self.closable_positions` — Portfolio per-symbol可卖量dict（`self.closable_positions.get(vt_symbol, 0)`）\n     - `self.capital` — 等于 available_cash（兼容）\n     - `self.trade_calendar` — 交易日历（set of \"YYYYMMDD\"），可用 `date_str in self.trade_calendar` 判断交易日\n     - `self.last_order_status` — 最近一次下单结果（`{\"ok\":True/False,\"reason\":\"...\",\"symbol\":\"...\"}`）\n     - `self.order_reject_log` — 最近200条被拒订单记录（停牌/涨跌停/资金不足等）\n   - **资金不足兜底**：引擎会自动调减买入量到可用现金能买的最大手数，无需策略手动检查\n   - **停牌/涨跌停兜底**：引擎自动拦截停牌日下单和触及涨跌停价格的委托，返回空列表。**策略判断下单是否成功应优先检查 `buy()/sell()` 返回值**（空列表=被拒），而非假设一定成功\n   - **交易所合规（强制）**：沪深主板/创业板 100 股整数倍，科创板(688xxx) 200 股起步+1 股递增（205 股合法）\n   - **ArrayManager API**：均线用 `am.sma()`，禁止用 `am.ma()`（vnpy 不存在此方法）\n   - **CTA 必须在 `on_bar` 开头调用 `am.update_bar(bar)`**：否则 ArrayManager 永远不会 `inited`，导致全程 0 交易。引擎有运行时兜底但不能依赖\n   - 写入 `${QUANTCLAW_ROOT}/strategies/{module_name}.py`\n\n**Portfolio 轮动策略速查**（减少生成思考时间）：\n- 周轮动：`on_bars(self, bars)` 中 `list(bars.values())[0].datetime.weekday()==0` 判断周一调仓\n- 排序选股：遍历 `self.vt_symbols` 计算因子 → `sorted()` → 取前N名\n- 等权全仓：每只 `self.available_cash / N`，按交易所规则取整手\n- 周线数据：`pro.weekly(ts_code=code, start_date=..., end_date=...)` 直取，无需从日线合成\n\n2. **直接提交**（submit 内置编译+静态检查+预导入，无需单独 py_compile）：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" submit \\\n  --requirement \"{用户原始需求}\" \\\n  --strategy-file \"${QUANTCLAW_ROOT}/strategies/{module_name}.py\" \\\n  --strategy-module \"{module_name}\" \\\n  --strategy-class \"{class_name}\" \\\n  --symbols \"{策略中所有vt_symbol逗号分隔}\" \\\n  --monitor-public-base \"${MONITOR_PUBLIC_BASE:-}\" \\\n  --monitor-port-candidates \"${ORCH_MONITOR_PORT_CANDIDATES:-8767}\" \\\n  --timeout-sec 1200\n```\n   - submit 内部同步执行预检：py_compile → _lint_strategy → _preflight_import → dryrun\n   - 预检通过后自动启动回测，返回 `status: \"accepted\"` + `monitor_url`\n   - 预检失败返回 `status: \"<error_type>\"` + `error` + `strategy_file`，**不启动回测、不返回 monitor_url**\n   - agent 判断 submit 输出：\n     - `status == \"accepted\"` → 进入步骤 3（回复用户）\n     - `status` 为 `compile_error`/`lint_error`/`dryrun_error` → **先输出一句话告知用户**（如\"检测到 xxx 错误，正在修复第 N/6 次...\"）→ 读 error + strategy_file → 修复代码 → 重新 submit（最多 6 轮）\n     - 6 轮后仍失败 → 将最后一次错误信息告知用户，交由用户决策\n\n3. **回复用户**（仅在 submit 返回 `accepted` 后）：\n   - `run_id` + `monitor_url` + 当前状态\n   - 引导词（必须覆盖两个语义点）：\n     - A：打开监控页实时查看策略代码/曲线/交易\n     - B：完成后发送「查看结果」获取摘要与报告链接\n\n### 第 3 轮：查看结果 / 诊断修复\n\n**触发词**：`查看结果`、`结果`、`status`、`重新生成`\n\n1. **查询状态**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" status --run-id \"{run_id}\"\n```\n\n2. **根据状态分流**：\n\n| status | 处理 |\n|--------|------|\n| `running` | 告知当前进度，提示继续等待 |\n| `completed` | 输出摘要 + 强制输出 `report_url`，不用 `monitor_url` 表述完整报告 |\n| `failed` | 根据 `last_error.error_type` 分流处理（见下方错误分流表） |\n\n3. **错误分流（agent 决策表）**：\n\n| error_type | 含义 | agent 策略 |\n|-----------|------|-----------:|\n| `compile_error` | py_compile 失败 | 读 strategy_file + traceback → LLM 修复代码 → 重新提交 |\n| `lint_error` | 静态检查 blocker（如 am.ma()、vnpy.trading 导入） | 同 compile_error 处理 |\n| `dryrun_error` | 冒烟测试失败（50根K线采样回放运行时异常） | 同 compile_error 处理：读 strategy_file + traceback → LLM 修复 → 重新提交 |\n| `runtime_error` | 回测运行时异常 | 读 strategy_file + traceback → LLM 分析修复 → 重新提交 |\n| `compat_error` | 引擎兼容性（如 portfolio+WEEKLY 未降级） | 提示用户调整参数，通常不应出现（parse_requirement 已自动降级） |\n| `data_error` | 数据加载失败/为空 | 提示用户检查标的代码/日期范围/token |\n| `config_error` | 环境/配置问题 | 提示用户检查配置 |\n| `timeout_error` | 超时 | 建议缩短日期范围或标的数量 |\n\n- 只对 `compile_error`、`lint_error`、`dryrun_error` 和 `runtime_error` 尝试自动修复，其余直接报告用户。\n- Round 2 预检失败（compile/lint/dryrun）自动修复最多 **6 轮**；Round 3 运行时修复最多 **3 轮**。超过交由用户决策。\n\n3.5 **结果校验告警（status=completed 时优先检查）**：\n\n`status` 输出中若包含 `result_warnings` 字段（非空列表），说明回测结果校验发现语义异常：\n- 读 `result_warnings` + `strategy_file` → LLM 分析是否为策略 bug\n  - 若判断为 bug → 修复策略代码 → 重新提交\n  - 若判断为正常行为（如趋势策略在熊市期间无反向信号）→ 照常输出结果，附带告警说明\n\n常见告警类型：零交易、单边信号（有买无卖/有卖无买）、胜率极端值（100%/0%）。\n\n4. **完成后引导**（status=completed 时必须附带）：\n\n```\n回测已完成，{摘要}。您可以：\n1. 回复「优化参数」对策略参数进行网格搜索\n2. 回复「模拟交易」在 QMT 中启动自动交易（需 Windows + QMT 环境）\n```\n\n---\n\n## 参数优化流程（回测完成后由用户触发）\n\n**触发词**：`优化`、`调参`、`参数优化`、`网格搜索`\n\n**前提**：已完成至少一次回测（数据已缓存在数据库中）。\n\n1. **确认优化方案**：agent 分析当前策略的可调参数，向用户确认：\n   - 优化目标（默认 `sharpe_ratio`，可选 `total_return`/`annual_return`/`max_ddpercent`）\n   - 参数范围（`[起始, 终止, 步长]`）\n   - 预估组合数\n\n2. **执行优化**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" optimize \\\n  --strategy-file \"${QUANTCLAW_ROOT}/strategies/{module_name}.py\" \\\n  --strategy-class \"{class_name}\" \\\n  --symbols \"{vt_symbol}\" \\\n  --start \"{YYYYMMDD}\" --end \"{YYYYMMDD}\" \\\n  --optimize-params '{\"target\":\"sharpe_ratio\",\"params\":{\"fast_window\":[5,30,5],\"slow_window\":[10,60,10]}}'\n```\n\n支持 `\"algorithm\":\"ga\"` 使用遗传算法（大参数空间时推荐）。\n\n3. **展示结果**：输出 JSON 含 `best`（最优参数+指标）和 `results`（Top N），agent 以表格形式呈现。\n\n4. **后续选择**：用户可选择用最优参数重新回测验证，或继续调整参数范围。\n\n---\n\n## 绝对禁止清单（违反任何一条 = 严重事故）\n\n### 链路禁止\n- **禁止**在项目目录或工作目录下创建 `.html` 报告文件\n- **禁止**读取、搜索、引用 `reports/` 目录下的历史文件\n- **禁止**直接调用 `backtest_runner.py`、`monitor_server.py`、`/api/code`\n- **禁止**使用 `python -m http.server` 或任何临时 HTTP 服务\n- **禁止**生成临时回测脚本或手工拼接回测执行流程\n- **禁止**在 submit 之前检查\"策略是否已存在\"\n- **禁止**在编排器找不到时降级为手动脚本、akshare/yfinance 临时方案、或任何非编排器回测方式\n\n### 输出禁止\n- **禁止**寒暄/自我介绍/营销文案\n- **禁止**承诺\"完成后自动推送摘要\"或\"跨轮次自动再回复\"\n- **禁止**使用\"模拟数据演示\"口径替代真实回测\n- **禁止**硬编码市场数据\n- **禁止**繁琐状态输出 `[run_id][N/M][状态]`\n- **禁止**发了\"请确认\"却自动继续\n- **禁止**前台启动长驻进程\n\n### 安全禁止\n- **禁止**硬编码绝对路径（统一使用 `QUANTCLAW_ROOT`）\n- **禁止**在 SKILL 或脚本中提交明文凭据\n- **禁止**策略文件路径指向 `strategies/` 目录之外\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn73ayd2pc6dgzpyqhpanbgax58244zz\",\n  \"slug\": \"quant-strategy-assistant\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1776330892408\n}\n\nFile v1.0.1:references/apis/adj_factor.md\n\n# `adj_factor` 接口文档\n\n## 接口说明\n\n- 中文说明：复权因子\n- 动态方法：`pro.adj_factor(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ts_code`, `trade_date`, `adj_factor`\n\n## 调用示例\n\n```python\ndf = pro.adj_factor(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ts_code,trade_date,adj_factor\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.1:references/apis/anns_d.md\n\n# `anns_d` 接口文档\n\n## 接口说明\n\n- 中文说明：上市公司全量公告\n- 动态方法：`pro.anns_d(...)`\n- 默认时间字段：无\n- 典型过滤参数：`ann_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ann_date`, `ts_code`, `name`, `title`, `url`, `rec_time`\n\n## 调用示例\n\n```python\ndf = pro.anns_d(\n    ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ann_date,ts_code,name,title,url,rec_time\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\n## 备注\n\n该接口当前未启用，原因：抱歉，您没有接口访问权限。\n\nFile v1.0.1:references/apis/bak_basic.md\n\n# `bak_basic` 接口文档\n\n## 接口说明\n\n- 中文说明：股票历史列表\n- 动态方法：`pro.bak_basic(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`, `start_date`(必填), `end_date`\n- 主要字段：`trade_date`, `ts_code`, `name`, `industry`, `area`, `pe`, `float_share`, `total_share`\n\n## 调用示例\n\n```python\ndf = pro.bak_basic(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"trade_date,ts_code,name,industry,area,pe,float_share,total_share\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.1:references/apis/balancesheet.md\n\n# `balancesheet` 接口文档\n\n## 接口说明\n\n- 中文说明：资产负债表\n- 动态方法：`pro.balancesheet_vip(...)`\n- 默认时间字段：`ann_date`\n- 典型过滤参数：`ann_date`, `start_date`(必填), `end_date`, `period`, `report_type`, `comp_type`\n- 主要字段：`ts_code`, `ann_date`, `f_ann_date`, `end_date`, `report_type`, `comp_type`, `end_type`, `total_share`\n\n## 调用示例\n\n```python\ndf = pro.balancesheet_vip(\n    ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    period=\"\",\n    report_type=\"\",\n    comp_type=\"\",\n    fields=\"ts_code,ann_date,f_ann_date,end_date,report_type,comp_type,end_type,total_share\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.1:references/apis/block_trade.md\n\n# `block_trade` 接口文档\n\n## 接口说明\n\n- 中文说明：大宗交易\n- 动态方法：`pro.block_trade(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：无\n- 主要字段：`ts_code`, `trade_date`, `price`, `vol`, `amount`, `buyer`, `seller`\n\n## 调用示例\n\n```python\ndf = pro.block_trade(\n    fields=\"ts_code,trade_date,price,vol,amount,buyer,seller\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.1:references/apis/broker_recommend.md\n\n# `broker_recommend` 接口文档\n\n## 接口说明\n\n- 中文说明：券商月度金股\n- 动态方法：`pro.broker_recommend(...)`\n- 默认时间字段：`month`\n- 典型过滤参数：`month`(必填), `start_date`(必填), `end_date`\n- 主要字段：`month`, `broker`, `ts_code`, `name`\n\n## 调用示例\n\n```python\ndf = pro.broker_recommend(\n    month=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"month,broker,ts_code,name\",\n    order_by=\"month\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.1:references/apis/bse_mapping.md\n\n# `bse_mapping` 接口文档\n\n## 接口说明\n\n- 中文说明：北交所新旧代码对照表\n- 动态方法：`pro.bse_mapping(...)`\n- 默认时间字段：`list_date`\n- 典型过滤参数：`o_code`, `n_code`\n- 主要字段：`name`, `o_code`, `n_code`, `list_date`\n\n## 调用示例\n\n```python\ndf = pro.bse_mapping(\n    o_code=\"\",\n    n_code=\"\",\n    fields=\"name,o_code,n_code,list_date\",\n    order_by=\"list_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.1:references/apis/cashflow.md\n\n# `cashflow` 接口文档\n\n## 接口说明\n\n- 中文说明：现金流量表\n- 动态方法：`pro.cashflow_vip(...)`\n- 默认时间字段：`ann_date`\n- 典型过滤参数：`ann_date`, `f_ann_date`, `start_date`(必填), `end_date`, `period`, `report_type`, `comp_type`, `is_calc`\n- 主要字段：`ts_code`, `ann_date`, `f_ann_date`, `end_date`, `comp_type`, `report_type`, `end_type`, `net_profit`\n\n## 调用示例\n\n```python\ndf = pro.cashflow_vip(\n    ann_date=\"\",\n    f_ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    period=\"\",\n    report_type=\"\",\n    comp_type=\"\",\n    is_calc=\"\",\n    fields=\"ts_code,ann_date,f_ann_date,end_date,comp_type,report_type,end_type,net_profit\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.1:references/apis/ccass_hold_detail.md\n\n# `ccass_hold_detail` 接口文档\n\n## 接口说明\n\n- 中文说明：中央结算系统持股明细\n- 动态方法：`pro.ccass_hold_detail(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：无\n- 主要字段：`trade_date`, `ts_code`, `name`, `col_participant_id`, `col_participant_name`, `col_shareholding`, `col_shareholding_percent`\n\n## 调用示例\n\n```python\ndf = pro.ccass_hold_detail(\n    fields=\"trade_date,ts_code,name,col_participant_id,col_participant_name,col_shareholding,col_shareholding_percent\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\n## 备注\n\n- 该接口为分表查询，必须同时传 `freq` 与 `ts_code`\n- 建议始终传 `start_date/end_date` 控制查询范围\n- 当时间字段为 `trade_time` 时，服务端会自动补齐交易时段边界\n\nFile v1.0.1:references/apis/ccass_hold.md\n\n# `ccass_hold` 接口文档\n\n## 接口说明\n\n- 中文说明：中央结算系统持股汇总\n- 动态方法：`pro.ccass_hold(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`trade_date`, `ts_code`, `name`, `shareholding`, `hold_nums`, `hold_ratio`\n\n## 调用示例\n\n```python\ndf = pro.ccass_hold(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"trade_date,ts_code,name,shareholding,hold_nums,hold_ratio\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nArchive v1.0.0: 160 files, 102551 bytes\n\nFiles: qgdata-reference.md (9358b), references/apis/adj_factor.md (496b), references/apis/anns_d.md (600b), references/apis/bak_basic.md (576b), references/apis/balancesheet.md (703b), references/apis/block_trade.md (443b), references/apis/broker_recommend.md (495b), references/apis/bse_mapping.md (455b), references/apis/cashflow.md (749b), references/apis/ccass_hold_detail.md (813b), references/apis/ccass_hold.md (579b), references/apis/cctv_news.md (447b), references/apis/ci_daily.md (571b), references/apis/cn_cpi.md (460b), references/apis/cn_gdp.md (410b), references/apis/cn_m.md (402b), references/apis/cn_pmi.md (485b), references/apis/cn_ppi.md (519b), references/apis/cyq_chips.md (722b), references/apis/cyq_perf.md (506b), references/apis/daily_basic.md (637b), references/apis/daily_info.md (623b), references/apis/daily.md (575b), references/apis/dc_daily.md (595b), references/apis/dc_hot.md (599b), references/apis/dc_index.md (611b), references/apis/dc_member.md (485b), references/apis/disclosure_date.md (667b), references/apis/dividend.md (707b), references/apis/etf_basic.md (487b), references/apis/etf_index.md (503b), references/apis/etf_share_size.md (606b), references/apis/etf_stk_mins.md (801b), references/apis/express.md (627b), references/apis/fina_audit.md (619b), references/apis/fina_indicator.md (648b), references/apis/fina_mainbz.md (609b), references/apis/forecast.md (657b), references/apis/fund_adj.md (496b), references/apis/fund_basic.md (469b), references/apis/fund_company.md (453b), references/apis/fund_daily.md (566b), references/apis/fund_div.md (579b), references/apis/fund_factor_pro.md (586b), references/apis/fund_manager.md (571b), references/apis/fund_nav.md (579b), references/apis/fund_portfolio.md (585b), references/apis/fund_share.md (490b), references/apis/ggt_daily.md (587b), references/apis/ggt_monthly.md (639b), references/apis/ggt_top10.md (648b), references/apis/gz_index.md (586b), references/apis/hibor.md (505b), references/apis/hk_adjfactor.md (537b), references/apis/hk_basic.md (449b), references/apis/hk_daily_adj.md (563b), references/apis/hk_daily.md (545b), references/apis/hk_hold.md (550b), references/apis/hk_mins.md (870b), references/apis/hk_tradecal.md (448b), references/apis/hm_detail.md (608b), references/apis/hm_list.md (339b), references/apis/hsgt_top10.md (650b), references/apis/idx_factor_pro.md (739b), references/apis/idx_mins.md (794b), references/apis/income.md (708b), references/apis/index_basic.md (518b), references/apis/index_classify.md (444b), references/apis/index_daily.md (566b), references/apis/index_dailybasic.md (611b), references/apis/index_global.md (575b), references/apis/index_member_all.md (521b), references/apis/index_monthly.md (605b), references/apis/index_weekly.md (569b), references/apis/index_weight.md (555b), references/apis/irm_qa_sh.md (598b), references/apis/irm_qa_sz.md (621b), references/apis/kpl_concept_cons.md (585b), references/apis/kpl_list.md (590b), references/apis/libor.md (605b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: quant-strategy-assistant\ndescription: \"量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。\"\nmetadata:\n  requires:\n    bins: [\"python3\"]\n  openclaw:\n    requires:\n      bins: [\"python3\"]\n---\n\n# 量化策略助手\n\n> **兼容说明**：本文档既是 OpenClaw Skill，也可作为任意 AI Agent 的操作手册。只要 Agent 能读取文件、执行命令、生成代码，即可按下方协议使用。YAML 头部的 `metadata.openclaw` 为 OpenClaw 平台专用字段，其他 Agent 忽略即可。\n\n回测三轮交互闭环 → 用户按需选择参数优化 / 模拟实盘。\n\n## 能力分层\n\n| 能力 | 引擎 | 依赖 | 说明 |\n|------|------|------|------|\n| **CTA回测** | vnpy_ctastrategy | python3 + qgdata | 单标的择时策略，任意平台 |\n| **Portfolio回测** | vnpy_portfoliostrategy | python3 + qgdata | 多标的组合/轮动策略，任意平台 |\n| **参数优化** | vnpy OptimizationSetting | 同回测 | 回测后由用户触发，穷举/遗传算法 |\n| **模拟/实盘** | miniQMT + vnpy CTA引擎 | QMT 交易端 | `qmt-check` 检测 → `trade` 启动自动交易，含探针单验证 |\n\n回测是核心能力，不依赖 QMT。用户请求模拟/实盘时才运行 `qmt-check`。\n\n### CTA vs Portfolio 自动路由（强制）\n\n| 条件 | 模式 | 策略基类 |\n|------|------|----------|\n| 单一标的 + 无组合关键词 | `cta` | `CtaTemplate` |\n| 以下任一条件满足 | `portfolio` | `StrategyTemplate`（vnpy_portfoliostrategy） |\n\n**portfolio 判定规则（分层，LLM 和 `parse_requirement()` 均遵循）**：\n1. **强信号**（任一出现即 portfolio）：`轮动/组合/多标的/全市场/等权/仓位分配/前N名`\n2. **弱信号 + 多标的上下文**（二者共现才 portfolio）：弱信号 `排序/筛选/选股/调仓/排列/持仓周期` 需同时存在多标的上下文（`板块/成分股/指数/行业/概念/股票池`）\n3. **标的数量 > 1**：`--symbols` 含 2 只以上自动 portfolio\n\n注意：\"多头排列\"中的\"排列\"、\"均线排序\"在单标的场景不触发 portfolio。\n\n路由由 `parse_requirement()` 自动判定并写入 `parsed[\"mode\"]`，agent 生成策略代码时必须使用对应基类。\n\n**Portfolio 引擎驱动约束**：Portfolio 回测引擎仅支持 DAILY 和分钟级驱动。周级策略用 `--interval DAILY`，在 `on_bars(bars)` 中按 `list(bars.values())[0].datetime.weekday()==0`（周一）判断调仓日；周线指标直接用 `pro.weekly()` 获取，无需从日线合成。\n\n**股票池所有权契约（强制）**：股票池由 `--symbols` 参数唯一定义 → 引擎加载数据 → 策略通过 `self.vt_symbols` 接收。策略代码 `__init__` 中**禁止覆盖 `vt_symbols`**，必须使用引擎传入的列表。所有标的代码使用 vnpy 格式（`600519.SSE`/`000858.SZSE`），不可使用 qgdata 格式（`.SH/.SZ`）。选股逻辑在 `on_bars(bars)` 中基于 `self.vt_symbols` 遍历和筛选。\n\n**板块/指数成分股由引擎自动解析（强制）**：用户说\"人工智能板块\"/\"沪深300成分股\"/\"银行行业\"等时，引擎会自动解析出完整成分股列表到 `--symbols`。策略代码中**禁止**自行调用 `pro.ths_member()`/`pro.ths_index()`/`pro.dc_member()` 等板块 API。\n\n**回测日期约束（强制）**：用户的回测日期意图必须由你转换为标准 `--start YYYYMMDD --end YYYYMMDD` 参数。例如用户说\"最近1年\"则根据当天日期计算 today-365 输出对应日期。用户未提及任何日期时，**不传** `--start/--end`（引擎默认最近1年，即 today-365 ~ today）。第1轮确认摘要中日期栏必须写\"引擎默认最近1年\"而非自行编造\"近2年\"等。**禁止**编造与用户意图不符的固定日期。\n\n### 模拟/实盘交易（独立流程，不走三轮协议）\n\n用户提及 `模拟`/`实盘`/`模拟交易`/`开始交易`/`QMT` 时触发。**前提：至少有一次成功的回测（status=completed）。**\n\n**第 1 步：环境检测**（自动发现 QMT 路径，无需用户手动配置路径）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" qmt-check\n```\n\n输出 JSON 含 `ready`（布尔）和 `hint`（状态说明）：\n- `platform != Windows` → 提示用户在 Windows + QMT 环境运行\n- QMT 路径自动扫描失败 → 提示确认 QMT 已安装\n- QMT 终端未运行 → 提示\"请先打开 QMT 并以极简模式登录\"\n- 缺少资金账号 → 提示通过 `--account-id` 或 `QMT_ACCOUNT_ID` 提供\n- `ready=true` → 进入第 2 步\n\n**第 2 步：启动交易**（内含自动探针验证：100股跌停价挂单→确认→撤单，可选单独跑 `probe --symbol {代码} --account-id {账号}`）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade \\\n  --run-id \"{最近成功回测的 run_id}\"\n```\n\n返回 JSON 分流：\n- `status=trading_started` → 告知用户：✅ 交易已启动，附带日志路径\n- `status=platform_redirect` → 告知用户：需在 Windows + QMT 环境运行，给出命令\n- `status=error` → 告知具体错误\n\n**第 3 步：停止交易**（用户说「停止交易」时）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade-stop --run-id \"{run_id}\"\n```\n\n仅需用户提供 **资金账号**（`--account-id` 或 `QMT_ACCOUNT_ID`）；QMT 路径自动扫描各盘符下 `userdata_mini` 目录（可通过 `QMT_PATH` 覆盖）。\n\n## 环境\n\n| 项目 | 值 |\n|------|---|\n| 项目根目录 | `QUANTCLAW_ROOT`（兼容 `QMT_PROJECT_ROOT`） |\n| vnpy_qmt源码 | `$QUANTCLAW_ROOT/vnpy_qmt` |\n| 策略输出 | `$QUANTCLAW_ROOT/strategies/` |\n| 回测输出 | `$QUANTCLAW_ROOT/backtests/` |\n| 回测数据源 | qgdata（建议预先配置 `QGDATA_TOKEN`） |\n| 实盘交易 | miniQMT (xt_gateway.py)，需 QMT 交易端已启动 |\n| Python解释器 | `PYTHON_BIN`（默认 `python3`） |\n\n回测默认参数：`capital=1000000 / rate=0.0003 / slippage=0.01 / size=1 / pricetick=0.01`\n\n配置指南: https://gitee.com/GuojinQuant/quant-claw#第四步配置环境变量 （仓库自带 `.env.example`）\n\n关键变量（优先从 `.env` / 环境变量自动推导，不需要写死）：\n- `QUANTCLAW_ROOT`：项目根目录（兼容 `QMT_PROJECT_ROOT`）\n- `MONITOR_PUBLIC_BASE`：监控公网基址（可留空；OpenClaw 环境下可由 `OPENCLAW_CONTROL_URL` 自动推导）\n- `ORCH_MONITOR_PORT_CANDIDATES`：白名单端口（默认 `8767`，必须在防火墙放通）\n- `QGDATA_TOKEN`：数据 Token（可选；未配置时自动使用内置共享试用Token，有每日额度限制）\n\n**Token 自动提取规则（强制）**：若用户对话中出现 60~70 位连续字母数字串（如\"我的token是 Mj9mN2xP...\"），自动提取并通过 `--token` 参数传给 submit 命令。日志和回复中只显示前 6 位+`***`，**绝不回显完整 Token**。提取到个人 Token 后提示用户：`已使用您的个人Token，不消耗共享试用额度`。\n\n---\n\n## 核心原则（强制）\n\n- 回测请求走三轮交互协议（见下方工作流）。\n- 编排器路径：`\"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\"`。\n- 严禁读取或引用历史报告文件（`.html`/`.png`/`.json`），只使用 orchestrator 的 `status` 命令输出获取结果。\n- 策略代码由 agent 在第 2 轮使用 LLM 生成，写入 `${QUANTCLAW_ROOT}/strategies/` 目录。\n- 禁止在首条回复前做长轮询。\n- 监控页是透明主通道，聊天页只给里程碑与结论。\n- 失败时必须回复 `status` + `error` + `next_action`，禁止只说\"失败了\"不给下一步。\n- 实盘能力保留，默认不进入实盘；用户请求模拟/实盘时执行 `qmt-check` 检测。\n- 触发词分四类：\n  - **回测第1轮**：`回测`、`策略`、`自动编排`、`均线`、`上穿`、`下穿`、`买入`、`卖出` → 进入三轮交互协议\n  - **回测第2轮**：`开始生成`、`生成策略`、`好`、`开始`、`继续`、`1`（或任何第1轮确认后的用户消息）；若同条消息同时包含完整需求+第2轮触发词，直接视为已确认并进入第2轮\n  - **参数优化**：`优化`、`调参`、`参数优化`、`网格搜索` → 执行 `optimize`（回测完成后触发）\n  - **模拟/实盘**：`模拟`、`模拟盘`、`模拟交易`、`开始交易`、`实盘`、`实盘交易`、`QMT` → 执行 `qmt-check` + `trade`（独立流程，不走三轮协议）\n\n---\n\n## 第 0 步：环境预检（每次会话首次触发时执行一次）\n\n运行 Skill 内置预检脚本（`scripts/preflight.py`，相对于本 Skill 目录）。脚本内部使用 `sys.executable` 自适应解释器，直接调用即可：\n\nLinux/macOS：\n```bash\npython3 \"<本Skill目录>/scripts/preflight.py\"\n```\nWindows PowerShell：\n```powershell\npython \"<本Skill目录>\\scripts\\preflight.py\"\n```\n\n输出 JSON，按字段消费：\n- `ready=true` → 取 `engine_root` 作为 `QUANTCLAW_ROOT`，进入第 1 轮\n- `ready=false` + `engine_found=true` → 依赖缺失，向用户展示 `blockers` 和 `fix_cmd`\n- `ready=false` + `engine_found=false` → 引擎未找到，返回 `status=config_missing` + 配置指南链接。**禁止降级为手动脚本。**\n- `hints` 非空 → 非阻塞提示（如 Token 状态），向用户如实展示\n- 预检通过后可选执行 `doctor_cmd` 做深度配置诊断（端口/Token/公网等）\n\n退出码：`0`=就绪　`1`=引擎未找到　`2`=依赖缺失可修复\n\n编排器脚本内置路径回退（`Path(__file__).parents[1]`），即使环境变量未设置，只要找到脚本就能正常运行。\n\n---\n\n## 三轮交互协议\n\n### 第 1 轮：需求确认\n\n**目标**：理解用户意图，确认关键参数，引导进入代码生成轮。\n\n1. **解析需求**：提取标的、周期、信号（仓位/风控缺失时使用默认并说明）\n2. **做数据能力检查**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/data_capability_guard.py\" \\\n  --requirement \"{用户原始需求}\"\n```\n3. **确认并引导**：回复至少包含：\n   - 已理解的参数摘要（标的/周期/信号/方向）\n   - 若 `data_capability_guard` 输出含 `token_hint`（非空字符串），**必须**在确认摘要之后、引导词之前如实告知用户。这表示检测到 Portfolio 策略 +（未传 Token 将回退共享试用 Token / 正在使用共享试用 Token）的组合，数据调用量大可能触发频率限制。直接呈现 `token_hint` 内容即可，不要包装为广告\n   - 明确引导用户触发下一轮：\n\n```\n需求已确认：{标的} / {模式cta或portfolio} / {日线/分钟线} / {做多/做空} / {回测区间或\"引擎默认最近1年\"}\n{若有token_hint则在此呈现，无则省略此行}\n请回复「开始生成」，我来为你生成策略代码并提交回测。\n```\n\n**第 1 轮禁止**：不做代码生成、不调用 submit、不创建文件。\n**第 1 轮最多命令**：`data_capability_guard.py`（1条）。\n\n### 第 2 轮：代码生成 + 提交（极速流程）\n\n**触发**：第 1 轮确认后，用户发送任意消息（`开始生成`/`好`/`1` 等）；若同条消息同时包含完整需求+第2轮触发词，也可直通第2轮。\n\n**直通首响（强制）**：直通第2轮时先立即回复一句 `已收到，开始生成中...`，再执行代码生成与提交，避免长时间无反馈。\n\n**第 2 轮速度约束（强制）**：\n- **禁止**重跑 `data_capability_guard`（第 1 轮已检查）\n- **禁止**单独跑 `py_compile`（submit 内部已含编译+静态检查+冒烟测试）\n- 理想路径 **2 次工具调用**：① 写策略文件 ② submit\n- submit **同步等待预检**（compile→lint→dryrun，通常 10~60 秒）再返回结果：\n  - 预检通过 → 返回 `status: \"accepted\"` + `monitor_url`（回测已在后台运行）\n  - 预检失败 → 返回 `status: \"lint_error\"/\"compile_error\"/\"dryrun_error\"` + `error` + `strategy_file`（**不返回 monitor_url**）\n- 预检失败时 **在 Round 2 内立即修复**：\n  1. **先告知用户**当前情况（如\"检测到 import 路径错误，正在自动修复...\"），保持透明\n  2. 读 `error` + `strategy_file` → 修复代码 → 重新 submit\n  3. 最多 **6 轮**修复重试，超过交由用户决策\n- submit 返回 `accepted` 后若回测运行时/超时/数据失败 → 已有 `monitor_url`，在第 3 轮处理\n\n1. **生成策略代码**（agent 使用 LLM 能力，直接写入文件）：\n   - 根据 `parsed[\"mode\"]` 选择正确模板：\n     - `cta` → 继承 `CtaTemplate`，`on_bar(self, bar)`，`self.buy(price, vol)` / `self.sell(price, vol)`，`self.pos`，初始化用 `self.load_bar(N)`（**单数**，N=bar 数量）\n     - `portfolio` → 继承 `StrategyTemplate`（vnpy_portfoliostrategy），`on_bars(self, bars: dict)`，`self.buy(vt_symbol, price, vol)` / `self.sell(vt_symbol, price, vol)`，`self.get_pos(vt_symbol)`，初始化用 `self.load_bars(days)`（**复数**，days=天数）\n   - **严禁混用**：CTA 策略禁止用 `load_bars`，Portfolio 策略禁止用 `load_bar`\n   - **仓位计算（强制——用户未指定时默认全仓）**：\n     - 用户明确说了手数/股数/仓位比例 → 按用户要求\n     - 用户未提仓位 → **默认全仓**（用 `self.available_cash` 动态计算最大可买手数）\n     - **绝对禁止** `fixed_size = 100` 或任何硬编码固定股数作为默认仓位（这是 vnpy 教程示例值，不是真实交易逻辑）\n     - CTA 全仓计算参考：\n       ```python\n       vol = int(self.available_cash / (bar.close_price * 1.0003)) // 100 * 100  # 主板100股整数倍\n       if vol >= 100:\n           self.buy(bar.close_price, vol)\n       ```\n     - Portfolio 等权全仓参考：\n       ```python\n       per_capital = self.available_cash / max(len(target_symbols), 1)\n       vol = int(per_capital / (bar.close_price * 1.0003)) // 100 * 100\n       if vol >= 100:\n           self.buy(vt_symbol, bar.close_price, vol)\n       ```\n     - 引擎会自动管理资金扣减/回款，并在资金不足时自动调减到可买最大手数\n   - **账户属性（引擎自动注入，策略直接用）**：\n     - `self.available_cash` — 可用现金（买入扣减，卖出回款）\n     - `self.total_value` — 账户总值（现金+持仓市值）\n     - `self.closable_pos` — CTA可卖数量（T+1 自动扣减当日买入）\n     - `self.closable_positions` — Portfolio per-symbol可卖量dict（`self.closable_positions.get(vt_symbol, 0)`）\n     - `self.capital` — 等于 available_cash（兼容）\n     - `self.trade_calendar` — 交易日历（set of \"YYYYMMDD\"），可用 `date_str in self.trade_calendar` 判断交易日\n     - `self.last_order_status` — 最近一次下单结果（`{\"ok\":True/False,\"reason\":\"...\",\"symbol\":\"...\"}`）\n     - `self.order_reject_log` — 最近200条被拒订单记录（停牌/涨跌停/资金不足等）\n   - **资金不足兜底**：引擎会自动调减买入量到可用现金能买的最大手数，无需策略手动检查\n   - **停牌/涨跌停兜底**：引擎自动拦截停牌日下单和触及涨跌停价格的委托，返回空列表。**策略判断下单是否成功应优先检查 `buy()/sell()` 返回值**（空列表=被拒），而非假设一定成功\n   - **交易所合规（强制）**：沪深主板/创业板 100 股整数倍，科创板(688xxx) 200 股起步+1 股递增（205 股合法）\n   - **ArrayManager API**：均线用 `am.sma()`，禁止用 `am.ma()`（vnpy 不存在此方法）\n   - **CTA 必须在 `on_bar` 开头调用 `am.update_bar(bar)`**：否则 ArrayManager 永远不会 `inited`，导致全程 0 交易。引擎有运行时兜底但不能依赖\n   - 写入 `${QUANTCLAW_ROOT}/strategies/{module_name}.py`\n\n**Portfolio 轮动策略速查**（减少生成思考时间）：\n- 周轮动：`on_bars(self, bars)` 中 `list(bars.values())[0].datetime.weekday()==0` 判断周一调仓\n- 排序选股：遍历 `self.vt_symbols` 计算因子 → `sorted()` → 取前N名\n- 等权全仓：每只 `self.available_cash / N`，按交易所规则取整手\n- 周线数据：`pro.weekly(ts_code=code, start_date=..., end_date=...)` 直取，无需从日线合成\n\n2. **直接提交**（submit 内置编译+静态检查+预导入，无需单独 py_compile）：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" submit \\\n  --requirement \"{用户原始需求}\" \\\n  --strategy-file \"${QUANTCLAW_ROOT}/strategies/{module_name}.py\" \\\n  --strategy-module \"{module_name}\" \\\n  --strategy-class \"{class_name}\" \\\n  --symbols \"{策略中所有vt_symbol逗号分隔}\" \\\n  --monitor-public-base \"${MONITOR_PUBLIC_BASE:-}\" \\\n  --monitor-port-candidates \"${ORCH_MONITOR_PORT_CANDIDATES:-8767}\" \\\n  --timeout-sec 1200\n```\n   - submit 内部同步执行预检：py_compile → _lint_strategy → _preflight_import → dryrun\n   - 预检通过后自动启动回测，返回 `status: \"accepted\"` + `monitor_url`\n   - 预检失败返回 `status: \"<error_type>\"` + `error` + `strategy_file`，**不启动回测、不返回 monitor_url**\n   - agent 判断 submit 输出：\n     - `status == \"accepted\"` → 进入步骤 3（回复用户）\n     - `status` 为 `compile_error`/`lint_error`/`dryrun_error` → **先输出一句话告知用户**（如\"检测到 xxx 错误，正在修复第 N/6 次...\"）→ 读 error + strategy_file → 修复代码 → 重新 submit（最多 6 轮）\n     - 6 轮后仍失败 → 将最后一次错误信息告知用户，交由用户决策\n\n3. **回复用户**（仅在 submit 返回 `accepted` 后）：\n   - `run_id` + `monitor_url` + 当前状态\n   - 引导词（必须覆盖两个语义点）：\n     - A：打开监控页实时查看策略代码/曲线/交易\n     - B：完成后发送「查看结果」获取摘要与报告链接\n\n### 第 3 轮：查看结果 / 诊断修复\n\n**触发词**：`查看结果`、`结果`、`status`、`重新生成`\n\n1. **查询状态**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" status --run-id \"{run_id}\"\n```\n\n2. **根据状态分流**：\n\n| status | 处理 |\n|--------|------|\n| `running` | 告知当前进度，提示继续等待 |\n| `completed` | 输出摘要 + 强制输出 `report_url`，不用 `monitor_url` 表述完整报告 |\n| `failed` | 根据 `last_error.error_type` 分流处理（见下方错误分流表） |\n\n3. **错误分流（agent 决策表）**：\n\n| error_type | 含义 | agent 策略 |\n|-----------|------|-----------:|\n| `compile_error` | py_compile 失败 | 读 strategy_file + traceback → LLM 修复代码 → 重新提交 |\n| `lint_error` | 静态检查 blocker（如 am.ma()、vnpy.trading 导入） | 同 compile_error 处理 |\n| `dryrun_error` | 冒烟测试失败（50根K线采样回放运行时异常） | 同 compile_error 处理：读 strategy_file + traceback → LLM 修复 → 重新提交 |\n| `runtime_error` | 回测运行时异常 | 读 strategy_file + traceback → LLM 分析修复 → 重新提交 |\n| `compat_error` | 引擎兼容性（如 portfolio+WEEKLY 未降级） | 提示用户调整参数，通常不应出现（parse_requirement 已自动降级） |\n| `data_error` | 数据加载失败/为空 | 提示用户检查标的代码/日期范围/token |\n| `config_error` | 环境/配置问题 | 提示用户检查配置 |\n| `timeout_error` | 超时 | 建议缩短日期范围或标的数量 |\n\n- 只对 `compile_error`、`lint_error`、`dryrun_error` 和 `runtime_error` 尝试自动修复，其余直接报告用户。\n- Round 2 预检失败（compile/lint/dryrun）自动修复最多 **6 轮**；Round 3 运行时修复最多 **3 轮**。超过交由用户决策。\n\n3.5 **结果校验告警（status=completed 时优先检查）**：\n\n`status` 输出中若包含 `result_warnings` 字段（非空列表），说明回测结果校验发现语义异常：\n- 读 `result_warnings` + `strategy_file` → LLM 分析是否为策略 bug\n  - 若判断为 bug → 修复策略代码 → 重新提交\n  - 若判断为正常行为（如趋势策略在熊市期间无反向信号）→ 照常输出结果，附带告警说明\n\n常见告警类型：零交易、单边信号（有买无卖/有卖无买）、胜率极端值（100%/0%）。\n\n4. **完成后引导**（status=completed 时必须附带）：\n\n```\n回测已完成，{摘要}。您可以：\n1. 回复「优化参数」对策略参数进行网格搜索\n2. 回复「模拟交易」在 QMT 中启动自动交易（需 Windows + QMT 环境）\n```\n\n---\n\n## 参数优化流程（回测完成后由用户触发）\n\n**触发词**：`优化`、`调参`、`参数优化`、`网格搜索`\n\n**前提**：已完成至少一次回测（数据已缓存在数据库中）。\n\n1. **确认优化方案**：agent 分析当前策略的可调参数，向用户确认：\n   - 优化目标（默认 `sharpe_ratio`，可选 `total_return`/`annual_return`/`max_ddpercent`）\n   - 参数范围（`[起始, 终止, 步长]`）\n   - 预估组合数\n\n2. **执行优化**：\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" optimize \\\n  --strategy-file \"${QUANTCLAW_ROOT}/strategies/{module_name}.py\" \\\n  --strategy-class \"{class_name}\" \\\n  --symbols \"{vt_symbol}\" \\\n  --start \"{YYYYMMDD}\" --end \"{YYYYMMDD}\" \\\n  --optimize-params '{\"target\":\"sharpe_ratio\",\"params\":{\"fast_window\":[5,30,5],\"slow_window\":[10,60,10]}}'\n```\n\n支持 `\"algorithm\":\"ga\"` 使用遗传算法（大参数空间时推荐）。\n\n3. **展示结果**：输出 JSON 含 `best`（最优参数+指标）和 `results`（Top N），agent 以表格形式呈现。\n\n4. **后续选择**：用户可选择用最优参数重新回测验证，或继续调整参数范围。\n\n---\n\n## 绝对禁止清单（违反任何一条 = 严重事故）\n\n### 链路禁止\n- **禁止**在项目目录或工作目录下创建 `.html` 报告文件\n- **禁止**读取、搜索、引用 `reports/` 目录下的历史文件\n- **禁止**直接调用 `backtest_runner.py`、`monitor_server.py`、`/api/code`\n- **禁止**使用 `python -m http.server` 或任何临时 HTTP 服务\n- **禁止**生成临时回测脚本或手工拼接回测执行流程\n- **禁止**在 submit 之前检查\"策略是否已存在\"\n- **禁止**在编排器找不到时降级为手动脚本、akshare/yfinance 临时方案、或任何非编排器回测方式\n\n### 输出禁止\n- **禁止**寒暄/自我介绍/营销文案\n- **禁止**承诺\"完成后自动推送摘要\"或\"跨轮次自动再回复\"\n- **禁止**使用\"模拟数据演示\"口径替代真实回测\n- **禁止**硬编码市场数据\n- **禁止**繁琐状态输出 `[run_id][N/M][状态]`\n- **禁止**发了\"请确认\"却自动继续\n- **禁止**前台启动长驻进程\n\n### 安全禁止\n- **禁止**硬编码绝对路径（统一使用 `QUANTCLAW_ROOT`）\n- **禁止**在 SKILL 或脚本中提交明文凭据\n- **禁止**策略文件路径指向 `strategies/` 目录之外\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn73ayd2pc6dgzpyqhpanbgax58244zz\",\n  \"slug\": \"quant-strategy-assistant\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776328063058\n}\n\nFile v1.0.0:references/apis/adj_factor.md\n\n# `adj_factor` 接口文档\n\n## 接口说明\n\n- 中文说明：复权因子\n- 动态方法：`pro.adj_factor(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ts_code`, `trade_date`, `adj_factor`\n\n## 调用示例\n\n```python\ndf = pro.adj_factor(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ts_code,trade_date,adj_factor\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.0:references/apis/anns_d.md\n\n# `anns_d` 接口文档\n\n## 接口说明\n\n- 中文说明：上市公司全量公告\n- 动态方法：`pro.anns_d(...)`\n- 默认时间字段：无\n- 典型过滤参数：`ann_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ann_date`, `ts_code`, `name`, `title`, `url`, `rec_time`\n\n## 调用示例\n\n```python\ndf = pro.anns_d(\n    ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ann_date,ts_code,name,title,url,rec_time\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\n## 备注\n\n该接口当前未启用，原因：抱歉，您没有接口访问权限。\n\nFile v1.0.0:references/apis/bak_basic.md\n\n# `bak_basic` 接口文档\n\n## 接口说明\n\n- 中文说明：股票历史列表\n- 动态方法：`pro.bak_basic(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`, `start_date`(必填), `end_date`\n- 主要字段：`trade_date`, `ts_code`, `name`, `industry`, `area`, `pe`, `float_share`, `total_share`\n\n## 调用示例\n\n```python\ndf = pro.bak_basic(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"trade_date,ts_code,name,industry,area,pe,float_share,total_share\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.0:references/apis/balancesheet.md\n\n# `balancesheet` 接口文档\n\n## 接口说明\n\n- 中文说明：资产负债表\n- 动态方法：`pro.balancesheet_vip(...)`\n- 默认时间字段：`ann_date`\n- 典型过滤参数：`ann_date`, `start_date`(必填), `end_date`, `period`, `report_type`, `comp_type`\n- 主要字段：`ts_code`, `ann_date`, `f_ann_date`, `end_date`, `report_type`, `comp_type`, `end_type`, `total_share`\n\n## 调用示例\n\n```python\ndf = pro.balancesheet_vip(\n    ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    period=\"\",\n    report_type=\"\",\n    comp_type=\"\",\n    fields=\"ts_code,ann_date,f_ann_date,end_date,report_type,comp_type,end_type,total_share\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.0:references/apis/block_trade.md\n\n# `block_trade` 接口文档\n\n## 接口说明\n\n- 中文说明：大宗交易\n- 动态方法：`pro.block_trade(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：无\n- 主要字段：`ts_code`, `trade_date`, `price`, `vol`, `amount`, `buyer`, `seller`\n\n## 调用示例\n\n```python\ndf = pro.block_trade(\n    fields=\"ts_code,trade_date,price,vol,amount,buyer,seller\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.0:references/apis/broker_recommend.md\n\n# `broker_recommend` 接口文档\n\n## 接口说明\n\n- 中文说明：券商月度金股\n- 动态方法：`pro.broker_recommend(...)`\n- 默认时间字段：`month`\n- 典型过滤参数：`month`(必填), `start_date`(必填), `end_date`\n- 主要字段：`month`, `broker`, `ts_code`, `name`\n\n## 调用示例\n\n```python\ndf = pro.broker_recommend(\n    month=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"month,broker,ts_code,name\",\n    order_by=\"month\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.0:references/apis/bse_mapping.md\n\n# `bse_mapping` 接口文档\n\n## 接口说明\n\n- 中文说明：北交所新旧代码对照表\n- 动态方法：`pro.bse_mapping(...)`\n- 默认时间字段：`list_date`\n- 典型过滤参数：`o_code`, `n_code`\n- 主要字段：`name`, `o_code`, `n_code`, `list_date`\n\n## 调用示例\n\n```python\ndf = pro.bse_mapping(\n    o_code=\"\",\n    n_code=\"\",\n    fields=\"name,o_code,n_code,list_date\",\n    order_by=\"list_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.0:references/apis/cashflow.md\n\n# `cashflow` 接口文档\n\n## 接口说明\n\n- 中文说明：现金流量表\n- 动态方法：`pro.cashflow_vip(...)`\n- 默认时间字段：`ann_date`\n- 典型过滤参数：`ann_date`, `f_ann_date`, `start_date`(必填), `end_date`, `period`, `report_type`, `comp_type`, `is_calc`\n- 主要字段：`ts_code`, `ann_date`, `f_ann_date`, `end_date`, `comp_type`, `report_type`, `end_type`, `net_profit`\n\n## 调用示例\n\n```python\ndf = pro.cashflow_vip(\n    ann_date=\"\",\n    f_ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    period=\"\",\n    report_type=\"\",\n    comp_type=\"\",\n    is_calc=\"\",\n    fields=\"ts_code,ann_date,f_ann_date,end_date,comp_type,report_type,end_type,net_profit\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\nFile v1.0.0:references/apis/ccass_hold_detail.md\n\n# `ccass_hold_detail` 接口文档\n\n## 接口说明\n\n- 中文说明：中央结算系统持股明细\n- 动态方法：`pro.ccass_hold_detail(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：无\n- 主要字段：`trade_date`, `ts_code`, `name`, `col_participant_id`, `col_participant_name`, `col_shareholding`, `col_shareholding_percent`\n\n## 调用示例\n\n```python\ndf = pro.ccass_hold_detail(\n    fields=\"trade_date,ts_code,name,col_participant_id,col_participant_name,col_shareholding,col_shareholding_percent\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\n## 备注\n\n- 该接口为分表查询，必须同时传 `freq` 与 `ts_code`\n- 建议始终传 `start_date/end_date` 控制查询范围\n- 当时间字段为 `trade_time` 时，服务端会自动补齐交易时段边界\n\nFile v1.0.0:references/apis/ccass_hold.md\n\n# `ccass_hold` 接口文档\n\n## 接口说明\n\n- 中文说明：中央结算系统持股汇总\n- 动态方法：`pro.ccass_hold(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`trade_date`, `ts_code`, `name`, `shareholding`, `hold_nums`, `hold_ratio`\n\n## 调用示例\n\n```python\ndf = pro.ccass_hold(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"trade_date,ts_code,name,shareholding,hold_nums,hold_ratio\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```","readmeExcerpt":"Skill: 量化策略助手 Owner: listolany Summary: 量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。 Tags: latest:1.0.2 Version history: v1.0.2 | 2026-04-16T10:23:04.566Z | auto quant-strategy-assistant 1.0.2 - Initial public release with full OpenClaw three-round interactive workflow for quant strategy development. - Added 175 files, including backtest orchestrator, data capability guard, and extensive QGDATA API documentation. - Suppor","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" qmt-check"},{"language":"bash","snippet":"\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade \\\n  --run-id \"{最近成功回测的 run_id}\""},{"language":"bash","snippet":"\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade-stop --run-id \"{run_id}\""},{"language":"bash","snippet":"python3 \"<本Skill目录>/scripts/preflight.py\""},{"language":"powershell","snippet":"python \"<本Skill目录>\\scripts\\preflight.py\""},{"language":"bash","snippet":"\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/data_capability_guard.py\" \\\n  --requirement \"{用户原始需求}\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: quant-strategy-assistant\ndescription: \"量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。\"\nmetadata:\n  requires:\n    bins: [\"python3\"]\n  openclaw:\n    requires:\n      bins: [\"python3\"]\n---\n\n# 量化策略助手\n\n> **兼容说明**：本文档既是 OpenClaw Skill，也可作为任意 AI Agent 的操作手册。只要 Agent 能读取文件、执行命令、生成代码，即可按下方协议使用。YAML 头部的 `metadata.openclaw` 为 OpenClaw 平台专用字段，其他 Agent 忽略即可。\n\n回测三轮交互闭环 → 用户按需选择参数优化 / 模拟实盘。\n\n## 能力分层\n\n| 能力 | 引擎 | 依赖 | 说明 |\n|------|------|------|------|\n| **CTA回测** | vnpy_ctastrategy | python3 + qgdata | 单标的择时策略，任意平台 |\n| **Portfolio回测** | vnpy_portfoliostrategy | python3 + qgdata | 多标的组合/轮动策略，任意平台 |\n| **参数优化** | vnpy OptimizationSetting | 同回测 | 回测后由用户触发，穷举/遗传算法 |\n| **模拟/实盘** | miniQMT + vnpy CTA引擎 | QMT 交易端 | `qmt-check` 检测 → `trade` 启动自动交易，含探针单验证 |\n\n回测是核心能力，不依赖 QMT。用户请求模拟/实盘时才运行 `qmt-check`。\n\n### CTA vs Portfolio 自动路由（强制）\n\n| 条件 | 模式 | 策略基类 |\n|------|------|----------|\n| 单一标的 + 无组合关键词 | `cta` | `CtaTemplate` |\n| 以下任一条件满足 | `portfolio` | `StrategyTemplate`（vnpy_portfoliostrategy） |\n\n**portfolio 判定规则（分层，LLM 和 `parse_requirement()` 均遵循）**：\n1. **强信号**（任一出现即 portfolio）：`轮动/组合/多标的/全市场/等权/仓位分配/前N名`\n2. **弱信号 + 多标的上下文**（二者共现才 portfolio）：弱信号 `排序/筛选/选股/调仓/排列/持仓周期` 需同时存在多标的上下文（`板块/成分股/指数/行业/概念/股票池`）\n3. **标的数量 > 1**：`--symbols` 含 2 只以上自动 portfolio\n\n注意：\"多头排列\"中的\"排列\"、\"均线排序\"在单标的场景不触发 portfolio。\n\n路由由 `parse_requirement()` 自动判定并写入 `parsed[\"mode\"]`，agent 生成策略代码时必须使用对应基类。\n\n**Portfolio 引擎驱动约束**：Portfolio 回测引擎仅支持 DAILY 和分钟级驱动。周级策略用 `--interval DAILY`，在 `on_bars(bars)` 中按 `list(bars.values())[0].datetime.weekday()==0`（周一）判断调仓日；周线指标直接用 `pro.weekly()` 获取，无需从日线合成。\n\n**股票池所有权契约（强制）**：股票池由 `--symbols` 参数唯一定义 → 引擎加载数据 → 策略通过 `self.vt_symbols` 接收。策略代码 `__init__` 中**禁止覆盖 `vt_symbols`**，必须使用引擎传入的列表。所有标的代码使用 vnpy 格式（`600519.SSE`/`000858.SZSE`），不可使用 qgdata 格式（`.SH/.SZ`）。选股逻辑在 `on_bars(bars)` 中基于 `self.vt_symbols` 遍历和筛选。\n\n**板块/指数成分股由引擎自动解析（强制）**：用户说\"人工智能板块\"/\"沪深300成分股\"/\"银行行业\"等时，引擎会自动解析出完整成分股列表到 `--symbols`。策略代码中**禁止**自行调用 `pro.ths_member()`/`pro.ths_index()`/`pro.dc_member()` 等板块 API。\n\n**回测日期约束（强制）**：用户的回测日期意图必须由你转换为标准 `--start YYYYMMDD --end YYYYMMDD` 参数。例如用户说\"最近1年\"则根据当天日期计算 today-365 输出对应日期。用户未提及任何日期时，**不传** `--start/--end`（引擎默认最近1年，即 today-365 ~ today）。第1轮确认摘要中日期栏必须写\"引擎默认最近1年\"而非自行编造\"近2年\"等。**禁止**编造与用户意图不符的固定日期。\n\n### 模拟/实盘交易（独立流程，不走三轮协议）\n\n用户提及 `模拟`/`实盘`/`模拟交易`/`开始交易`/`QMT` 时触发。**前提：至少有一次成功的回测（status=completed）。**\n\n**第 1 步：环境检测**（自动发现 QMT 路径，无需用户手动配置路径）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" qmt-check\n```\n\n输出 JSON 含 `ready`（布尔）和 `hint`（状态说明）：\n- `platform != Windows` → 提示用户在 Windows + QMT 环境运行\n- QMT 路径自动扫描失败 → 提示确认 QMT 已安装\n- QMT 终端未运行 → 提示\"请先打开 QMT 并以极简模式登录\"\n- 缺少资金账号 → 提示通过 `--account-id` 或 `QMT_ACCOUNT_ID` 提供\n- `ready=true` → 进入第 2 步\n\n**第 2 步：启动交易**（内含自动探针验证：100股跌停价挂单→确认→撤单，可选单独跑 `probe --symbol {代码} --account-id {账号}`）\n\n```bash\n\"${PYTHON_BIN}\" \"${QUANTCLAW_ROOT}/backtests/pipeline_orchestrator.py\" trade \\\n  --run-id \"{最近成功回测的 run_id}\"\n```\n\n返回 JSON 分流：\n- `status=trading_started` → 告知用户：✅ 交易已启动，附带日志路径\n- `status=platform_redirect` → 告知用户：需在 Windows + QMT 环境运行，"},{"path":"QMT-TradingClaw/vnpy_qmt/README.md","content":"# VeighNa框架的QMT数据服务与交易接口\r\n\r\n<p align=\"center\">\r\n  <img src =\"https://vnpy.oss-cn-shanghai.aliyuncs.com/vnpy-logo.png\"/>\r\n</p>\r\n\r\n<p align=\"center\">\r\n    <img src =\"https://img.shields.io/badge/version-2.0.0-blueviolet.svg\"/>\r\n    <img src =\"https://img.shields.io/badge/platform-windows|linux-yellow.svg\"/>\r\n    <img src =\"https://img.shields.io/badge/python-3.10|3.11|3.12-blue.svg\" />\r\n    <img src =\"https://img.shields.io/github/license/vnpy/vnpy.svg?color=orange\"/>\r\n</p>\r\n\r\n## 说明\r\n\r\n基于迅投XtQuant和qgdata封装开发的数据服务与交易接口，提供双数据源支持：\r\n\r\n* **qgdata数据源（回测首选）**：A股日线/分钟线/周线行情，跨平台支持\r\n* **迅投研(XT)数据源**：实时行情、Tick数据、期货/期权市场，Windows平台\r\n\r\n支持以下中国金融市场：\r\n\r\n* 股票、基金、债券、ETF期权：\r\n  * SSE：上海证券交易所\r\n  * SZSE：深圳证券交易所\r\n  * BSE：北京证券交易所\r\n* 期货、期货期权（仅XT数据源）：\r\n  * CFFEX：中国金融期货交易所\r\n  * SHFE：上海期货交易所\r\n  * DCE：大连商品交易所\r\n  * CZCE：郑州商品交易所\r\n  * INE：上海国际能源交易中心\r\n  * GFEX：广州期货交易所\r\n\r\n\r\n## 安装\r\n\r\n安装环境推荐基于3.9.0版本以上的【[**VeighNa Studio**](https://www.vnpy.com/)】。\r\n\r\n直接使用pip命令：\r\n\r\n```\r\npip install vnpy_xt qgdata\r\n```\r\n\r\n完成基础安装后，克隆本项目代码并替换官方文件：\r\n```bash\r\ngit clone https://gitee.com/GuojinQuant/vnpy_qmt.git\r\n\r\n# 将 vnpy_qmt/vnpy_xt/ 目录内文件覆盖至官方安装路径：\r\n#   Linux/Mac: /usr/local/lib/python3.x/site-packages/vnpy_xt/\r\n#   Windows:   %PYTHON_HOME%\\Lib\\site-packages\\vnpy_xt\\\r\n#   提示：可通过 pip show vnpy_xt 查询确切安装路径\r\n```\r\n\r\n## 使用\r\n\r\n### qgdata数据源连接（回测首选）\r\n\r\nqgdata为回测默认数据源，支持A股日线、分钟线、周线行情查询，无需启动本地客户端，跨平台可用。\r\n\r\n1. 安装qgdata：`pip install qgdata`\r\n2. 获取token：访问 [**quantgo.ai/data**](https://quantgo.ai/data) 注册获取数据服务token\r\n3. 在VeighNa Trader的【全局配置】处进行数据服务配置：\r\n    * datafeed.name：qg\r\n    * datafeed.username：留空\r\n    * datafeed.password：填写您的qgdata token（请勿将token提交到版本控制）\r\n4. 支持的数据周期：1分钟(MINUTE)、1小时(HOUR)、日线(DAILY)、周线(WEEKLY)\r\n5. 支持的市场：**仅A股** — 上交所(SSE)、深交所(SZSE)、北交所(BSE)\r\n6. 注意事项：\r\n    * qgdata暂不支持Tick数据，如需Tick请切换至迅投研(XT)数据源\r\n    * 期货/期权市场（CFFEX/SHFE/DCE/CZCE/INE/GFEX）不在qgdata覆盖范围，请使用迅投研(XT)数据源\r\n\r\n若需切换数据源，修改 `vnpy_xt/__init__.py` 中的导入：\r\n```python\r\n# 切换为迅投研数据源\r\nfrom .xt_datafeed import XtDatafeed as Datafeed\r\n# 切换为qgdata数据源（默认）\r\n# from .qg_datafeed import QgDatafeed as Datafeed\r\n```\r\n\r\n### 迅投研(XT)数据源连接\r\n\r\n**Token连接**\r\n\r\n- 请使用官方版本\r\n\r\n**客户端连接**\r\n\r\n- 请使用官方版本\r\n\r\n**券商miniQMT连接**\r\n\r\n1. 连接请先登录迅投极速交易终端，同时确保xtquant模块可以正常加载（点击【下载Python库】-【Python库下载】，下载完成后拷贝\"Python库路径\"下Lib\\site-packages文件夹中的xtquant包到自己使用的Python环境的site_packages文件夹下）。\r\n2. 在VeighNa Trader的【全局配置】处进行数据服务配置：\r\n    * datafeed.name：xt\r\n    * datafeed.username：client\r\n    * datafeed.password：留空\r\n3. 连接XT中配置：\r\n    * token：留空\r\n    * QMT路径：C:\\国金QMT交易端模拟\r\n    * 资金账户：填写您在券商开户的资金账号\r\n4. 请注意以客户端方式连接时，需要保持迅投客户端的运行。\r\n\r\n## OpenClaw 回测报告公网持久化（新增）\r\n\r\n在 `pipeline_orchestrator.py submit` 中，除短时 `monitor_url` 外，现可同时产出长期 `report_url`（静态报告）。\r\n\r\n### 环境变量\r\n\r\n- `MONITOR_PUBLIC_BASE`：短时监控页公网基址（可选，优先级最高）\r\n- `OPENCLAW_CONTROL_URL`：OpenClaw 会话入口地址（可选；当 `MONITOR_PUBLIC_BASE` 为空时，系统会自动从该地址推导监控公网基址）\r\n- `REPORT_PUBLIC_BASE`：长期静态报告公网基址（例如 `http://8.211.147.124/reports`）\r\n- `REPORT_PUBLIC_DIR`：静态报告落盘目录（默认 `backtests/public_reports`，需由 Nginx/Caddy 映射到 `REPORT_PUBLIC_BASE`）\r\n\r\n推荐做法（开源友好）：\r\n\r\n- 不在代码里写死任何机器 IP/路径；\r"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn73ayd2pc6dgzpyqhpanbgax58244zz\",\n  \"slug\": \"quant-strategy-assistant\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1776334984566\n}"},{"path":"references/apis/adj_factor.md","content":"# `adj_factor` 接口文档\n\n## 接口说明\n\n- 中文说明：复权因子\n- 动态方法：`pro.adj_factor(...)`\n- 默认时间字段：`trade_date`\n- 典型过滤参数：`trade_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ts_code`, `trade_date`, `adj_factor`\n\n## 调用示例\n\n```python\ndf = pro.adj_factor(\n    trade_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ts_code,trade_date,adj_factor\",\n    order_by=\"trade_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```"},{"path":"references/apis/anns_d.md","content":"# `anns_d` 接口文档\n\n## 接口说明\n\n- 中文说明：上市公司全量公告\n- 动态方法：`pro.anns_d(...)`\n- 默认时间字段：无\n- 典型过滤参数：`ann_date`(必填), `start_date`(必填), `end_date`\n- 主要字段：`ann_date`, `ts_code`, `name`, `title`, `url`, `rec_time`\n\n## 调用示例\n\n```python\ndf = pro.anns_d(\n    ann_date=\"\",\n    start_date=\"\",\n    end_date=\"\",\n    fields=\"ann_date,ts_code,name,title,url,rec_time\",\n    order_by=\"ann_date\",\n    sort=\"desc\",\n    limit=50,\n)\n```\n\n## 备注\n\n该接口当前未启用，原因：抱歉，您没有接口访问权限。"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。 Skill: 量化策略助手 Owner: listolany Summary: 量化策略助手：自然语言→策略生成→回测→优化→QMT模拟/实盘。三轮交互闭环。 Tags: latest:1.0.2 Version history: v1.0.2 | 2026-04-16T10:23:04.566Z | auto quant-strategy-assistant 1.0.2 - Initial public release with full OpenClaw three-round interactive workflow for quant strategy development. - Added 175 files, including backtest orchestrator, data capability guard, and extensive QGDATA API documentation. - Suppor","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":821,"uniquenessScore":57,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T22:28:42.697Z","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-10T22:28:42.697Z","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-11T00:32:04.866Z","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"}]}}}