
去年年底我把自己的交易复盘需求整理成了一个项目用 Python 搭一套 A 股分析系统目标是自动拉取日线数据、计算常用技术指标、按策略筛选股票、跑历史回测最后自动生成中文分析报告。开发过程中我全程用 Vibe Coding 的方式驱动 AI 来写代码——从函数到模块到完整流程AI 承担了大头。两个月下来代码量定格在六千行左右。有人问我这算不算“靠谱”我的回答是作为辅助生产力工具它极其靠谱但作为“替你思考的程序员”它目前还差得远。先说清楚这篇文章只讲工程实现和踩坑心得里面出现的所有策略、收益数字、筛选规则都是开发过程中的测试样本不构成任何投资建议。这篇帖子里我就以这套系统为案例聊聊我是怎么拆需求、怎么写提示词、怎么把关代码质量的也把我踩过的那些坑一一交代清楚。如果你是开发者想验证 Vibe Coding 到底能不能用或者你是交易爱好者想自己攒一套分析工具又或者你只是好奇 AI 编程现在做到什么程度了——这篇文章都值得看完。1. 为什么我会选择用 AI 来写这套系统1.1 需求背景我需要一个什么样的 A 股分析系统先交代一下背景。做这个项目之前我的日常复盘流程是这样的每天收盘后把行情数据手动导出来用 Excel 算几个均线看一眼 MACD再翻翻自选股然后就没有然后了。这个过程不但浪费时间还特别容易漏掉一些值得关注的形态变化。我想要的东西其实很朴素一个能自动完成“数据下载—指标计算—状态标记—筛选排序—输出报告”的本地工具。注意我说的是“本地工具”。我不太想把数据放在别人的服务器上也不想依赖某个网页端产品的封装逻辑因为封装好的黑箱指标经常跟我想要的不完全一致。比如 MACD 的 EMA 周期我习惯用 12、26、9但有些平台默认是 8、17、9布林带有的用 20 周期 2 倍标准差有的用 10 周期。这些差异直接决定信号长什么样只有自己能看代码、改参数的系统才符合要求。基于这些需求功能清单定下来了数据层通过公开接口拉取 A 股日线行情本地存储支持前复权/后复权切换。指标层MA、EMA、MACD、RSI、KDJ、布林带等常规技术指标。策略层可配置的筛选规则比如“均线多头排列 MACD 零轴上方金叉”。回测层对一个策略的历史信号做收益统计和基准指数对比。报告层对筛选出的个股自动生成一段中文分析简报输出到 Markdown 文件。这个范围说实话并不算大但它足够覆盖一个 A 股分析系统的核心闭环。明确范围非常重要因为后面你会发现AI 最怕的不是复杂度而是模糊的需求。1.2 为什么不用现成软件非要自己折腾很多人可能会问同花顺、东方财富这些软件什么指标没有为什么要自己写我的理由主要有三个。第一是逻辑透明。现成软件给你的是计算结果不是计算过程。我想知道某只股票为什么被标记为“金叉”最低限度也得能解释信号来源。自己写的系统每一行判断逻辑都看得见彻底避免了“黑箱依赖”。第二是批量处理能力。人肉复盘只能盯着自选股看系统可以把全市场几千只股票全部扫一遍按策略规则做打分排序这根本不是人工能比的效率。第三是拓展性。今天加了 RSI明天想加资金流数据后天想把筛选结果接到别的分析工具——哪怕只是做个研究这套系统也能当底座。商业软件很难让你这样自由折腾。这么一说自己开发就变成了“不是最省事但最可控”的路线。而 Vibe Coding 的出现恰好把这条路线里最劝退的部分——写大量重复性、模板性的代码——给消解了一大部分。1.3 “Vibe Coding”这个词对我来说意味着什么Vibe Coding 是最近很火的一个概念大意是跟着情绪走用自然语言给 AI 下指令让 AI 把功能实现出来开发者只负责描述想要的感觉和方向。但落到实际项目里我不会真那么“飘”。我的工作逻辑是下面这样的。第一层是我出架构。整个系统分哪几个模块、模块之间怎么通信、数据格式怎么定义这些底层的“骨架”我自己定AI 不参与决策。第二层是 AI 写初稿。具体到模块内部某个函数怎么实现、某个指标怎么计算我给出规格说明AI 负责输出可运行的代码。第三层是我逐行审查。AI 输出的代码我不会盲跑而是先读、再改、再跑关键算法和回测逻辑会反复校验。换句话说Vibe Coding 对我的价值不是“不用动脑了”而是“不用把时间耗在打字上了”。这个理解贯穿了整个项目也是后面所有经验的地基。2. 两个月、六千行的真实开发节奏2.1 第一个月搭骨架让系统“能跑”第一个月我的目标只有一个完成数据层和指标层。为什么先做这两块因为后面的策略、回测、报告都建立在高质量数据之上。这个阶段的核心工作像流水线拉数据、清洗数据、存数据、算指标。当时我用 akshare 这个开源库来获取公开的行情数据它覆盖了沪深股票日线、指数、板块等非常全的信息。第一步是写数据同步模块把全市场股票的日线数据拉到本地 SQLite 数据库里。这个模块看着简单实际坑很多网络请求超时、单日拉取量被限流、复权因子的处理、停牌日期的占位……几乎每一步都值得单独写一篇。让我印象深刻的是第一次批量同步的场景。我让 AI 按我给的规格写了一个“批量拉取断点续传”的函数它输出得非常快但跑起来没到两分钟就被服务器限流了。原因很简单AI 默认用了最粗暴的遍历方式每分钟请求数远远超过合理值。后来我在提示词里明确加了“请求间隔不低于 0.5 秒遇到异常要重试 3 次并指数退避”再让它重写一版这才稳定下来。指标层相对顺利。MA、MACD、RSI 这些公式是公开的、标准化的AI 对这些算法的理解相当透彻我只需要说清楚输入输出的列名和参数它基本能一次写对。一个月下来系统已经有了完整的数据底座和八种技术指标能跑通“拉数据—算指标—打印表格”的完整流程。2.2 第二个月加策略、做回测让系统“能用”第二个月开始做策略层和回测层。策略层说白了就是一组过滤器给定某一天的数据库快照按规则筛选符合状态的股票。比如“5 日均线大于 20 日均线、MACD 的 DIF 线在零轴上方、RSI 介于 50 到 70”这种多条规则组合AI 实现起来问题不大。真正磨人的是回测层。回测是这套系统里最容易出错、也最能体现代码质量的部分。我设计了一个很朴素的回测框架给定策略的买入信号假设第二天开盘买入持仓 N 天期间如果触发止盈止损就提前卖出最后统计每一笔交易的收益曲线和沪深 300 指数做对比。这个框架写起来不难但里面有一个致命的专业陷阱未来函数。如果代码不小心用了信号当天收盘后才产生的数据去计算当天的买入动作回测结果就会虚高。而 AI 在实现这类逻辑时最容易犯的错就是省略日期对齐直接用行号当时间轴。后面对这个问题我会专门展开讲。第二个月结束时系统的六个模块全部跑通代码量定格在六千行左右。2.3 六千行到底写了什么——代码分布具体分布大概是这样的模块约行数主要职责数据层1100行情拉取、复权处理、SQLite 存储、断点续传指标层1300八个技术指标的计算函数策略层900筛选规则、打分排序、条件组合回测层1500信号生成、持仓模拟、收益统计报告层700自动生成中文分析报告测试/工具500单元测试、日期工具、配置文件从这个表能看出来六千行对于一个生产级系统来说其实不算多但对于一个“用提示词驱动 AI 写出来的个人工具”来说已经是相当大的体量了。我之前手写过一些小脚本类似的规模大概需要半年以上的业余时间这还是在需求已经想得很清楚的前提下。用 Vibe Coding 之后耗时压缩到了两个月主要节省的是编码时间而不是思考时间。3. 让 AI “听话”的提示词工程是怎么做的很多人用 AI 写代码效果不稳定一会儿好用一会儿翻车区别常常不在 AI 模型本身而在提示词的写法。我在这两个月里逐步打磨出一套模板准确率明显提升。3.1 我的提示词模板角色 目标 约束 输入输出格式 示例先说模板。每次让 AI 写代码我都会按下述结构组织提示词角色你是资深 Python 量化开发工程师熟悉 pandas 数据处理 目标实现一个函数输入某股票日线 DataFrame列名 date, open, high, low, close, volume输出 MACD 的 DIF、DEA、柱状图三列 约束 - 只使用 pandas不要引入 numpy 之外的库 - 参数可配置fast12, slow26, signal9 - 类型标注完整函数名和参数名要能读懂 - 不要写多余的注释 输入输出格式输入 DataFrame返回 DataFrame列date, dif, dea, histogram 示例输入 2024-01-02 到 2024-01-10 的日线数据输出对应的三列数值这套结构看起来简单但每部分都不是白写的。角色定义是为了把 AI 拉入正确的知识语境。量化开发工程师和“Python 助手”的回答风格、代码习惯差别很大前者会主动考虑边界条件和性能后者只求跑通。目标描述必须精确到函数。我几乎没有让 AI 一次生成“一个完整的分析系统”过因为那样生成的代码充满了想当然模块之间的耦合无法控制。约束则是防止 AI 自作聪明的关键。比如“只使用 pandas”这条能避免它突然引入一个冷门库“不要写多余的注释”能避免它把代码变成散文。输入输出格式是让代码可复用的基础。AI 如果不清楚输入长什么样就可能默认你把价格放在了 index 上然后整个断言链都错位。示例是最好的锚点。哪怕给一个两行的样例AI 对需求的理解就会提升一个档次特别在处理日期格式、除权除息这些微妙数据时示例最强的就是“纠偏”。提示这套提示词模板可直接复制修改。建议先在少量数据上跑通再全量执行能省掉很多来回调试的时间。3.2 为什么必须把需求拆到“函数级”Vibe Coding 第一个反直觉的教训就是需求越小AI 越靠谱。很多人觉得 AI 这么强我描述一下系统它就能生成几百行代码这种诱惑我一开始也没抵挡住。我试过让 AI“生成一个完整的回测模块”收到的代码看起来有模有样实际上到处都是悬空依赖有的函数调用了不存在的工具类有的假设了一个从未定义的全局变量最要命的是不同函数对 DataFrame 列名的理解不一致有的是中文列名有的是英文列名。修改这种“大而全”的代码比重新写一遍还痛苦因为它把错误藏在了意想不到的地方。把需求拆到函数级之后情况完全变了。每个函数都是独立的小任务输入输出透明AI 每次只需解决一个小问题。我这边先定义好函数的签名和数据流剩下的机械实现全部交给 AI。这种配对方式就像搭积木我负责画图纸、定规格AI 负责把每一块积木削好。具体拆法有三个原则一个函数只做一件事能被一句话说清楚函数签名先定好包括参数和返回值的类型先写核心算法再写外围的异常处理和日志。3.3 上下文窗口管理的笨办法单文件、单函数地驱动第二个教训是上下文管理。AI 的上下文窗口再大也不如一个小而清晰的请求来得靠谱。我的做法是单文件、单函数地喂提示词每修改一个文件就把这个文件的路径、数据结构说明、要改的具体函数一起贴给它。这听起来很笨但非常有效。因为你给的信息越少AI 越不容易把无关的代码误改掉。如果我把整个项目几千行代码一次性甩给它让它“帮我改一个函数”结果是它可能把函数改对了但顺带在某些不相干的地方引入了一堆改动代码评审的难度陡然上升。后来我养成一个习惯每次和 AI 交互都是“一个文件 一个函数 一段明确目标”。项目中后期这套流程几乎变成了肌肉记忆修改速度甚至比人工改代码还快。3.4 最容易被 AI “带偏”的任务类型也不是所有任务 AI 都擅长。这两个月里有三类任务它特别容易“答非所问”。第一是日期处理。金融数据的日期是个深坑只看日历日期不行还要区分交易日、停牌日、除权除息日。AI 默认会按自然日排日期序列导致指标错位。每回拿到日期相关代码我都会专门做一次“对齐测试”。第二是异常处理。AI 生成代码时对正常路径非常在行一到异常路径就偷懒。比如网络请求超时不重试、文件不存在不处理、空 DataFrame 照样除零。这些代码单测时看起来没问题一上真实数据就四处爆炸。第三是数值边界。比如除数为 0、NaN 传染、浮点精度导致的比较失败。AI 很容易写出“看起来对的公式”却忘了业务允许的输入范围。明白了这些短板我就知道哪些代码可以放心交给 AI哪些代码必须自己把关了。4. 代码质量怎么把关验证、复现、维护用 AI 写代码“写出来”只是第一步“写对”才是真正要做的事。我的把关有三个层次。4.1 第一道关单元测试让 AI 自己写我每让 AI 实现一个函数第二段提示词一定是“给这个函数写 5 个单元测试覆盖正常输入、空输入、边界值、异常输入和极端数值”。让 AI 自己给自己的代码写测试这件事听起来像笑话但效果出奇的好因为测试能逼着它暴露对输入输出的假设。我记得写完 RSI 计算函数后AI 生成的测试里有一条“输入全为零的成交量序列”。这个测试跑起来就报错了——不是 AI 的计算公式错而是它根本没想过还会有人喂全零的数据。加了一个极小值保护之后函数才算真正健壮。单元测试是便宜的第一道防线执行一次只需几秒却能拦住大部分低级错误。后面对比验证时可以先行过滤掉一大半问题。4.2 第二道关用真实行情数据跑差异对比单元测试通过了不代表真实环境没问题。我的做法是找一段不含停牌、不含复权调整的“干净历史数据”拿系统计算出的指标和公开平台显示的指标做对比。MA、MACD 这些标准化公式差异应该在 1e-6 级别一旦出现明显偏差说明要么是复权口径不同要么是滚动窗口的起点不对。这种“差异对比”是工具型软件最有效的把关心法因为答案不在代码里而在数据里。选一段所有人都能看懂的历史行情比如某只大盘股 2023 年一整年的日线算出它的 MACD 指针和公开平台上看到的数值逐一核对。只要一只股票、一个时间段能对得上代码的正确性就有了一半保障。4.3 第三道关核心逻辑必须人工逐行审数据层、回测层这种核心代码我一条原则AI 输出我审查绝不做“看起来没问题就跑”。具体审查时我会着重查四件事日期是否按交易序号对齐有没有潜在的未来函数资金进出场假设是否符合我定义的规则比如“次日开盘买入”就绝不能出现“当日收盘价买入”复权因子的应用方向前复权应该用最新价格为基准折算历史价格方向反了指标全错循环里有没有变量泄漏或隐式依赖。说实话到这一步时我对 AI 的信任程度仍然是“初级外包员工”——能完成大量基础工作但关键的财务逻辑我不能把后脑勺露给它。4.4 AI 代码的通病与处理方式通病典型表现我的处理方式假实现函数有骨架但核心逻辑返回一个固定值审查注释里 temporary/placeholder 字样过度设计为一个小功能引入一套设计模式约束里写明“不要抽象层级”上下文错配用中文变量名的地方出现英文或反之全局统一命名规范并在提示词中重申魔法数字代码里到处是 12、26、9没有常量名要求把参数全部提到函数签名沉默失败写文件失败或请求失败却不报错要求所有 IO 操作显式抛出异常这张表算是我的避坑清单。每次拿到 AI 输出先按表筛查一轮再进入正常测试流程基本能躲开 90% 的坑。5. 踩坑实录AI 写的代码会在哪些地方坑你这一节是重头戏我把两个月里遇到的、最值得记录的坑和对应的解决方式都拿出来算是给后来者的地图。5.1 未来函数回测结果虚高五十个百分点回测模块完成后我第一次跑全市场回测某策略的年化收益高得离谱。当时的直觉是策略太好了不对回测出 bug 了。排查方法很笨取一只股票把系统生成的买卖信号和它在日 K 线上的位置逐日核对结果发现信号出现的当天回测就用当天的收盘价买入了。而按我的策略定义信号必须在收盘后才确认、次日开盘才交易。这不是交易费用的差距而是逻辑根本上的未来函数。罪魁祸首是 AI 生成信号时用了一个 shift 错误的窗口。它在计算“今日金叉”时把未来几天的数据也包含进来了。修复方法是在生成信号的那一步强制偏移到已实现的行情切片并写进测试里做硬性断言“信号日期必须严格小于等于实际交易日期”。经验凡是和时间序列有关的 AI 代码逐行审查字段对齐别心疼那几十分钟。5.2 编码混乱Windows 上跑出来的中文报告全是乱码最初版本在 Windows 上运行时生成的 Markdown 报告打开全是乱码。明明代码里写的是 pandas 的 to_markdown数据也是从 SQLite 读出来的问题出在文件编码默认用了 GBK。AI 写代码时完全没意识到运行环境是 Windows 的 locale 坑。我的解决办法是在文件读写入口统一编码参数Python 里写文件显式传 encodingutf-8。另外还要在系统里改掉 Windows 控制台的默认编码不然 print 的中文也会花屏。经验AI 不会知道你运行环境长什么样凡是涉及文件读写一律在提示词里约定编码再不行就审查时加上。5.3 幸存者偏差回测把退市股票悄悄剔除了这个坑尤其隐蔽。数据层从行情接口拉股票列表时默认拉的往往是“当前仍在交易的股票列表”。这意味着那些因为退市而消失的股票根本没有进入回测样本回测结果自然只对“活下来的股票”有效——这就是典型的幸存者偏差。AI 在写“获取股票列表”那一步时理所当然地用了最新接口的快照数据完全没想过回测需要的是“历史某一天的完整股票池”。修复方式是引入历史股票池快照确保回测样本覆盖当时实际存在的所有标的包括后来退市的。经验回测逻辑单独写别复用最新的选股列表。这一条对我的系统结果影响巨大修正后我的策略收益预期一下理性了很多。5.4 请求限流第一次批量同步被服务器请出去了前面提过一次这里再展开说。公开行情接口本质上是在解析公开网页数据所以有请求频率限制。AI 默认写出的循环是每分钟请求几百次跑两分钟就被限流甚至封 IP。修复方式是三件套请求间隔 0.5 秒、失败指数退避重试、断点续传记录上次同步位置。断点续传尤其重要A 股全市场五千多只股票一次全量同步要跑很久中途停了再启动如果要从头开始那太难受了。经验凡是涉及外部请求的代码AI 默认追求速度你必须在提示词里显式给频率上限和失败策略。5.5 浮点与舍入明明差不多的价格比较起来却总不对有一次选股结果里莫名多出几只股票它们的收盘价恰好卡在某个阈值边缘。排查发现是浮点数误差导致 19.999999999 被当成 19.99 以下。处理方式统一用 Decimal 做价格比较或者用“价格 * 100 转整数”再比较。这也是给 AI 约束时要写明的一条。经验金融数据里的价格、金额比较永远用整数分或 Decimal别直接比较浮点数。提示这套“整数分比较”的技巧同样适用于订单价格、收益率、手续费等所有金额类数值的比较场景。6. 回答标题的提问Vibe Coding 到底靠不靠谱6.1 从这次项目看到的结论如果让我用一句话回答Vibe Coding 非常靠谱前提是你知道自己要什么并且愿意为它做架构设计和代码审查。它不靠谱的地方在于你如果把它当成“说出需求AI 自动生成一切”那它就是最大的坑。这次项目里AI 帮我节省了大量编码时间但并没有替我完成任何一项“决策”。什么指标该算、策略该用什么参数、回测怎么设计、止损怎么设都是我自己定的。AI 的作用是在这些决策确定之后把决策高速转化成可以运行的代码。6.2 适合用 Vibe Coding 的场景特征体验了两个月我总结了适合 Vibe Coding 的四个特征需求边界清晰你知道自己要实现什么功能有明确输入输出。模块化程度高任务能拆成小块每个块相互独立。验证手段明确有可对比的标准值或能通过测试来判断对错。试错成本不高代码出问题不会导致严重后果。A 股分析系统恰好满足这四点。它没有生产系统的并发压力也谈不上稳定性要求出 bug 了我可以慢慢修不影响任何人生计这就是个人研究型工具最理想的情况。反过来看不适合 Vibe Coding 的场景也很明显在线交易系统、核心订单处理、高合规要求的金融环节。这些地方一旦出错损失是真金白银靠“AI 生成的个人工具”去扛风险完全不可控。6.3 个人对 AI 编程的适用范围与限制当然我也清楚它的局限性。如果这是一个处理实时交易订单的系统如果代码的错误会导致真金白银的损失那我绝不会用一套“AI 生成的个人工具”来扛。Vibe Coding 目前的定位更适合做探索性、分析型、迭代快速的工具类软件而不是高可靠性、强合规要求的核心系统。最后再分享一个小细节整个项目里我自己手写的那部分代码其实不比 AI 少——架构文件、配置文件、测试断言、数据校验脚本这些“技术债”机器替代不了。但 AI 把最耗时、最重复、最不需要创造力的那一部分承接过去了这让我的精力能集中在真正需要判断力的事情上。如果你也想尝试用 AI 搭建自己的分析工具我的建议是先把需求文档写到“任何人看了都知道怎么实现”的地步再打开编程助手。把这一步做扎实你就能把 Vibe Coding 的边界推到最远反过来你会摔在我踩过的每一个坑里。好了以上就是我两个月、六千行的完整复盘。有什么问题评论区见只要是我踩过的坑都可以聊。