HoppyQuant
EN

第 3 课

九拍后真的更容易反弹吗?

识别合格事件并与随机日期比较,检查九拍完成后的多个观察窗口发生了什么。

蛙兄把上一节留下的四句话抄在纸上,又打开了 AI。

“现在我已经知道九拍大概怎么数了。”

他把手放到键盘上。

“这次总能直接问它赚不赚钱了吧?”

蛙博士把一份更完整的规则说明放到旁边。

“可以开始实验了。不过在算收益以前,我们先看一眼它有没有把九拍数对。”

“还要检查代码?”

“不用。让 AI 自己检查代码,我们看它画出来的 K 线。”

这一次,你不需要亲自实现九拍算法,也不需要跟着一张长清单逐项操作。

我们只保留一次中途确认:

把完整任务交给 AI
→ AI 检查数据并找出九拍
→ 我们看几张 K 线抽查图
→ 确认没有明显数错
→ AI 继续计算收益并与随机日期比较
把完整规则交给 AI 后,我们只在 K 线抽查这里停一次,再继续计算收益。
图 1|完整交付规则后,只在 K 线抽查处暂停确认。

为什么要和随机日期比较?

动手以前,蛙兄先问了一句:

“如果九拍后的平均收益是正数,是不是就说明它有用?”

“先别急。”蛙博士说,“普通日期以后,也可能是正数。”

只看九拍自己,就像只问一个参加考试的人考了多少分,却不看这张卷子对其他人有多难。

随机日期对照要回答的是:

如果没有看到九拍,只是在同一只股票的其他普通日期进入,通常会得到什么结果?

我们还会重复抽取 1,000 轮。

因为只抽一次,很可能刚好抽到一把好签,也可能刚好倒霉。

多抽一些,才能看到“普通日期通常是什么水平”。

这里暂时不拿沪深300来比较。

随机日期回答的是“九拍日期有没有比普通日期更特别”;沪深300要到完整策略回测时,才负责回答“有限资金账户有没有跑赢市场基准”。这是两个不同问题。

换一段新对话,把说明书交完整

建议在实验室文件夹中开启一段新的 Codex 对话。

如果你无法使用 Codex,也可以使用 WorkBuddy。工具可以不同,我们要完成的研究不变。

为什么换新对话?

因为 AI 不会自动知道我们前面采用了哪一套九拍,也不应该靠几段模糊的聊天记忆拼出研究规则。

下面这段提示词比较长,但它主要是写给 AI 看的。

你不需要逐条背诵,也不需要先弄懂里面每一个技术细节。复制给 AI,让它负责安装缺少的分析依赖、编写程序、运行内部测试和整理输出即可。

直接交给 AI|完整任务说明

我准备使用当前项目中的 Hoppy 虚构教学数据,研究“完整下行九拍以后,价格是否比普通日期以后更容易上涨”。所有公司、代码和行情均为虚构教学材料,结果不构成任何现实投资建议。

请先查看当前项目结构。教学数据通常位于项目根目录的 hoppy-teaching-dataset 文件夹,其中应包含 README.md、data_dictionary.json、manifest.json、companies.parquet、stock_daily.parquet 和 hs300_daily.parquet。请以实际文件和字段为准;如缺少必要的 Python 分析包,请使用项目已有的 uv 环境安装,不要重建另一套无关环境。

