很多人找我聊量化投资,开口第一句基本都是“能不能分享点策略代码”,第二句是“我学了Python,接下来该学什么库”。每次听到这种问题我都挺感慨的,因为大家把量化投资理解成了一件“写代码”的事,但在我自己做了这么多年量化交易之后,越来越确信一件事:代码在量化投资里占据的比重,远比你想象中小得多。
这个认知很反直觉。毕竟市面上所有量化相关的课程、书籍、开源项目,铺天盖地全是代码示例——什么python量化交易策略代码、backtrader回测框架、pandas金融数据分析,看起来好像掌握了这些就能稳定盈利。但真实情况是,代码只是整个量化体系里最不稀缺的一环,真正决定你能不能赚钱的,是那些藏在代码背后、几乎没人会主动跟你讲的东西。
所以这篇内容我不想讲任何具体的技术实现,也不想贴大段代码,而是想认真聊一聊量化投资里最反直觉的三个真相。这些道理其实很多做了几年量化的人都懂,但新手往往要踩过无数坑之后才能自己悟出来。如果你正处于“学完代码不知道怎么用”的阶段,或者“策略回测很赚钱,一上实盘就亏”的困惑期,这篇文章应该能帮你省下不少试错成本。
1. 为什么说“忘掉代码”才是入门量化的正确姿势
先讲个我自己的经历。早年刚入行的时候,我在一个论坛上看到一个帖子,楼主贴出了一段看起来非常精妙的策略代码,逻辑完整、注释清晰,回测曲线漂亮得像是印刷品。评论区所有人都在跪求源码,楼主也很慷慨地放出了完整实现。我拿到手之后如获至宝,花了一整个周末去研究他的每一行代码,然后复制下来跑回测,发现收益曲线确实和他贴出来的一模一样。
但问题来了——我把这个策略放到另一只股票上,收益明显缩水;改一下参数,表现忽好忽坏;放到模拟盘跑了一个月,亏得我差点怀疑人生。后来我才慢慢明白,那段代码本身确实没问题,但它能赚钱的核心原因根本不在代码里,而在数据选择、市场环境、执行细节、资金管理这些看不见的地方。代码只是把这些东西串起来的载体,真正值钱的是载体背后的东西。
这事儿给我的触动特别大。从那以后我开始观察身边真正靠量化稳定盈利的朋友,发现他们聊天的内容几乎不涉及代码——聊的是某个品种的微观结构、某个因子在特定市场状态下的表现、资金曲线回撤到多少应该砍掉策略。代码在他们嘴里出现得就像吃饭用筷子一样自然,但从来不是讨论的核心。
我并不是说代码不重要。代码是你把想法变成现实的手段,它重要,但它不是你先要解决的问题。 就像你学开车,真正决定你能不能安全到达目的地的是路况判断、驾驶技术、交通规则意识,而不是你会不会调座椅、握方向盘的姿势标不标准。大多数新手把大量时间花在了“调座椅”上,甚至误以为调好座椅就等于会开车了。
在这个认知的基础上,我想说一个更扎心的判断:如果你的交易逻辑本身不成立,再漂亮的代码也救不了你。 很多新手喜欢从技术指标入手,比如“金叉买入、死叉卖出”,然后把这个逻辑写成代码,跑出回测,发现胜率不错,兴奋得不行。但实际上这种通用逻辑早就被市场充分定价了,回测能赚钱往往只是因为你在无意中引入了未来函数或者幸存者偏差。这些问题的根源不在代码,而在你对市场逻辑的理解不够深。
所以“忘掉代码”不是让你不学代码,而是让你先想清楚一个更根本的问题:你的策略凭什么是赚钱的? 这个问题回答不了,代码写得再好也是白搭。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 反直觉真相一:Alpha的来源从来不在代码里,而在信息差和逻辑深度里
很多刚接触量化的人都有一个幻觉:只要我的代码跑得足够快、模型足够复杂、用了最新的机器学习算法,我就能从市场里挖出别人挖不到的规律。这个想法非常危险,因为它把量化投资的超额收益来源彻底搞错了方向。
2.1 代码表达的是逻辑,逻辑本身才是alpha
举个例子,很多人写过“双均线策略”——5日均线上穿20日均线买入,下穿卖出。这个策略用Python实现只要十来行代码,网上随便一搜全是pandas.DataFrame处理均线的教程,甚至某些量化平台已经把这种策略做成了可视化模块,拖拽就能生成。那问题来了:这么简单、网上到处都是的策略,凭什么能赚钱?
答案是:它本身不赚钱,只有在特定市场环境和特定标的上,配上合理的资金管理和出场逻辑,它才可能赚钱。 而这个“特定环境”的判断、资金管理的规则、执行时的细节,才是alpha的来源。代码只是把这一切固化下来的工具。
很多人不理解“信息差”这个词在量化里具体指什么。我拆开讲:Alpha可能是你比别人更早发现了某个数据源里隐藏的信号,可能是你对某个行业的理解比别人深所以知道什么因子在该行业更有效,也可能是你优化了一个别人忽视了的执行细节从而降低了冲击成本。这些东西每一个都是策略逻辑的一部分,但没有任何一个能靠纯写代码完成。
2.2 经典策略的代码通常只有几百行,但背后的研究可能耗时数月
我见过有人把一个高频做市策略的核心逻辑用C++实现,总共不到500行。如果单看代码,你会觉得这玩意儿简直简单到不像话——但为了论证这个策略在统计上显著有效、处理好所有微观结构的坑、把延迟优化到微秒级,他花了大概八个月。
反过来说,你到GitHub上搜量化交易策略代码,能搜出几百上千个仓库,动辄几千行代码,看起来很厉害,但绝大多数都是把网上公开的逻辑重新实现了一遍。这类策略最大的问题是:所有人都知道它,所以它早就没有alpha了。
这个现象在量化圈有个很扎心的说法:“If the strategy is on GitHub, it‘s already dead.” 虽然有点绝对,但方向是对的。现在的问题不是代码太少,而是可复制的代码太多,真正稀缺的是代码背后的决策逻辑。
2.3 我的建议:先写投资逻辑说明书,再写代码
这里我想给一个具体可操作的建议,尤其适合正在学量化但还没有自己策略的新手。如果你现在脑子里有一个想法,比如“我觉得某只股票在财报超预期之后会有一波趋势行情”,不要急着打开IDE写代码,先拿出一张纸,把下面几个问题写清楚:
- 我的这个想法,经济学逻辑是什么?财报超预期为什么能引发趋势延续?
- 在什么市场环境(牛市、熊市、震荡市)下这个逻辑最有可能成立?
- 什么情况下这个逻辑会失效?我如何识别这种失效并及时止损?
- 如果这个逻辑被市场充分定价了,我靠什么来保证自己的执行比别人快或比别人好?
- 整个策略适合多长的持仓周期?对应的资金容量是多少?
这些问题全部能回答清楚,再动手写代码不迟。这时候代码只是把你已经想明白的逻辑转译成机器能理解的语言,你不再需要“边写边想”,而是“边写边验证”。我见过太多人一上来就写代码,写了三个月,代码越写越复杂,但你问他“你这个策略的核心逻辑是什么,为什么能赚钱”,他支支吾吾说不清楚。这种策略,基本不可能走到实盘。
3. 反直觉真相二:回测越完美,离亏损越近
这是我最想强调的一个真相,也是几乎每个量化新手都会踩的大坑。人类的直觉天然喜欢“好看的结果”,一条优美向上的资金曲线对任何人都有巨大的吸引力。但在量化投资里,回测结果的完美程度和策略实盘赚钱的概率往往成反比——回测越完美,实盘越容易翻车。
3.1 过拟合:把“历史巧合”当成了“市场规律”
过拟合这个概念听起来很学术,但用大白话说就是:你的模型记性太好了,把历史上所有的噪音都背了下来,反而忘了市场真正的规律长什么样。
举个例子,你用2018年到2023年的数据回测一个策略,发现如果把均线参数设成MA(13, 27),年化收益能达到80%,最大回撤只有12%,堪称完美。但如果你把参数改成MA(12, 28)或者MA(14, 26),收益立刻降到20%以下。这时候你就该警惕了——一个真正有效的策略,参数应该是平滑的、鲁棒的,而不是只在某一个特定数值下才表现优异。
为什么?因为市场并不会因为你的均线参数恰好是13和27就对你格外照顾。出现这种情况只说明一件事:你用六年的历史数据硬生生凑出了一组“只适合这段历史”的参数,本质上和拿着今天彩票的开奖号码去推明天开什么号码是一个道理。
3.2 容易被忽略的前视偏差,是回测曲线最大的水分来源
代码写得越多,越容易犯这类错误,因为很多偏差藏得非常深。举几个我当年踩过的真实例子:
- 用当天的收盘价计算信号,却在当天开盘价就执行买入——这是最经典的前视偏差。因为收盘价要等收盘后才知道,你最早也只能在第二天开盘才能交易。
- 做因子分析的时候,直接用了因子当前值去预测未来收益,但该因子实际上要滞后两个交易日才能拿到数据。
- 没有考虑涨跌停限制,回测里买入了当天一字涨停买不进的股票,卖出时也没考虑跌停卖不出的情况。
你以为自己在赚钱,实际上你是在用未来数据“作弊”。这种策略上实盘必亏,因为真实的交易根本没有那个信息优势。
3.3 对付回测幻觉的三个实操方法
下面这几个方法是我自己一直在用的,实测能筛掉很大一部分“看起来很美”的策略:
方法一:拒绝单次回测,改成滚动样本外测试。 别用全部数据跑一次回测就下结论,而是把数据切成多段,比如前60%做参数优化,后40%做样本外验证。更严格的做法是滚动窗口——每推进一步,就重新优化一次参数,然后用下一段没参与优化的数据验证。这样出来的结果才有参考意义。
方法二:做参数敏感性测试。 一个稳健的策略,参数在合理范围内连续变化时,收益曲线不应该剧烈波动。我会画一张热力图,横轴是参数A,纵轴是参数B,颜色是夏普比率,如果整张图只有一小块区域是红的、周围都是惨淡的蓝绿色,那这个策略基本可以扔掉了。真正好的策略,整张图应该能看到一片连续的暖色区域。
方法三:主动给回测加上“摩擦成本”再跑一遍。 很多人回测时只扣一个固定的佣金率,完全忽略冲击成本和滑点。我的习惯是把双边交易成本调高到实际值的1.5到2倍来跑回测,如果策略在这种苛刻条件下依然能盈利,才勉强算过了第一关。扣完这些成本曲线立刻拉胯的策略,不是市场不给你机会,是你的策略本身就没那么强。
4. 反直觉真相三:决定最终盈亏的,往往发生在你打开代码编辑器之前
这个真相比前两个更反直觉,因为它直接推翻了很多人的核心信仰——只要策略好、代码好,就能赚钱。但事实是,一个平庸的策略配上优秀的资金管理与风控,长期表现大概率好过一个优秀策略配上糟糕的风控。
4.1 资金管理和风控才是量化交易的“隐形支柱”
我见过不少实盘亏钱的人,他们复盘的时候喜欢归因于“策略失效了”“市场风格变了”,但实际上大多数情况下都是资金管理出了问题。比如:
- 单笔仓位过大,连续几次亏损就到了自己心理承受的极限,被迫砍仓;
- 买入时从不设止损,寄希望于“扛一扛就回来了”;
- 策略明明已经出现持续回撤、超过历史最大回撤,但还是出于各种原因不想停掉;
- 信号来了不敢执行,信号走了舍不得离场,情绪完全接管操作。
这些都是量化交易里最经典的人性陷阱。而量化投资之所以强调“用规则代替情绪”,很多人的第一反应是把交易信号交给代码自动执行,以为这样就能杜绝人性弱点。但实际上,风控规则本身也是代码逻辑的一部分,你需要花和策略研究同样多的精力去设计它。
4.2 一个反直觉的风控原则:先定义“怎么活下来”,再考虑“怎么赚钱”
很多新手设计策略的时候,第一个目标是“一年翻倍”,但我建议你先反过来想:这个策略在最坏的情况下会亏多少?如果连续亏损10次,我的账户还能不能正常运行?最大回撤达到多少,我就应该关掉策略重新审视?
举个例子。假设你的账户总资金是100万,单笔止损是总资金的1%,也就是1万块钱。那么你的仓位就必须设计成:当价格触发止损位时,亏损刚好是1万。这个计算过程叫做“头寸管理等化风险”,它是风控的核心。可惜很多人的做法是,我拿30万买这只股票,亏10%就走,对总资金来说这就是3%的亏损——如果连续遇到5次这种情况,账户已经亏掉15%,想回本需要赚接近18%。这就是典型的仓位失控。
我自己设计风控时会先写一份“风险管理SOP”,写明这些硬性规则:
- 单笔交易最大亏损不超过总资金的1%到2%;
- 单日最大可接受亏损不超过总资金的4%,超了当天强制停止交易;
- 单一策略的最大回撤阈值,比如回撤超过20%,无条件停掉策略进入复盘流程;
- 策略组合层面的相关性控制,避免多个策略同时失效。
这些规则想清楚之后,你再把它固化到代码里。你会发现,代码在这里扮演的角色不是“寻找alpha”,而是“限制人性的恶”。 这和使用代码挖掘赚钱信号的本质完全不同。
4.3 实盘运维中,那些“看不见的代码功夫”才是致命细节
如果你做了几年量化,一定会对下面这些场景感同身受:
- 凌晨两点,服务器无故断开,程序自动交易停了,等第二天早上发现时已经错过最佳开仓时机;
- 券商接口突然更新,你没适配,下单命令一直报错,你还在傻乎乎地以为只是网络波动;
- 策略在回测里跑得飞起,一上实盘就开始延迟,查了半天发现是数据源行情推送的格式和文档上写的不一致。
这些全是“写代码”吗?算,也不是——它们更是工程能力、系统设计能力和责任心的问题。量化交易是一场“自动驾驶”,你重写策略逻辑的频率可能几个月一次,但你需要检查系统运行状态、监控策略表现、处理各种异常的频率是每天。 大多数人的精力分配是90%研究策略、10%处理运维,而真正稳定盈利的人往往反过来了。
5. 如果非要学代码,优先学这些比学语法重要得多
文章写到这里,肯定会有人问:既然你说代码不重要,那到底还要不要学Python?要学的话先学什么?
坦白说,该学还是要学的,只是学习重点完全不一样。 大多数人学量化代码,花大量时间在“语法”“Python基础”“各种库的API”上,但我认为真正值得优先学的,是下面这几项工程能力。
5.1 数据清洗能力,比任何策略模型都重要
很多人的第一堂Python量化课,教的是怎么用pandas读CSV、画K线、算均线。但真实世界的金融市场数据,比你想象中脏得多——缺失值、重复值、除权除息导致的跳空、停牌导致的无成交记录、不同数据源的时间戳对齐问题……这些才是你每天要和数据打交道时真正会遇到的麻烦。
一个优秀的数据清洗流程,能直接决定你的回测是不是可信。我见过太多回测结果特别好的策略,最后发现是除权复权没处理对,把高送转当成真实收益了。数据处理的功夫,才是量化代码里最枯燥但最不允许出错的部分。 所以如果你想学代码,第一优先是把pandas用熟练,特别是处理时间序列、处理缺失值、多表拼接这些操作。
5.2 回测框架的使用,不等于会用回测工具
现在市面上回测框架很多,比如backtrader、vectorbt、qlib,互联网上的教程一抓一大把。但我建议你用它之前先搞清楚一个问题:这个框架怎么处理前视偏差?它的撮合逻辑是“开盘价成交”还是“收盘价成交”?它怎么扣手续费的?默认滑点设的多少? 很多框架默认设置非常理想化,直接拿来测策略会给你一个严重虚高的结果。
我在自己写策略验证的时候,很少直接跑框架的默认参数,而是强制自己回答清楚下面这张表里的每一行:
| 关键配置项 | 默认值通常是什么 | 实际交易中应该怎么设 |
|---|---|---|
| 成交价 | 以收盘价/开盘价成交 | 视策略类型:盘中信号用盘口价,收盘信号用次日开盘价 |
| 手续费 | 固定比例,很低 | 按真实券商费率加上滑点估算 |
| 滑点 | 通常为0 | 根据品种流动性设定,流动性差的品种滑点极高 |
| 涨跌停 | 很多框架不考虑 | 必须考虑,回测里买不到涨停买不进 |
| 停牌股票 | 默认可以交易 | 必须过滤,停牌期间根本不能成交 |
这么一套问题问下来,你会发现很多策略根本经不起推敲,但也正因为如此,你的下一个策略会变得靠谱得多。这就是“把代码当作验证工具,而不是赚钱机器”的正确打开方式。
5.3 别再沉迷“把所有功能做成自动化”
最后说一个很多程序员的通病——一学Python就想着把所有事情都自动化,恨不得让电脑自己下单、自动调参、自动复盘。 这种追求本身没有错,但它会让你的注意力全部集中在“工程”上,反而忽略了“研究”本身。
我更建议的做法是:把精力先集中在策略逻辑的验证和迭代上,自动化系统等策略本身稳定了再逐步加码。你写一个自动发邮件的脚本,远不如你每天手动看一眼策略表现、感受一下今天市场发生了什么更有价值。前者的本质是提高效率,但如果你在做一件“方向错误”的事情,效率越高,死得越快。
6. 忘掉代码之后,你的量化之路应该怎么走
如果你接受了我上面说的这些逻辑,那么你接下来的问题应该是:既然代码不是核心,那我到底该怎么学习量化投资?
6.1 第一步:把时间花在市场微观结构和交易机制上
很多人连最基本的交易规则都没搞透,就开始写策略,这是最大的问题。比如:你知道A股和港股的涨跌停制度有什么不同吗?你知道期货的夜盘交易时段是什么时候吗?你知道市价单和限价单在极端行情下的成交差别有多大吗?这些基础知识看起来和代码无关,但它们决定了你的策略能不能在真实市场里生存。
6.2 第二步:从“研究一个极简策略”开始,而不是模仿大神的复杂模型
与其去GitHub上一个几百行的开源策略上改来改去,不如自己独立设计一个极简策略——比如就用一个最简单的布林带突破,或者均线金叉,然后认认真真地走完整个流程:写清楚逻辑假说、收集数据、设计回测、调整成本模型、做样本外测试、写风险处置预案。这个过程跑完一遍,你对量化投资的认知会提升一个量级,比你看十个开源项目都有用。
6.3 第三步:忘记“圣杯”,建立“持续迭代”的心态
写代码时你追求一次运行成功,但做量化策略,你永远不可能一次就做对。这是一个持续打磨、不断迭代的过程。 我今天在用的策略,是过去三年里不停微调、替换、废弃了无数个版本才沉淀下来的。每跑一段时间,我都会重新审视:这个策略的alpha有没有衰减?市场环境是不是发生了变化?还有没有新的数据源可以接入?
说实话,这种工作方式的乐趣,跟我刚入行时以为的“写个牛B的代码,躺着收钱”完全不一样。但它给我带来了更踏实的结果,也让我真正理解了什么叫“投资是一门管理风险的学问”。
如果你现在还处在“把写代码当作量化投资的全部”的阶段,不妨先停下来,从这篇文章提到的这几个角度重新审视一下自己的学习和实践路径。别急着写代码,先让你的交易逻辑配得上你写的那些代码。
