HoppyQuant
EN

第 3 课

如果只有 100 点资金,会跑成什么样?

让有限资金按冻结规则逐日运行,生成账户曲线、交易记录和可以回头检查的结果摘要。

蛙兄把账户规则卡翻到最后一行。

买什么,什么时候卖,钱不够怎么办,都写好了。

“这回总能看看最后剩多少钱了吧?”

“可以。”蛙博士说,“把规则交给 AI,让它跑一遍。”

蛙兄在输入框里写下:“帮我算算能赚多少。”

想了想,又补了一句:“亏了也照实说。”

这一次,我们终于要让那100点资金动起来了。不是拿真钱下单,而是让程序沿着历史日期,按约定模拟一次次买卖。

最后,不只要得到一句“赚了”或者“亏了”。我们还要拿到一张资金曲线、可以回头核对的交易记录,以及一份看得懂的结果摘要。

把已确认的规则交给AI,生成资金曲线、买卖记录和结果摘要,再核对执行
图 1|把冻结规则交给 AI,生成账户曲线、交易记录和结果摘要。

先让 AI 接上你的研究

打开之前的研究项目,继续使用 Codex;用 WorkBuddy 也可以。

不必把前面所有对话重新讲一遍。让 AI 先读已经保存的买卖规则和账户规则卡。如果换了新对话,把相关文件拖进去,或者告诉它放在哪里。

课程参考路线仍然是:只考虑 PY-10“出行网络”教学行业的下行九拍,完成后下一根有效日 K 开盘买入,买入当天算第一根,第十根收盘退出。每个账户100点,一次只持有一家。

注意,这里的“持有十根”按单只股票的有效日 K 数;下面安排账户出发的间隔,则按市场交易日数。它们管的是两件不同的事。

如果你前面保留了自己的筛选器或卖法,也可以继续使用。先让 AI 说清它准备执行哪一版,别让它不声不响地把你的选择换掉。

还有一件事,需要先接着上一课交代清楚。

那十个账户,这次怎样出发?

上一课,我们约定每隔两个市场交易日启动一个账户。

课程实验真的跑了一遍,却出现了一个有点好笑的场面:十个账户虽然先后到场,却一直没等到可以买的机会。等第一笔机会来了,十位已经全到了,于是一起买入,后面也走了同一条路线。

这不是程序把十份结果复制粘贴了。

保留这轮记录后,我们又追加了一轮实验:每隔十个市场交易日启动一个账户,也就是偏移0、10、20……90个交易日。除出发安排外,其余规则都不变,也没有接着试到出现十条不同的曲线为止。

这是看到首轮结果后追加的探索,不是把原来的检查改写成另一份结果。

下面展示的是这轮追加实验。你可以直接按这个安排做,不必为了跟课把两日版本重跑一次;已经跑过的结果则保留,另存新版本。

这次十个账户的启动日从2021年1月4日排到5月21日,都在2022年12月30日结束。晚出发的账户少经历了一段行情,因此这不是十次独立验证,也没有把运气全部排除。它只是一次扩大了出发范围的研究期检查。

现在,可以让 AI 做运行前的最后交接了。

交给 AI 研究助手

请读取当前项目已有的买卖规则、账户规则卡和数据体检记录,用大白话简要复述本次会执行的方案。找不到关键文件时请让我提供,不要根据文件名猜规则,也不要重新筛选公司或搜索更好的策略。

这次只做2021-01-04至2022-12-30的历史账户回测,不读取、计算或披露2023年的价格、指标、信号和收益。沿用已确认的公司资格与九拍定义,不重新扫描2023年数据。

本轮每隔十个市场交易日启动一个账户:十个账户各从100点现金、空仓开始,以研究期第一个市场交易日为起点,分别偏移0、10、20、30、40、50、60、70、80、90个市场交易日启动,统一在研究期末结束。最早启动者固定为主账户。若已有两日错峰规则或结果,请保留原文件,把这次安排另存为追加版本,不改写历史记录,也不自动更改以后验证期的安排。

其余沿用我已确认的规则。请只列出尚未确定、确实会影响计算的事项,用简单例子让我确认;已确定的不用重复问。保留我的个人筛选器或卖法,不擅自替换。先完成这次交接,暂不运行账户。

AI 如果问到了费用或期末持仓,而你上一课还没决定,可以参考下面这份约定。已经说清楚了,就跳过,不必再抄一次。

想采用课程同一套参数?展开这份参考约定

下面这段可以直接交给 AI。它是课程选择的一套教学方案,不是所有回测都必须这样做。

课程参考账户方案|可直接复制

我决定本轮采用以下参考方案。请与本地已有规则核对,单独保存这个版本,保留旧记录;必要的九拍定义或资格名单找不到时请让我提供,不要自行补造。