整项研究采用以下固定规则:

  1. 核心研究只使用日线完整下行九拍。程序可以同时识别上行九拍,用于检查方向切换,但上行九拍不进入收益研究。
  2. 每只股票独立按 trade_date 升序排列,只按照该股票自己的有效 K 线顺序计数。九拍比较使用前复权收盘价 adjusted_close。
  3. 设当前有效 K 线为 t:C[t] > C[t-4] 满足上涨条件,C[t] < C[t-4] 满足下跌条件,完全相等则没有方向。历史不足 4 根更早有效 K 线时不计数。
  4. 同方向条件连续出现时从 1 递增。未完成序列遇到相反方向时,旧序列立即结束,当天直接成为相反方向数字 1;遇到相等时,旧序列结束并重新等待。
  5. 数到 9 后形成一次完整九拍并进入锁定。继续满足原方向时不显示 10、11,也不立即开始新的同方向序列。遇到相等则解除锁定并等待;遇到相反方向则解除锁定,当天成为相反方向数字 1。
  6. 某个市场交易日没有该股票的日 K 时,不创建占位 K 线,也不因为这个空位主动中断序列;恢复数据后继续按照有效 K 线顺序比较。
  7. 使用 hs300_daily.parquet 的日期作为课程市场交易日历。数据体检可以检查 2021-01-04 至 2023-12-29 的公司和日期是否存在,但不得读取或使用 2023 年价格方向、九拍信号和收益。如果一只股票出现单次连续缺口严格超过 15 个市场交易日,在识别信号前排除整只股票。刚好 15 日不触发,16 日才触发。
  8. 九拍信号只使用 2021-01-04 至 2022-12-30 的规则研究期识别。2023-01-03 至 2023-12-29 是最终留出期,在完整买卖规则冻结以前,不计算或透露其中的价格方向、九拍信号和收益。
  9. 数字 9 所在交易日收盘后,信号才算确认。未来收益以下一根有效 K 线的 adjusted_open 作为观察起点。从这根进入日 K 线算作第 1 根,分别使用第 3、5、10、20 根有效 K 线的 adjusted_close 作为观察终点。收益等于“终点收盘价 ÷ 起点开盘价 - 1”。未来数据不足的事件不进入对应窗口,但可以进入更短的完整窗口。
  10. 随机日期对照必须来自同一只股票和同一研究期,只从拥有完整未来窗口的有效日期中抽取,并排除真实下行九拍完成日。把随机日期视为普通的“信号完成日”,同样以下一根有效 K 线开盘作为起点,并使用相同窗口终点计算收益。某只股票在某个窗口有多少次合格九拍事件,每轮就为该股票抽取多少个随机日期;同一轮、同一股票内不重复抽取。每个窗口独立运行 1,000 轮,并记录实际使用的随机数工具和种子,保证同一套程序可以重复运行。课程参考程序使用 NumPy 的 default_rng,基础种子为 20260903,各窗口使用“基础种子 + 窗口天数”;如果你采用了其他可复现实现,不要为了迎合课程小数而强行改写结果。
  11. 10 日是事先指定的主要观察窗口。第一版弱规律门槛是:真实九拍的 10 日平均收益高于随机实验平均收益的 95% 分位,并且高于随机实验中位数。无论是否达到门槛,都不得写成“九拍已经被证明有效”或现实买入建议。

请把工作分成两个阶段。本次只完成第一阶段,完成后必须停下来等我确认:

  • 查看数据文件和字段,完成数据体检;
  • 使用人为构造的简单价格序列,自行检查 t-4、相等中断、方向切换、数到 9 后锁定和缺口续接;
  • 在规则研究期识别完整上涨与下行九拍;
  • 汇报初始公司数、排除数量与原因、最终公司数、上涨与下行九拍数量;
  • 从真实教学数据中抽取几段有代表性的信号,绘制带有数字 1 至 9 的 K 线抽查图,尽量覆盖普通完成、完成后锁定、方向切换和跨缺口计数;
  • 保存一份大白话校验摘要和 PNG 抽查图,并告诉我文件位置。

第一阶段不要计算任何事件收益,不要运行随机日期对照,不要使用沪深300作为收益基准,不要加入 MACD、成交量、市值、行业、仓位、手续费或滑点,也不要读取和透露 2023 年价格、信号或收益。

你可以自行决定程序结构和文件名,也可以自行完成必要的内部检查。不要把程序代码当成主要交付物。完成后请用大白话说明“检查了什么、发现了什么、哪些内容还没有做”,然后停下来等我查看 K 线样本。

为什么课程把规则一次说完?

这里一次性把完整规则交给 AI,是为了让不同读者尽量从同一套起点完成教学实验,并不代表真实研究也必须依靠一条超长提示词开工。

当你研究自己的想法时,完全可以先用大白话提出一个不成熟的猜想,再通过多轮对话,让 AI 帮你发现其中的模糊之处,逐步补齐数据、时间、比较对象和计算口径。真正重要的不是“一次就把话说完”,而是正式计算以前,把最后商量好的规则整理成一个明确版本并冻结下来。看到结果以后如果想改规则,应当开启下一版研究,而不是悄悄改写原来的实验。

