HoppyQuant
EN

第 1 课

买进以后,什么时候卖?

在同一批买入事件上比较少量退出方案,并按事前标准选择和冻结卖出规则。

蛙兄打开上一课留下的研究交接单。

买哪些、什么时候买,都已经写清楚了。只有卖出那一栏,还留着“暂定第十天”。

“我还是觉得有点随意。”他说,“如果第六天就开始不对劲了,也要硬等到第十天吗?”

蛙博士把文档往下翻了翻。

“那你准备怎么看出不对劲?”

“比如 MACD 开始往下走,或者成交量明显少了。总比光盯着日历强吧?”

这句话听起来挺有道理。

但我们已经知道,听起来有道理,还需要下一步:试一试。

这次,买入规则不动。我们只换卖法,看看结果会不会更好。

上次问买不买,这次问什么时候卖

上一课的筛选器,像是在买入名单上打勾。

符合条件的九拍留下,不符合的跳过。留下来的事件,仍然是在数字 9 收盘确认后,下一根有效 K 线开盘进入。

这次不同。我们已经决定参与这些事件,不再把它们筛掉。

假设同一笔交易都是周一开盘买入:一种卖法等到约定日期,另一种卖法则每天看一眼指标,条件出现就准备退出。

买入筛选器决定“这次买不买”,卖出规则决定“买了以后什么时候走”。

所以,这一课研究的是卖出规则,也可以叫“退出规则”。正文里,我们就直接说“卖法”。

蛙兄在买入前筛选候选事件,蛙博士在买入后沿时间线判断退出;买入筛选器与卖出规则各自回答不同问题。
图 1|买入筛选器决定“买不买”,卖出规则决定“什么时候卖”。

不看日历,还能看什么?

我们先试两个熟悉的指标,不急着塞进更多花样。

第一个是 MACD 柱。

之前,我们用它观察九拍完成时有没有开始改善。这次换个问题:买入之后,如果柱值开始回落,是不是可以考虑结束这笔交易?

为了能动手测试,我们把“回落”说得简单一点:今天的柱值,严格小于前一根的柱值。

注意,这里比较的是数值,不是柱子在图上看着长不长。例如,从 -0.1 变成 -0.2,数值也是下降。

第二个是相对成交量。

如果一只股票此前二十根 K 线的平均成交量是 100 万股,今天只有 70 万股,那么今天的相对成交量就是 0.7,相当于平时的七成。

我们的猜想是:买入后,如果成交量缩到平时的八成以下,就准备退出,会不会更合适?

缩量不代表接下来一定跌,MACD 回落也不是卖出的命令。它们只是我们准备交给数据检查的两个想法。

卖法不能只说一半

“MACD 回落就卖”,听起来很明确,其实还漏了两句话。

从什么时候开始看?如果一直没回落呢?

这一课把它们补齐:

卖法什么时候卖一直没等到条件怎么办
固定十根买入当天算第 1 根,第 10 根有效 K 线收盘退出到期退出,不等待指标
看 MACD从买入当天收盘开始看;柱值首次低于前一根后,下一根开盘退出最晚第 20 根收盘退出
看量能从买入当天收盘开始看;相对成交量首次低于 0.8 后,下一根开盘退出最晚第 20 根收盘退出

卖出时间按这只股票实际有行情的 K 线根数来算,不是日历上往后数十天、二十天。后面说的“十根退出”,就是买入当天算第 1 根,在第 10 根有效日 K 收盘卖出。

为什么看到条件以后,要等下一根开盘?

因为我们用了当天完整的收盘价或成交量。等这些信息到齐,当天已经收盘了,不能假装自己提前知道结果,又按这个收盘价卖掉。

例如,买入后的第 6 根 K 线收盘时,MACD 柱第一次回落,我们就在第 7 根开盘退出。它也可能在买入当天就回落,那就下一根开盘退出,不必等满十根。

如果第 19 根收盘才触发,就第 20 根开盘退出;如果始终没有触发,才用第 20 根收盘兜底。

二十根在这里是最长等待期限,不是在重新比较“固定二十根卖出”。 有了这个上限,AI 才不会把一笔一直没等到条件的交易无限期留在那里。

同一个买入时点之后,分别示意第十根收盘退出、指标第六根收盘触发后第七根开盘退出,以及未触发时第二十根收盘兜底。
图 2|三种卖法共享同一个买入时点,但触发与执行时点不同。

