前两年我经常被问一个问题:没有机构级别的数据、没有服务器集群、也没有量化团队,个人做量化交易策略,到底是不是一件靠谱的事?我的回答一直没变:靠谱,而且这几年比以前靠谱得多。原因很简单——AI正在把个人开发者的能力下限拉高,把过去只有专业团队能做的事,拆成了普通人拿起电脑就能上手的步骤。
这篇文章我想完整梳理一遍“个人做量化”这整条链路:从策略想法怎么来,到数据去哪拿,到用 Python + backtrader 这类工具把策略写出来跑回测,再到怎么避开新手最容易栽的那些坑。适合谁看?适合有 Python 基础、想认认真真做一套自己能听懂逻辑的量化策略,而不是随便 fork 一个代码就指望赚钱的朋友。也适合那些听说“AI 能写代码”就心动、但完全不知道量化从哪开始的人。我尽量把每个关键环节背后的“为什么”也说清楚,因为只有理解了原理,你才不会被一行跑通的回测代码骗得以为自己能找到圣杯。
1. 先说清楚:AI 把“个人做量化”这几道门槛变成了什么
1.1 过去个人做量化,难点根本不是“策略”
很多人以为量化开发的门槛是数学,是编程,是金融知识。实际上,个人开发者真正被卡住的地方,是下面这三件事:
第一,数据的获取成本。机构有 Wind、Bloomberg 这类终端,一年几十万,历史数据、实时行情、财务数据一应俱全。个人要拿干净的数据,早期只能靠爬虫自己抓,抓回来还要清洗、复权、去重,数据质量还不一定可靠。这一步就劝退了大部分人。
第二,工程化的回测能力。策略不是写出来就算完,你得验证。而回测不是简单地算一下涨跌,要考虑手续费、滑点、停牌、除权除息,这些细节没处理好,回测收益能比实盘高出一大截。没有工程经验,你根本不知道哪里有问题。
第三,迭代速度。以前写一个策略从 idea 到验证要几天甚至几周。改一个参数,重跑一遍全套流程,人肉盯盘、手工记录,效率低得可怕。个人开发者一天能试两三个想法就算不错。
这三件事的共同点是什么?它们都不是策略本身,而是围绕策略的“开发效率”和“工程能力”问题。而这些,恰恰是 AI 工具最擅长补位的。
1.2 AI 把门槛降到了什么程度
现在你再来看同样的三件事,处境完全不同。
数据层面,国内有 akshare、tushare、baostock 这类开源数据源,免费就能拿到 A 股历史行情、宏观数据、行业板块数据。虽然质量和字段规范程度不如机构终端,但做个人策略开发,数据量完全够用。
工程层面,backtrader、vectorbt 这些开源回测框架已经很成熟,个人开发者在社区里有海量的踩坑记录可以查。而 AI 助手可以把一个模糊的想法变成能跑的代码框架,再帮你把报错逐个解释清楚,相当于你凭空多了一个随叫随到的结对程序员。
迭代速度就不说了,AI 辅助下,一天试十个 idea 是完全现实的事。
所以“AI 时代个人做量化的红利”这句话,准确一点说应该是:AI 让个人开发者把精力从“怎么把想法变成代码”、“怎么让回测可信”这些脏活累活里解放出来,重新聚焦回策略本身,也就是你真正相信什么、想赚什么钱、愿意承受什么风险。
1.3 量化策略到底是个什么东西
怕有人还在迷糊,我用一句话把量化策略讲明白:它是一套可重复执行的、用规则代替情绪的交易决策流程。
传统炒股,你可能是看到公司新闻、感觉走势不错、听朋友推荐,就买进去了。这里面每一步都是模糊的,“感觉不错”没法被检验,也没法被优化。量化策略就是把“买什么、什么时候买、买多少、什么时候卖、卖多少”全部写成明确规则,然后用历史数据去检验这些规则到底有没有效。
比如最简单的双均线策略,规则就是:短期均线上穿长期均线就买入,下穿就卖出。这套规则可以被任何人复现,而且回测结果是可以被追溯的。这个“可复现、可检验”的属性,才是量化和主观交易最本质的区别。理解了这一点,后面所有步骤你都不会走偏。
2. 从想法到回测:个人量化开发的完整路径拆解
2.1 数据层:个人能拿到的数据到底够不够用
量化策略的第一个支撑是数据。很多新手一上来就想搞分钟级、tick 级的高频数据,我劝你打住。个人开发做策略,日线级别的数据在绝大多数情况下已经够了,特别是你想验证的如果是趋势跟踪、均值回归这类逻辑,日线数据的信噪比和稳定性反而更好。
我用得比较多的是 akshare,它免费、更新快、接口覆盖广。一个典型的拉数据流程大概是这样的:
import akshare as ak import pandas as pd # 获取平安银行股票历史日线数据(前复权) df = ak.stock_zh_a_hist( symbol="000001", period="daily", start_date="20180101", end_date="20231231", adjust="qfq" ) # 统一列名,方便后续处理 df.columns = ["date", "open", "close", "high", "low", "volume", "amount", "amplitude", "pct_change", "change", "turnover"] df["date"] = pd.to_datetime(df["date"]) df = df.set_index("date") df = df.sort_index()这里有两个细节值得注意。
第一,字段名映射。不同数据源的列名差得很多,拿到数据第一步就要规整成统一格式,否则后面每个策略都要改字段名,很烦。我习惯一开始就固定一套标准列名:date、open、close、high、low、volume,其他字段按需保留。
第二,复权选项。A 股有除权除息,价格会跳空。如果不做复权处理,均线、动量这类指标会被分红送股产生的“假跌”干扰。网上很多代码跑出来的回测收益高得离谱,一查就是没复权,这种策略拿到实盘一定会原形毕露。
另外强调一句:数据源接口的稳定性和文档质量参差不齐,版本更新也频繁。如果你发现脚本某天突然报错,不要慌,大概率是数据接口调整了,去查一下对应库的文档或版本更新记录即可。日常开发建议定时更新相关库到最新版。
2.2 策略表达:从一条规则到一段代码
数据准备好了,接下来就是你策略想法的表达。这一步很多人会被“策略”两个字吓住,以为需要高深的数学。其实早期的量化策略,很多就是给交易员的经验写成了代码。
举个例子,你想做一个“放量突破”的策略。规则大概是:某只股票的成交量放大到过去 20 日均量的 2 倍以上,同时价格突破了过去 60 日的最高价,就买入。这个逻辑翻译成 Python 就是:
df["volume_ma20"] = df["volume"].rolling(20).mean() df["high_60"] = df["high"].rolling(60).max() # 放量突破条件 df["buy_signal"] = (df["volume"] > df["volume_ma20"] * 2) & (df["close"] > df["high_60"].shift(1))这里有个细节我特意写了.shift(1):突破判断应该用“昨天的 60 日最高价”,而不是“今天的”。因为价格突破这个动作发生在今天盘中,等到收盘确认,你用的是今天之前的历史数据。如果你直接把今天的 high 包含进去,当天突破当天就是最高价,逻辑上自洽但没有任何预测意义,这就是后面要讲的“未来函数”的雏形。
所以你看,策略的起点并不神秘。关键是你得问自己三个问题:什么信号触发买入?什么信号触发卖出?每次交易用多少仓位?把这三个问题想清楚,策略的核心骨架就出来了。
2.3 回测框架与 AI 辅助的工程验证
有了策略逻辑和数据,下一步就是回测。我强烈建议个人开发者用现成的开源框架,而不是自己从头写一套回测引擎。原因很简单:回测里坑太多,自己写一遍等于把所有坑都踩一遍,而 backtrader 这类框架已经把佣金、滑点、投资组合管理等细节处理好了。
用 backtrader 写一个最简单的双均线策略,代码框架大概是这样的:
import backtrader as bt class DoubleMA(bt.Strategy): params = (("short", 20), ("long", 60)) def __init__(self): self.ma_short = bt.indicators.SMA(self.data.close, period=self.p.short) self.ma_long = bt.indicators.SMA(self.data.close, period=self.p.long) self.cross = bt.indicators.CrossOver(self.ma_short, self.ma_long) def next(self): if not self.position: if self.cross > 0: self.buy() elif self.cross < 0: self.close()这段代码已经是一个完整的策略了。在__init__里定义指标,在next里写交易逻辑:金叉买入、死叉卖出。然后你需要一个Cerebro引擎来跑它:
cerebro = bt.Cerebro() cerebro.addstrategy(DoubleMA) # 喂数据 data = bt.feeds.PandasData(dataname=df) cerebro.adddata(data) # 设置初始资金和交易成本 cerebro.broker.setcash(100000) cerebro.broker.setcommission(commission=0.0003) print("初始资金:", cerebro.broker.getvalue()) cerebro.run() print("最终资金:", cerebro.broker.getvalue())你看看,用框架做回测,核心工作就变成了两件事:定义策略逻辑、配置交易成本参数。而 AI 在这里能帮你做什么?你只要把你脑子里的策略想法描述给它,它就能给你生成这样一份结构完整的 backtrader 策略代码。遇到报错,直接把报错贴给 AI,解释一遍上下文,它能帮你定位到问题。这些在过去都得自己一行行啃文档。
但这里我要强调一个边界:AI 能帮你把代码写出来,但它不会帮你判断“这个策略逻辑本身值不值得信”。代码只是工具,策略想法和验证过程必须你来把关。
2.4 给计划中的链路做一张完整地图
我习惯把整条个人量化开发链路拆成下面这几步,每一步对应一个明确产出:
第一步,定义假设。你要相信市场上存在某种可利用的规律,比如“强者恒强”或“跌多了会反弹”。这一步产出是一个可以写成规则的逻辑。
第二步,编码与回测。把逻辑变成代码,用历史数据跑出绩效指标。这一步产出是一份回测报告。
第三步,稳健性检验。改参数、换时间段、换品种,看策略还是不是有效。这一步产出是参数的敏感性分析和样本外表现。
第四步,模拟与实盘。用小资金跑一段时间,验证真实交易环境下的滑点、流动性、执行差异。这一步产出的是实盘修正。
这四步里面,AI 最高效的是第二步和部分第三步,而第一步和第四步必须靠你自己的判断力。别把顺序搞反了。
3. 实操记录:从零到一,开发并验证一套自己的趋势策略
3.1 明确目标与约束,避免开局就失控
我会用一套完整的实操来把上面的碎知识串起来。假设现在是新手小张,他想做一套 A 股日线级别的趋势跟踪策略。在动笔写代码之前,我让他先写下自己的约束条件:
- 资金规模:10 万元,单票最大仓位 30%;
- 交易品种:先从沪深 300 成分股里选流动性好的;
- 持有周期:偏中线,一笔单子持有几周到几个月;
- 风险底线:单笔亏损超过 5% 无条件止损,总回撤超过 20% 停止策略。
这些约束看起来简单,但价值极大。它决定了你策略的适用参数范围,也决定了回测结果能不能被真正执行。比如你定了单票 30% 的仓位限制,就不会写一个只持有一只股票的“满仓梭哈”策略;你定了止损线,就必须在代码里体现。很多人开发策略失败的根源不是策略不行,而是从一开始就没想清楚自己到底能承受什么。
3.2 第一步代码:先跑通,再谈性能
策略选型上,我让新手优先做趋势跟踪。因为它的逻辑最直观,容错率也高:趋势形成后入场,趋势结束离场。它不会让你频繁交易,对滑点和手续费的敏感度也相对低。
下面是完整实现,我用 akshare 拉数据,先用最朴素的形态把策略写出来:
import akshare as ak import pandas as pd import numpy as np # 拉数据,以某只样本股票为例 def load_data(symbol, start, end): df = ak.stock_zh_a_hist( symbol=symbol, period="daily", start_date=start, end_date=end, adjust="qfq" ) df.columns = ["date", "open", "close", "high", "low", "volume", "amount", "amplitude", "pct_change", "change", "turnover"] df["date"] = pd.to_datetime(df["date"]) df = df.set_index("date").sort_index() # 只保留需要用的列 return df[["open", "high", "low", "close", "volume"]] df = load_data("000001", "20180101", "20231231") # 计算均线 short_win = 20 long_win = 120 df["ma_short"] = df["close"].rolling(short_win).mean() df["ma_long"] = df["close"].rolling(long_win).mean() # 生成持仓信号:短均线在长均线之上持仓,否则空仓 df["position"] = np.where(df["ma_short"] > df["ma_long"], 1, 0) df["position"] = df["position"].shift(1) # 关键:信号次日开盘才执行 # 计算每日收益 df["ret"] = df["close"].pct_change() df["strategy_ret"] = df["position"] * df["ret"] df["cum_ret"] = (1 + df["strategy_ret"]).cumprod() # 输出核心绩效 total_return = df["cum_ret"].iloc[-1] - 1 annual_return = (1 + total_return) ** (252 / len(df)) - 1 print(f"区间累计收益: {total_return:.2%}") print(f"年化收益: {annual_return:.2%}")你注意看那一行shift(1)。这是个人量化开发里最重要的一行注释:信号产生后,我们假设的是第二天开盘执行,而不是当天收盘瞬间成交。很多新手回测收益特别高,就是在这类地方出了问题——把“看到信号”和“执行交易”做在了同一时刻,这在单价较小的票上会大幅虚增收益。
3.3 绩效结果怎么看,以及手续费和滑点怎么加
跑完上面的基础代码,你得到了一个累计收益。但千万别只看收益,要看一组更全面的指标。我总结成了这样一张表,是我看一份回测报告时必看的项目:
| 指标 | 作用 | 我的观察标准 |
|---|---|---|
| 年化收益率 | 衡量策略整体赚钱能力 | 和基准指数对比,单看绝对值没意义 |
| 最大回撤 | 衡量持有期间最惨时的亏损 | 超过 20%-30% 要小心 |
| 夏普比率 | 每承受一单位波动获得的超额收益 | 日频通常 1 以上能接受 |
| 交易次数 | 频率评估,避免过度交易 | 太少没有统计意义,太多手续费吞噬利润 |
| 盈亏比与胜率 | 两者的平衡关系 | 胜率低但盈亏比高也是好策略 |
然后紧接着,你要在回测里加入手续费和滑点。A 股佣金普遍在万二到万三,卖出还要加上印花税。滑点,也就是从信号产生到成交那一刻价格实际偏移的量,保守一点按每笔 0.1% 算。假如一个策略年交易 50 次,这 0.1% 的滑点一年就能吃掉 5% 的收益。很多策略回测漂亮,实盘一跑就变脸,十有八九就是这 0.1% 没有算进去。
用 backtrader 时你可以这样配置:
cerebro.broker.setcommission(commission=0.0003) # 佣金万三 # 滑点可以用自定义滑点类,或者简单在价格上做偏移为什么我反复强调这一点?因为回测的目的不是找一套“看起来能赚最多”的参数,而是找一套“在真实环境下还能活下来”的参数。如果回测里不含交易成本,你优化出来的参数一定偏向高频交易,因为高频交易在零成本假设下天然占优,而实盘中手续费会把这类策略拖垮。
3.4 参数怎么选,以及过拟合自检
双均线策略有两个核心参数:短期均线天数(short)和长期均线天数(long)。20 和 120 是我随手选的一个组合吗?不完全是。这个组合背后其实是“日线级别的中线趋势”这个直觉:20 天能平滑掉短期噪音,120 天大约对应半年,足够捕捉中期方向。但参数本身没有固定答案,不同品种、不同市场环境,最优参数差异很大。
正确做法是做一个参数敏感性分析。把 short 从 5 到 40,long 从 60 到 180,组合扫一遍,记录每组的绩效。然后你看的是一个“参数面”,而不是“一个点”:
- 如果只有某几个参数组合特别好,周围参数立刻崩掉,这叫“尖峰”,是典型的过拟合,换一段数据大概率失效;
- 如果一大片参数区间都表现得稳定不错,这叫“参数高原”,说明你的策略逻辑本身是成立的,参数只是调节器。
用代码做敏感性分析不复杂,就是把上面那段逻辑包进一个循环,记录每组参数的年化收益和最大回撤。出来的热力图如果条纹清晰、有连续的变化,心里就有底了。
最后,一定要做样本外测试。把数据切两段:前 70% 做参数搜索和策略开发,后 30% 当作“你从来没见过的数据”来做验证。如果在前段表现优秀的参数在后段同样表现稳定,策略的可信度才真正上升。这个动作在量化里叫“前测-后测”或者“样本外验证”,它能帮你挡住绝大多数自我欺骗式的开发过程。
4. AI 辅助开发中,哪些坑我已经替你踩过了
4.1 用 AI 生成初始代码的正确姿势
AI 辅助开发最大的价值是把“从零到能跑”的时间压缩到最短,但用不好也会把你的注意力带偏。我总结了一个三段式提问法,特别适合描述量化策略:
第一段,给背景。告诉 AI 你有哪个市场的数据、什么频率、哪段区间,以及用的什么回测框架。比如“我有一份 A 股日线数据,列名是 date/open/high/low/close/volume,时间是 2018 到 2023,我想用 backtrader 写一个双均线策略”。
第二段,给规则。把交易逻辑尽量拆分清楚。不要只说“低买高卖”,要说“当 5 日均线从下方穿过 20 日均线时,下一交易日开盘买入;当 5 日均线从上方穿过 20 日均线时,下一交易日开盘卖出全部仓位”。
第三段,给约束。说明资金量、仓位限制、手续费滑点等。这样生成的代码会从一开始就带着这些工程细节,而不是只给你一段玩具代码。
我试过很多次,按这个顺序描述,AI 生成的代码质量会明显更高,因为它能把你脑子里的约束条件直接编码进去,而不是留给你自己回头补。
4.2 让 AI 帮你优化代码,但别让它替你决定交易逻辑
有一个我特别想提醒的点:AI 在代码层面非常强,但在策略逻辑层面它只是一个“顺杆爬”的助手,它不知道你的钱是真实血汗钱。如果你对 AI 说“帮我优化这个策略,让回测收益更高”,它会不自觉地开始做三件事:增加交易频率、放宽持仓限制、挑选最优参数。这三件事做出来回测一定更好看,但实盘基本都会死得很难看。
所以我的习惯是:AI 只负责“实现”和“解释”,不负责“决策”。策略逻辑永远是我先想清楚,再让 AI 帮我写代码、优化代码结构、完成参数扫描的可视化。它告诉我“怎么算”,我来回答“算不算数”。
对你的建议也很简单:所有 AI 生成的交易决策规则,你在上实盘之前必须能用自己的话解释给另一个人听。如果你解释不清楚,就说明这个策略不是你理解的策略,那它大概率也不是你能拿得住的策略。
4.3 代码审查:哪怕 AI 写的,最后也得自己读一遍
我不反对直接让 AI 生成回测框架,但我强烈反对不读代码就直接跑。哪怕只是粗略浏览一遍,你也要确保这几件事是明确的:
- 买卖信号不是同日产生同日成交的;
- 手续费和滑点被计入了回测成本;
- 仓位和资金管理有明确规则,不是满仓梭哈;
- 策略输出结果包含交易记录明细,而不是只有一个最终收益数。
AI 写代码偶尔会犯“逻辑正确但含义相反”的错误,比如把均线金叉判断反了,一只股票 120 日长期下跌,它的 20 日均线会在大部分时间里高于 120 日均线,信号反了回测结果也会“看起来不错”——因为大跌反弹那几天它刚好买在低点。这类错误如果你不读代码,根本发现不了。读代码,不是让你逐行查语法,而是让你把策略逻辑和代码行为对照一遍,确认自己写的东西就是自己想要的。
5. 常见问题与排查技巧实录
5.1 回测收益高得离谱?先查未来函数
“未来函数”是回测里最危险的坑,它的意思是你用了当时实际拿不到的数据。最典型的就是我在前面反复提过的信号与成交同一天。
另一个常见案例是有的数据源本身就已经包含了全市场成分股调整信息,导致你在历史数据里选到的股票是“现在”才知道的好股票,这就是“幸存者偏差”,本质也是一种前视偏差。查法很简单:把策略里的每个数字都问一遍“这个值在决策当天收盘时能不能算出来?”你只要回到那一天,用当时已有的数据跑一次,逻辑上就干净了。
5.2 回测盈利、实盘亏损?先查成本模型
我见过太多人跑出一份漂亮的年化 30% 的回测报告,拿去跟朋友炫耀,结果一上实盘三个月就亏掉 10%。原因多半在成本。
A 股回测至少要考虑三类成本:佣金、印花税、滑点。佣金和印花税是看得见的费率,滑点是隐形的,但常常比前两者更致命。尤其是小市值的股票,你挂单买入可能瞬间击穿多个价位,真实成交价比你预期的高出不少。检验方法很简单:把你策略的换手率算出来,乘以一个保守的单边成本(比如 0.1%+0.1%),如果这个成本占年化收益的比例超过 30%,这个策略在实盘中的竞争力就要打个问号。
5.3 同样的策略,换一只股票就失效?先看适应性
新手最容易犯的一个错误是用一只股票上跑通的策略,认定它能通吃整个市场。但实际上,趋势策略在趋势特征明显的标的上表现好,在震荡特征明显的标的上会反复止损。
排查方法:把策略跑在一组不同风格的标的上,比如一组高波动的题材股、一组银行股、一组指数 ETF。如果策略只在某一个特定标的上赚钱,这就是过拟合信号;如果策略在一类风格的整体组合同上表现稳定,那么它的适应性才称得上合格。
5.4 高频报错与结果异常排查速查表
我把个人开发中经常遇到的几个现象和处理方式整理成了一张表,直接对照着查:
| 现象 | 可能原因 | 排查与处理 |
|---|---|---|
| 拉数据时报接口错误 | 数据接口版本更新或参数变化 | 升级相关库,检查文档 |
| 收益率曲线是平的 | 持仓信号从未触发 | 检查均线是否算出来、cross 事件是否被正确检测 |
| 单次交易收益异常大 | 未来函数或前视偏差 | 检查是否用了 shift,信号是否在当日被直接利用 |
| 参数微调后收益剧烈波动 | 过拟合 | 做参数敏感性分析,看是否存在参数高原 |
| 回测收益高但交易次数很少 | 数据覆盖期短,样本不足 | 拉更长历史数据,增加策略触发次数 |
| 和实盘差异明显 | 成本模型不够 | 加入佣金、印花税、滑点 |
5.5 代码报错了,正确的求助顺序
最后说说排查的求助顺序。新手遇到报错,第一时间会把错误信息复制粘贴到搜索引擎或 AI 工具里,这没问题,但我建议你先自己看一遍错误信息。很多 Python 报错的第一行就提示了出错文件、行号和错误类型——是数据为空、类型转换失败,还是网络请求超时。这个动作练三次之后,你就具备基本的 debug 能力了。
遇到比较复杂的策略逻辑问题,我建议按三个层次排查:先查数据对不对,再查信号有没有生成,最后查收益计算有没有问题。把这三个层次当成你 debug 的固定顺序,比东一榔头西一棒子要快得多。
我这几年做个人量化的体感是:AI 确实把入门门槛削掉了一截,但最终决定你能不能做好一套策略的,还是你对规则的理解、你要赚什么钱的判断、以及对风险的诚实程度。代码可以让 AI 写,数据有工具源可以免费拿,回测框架都是现成的,但“承认自己的策略在某些市场里就是不行”这个心态,AI 给不了你。它需要在一次次亏损和回撤里自己练出来。
如果你正准备开始做自己的第一套量化策略,我最后再分享一个小技巧:不要一开始就追求复杂算法,先把自己能讲清楚的一条简单规则,老老实实写成代码、跑完一年数据、看清楚它的每笔交易记录。等你做完这一遍,你对“量化”这两个字的理解,会超过 90% 只收藏过帖子但从未动手的人。