执行算法与滑点

Read in English

机构如何压低交易成本:TWAP、VWAP、执行落差与市场冲击

⚠️ 风险提示

交易存在重大亏损风险。大多数交易者是亏钱的。过往业绩不保证未来结果。文中介绍的策略仅供教育用途,不构成投资建议。

你应当:

  • 绝不要拿输不起的钱去交易
  • 始终做好仓位管理和风险控制
  • 投入真金白银之前,把策略彻底回测一遍
  • 要明白任何策略都会经历回撤
  • 做出投资决定前请咨询持牌财务顾问

浏览本内容即表示你已知悉这些风险。作者不对交易亏损负责。

悄无声息的利润杀手

你开发了一套策略,做了回测:年化收益 18%,夏普比率 1.8。看起来相当漂亮。

你上了实盘。半年后,收益只有 11%,夏普降到 1.1。

问题出在哪?

滑点。 也就是你"想要"的价格和你"实际拿到"的价格之间的差额。

回测假设执行是完美的(收盘价买入、收盘价卖出)。现实要混乱得多:

  • 买卖价差(每股 0.01-0.05 美元)
  • 市场冲击(你的订单把价格推走了)
  • 时间延迟(从决策到成交,价格已经动了)
  • 部分成交(在理想价位拿不到全部数量)

一笔 10 万美元的交易,0.3% 的滑点就是 损失 300 美元。一年做 50 次,就是 1.5 万美元的摩擦成本.

好消息是: 机构几十年前就用执行算法解决了这个问题。你也可以。

你将学到什么

  • 滑点的构成: 价差、市场冲击、时间成本、机会成本
  • TWAP(时间加权): 把订单按时间均匀切分(简单、稳定)
  • VWAP(成交量加权): 贴合市场的成交量分布(机构标准)
  • 执行落差(Implementation Shortfall): 在速度与成本之间取得平衡(最优执行理论)
  • 限价单策略类型: 被动执行,赚取流动性返佣
  • 何时分别使用: 按市场环境选择算法(决策框架)

读懂滑点

四个组成部分

1. 买卖价差

定义: 最优买价与最优卖价之间的差额。

示例:

  • SPY 买价 500.00 美元,卖价 500.01 美元
  • 价差: $0.01
  • 你想买入 1,000 股
  • 成本: 1,000 × $0.01 = $10

典型价差区间:

股票类型 典型价差 每 1,000 股的成本
大盘股(SPY、AAPL) $0.01 $10
中盘股 $0.02-$0.05 $20-$50
小盘股 $0.05-$0.20 $50-$200
微盘股 / 流动性差的股票 $0.20-$1.00+ $200-$1,000+

关键要点: 价差成本是"铁定要付"的。每一笔市价单都要付半个价差(一买一卖来回一趟就是完整一个价差)。

2. 市场冲击

定义: 你的订单把价格朝着对你不利的方向推走。

示例:

  • 你想买入 10 万股 XYZ
  • 最优卖价:500 股挂在 50.00 美元
  • 下一档:1,000 股挂在 50.01 美元
  • 再下一档:2,000 股挂在 50.02 美元
  • 你的 10 万股会吃穿好几档(平均成交价 50.08 美元)
  • 市场冲击:每股 0.08 美元 × 10 万股 = $8,000

市场冲击的经验公式:

Market_Impact = σ × √(Q / V) × I

其中:
σ = 日波动率(%)
Q = 订单规模(股)
V = 日均成交量(股)
I = 即时性系数(市价单为 1.0,算法执行为 0.3-0.5)

// 示例:
// XYZ:σ = 2%,Q = 100,000,V = 5,000,000,I = 1.0(市价单)
// Impact = 0.02 × √(100,000 / 5,000,000) × 1.0
//        = 0.02 × √0.02 × 1.0
//        = 0.02 × 0.141 = 0.283% = 每股 0.14 美元

// 改用 TWAP(I = 0.4):
// 冲击 = 0.02 × 0.141 × 0.4 = 0.113% = 每股 0.06 美元
// 节省:每股 0.08 美元 × 100,000 = 8,000 美元

关键要点: 市场冲击与订单规模的平方根成正比。订单翻倍,冲击只增加 41%,而不是 100%。

3. 时间风险(机会成本)

定义: 从做出决策到实际成交,价格已经变了。

