Agent Lab 策略研究指南
重要声明:策引是个人开发的投资策略分析工具和教育平台,通过模拟组合展示交易规则、仓位变化与历史表现。平台不提供投资建议,所有策略分析仅供研究参考。真实账户中的决策与风险由用户自行判断和承担。
一个研究问题的完整流程
研究问题 → 假设 → 基线 → 解析符号 → 构建完整配置 → 校验 → 修复 → 创建 → 轮询 → 读取证据 → 对照假设 → 记录局限 → 受控下一步
完整的实验配置
一次实验用一个完整配置。strategy_definition 只是其中的一部分:
{
"name": "QQQ 长期趋势实验",
"description": "测试 200 日均线过滤是否改善长期持有表现",
"symbols": [
{ "symbol": "QQQ" }
],
"start_date": "2015-01-01",
"end_date": "2025-12-31",
"currency": "USD",
"market": "US",
"commission": 0,
"strategy_definition": {
"...": "标准 Strategy DSL"
}
}
概念结构:
Lab Portfolio Config
|
+-- 研究元数据
| +-- name
| +-- description
|
+-- 标的范围
| +-- symbols(1–10 个,来自 resolve_symbols)
|
+-- 市场上下文
| +-- market
| +-- currency
|
+-- 回测窗口
| +-- start_date
| +-- end_date
|
+-- 执行假设
| +-- commission
| +-- update_time(可选)
|
+-- strategy_definition
+-- 标准 Strategy DSL(指标、信号、资金规则)
不要手写这些字段:code / test_code / job_id / is_official / created_at / updated_at / last_data_update_at / update_status / 正式组合归属与订阅字段。它们由服务端或其它产品域产生。idempotency_key 是 create_lab_run 的工具参数,不在配置里。
四个工具语义
resolve_symbols
{ "symbols": ["QQQ"], "market": "US", "currency": "USD" }
- 返回策引注册表的规范符号,是符号身份的服务端真值;
- 构建配置前、符号身份不确定时使用;不要凭模型记忆猜 ticker / 别名;
- 无法解析或歧义会结构化返回,便于修复请求。
validate_strategy_config
- 用与创建完全相同的准备路径校验完整配置;
- 不创建实验、不持久化任何东西;
valid: true表示当前产品契约支持并可执行,不等于赚钱、稳健或推荐。
create_lab_run
- 服务端会再次校验;
- 传入
idempotency_key(1–120 字符)让创建幂等; - 成功返回高熵
test_码 +status: PENDING+lab_url(/lab/{test_code},不是/portfolios/{test_code}); - 请求级失败(校验、幂等冲突、限流、队列繁忙)可能意味着没有创建实验,不要把工具错误当研究结果。
get_lab_run
PENDING 排队中或执行中(瞬时状态)
READY 实验完成并产出要求产物(持久,来自稳定 manifest)
FAILED 实验未能完成(持久,含结构化失败信息)
READY/FAILED来自 R2 终端 manifest,稳定可重读;- 没有 RUNNING 状态;
READY时包含 config / summary,以及可用时的 evidence(并非每次都有);FAILED时附带 code / message / retryable / context / suggestion。
READY != 好策略:实验完整跑完并产出产物,策略历史表现差也照样 READY
FAILED != 假设被证伪:实验本身没跑完,不能推出投资结论
幂等
- 同一
idempotency_key+ 同一请求 → 返回原始实验; - 同一 key + 不同请求 →
IDEMPOTENCY_CONFLICT; - 创建中重试 →
IDEMPOTENCY_IN_PROGRESS/ 预留不可用(稍后重试)。
请求级失败 vs 实验 FAILED
| 类型 | 例子 | 含义 |
|---|---|---|
| 请求/工具失败 | 配置无效、幂等冲突、限流、队列繁忙、会话过期 | 可能没有创建实验,修复请求后重试 |
| 实验状态 FAILED | manifest 里 error.code | 实验确实存在但未能完成 |
错误修复
请求级错误(先修请求再重试):
RATE_LIMITED 每个会员每 10 分钟最多 2 个新实验,稍后再试
LAB_BUSY 队列满,稍后重试
IDEMPOTENCY_CONFLICT 换新 idempotency_key(或复用原请求)
SESSION_INVALID_OR_EXPIRED 重新创建会话
实验 FAILED(manifest 结构化错误,示例):
{
"status": "FAILED",
"error": {
"code": "MISSING_SESSION_BAR",
"message": "...",
"retryable": false,
"context": { "symbol": "...", "session_date": "..." },
"suggestion": "..."
}
}
修复思路:只改坏掉的那部分,再 validate_strategy_config,通过后再创建。
阅读结果
- 回测 ≠ 预测;CAGR / Sharpe 要和最大回撤、换手、交易次数、样本量一起看;
- 注意制度依赖(不同市场环境)、费用与现金暴露、数据/引擎/配置上下文;
rejected/inconclusive是合法研究结论;- 单一高历史收益不是稳健性的证据。
受控实验
假设 → 基线 → 证据 → 诊断 → 只改一个变量 → 下一个实验
避免"大规模扫参 → 挑历史赢家 → 当推荐"。不要教"找历史最高收益"。
成功端到端示例(真实运行记录)
用户请求:研究 QQQ 从 2015 年起的简单长期趋势策略。
研究问题:观察 SMA 50/200 金叉趋势规则在 2015–2025 QQQ 上的历史行为。
假设:趋势向上时持有、向下时持币,可以在该窗口获得正的风险调整后收益。
流程(Harness 用四个工具完成;以下是一次真实运行的记录,由 Pi + DeepSeek V4 Flash 按 prompt.md 引导完成):
resolve_symbols→{"resolved": [{"symbol": "QQQ", "name": "QQQ"}], "unresolved": []};- 构建完整配置并校验。下面是实际通过验证的完整配置(DSL 的
capital_strategy使用当前契约要求的name形态):
{
"name": "QQQ Long-Term SMA Trend (50/200 Golden Cross) 2015-2025",
"description": "Hypothesis: A simple long-term SMA trend-following rule (SMA50/200 golden cross) on QQQ from 2015 to 2025 produces positive risk-adjusted returns by staying in during uptrends and moving to cash during downtrends.",
"symbols": [{ "symbol": "QQQ" }],
"start_date": "2015-01-01",
"end_date": "2025-12-31",
"currency": "USD",
"market": "US",
"commission": 0,
"strategy_definition": {
"trade_strategy": {
"indicators": [
{ "id": "shortMA", "type": "SMA", "params": { "period": 50, "column": "Close" } },
{ "id": "longMA", "type": "SMA", "params": { "period": 200, "column": "Close" } }
],
"signals": [
{ "id": "buy_signal", "type": "Crossover", "params": { "mode": "simple" }, "inputs": [{ "ref": "shortMA" }, { "ref": "longMA" }] },
{ "id": "sell_signal", "type": "Crossunder", "params": { "mode": "simple" }, "inputs": [{ "ref": "shortMA" }, { "ref": "longMA" }] }
],
"outputs": { "buy_signal": "buy_signal", "sell_signal": "sell_signal" }
},
"capital_strategy": {
"name": "PercentCapitalStrategy",
"params": { "initial_capital": 100000, "percents": 100, "max_positions": 1 }
}
}
}
validate_strategy_config→valid: true(canonical 含完整 envelope);create_lab_run(带idempotency_key)→{"code": "test_d9885d...f110", "status": "PENDING", "lab_url": "/lab/test_d9885d..."};get_lab_run轮询:PENDING → READY;- 读取 summary:
CAGR 14.31% MaxDD -26.45% Sharpe 0.90 Calmar 0.54
volatility 17.2% total_trades 6(4 赢 / 1 亏 / 1 持有中) win_rate 66.7%
profit_loss_ratio 5.24 净值 4.71x
- evidence(
scope: time_series_signal_evidence):当前状态 H(持有中),含 data_quality / provenance / recent_action_events;2022 年度 -11.4%(同期 QQQ 约 -33%); - 解读与反证:规则把交易压到 6 笔、避开了 2022 大部分下跌;但 2020 年 3 月随大盘下跌后在接近底部卖出(2020-05 离场),是慢均线的典型弱点。单标的单窗口,不能外推;
- 下一步:只改一个变量(例如用 10 月均线价格过滤替代 50/200 交叉)跑下一个受控实验。
失败 → 修复端到端示例(真实记录)
场景 A(capital_strategy 形状错误,真实发生):配置里 capital_strategy 写成 {"type": "PercentCapitalStrategy", "id": "cap", ...} → validate_strategy_config 返回结构化错误:
Portfolio configuration validation failed: /strategy_definition must have required property 'capital_strategy'
Harness 下钻 schema 后发现当前契约要求 name 形态,改为:
{
"capital_strategy": {
"name": "PercentCapitalStrategy",
"params": { "initial_capital": 100000, "percents": 100, "max_positions": 1 }
}
}
→ 再校验 valid: true → 继续创建。只改了坏掉的那一部分。
场景 B(实验 FAILED):get_lab_run 返回 FAILED + 结构化错误(如 MISSING_SESSION_BAR)→ 按 suggestion 判断是否可修复;retryable: false 时停止,不把它当投资结论。
从实验到正式组合(未来产品边界)
当前 Agent Lab 不提供"从实验创建组合"动作,MVP 的 MCP 也不能创建/更新/订阅/发布正式组合。
如果未来产品提供该能力,语义必须是:
test_ 实验的配置与证据
-> 用户主动选择"从实验创建组合"
-> 正常正式校验 + 明确确认
-> 新建 custom_ 正式组合(原实验保持不变,不重命名/不修改 test_)
结果报告格式
假设
基线
实验改动
结果
证据
反证 / 局限
解读
下一步
避免:"这个策略最好""你应该买""保证""推荐配置"。回测是对历史行为的证据,不是推荐。
重要提醒:本文内容仅供研究参考,不构成投资建议。实验结果是历史模拟行为,不代表未来表现;请结合你的资金安排、已有持仓与可承受回撤,自行判断真实账户中的操作与风险。
开始使用:连接你的 Agent 或查看 Agent Lab 概览。