引言:策略的”超额收益”,先过成本这一关
在回测框架篇里我们留了一个钩子——六大陷阱里有一条叫”滑点/手续费处理不当”,篇幅所限没展开。这一篇把它单拎出来讲透,因为成本是个人量化最容易自欺、也最容易致命的一环。
原因很简单:策略收益是减法,成本是必减项。一条年化 15% 的策略,扣完完整成本可能只剩 8%;再叠加数据地基和程序化执行里的其他摩擦,超额可能荡然无存。很多个人量化者写在 Excel 里”看起来赚钱”的策略,本质都是没把成本算全、算对。
这一篇的目标:把 A 股完整成本清单列清楚、讲明白每项的口径、给出”换手率 × 成本 = 真实抽血”的快速估算公式,并补上回测框架篇没展开的冲击成本、机会成本、QMT 实盘计量这些进阶维度。把成本账本做实,alpha 才不是幻觉。
一、A股完整成本清单:不止佣金和印花税
个人最容易犯的错,是回测只设一个”千三佣金”就完事。A 股真实交易成本远不止两项,按”显性 vs 隐性”分一下:
| 类别 | 项目 | 收费方 | 单/双边 | 当前费率(以最新政策为准) |
|---|---|---|---|---|
| 显性成本 | 佣金 | 券商 | 双边 | 万 2.5 ~ 万 3(普通户),可谈至万 1 |
| 印花税 | 税务 | 卖出单边 | 万 5(2023 年减半后) | |
| 过户费 | 中登 | 双边(沪市) | 万 0.1,最低 1 元 | |
| 规费(经手费/证管费/证券结算费) | 交易所/中登 | 双边 | 含在佣金内,券商不另收则忽略 | |
| 隐性成本 | 滑点 | 市场 | 双边 | 0.1% ~ 0.5%(与下单方式强相关) |
| 冲击成本 | 市场 | 双边 | 大单时显著,与成交量成反比 | |
| 机会成本 | 市场 | — | 未成交时错失的信号收益 |
几个容易被忽略的细节:
- 佣金有最低 5 元门槛:小资金高频调仓时,单笔佣金不足 5 元按 5 元收,等效费率可能远超名义费率——1 万元本金万 2.5 名义费率 = 2.5 元,实际收 5 元,等效万 5。
- 印花税是卖出单边:很多人回测把它设成双边,会高估成本;也有人完全漏掉,会低估。正确口径是只在卖出时扣。
- 过户费只沪市收:深市股票不收过户费,回测时按股票代码区分处理。
- ETF/可转债成本结构不同:ETF 无印花税、无过户费,佣金可谈至万 0.5;可转债无印花税。如果你的策略跨品种,成本模型要分品种配置。
结论:起步回测至少要配齐”佣金 + 印花税 + 过户费 + 滑点”四项,且按品种分别设置——少了任何一项,都会让回测预期偏离实盘。
二、滑点:成本里最致命、也最被低估的项
显性成本费率固定,算个乘法就行。真正吃掉 alpha 的是滑点——你以为能以某个价格成交,实盘成交价却更差。
2.1 滑点的来源
- 买卖价差(bid-ask spread):买一和卖一之间的价差,是市场给流动性的定价。流动性差的票价差可能 0.5% 以上。
- 下单方式:限价单可能不成交(机会成本),市价单一定有滑点(价格成本)。
- 盘中波动:从下单到成交的时间窗内,价格可能已经移动。
- 自身冲击:你自己的单子推动了价格(见第三节冲击成本)。
2.2 滑点的估算口径
| 下单方式 | 滑点估算 | 适用场景 |
|---|---|---|
| 限价单(且成交) | 0 ~ 1 个最小价位 | 保守、不急的调仓 |
| 限价单(可能未成交) | 0,但有机会成本 | 不适合强制调仓的策略 |
| 市价单 / 对手价 | 买卖价差(0.05% ~ 0.5%) | 必须成交的强制信号 |
| VWAP / TWAP | 0.1% ~ 0.3% | 大单分批,个人很少用 |
个人量化的常见口径:保守起见,回测里统一按市价单 0.2% ~ 0.3% 滑点估算,相当于”在最差情况下也能成交”的摩擦。如果你的策略是限价单为主,可以下调到 0.1%;但一定要配套”未成交时怎么办”的逻辑,否则回测虚高。
2.3 滑点 × 换手率 = 真实抽血
这是成本账本里最重要的一个公式:
年化成本 ≈ 单边成本率 × 年换手率 × 2
举例:
- 单边成本率(佣金 + 印花税 + 过户费 + 滑点)≈ 万 3 + 万 5 + 万 0.1 + 万 25 = 万 33 ≈ 0.33%
- 月调仓策略,年换手率 12(每次全仓换手)
- 年化成本 ≈ 0.33% × 12 × 2 ≈ 7.9%
这意味着:一条月调仓策略,在扣成本前需要跑出年化 8% 以上的超额,扣完才不亏不赚。很多写在 Excel 里的”年化 6% 超额”策略,一上实盘就是稳定亏钱——不是策略无效,是成本没算。
自检:把你的策略换手率 × 0.33% × 2,看看这个数字相对策略年化超额的占比。如果占比超过 50%,说明这条策略的”alpha”几乎全是摩擦幻觉。
三、冲击成本:当你不再是价格接受者
个人量化的教程里几乎不提冲击成本,因为默认”个人资金小、是价格接受者”。但这个假设有两个例外会让它变成显性成本:
3.1 小市值策略的隐性陷阱
个人量化偏爱小市值(超额收益高、机构进不去)。但小市值 = 流动性差,当你的单笔成交金额占当日成交量的 1% 以上时,你自己的单子就开始推动价格。
经验阈值:
- 成交占比 < 1%:可视为价格接受者,冲击成本忽略;
- 1% ~ 5%:开始有冲击,估算 0.1% ~ 0.3% 额外成本;
- 5% ~ 10%:明显冲击,需要分批或算法单;
- > 10%:基本打不进去,回测里的”满仓调仓”是幻觉。
自检:把策略历史回测里每一笔下单金额 ÷ 当日成交额,取 95 分位数。如果超过 5%,说明你的策略容量已经撞到了流动性天花板——继续加资金只会让冲击成本指数级上升。
3.2 流动性突变
小市值票平时流动性还行,但暴跌日流动性会瞬间消失——你想卖的时候,盘口可能直接空掉。回测里用历史成交量算冲击,会低估极端日的真实摩擦。保守做法是给冲击成本加一个”压力情境乘子”,在跌幅 > 5% 的日子把冲击估算翻倍。
四、隐性成本里更隐蔽的两项
4.1 机会成本:未成交 ≠ 零成本
限价单没成交时,你以为没付钱,其实付了机会成本——信号说要买、你没买到,后续涨了就是亏。
回测里的典型错误:限价单”按价格撮合、成交不了就忽略”,结果回测里策略”佛系成交”,实盘里大量信号被漏掉。正确做法:回测里要明确未成交时的处理逻辑——继续挂单、转市价单、还是放弃——每种处理对应不同的成本结构。
4.2 资金占用成本
保证金、底仓、T+1 持仓占用资金,都有机会成本。特别是:
- 国债逆回购:资金占用 1 天,收益是逆回购利率;
- 底仓打新:底仓资金的潜在回撤 vs 打新收益;
- 融券保证金:融券卖出要冻结 50% 以上保证金,占用资金。
如果你策略里有”持币等机会”或”长期底仓”的设计,资金占用成本要在策略收益里扣减——不然就是拿”无风险利率的资金”做”有风险的策略”,比较基准都不公平。
五、不同策略类型的成本敏感度差异
成本对不同策略的影响天差地别,按换手率从低到高排:
| 策略类型 | 年换手率 | 单边成本 | 年化成本占比 | 成本敏感度 |
|---|---|---|---|---|
| 长期择股(年调) | 1~2 | 0.33% | 0.7%~1.3% | 低 |
| 价值轮动(季调) | 4~8 | 0.33% | 2.6%~5.3% | 中 |
| 多因子选股(月调) | 10~15 | 0.33% | 6.6%~9.9% | 高 |
| 日内双均线 | 50~100+ | 0.33% | 33%~66%+ | 致命 |
| 高频 T+0 | 数百~数千 | 0.33% | >>100% | 个人不可行 |
结论:个人量化的甜区在”季调到月调”——这个换手率下,alpha 还能盖住成本;再往高频走,每提高一档换手率,成本翻倍而 alpha 不一定翻倍,个人没有机房、没有专线、没有对手盘的信息优势,做高频就是给券商打工。这是差异篇里”错位竞争”原则在成本层的具体兑现。
六、成本敏感性自检:翻倍测试
这是判断策略是否”成本幻觉”的最简单工具,三步:
- 基准回测:用你的完整成本模型跑一次,记录年化超额、夏普、最大回撤;
- 翻倍回测:把所有成本(佣金、印花税、过户费、滑点)整体 ×2,再跑一次;
- 对比:如果超额收益从 15% 跌到 8% 以下,或夏普从 1.5 跌到 1.0 以下,说明策略对成本极度敏感,实盘表现大概率远低于回测预期。
理想策略的特征是:成本翻倍后,超额收益只下降 20%~30%——这种策略的 alpha 是”真超额”,不是”摩擦幻觉”。这个测试比单纯看年化收益更诚实,因为它直接量化了”策略对假设的依赖度”。
七、QMT 实盘里如何精确计量成本
回测里的成本是估算,实盘里的成本是真实发生的。个人量化在 QMT 实盘里应该建立一套成本账本,把每一笔交易的”名义成本”和”实际成本”都记下来,长期对照。这是从”回测驱动”升级到”实盘驱动”的关键工程。
7.1 利用 passorder 的回调记录实际成交价
委托成交回调里能拿到实际成交均价和成交数量,对比你下单时的”期望价”,差额就是该笔交易的真实滑点。结构化记录:
1 | 每笔交易日志: |
每月对账:把”实际滑点”和回测里假设的 0.2%~0.3% 对比,如果实际显著高于假设,要么调整回测口径,要么调整下单方式(市价单改限价单、或分批)。
7.2 完整成本账本表结构
最简版两张表:
- trade_log:每笔成交的 code、时间、价、量、方向、名义成本(按费率算)、实际成本(券商返回);
- cost_summary:按月汇总的”换手率、名义成本总额、实际成本总额、与回测假设的偏差”。
这一步看起来繁琐,但没有它,你永远不知道自己的策略是死于逻辑失效还是死于成本假设错误。这是监控告警之外,实盘阶段另一个必备的工程化能力。
7.3 一个常被忽略的实盘细节:撤单也是成本
撤单本身不收费,但频繁报撤会被券商风控盯上,且每次撤单都意味着一次”信号失败”——这本身是策略逻辑与市场流动性不匹配的信号。如果撤单率 > 30%,要么策略信号太密集、要么下单方式不对,这是回测看不到、只有实盘才暴露的成本。
八、总结:成本账本把 alpha 从幻觉里捞出来
回顾本文核心:
- 完整成本清单:佣金(双边、有 5 元门槛)+ 印花税(卖出单边)+ 过户费(沪市双边)+ 滑点 + 冲击 + 机会成本,缺一不可;
- 滑点最致命:保守按 0.2%~0.3% 估,按品种和下单方式调整,配套未成交处理逻辑;
- 抽血公式:年化成本 ≈ 单边成本率 × 年换手率 × 2,月调仓策略年化成本 8% 起步;
- 冲击成本:单笔成交 > 当日成交量 1% 开始有冲击,> 5% 撞到流动性天花板;
- 策略甜区:季调到月调,个人量化在成本与 alpha 之间的最优解;高频个人不可行;
- 翻倍测试:成本 ×2 后超额还剩 70%+ 才算真 alpha,这是最简单的诚实度检验;
- 实盘账本:用 passorder 回调记录真实滑点,建立 trade_log + cost_summary 两张表长期对账;
- 撤单率:实盘才暴露的隐性成本指标,> 30% 说明策略与流动性不匹配。
成本账本做实,意味着你看到的 alpha 是”扣完所有摩擦之后的真超额”。这一关过了,程序化解决情绪里讲的”无情绪执行”才有意义——不然程序只是在无情绪地、稳定地、把你的资金输给市场摩擦。下一篇我们继续往风控层走,聊仓位管理与最大回撤控制。
⚠️ 免责声明
本文仅提供交易成本分析方法与工程经验:
- 文中费率、印花税等以最新政策为准,请以交易所/券商官方公告为依据
- 实际成本因账户、品种、下单方式不同会有差异
- 文中内容不构成任何投资建议,因使用本文方法造成的任何损失,由使用者自行承担
本文更新于2026年9月8日