这份说明书很长,不代表你需要成为九拍专家。

它更像是寄快递时贴在箱子上的完整地址:收件人需要看全,寄件人不需要把邮编背下来。

第一次暂停:只看它有没有数对

AI 会自己完成数据检查、内部测试和信号识别。

我们不需要逐行阅读它写出的程序,只需要看两类汇报。

第一类是数字:

  • 最初读取了多少家虚构公司;
  • 有多少家公司因为长时间缺少数据被排除;
  • 最终使用了多少家公司;
  • 找到了多少次完整上行九拍和下行九拍。

第二类是图片。

AI 会从历史数据中抽出几段 K 线,把数字 1 到 9 标在对应位置上。

我们重点看:

  • 数字是否连续从 1 数到 9;
  • 每个数字是不是在和四步以前比较;
  • 数到 9 后,有没有冒出 10;
  • 图片有没有明显把上涨和下跌方向弄反。

如果看不出来,可以选其中一次,让 AI 把每个数字对应的日期、收盘价,以及四根以前用来比较的日期和收盘价列出来,再带你核对一遍。不必靠盯着图猜。

不需要检查两千多次信号。几张图不能证明所有信号都正确,但它能帮助我们发现最明显的理解错误。

程序从虚构教学数据中抽取的九拍样本,用来检查数字 1 至 9、完成锁定、跨缺口计数与方向。
图 2|用真实抽样 K 线检查计数、锁定、缺口与方向。

使用当前版本教学数据时,课程实验得到的是:

检查项目课程结果
初始虚构公司300 家
因连续缺口严格超过 15 日而排除8 家
最终合格公司292 家
完整下行九拍2,040 次
完整上行九拍1,561 次

这些数字是课程实验的校验结果,不是提示词里要求 AI 迎合的答案。

如果你使用的是同一个数据包和同一套规则,基础数量应该能够对上。如果明显不同,先查原因,不要要求 AI 直接把数字改成课程答案。

如果数量和样本图没有明显问题,只需要回复一句:

继续实验

这些 K 线样本看起来没有明显问题,请冻结刚刚得到的合格公司名单和九拍信号,不要修改已经确认的规则。现在继续计算 3、5、10、20 日事件收益,并按照原任务中的同股票随机日期规则分别运行 1,000 轮对照。

请汇报每个窗口的实际事件数、平均收益、中位数和正收益比例,同时汇报随机实验平均收益的中位数、5%—95% 区间,以及真实结果在随机实验中的位置。请生成一张容易阅读的对比图,并保存一份大白话研究摘要。

这一阶段仍然不要读取或透露 2023 年价格、信号和收益,不要加入沪深300、MACD、成交量、市值、行业、仓位、手续费或滑点。完成后告诉我输出文件位置,并说明当前结果支持什么、还不能支持什么。

随机对照会从同一只股票的普通候选日期中重复抽取 1,000 轮,再与九拍日期比较。
图 3|同股票随机日期重复抽样,再与九拍日期公平比较。

这次实验看见了什么?

使用课程数据和已经固定的规则,真实九拍与随机日期得到下面这组结果:

观察窗口完整九拍事件九拍平均收益随机实验平均收益中位数随机实验的 5%—95% 区间
3 日2,016-0.02%0.20%0.01%—0.39%
5 日1,9940.26%0.32%0.07%—0.58%
10 日1,9081.35%0.60%0.23%—0.94%
20 日1,8861.68%1.25%0.76%—1.75%

不同窗口的事件数量略有差别,是因为靠近研究期末尾的一些九拍,没有足够的后续 K 线走完整个观察窗口。

最值得注意的是事先定下来的 10 日窗口:

  • 九拍事件平均收益是 1.35%;
  • 1,000 轮随机实验平均收益的中位数是 0.60%;
  • 随机实验中,95% 的结果不超过 0.94%;
  • 真实九拍的 1.35% 高于全部 1,000 轮随机结果。

按照实验开始以前定下的门槛,10 日窗口出现了一条值得继续检查的弱规律。

