周一上午,上海陆家嘴一家头部量化私募的策略评审会。一位研究员把回测包递给基金经理:沪深300 成份股大盘股动量策略,年化换手 200%,2014-2023 期间纸面 Sharpe 1.5。撮合模拟器沿用 4.5.1 留下的占位成本「~10 bp 双边」——一个没有拆解的总数。基金经理问:「把成本栈讲给我听。买卖价差、佣金、印花税、过户费、经手费、融资融券利率,每一项是多少?规模从 1 亿涨到 10 亿,账单怎么变?」研究员答不上来。1.5 的纸面 Sharpe 留在会议室——它拿不到资金。本课就是让研究员能回答这个问题的分项层。显性成本是成本感知回测的底线:交易回单上的确定性条目,交易前已知,可从公开费率表计算得到。
框架:显性 vs 隐性
explicit transaction cost (显性 交易 成本) 是交易回单上出现的成本条目——交易前已知,按名义金额或按股数线性计费,多笔可加总。implicit cost (隐性 成本;L2 主题:超过报价半价差的实际成交、临时冲击、永久冲击、滑点) 是规模相关且随机的。只建模显性成本的策略在流动性好的大盘股上低估总成本 50-90%,在流动性差的小盘股上低估 200-1000%。但显性底线是任何执行算法都无法消除的确定性下限。
Inline-code 列表:四个标准显性成本桶
明汯、幻方、灵均、衍复等头部量化私募,以及天弘、富国、华夏、嘉实等公募量化部门,每一份可信的成本感知回测都按完全相同的顺序拆解四个桶。
1. bid-ask spread — 报价 半 价差 单次 穿越
2. commission — 佣金;买方 1-3 bp,零售 2019 年 后 0
3. exchange / regulatory fees + taxes — Section 31, FINRA TAF, 印花税, 经手费, 过户费
4. borrow / financing — locate; 融资融券 利率 6-8%
法则:显性成本是确定性条目,交易前已知,可从公开费率表计算。不需要参数拟合——一旦交易场所、产品、订单方向确定,账单就是算术题。
(1) 买卖价差
报价 价差 (quoted spread) 是交易瞬间最优卖价减最优买价;标准 bid-ask spread 词是报价输出。半 价差 (half-spread) 是从中价单次穿越的每股成本。有效 价差 (effective spread) 是实际成交的每股成本,通常因为存在隐性 / 中价流动性而比报价价差窄。A 股因为 RMB 0.01 的最小报价单位 (tick size),最小价差是 1 个 tick:30 元股票最小价差 = 0.01 / 30 = 3.3 bp;300 元股票如 600519 贵州茅台 1 tick = 0.33 bp;3 元小盘股最小价差 33 bp——A 股小盘股因为固定 tick 规则在价差上承受不成比例的损失。
(2) 佣金
券商手续费。CN:佣金 监管 最高 0.3% (= 30 bp),买方典型协议价 0.025-0.05% = 2.5-5 bp;零售自 2018 年券商价格战后降至 ~0.025% (2.5 bp)。明汯、幻方、灵均、衍复一类的头部私募通常拿到 ~0.02-0.025% (2.0-2.5 bp);公募量化在 ~0.04% (4 bp) 上下。佣金按名义金额线性计费,与订单规模相对 ADV 无关——交易 1 千元和交易 1 亿元的每元费率是同一个。
(3) 交易所 / 监管 费用 + 税
Inline-code 列表:Three (三个) 2023 年后 CN 监管费率调整。
- `印花税` cut from 0.10% to 0.05% sell-side only on `2023-08-28`
- `经手费` cut from 万分之 0.487 to 万分之 0.341 on `2023-08-28`
- `过户费` cut from 万分之 2 to 万分之 0.5 SSE-only in `2022-04`
法则 ETFs and futures are exempt from 印花税 是 CN 市场的关键结构特征:交易 510300 沪深300 ETF 完全规避印花税;交易沪深300 成份股篮子要付足 0.05% 的卖方印花税。
海外端 Section 31 fee 和 FINRA TAF 是结构平行的卖方单边监管费——CN 端 印花税 + 经手费 + 过户费 round-trip 合计 ~0.55-1.05 bp 与之量级相当。法则 commission is zero for US retail post-2019——零佣金转型让买方 1-3 bp 佣金成为零售-机构 显性 差距 的主项。
(4) 融资 / 融券
融资融券 (margin financing and securities lending) 利率 由 中证金融 监管 设为 6-8% 年化,标的受限名单适用。多头策略借券成本为零;除非显式演示借券,本课的算例都用多头 round-trip。
交易回单成本方程
变量名 half_spread、commission、exchange_fee、stamp_duty_sell_only、transfer_fee、borrow_cost、holding_period_years 与撮合模拟器成本拆解 dict 的 key 一致。对称项前的 2 × 反映每个 round-trip 在两条腿(买腿+卖腿)上各穿越一次。孤立的 stamp_duty_sell_only 项反映 CN 卖方不对称。
Fenced Python — 二十行插入 4.5.1 五层引擎的撮合模拟器层:
# explicit-cost decomposition — deterministic line items
def compute_explicit_cost(order, bar, rates):
"""L1 显性 成本:价差 + 佣金 + 交易所费 + 印花税 + 过户费 + 融资融券费"""
notional = order["shares"] * bar["mid_price"]
sign_sell = 1 if order["side"] == "sell" else 0
holding_years = order.get("holding_days", 0) / 252.0
# 1. 价差:每笔穿越收取半价差
spread = bar["half_spread_bp"] * notional / 1e4
# 2. 佣金:按名义金额 bp 计费
commission = rates["commission_bp"] * notional / 1e4
# 3. 交易所费:CN 的 经手费 + 过户费 双边
exchange_fee = (rates["sec_fee_bp"] * sign_sell + rates["taf_bp"] * sign_sell) * notional / 1e4
# 4. 印花税:CN 卖方单边
stamp_duty = rates["stamp_duty_bp"] * sign_sell * notional / 1e4
# 5. 过户费:CN 上交所 only
transfer_fee = rates["transfer_fee_bp"] * notional / 1e4
# 6. 融券费:仅空头;成本 × 持有期
borrow = (rates["borrow_bp_per_year"] * holding_years * notional / 1e4
if order.get("is_short") else 0.0)
return {
"spread": spread, "commission": commission, "exchange_fee": exchange_fee,
"stamp_duty": stamp_duty, "transfer_fee": transfer_fee, "borrow": borrow,
}
Three (三个) round-trip 成本算例(Markdown 表)
把交易回单成本方程套到三个基准情形:
| case | notional | spread | commission | exchange/regulatory | stamp_duty | round-trip total |
|---|---|---|---|---|---|---|
| (1) US ETF 激进 | $1M | 0.26 bp (2 × 0.13) | 4.0 bp (2 × 2.0) | 0.12 bp Section 31+TAF + 1.2 bp taker fee | 0 | ~5.6 bp |
(2) 510300 ETF | RMB 1M | 1.0 bp (2 × 0.5) | 5.0 bp (2 × 2.5) | 1.68 bp (1 过户费 + 0.68 经手费) | 0 (ETF exempt) | ~7.7 bp |
(3) 600519 single-name | RMB 1M | 0.34 bp (2 × 0.17) | 5.0 bp (2 × 2.5) | 1.68 bp (1 过户费 + 0.68 经手费) | 5 bp sell-side | ~12 bp |
情形 1:US ETF 100 万 USD 激进市价单。半价差 0.13 bp,doubled = 0.26 bp。佣金 2 bp,round-trip = 4 bp。监管费 0.12 bp。taker fee 两条腿 ~0.6 bp × 2 = 1.2 bp。总 ~5.6 bp。
情形 2:510300 沪深300 ETF 100 万 RMB。半价差 ~0.5 bp;佣金 2.5 bp;印花税 0 (ETF 豁免);过户费 万分之 0.5 × 2 = 1 bp;经手费 万分之 0.341 × 2 = 0.68 bp。round-trip ~7.7 bp。
情形 3:600519 贵州茅台 (上交所上市) 100 万 RMB。半价差 ~0.17 bp;佣金 2.5 bp;印花税 5 bp 卖方;过户费 1 bp round-trip;经手费 0.68 bp。总 ~12 bp。印花税 占主导——5 bp 卖方印花税比任何其他单项都多一倍以上。
200% 换手下的年化成本拖累
年化换手 200% 的策略在年化成本拖累上付 ~2 × round-trip。510300 200%:~15 bp 年化。600519 单只 200%:~24 bp。在纸面年化收益 12%、年化波动 15% 下,Sharpe 等价拖累是 2 × round_trip / 15%——510300 ~0.20、600519 单只 ~0.32。仅显性成本建模就已经从纸面 Sharpe 里削掉 0.05-0.30。
撮合模拟器集成实务
Two (两个) 代码评审最常抓研究员的工程点:
- 印花税只在 CN 卖方腿适用;撮合模拟器必须跟踪每笔交易的方向。同样的不对称在 US 的 Section 31 + FINRA TAF 上——两者都是卖方单边。
- Maker-taker 返佣要求知道订单是被动还是激进;研究员若假定全为市价单,在被动友好策略上高估成本 ~3-5 bp。
纪律法则:显性成本是一旦交易场所和产品固定,从费率表上算 5 分钟的事。它们是成本感知回测的底线。任何纸面 Sharpe 无法通过显性成本测试的策略,无法靠冲击建模 (L2) 或执行算法优化 (4.5.3) 救回。整体 transaction cost (交易成本) 拆解然后在 L2 里加上 slippage (滑点) 和市场冲击。
Formula Explorer
\text{cost}_{bp} = 2 \times \text{half\_spread} + 2 \times \text{commission} + 2 \times \text{exchange\_fee} + \text{stamp\_duty}简化的四项形式——白板主力公式。完整方程加 CN 的 过户费 和空头的 borrow 项。
练习
Exercise
你在 510300 沪深300 ETF 上跑 200% 年化换手基准策略,本金 100 万 RMB。做四个计算并报告。
(i) 套用 trade-ticket cost equation 计算激进执行 (市价单穿越价差) 的 round-trip 显性成本 (bp):半价差 0.5 bp,佣金 2.5 bp,印花税 0 (ETF 豁免),过户费 0.5 bp × 2,经手费 0.341 bp × 2。
(ii) 同 (i) 但本金换为 100 万 RMB 的 600519 贵州茅台:半价差 0.17 bp,佣金 2.5 bp,印花税 5 bp 卖方,过户费 0.5 bp × 2,经手费 0.341 bp × 2。
(iii) 计算两个情形在 200% 换手下的年化成本拖累,并假设纸面年化收益 12%、纸面年化波动 15%,给出 Sharpe 等价扣减。
(iv) 给出 510300 与 600519 之间最主要的成本差异项 (印花税 for 600519) 和 round-trip 成本 bp 的差距。
把所有四个答案放在一张表里。
提示
提示
600519;510300 因 ETF 豁免为 0;差距 ~4.3 bp。衔接 L2
显性成本是确定性条目——5 分钟算完。它们也是规模无关的:1 千元和 1 亿元每元监管费相同。但机构交易现实正相反——任何超过 ~0.5% ADV 的订单,隐性成本(市场冲击、超过报价价差的滑点)对显性成本栈的支配比是 2-10 倍。L2 引入经验平方根法则 impact_bp ≈ Y × σ × sqrt(Q/V)、临时-vs-永久 冲击拆解、量化全部隐性成本账单的 实施 差额 框架。
实务对照:再深一层
CN 端再看几个常被误用的点。一是 融资融券 的方向:融资是买入借钱,融券是借券卖出;本课的「借券成本」专指融券侧的借券费率,融资侧的资金利率属于杠杆成本范畴,与本课的交易成本分项不在同一层。二是 ETF vs 单只股票 印花税 豁免在 CN 端是回测代码评审最常抓的错误——510300 沪深300 ETF 没有印花税,沪深300 成份股篮子有 0.05% 卖方印花税,量级差 ~5 bp,会直接把 ETF 增强策略与篮子打散策略的可比性打偏。三是科创板、创业板、北交所的费率边界与上交所主板、深交所主板不完全相同——科创板单次涨跌幅 20%、北交所 30%、ST 5%,对应的微结构假设需要按板块写进费率表查询逻辑里。四是私募 + 公募的协议佣金谈判每年都会刷新一次到两次,监管费率每年也会被证监会、证券交易所发文调整——把费率表绑定到日期 key 而不是硬编码常量,是工程上避免历史回测与实盘交叉污染的关键设计。
已涵盖组件
- Inline-code listing of the FOUR 显性成本桶。
trade-ticket cost equationKaTeX 块。- Fenced Python
compute_explicit_cost(order, bar, rates)返回六 key cost-decomposition dict。 - Three (三个) round-trip 算例 Markdown 表。
- Inline-code listing of the THREE 2023 年后 CN 监管费率调整。
- Inline-code listing of the FOUR US 监管费率条目。
- FormulaExplorer——四项简化形式。
- Exercise——
510300和600519在 200% 换手 + 100 万 RMB 本金下的四个子任务。 - Two 递进 Hint。