示例:

  • 信号在上午 10:00 提示在 50.00 美元买入
  • 你用 TWAP 分 30 分钟执行
  • 到 10:30,价格已经涨到 50.25 美元
  • 平均成交价 50.12 美元(TWAP 是逐步成交的)
  • 机会成本: 相比在 50.00 美元一次性成交,每股多付 0.12 美元

取舍:

  • 快速执行(市价单): 时间风险低,但市场冲击高
  • 慢速执行(算法单): 市场冲击低,但时间风险更高

关键要点: 天下没有免费的午餐。你要根据紧迫程度,在冲击成本和时间风险之间权衡。

4. 隐性成本

  • 交易所费用: 每股 0.0030-0.0050 美元(消耗流动性时)
  • 返佣: 每股 -0.0020 至 -0.0030 美元(提供流动性时)——成本可以是负的!
  • SEC 费用: 每 1 美元成交额收 0.000008 美元(极小,但确实存在)
  • 融券成本(做空): 年化 0.3-20%(难借到的股票)

总交易成本示例

情景: 以 152 美元市价单买入 5 万股 AAPL

成本项目 每股 合计(5 万股)
价差(半个价差) $0.005 $250
市场冲击 $0.025 $1,250
交易所费用 $0.003 $150
佣金(IB) $0.0005 $25
合计 $0.0335 $1,675

占这笔 760 万美元交易的比例: 单边 0.022%, 来回一趟 0.044%

听着不多?一年交易 20 次:0.044% × 20 = 每年 0.88% 的拖累。对一套年化 12% 的策略来说,等于把 7.3% 的收益送给了摩擦成本。

执行算法

1. TWAP(时间加权平均价)

运作方式

核心思路: 把订单按时间区间均匀切分。

示例:

  • 想在 60 分钟内买入 10 万股
  • 切成 12 份(每 5 分钟一份)
  • 每份:100,000 ÷ 12 = 8,333 股
  • 每隔 5 分钟,向市场发出 8,333 股

算法逻辑:

// TWAP 实现
total_shares = 100000;
duration_minutes = 60;
interval_minutes = 5;

slices = duration_minutes / interval_minutes;  // 12 份
shares_per_slice = total_shares / slices;      // 8,333 股

for (i = 0; i < slices; i++) {
    wait(interval_minutes);
    execute_market_order(shares_per_slice);
}

// 结果:每 5 分钟 8,333 股,持续 60 分钟

优点与缺点

优势:

  • 简单: 容易实现,也容易理解
  • 可预期: 执行节奏是固定的
  • 冲击低: 把订单摊到时间上(市场冲击降低 50-70%)
  • 任何市场都能用: 不需要成交量数据

劣势:

  • 忽略成交量分布: 可能在成交清淡时下单(冲击更大)
  • 容易被别人看穿: 其他算法能识别出 TWAP 并抢先交易
  • 时间风险: 如果股价朝不利方向走,平均成交价会更差

何时使用 TWAP

  • 再平衡: 你在意的是时间上的一致性,而不是贴合成交量
  • 小额订单: 订单低于日均成交量的 5%(冲击成本本来就很小)
  • 盘后时段: 没有成交量分布可贴合(VWAP 用不上)

实测表现

  • 滑点降幅: 相比市价单降低 55-65%
  • TWAP 平均成交价: 与决策价相差 0.08-0.15% 以内(流动性好的股票)
  • 胜率: 58%(因为均值回归,成交价好于决策价)

2. VWAP(成交量加权平均价)

运作方式

核心思路: 让你的下单节奏贴合市场的历史成交量分布。

为什么这很重要: 成交量大多集中在开盘(上午 9:30-10:00)和收盘(下午 3:30-4:00)。如果你用 TWAP,就会在清淡时段下单过多(冲击更大)。

VWAP 的解决办法: 市场活跃时多下单,清淡时少下单。

示例:

SPY 的典型成交量分布(按小时):

时段 占全天成交量的比例 你的订单(10 万股)
上午 9:30-10:00 22% 22,000 股
上午 10:00-11:00 12% 12,000 股
上午 11:00-12:00 8% 8,000 股
下午 12:00-1:00 6% 6,000 股
下午 1:00-2:00 7% 7,000 股
下午 2:00-3:00 10% 10,000 股
下午 3:00-4:00 35% 35,000 股

算法逻辑:

// VWAP 实现
total_shares = 100000;
historical_volume_profile = [22%, 12%, 8%, 6%, 7%, 10%, 35%];

