第十七章:算法交易基础
各位同学,今天我们来聊聊算法交易。说实话,这个领域我摸爬滚打了快十年,踩过的坑比写过的代码还多。你想想看,一个订单从你按下回车到最终成交,中间经历了什么?嗯,这就是我们今天要拆解的核心。
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
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
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 目标均价
- 滑点成本
- 市场冲击成本
- 完成率
这些数据会反馈到算法参数里,用于下一次优化。说白了,这就是个不断迭代的过程。
好了,这一章的内容就到这里。下一章我们会深入讲「订单簿动态与限价订单簿重建」,那才是真正考验功力的地方。