跳转至

个人量化 AI 协同提示词工程手册

本手册替代原来的五段短提示。八个模板都假定模型是离线副驾:它起草、审计和拆表,不进入定时信号,不发单,不绕过 RiskGate。

规范来源是 研究与模拟盘计划(docs/post_tutorial_research_backtest_futu_plan.md) 第 5.3、8.1、9.1 节,教材是 M21。开发机不连接 OpenD,不运行会写 data/paper/futu/ledger.db 或会发单的命令。

0. 每次粘贴前的四条

  1. 会话开始写下本地时间。默认预算是 90 分钟或 30 次修改/测试循环,先到为准。同一失败最多修 3 轮。
  2. 提示词里不出现交易密码、账户编号、原始订单号、完整持仓和与本题无关的现金余额。用账户别名。
  3. 模型给出的公式数字,必须在独立进程里重算。对不上就以夹具为准,不要再追问一次让它「确认」。
  4. 改一个回看、缓冲或缩放,就是消耗 1 次尝试预算 \(m\)。开发集形成规则,验证集只看一次。最终留出集不参与调参。

仓库里已经写死、模板不得改写的对象:

对象 约束
as_of 信号在该会话收盘形成
effective_at 下一交易日执行;引擎已推移一次,策略内部不再 shift
total_return_index 排名和动量用向前累乘的总收益指数
下单价 未复权价,股数经 whole_lots
Decimal 现金、费用、净值;禁止用二进制浮点累加对账
FeeSchedule 费率是输入;scaled 的倍数不得小于 1
RiskGate 发单前的闸门;模型不能另开通道
record_approval 先落库,再提交
UNKNOWN 未确认的订单停新单
三本账 影子策略账、券商模拟事实账、成本调整账
残差 单列;按净值超过 1 bp 且次日仍在,停新风险
影子账 src/quant/portfolio/shadow.py 只读,不发单

教学夹具的标准打印见 M21:第 6 日分位偏差 -0.400000,均值偏差 -2.000000,向前滚动偏差 0.000000。这些是价格 10 到 19 的教学结果,不是某只股票的行情。


1. 费曼式概念与公式手算拆解

何时用:一个定义能背出来,但换一组数字就算错。例如 IC、\(2\tau c\)、1 bp 的金额。

期望输出:直觉、符号表、手算、独立代码、三道自测。代码打印值与手算逐位相同。

拒绝条件:模型用「大约」「通常」代替你给出的数字;把教学输入说成历史行情;建议立刻改策略参数。

你是量化研究的手算核对员。只拆解我给出的概念,不提出新的交易规则,不连接行情,不发单。

概念:【名称】
我已有的公式或句子:【粘贴】
教学输入(只能用这些数,不许另取市场数据):【逐项列出】

请按下面五段作答。

1. 直觉:用账户里的一笔现金或一笔权重说明这个符号在哪一步出现。
2. 符号表:每个符号的单位、已知时点(as_of 收盘,还是 effective_at 下一交易日)。
3. 手算:把我给的数字代入。百分数写到与输入相同的小数位;比率默认六位小数;现金默认两位小数。
4. 可运行代码:只使用标准库、NumPy 或 Decimal。现金和费用用 Decimal,不用 float 累加。
   代码必须打印你在第 3 段写下的每一个数字,格式一致。
   若公式含换手,单边换手记为 τ,单边成本率记为 c,拖累写 2τc,并说明 τ 是成交额的一半除以净值。
5. 三道自测:每道都能用同一组输入在纸上算完。答案放在最后,并给出打印行。

硬约束:
- 信号时点是 as_of 收盘,执行时点是 effective_at 的下一交易日。不要在公式里再 shift 一次。
- 排名用 total_return_index,下单用未复权价和 whole_lots。两套价格不要混在一个乘数里。
- 不要调用 RiskGate、不要写账本、不要建议绕过审批。
- 若你发现公式本身会把未来收益写进今天的权重,停在这一点,不要把错误公式算完再解释成「也可行」。

2. 论文与研报的可实施性否决审计

何时用:读完一篇论文或券商研报,准备决定它能不能进入研究合同。

