某沪深300指增私募的中级量化研究员,用 L1 的「无成本」约束 MV 优化器跑 30 只 CSI 300 行业龙头基础上的 12-1 截面动量信号,样本内纸面 Sharpe(paper Sharpe)= 1.4。她把同样的换仓单丢进自家交易台的事后成本归因系统,扣掉佣金、印花税、半价差(half-spread)和 Almgren-Chriss 市场冲击之后,实盘 Sharpe 跌到 0.6。月度再平衡换手 50% NAV、单次再平衡烧 35 bp、年化成本拖累 4.2%——产品净值跑输 510300 沪深300 ETF。交易台和合规岗已经反映了一年:优化器在「追 mu 里的高频噪声」。这堂课讲的就是修复方案:把 L1 的 solve_constrained_mv 扩展为成本感知 QP,把成本向量直接嵌入目标、再叠加换手率预算——优化的不再是纸面 Sharpe,而是事后(post-cost)Sharpe。这才是私募交易台真在跑的版本。
术语对齐表
本课新增的核心术语,与 data/glossaries/quant-glossary.yaml 标准译名一致:交易成本(transaction cost,单边 + 双边的执行摩擦总和)、滑点(slippage,预期价与执行价之差,分解为价差、冲击、择时三部分)、市场冲击(market impact,交易行为本身造成的价格反向移动)。L1 沿用过来的术语:组合优化(portfolio optimization)、均值方差优化(mean-variance optimization)、协方差矩阵(covariance matrix)。后续讨论统一使用上述标准译名。
三类执行成本的标准顺序
下面是 Inline-code listing,按固定顺序列出三类执行成本:
linear_cost: -c_linear @ cp.abs(w - w_prev) * V_0 (commissions + exchange/regulator fees + stamp duty + broker tickets; cn ~10-15 bps round-trip = 印花税 5 bps + 佣金 5-6 bps + 过户费 0.2 bps; us ~5-15 bps round-trip = exchange fee 0.5 bps + FINRA TAF 0.03 bps + half-spread 0.5-2 bps + commission 0-3 bps)
quadratic_impact: -c_q * cp.quad_form(w - w_prev, np.diag(1 / ADV)) * V_0 (the QP-tractable relaxation of the Almgren-Chriss 3/2-power impact; c_q ~0.5 for US large-cap, ~1.0 for CN main-board, ~2.0 for small-cap)
three_halves_impact_socp: -c_q * cp.sum(cp.power(cp.abs(w - w_prev), 1.5)) * V_0**0.5 / ADV**0.5 (the exact Almgren-Chriss 2000 form; SOCP, solved by SCS / MOSEK; ~5-10x slower than QP relaxation but matches empirical scaling Almgren et al 2005, Kyle-Obizhaeva 2016)
规则:linear handles commissions / fees / spread; quadratic handles temporary market impact; the 1-norm structure of linear cost induces SPARSE trade lists。
线性成本(linear cost)按交易量线性、对市场 / 标的对可预测:券商佣金、SSE / SZSE 上市公司印花税(stamp duty,卖方 5 bp)、过户费(transfer fee,0.2 bp,沪市)、券商票面费。向量化写成 c_linear @ |w - w_prev| * V_0,其中 V_0 是基金净资产。典型 CN 主板大盘股单次双边线性成本:印花税 5 bp(单边卖出)+ 佣金 2.5-3 bp(单边,中信 / 中金 / 华泰等综合券商)+ 过户费 0.1 bp(沪市) = 大约 10-15 bp 双边。中小盘 / 科创板 / 创业板因为流动性更弱、半价差更宽,可以拉到 15-25 bp 双边;ST、停牌、退市风险标的可以拉到 30-50 bp。私募基金大多走「分仓佣金」加「软佣金」混合结构,实际净佣金能压到 1-2 bp;期货 / 期权另有 CFFEX 手续费表。
二次 / 市场冲击成本(market impact)对交易量是非线性的:你下单本身就让价格反向移动。临时冲击(交易后会回归)加上永久冲击(订单流披露信息让价格永久移动)叠加。Almgren-Chriss(2000)《Optimal execution of portfolio transactions》(Journal of Risk)给出 3/2 次幂形式 impact_cost_i = c_q * |w_i - w_prev_i|^{3/2} * V_0^{0.5} / ADV_i^{0.5},其中 ADV_i 是 30 日日均成交额(美元或人民币)。Almgren 等(2005)Risk《Direct estimation of equity market impact》以及 Kyle-Obizhaeva(2016)Econometrica《Market microstructure invariants》在全球股票市场上对 3/2 次幂的拟合做了系统性验证。生产环境的 QP 等价近似:c_q * (w - w_prev).T @ np.diag(1/ADV) @ (w - w_prev) * V_0,保持二次规划结构、不需要升级到 SOCP。机构 c_q 标定:CN 主板大盘股约 1.0、中证500 中盘股约 1.5、中证1000 小盘 / 科创板约 2.0。标定方法是事后成本分析(post-trade analysis,PTA)——把自家执行历史回归到经验 3/2 次幂核上,得到 c_q;CN 大私募的交易台一般季度发一次 PTA 报告供优化团队重调。
固定成本(fixed cost)按笔计——券商票面费、清算费、CCDC 清算结算费——在交易量上是二值的,理论上是非凸的。1-范数 c_linear @ |w - w_prev| 凸代理项能捕捉稀疏性效应:当 alpha 收益不及交易成本时,优化器把对应资产的 trade 钉到 0,等效于交易该资产「按笔付费」的非凸最优行为。这一稀疏性是 L1 范数正则化在 Tibshirani(1996)LASSO 意义下的标准结果。
三种优化器侧机制的标准顺序
下面是 Inline-code listing,按固定顺序列出三种优化器侧机制:
cost_objective_terms: subtract c_linear @ cp.abs(w - w_prev) + c_q * quad_impact from the MV objective (Bayesian-optimal: trade only when alpha gain exceeds cost-to-trade)
turnover_budget_constraint: cp.norm(w - w_prev, 1) <= TO_max (hard cap on total trading; TO_max=0.10-0.30 monthly for active equity, 1.0-2.0 weekly for stat-arb, 0.05-0.10 yearly for index funds)
prior_weight_regularisation: subtract (lambda_prior / 2) * cp.sum_squares(w - w_prior) from the objective; w_prior = benchmark for active-management prior; w_prior = previous weights for momentum-persistence prior
规则:L1 terms create sparsity (small trades stay at zero); L2 prior creates smoothness (gradual movement toward prior); turnover budget caps the total。
把三种成本合并到 L1 的约束 MV 目标上:
约束沿用 L1 的 (1)-(7) 再叠加换手率预算 ||w - w_prev||_1 <= TO_max。目标依然凹(MV 目标凹、成本扣减项凸、L2 先验项凸),最优解在凸可行域上唯一。L1 线性成本项是 Tibshirani(1996)LASSO 意义下的 L1 正则化——会产生稀疏交易表:alpha 收益小于交易成本的资产 w_i = w_prev_i 保持不动,只有 alpha 大于成本的资产才发生交易。这是优化器对成本的天然机制;换手率预算是硬性兜底——即使成本向量标定错了,预算也会兜住。
机构典型 TO_max:月度 0.10-0.30 对应主动股票策略(月化 10%-30% 换手 → 年化 120%-360%,与实际公募 / 私募观测一致);高换手 stat-arb / 做市账户做到 1.0-2.0 / 周;指数基金 / 主权财富基金低到 0.05-0.10 / 年。换手率预算与 4.2.3 的alpha 衰减率(alpha decay rate)存在张力:追新 alpha 需要换手;持仓持续性需要克制。最优 TO_max 通过样本外、扣成本 Sharpe 的交叉验证确定。
先验权重正则项 -(lambda_prior/2) * ||w - w_prior||_2^2 有两个常用选择。w_prior = w_B(基准)给「主动管理先验」——把组合往沪深300 ETF 拉、惩罚激进的主动头寸;配合 L1 的主动份额约束能显式控制主动激进度。w_prior = w_prev(上一期权重)给「动量持续性先验」——把组合往上一期权重拉、减缓优化器对噪声 mu 更新的反应;这是组合层最简单的贝叶斯收缩,能让换仓表跨期更稳定。
前向指路:Garleanu-Pedersen 目标组合
在可预测的 mu_t 演化 mu_{t+1} = (1 - rho) * mu_t + epsilon_{t+1}(rho 是 alpha 信号均值回归速率,等于 4.2.3 alpha 半衰期的倒数)和二次交易成本 c_q * ||w_t - w_{t-1}||_Lambda^2 之下,Garleanu-Pedersen(2013)Journal of Finance《Dynamic trading with predictable returns and transaction costs》导出闭式多期最优政策:当期最优交易是朝长期目标组合 w_LR_star 的分数移动(fractional move),分数系数 phi in (0, 1) 取决于成本 / 衰减比。更高 c_q(交易越贵) ⇒ 更低 phi(组合更惯性);更高衰减率 rho(alpha 信号变化越快) ⇒ 更高 phi(组合响应越快)。L2 的单期成本感知 MV 是 Garleanu-Pedersen 目标组合的特例(长期目标坍缩到单期目标)。多期机理是研究层级、L2 不展开;成本感知单期 QP 已经能拿下实务 80% 的收益。
实现:solve_cost_aware_mv
import cvxpy as cp
import numpy as np
def solve_cost_aware_mv(
mu: np.ndarray,
Sigma: np.ndarray,
w_prev: np.ndarray,
w_B: np.ndarray,
B_sector: np.ndarray,
ADV: np.ndarray,
c_linear: np.ndarray,
c_q: float = 1.0,
V_0: float = 1.0,
gamma: float = 2.0,
b_max: float = 0.05,
AS_min: float = 0.30,
TO_max: float = 0.20,
lambda_prior: float = 0.0,
w_prior: np.ndarray = None,
solver: str = 'OSQP',
) -> dict:
# w_prev:上一期权重,trade = w - w_prev。
# ADV:30 日日均成交额(人民币),CSI 300 大盘股典型 c_q=1.0。
# TO_max=0.20 月度换手上限,年化约 240%。
N = mu.shape[0]
w = cp.Variable(N)
trade = w - w_prev
impact = cp.quad_form(trade, np.diag(1.0 / ADV))
if w_prior is None:
w_prior_eff = w_B
else:
w_prior_eff = w_prior
objective = cp.Maximize(
mu @ w
- gamma / 2 * cp.quad_form(w, Sigma)
- c_linear @ cp.abs(trade) * V_0
- c_q * impact * V_0
- lambda_prior / 2 * cp.sum_squares(w - w_prior_eff)
)
constraints = [
cp.sum(w) == 1,
w >= 0,
B_sector.T @ (w - w_B) == 0,
cp.abs(w - w_B) <= b_max,
0.5 * cp.sum(cp.abs(w - w_B)) >= AS_min,
cp.norm(trade, 1) <= TO_max,
]
prob = cp.Problem(objective, constraints)
prob.solve(solver=getattr(cp, solver))
assert prob.status == 'optimal', f'solver failed: {prob.status}'
w_optimal = w.value
utility = float(prob.value)
trade_val = w_optimal - w_prev
turnover = float(np.sum(np.abs(trade_val)))
linear_cost_bps = float(c_linear @ np.abs(trade_val) * 10000)
impact_cost_bps = float(c_q * trade_val @ np.diag(1.0 / ADV) @ trade_val * 10000)
total_cost_bps = linear_cost_bps + impact_cost_bps
return {
'w_optimal': w_optimal,
'utility': utility,
'turnover': turnover,
'linear_cost_bps': linear_cost_bps,
'impact_cost_bps': impact_cost_bps,
'total_cost_bps': total_cost_bps,
'status': prob.status,
}
函数签名、默认值、返回 dict 的键与美国版按字节对齐,只有注释翻译。优化器的天然机制现在很清楚:当资产 i 的 alpha 收益小于 c_linear[i] + 2 * c_q / ADV[i] * |trade_i| 时,优化器保持 w_i = w_prev_i(不交易);超过时才交易。L1 范数的顶点行为天然产生稀疏换仓表——典型情况下 L2 调优后的换仓表每月只动 8-12 只(L1 无成本版本会动 25-30 只)。
读「成本影子价格」
Formula Explorer
x^2成本感知求解返回后,除 L1 的影子价格之外,新增三个诊断量。换手率 np.sum(np.abs(w_optimal - w_prev)):典型范围 0.05(只动 5%)到 TO_max(预算紧贴)。线性成本 bp:调好的主动公募基金月度约 2-10 bp;超过 15 bp 表示优化器在追 alpha 中的高频噪声。冲击成本 bp:沪深300 大盘股月度约 1-5 bp;超过 10 bp 说明换仓集中在低 ADV 标的(中小盘 / ST),或者 c_q 标定过激。换手率预算自身的对偶变量读作预算的影子价格:预算紧贴时(组合从 w_prev 朝 L1 最优收敛的开头几个月里通常如此)对偶为正且大;一旦组合收敛预算松开,对偶归 0。
工作示例:四个递进成本感知的管线
把上面的 Fenced Python 块插入到 L1 30 只 CSI 300 行业龙头篮上的 36 月样本内月度回测里。CN 成本向量取 c_linear = 0.0015 * np.ones(N)(15 bp 双边主板大盘股,印花税 5 + 佣金 5-6 + 过户费 0.2 + 半价差 2-3);c_q = 1.0;V_0 = 100,000,000 人民币(中等规模私募基金)。CN 私募基金的合规视角:中基协对私募的换手率没有直接上限,但风险控制委员会通常要求把月度换手控制在 30% 以下以避免被监管认定为「过度交易」;公募基金按基金合同条款的换手率约束更严格(常见月度上限 20%)。四条管线:(a) L1 基线 c_linear=0, c_q=0, TO_max=10;(b) 只加线性成本;(c) 加线性 + 二次冲击;(d) 在 (c) 基础上加 TO_max=0.20。预期形态:纸面 Sharpe 从 (a) 到 (d) 单调递减——成本感知优化器减少了对噪声 alpha 的追逐;但事后 Sharpe 从 (a) 到 (d) 单调上升。月度成本拖累从 (a) 的约 35 bp 降到 (d) 的约 5-10 bp。2021 年 8 月到 2024 年 2 月「茅指数 / 宁组合」的动量反转阶段是热门案例:成本无感优化器追每一次动量翻转、年化烧 200+ bp 成本拖累;20% 月度换手预算的成本感知优化器在噪声里按兵不动、到 2023 Q3 回收纸面 alpha。事后成本分析(PTA)显示头部量化私募的实盘成本拖累约 80-120 bp 年化(策略容量 50-300 亿),与本工作示例 (d) 的水平吻合。
练习
Exercise
在 L1 的 30 只 CSI 300 行业龙头基础上、用 L1 的 Sigma_LW 助手,样本内 2020-2023 月度回测,给定 (i) 每个再平衡日的截面 12-1 动量信号 mu_hat_t,(ii) 滚动 60 月 Ledoit-Wolf 协方差 Sigma_LW_t,(iii) 滚动 30 日日均成交额 ADV_t,(iv) CN 成本向量 c_linear = 0.0015 * np.ones(N)(15 bp 双边主板大盘股),(v) c_q = 1.0,(vi) V_0 = 100,000,000 人民币:通过 solve_cost_aware_mv 对比四条月度再平衡管线。(a) L1 基线——无成本的约束 MV(c_linear=np.zeros(N), c_q=0.0, TO_max=10.0 失活换手率预算)。(b) 在 (a) 上加线性成本(c_linear 区域取值、c_q=0.0、TO_max=10.0)。(c) 在 (b) 上加二次冲击(c_linear 区域取值、c_q 区域取值、TO_max=10.0)。(d) 在 (c) 上加换手率预算(c_linear 区域取值、c_q 区域取值、TO_max=0.20)。对每条管线 (a)-(d) 在 36 月样本内回测里,报告 (i) 纸面年化 Sharpe(仅用 MV 效用隐含的收益/波动),(ii) 事后年化 Sharpe(每次再平衡都扣线性 + 二次成本),(iii) 平均月度换手 mean(||w_t - w_{t-1}||_1),(iv) 平均月度成本拖累 bp mean(linear_cost_bps + impact_cost_bps)。验证单调权衡:paper Sharpe (a) > (b) > (c) > (d),但 post-cost Sharpe (a) < (b) < (c) <= (d)。按事后 Sharpe 选最优管线;用一句话说明 (d) 为什么胜出。
提示
c_linear 取零向量去掉线性成本,c_q=0.0 去掉冲击,TO_max=10.0 松开换手率预算。结构在 (a)-(d) 间一致。提示
桥接 L3
成本感知最优仍把 mu_hat 和 Sigma_LW 当成点估计(point estimates)——假装它们是下个月真实均值和协方差。它们不是:它们是带不平凡抽样误差的噪声估计,无约束 MV 优化器会把这种估计误差放大成极不稳定的组合——Michaud(1989)《Markowitz optimization enigma》。L3 直接把估计不确定性定价进优化:Goldfarb-Iyengar(2003)的盒型 / 椭球不确定性集鲁棒 MV、Delage-Ye(2010)矩约束模糊集下的分布鲁棒 MV、最坏情况 CVaR(worst-case CVaR)公式、以及把 gamma 和约束栈在低波 / 正常 / 高波 / 危机区制(regime)间动态调档的区制感知叠加层——这才是 2008 之后机构风控栈真在跑的版本,也是中国市场上 2015 年股灾、2018 年贸易战、2020 年新冠、2024 年风格切换四次大波动里头部量化私募能保住净值的核心机制。