先把你的想法告诉 AI

打开之前的研究项目,让 Codex 读一读你保存的买入交接单。使用 WorkBuddy 也可以。

如果这是一个新对话,先告诉它交接单放在哪里。AI 不需要记得我们前面的聊天,但需要拿到项目里真实留下的记录。

你可以从这样一段话开始:

交给 AI 研究助手

请先读取当前项目已保存的买入规则、数据位置和实验记录,用几句话告诉我:目前买哪些事件、什么时候买、原来怎样计算十根收益。如果找不到交接单,请让我提供,不要猜测我的选择。

我想保持买入不变,以固定十根有效 K 线收盘退出为对照,分别尝试“MACD 柱回落后退出”和“相对成交量低于 0.8 后退出”。两种指标方案分开测试,不叠加。先别计算,请用大白话和一个简单例子,帮我说清:从何时观察、什么情况触发、什么时候实际卖、一直没有触发怎么办。

暂时不要改变买入规则,不加入资金和成本,不读取或计算 2023 年的价格、指标、信号或收益。

接下来,你可以继续追问。

比如:“我本来以为 MACD 要跌到零以下才算回落,我们说的是不是同一种情况?”

或者:“缩量以后也可能继续涨,为什么我们还要试这个卖法?”

这些对话不是绕远路。它们正是在帮你把“我觉得这样卖会更好”,变成一条双方都理解的规则。

如果你想使用另一种定义,也可以。但要先记录成自己的版本,再运行。不要看过结果以后悄悄换个阈值,却仍然叫它同一次实验。

如果你想跟随课程,直接使用文末的完整参考任务。它把本课的三个方案写清楚了,可以整段交给 AI,不需要自己拼公式。

动手以前,先约定怎么比

我们这次不需要一个资金账户,只把每次买入单独拿出来,分别试三种卖法。

但三种卖法得比较同一批事件。

两种指标方案最多可能等二十根。如果研究期已经结束,后面凑不齐二十根,就不把这次事件放进主比较。十根方案也要使用同一批名单,不能一边多算几次,一边少算几次。

这只是回看历史时,为了公平比较做的样本约定,不是买入当天能预知未来行情是否齐全的筛选器。

我们还提前定一个简单标准:新卖法的收益中位数至少比十根方案高 0.20 个百分点,平均收益和正收益比例都不能下降,才考虑换过去。还要一起看持有多久,不能只看收益数字。

这不是市场通用标准,只是本次实验约好的选择方法。没有方案通过,就保留十根,不为了换方案而换方案。

规则说清楚以后,就让 AI 实际运行,生成结果摘要和一张对比图。代码怎么组织、缺什么依赖,可以交给它处理;你要关心的是,它有没有按你同意的规则在做。

我们跑出来的结果:没有换掉十根

课程参考路线继续使用 PY-10“出行网络”行业的下行九拍,信号确认后的下一根开盘进入,只看 2021—2022 年。

上一课有 151 次完整十根事件。这次其中 1 次在研究期内凑不齐二十根,于是三种卖法统一比较剩下的 150 次事件,覆盖 22 家公司。

这意味着十根结果也要重新算。它的平均收益四舍五入后仍是 2.71%,但中位数从上一课的 1.93% 变成了 1.71%,正收益比例也变了。不是改了算法,而是少了一个样本。

卖法平均收益收益中位数正收益比例平均持有根数
固定十根2.71%1.71%62.00%10.00
MACD 柱回落后退出1.80%-0.06%47.33%6.89
相对成交量低于八成后退出0.83%0.33%52.67%3.59

这些数字来自虚构教学数据,描述的是每次事件的结果,不是账户收益,也不构成投资建议。

相同的150次事件中,十根、MACD和量能三种卖法的收益与持有时长对比;两种指标卖法本次没有改善结果。
图 3|同一批事件下,两个指标卖法没有改善十根退出的结果。

蛙兄看完表格,有点不甘心。

“我还以为加了指标,会比到日子就卖更聪明。”

这次数据没有支持他的预期。

MACD 方案平均持有约七根,比十根短,但平均收益、中位数和正收益比例都下降了。中位数接近零且略为负数,也提醒我们,不能只盯着 1.80% 的平均值。

