第九章:冲击成本因子分析

冲击成本这东西,说白了就是「你下单时,市场给你的惩罚」。你买得越多,价格被你推得越高;你卖得越狠,价格被你砸得越低。这个惩罚,就是我们今天要拆解的冲击成本因子。

我个人习惯把冲击成本因子分成四类:订单规模因子波动率因子买卖价差因子市场情绪因子。这四兄弟,每一个都影响着你的交易成本。咱们一个一个来看。

9.1 订单规模因子

订单规模因子,是最直观的冲击成本来源。你想想看,你买100股和买100万股,对市场的冲击能一样吗?

我在项目中遇到过一位做ETF套利的同事,他习惯用固定股数下单。有一次他买50万份ETF,结果把价格直接拉高了0.3%。那一单的冲击成本,够他白干三天。从那以后,他再也不敢忽视订单规模了。

订单规模因子的核心逻辑是:订单量占市场流动性的比例越大,冲击成本越高。通常我们用「订单量 / 市场深度」来衡量这个比例。

核心公式:

冲击成本 ∝ (订单量 / 市场深度) ^ α

其中α通常在0.5到1之间,取决于市场微观结构。

嗯,这里要注意:不同市场的深度结构差异很大。A股市场的深度集中在买卖一档,而美股市场的深度分布更均匀。所以同样的订单规模,在A股造成的冲击可能更大。

9.2 波动率因子

波动率因子,反映的是市场的不确定性。波动率越高,你的订单越容易被「吃掉」——因为做市商和流动性提供者会扩大报价价差来保护自己。

我曾经在2015年股灾期间跑过回测,发现同样的订单规模,在波动率20%时的冲击成本,是波动率10%时的2.3倍。这个数字让我印象深刻。

波动率因子的计算,我建议用已实现波动率(Realized Volatility)而不是历史波动率。因为冲击成本是即时发生的,用过去30天的波动率去预测下一秒的冲击,效果很差。

# 计算已实现波动率(5分钟频率)
import numpy as np

def realized_volatility(price_series, freq='5min'):
    # 计算对数收益率
    log_returns = np.diff(np.log(price_series))
    # 已实现波动率 = 收益率标准差 * 年化因子
    rv = np.std(log_returns) * np.sqrt(252 * 24 * 60 / 5)
    return rv

我的经验:

波动率因子和订单规模因子存在交互效应。高波动率环境下,订单规模因子的冲击系数会放大1.5-2倍。所以建模时,别忘了加交叉项。

9.3 买卖价差因子

买卖价差因子,就是你在市场上「过路」要交的过路费。价差越大,你每笔交易的成本越高。

但这里有个坑:很多人以为价差因子就是简单的「(卖一价 - 买一价) / 中间价」。其实不对。真正的冲击成本,是你在吃掉价差之后,还要额外支付的价格滑点。

我建议用有效价差(Effective Spread)来代替报价价差:

价差类型 计算公式 适用场景
报价价差 卖一价 - 买一价 流动性好的大盘股
有效价差 2 × |成交价 - 中间价| 所有股票,更准确
已实现价差 2 × (成交价 - 事后中间价) 衡量做市商利润

嗯,这里要注意:有效价差需要逐笔成交数据才能计算。如果你只有分钟级数据,可以用报价价差加一个调整系数来近似。

9.4 市场情绪因子

市场情绪因子,是最容易被忽略的。很多人觉得情绪是玄学,其实不然。情绪因子可以通过订单流不平衡(Order Flow Imbalance)来量化。

什么叫订单流不平衡?就是主动买单和主动卖单的差值。当主动买单远大于主动卖单时,市场情绪偏多,这时候你买入的冲击成本会更高——因为大家都在抢着买。

我曾经在回测中发现,加入订单流不平衡因子后,冲击成本模型的R²从0.35提升到了0.52。这个提升幅度,说实话让我挺意外的。

情绪因子的构建方法:

  1. 计算每分钟的主动买单量 - 主动卖单量
  2. 用过去N分钟的累计值作为情绪指标
  3. 将情绪指标标准化(减去均值,除以标准差)
  4. 作为冲击成本模型的输入特征

避坑指南:

我曾经犯过一个错误:把情绪因子和波动率因子放在同一个模型里,结果出现了严重的多重共线性。后来我发现,情绪因子和波动率因子的相关系数高达0.7。解决办法是:要么只保留一个,要么用PCA降维后再输入模型。

9.5 四因子的综合框架

好了,四个因子都讲完了。它们不是孤立的,而是相互影响的。我习惯用下面这个框架来统一分析:

冲击成本因子分析框架 冲击成本 订单规模因子 波动率因子 买卖价差因子 市场情绪因子 交互效应 交互效应 因子交互关系 • 订单规模 × 波动率:高波动时,大单冲击放大1.5-2倍 • 波动率 × 价差:波动率每上升10%,价差扩大约5% • 情绪 × 订单规模:情绪极端时,大单冲击成本非线性增长 • 价差 × 情绪:情绪越极端,有效价差越大

这个框架图,说白了就是告诉你:别只盯着一个因子看。四个因子是联动的,你得把它们放在一起考虑。

我个人习惯的做法是:先用主成分分析(PCA)把四个因子降维成2-3个主成分,然后再用这些主成分去拟合冲击成本。这样既能保留大部分信息,又能避免多重共线性。

一个小技巧:

如果你用的是分钟级数据,建议把四个因子都做差分处理。因为冲击成本本身是增量概念,用因子的变化量去解释冲击成本的变化,效果比用绝对值好得多。这个经验是我在回测了上百个模型后总结出来的。

好了,四个因子都讲完了。记住:订单规模是「量」的维度,波动率是「不确定性」的维度,价差是「摩擦成本」的维度,情绪是「方向性」的维度。把这四个维度抓牢,你的冲击成本模型就稳了。