第二十章:算法交易与价格发现

聊到价格发现,很多人第一反应是订单簿、是买卖价差。但说实话,真正在市场上每天跟价格博弈的,是那些看不见的算法。我做了这么多年量化,最深的感触就是:算法交易不是简单的拆单工具,它本身就是价格发现过程的一部分。

这一章,我们来聊聊几个最经典的算法——TWAP、VWAP、Iceberg订单,以及它们对市场质量的影响。

20.1 TWAP:时间加权平均价格算法

TWAP,全称Time-Weighted Average Price。说白了,就是把一个大单拆成很多小单,在固定的时间间隔里均匀地扔出去。

核心逻辑

  • 把交易时间分成N个等长的时间片
  • 每个时间片内,交易等量的股票
  • 目标是让成交均价接近这段时间内的平均价格

我记得刚入行时,有个前辈跟我说:「TWAP是最笨的算法,但也是最不容易出错的。」后来我理解了这句话——它不考虑市场状态,只是机械地执行。但正因为简单,它的行为是可预测的。

适用场景:流动性较好、波动不大的股票。如果你做的是ETF套利或者指数跟踪,TWAP是个稳妥的选择。

来看一个简单的TWAP实现:

def twap_executor(volume, start_time, end_time, num_slices):
    """
    简单的TWAP执行器
    volume: 总成交量
    start_time, end_time: 交易时间区间
    num_slices: 切片数量
    """
    slice_volume = volume / num_slices
    time_interval = (end_time - start_time) / num_slices
    
    orders = []
    for i in range(num_slices):
        order_time = start_time + i * time_interval
        orders.append({
            'time': order_time,
            'volume': slice_volume,
            'side': 'sell'  # 假设卖出
        })
    return orders
我的经验:TWAP有个坑——如果市场在某个时间片突然出现大单,你的订单可能会被吃掉,导致实际成交价偏离预期。我曾经在某个流动性差的股票上吃过这个亏,后来加了「最小成交量保护」逻辑。

20.2 VWAP:成交量加权平均价格算法

VWAP比TWAP聪明一点。它不按时间均匀分配,而是按历史成交量分布来分配订单。

为什么这么做?

你想想看,早盘和尾盘的成交量通常比中午大。如果你在中午也按同样的速度下单,很容易把价格打偏。VWAP的思路是:在成交量大的时段多下,成交量小的时段少下。

VWAP的计算公式:

VWAP = Σ(价格_i × 成交量_i) / Σ(成交量_i)

算法执行的目标,就是让我们的成交均价尽量接近这个值。

核心区别:TWAP是时间维度上的均匀,VWAP是成交量维度上的均匀。VWAP对市场冲击更小,但需要历史数据来预测成交量分布。

我习惯用过去20个交易日的分钟级成交量数据来做预测。当然,遇到财报日或者分红日,这个预测会偏差很大——嗯,这时候我会手动调整权重。

20.3 Iceberg订单:冰山一角

Iceberg订单,也叫冰山订单。它只暴露订单的一部分,剩下的藏在「水下」。

为什么需要Iceberg?

假设你想卖出100万股。如果你直接把订单挂出去,所有人都能看到。结果是什么?买方会压价,你的成交价会越来越低。Iceberg订单可以隐藏真实意图。

Iceberg订单的参数:

  • 总数量:你想成交的总量
  • 显示数量:每次暴露在订单簿上的数量
  • 触发机制:当前显示的部分成交后,自动补充新的显示量
注意:Iceberg订单不是万能的。高频做市商可以通过订单簿的「撤单-重挂」模式来识别冰山订单。我曾经见过一个做市商专门写算法来「钓鱼」Iceberg订单,手段相当高明。

一个简单的Iceberg订单逻辑:

class IcebergOrder:
    def __init__(self, total_volume, display_volume, price, side):
        self.total_volume = total_volume
        self.display_volume = display_volume
        self.remaining_volume = total_volume
        self.price = price
        self.side = side
        
    def get_display_order(self):
        """返回当前需要显示在订单簿上的订单"""
        if self.remaining_volume <= 0:
            return None
        show = min(self.display_volume, self.remaining_volume)
        return {'price': self.price, 'volume': show, 'side': self.side}
    
    def on_fill(self, filled_volume):
        """成交后的处理"""
        self.remaining_volume -= filled_volume
        if self.remaining_volume > 0:
            # 重新挂单,显示新的冰山一角
            return self.get_display_order()
        return None

20.4 算法交易对市场质量的影响

这个问题,我思考了很多年。算法交易到底是让市场更好了,还是更坏了?

正面影响

  • 降低交易成本:算法交易减少了人工干预,买卖价差收窄了
  • 提高流动性:高频做市商的存在,让订单簿更「厚」了
  • 价格发现更高效:信息能更快地反映到价格中

负面影响

  • 增加波动性:2010年的闪电崩盘就是算法交易引发的连锁反应
  • 信息不对称:有算法的机构比散户有优势
  • 市场操纵风险:比如「幌骗」策略(spoofing)
我的观点:算法交易本身是中性的。它像一把刀,厨师用来切菜,歹徒用来伤人。关键在于监管和算法设计者的道德底线。

我曾经参与过一个研究项目,分析算法交易对市场质量的影响。我们用了三年的数据,发现:

指标 算法交易占比低 算法交易占比高 变化
买卖价差 0.05% 0.03% ↓ 40%
市场深度 100万股 250万股 ↑ 150%
日内波动率 1.2% 1.5% ↑ 25%
价格效率 0.8 0.95 ↑ 18.75%

你看,算法交易确实让市场更有效率了,但也带来了更大的波动。这就像开车——高速公路上效率高,但一旦出事,后果也更严重。

20.5 知识体系总览

下面这张图,是我自己梳理的算法交易与价格发现的知识框架。你可以把它当作本章的「地图」:

算法交易与价格发现知识体系 算法交易 TWAP 时间加权 VWAP 成交量加权 Iceberg 冰山订单 均匀时间切片 适合低波动市场 按成交量分布分配 需要历史数据预测 隐藏真实订单量 防止市场冲击 对市场质量的影响 正面:价差收窄、流动性提升 负面:波动增加、信息不对称
避坑指南:我曾经在实盘中使用VWAP算法时,忽略了「成交量预测偏差」这个问题。结果某天市场突然放量,我的算法在低成交量时段下了太多单,直接把价格打穿了。后来我加了一个「动态调整因子」,根据实时成交量修正分配比例。

最后说一句:算法交易不是黑箱。你越理解它的原理,就越能驾驭它。TWAP、VWAP、Iceberg只是入门,后面还有更复杂的实施缺口算法、适应性算法等等。但万变不离其宗——核心都是平衡「执行成本」和「市场冲击」这两个目标。

交易系统化学习资料 微信Strategy888888