1. GitHub上AI量化项目的真实生态
1.1 项目看着多,能“完整跑通”的为什么这么少
先说结论:我在GitHub上逛AI量化项目这两年,最大的感受就是——star数高不代表能跑,README写得漂亮不代表能落地。
你随便搜“AI量化”“quant”“deep reinforcement learning trading”这类关键词,能翻出来几百个项目。有的上来就是LSTM预测股价,把历史K线一劈,训练集跑个R²挺高,然后告诉你“看,AI炒股这么简单”。但只要你把数据源换掉、把时间区间换掉,模型立刻失效。为什么?因为这类项目把量化交易最核心的部分——数据、回测、执行、风控——全给简化掉了,只留下一个模型壳子。
我总结下来,常见的“伪完整”项目大概可以分成三类:
| 项目类型 | 典型特征 | 离实盘的距离 |
|---|---|---|
| 玩具型 | 用公开数据集跑通一个模型,输出“每日预测涨跌” | 十万八千里,连交易成本都没算 |
| 半成品型 | 指标计算、可视化做得花团锦簇,但数据获取、订单执行全是写死的假数据 | 看起来近,一接实盘就崩 |
| 论文复现型 | 逻辑完整,符号严谨,但只验证了一个孤立的因子或模型,不做组合管理和风控 | 学术上近,工程上远 |
真正完整的AI量化项目,应该是从数据采集、清洗、特征工程、模型训练、回测验证到实盘执行、风控监控的完整闭环。这个闭环里任何一个环节断了,项目就只能躺在仓库里当摆设。
1.2 四招判断一个项目是“真完整”还是“假完整”
很多读者问我,怎么快速判断一个项目值不值得花时间看?我自己的经验是看四个硬指标:
一是数据链路是否真实存在。项目代码里有没有数据源接口?数据是实时拉取还是本地csv读一遍?如果连数据都是伪造的,后面全是空中楼阁。
二是回测系统是否可信。回测撮合时假设成交价是多少?有没有算手续费、滑点?有没有防止未来函数(用未来信息做当下决策)?这一点最能看出作者有没有真做过实盘。
三是实盘接口是否可替换。真正完整的项目,交易接口和策略逻辑应该是解耦的。你想接A券商就接A券商,想接B平台就接B平台,而不是把订单逻辑写死在代码里。
四是有没有监控和容错。程序断线了怎么办?下单失败了订单状态怎么恢复?接口限流了怎么处理?这些看起来不性感的东西,恰恰是“完整系统”和“课程设计”的分水岭。
用一句话总结:模型是家具,数据是水电,回测是验收标准,实盘运维是入住后的物业管理。GitHub上大多数项目,其实只是给你看了一张精装修的效果图。
2. 拆解一套完整AI量化系统的核心模块
2.1 数据层:最容易被低估,也最容易埋雷
很多人以为量化系统里最重要的是模型,其实数据才是地基。地基没打牢,模型再花哨也是白搭。
数据层至少包含三块内容:数据源、数据清洗、数据对齐。
数据源方面,常见选择有免费接口(比如akshare、tushare的积分接口)和付费数据商(Wind、聚宽、米筐等)。免费接口适合研究和验证思路,但你要注意它的稳定性、频率和字段质量;付费数据商字段全、维护省心,但成本高。我的建议是研究阶段用免费够用的,真正要跑实盘前再评估是否升级。
数据清洗这块,坑很多。比如复权因子处理不当,会导致股票历史价格突变、因子计算异常;停牌日的缺失值被错误填充,会给模型造成“这个股票一直在交易”的错觉;分红配股事件没有处理,会把正常的除权跳空当成收益率异常。
特别要提醒的是“未来函数”和“数据泄露”问题。这是量化里最阴险的坑。举个例子:有些人在回测时用了“未来复权因子”来回填历史价格。你回测时看到的收益率曲线很漂亮,但实盘时因为当时拿不到未来的复权因子,信号完全不同。我见过不少团队,回测年化60%,实盘一跑就亏,最后查出来就是复权数据处理出了问题。
数据对齐也容易出错。不同数据源的时间戳精度、时区、交易时段如果不统一,你合并出来的特征矩阵里就混进了“未来信息”。比如把T日收盘后晚上才公布的龙虎榜数据,直接接到T日盘中特征里去训练模型,模型当然“预测得准”,但实盘根本做不到。
我的经验是:在进入模型训练之前,先花一周时间把数据管道做好,加一层数据校验(价格非负、涨跌幅上限校验、时序单调性校验),再跑回测。这个时间花得绝对值。
2.2 特征工程与因子研究:AI量化真正的护城河
模型可以是公开的,框架可以是开源的,但特征和因子是你自己的。GitHub上那些看起来“完整”的项目,很多用的是内置的通用特征,比如过去N天的涨跌幅、成交量变化率,这种特征人人都能算,alpha早就被别人吃干净了。
特征工程的第一步是建立自己的因子库。因子来源可以很丰富:价格和成交量的技术因子、基于财务报表的基本面因子、分析师预期类的情绪因子,甚至可以是事件驱动型的另类因子。关键是你要把因子计算做成一套标准化的流水线,输入原始数据,输出一张因子宽表,而不是每次都在notebook里临时算一组。
算完因子后,必须做因子检验。常见的指标是IC(信息系数)和IR(信息比率)。IC衡量的是因子值与未来收益的相关性,IC均值越高越好;IR是IC均值除以IC标准差,衡量因子稳定性。记得按行业和市值做中性化处理,否则你选出来的因子可能只是押中了某个行业的Beta,而不是真正的Alpha。
我踩过的一个坑是:一次做因子分析,跑出来一个IC均值0.08的漂亮因子,回测收益曲线也很平滑,后来发现它在2015年之前数据段里IC是负的,只是最近三年贡献了全部收益。这个因子本质上就是过拟合了最近一段行情。后来我就养成了习惯:因子检验必须分区间看,最好再做一个滚动IC的时序图,一眼就能看出这个因子的稳定性。
2.3 模型训练:别一上来就堆深度学习
关于AI量化用什么模型,我的态度很明确:先传统机器学习,后深度学习;先简单,后复杂。
LightGBM、XGBoost这些树模型在表格型数据上依然能打,训练快、解释性强、不容易过拟合,适合做初步策略原型。深度模型如LSTM、Transformer适合处理序列依赖关系,但数据量不够时很容易过拟合,而且调参成本很高。
这里要特别强调一个关键点:金融时间序列不能乱切交叉验证。有人习惯用sklearn的train_test_split或者K折交叉验证,这在普通机器学习里没问题,但在金融数据里会泄露未来信息。举个例子,你用第1天到第100天的数据训练,但验证集恰好选在了第50天到第150天,那训练集和验证集就有重叠,模型等于“提前看到过答案”。
正确的做法是按时间顺序切分:训练集、验证集、测试集严格按时间先后划分,并且可以考虑滚动训练,比如用过去一年的数据训练,预测下周,然后每周滚一次。这才符合实盘的操作逻辑。
标签定义也要想清楚。最常见的预测目标是从T日收盘买入、持有N日后的收益。持有期N怎么定?N太短(比如1天)信号噪声大;N太长(比如60天)又跟不上市场变化。我一般会同时测试多个持有期,选信息系数最稳定、换手率在可接受范围内的方案。这个环节没有标准答案,你只能在具体数据上反复对比。
2.4 回测系统:别让回测骗了你
回测是发现策略问题的第一道关卡,但也是造假重灾区。很多GitHub项目能跑出漂亮的收益曲线,原因不是策略好,而是回测系统太“宽容”。
最典型的坑是撮合假设。有些回测器直接假设你按当日收盘价成交,而且想成交多少就成交多少。但实盘里小盘股冲击成本很高,你下个十万块的单子可能都把价格推上去两个点。更别说涨跌停时根本成交不了。所以一个可信的回测系统,至少要支持按VWAP(成交量加权平均价)附近成交、考虑涨跌停无法成交、限制单票持仓比例。
交易成本也不能敷衍。手续费、印花税、滑点加起来,对高频策略的影响非常致命。我见过一个日内策略,回测时不算手续费年化收益80%,算上万五手续费加滑点后直接变成亏损。你可以这么测:分别用“零成本”“市场上较便宜的成本”“市场上较贵的成本”三档去跑,如果策略收益对成本参数非常敏感,说明策略逻辑有问题——它在赚交易成本的钱,而不是赚alpha的钱。
回测报告至少要包含几个指标:年化收益率、夏普比率、最大回撤、卡玛比率(年化收益/最大回撤)、胜率、盈亏比、换手率。看单一指标都不够,要合在一起看。比如一个策略夏普很高、但胜率只有30%,那说明它的收益集中度高,回撤可能极大,你得仔细看看收益分布是否稳定。另外,回测结束后一定要做样本外测试。很多人把全部数据都拿来“调参-回测-再调参”,策略早就过拟合了。正确做法是留一段最近的数据完全不参与调参,最后统一做一次“开盲盒”式的验证。
2.5 实盘执行与风控:从“研究代码”到“生产系统”的鸿沟
研究阶段的代码写得多烂都没关系,但一到实盘,要求立刻提高一个量级。好的实盘执行模块,要解决三个问题:信号怎么变成订单、异常怎么处理、风险怎么控制。
信号到订单的路径,建议设计成“策略模块只负责输出目标持仓或目标权重,不做交易执行”。比如模型输出今天是80%仓位买茅台、20%仓位买五粮液,交易执行模块再来判断当前实际持仓是多少、需要下多少单、分几笔下单、用限价还是市价。这样策略逻辑和交易细节解耦,换券商、换接口时代价最小。
风控模块是很多人忽略的。仓位上限要把单票仓位限制在总资金的15%到20%以内;组合层面可以设置最大回撤熔断,比如回撤达到10%就降低仓位到一半,达到15%就全部清仓;订单异常要有报警。我做实盘时还养成了一个习惯:每天开盘前跑一遍“风控检查清单”,包括账户可用资金、持仓市值、昨日成交回报是否全部结算完毕,否则即使策略信号出来了,也可能因为资金被占用而下不了单。
订单状态机也值得好好设计。一笔订单从“已提交”“部分成交”“全部成交”“已撤销”“已拒绝”到“状态未知”,每一环都要有对应的处理逻辑。特别是“状态未知”这种尴尬状态——你发了取消指令,但不知道到底取消了没有,最安全的做法是查订单接口确认,而不是盲目补单或者盲目撤单。这个小细节,很多从没做过实盘的人根本想不到。
3. 参考qLib打造自己的量化研究流水线
3.1 qLib为什么值得“抄作业”
提到开源的AI量化框架,qLib是我觉得最值得参考的一个。它的定位不是给你一套“能直接赚钱的策略”,而是给你一套完整的研究基础设施。
qLib做得好的地方有三块。第一是数据层,它抽象了Calendar、Instrument、Feature这些概念,你拉数据时可以按照“某天到某天、某批股票、某些特征字段”来取,而且内置了缓存,重复计算因子时效率很高。第二是特征算子,它内置了Alpha158、Alpha360两套手工特征集,帮你省去了很多自己写特征计算的功夫。第三是流程范式,它的Model–Handler–Dataset–Trainer–Recorder这套组装流程,可以让你把数据、模型、回测过程串成一条标准流水线。
但这不代表你直接复制它的代码就能上线跑实盘。qLib更多是研究框架,数据源、执行接口都需要你对接自己的环境。我的建议是:把qLib当作“教科书式参考实现”,重点学它的架构思想,再结合自己的数据源和交易接口去改造。
3.2 一个可落地的研究流程示例
下面我用一个极简的流程,给大家演示qLib风格下“数据→特征→训练→回测”的完整骨架。这里用的是示意代码,实际使用时要根据你装的版本和数据配置调整。
# 初始化qlib环境 import qlib from qlib.config import REG_CN from qlib.data import D from qlib.contrib.data.handler import Alpha158 from qlib.utils import init_instance_by_config # 1. 初始化,指定数据根目录(需要提前下载并整理好行情数据) provider_uri = "~/.qlib/qlib_data/cn_data" qlib.init(provider_uri=provider_uri, region=REG_CN) # 2. 通过配置声明数据集处理器,用Alpha158特征集生成特征宽表 handler_config = { "class": "Alpha158", "module_path": "qlib.contrib.data.handler", "kwargs": { "start_time": "2020-01-01", "end_time": "2022-12-31", "fit_start_time": "2020-01-01", "fit_end_time": "2021-06-30", "instruments": "csi300", }, } handler = init_instance_by_config(handler_config) # 3. 加载数据集,拿到训练和验证用的DataLoader dataset_config = { "class": "DatasetH", "module_path": "qlib.data.dataset", "kwargs": { "handler": handler, "segments": { "train": ("2020-01-01", "2021-06-30"), "valid": ("2021-07-01", "2022-12-31"), }, }, } dataset = init_instance_by_config(dataset_config) # 4. 定义模型(这里用LightGBM示例) model_config = { "class": "LGBModel", "module_path": "qlib.contrib.model.gbdt", "kwargs": { "loss": "mse", "colsample_bytree": 0.8, "learning_rate": 0.05, "subsample": 0.8, "lambda_l1": 1.0, "lambda_l2": 1.0, "max_depth": 8, "num_leaves": 64, "num_boost_round": 500, "early_stopping_rounds": 50, }, } model = init_instance_by_config(model_config) # 5. 训练 model.fit(dataset) # 6. 回测:用训练好的模型对验证集做预测,再按预测得分构建组合 from qlib.contrib.evaluate import backtest_daily from qlib.contrib.strategy import TopkDropoutStrategy strategy_config = { "class": "TopkDropoutStrategy", "module_path": "qlib.contrib.strategy", "kwargs": { "topk": 30, "n_drop": 5, "signal": model.predict(dataset), }, } strategy = init_instance_by_config(strategy_config) # 7. 执行回测,输出收益序列 portfolio_metric, indicator = backtest_daily( strategy=strategy, start_time="2021-07-01", end_time="2022-12-31", account=100_000_000, benchmark="SH000300", )这段代码跑通之后,你就拥有了一条“数据输入→特征生成→模型训练→组合信号→回测评估”的完整研究链路。接下来要做的,就是把里头的特征换成你自己的因子,把模型换成更复杂的深度学习结构,把回测区间换成滚动更新的窗口。骨架不变,变的是内部组件。
3.3 从研究到实盘:你还缺的不是模型,是对接层
不少人在qLib上跑出漂亮回测后,卡在了“怎么上实盘”这一步。核心问题是你需要自己写一层对接代码,把模型每天输出的信号落地成真实交易。
我的做法是单独写一个“信号导出模块”,每天收盘后从研究环境里读取最新的预测结果,生成一个目标持仓列表,保存到数据库或文件里。再写一个独立的“实盘执行服务”,它每天早上启动时读取这个目标持仓列表,结合当前账户的持仓和可用资金,计算买卖指令,然后调用券商或交易平台的接口下单。研究环境和实盘环境严格隔离,这样即使研究流程出了Bug,也不会影响实盘账户的安全。
模拟盘是一个绕不开的中间步骤。很多平台提供模拟交易接口,你可以把执行服务指向模拟账户,先跑两三个月,观察实际成交回报、滑点情况、接口稳定性,再决定要不要切到小资金实盘。环境切换应该通过配置文件完成,而不是改代码。因为实盘环境里最重要的一句话就是:不要在生产环境里临时改策略。
4. 常见问题与避坑指南
4.1 数据泄露排查:回测漂亮,实盘打脸怎么办
这是问的人最多的问题。我的排查顺序是从数据链路查起。第一步检查原始数据里是否存在未来字段,比如tick级数据里有没有混入当日的收盘信息;第二步检查特征计算里有没有用到未来窗口,比如用未来N日数据计算“N日均线”这种低级错误;第三步检查预测标签和特征时间戳是否对齐,模型在T日用到的特征,必须严格来自T日及之前能拿到的数据,预测的收益标签从T日之后开始计算。
一个很实用的自查方法是:把训练样本里的标签做随机打乱,然后重新训练一个模型。如果打乱标签后模型的回测收益依然很高,那说明策略在“作弊”——它依赖的特征里一定泄露了未来信息。正常的模型,标签打乱后应当迅速失效。
4.2 过拟合的隐性信号:参数“尖峰”还是“高原”
回测调参时,如果你发现某组参数下收益极高,但参数稍微偏离一点点(比如持仓数量从30变成28或32)收益就大幅崩盘,这说明你大概率站在了“参数尖峰”上。模型的表达能力太强、参数对历史数据拟合太深,换一个时间段就会失效。
反过来,如果一组参数附近有一个平滑的“参数高原”,说明策略逻辑本身有鲁棒性。验证方法很直接:以最优参数为中心,按正负10%到20%的范围扫一遍参数网格,观察收益、回撤、夏普的变化是否平缓。平缓就是好现象,剧烈波动就要警惕。这个方法比单纯看回测收益曲线靠谱得多。
我自己的习惯是:任何策略参数都要求“能解释为什么”。比如topk选30只,是因为组合研究表明股票数量在20到40只之间时分散化收益最好,超过50只就摊薄了alpha。如果答案是“回测最优是30”,那这个参数我不能信任。
4.3 实盘和回测不一致,优先排查这些环节
实盘跑了几天,发现实际收益率和回测差得远,别急着骂市场,先按下面的清单逐项排查。
| 症状 | 可能原因 | 排查方法 |
|---|---|---|
| 实际滑点远高于预期 | 回测假设按收盘价/VWAP成交,实盘流动性不足 | 看逐笔成交记录,算实际成交均价与信号价的偏差 |
| 下单量远超预期 | 目标权重计算时用了不同除权价格 | 核对价格字段是前复权还是不复权,权重换算是否一致 |
| 部分订单没有成交 | 涨跌停、停牌、开盘集合竞价未纳入判断 | 在交易逻辑里加入可交易状态检查 |
| 收益曲线整体右移/左移 | 时间时区或日期对齐偏差 | 核对信号日期与下单日期的偏移,常见于接口时区配置错误 |
| 持仓与目标不一致且持续一天以上 | 订单状态机处理异常,部分订单卡在“状态未知” | 检查是否有自动补单、撤单失败后的重试机制 |
这个表格里的每一条,我都亲自踩过。尤其是时区偏移那条,有一次我的策略在美股的信号一直晚了一个交易日才执行,回测里本来是很稳的策略,实盘硬生生跑成了反向指标。查到最后就是接口返回的时间格式和我自己代码里的时区转换不一致。
5. 从零搭建自己的AI量化系统:一个务实的路线图
5.1 第一阶段:先跑通研究闭环
不要一上来就想着找“完整代码”,也不要一上来就买服务器搭实盘。第一阶段的目标很明确:用最少的成本,把“数据→特征→模型→回测→信号输出”这个研究闭环跑通。
具体来说,先选一个熟悉的市场(比如A股),确定数据源,把日线数据下载下来,做一个简单的因子集,用qLib或自己写的简单回测器跑一个baseline策略。这个阶段你可以不追求策略赚多少钱,只要代码流畅、逻辑可解释就行。我的建议是不要跳过这个阶段,因为很多人后面实盘出的所有问题,本质上都是在这个阶段没把数据细节弄明白。
5.2 第二阶段:用模拟盘验证全链路
研究闭环跑通后,把信号导出模块和执行服务写出来,接上模拟盘环境,跑至少两三个月。模拟盘的价值不是验证策略收益——因为模拟盘的撮合还是很理想的,它的核心价值是帮你验证执行链路。
你要观察交易机会是否真的能抓住、连续交易几天后订单状态管理是否稳定、行情波动大的日子有没有异常、程序日志是否完整可追溯。这个阶段暴露出来的问题越多越好,因为都是实盘前可以免费修复的。我见过有人跳过模拟盘直接实盘,结果第一个月就遇到了接口限流把订单丢弃、程序重启后持仓状态不同步、资金被冻结导致后续信号无法执行等问题,全是模拟盘能提前暴露的毛病。
5.3 第三阶段:小资金实盘,用日志驱动迭代
模拟盘跑稳了,再上小资金实盘。所谓小资金,是亏了不心疼但又不是完全无感的金额。这个阶段的核心目标不是赚钱,而是验证真实市场环境下策略和系统的表现。
重点要做两件事。一是每天写交易日志,记录信号、期望价格、实际成交价、滑点、持仓变化、异常事件。这些日志是你后续迭代策略的依据,也是排查问题的证据。二是建立每周复盘机制,把实盘和回测的差异量化出来。如果实盘稳定跑在回测预期范围内,再考虑逐步放大资金,每放大一个量级都重新评估一次滑点、冲击成本和风控边界。
我个人的体会是:AI量化这条路,模型真的不是瓶颈,工程和风控才是。你花三个月把数据管道、回测系统、实盘执行和风控磨扎实,收获会比下载一百个GitHub项目看README大得多。最后再分享一个小技巧:不要只盯着一堆策略代码库,多去看看那些“没人会刻意分享”的东西——比如别人的失败经验、订单状态处理方案、异常排查记录,这些东西才是真正能让系统活下来的关键。