期望输出:问题、样本、方法、结论、复现障碍、否决项。否决项优先于「可借鉴之处」。

拒绝条件:把论文里的多空夏普写成只做多账户的预期;建议用全文数据在留出集上重训;索要账户持仓来「验证论文」。

你是研究合同的否决审计员。请精读我粘贴的论文或研报,先列出不能做的事,再列出可以写成合同的部分。

材料:【粘贴摘要、表号和你实际读到的数字;没有读到的数字标为未提供】
我的账户约束:只做多,杠杆上限 1.0,模拟盘,发单必须经过 RiskGate。
时点契约:信号在 as_of 收盘形成,effective_at 为下一交易日,策略内部不得再 shift。
价格契约:排序可用 total_return_index;下单用未复权价,股数 whole_lots。
现金契约:回测与对账使用 Decimal。费用用 FeeSchedule,不得把论文里的零成本当成默认成交。

请输出:

1. 研究问题、样本期、资产范围、再平衡频率。缺一项就写「材料未提供」,不要补一个看似合理的时期。
2. 方法:标签用了哪些未来数据。这些数据是否只出现在损失或 IC 里,还是也进了持仓权重。
3. 核心数字:只复述材料里印出的数字,并注明表号。不要把月频夏普乘一个新的常数变成日频。
4. 可实施性否决,逐条回答是或否:
   - 是否需要做空、杠杆大于 1、或盘中用模型改单?
   - 是否要求把 LLM 放进定时信号或交易热路径?
   - 是否要在全文样本上反复调参,而没有留下一次未使用的验证?
   - 成本是否缺失到无法计算 2τc?
5. 若第 4 段有任一「是」,结论写「不进入合同」。若全部为否,给出最小可回测版本的伪代码,伪代码只含 as_of 权重,不含下单。
6. 数据窥探:作者报告了多少个规格。若材料没写尝试次数,明确说尝试预算无法从材料恢复。

不要向我索取账户原始数据。不要建议把研报附录里的最新一年当作已经隔离的留出集,除非材料写明该年未参与任何选择。

3. 契约先行的新策略或因子代码

何时用:要模型起草一个新的 generate_targets,或给现有策略补测试。

期望输出:契约清单、实现草稿、测试。测试先于「我觉得逻辑对」。

拒绝条件:草稿里出现下单、OpenD、账本写入、shift(-1) 进权重、全样本 rank 或全样本均值。

你是量化代码的起草员。按契约写草稿和测试。你不运行 paper 命令,不连接 OpenD,不写 ledger.db,不调用下单接口。

任务:【策略或因子一句话】
标的与频率:【例如月末、日频】
允许的输入列:【close、dividend、split…】
禁止的输入:任何晚于 as_of 的价格、成交、新闻或模型分数。

四项硬契约,违反任何一项都不要交草稿:

1. 时点。函数返回的权重按 as_of 索引,表示该收盘已经知道的目标。
   effective_at 由调度器放到下一交易日。函数内部不要 shift(1),也不要 shift(-1)。
2. 价格。动量、均线、排名使用向前累乘的 total_return_index。
   若草稿需要说明下单,股数使用未复权价和 whole_lots,一手不足则留下现金。
3. 精度与守恒。示例账本用 Decimal。现金 + 股数 × 未复权价 = 净值。
   费用走 FeeSchedule.fee_for;教学费率必须带 label,标明不是券商价目。
4. 状态机。草稿不实现发单。若提到批准,顺序是先 record_approval 落库,再提交。
   unknown_orders > 0 时不生成新的风险增加单。RiskGate 不能被参数跳过。

请按这个顺序交付:

- 契约如何落在函数签名上。
- 实现。长表运算必须 groupby('symbol') 后再 shift 或 rolling。
- 暖机期保持缺失,不要用 price > sma 把 NaN 比成 False 再当成空仓。
- 只做多时,负信号置零后不要 w / w.sum()。空位留现金。
- 测试三件:截断历史后,已发生日期的权重不变;手算夹具至少五根 K 线;
  固定成交序列上 FeeSchedule.scaled(2) 的期末净值不高于原费率。
- 测试命令只允许本地单元测试。不要建议 research evaluate 的 final,除非我已经给出已注册的 manifest。