3 日、5 日和 20 日窗口没有通过同一门槛。

这里的真实九拍事件数量和收益来自固定数据与固定公式,不含随机抽签;使用同一数据包和规则时,这部分结果应该能够对上。

随机日期结果则允许出现合理的小幅差异。不同 AI 可能选择不同的随机数工具、候选排序或抽样实现,即使写下同一个种子,也不一定抽到完全相同的日期。我们真正要求的是:同一套程序重复运行时结果不乱跳,而且随机方法的小变化没有轻易把主要判断整个翻过来。

3、5、10、20 日九拍平均收益与随机实验结果对比,其中 10 日窗口最突出。
图 4|四个观察窗口中,事先选定的 10 日结果最突出。

好消息,但先别把它叫作策略

蛙兄盯着 1.35% 看了几秒。

“所以,下行九拍真的可以抄底?”

蛙博士摇了摇头。

“我们现在只知道,在这份虚构教学数据的研究期里,10 日结果比普通日期更突出。”

“这还不够吗?”

“它足够让我们继续研究,但不够让真钱上场。”

我们还没有认真回答:

  • 这个平均数是不是被少数暴涨样本拉高;
  • 大多数事件是不是也表现得更好;
  • 很多九拍会不会刚好挤在同一批市场日期;
  • 统计上的平均事件收益,离一套真正能执行的策略还有多远。

这些问题不适合挤在本章结尾匆匆回答。

下一节,我们会把这份“好消息”放到桌上,看看它为什么值得继续,却还不能叫作策略。

如果结果明显对不上

先别让 AI 重写答案,也不要把课程数字塞给它要求照抄。

可以直接发送这一段:

逃生提示词

我想检查刚刚完成的九拍实验有没有按照约定执行。请读取当前项目中实际使用的数据文件、程序和刚刚生成的摘要,但不要猜测任何外部参考答案,也不要为了让结果看起来更合理而修改规则。继续封存 2023 年价格、九拍信号和收益。

请从原始数据开始审计整条计算链,并按顺序汇报:实际读取的数据包、字段和日期范围;公司与日期数量;连续缺口严格超过 15 个市场交易日的排除过程;前复权字段;t-4 比较、相等中断、方向切换和完成后锁定;信号确认后的进入日;3/5/10/20 日窗口计数;各阶段实际留下的公司数、信号数、事件数和真实九拍收益。

然后单独检查随机日期部分:确认是否保持同股票、同数量、完整未来窗口、排除真实九拍完成日,以及同一股票内不重复;记录实际使用的随机数工具、候选日期排序方式和种子;把同一套程序连续运行两次,比较两次结果是否一致。

最后请输出一张审计表,至少包含“阶段、使用的规则、实际结果、是否发现异常、可能影响”。如果发现问题,请指出最早出现问题的阶段,并用大白话解释应该怎样修复;如果没有发现问题,也请明确说明随机结果的小幅变化是否足以改变当前判断。在我确认以前,不要修改程序和研究输出。

这个提示词不保证一句话解决所有问题。

它的作用是让 AI 审计自己实际做过的事情,返回最早可能跑偏的地方,而不是假装知道课程答案,再在终点附近反复修饰数字。

如果独立审计后仍然需要逐项对照,可以再把你看到的参考数字明确贴给 AI。顺序最好是先审计、后对照,避免 AI 一开始就朝着参考答案调整程序。

这一章真正完成了什么?

我们没有学会手写九拍程序,也没有得到一套可以买卖的策略。

我们完成的是另一件更重要的事:

把完整规则交给 AI
→ 确认 AI 找到的是我们定义的九拍
→ 让九拍日期与普通日期公平比较
→ 得到一条可以继续研究、但仍有边界的弱规律

AI 负责读取数据、实现算法、重复抽样和绘图。

你负责守住研究问题、确认关键样本,并决定结论能走多远。

带走一句话

在这份虚构教学数据中,下行九拍的 10 日结果比随机日期更突出,这让它值得继续研究;但“比随机日期好一点”还不是一套可以交易的策略。

课后讨论

留下你的问题、理解或不同意见,也看看其他学习者怎么想。