量能方案离场更早,平均只拿了约三根半,持有时长的中位数甚至只有两根。也就是说,至少一半的事件在买入后的下一根开盘就退出了。

这不一定是程序着急了,而是我们把退出条件定义成“缩到八成以下”,它在这些事件里很快就出现了。

两种卖法都没有通过我们约定的改善标准。因此,在这三个方案之间,课程继续保留固定十根退出。

别只问 AI 谁赢了,也问它具体怎么卖的

汇总表告诉我们大致情况,一笔实际记录则能帮我们看见:规则究竟在什么时候生效。

例如,虚拟公司“飞泉出行”的一次事件:

  • 下行九拍在 2021 年 1 月 29 日收盘确认;
  • 2 月 1 日开盘买入;
  • 当天收盘时,相对成交量已经低于 0.8;
  • 所以 2 月 2 日开盘就按量能规则退出,事件收益约为 -0.39%。

它没有等到第十根。它的退出条件也不是“股价下跌”,而是我们事先写下的量能条件。

当然,也有一直等不到的。150 次量能实验中,有 2 次最后用到了第二十根收盘的兜底;MACD 实验则全部在上限以内触发了退出。

你不必照着课程挑同一笔,也不需要手算全部交易。可以直接追问 AI:

和 AI 一起验收

请从刚刚实际运行的结果中,找一笔较早触发的退出,再找一笔用到最长持有期限的退出;如果没有,就直接说没有。逐笔告诉我:哪天买入,哪天出现什么条件,当时已经知道哪些数据,最后哪天、按开盘价还是收盘价退出。请引用实际交易记录,不要编示意结果。

再检查三种卖法是否使用同一批事件,指标触发后是否确实等到下一根开盘。请把检查发现的问题与“规则收益不好”分开说明。

如果 AI 用收盘后才知道的指标,却按同一天收盘价卖出,那是实现与约定不一致,需要修。

如果时间都对,只是新卖法赚得更少,那就是实验结果,不是需要“修好”的程序错误。

没换方案,也不是白忙一场

这次,我们没有找到比十根更好的卖法。

但这不等于什么都没得到。原来只是猜“多看一个指标应该会更好”,现在我们知道:在这批事件和这两种定义下,没有看到改善。

这句话也别说过头。它不是“MACD 没用”,更不是“成交量没用”。我们只试了它们各自的一种用法,没有检查所有可能的定义。

你可以另开一份研究记录,继续探索自己的想法。但不用为了交出一个看起来更高级的方案,反复改到出现漂亮结果才肯停。

带走一句话

规则多加一条,收益不会自动多一分。试过以后保留原方案,也是一种有依据的决定。

如果你跟随课程,现在可以让 AI 把决定补进交接单:

保存退出规则交接单

请在当前买入规则不变的前提下,将本次三个退出方案的实际结果和选择理由另存到研究交接单中,保留所有旧实验。课程参考卖法继续采用:实际买入当天算第 1 根,在第 10 根有效日 K 的前复权收盘价退出。请不要将其他探索版本的候选自动当成这次选择,也不要把完整二十根的历史样本要求写成账户买入条件。尚未进行有限资金、成本和 2023 年留出验证,请一并注明。

如果你走的是自己的路线,就把其中的卖法换成你实际选定的版本。后续结果可以和课程不同,重要的是交接单与真实实验一致。

蛙兄把“固定十根”重新填回了卖出那一栏。

这一次,它不再只是一个随口接上的日期,而是和两种具体卖法比较之后,暂时保留下来的选择。

“那现在总能看看真正的账户会怎样了吧?”

快了。之前每次机会都单独算,钱从来没拦过路。接下来,如果账户里只有 100 点资金,还要支付买卖成本,就得先把钱怎样用、交易怎样执行说清楚。

那是下一课要补上的约定。


准备运行时,把完整任务交给 AI

不必背下面的公式。上面的解释帮你理解我们在问什么,下面这段负责把具体版本交给 AI。你也可以通过几轮对话逐步说清楚,再让 AI 整理;不要求一次就写出这么完整的任务。

需要实际运行?展开并复制完整参考任务

课程参考实验|可直接复制

请在当前项目中实际运行一轮退出规则比较,保存程序、逐事件记录、大白话摘要和一张三方案对比图。先读取已保存的九拍规则、合格公司名单、买入交接单及数据位置。缺少必要记录时请让我提供,不要自行拼出另一套九拍或资格规则。