for (hour = 0; hour < 7; hour++) {
    target_shares = total_shares × historical_volume_profile[hour];
    execute_throughout_hour(target_shares);
}

// 自适应 VWAP(效果更好):
// 根据当天的实际成交量实时调整
for (interval in trading_day) {
    actual_volume_so_far = get_volume();
    expected_volume_so_far = historical_profile.cumulative_at(interval);

    if (actual_volume_so_far > expected_volume_so_far) {
        // 成交量高于预期,下单更积极
        speed_up_execution();
    } else {
        // 成交量偏低,放慢节奏
        slow_down_execution();
    }
}

VWAP 基准

目标: 你的平均成交价应当贴近当天的 VWAP。

当日 VWAP 的计算方式:

VWAP = Σ (Price × Volume) / Σ (Volume)

// 对每个时间区间(1 分钟或 5 分钟 K 线)
// 示例(简化):
// 9:30:500.00 美元 × 100 万股 = 5 亿美元
// 9:31:500.05 美元 × 80 万股 = 4.0004 亿美元
// ...
// 全部加总:452 亿美元
// 总成交量:9,000 万股
// VWAP = 452 亿 / 9,000 万 = 502.22 美元

// 你的算法就是要贴近这个价格

业绩指标:

  • 跑赢 VWAP(买入价低于 VWAP): 执行得好
  • 与 VWAP 持平: 中性(执行没有偏向)
  • 比 VWAP 差: 执行得差(买贵了)

优点与缺点

优势:

  • 行业标准: 机构通用的比较基准(基金经理拿 VWAP 来考核执行)
  • 冲击比 TWAP 更低: 在流动性充沛时下单(冲击少 10-15%)
  • 价格公允: VWAP 代表当天机构的"平均"成交价

劣势:

  • 需要成交量分布: 需要历史数据(新上市股票用不了)
  • 仍然可被预判: 别人也知道 VWAP 的节奏(会被针对)
  • 忽略价格趋势: 如果股价在单边走,VWAP 未必是最优解

何时使用 VWAP

  • 大额订单: 占日均成交量的 10-30%(必须把冲击压到最低)
  • 有基准考核要求: 基金经理要求按 VWAP 执行
  • 流动性好的股票: 成交量分布稳定(SPY、AAPL 等)

实测表现

  • 滑点降幅: 相比市价单降低 60-72%
  • 跑赢 VWAP 的比例: 52%(接近抛硬币,中性算法本该如此)
  • 与 VWAP 的平均偏离: ±0.05-0.10%(非常贴合)

3. 执行落差(Implementation Shortfall,最优执行)

背后的理论

问题: TWAP 和 VWAP 把冲击成本压到最低,却忽略了时间风险(执行期间价格朝不利方向走)。

执行落差要回答的问题是: 冲击成本和时间风险之间,最优的平衡点在哪里?

构成项:

Implementation_Shortfall = Decision_Price - Actual_Avg_Fill

分解:
= Market_Impact + Timing_Cost + Opportunity_Cost + Fees

// 目标:最小化总落差,而不只是市场冲击

这里的取舍

执行速度 市场冲击 时间风险 总成本
立刻成交(市价单) 高(0.3%) 0.30%
慢速(VWAP 铺满全天) 低(0.05%) 高(0.40%) 0.45%
最优(IS 算法) 中等(0.12%) 低(0.08%) 0.20%

关键要点: 执行得太慢反而会推高总成本(因为时间风险)。最优解在中间某处。

IS 算法是怎么运作的

输入变量:

  • 波动率(波动越大越要快执行,时间风险越高)
  • 订单规模(越大越要慢执行,冲击越大)
  • 紧迫程度(alpha 衰减速度——你的信号多快失效)
  • 流动性(成交量、价差)

算法据此决定:

  • 高紧迫 + 低波动: 快速执行(时间风险占主导)
  • 低紧迫 + 高波动: 慢速执行(冲击成本占主导)
  • 大订单 + 低流动性: 极慢执行(冲击极大)

示例:

// 简化版 IS 算法逻辑
urgency_score = signal_strength × alpha_decay_rate;
impact_score = (order_size / daily_volume) × volatility;

if (urgency_score > impact_score) {
    // 紧迫性占主导,加快节奏
    execution_time = 15 minutes;
} else {
    // 冲击成本占主导,放慢节奏
    execution_time = 120 minutes;
}