沿用此前数据体检保存的合格公司名单,课程参考为292家;只考虑公司表中 industry_id 为 PY-10(出行网络)的公司。按已经冻结的完整下行九拍定义识别事件,数字9收盘确认,下一根该股有效日K开盘进入;买入当天为第1根,第10根有效日K收盘退出。采用十根退出,不把旧实验中其他候选卖法当成最终选择。

每个账户100点现金起步,一次只持有一家,不拆资金、不借钱、不追加、不加仓。空仓时同一天若有多个可买机会,按六位虚拟代码字符串升序选第一个,保留前导零。持仓时跳过新机会,不排队补买。卖出后用剩余资金继续,不重置100;收盘卖出的回款最早下一市场交易日开盘可用。

买卖费用各为实际成交金额的0.05%,不另加税项或最低收费;滑点为买入参考开盘价上浮0.05%、卖出参考收盘价下调0.05%。允许小数份额,买入份额用“可用现金÷〔含滑点买入价×(1+买入费率)〕”计算,预留费用,不透支。现金不计利息,不模拟整手和额外分红现金流。

使用教学前复权字段 adjusted_open、adjusted_close。某股缺K时不交易、不增加持有根数,当天用最近已知收盘价估值,不用未来价格补齐。期末仍未到退出日就保留持仓,按最后已知价格估值并报告估值日期,不假装卖出,不扣尚未发生的卖出费,也不延长读取2023年。必需价格异常若无法用于本轮正价格份额模型,请汇报,不擅自改价。

从原始研究期九拍信号按日期推进,不把以前为比较收益而选出的完整十根或二十根事件名单当成买入白名单;不能先检查未来能否拿满十根才决定买入。九拍历史不随账户启动清零,只参与原定进入日在账户启动后或启动当日的机会,不补买早已错过的进入日。

市场交易日使用 hs300_daily.parquet 在2021-01-04至2022-12-30的日期。十账户按0、10、20……90个市场交易日偏移启动。每个账户的指数参照以其启动日开盘为起点,之后每日为“100×指数当日收盘÷该启动日开盘”,统一到2022-12-30收盘。起点价格缺失请报告,不偷偷移动日期。指数不扣交易成本,只作为价格参照。账户与指数在各自启动日开盘前记100,后续收盘值不强行重置。

这些都是虚构数据上的教学简化,不代表真实收费或完整成交条件。不读取或计算2023年的行情、指标、信号和收益;不修改未来验证期约定。

规则接好了,让它真正跑一次

看到 AI 复述的方案和你的选择一致,关键参数也齐了,就可以继续。

你不需要先选一个回测框架,也不用猜程序该写几个文件。把要做的事、要留下的结果说清楚,技术部分让 AI 来处理。

交给 AI 研究助手

请按刚刚确认并保存的账户规则,在当前项目中编写并实际运行研究期回测。只使用2021-01-04至2022-12-30的行情及已确认研究记录,不读取或计算2023年的价格、指标、信号和收益,不重新搜索参数。

使用项目现有Python环境,缺少必要依赖就安装。请自行完成程序运行、普通技术排错和内部计算检查;需要我操作时再用大白话告诉我。无法确认的研究选择不要擅自补齐。

请保存三类结果:

  1. 资金曲线:先画最早启动的主账户,与其同期沪深300参照放在一起;再固定同一买卖路径计算费用和滑点都为零的版本。另画十账户逐日总资产中位数曲线,并附相同口径的零成本和各自指数参照中位数。中位数图只展示十账户共同有收盘记录的日期,不在展示起点重新归一到100,不补未启动账户,也不把每日收益中位数连乘当成净值。
  2. 交易和记账记录:保存实际买卖、费用、现金、持仓、每天的总资产,以及候选机会参与或跳过的原因。保留期末未完成持仓,不要求我手动整理这些文件。
  3. 大白话摘要:列出主账户的期末总资产、累计收益、同期指数收益、二者的百分点差、最大回撤、买入及已完成交易数、已完成交易的正收益比例、期末持仓,以及零成本期末值。另列全部十账户的起止日期、收益和各自同期指数,并汇总收益中位数、最高、最低、超过各自指数的数量及不同交易路径数量。相同路径照实保留,不继续改出发日期。

图表和摘要从同一份计算结果生成,给我可以打开查看的文件位置。保存本次实际使用的规则、数据范围和检查结果,保留原数据与旧实验输出。完成后停止,不接着优化策略,也不打开2023年。

这一段写得比较具体,是为了把本课需要的结果一次说清楚。你也可以拆开说:先让账户跑出来,再让 AI 补图、整理记录。只要用的还是同一套规则和同一份运行结果,就不必追求相同的对话过程。

如果它只给了你代码,没有运行,可以继续说:“请在这个项目里实际运行,并把结果文件打开给我看。”

遇到报错,把报错文字或截图交给它,说明“刚才做到哪一步、现在看到了什么”。不用先学会翻译整段错误,也不用一出问题就推倒前面的研究。

曲线出来了,再让 AI 对一下账

曲线出现了,说明程序已经产出了东西。但画得出来,不等于每一步都按约定做了。

