第十七章:算法交易基础

各位同学,今天我们来聊聊算法交易。说实话,这个领域我摸爬滚打了快十年,踩过的坑比写过的代码还多。你想想看,一个订单从你按下回车到最终成交,中间经历了什么?嗯,这就是我们今天要拆解的核心。

17.1 为什么需要算法交易?

先问个问题:你手上有100万股要卖,你会怎么操作?

直接挂一个大单?那市场直接给你砸穿三个价位。拆成小单慢慢卖?那得卖到猴年马月去。算法交易就是来解决这个矛盾的——既要降低市场冲击,又要控制时间成本。

我个人习惯把算法交易比作「切蛋糕」。大订单就是整块蛋糕,你不能一口吞下去,得切成小块,一口一口吃。但怎么切、切多大、什么时候吃,这就是算法的活了。

核心目标:在时间、价格、成交量三者之间找到最优平衡点。

17.2 三大经典算法

17.2.1 TWAP(时间加权平均价格)

TWAP 是最朴素的算法。说白了,就是把交易时间等分成N段,每段执行等量的订单。

举个例子:你要在1小时内卖出100万股,TWAP 会把它切成60份,每分钟卖16667股。不管市场怎么波动,我就按这个节奏来。

适用场景:

  • 流动性较好的股票
  • 对时间要求严格,对价格不敏感
  • 需要隐藏交易意图的场景

代码示例(Python):

def twap_schedule(total_qty, total_seconds, interval=60):
    """
    TWAP 切片逻辑
    :param total_qty: 总成交量
    :param total_seconds: 总时间(秒)
    :param interval: 切片间隔(秒)
    """
    slices = total_seconds // interval
    qty_per_slice = total_qty / slices
    
    schedule = []
    for i in range(slices):
        schedule.append({
            'time': i * interval,
            'qty': qty_per_slice
        })
    return schedule
我的经验:TWAP 虽然简单,但有个致命缺陷——它完全不看市场行情。我曾经在某个流动性极差的股票上用 TWAP,结果每笔单子都打在了最差的价位上。后来我学乖了,至少得加个价格保护。

17.2.2 VWAP(成交量加权平均价格)

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

你想想看,上午10点和下午2点的成交量能一样吗?显然不能。VWAP 会参考过去N天的成交量分布,在成交量大的时段多卖,成交量小的时段少卖。

核心公式:

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

切片逻辑:

def vwap_schedule(total_qty, volume_profile):
    """
    VWAP 切片逻辑
    :param volume_profile: 历史成交量分布(列表)
    """
    total_volume = sum(volume_profile)
    schedule = []
    
    for i, vol in enumerate(volume_profile):
        ratio = vol / total_volume
        qty = total_qty * ratio
        schedule.append({
            'time_slot': i,
            'qty': qty,
            'ratio': ratio
        })
    return schedule
避坑指南:我曾经犯过一个错误——直接用昨天的成交量分布来做今天的 VWAP。结果今天出了个重大利好,成交量分布完全变了样。记住:历史分布只是参考,实时调整才是关键。

17.2.3 POV(成交量参与率)

POV 的思路更直接:我不管时间,也不管历史分布,我就盯着市场的实时成交量。市场成交快,我就跟着快;市场成交慢,我就放慢节奏。

比如你设定参与率为10%,那么市场每成交1000股,你就成交100股。这样你的订单就像「隐身」在市场里一样。

核心逻辑:

def pov_schedule(market_volume, participation_rate=0.1):
    """
    POV 动态调整
    :param market_volume: 当前市场成交量
    :param participation_rate: 目标参与率
    """
    my_qty = market_volume * participation_rate
    return my_qty
关键区别:
  • TWAP:时间驱动,不看市场
  • VWAP:历史驱动,看过去
  • POV:实时驱动,看现在

17.3 算法交易的生命周期

一个算法订单从出生到死亡,大概经历这么几个阶段。我画了张图,你们感受一下:

算法交易生命周期 订单接收 参数校验 切片生成 执行 实时反馈调整 订单完成/撤销 统计评估 虚线表示实时反馈循环,实线表示流程推进

这张图我画了好几个版本,最终选了这种环形结构。为什么?因为算法交易不是线性的,它是个闭环。

17.3.1 订单接收

这是起点。交易员或者系统把大订单扔进来。我见过最夸张的一次,某机构直接甩了500万股的市价单,吓得我赶紧启动了紧急风控。

17.3.2 参数校验

这一步很多人会忽略,但恰恰是最重要的。检查什么?

  • 订单金额是否超过风控限额
  • 股票是否在可交易名单里
  • 当前市场状态是否允许交易(比如盘前、盘中、盘后)
  • 算法参数是否合理(比如参与率不能超过50%)
我曾经踩过的坑:有一次参数校验没做好,一个本该在盘中执行的算法,因为时区问题在盘前就开始交易了。结果可想而知,流动性极差,每笔都打在了涨停板上。从那以后,我强制要求所有算法必须校验「当前市场阶段」。

17.3.3 切片生成

这就是我们前面讲的 TWAP、VWAP、POV 的核心逻辑。算法根据策略生成一系列子订单。

17.3.4 执行

子订单被发送到交易所。这里有个细节:是直接发到交易所,还是先发到券商?不同的路径延迟不一样。我个人习惯直接对接交易所,能省掉几十毫秒的延迟。

17.3.5 实时反馈调整

这是算法交易的精髓。执行过程中,算法会不断收集市场数据,然后动态调整后续的切片。

举个例子:你用 VWAP 算法,结果发现当前时段的成交量只有历史均值的60%。怎么办?

  • 方案A:继续按原计划执行,最后肯定完不成
  • 方案B:把未完成的量摊到后续时段
  • 方案C:降低参与率,延长执行时间

我一般选方案B,但会加一个「最大时间限制」。超过这个时间还没完成,就强制撤单。

17.3.6 统计评估

订单执行完毕后,需要算一笔账:

  • 实际成交均价 vs 目标均价
  • 滑点成本
  • 市场冲击成本
  • 完成率

这些数据会反馈到算法参数里,用于下一次优化。说白了,这就是个不断迭代的过程。

核心总结:算法交易不是「一键下单」那么简单。它是一个完整的生命周期管理过程,从订单接收、参数校验、切片生成、执行、实时调整到最终评估,每个环节都马虎不得。

好了,这一章的内容就到这里。下一章我们会深入讲「订单簿动态与限价订单簿重建」,那才是真正考验功力的地方。


无相订单流研究社 微信Lucian808555