// 然后在这个时长内用 TWAP/VWAP 执行

优点与缺点

优势:

  • 成本最优: 在冲击与时间之间取得平衡(总成本最低)
  • 能自适应: 实时根据市场状况调整
  • 理论基础扎实: 建立在学术研究之上(Almgren-Chriss 模型)

劣势:

  • 复杂: 需要波动率模型和 alpha 衰减估计
  • 可预期性差: 执行时长不固定(不好提前安排)
  • 对输入质量要求高: 垃圾进,垃圾出

何时使用 IS

  • 成熟的交易者: 你有能力对 alpha 衰减和波动率建模
  • 衰减很快的信号: 动量、均值回归(信号很快失效)
  • 紧迫程度多变: 有时要快、有时要慢(IS 会自适应)

实测表现

  • 相比 VWAP 的成本降幅: 15-25%(参数调校得当时)
  • 夏普比率提升: 0.1-0.2(成本更低 = 风险调整后收益更高)
  • 复杂度的代价: 高(校准出错反而会推高成本)

4. 限价单策略(被动执行)

运作方式

核心思路: 不要去消耗流动性(市价单),而要提供流动性(限价单)。这样不用付费,反而能拿返佣。

示例:

  • SPY 买价 500.00 美元,卖价 500.01 美元
  • 你想买入 1 万股
  • 市价单: 付 500.01 美元(消耗流动性,还要付每股 0.003 美元手续费)
  • 限价单: 在 500.00 美元挂买单,等着成交(提供流动性,每股拿到 0.002 美元返佣)

成本对比:

下单方式 成交价 手续费 / 返佣 总成本
市价单 $500.01 +$0.003 $500.013
限价单(已成交) $500.00 -$0.002 $499.998
节省 每股 0.015 美元 = 1 万股共 150 美元

问题所在:成交率

取舍: 限价单只有在成交的前提下才更便宜。可它并不总能成交。

示例:

  • 你在 500.00 美元挂了限价买单
  • 股价在 500.00 美元停留了 5 分钟(你成交了 3,000 股)
  • 接着股价拉到 500.15 美元(剩下的 7,000 股再也没成交)
  • 现在你只能在 500.15 美元追价(比一开始用市价单在 500.01 美元成交还差)

成交率实测数据:

  • 挂在买一/卖一(被动): 成交率 40-60%
  • 挂在价差之内(中间价): 成交率 15-30%
  • 挂在价差之外: 成交率 5-15%(非常被动)

智能限价单算法

// 自适应限价单策略
target_shares = 10000;
filled_shares = 0;
time_limit = 30 minutes;

start_price = get_mid();
limit_price = start_price - (spread / 2);  // 挂到买一价

place_limit_order(limit_price, target_shares);

// 每 30 秒检查一次
for (t = 0; t < time_limit; t += 30_seconds) {
    filled_shares = get_filled_quantity();
    current_price = get_mid();

    // 如果价格跑开、且成交不足一半,就转为激进
    if (current_price > start_price + 0.1% && filled_shares < target_shares * 0.5) {
        cancel_limit_order();
        // 未成交部分改用市价单
        execute_market_order(target_shares - filled_shares);
        break;
    }

    // 如果已成交超过八成,剩下的可以耐心等
    if (filled_shares > target_shares * 0.8) {
        // 继续等,大部分已经拿到了
        continue;
    }
}

// 时间到了,剩余部分用市价单成交
if (filled_shares < target_shares) {
    execute_market_order(target_shares - filled_shares);
}

何时使用限价单

  • 紧迫程度低: 可以等上几小时甚至几天才成交
  • 区间震荡的市场: 价格来回摆动(迟早会回到你的限价)
  • 小额交易: 低于日均成交量的 1%(成交概率高)
  • 对成本极度敏感: 每 0.01 美元都要计较(高频交易、做市)

实测表现

  • 成交时的成本节省: 相比市价单省下 0.01-0.03%
  • 成交率(挂在买一/卖一): 45-55%
  • 未成交时的机会成本: 0.10-0.50%(价格跑掉了)

怎么选对算法

决策框架