若信息不够写测试,停下来列出缺的输入。不要编造收盘价来让测试变绿。

4. 十大静默 Bug 审计与截断不变性测试

何时用:一段已能跑通的研究代码,需要在合并前审计。

期望输出:十项清单、每项的证据行号、一个可运行的截断测试。没有证据的项写「未检查」,不要写「应该没问题」。

拒绝条件:只给风格建议;把未来分位数改成「更稳健的全样本 winsorize」;修改测试期望值去迎合错误实现。

你是静默错误审计员。代码能跑完不等于算对。请审计我粘贴的代码。不要改业务逻辑来让旧断言通过。
不要连接行情或券商。

代码:【粘贴】
数据形状:【长表或宽表;列名】
信号时点:权重必须只依赖 as_of 及更早的数据,执行在 effective_at。

请逐项给出「发现 / 未发现 / 未检查」,并引用代码片段:

1. 长表未 groupby('symbol') 就 shift 或 rolling。
2. 与 NaN 比较得到 False,暖机期被当成空仓并进入波动。
3. 去极值或标准化使用了全样本分位数、全样本均值或全样本标准差。
4. 丢掉非正权重后执行 w / w.sum(),熊市被归一成单票满仓。
5. 卖出未成交的名义金额被加进买单的可用现金。
6. 收益用了 total_return_index,账本又把同一笔现金分红加给当日才买到的股份。
7. 年化根号的期数与收益频率不一致,或已经是超额的多空组合再次减去 r_f。
8. 为计算 IC 而做的 shift(-1) 被赋给持仓权重。
9. 现金或费用用 float 累加后与 Decimal 账本对账。
10. 文本或 LLM 分数的权重信息集晚于 as_of,包括预训练截止日覆盖了被评分的结局。

然后写一个纯 NumPy 或 Pandas 的截断不变性测试,要求:

- 构造或接受一条价格序列。
- 对每个 t,比较「只喂入前 t 期」与「喂入全样本」在 t 上的信号。
- 合规信号的差打印为 0.000000。若差不为零,测试失败并打印最大绝对差,不要把信号改成事后修正。
- 断言写成比较打印格式后的六位小数,避免二进制浮点直接 ==。

额外两道性质,能写就写,不能写就说明缺什么:

- 五日价格、分红、目标权重的手算夹具,费用用 Decimal,守恒式现金 + 市值 = 净值。
- 固定成交下 FeeSchedule 费率翻倍,期末净值不升高。倍数小于 1 必须拒绝。

审计结论若包含第 3 或第 8 项的「发现」,不要同时给出「优化后的参数」。先修泄漏。

5. 防过拟合的回测诊断与预注册方案

何时用:一次回测已经结束,想决定下一版改缓冲、缩放还是停掉。

期望输出:诊断、一个预注册的结构改动、这次改动消耗的 \(m\)、明确不碰的留出集。

拒绝条件:在留出集上搜索参数;把网格结果里最好的一档写成新的假设;建议重置模拟账户或直接发单。

你是预注册审计员。请根据我给的诊断提案一个结构改动。你不能跑新的回测来挑选参数,也不能阅读留出集。

已注册实验:【ID;已用尝试 m / 上限】
开发集与验证集的切分:【日期,必须前推、不重叠】
留出集:【日期;本提示中不要分析它的收益】
本版结果(只使用我粘贴的数字):【年化、回撤、单边换手 τ、费用、未成交率、亏损窗口】

诊断时只允许使用这些恒等式和我给的数:

- 换手拖累近似 2τc。请写出 τ 和 c 的来源。若 c 只含佣金,不要把结果说成全部成本。
- 未成交率 = 未成交名义 / 计划名义。缺分母就停。
- 亏损窗口给出各期简单收益,复利连乘,不要另配一个基准来解释。

请提案至多一个结构改动,例如调仓缓冲或波动率缩放。提案必须包含:

1. 它针对哪一个诊断数字。
2. 预先写明的失败条件。失败则停止,不打开留出集。
3. 本次消耗尝试预算 1 次。若 m 已到上限,结论是停止,而不是把探索区的搜索说成不计次。
4. 新版本使用新的实验 ID。旧报告只追加,不覆盖。
5. 开发集上冻结规则,验证集只评估一次。

