3、算法交易基础:算法交易的定义、算法交易的优势、常见的算法交易类型
说到算法交易,很多人第一反应就是「高大上」——量化对冲基金、高频交易、每秒几万笔订单……其实没那么玄乎。
我个人习惯把算法交易理解成:让计算机按照预设规则,自动帮你拆单、择时、执行交易。说白了,就是把你脑子里那些「我想慢慢买,别把价格打上去」的想法,写成代码让机器去干。
3.1 算法交易的定义
官方定义我就不念了,说点实在的。
算法交易,英文叫 Algorithmic Trading,指的是用计算机程序来自动化执行交易指令的过程。它跟量化交易不一样——量化交易解决的是「买什么、什么时候买」,而算法交易解决的是「怎么买、怎么卖才能不亏」。
我记得刚入行那会儿,带我的老工程师跟我说过一句话,我一直记着:「策略再好,执行不好也是白搭。」算法交易就是那个「执行」的环节。
3.2 算法交易的优势
为什么要用算法交易?手动下单不行吗?
行,当然行。但如果你一次要买几百万的可转债,手动下单的结果往往是——价格被你买上去了,成本变高了。这就是所谓的「冲击成本」。
3.2.1 降低冲击成本
冲击成本是什么?你想想看,市场就像一个水池。你扔一块小石头,水面只是微微波动;但你扔一块大石头,水花四溅,水位都变了。
交易也是一样。大单子一进去,买盘瞬间被吃掉,价格蹭蹭往上窜。你本来想买在100块,结果因为自己买得太猛,最后成交均价变成了100.5。这0.5就是冲击成本。
算法交易怎么解决?拆单。把一个大单拆成几十个、几百个小单,慢慢喂给市场。市场还没反应过来,你已经买完了。
3.2.2 提高执行效率
效率这个词,在交易里有两层意思:
- 速度效率:机器下单比人快。人看到行情、思考、点鼠标,至少几百毫秒。机器可以在微秒级别完成。
- 人力效率:你不可能同时盯着几十只可转债,手动调整每个订单。但算法可以。一个算法可以同时管理上百个标的。
说白了,算法交易就是让你从「盯盘民工」变成「策略指挥官」。你只需要定好规则,剩下的交给机器。
3.3 常见的算法交易类型
市面上算法交易类型很多,但最基础、最常用的就三种:TWAP、VWAP、POV。我一个个说。
3.3.1 TWAP(时间加权平均价格)
TWAP,全称 Time-Weighted Average Price。翻译成人话就是:把订单均匀地分配到每个时间切片里。
举个例子:你需要在1小时内买入1000张可转债。TWAP的做法是:把1小时分成60个1分钟切片,每个切片买入约16-17张。不管市场怎么波动,我就按时间均匀执行。
TWAP的优点是简单、透明、容易实现。缺点也很明显——它完全不考虑市场行情。如果某个时间点价格特别低,它不会多买;如果价格特别高,它也不会少买。
代码实现也很简单,我贴一个伪代码示例:
// TWAP 算法伪代码
function twap(totalQuantity, totalTime, sliceInterval):
slices = totalTime / sliceInterval
perSliceQty = totalQuantity / slices
for each slice:
placeOrder(perSliceQty)
wait(sliceInterval)
3.3.2 VWAP(成交量加权平均价格)
VWAP,全称 Volume-Weighted Average Price。这个比TWAP聪明一点——它参考了市场的成交量分布。
逻辑是这样的:如果某个时间段市场成交量很大,说明这个时间段流动性好,我就多买一点;如果成交量很小,我就少买一点。最终目标是让我的成交均价尽量接近市场的VWAP。
我举个例子你就明白了:
| 时间段 | 市场成交量 | TWAP分配 | VWAP分配 |
|---|---|---|---|
| 9:30-10:00 | 5000张 | 250张 | 100张 |
| 10:00-10:30 | 20000张 | 250张 | 400张 |
| 10:30-11:00 | 5000张 | 250张 | 100张 |
你看,VWAP在成交量大的时间段分配了更多订单,这样对市场的冲击更小。
3.3.3 POV(成交量参与率)
POV,全称 Percentage of Volume。这个算法的思路跟前面两个完全不同——它不按时间分配,而是按市场成交量的比例来下单。
比如你设定参与率为10%。那么市场每成交100张,你的算法就下单10张。市场成交快,你就买得快;市场成交慢,你就买得慢。
这样做的好处是:你的订单始终跟市场保持同步,不会在市场流动性差的时候硬买,也不会在市场流动性好的时候买少了。
POV的代码实现稍微复杂一点,需要实时监控市场成交量:
// POV 算法伪代码
function pov(totalQuantity, participationRate):
executed = 0
while executed < totalQuantity:
marketVolume = getMarketVolume() // 获取当前市场成交量
targetQty = marketVolume * participationRate
actualQty = min(targetQty, totalQuantity - executed)
placeOrder(actualQty)
executed += actualQty
wait(updateInterval)
3.4 三种算法的对比
嗯,到这里你可能有点晕——到底该用哪个?我整理了一张对比表:
| 算法 | 核心逻辑 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| TWAP | 按时间均匀分配 | 简单、透明、可预测 | 不考虑市场行情 | 流动性好、波动小 |
| VWAP | 按成交量分布分配 | 冲击成本低、跟踪市场 | 依赖历史数据 | 流动性稳定、成交模式可预测 |
| POV | 按市场成交量比例下单 | 自适应市场、灵活 | 执行时间不确定 | 流动性变化大、需要隐蔽执行 |
3.5 知识体系结构图
为了让你更直观地理解这三者的关系,我画了一张图:
好了,关于算法交易的基础就讲到这里。记住一句话:算法交易不是魔法,它只是帮你把交易执行得更聪明一点。选对算法、调好参数,你的交易成本就能降下来一大截。