ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

量化回测工具怎么选?QMT、PTrade与开源框架的实盘差距解析

量化回测工具怎么选?QMT、PTrade与开源框架的实盘差距解析 1. 从一次策略翻车说起回测工具选错后面全白搭去年帮一个朋友看他写的双均线策略逻辑本身没大毛病参数区间也合理但实盘跑出来的曲线和回测曲线差了十万八千里。我让他把回测报告发过来一看成交明细就明白了——他的回测引擎默认按“当根K线收盘价成交”而且没有考虑滑点手续费也设成了万分之零。这种回测结果说白了就是自欺欺人。这件事让我意识到一个很现实的问题开发量化交易策略时大家常用的回测工具有哪些这个问题看起来像是在问“工具清单”但真正踩过坑的人关心的根本不是清单本身而是“哪个工具的回测结果更接近实盘”“哪个工具能让我少走弯路”。工具选错了策略逻辑再漂亮回测曲线再好看上了实盘照样被打回原形。所以这篇内容我不打算给你列一个干巴巴的工具名单而是从实际使用的角度把目前主流的几类回测工具拆开来讲——它们各自适合什么场景、回测机制有什么坑、代码怎么写、参数怎么设以及我在使用过程中踩过的那些坑。无论你是刚接触量化交易的新手还是已经写过几十个策略的老手应该都能从中找到对自己有用的东西。先给一个整体判断目前国内做量化回测主流选择集中在三个方向——QMT迅投、PTrade、以及开源Python回测框架比如Backtrader、vnpy、qlib等。另外同花顺Supermind、通达信这类平台也在往量化方向靠。它们之间的差异非常大选哪个取决于你的策略类型、资金体量、以及你对代码掌控程度的要求。2. QMT和PTrade到底怎么选先搞清楚它们回测引擎的底层逻辑2.1 QMT的回测机制事件驱动但细节藏得深QMT是迅投推出的量化交易终端目前在国内券商渠道覆盖比较广。它的回测框架是事件驱动型的也就是说策略在每个行情事件比如新的一根K线到达、或者tick更新时被触发然后执行你写的handlebar或者handle_tick逻辑。这个机制本身没问题问题在于它的默认参数设置。QMT的回测配置里有几个关键选项新手很容易忽略成交价格模式默认可能是“当前bar收盘价”但实盘中你的信号产生和成交之间有时间差。如果你的策略是收盘价触发信号、第二天开盘成交那回测时必须把成交价格改成“下一根bar开盘价”否则回测会严重高估收益。滑点设置QMT支持按比例或按跳数设置滑点。我的经验是对于流动性好的品种比如沪深300成分股滑点设1到2个跳对于小盘股或者流动性差的品种至少设3到5个跳。手续费和印花税股票卖出有印花税这个必须单独设不能只设一个综合费率。很多人在QMT里只填了佣金忘了印花税结果回测收益虚高。我自己的习惯是在QMT里跑任何策略之前先把回测参数按下面这个表配好参数项推荐设置说明成交价格下一根K线开盘价避免用当前bar收盘价造成未来函数滑点股票2跳期货1跳根据品种流动性调整佣金万分之三按券商实际费率填印花税千分之一卖出股票必须设期货不设最小交易单位100股A股股票回测起始资金与实盘一致不要用100万回测、10万实盘注意QMT的回测报告里有一个“年化收益”指标它是按自然日还是交易日计算的不同版本可能不一样。我建议自己用净值序列重新算一遍别直接信报告里的数字。2.2 PTrade的回测逻辑更偏向“组合管理”思路PTrade是恒生电子的产品和QMT并列为国内券商量化的两大主流终端。它的回测框架和QMT有一个本质区别PTrade更强调组合层面的管理而不是单标的的事件驱动。什么意思呢在PTrade里写策略你通常是在一个initialize函数里设定股票池、调仓周期、风控参数然后在handle_data里写调仓逻辑。它的回测引擎会自动帮你处理组合的持仓、现金、市值计算。这对于做多标的轮动策略的人来说非常方便但对于做单标的择时或者高频策略的人来说灵活性就不如QMT。PTrade回测有几个我踩过的坑调仓周期的隐含假设PTrade的handle_data默认按天调用但如果你设了按周调仓它会在每周第一个交易日执行。这里有个细节——它是按自然周还是交易周实测下来是按交易周但如果你在周三才把股票加入池子它可能要到下周一才调仓。这个延迟在回测里会被忽略但实盘里就是真金白银的差距。停牌处理PTrade回测对停牌股票的处理是“跳过”但实盘中停牌股票你是卖不掉的。如果你的策略在停牌期间发出卖出信号回测会假装你卖掉了实盘却卖不掉。这个差异在持有小盘股时特别致命。分红送转PTrade的回测默认是不复权处理也就是说如果股票分红你的持仓市值会突然下降但现金账户不会自动增加。你需要手动在策略里处理分红再投资否则回测收益会被低估。2.3 一个简单的对比表维度QMTPTrade回测机制事件驱动逐bar/tick组合管理按调仓周期适合策略择时、高频、单标的轮动、多标的、组合滑点设置灵活可按跳数相对简单停牌处理可配置默认跳过需注意分红处理需手动需手动学习曲线较陡文档一般较平缓示例多选哪个我的建议是如果你做的是股票多因子轮动或者ETF轮动PTrade上手更快如果你做的是期货CTA或者日内择时QMT更合适。当然很多券商两个都提供你可以都试试再决定。3. 开源Python回测框架自由度高但坑也更多3.1 Backtrader经典但有点“老”了Backtrader是我最早用的开源回测框架功能确实全支持多标的、多周期、自定义指标、多种订单类型。但它的开发活跃度这几年明显下降了而且有一个很让人头疼的问题它的回测速度在标的数量多的时候会急剧下降。我做过一个测试用Backtrader回测一个包含50只股票的月度轮动策略回测10年的数据跑一次要将近8分钟。同样的策略用向量化回测框架比如vectorbt或者自己用pandas写只需要几秒钟。这个差距在策略迭代阶段是致命的——你每改一个参数就要等8分钟一天下来跑不了几组。Backtrader的另一个坑是它的默认成交机制。在Backtrader里如果你用cheat_on_open模式它会在当前bar开盘时成交但你的信号是基于上一根bar收盘算出来的。这个逻辑是对的但如果你忘了设cheat_on_open它默认按当前bar收盘成交那就引入了未来函数。3.2 vnpy国内期货CTA的首选vnpy是国内做期货CTA策略最常用的开源框架之一。它的回测模块vnpy.app.cta_strategy.backtesting是专门为CTA策略设计的支持tick级回测、多品种组合、参数优化。vnpy的回测有一个很好的设计它把回测和实盘用同一套策略代码。也就是说你写的策略在回测和实盘里跑的是同一个on_bar或on_tick函数只是数据源和交易接口不同。这大大减少了“回测能跑、实盘报错”的情况。但vnpy也有它的局限股票支持较弱vnpy的核心是期货虽然也支持股票但股票的分红、停牌、涨跌停处理不如QMT和PTrade完善。数据准备麻烦vnpy需要你自己准备历史数据而且对数据格式有要求。如果你没有稳定的数据源光是数据清洗就要花不少时间。参数优化耗资源vnpy的参数优化是暴力穷举如果你有5个参数、每个参数10个候选值那就是10万次回测。没有并行计算的话跑一天都跑不完。3.3 qlib微软出的AI量化框架qlib是微软亚洲研究院开源的量化投资框架它的定位和前面几个不太一样——它更偏向AI驱动的量化研究内置了很多机器学习模型和因子分析工具。qlib的回测引擎是向量化的速度非常快。它把整个回测过程抽象成“因子计算→模型预测→组合构建→收益计算”几个步骤每个步骤都可以并行化。如果你做的是多因子选股或者机器学习选股qlib的效率比Backtrader高一个数量级。但qlib的学习曲线很陡。它的文档虽然全但很多概念是微软自己定义的比如“表达式引擎”“数据集缓存”“滚动训练”等。如果你只是想快速验证一个简单的均线策略用qlib就是杀鸡用牛刀。3.4 一个实际的选择建议场景推荐框架理由期货CTA策略vnpy专为CTA设计回测实盘一致股票多因子选股qlib向量化快因子分析工具全简单策略快速验证自己用pandas写最灵活没有框架限制多标的复杂策略Backtrader功能全但速度慢需要参数优化vnpy或qlib支持并行Backtrader较慢我个人的做法是先用pandas快速验证策略逻辑确认有效后再用vnpy或QMT做精细回测。这样既保证了迭代速度又保证了回测的严谨性。4. 回测里最容易骗自己的五个细节4.1 未来函数你以为没用到其实到处都是未来函数是回测里最隐蔽的坑。它不一定是你故意用了未来的数据很多时候是框架的默认行为导致的。举个例子你在QMT里写了一个策略用close价格计算均线然后当均线上穿时买入。如果你没有设置“下一根bar开盘成交”QMT默认会在当前bar收盘时成交。但问题是当前bar的收盘价你是在bar结束才知道的而你的买入动作发生在同一时刻——这在实盘中是不可能的。更隐蔽的是财务数据。很多策略会用市盈率、市净率等财务指标选股。但财务数据是有发布延迟的——一季报可能在4月底才发布但你在回测里3月31日就用了。这个差异会让回测收益虚高很多。我的做法是在回测里给所有财务数据加一个发布延迟比如季报延迟30天年报延迟90天。这样虽然会让回测收益下降但更接近实盘。4.2 幸存者偏差退市的股票去哪了如果你用的股票池是“当前沪深300成分股”然后回测过去10年那你已经犯了幸存者偏差的错误。因为当前的成分股是过去10年里表现好的股票那些退市的、被调出的股票不在你的池子里。正确的做法是使用历史成分股数据也就是说在回测的每个时间点使用当时真实的成分股列表。QMT和PTrade都支持历史成分股但需要你手动配置。开源框架里qlib对这块支持比较好。4.3 过拟合参数越优化实盘越差我见过太多人把回测当成“找最优参数”的工具。他们会在一个参数区间里穷举然后选夏普比率最高的那组参数。结果实盘一跑完全不是那么回事。过拟合的本质是你在用历史数据拟合噪声。参数越多、优化越细拟合噪声的程度就越高。我的经验是参数不要超过3个每个参数的候选值不要超过5个优化时看参数平原不要看参数尖峰留出一段样本外数据做验证4.4 滑点和流动性小盘股的隐形杀手回测里最容易忽略的就是滑点。对于大盘股滑点可能只有0.1%但对于小盘股滑点可能高达1%甚至更多。如果你的策略年化收益是15%滑点吃掉5%那实际收益就只有10%了。更严重的是流动性问题。如果你的策略信号是“买入某只小盘股100万元”但那只股票每天成交额只有500万元你的买入就会把价格推高实际成交价远高于回测里的价格。我的做法是在回测里加一个成交量限制比如单笔交易不超过当日成交额的1%。如果超过就分批成交或者放弃这笔交易。4.5 手续费和税费积少成多很多人设手续费时只设佣金忘了印花税。A股卖出有千分之一的印花税这个必须设。另外如果你的策略换手率高手续费的影响会非常大。我算过一笔账一个年换手率10倍的策略如果每次交易的综合成本是0.15%佣金万三印花税千一滑点那一年的交易成本就是1.5%。如果你的策略年化收益是20%扣掉成本后只剩18.5%。看起来不多但复利10年下来差距是巨大的。5. 从回测到实盘那些回测报告不会告诉你的事5.1 回测收益打七折是常态我做过一个统计我自己写的策略回测年化收益和实盘年化收益的比值平均在0.7左右。也就是说回测20%的策略实盘大概14%。这个折扣来自滑点、手续费、成交延迟、停牌、分红处理等各种因素。所以我在评估一个策略时会先把回测收益打个七折再看是否满足我的收益要求。如果打七折后还不如买指数基金那这个策略就没有实盘价值。5.2 回测最大回撤要加50%回测里的最大回撤是在“完美成交”假设下算出来的。实盘中因为滑点和流动性问题你的回撤会比回测更大。我的经验是实盘最大回撤大约是回测最大回撤的1.5倍。比如回测最大回撤是20%那实盘要做好回撤30%的心理准备。如果你承受不了30%的回撤那这个策略就不适合你。5.3 策略容量不是所有策略都能做大回测里你可以假设自己买入1000万、1个亿但实盘中资金量越大对市场的冲击就越大。一个在小资金下有效的策略资金量大了之后可能就失效了。评估策略容量时我会看两个指标日均成交额策略持仓股票的日均成交额总和至少要是策略资金的10倍以上。换手率换手率越高的策略容量越小。因为每次调仓都会对市场产生冲击。5.4 实盘前的模拟盘验证在正式上实盘之前我强烈建议先跑一段时间的模拟盘。QMT和PTrade都支持模拟交易你可以用实时的行情数据跑你的策略但不投入真金白银。模拟盘能帮你发现很多回测里发现不了的问题比如数据延迟、接口报错、订单被拒等。这些问题在回测里不会出现但实盘中很常见。6. 几个我常用的回测辅助工具和技巧6.1 用pandas做快速验证在正式用QMT或vnpy之前我通常会用pandas快速验证策略逻辑。比如一个简单的双均线策略用pandas写出来大概是这样import pandas as pd import numpy as np # 假设df有date和close两列 df[ma5] df[close].rolling(5).mean() df[ma20] df[close].rolling(20).mean() df[signal] np.where(df[ma5] df[ma20], 1, 0) df[position] df[signal].shift(1) # 避免未来函数 df[return] df[close].pct_change() df[strategy_return] df[position] * df[return] df[cumulative] (1 df[strategy_return]).cumprod()这段代码的核心是shift(1)——它确保你用的是昨天的信号、今天的收益避免了未来函数。虽然简单但能快速告诉你策略有没有基本的盈利能力。6.2 用vectorbt做参数扫描如果你需要做参数优化vectorbt是一个很好的选择。它是向量化的速度比Backtrader快很多。而且它内置了很多可视化工具能帮你快速找到参数平原。6.3 数据源的准备回测的数据质量直接决定了回测结果的可信度。我常用的数据源包括QMT自带数据日线、分钟线都有但tick数据需要额外购买。Tushare免费的日线和财务数据适合做基本面策略。AkShare开源的数据接口覆盖股票、期货、基金等。券商提供的Level-2数据如果你做高频策略Level-2数据是必须的。提示无论用哪个数据源都要做数据清洗。我遇到过数据里出现负价格、成交量突然放大100倍、日期重复等问题。这些脏数据如果不处理回测结果完全不可信。6.4 回测报告的解读拿到回测报告后不要只看年化收益。我通常会看这几个指标指标关注点年化收益打七折后是否满足要求最大回撤加50%后是否能承受夏普比率大于1才算合格胜率结合盈亏比看不要单独看换手率换手率越高容量越小收益分布是否集中在少数几笔交易如果收益集中在少数几笔交易那这个策略的稳定性就值得怀疑。一个好的策略收益应该是相对均匀地分布在多笔交易上的。7. 关于回测工具我最后想说的几件事回测工具的选择没有绝对的对错只有适不适合。QMT和PTrade适合国内券商环境下的实盘交易vnpy适合期货CTAqlib适合AI量化研究pandas适合快速验证。你完全可以根据自己的需求组合使用。但无论用什么工具回测的严谨性永远比工具本身更重要。我见过用QMT做出漂亮回测但实盘亏钱的人也见过用pandas简单回测但实盘稳定盈利的人。差别不在于工具而在于对回测细节的把控。如果你刚开始接触量化交易我的建议是先用pandas写一个最简单的策略把回测的每个环节都搞清楚——信号怎么产生、成交怎么模拟、手续费怎么算、滑点怎么设。等你对这些细节有了感觉再去用QMT或vnpy做更复杂的策略。最后分享一个我自己的习惯每次回测完我都会问自己一个问题——“如果这个策略明天开始实盘我最担心什么”如果我能清楚地回答这个问题并且有对应的应对方案那这个策略才值得上实盘。如果回答不出来那说明回测里还有我没想清楚的地方。
返回列表