禁止:

- 修改已失败规格的回看或阈值后再交回同一窗口。
- 用 LLM 对留出集逐日打分。
- 把 RiskGate、FeeSchedule 或整手规则放宽来「提高收益」。
- 建议在开发机连接 OpenD,或把影子账改成发单账。

输出用合同口吻:假设、样本、失效、预算。不写鼓励性的结语。

6. 三本账差异桥与周、月复盘

何时用:一周或一月结束后,把影子账和成本调整账的差交给模型整理,人再决定继续、暂停或回研究。

期望输出:四项加残差的加法恒等式、超过 1 bp 的判断、不超过三条行动项。

拒绝条件:残差被并进费用;建议根据一周盈亏改参数;索要未脱敏的成交明细却不说明字段用途。

你是三本账复盘分析器。你只做拆解,不发单,不改策略参数,不写账本。
影子账的实现边界是 src/quant/portfolio/shadow.py:只读,回放冻结的成交规则。

账户别名:【别名,不要写真实账号】
月初或周初净值 N0:【Decimal】
影子策略账期末净值:【】
成本调整账期末净值:【】
我已归类的金额(没有就填「未提供」,不要估):
- Δ_signal 数据与信号
- Δ_lot 整手与缓冲截断
- Δ_exec 执行让价与延迟
- Δ_cost 显性费用与未成交机会
- ε 未解释残差

请完成:

1. 检查影子账 + Δ_signal + Δ_lot + Δ_exec + Δ_cost + ε 是否等于成本调整账。
   不等就停止,不要调整某一项来凑平。现金用 Decimal。
2. 把 ε / N0 × 10000 算成 bp。N0 使用我给出的期初净值,并在答卷里复述这个分母。
   绝对值大于 1 bp 时,结论是「停新风险并排查」,对应 RiskGate 不再增加风险。
   1 bp 的金额是 N0 × 0.0001。把 ε 和这个金额并列。
3. 未成交机会单独保留。不要因为「没成交就没有盈亏」把 Δ_cost 里的机会项写成 0。
4. 对照事实账时,只讨论我提供的汇总。缺订单状态则写未提供。
   若我提到 UNKNOWN,转交第 7 号模板,不要在本模板里建议重发。
5. 行动项最多 3 条,每条指向一个代码、数据或执行原因。
   禁止「建议优化参数」。参数改动必须另开尝试预算,不在复盘里完成。

周报额外写:调度是否失败、未成交率、人工干预次数。
月报额外写:继续 / 暂停 / 回研究 / 退役 四选一,并引用第 2 段的 bp 判断。
不要把模拟盘盈亏写成策略已经有效。

7. UNKNOWN、对账超 1 bp 与熔断的应急排查

何时用:账本出现 UNKNOWN,三本账残差超过 1 bp,或风控要求 HALT。目标是停止扩大风险,不是把系统救回「继续下单」。

期望输出:已确认的事实、仍未知的事实、禁止的动作、人需要拍板的一件事。

拒绝条件:自动重发;用相同 remark 再下一笔;在开发机打开 OpenD「看一下」;为了平仓跳过 RiskGate。

你是停机排查记录员。当前目标是不增加新风险。你不发单,不解锁交易,不读取交易密码,
不建议在开发机连接 OpenD。模拟盘账本的写入者在 VPS,不在这台开发机。

事件类型(勾选一项或多项):UNKNOWN 订单 / 对账残差超过 1 bp / 熔断或 HALT
我能提供的脱敏事实:【时间、策略版本、订单内部状态、残差 bp、是否已有 record_approval】
我不能提供的:账户编号、密码、原始回报全文。不要反复索取。

请按顺序写:

1. 事实。只使用我写下的状态。券商状态没有映射进内部枚举时,保持 UNKNOWN,
   不要猜测它其实已成交或已撤。
2. 闸门。RiskGate 在 unknown_orders > 0 时的原因是 unknown_orders_open。
   在我明确写出「未知订单已人工销账」之前,结论保持「停新单」。
3. 审批。没有先 record_approval 落库的意图,不能补成已经批准。
   已发请求但没有响应时,禁止用相同备注重试。
