1. 为什么个人量化在AI时代突然变得可行了
三年前我跟几个做量化的朋友聊天,大家的一致结论是:个人做量化,基本等于给市场送钱。原因很简单,机构有数据优势、有低延迟通道、有几十人的研究团队,你一个人下班后写几行Python,凭什么跟人家拼?但这个判断在最近一两年被彻底推翻了,核心变量就是AI工具的成熟。
我自己是从2023年开始认真把AI引入量化工作流的。当时最大的感受不是AI能帮我写出多牛的策略——说实话,AI直接生成的策略大部分是垃圾——而是它把我做研究的边际成本压到了一个前所未有的水平。以前我想验证一个想法,从写数据接口、清洗数据、搭回测框架、调参数、画图分析,一套下来两三天就没了。现在同样的流程,我可能一个下午就能跑完三轮迭代。这个效率差异,才是个人量化真正能玩起来的原因。
具体来说,AI在量化工作流里承担的角色可以拆成三块。第一块是代码生成与调试,比如用Codex这类工具,你描述清楚数据结构和目标,它能帮你把backtrader的策略骨架搭出来,省掉大量查文档的时间。第二块是研究辅助,比如你想理解某个因子的经济学逻辑,或者想找某篇论文的实现思路,AI能快速给你梳理出框架,你再去验证。第三块是数据处理,量化里最耗时的往往不是策略本身,而是数据对齐、缺失值处理、复权计算这些脏活,AI写这类代码的准确率相当高。
但这里必须泼一盆冷水:AI降低的是执行成本,不是认知门槛。一个不懂回测陷阱的人,用AI只会更快地生产出过拟合的垃圾策略。我见过太多人拿着AI生成的代码,回测年化80%,实盘三个月亏掉30%,然后骂量化是骗局。问题不在量化,在于他根本没搞懂自己在做什么。所以这篇文章我想聊的,不是“AI帮你写代码”这种表面东西,而是一个个人开发者,怎么用AI把量化研究的完整闭环跑通,并且避开那些会让你亏钱的坑。
适合读这篇的人:有基础Python能力、想认真做量化但没团队、愿意花时间理解原理而不是只想要代码的人。如果你指望复制粘贴就能赚钱,那可以关掉了,这条路不存在。
2. 个人量化的整体架构该怎么搭
2.1 先想清楚你要做哪种量化
很多人一上来就问“用什么框架”,这其实是错的。你应该先问自己:我要做的是什么频率、什么品种、什么逻辑的量化?不同答案对应的技术栈完全不同。
我大致把个人能做的量化分成三类。第一类是日频或更低频的股票/ETF轮动,这类对延迟没要求,数据用免费的日线就够了,backtrader、vectorbt都能胜任,重点是因子逻辑和仓位管理。第二类是分钟级或小时级的期货/加密货币,这类对数据质量和执行速度有要求,回测框架要能处理tick或分钟数据,实盘接口要稳定。第三类是高频做市或套利,这类个人基本别碰,硬件和通道成本不是个人能承担的。
我自己的主力是第一类,偶尔做第二类。原因很现实:日频策略的容量大、衰减慢、对执行不敏感,个人用一台普通电脑就能跑。而分钟级策略你回测做得再漂亮,实盘滑点一吃就没了。所以下面讲的技术栈,主要围绕日频和低频分钟级展开,这也是最适合个人起步的方向。
2.2 技术栈选型的取舍逻辑
确定了频率,接下来是选工具。我把个人量化常用的工具列个表,说清楚各自的适用场景和坑。
| 工具 | 适用场景 | 优势 | 坑点 |
|---|---|---|---|
| backtrader | 日频/分钟级回测,事件驱动 | 生态成熟,文档多,支持多股 | 速度慢,多股回测要优化 |
| vectorbt | 快速因子验证,参数扫描 | 向量化,极快 | 学习曲线陡,事件驱动逻辑弱 |
| pandas + numpy | 数据清洗、因子计算 | 灵活,万能 | 回测要自己写,容易出错 |
| akshare/tushare | A股数据获取 | 免费,接口简单 | 数据质量参差,要校验 |
| ccxt | 加密货币数据与交易 | 统一接口 | 交易所差异大,要测试 |
选型的核心原则是:回测用快的,实盘用稳的。我通常用vectorbt做因子快速筛选,把几百个因子的IC、分层收益跑一遍,筛出十几个候选;然后用backtrader做精细的事件驱动回测,因为它能更真实地模拟成交、滑点、手续费;最后实盘如果要做,再单独写执行层,不跟回测框架耦合。
这里有个很多人踩的坑:回测框架和实盘框架混用。backtrader确实能从回测扩展到模拟或实盘,但我不推荐个人这么做。原因是回测框架为了通用性做了大量抽象,实盘时这些抽象会变成负担,而且一旦框架出bug,你很难定位是策略问题还是框架问题。我的做法是回测归回测,实盘用一个极简的执行脚本,只负责读信号、下单、记录,逻辑越简单越不容易出事。
2.3 数据层的搭建要点
数据是量化的地基,地基不稳后面全白搭。个人做量化,数据层要解决三个问题:获取、清洗、存储。
获取方面,A股我主要用akshare,免费且覆盖广,但要注意它的接口偶尔会变,而且历史数据有缺失。我的做法是每天收盘后跑一次增量更新,把数据落到本地。加密货币用ccxt,直接拉交易所的K线。
清洗是最容易被忽视的环节。复权处理、停牌处理、ST股处理、新股上市初期的异常波动,这些不处理干净,回测结果全是幻觉。我举个例子:如果你用不复权的价格回测,遇到高送转的股票,价格会突然腰斩,策略会误以为暴跌而卖出,实际上你什么都没亏。所以回测必须用后复权价格,这是铁律。
存储方面,数据量不大的话,parquet文件就够了,比CSV快得多,比数据库简单。我早期用SQLite,后来发现parquet在pandas里读写更顺手,就换过来了。如果你的股票池超过500只、历史超过10年,可以考虑DuckDB,查询速度快,还支持SQL。
提示:数据更新一定要做校验。我每天更新完会检查当天数据的股票数量、涨跌幅分布、是否有异常值。有一次akshare返回了错误的价格,导致我的策略信号全乱,幸好校验脚本发现了。
3. 用AI辅助策略开发的具体流程
3.1 从想法到可回测代码的转化
这是AI最能发挥价值的地方,但也是最容易用错的地方。很多人直接跟AI说“帮我写一个赚钱的量化策略”,这纯属浪费时间。正确的用法是:你负责提出有逻辑的假设,AI负责把它翻译成代码。
我举个真实的例子。我想验证一个假设:A股里,过去20个交易日涨幅排名靠前但换手率不高的股票,未来5天可能有超额收益。这个假设背后有逻辑——涨幅说明有资金关注,换手率不高说明筹码没松动,可能还有上涨空间。
我把这个逻辑拆成明确的步骤告诉AI:第一步,计算每只股票过去20日的收益率;第二步,计算过去20日的平均换手率;第三步,按收益率排序取前20%,再按换手率排序取后50%;第四步,等权买入,持有5天,每天调仓。AI很快就能给出基于pandas和backtrader的代码框架。
但这里的关键是你要能判断AI给的代码对不对。比如AI可能会用pct_change(20)算收益率,这没问题;但它可能忘记处理停牌股票,导致买入了一只根本买不进的票。所以AI生成代码后,你必须逐行审查,尤其是数据对齐、缺失值、交易约束这几块。
3.2 因子计算与回测的代码骨架
下面是我常用的一个回测骨架,基于backtrader,做了多股支持。我把它简化后贴出来,你可以直接参考。
import backtrader as bt import pandas as pd import numpy as np class MultiStockStrategy(bt.Strategy): params = ( ('lookback', 20), ('hold_days', 5), ('top_pct', 0.2), ) def __init__(self): self.counter = 0 self.hold_counter = {} def next(self): self.counter += 1 if self.counter % self.params.hold_days != 0: return # 计算所有股票的因子 candidates = [] for data in self.datas: if len(data) < self.params.lookback + 1: continue ret = data.close[0] / data.close[-self.params.lookback] - 1 candidates.append((data._name, ret)) if not candidates: return # 按收益率排序 candidates.sort(key=lambda x: x[1], reverse=True) top_n = max(1, int(len(candidates) * self.params.top_pct)) targets = [c[0] for c in candidates[:top_n]] # 调仓 for data in self.datas: if data._name in targets: if not self.getposition(data): size = int(self.broker.getcash() / len(targets) / data.close[0]) self.buy(data=data, size=size) else: if self.getposition(data): self.close(data=data)这段代码有几个细节值得说。第一,self.counter % self.params.hold_days控制调仓频率,避免每天交易产生过多手续费。第二,len(data) < lookback + 1的判断防止数据不足时计算错误。第三,仓位用等权分配,简单但有效。
但这段代码也有明显问题:它没有处理停牌、涨跌停、手续费、滑点。这些在真实回测里必须加上,否则结果会严重高估。我通常会在broker层面设置setcommission和slippage,停牌股票则通过成交量过滤——如果当天成交量为0,就不交易。
3.3 参数优化的正确姿势
参数优化是过拟合的重灾区。我见过有人把策略参数优化到年化200%,实盘直接归零。问题出在用全部历史数据优化参数,然后用同一段数据回测,这等于作弊。
我的做法是样本外验证 + 参数稳健性检查。具体来说,把历史数据分成三段:训练段(60%)、验证段(20%)、测试段(20%)。在训练段上优化参数,在验证段上确认参数没有失效,最后在测试段上看真实表现。如果测试段表现远差于训练段,说明过拟合了。
另外,参数不要追求最优,要追求稳健。比如一个策略在参数A=10时年化30%,A=11时年化5%,A=12时年化28%,这种参数就是脆弱的,实盘稍微偏移就失效。理想的情况是参数在10到15之间年化都在20%以上,说明策略逻辑本身有效,不依赖特定参数。
AI在这里能帮上忙的是快速跑参数扫描。你可以让AI写一个循环,把参数组合跑一遍,输出热力图。但记住,热力图好看不代表策略能用,还要看逻辑是否站得住。
4. 回测中最容易踩的坑与排查方法
4.1 未来函数:量化第一杀手
未来函数是指你在回测中用了当时不可能知道的信息。这是最隐蔽也最致命的错误,因为它会让回测结果好得离谱,而你却找不到原因。
常见的未来函数有几种。第一种是用当天收盘价计算信号,然后用当天收盘价成交。现实中你不可能在收盘的瞬间既算出信号又完成交易,至少要到第二天开盘。第二种是用了未来才公布的数据,比如财报数据,你用了实际公布日之前的数据,但现实中那时财报还没出。第三种是用全样本统计量做标准化,比如用整个历史期的均值和标准差来标准化每天的因子值,这等于用了未来信息。
排查未来函数的方法:把回测信号延迟一天执行,看看收益是否大幅下降。如果下降很多,说明原来的收益来自未来信息。另外,对财报类数据,一定要用公告日而不是报告期来对齐。
4.2 幸存者偏差与数据对齐
幸存者偏差是指你回测时只用了现在还在上市的股票,忽略了那些已经退市的。这会导致回测收益虚高,因为退市的往往是烂公司,你相当于自动过滤掉了亏损。
解决方法是用包含退市股票的历史成分股数据。A股的数据获取相对麻烦,但akshare有一些接口能拿到历史ST和退市信息。如果你实在拿不到,至少要在回测里加入ST过滤和上市时间过滤,减少偏差。
数据对齐是另一个坑。多股回测时,不同股票的交易日可能不一致(停牌、新股等)。如果你直接用pandas对齐,可能会产生NaN,而backtrader对NaN的处理不一定符合你的预期。我的做法是先构建一个统一的交易日历,把所有股票数据reindex到这个日历上,停牌日填充前收盘价但标记为不可交易。
4.3 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 回测年化超高 | 未来函数 | 延迟一天执行信号 | 检查信号与成交的时间对齐 |
| 回测收益虚高 | 幸存者偏差 | 检查股票池是否含退市股 | 加入退市股票或ST过滤 |
| 多股回测报错 | 数据长度不一致 | 打印各股票数据长度 | 统一交易日历,reindex |
| 实盘与回测差异大 | 滑点/手续费未计 | 对比含费与不含费回测 | 加入真实费率和滑点 |
| 参数敏感 | 过拟合 | 参数扫描看稳健性 | 样本外验证,选稳健参数 |
| 回测速度慢 | 事件驱动逐条循环 | 用cProfile定位 | 改用vectorbt做初筛 |
这张表是我自己踩坑总结的,基本上覆盖了个人量化80%的问题。每次回测结果异常,我都会对着这张表过一遍。
注意:回测结果好不代表策略能用。我有个策略回测年化45%,夏普2.5,实盘跑了半年年化只有8%。后来发现是回测时用了不复权数据,导致高送转股票被错误处理。修正后回测年化降到18%,这才是真实水平。
5. 从回测走向实盘的关键一步
5.1 模拟盘验证不可跳过
回测再漂亮,也要经过模拟盘验证。模拟盘的价值在于暴露那些回测无法模拟的问题:数据延迟、接口稳定性、订单成交情况、程序异常处理。
我的流程是:策略回测通过后,先跑至少一个月的模拟盘。模拟盘期间,每天对比模拟盘的信号和回测的信号是否一致。如果不一致,说明数据或逻辑有问题。同时观察模拟盘的成交价格和回测假设的成交价格差异,这个差异就是真实的滑点。
模拟盘还有一个作用是测试程序的健壮性。实盘程序会遇到各种意外:网络断了、数据源挂了、交易所维护。这些在回测里永远不会发生,但实盘一定会遇到。所以模拟盘期间要故意制造一些异常,看看程序能不能正确处理。
5.2 实盘执行层的极简设计
前面说过,我不推荐用回测框架做实盘。我的实盘执行层大概只有两三百行代码,逻辑非常简单:读信号文件、检查持仓、生成订单、调用接口下单、记录日志。
信号生成和订单执行是分离的。策略每天收盘后跑一次,把第二天的目标持仓写到一个JSON文件里。执行脚本第二天开盘前读这个文件,对比当前持仓,生成买卖订单。这样做的好处是策略和执行解耦,策略出问题不影响执行,执行出问题也不影响策略。
执行层要处理的核心问题:订单拆分、价格保护、异常重试。如果一只股票流动性不好,一次性下单可能冲击价格,就要拆成小单。价格保护是指设置一个可接受的滑点范围,超过就不成交。异常重试是指接口调用失败时,要有重试机制,但不能无限重试导致重复下单。
5.3 风控是个人量化的生命线
个人做量化,最大的优势是灵活,最大的劣势是没有风控团队。所以风控必须自己写进程序里,不能靠人盯。
我的风控规则有几条硬性的:单只股票仓位不超过总资金的10%;单日亏损超过2%就停止交易;策略连续回撤超过15%就暂停,人工检查。这些规则写在执行层里,不依赖策略本身。
另外,资金管理比策略本身更重要。我见过太多人策略不错,但因为仓位管理失控,一次回撤就出局了。个人量化的正确姿势是:先用小资金跑通全流程,确认策略、执行、风控都没问题,再逐步加资金。不要一上来就满仓,市场会教你做人。
6. 我个人的一些实操心得
做量化这几年,最大的体会是:AI能帮你跑得更快,但不能帮你跑对方向。方向来自你对市场的理解,来自你对策略逻辑的思考,这些AI替代不了。我见过有人用AI生成了几百个策略,回测都很好,实盘全亏,因为他根本不知道这些策略为什么能赚钱,也就不知道它们什么时候会失效。
另一个心得是:简单策略往往比复杂策略更耐用。我早期喜欢堆因子,十几个因子加权,回测很漂亮,实盘一塌糊涂。后来简化到两三个核心因子,反而稳定了。原因是复杂策略的参数太多,过拟合空间大,而且逻辑不清晰,出问题不知道从哪查。
还有一点关于AI工具的使用:不要让它替你思考,让它替你干活。我现在的用法是,自己想清楚逻辑,让AI写代码、查文档、做数据清洗。AI写的代码我一定会审查,尤其是涉及交易逻辑的部分。有一次AI在计算收益率时用了shift(-1),这明显是未来函数,如果我不检查直接跑,回测结果会好得离谱。
最后说个数据上的细节:复权方式的选择会影响策略表现。前复权和后复权在计算收益率时结果一样,但在计算价格相关的指标(如均线、布林带)时会有差异。我统一用后复权,因为它保持了历史价格的真实性,不会因为新的分红送转而改变历史数据。这个细节很多人不注意,但它会影响回测的可复现性。
量化这条路,个人做确实比以前容易了,但容易的是工具,不是赚钱。市场永远是少数人赚钱的地方,AI只是让你有机会成为那少数人之一,而不是保证你成为。把预期放低,把流程做扎实,把风控做好,剩下的交给时间和概率。