先复述当前买入选择。如果不是下面的参考路线,请问我是继续自己的路线还是另建参考实验,不要覆盖已有选择。参考路线为:沿用已冻结的292家合格虚构公司,只保留 companies.parquet 中 industry_id = PY-10(出行网络)的完整下行九拍;数字9收盘确认,下一根该股有效日K的 adjusted_open 进入。只使用2021-01-04至2022-12-30的价格和指标。不要读取或计算2023年的价格、指标、信号、收益,不重做跨期资格筛选,不加入资金、手续费、滑点或指数对比。

买入当天计为第1根,所有日数按单股有效日K计数。只比较以下三种退出,彼此独立,不组合:

  1. 十根对照:第10根有效日K的 adjusted_close 退出。
  2. MACD退出:从买入第1根至第19根收盘逐根观察。柱值 H[t] < H[t-1] 首次成立后,下一根有效日K的 adjusted_open 退出;相等不触发,不要求零轴、金叉或先上涨再回落。MACD使用前复权收盘价:EMA12 = adjusted_close.ewm(span=12, adjust=False, min_periods=12).mean();EMA26 = adjusted_close.ewm(span=26, adjust=False, min_periods=26).mean();DIF = EMA12 - EMA26;DEA = DIF.ewm(span=9, adjust=False, min_periods=9).mean();H = DIF - DEA。沿研究期单股历史计算,不在每笔买入时重置。
  3. 量能退出:观察及执行时点同上,首次出现 R[t] < 0.8 后下一根开盘退出,等于0.8不触发。R[t]为当天 trading_volume_shares 除以此前20根有效日K的平均成交量,分母不含当天。

两种指标方案若一直没有触发,均在第20根收盘退出;第19根收盘触发时,第20根开盘退出优先。不要观察到第20根收盘才再决定按它的开盘价卖出。MACD两根柱无法比较,或量能历史不足、所需值缺失、分母不大于零时,当天记为不可判断,继续观察;不补数、不因此删除事件。买入前的触发不直接用于买入后的退出。

从冻结的买入事件出发,选择研究期内自买入开始拥有完整20根、这些根的所需开收盘价均有限且买入价大于零的共同样本,三种卖法全部使用同一批事件。报告原始事件数、旧十根样本数、共同样本数及排除原因;遇到零或负复权价格,先核对字段口径并说明,不自动改价。共同样本的十根结果要重新计算,不能沿用另一批样本的汇总。若不足100次事件、10家公司或50个信号完成日期,先报告覆盖情况,暂停选择,不读2023年来补齐。这些是历史对照的样本条件,不是实际买入条件。

每个事件独立计算 退出价 ÷ 买入价 - 1,允许同股或同日事件重叠记录,但不把它们宣称为统计上相互独立。保存买入与退出日期、价格、触发日期、退出原因、持有根数及收益。汇报三组事件数、平均收益、中位数、正收益比例、平均与中位持有根数;两种指标方案还要汇报触发退出和到期兜底各多少次、多少事件在实际观察路径中遇到指标不可判断。不要把事件收益当作账户收益,也不要机械年化。

选择标准是:相对共同样本的十根对照,中位数至少提高0.20个百分点,均值和正收益比例都不下降,才列为候选。用未四舍五入数值判断;两者都通过时先比中位数,再选平均持有较短者,再比正收益比例,最后仍并列则MACD优先。没有通过者就保留十根,不新增参数搜索,也不自动更改研究交接单中的最终选择。

请自行检查首次触发、下一根执行、相等不触发、指标缺失继续观察、第19根触发及第20根兜底等边界。实际运行后,用大白话解释结果,并报告程序核验是否通过。不要为了对上某个示例数字调整结果。到此停止,不运行账户或打开留出期。

如果结果看起来不对,可以直接追问:

结果异常时检查

请先检查程序是否忠实执行了我提供的三方案规则,尤其是买入名单、共同样本、指标定义和退出时点。给我指出最早出现差异的环节,并引用实际文件或交易记录。没有外部参考表时,不要假设自己知道课程数字;不要把收益不理想当作程序错误。若确认是实现问题,说明最小修复方案并按原规则重跑,保留原记录;如果本来就是我的自定义版本,请说明差异,不要强行改成参考版本。2023年继续封存。

课后讨论

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