适用条件 最佳算法 理由
订单低于日均成交量的 5% TWAP(15-30 分钟) 冲击本来就小,越简单越好
订单占日均成交量的 10-30% VWAP(铺满全天) 需要贴合成交量才能把冲击压到最低
高紧迫(信号衰减快) 执行落差算法 在速度与冲击之间取得最优平衡
低紧迫(再平衡) 限价单(被动) 省成本,时间站在你这边
单边趋势市(动量强劲) TWAP(快速,5-10 分钟) 别等了,价格正在跑掉
区间震荡市 限价单或慢速 VWAP 价格会来回摆动,耐心点
高波动(VIX 高于 25) TWAP(缩短执行时长) 时间风险高,要执行得更快
低波动(VIX 低于 15) VWAP 或慢速执行 时间风险低,重点压低冲击

衡量执行质量

关键指标

1. 执行落差(总成本)

IS = (Avg_Fill - Decision_Price) / Decision_Price × 100

// 示例:
// 决策价:500.00 美元
// 平均成交价:500.15 美元
// IS = (500.15 - 500.00) / 500.00 = 0.03%(3 个基点)

// 参考标准:低于 5 个基点为优秀,5-10 个基点为良好,高于 15 个基点为差

2. 与 VWAP 的偏离

VWAP_Dev = (Avg_Fill - Daily_VWAP) / Daily_VWAP × 100

// 示例:
// 平均成交价:500.15 美元
// 当日 VWAP:500.10 美元
// VWAP_Dev = 0.01%(比 VWAP 差 1 个基点)

// 参考标准:±3 个基点为良好,高于 5 个基点为差

3. 成交率(针对限价单)

Fill_Rate = Filled_Shares / Target_Shares × 100

// 参考标准:高于 70% 为良好,40-70% 可接受,低于 40% 说明过于被动

散户怎么落地

券商自带算法(省事的选择)

盈透证券(Interactive Brokers):

  • TWAP、VWAP、Adaptive(类似 IS)
  • 所有账户免费
  • 适合 1,000 至 10 万股的订单

Fidelity Active Trader Pro:

  • TWAP、VWAP
  • 活跃交易者免费

TD Ameritrade:

  • 通过 thinkorswim 使用 VWAP
  • 免费(但可定制的空间有限)

自己动手写算法(Python)

一个简单的 TWAP 脚本:

import time
from ib_insync import *

ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)

# 参数
symbol = 'SPY'
total_shares = 10000
duration_minutes = 30
interval_minutes = 5

# 计算切分份数
slices = duration_minutes // interval_minutes
shares_per_slice = total_shares // slices

# 执行 TWAP
stock = Stock(symbol, 'SMART', 'USD')

for i in range(slices):
    order = MarketOrder('BUY', shares_per_slice)
    trade = ib.placeOrder(stock, order)

    print(f"Slice {i+1}/{slices}: {shares_per_slice} shares")

    # 等待成交
    ib.sleep(2)

    # 等到下一个时间区间
    time.sleep(interval_minutes * 60)

print("TWAP execution complete")
ib.disconnect()

要点回顾

滑点的构成

  • 买卖价差: 铁定要付的成本(流动性好的股票为 0.01-0.05%)
  • 市场冲击: 与订单规模的平方根成正比。订单减半,冲击少 30%
  • 时间风险: 执行期间价格在动。快执行 = 时间风险低,慢执行 = 时间风险高
  • 总成本: 单边 0.02-0.10%(流动性好的股票),来回一趟 0.04-0.20%

几种算法

  • TWAP: 简单,按时间切分。适用于小额订单(低于成交量的 5%)或盘后交易
  • VWAP: 贴合成交量分布。最适合大额订单(占成交量 10-30%),也是机构基准
  • 执行落差(Implementation Shortfall): 在冲击与时间之间取得最优平衡。适合衰减很快的信号
  • 限价单: 成交时成本最低(省 0.01-0.03%),但成交率只有 40-60%

最佳做法

  • 订单规模低于成交量的 5%: TWAP 15-30 分钟(简单有效)
  • 订单规模占成交量的 10-30%: VWAP 铺满全天(把冲击压到最低)
  • 紧迫程度高: 快速 TWAP 或 IS(5-15 分钟执行完)
  • 紧迫程度低: 限价单或慢速 VWAP(省成本)
  • 衡量执行质量: 跟踪执行落差(低于 5 个基点为优秀)

下一步

现在你已经明白,怎样通过聪明的执行来压低交易成本。

接着看: 交易与择时目录 —— 浏览全部深度专题和进阶策略。