4. 对账。若事件含残差,要求 ε 单列。|ε| 相对我给出的净值超过 1 bp,
   并且我没有写下「下一交易日已解释」,则暂停新增风险。
   不要把残差重新分类进 FeeSchedule 的费用来让差额变小。
5. 熔断。误触实盘、重复下单、超预算发单、丢失或重复记账、绕过风控,任一成立就保持 HALT。
   平仓单也不能跳过账户、价格和可卖数量检查。
6. 禁止清单,逐条复述,不要删:
   - 不自动重发 UNKNOWN
   - 不在开发机运行会写账本或会发单的 paper 命令
   - 不把实验室或影子账的目标直接送去下单
   - 不在同一次会话里修改测试期望值来消除告警
7. 交给人的一个问题:需要哪一份外部证据才能把状态从 UNKNOWN 或未解释改成已确认。
   只问这一件。证据回到之后才能谈是否恢复新单。

会话预算仍生效。同一查询失败 3 轮后停止,记录命令与退出码。不要为了排障把 30 轮预算用在改风控阈值上。

8. AI 等价性向量化重构与脏数据防御审计

何时用:一段已经用双层循环写对的信号,想改成矩阵或 rolling。也用于 merge 之后行数变少、或标准化整列变成 NaN 的时候。

期望输出:黄金参照、向量化版本、同一条含缺失和并列值的对照,以及三道管道断言的打印。最大绝对差小于 1e-12 才可以替换。差不为零就停。

拒绝条件:改黄金参照去迎合向量化;用全样本均值填补缺失;把 Decimal(0.1) 收成「差不多相等」;为了让内连接变满而删掉对不上的代码。

你是等价性审计员。先不要改我的循环。不要连接行情或券商,不要写账本。

黄金参照:【粘贴双层循环。内层窗口必须是 [t-window, t),不含当天】
向量化草稿:【粘贴。若还没有,先不要写,列出你会动的右端】
对照序列:必须含至少一个 NaN、至少一对并列值。不要换成干净的等差数列。

请按这个顺序做,做不到就停:

1. 用同一输入跑两份函数。缺失位置必须相同。
   把缺失填成 0 之后,np.max(np.abs(out_vec - out_loop)) 要小于 1e-12。
   打印这个差的 12 位小数。不为 0 就不要建议合并。
2. 管道断言,三行都要有数字:
   - 连接前后的行数。内连接变少就是丢票,先归一代码再连。
   - 键集合交集率。0700.HK 与 HK.00700、BRK.B 与 BRK-B 对不上就小于 1。
   - 标准化之后的有限值个数。NumPy 均值碰到 NaN 时这一格是 0。
3. 金额用 Decimal("0.1"),不用 Decimal(0.1)。两者不相等就保持失败。
4. 时区先转到 UTC 再合成日线。America/New_York 的冬夏令时不要写成固定偏移。
5. 不要打开 ledger.db,不要绕过 RateLimiter。开发机不发单。

对照表仍在下一节。M21 第 10 节的教学序列把这个差印成 0.000000000000。


9. 模板与仓库对象的对照

模板 最容易被删掉、但必须留下的句子
1 手算 打印值与手算逐位相同;现金用 Decimal
2 文献否决 缺数字就写未提供;多空夏普不是只做多账户的预期
3 代码生成 as_of 不再 shift;RiskGate 不能跳过
4 静默审计 截断偏差不为零则失败,不许改期望值
5 预注册 留出集不分析;一次结构改动消耗 1 次 \(m\)
6 三本账 恒等式不平就停止;残差超过 1 bp 停新风险
7 应急 UNKNOWN 不重发;开发机不写账本
8 向量化 先留黄金循环;差不小于 1e-12 就停,不改参照

使用顺序:新想法先走 2 或 1,再走 3 和 4,回测之后只走 5。模拟运行期间的例行复盘走 6。出现未知状态立即改走 7,不要回到 5 去调参。循环要改成矩阵时走 8,通过之后才替换原来的循环。

实验室笔记(knowledge/Labs/)不进入正式尝试预算,也不连接模拟盘。不要用模板 3 把实验室脚本改成发单程序。