我们不需要自己拿计算器复算几百天。让 AI 回到它实际生成的记录里检查,而不是只回答一句“逻辑没问题”。

和 AI 一起验收

请根据刚刚实际运行的程序、输入范围和输出记录检查:有没有重复使用同一笔现金;每天总资产是否等于现金加持仓估值;买卖日期、有效K线计数、费用和期末持仓是否符合已确认规则;每个账户的指数是否匹配自己的区间;零成本版是否保持相同买卖路径。检查中位数图每天是否包含同样十个账户,期末值是否与账户汇总一致。

抽查实际的一笔买入、一笔退出和一次跳过机会,把对应记录作为依据;不存在的情况就说明没有。再复核本次实际用于计算的行情范围是否限定在2021—2022年,并在不改变规则的情况下重跑,核对结果是否一致。

请用大白话报告检查通过了什么、仍有什么问题,并给出证据所在文件。若有实现错误,按原规则修正并记录;如果只是收益不好,不要因此改策略。检查过程也不要读取2023年行情。

这一步是在确认“有没有照约定算”,不是请 AI 想办法把亏损改成盈利。

如果本地结果与下面的示例不同,先确认用的是不是同一套数据和规则。你采用了自己的方案,数字不同很正常;如果规则相同,就让 AI 检查实际执行与约定哪里不一致。不要把课程数字当成它必须凑出的答案。

我们的100点,最后剩下多少?

下面是课程参考方案已经运行并核对过的结果,不是 AI 预估的收益。公司都是虚构教学对象,数据和实验不构成投资建议。

先看最早启动的主账户:2021年1月4日开始,2022年12月30日结束。

100点,最后变成了94.79点。

蛙兄看了一眼。

“确实照实说了。”

主账户研究期总资产曲线,包含扣成本后、零成本及同期沪深300参照
图 2|主账户的扣成本、零成本与同期指数参照曲线。
主账户结果本次记录
期末总资产94.79点
账户累计收益−5.21%
同期沪深300收益−25.73%
账户收益减去指数收益+20.52个百分点
不计费用和滑点时的期末总资产101.35点
买入/已完成退出34笔/33笔

期末还有一笔持仓没有到退出时间。94.79点包含这笔持仓的估值,不是说已经全部卖出、拿回了这么多现金。

线条、数字和买卖记录先一起留好。摘要里还会有最大回撤等指标,不认识也不用卡在这里,我们下一课会拿着这份结果继续看。

另外九个账户,也一起摆出来

这次不把十条账户线全部挤进一张图。我们用刚才要求 AI 生成的中位数曲线,看十个账户每天的汇总位置。

它的做法是:每天把十个账户的总资产从小到大排一排,取中间两个数的平均,再把每天的数连起来。这不是挑出某一个账户,更不是把十笔钱合起来买卖。

每隔十个市场交易日启动一个账户的实验:逐日总资产中位数曲线,含扣成本后、零成本与匹配指数参照
图 3|十个错峰账户的逐日总资产中位数与同期参照。

图从2021年5月21日开始,因为这一天最后一个账户也启动了,每天才能比较同样十个账户。早出发账户此前的盈亏仍然保留,没有在这一天重新变回100。指数线也汇总了各账户对应的同期参照。

曲线之外,各个账户的结果也要留下,不能只保留一个中位数。

账户启动日(2021年)账户收益各自同期指数收益
A01(主账户)1月4日−5.21%−25.73%
A021月18日−5.21%−28.81%
A032月1日−5.21%−27.73%
A042月22日−7.22%−33.08%
A053月8日−7.22%−26.95%
A063月22日−11.53%−22.70%
A074月6日−14.05%−25.24%
A084月20日−16.68%−23.57%
A095月7日−17.06%−23.69%
A105月21日−12.47%−25.53%

这十个账户的收益中位数是 −9.37%,最高 −5.21%,最低 −17.06%。十个都超过了各自同期指数,但没有一个自身盈利。

实际留下了七条不同的完整买卖路径,相同的那些也照样保留。这些数量描述的是这轮教学实验,不是未来的盈利或跑赢概率。

先把结果留下,问题也留下

做到这里,你的项目里应该已经能打开资金曲线、交易记录和结果摘要。AI 不只是写了一段程序,还实际跑过、检查过,并说明了有哪些尚未解决的问题。

如果摘要里只有数字,没有文件位置,就继续让它给出位置;如果图上的文字看不清,也可以直接要求它把字放大。你不必接受第一版输出的样子。

但先不要让它顺手换行业、改退出日,或者“再找一套更赚钱的参数”。这轮结果先原样保存,2023年的信封也还没到打开的时候。

蛙兄把曲线和之前的事件研究表放到了一起。

“现在数字都有了,但我好像又多了几个问题。”

这些问题不用急着一句话答完。

下一课,我们就拿着刚刚跑出的曲线和交易记录,看看这100点资金到底经历了什么。

课后讨论

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