高频交易都有哪些著名的算法?

来源于:巴菲特说「高频交易并没有提供流动性」是否属实?高频交易究竟能否提供流动性?高频交易里面一个很著名的算法是冰山算法(tow the iceberg) 还有没有其他有名的算法呢?
关注者
10,063
被浏览
425,120

35 个回答

高频交易的算法非常依赖于所处市场的具体交易细则和交易所的IT架构,所以想要一招吃遍天下肯定是不行的。但其实高频交易对应的数学比较简单,更多的是一个速度的比拼。

首先一个高频交易算法必须要对市场微结构有非常细致的认识。
交易所向所有的交易所成员发送的市场数据有很多类型,但大体上分成两类:
@董可人 介绍的冰山算法里所用的订单簿模型,属于价位订单簿(level-based order book),也就是说,你从市场订单里,可以看到每个价位总的订单量,但看不到具体有多少个订单。这样做的交易所有不少,其中最有名的是芝加哥商品交易所(CME)。

借用董哥一张图。

这样的市场数据里,你不知道每个价位上究竟有多少订单,只知道总体的订单量。

另外一种市场数据是显示订单的订单簿(order-based order book,实在不知道怎么翻译了)
这种市场数据里,每个交易成员都能看到每个价位上有多少订单,每个订单的大小是多少。
同时很重要的一点,通过配对交易所回执里的ID和市场数据里的ID,也能在市场数据里看到自己下的订单。最大的作用就是做成交预测:当你看到市场数据里自己的订单消失了,即使还没收到交易所的成交回执,你也知道这个订单成交了,并且可以第一时间干该干的事情。要知道,几十毫秒(甚至微秒)的差别就能决定一次交易的盈利。

大前提说完了。下面开始介绍具体的策略。

在08年之后,合法的高频交易其实大部分只是两类策略:
  • 做市:在单一品种上(比如个股)提供流动性,赚取买卖价差
  • 套利:在多个品种上寻找短期的定价偏离


------------------------------------------------------------------------------

没想到大家这么热情,两天时间就过百赞了。那我就继续更新了,哈哈。
评论里明显有同行,对交易所的数据协议研究很深,毕竟对于高频交易程序来说这是最重要的数据源。答主我也只是略懂一二,有不准确之处还请指教。

在这里我会给大家做一个基本的介绍,但想真正拿这些方法赚钱,那估计你会发现实操里的坑不要太多。这也是这一行竞争逐渐激烈,并且竞争演变成军备竞赛的原因。你在刘易斯的《闪电小子》这本书里看到的大部分已经不符合现实,但是其中『为了几微妙缩短延迟,铺设笔直的光纤』这种事情仍然在发生,而且现在连横跨大洋的微波网络都已经普及,FPGA也是业内公开的秘密,大家都在为了节约那几个微秒甚至纳秒不惜代价。

首先是做市。做市是个历史悠久的策略,其实在高频交易尚未出现,甚至在交易所还是这样的时候就已经出现了。


做市商的工作就是提供流动性:具体来说,做市商同时挂买单和卖单,赚取其中的差价。
为什么需要有做市商呢?因为有人想买,有人想卖,但是他们不一定同时出现,也不一定愿意等自然的对手方出现,所以他们愿意支付一定的钱和做市商做对手方,做市商就赚这么一点差价。

先来看最单纯的个股做市:
假设某股票现在的order book是这样的:

那么现在的价格是9.7/10.1。一个图森破的做市商(不考虑其他风险)会在尽可能靠里面的价位挂单:
于是最好的买价和最好的卖价都被这个做市商占领了。
这样如果有人想立刻买(下市价单,或者下限价单,限价在卖一),做市商的单子是第一个成交的,成交之后做市商就有了仓位。如果股价维持不变,迟早会有人想卖,于是做市商挂在买一的单子也会成交,平仓之后净赚1块钱,扣除手续费清算费各种费之后之后怎么也能剩个5毛吧。

没错,和那种一下子就豪掷千万的对冲基金不一样,做市商就是一小本生意,每次赚点小钱。
估计你也发现了,这里的大前提就是『如果股价在做市商持仓期间维持不变』,还有很多小前提(手续费够低,做市竞争不激烈,没庄家操纵股价)。

然而这很明显不是现实的情况。很多时候在你的第一个订单成交,有了仓位还没平仓的时候,市场就急转直下,朝着对你不利的方向走去,这时候大部分做市商会平仓止损,亏一点小钱。这样的做市策略最喜欢的平稳的市场,活跃但价格稳定(活跃怎么价格稳定呢?),最讨厌的就是一个大单一下子吃掉几个价位(甚至几十个价位),仓位全砸在手里了。一般市场消息发布的时候这种策略都会关掉或者调成保守,但有时候市场突发重大消息,或者外汇又出什么事情了,某个推特又大嘴了,导致价格异动,那十有八九是会亏的,而且赚一亏十。

做市商的盈利,大部分是来自于规模化,一个策略可以在几千个个股上跑,每支股票一天赚几百块,以及自动化的风控和止损策略,还有很重要的一点就是交易所提供的返佣和报价补贴(毕竟交易所也希望自己的品种流动性更好)。

衍生品的做市就是完全不同的逻辑了,因为仓位是可以被部分对冲或者完美对冲的,因此可以锁定利润,所以这就包括在我们接下来要介绍的『套利』策略。

套利,其实字典里已经给了完美的解释:
the simultaneous buying and selling of securities, currency, or commodities in different markets or in derivative forms in order to take advantage of differing prices for the same asset.
同时买卖高度相关的品种,并且从『理论上价格应该一样,但是现在市场上价格不一样』的品种里获利。一般来说,在两种品种之间套利,两种品种的价格遵循简单的线性关系,其理论价差可能来源于手续费/基差/利率等一些因素。当现实的价差偏离理论价差,你就可以买卖价差(同时买卖两种品种)建仓了。

这里也分两种情况:
  • 相关品种的套利 (Correlated Assets Arbitrage)
  • 可替代的品种的套利 (Fungible Assets Arbitrage)
相关品种套利:比如期货的不同交割月的合约之间的套利,上海金和伦敦金的套利,等等。但最重要的是,两种品种并不是同一个东西,并不能简单抵消彼此,所以其实本质上相当于量化里的统计套利,并不能保证盈利,可能会积累巨大的价差头寸。

可替代品种套利:比如个股和其存托凭证之间,股指期货大合约和小合约之间,ETF和其成分股/成分资产之间。这样的两个品种之间是可以相互转化的,比如存托凭证可以让发行的银行转化成普通股,不同交易所发行的股票可以转移股票位置(depot switch),ETF可以让发行机构申赎成其成分,或者按净值赎回现金,期货可以在『交割价交易』市场上以交割价买入卖出,等等。这样就可以在发现套利机会的时候就锁定利润,因为在两种品种上积累的头寸可以互相抵消。

越高频的策略,其本质上就越简单,就越需要低延迟的下单和市场数据,越需要巨量的IT投资,其盈利模式也更多的偏向规模化,这就是为什么高频交易公司总是赢家通吃,很多小公司最后做不下去就关了,或者是转向量化交易了。

期权做市则是另外一个市场了,因为期权的非线性特征和做市商主导的市场,对于速度的要求可能没有其他品种那么高,更多的需要数学知识和复杂策略等,同样的品种还有流动性很差的ETF(比如其成分不在公开市场上交易),和『在交易时间时,其成分不在交易时间』的衍生品,比如港股在美国的ETF。还有一些场外衍生品或者语音报价的OTC产品,其盈利模式又不一样了。

答主也并非这个领域的专家,请大家多多指教。
收录于 编辑推荐知乎圆桌知乎周刊 ·
对题目中提到的“冰山算法”,我刚好有一些了解,可以给大家讲讲。很多人对“量化交易”的理解实在太过片面,基本上把它等同于生钱工具,我不赞同这种观点。交易首先是交易本身,有它自身的经济学意义,忽略这一点而单纯把它看成使钱增值的数字游戏,很容易就会迷失本心。

我也不认为算法本身有什么稀奇,再好的算法也是死的,真正的核心价值一定是掌握和使用算法的人。实际上我讲的东西也都是公开的信息,但是即便了解了技术细节,能真正做好的人也寥寥无几。

希望这个回答可以让你对量化和高频交易有一个更清醒的认识。

~~~~~~~~~~~~~~~~~~

首先我相信不少人概念里的高频交易还是这个样子的:

但对高频交易来说,这种信息是非常粗糙的。所以这里先要对不熟悉背景的同学介绍一下什么叫做Order Book。现在主流的交易所一般都使用Order Book进行交易,交易所在内部的Order Book上记录所有买家和卖家的报价,比如像这样:


Bid表示买家,Offer表示卖家,这张报价单表示买卖双方发出的所有报价单(Limit Order)。这张表才是高频交易最关心的信息。任意时刻,买家的出价总是低于卖家(比如这里的98对101)。所以报价虽然一直在变化,但是只有报价是不会有任何成交的。

什么时候会产生交易呢?有两种情况,第一是任一方发出市价单(Market Order),比如一个买家发出一张单量为10的市价单,就可以买到卖方在101价格上挂的10份,这个交易成功之后,Order Book会变成这样:

第二是发出一个价格等于对方最优报价的限价单,也会产生和上述情况相同的结果。

需要强调的是,虽然真正的Order Book只存在于交易所内部,所有交易都在交易所内完成,但是交易所会把每笔报价和市价单都转发给所有人,所以所有的买家和卖家都可以自己维护一个同样的数据结构,相当于交易所Order Book的镜像。通过跟踪分析自己手里这份的镜像变化,来制定交易策略,是高频交易算法的核心思想。

~~~~~~~~~~~~~~~~~~

基础知识介绍完毕,下面为了方便大家理解,我采用一种更形象的方式来表示Order Book:

这张图对应文章开始时的那个Order Book,应该可以明白地看出,横轴表示价格,纵轴表示订单量,绿色表示买家,红四表示卖家。这样做的目的是为了引出本篇讨论的主题:冰山订单。

通过上述基本分析大家可以看出,交易所内的交易数据是完全公开的,市场上任意时刻,有谁想要买/卖多少,所有人一目了然,没有任何秘密。这样做本身是有经济学意义的,因为只有展示出买卖的需求,才会吸引潜在的商家来交易,所以在市场上一定程度的公开自己的需求是必要的。但这样同时带来一个严重的后果,一旦有某个人想要大量买/卖,他所发出的巨额限价单会直接展示给所有人。比如一个买家挂出巨额买单后,Order Book会像这样:

这对他非常不利,因为所有人都会利用这个信息来跟他做对。大家会判断,现在市场上存在大量的买压,于是会出现一大批为了赚钱而冲进来的人抢购,价格会快速上升,这样原来这个人可以在98这个价位买到的东西,很快就变得要在更高的价位上才能买到。这种情况,那些后来的人做的就是Front running,而原来的那个人则面对逆向选择风险

为了解决这个问题,交易所提供了一种针对性的工具,就是所谓的冰山订单(Iceberg Order)。这种订单可以很大,但只有一小部分是公开出来的,大部分则隐藏起来,除了交易所和发单者本人谁也看不到,真的像一座“冰山”一样。比如像这样:

灰色的部分就是冰山订单隐藏的部分。这样,只有当有对应隐藏量的交易发生时,交易所才会通知其他人,就避免了别人利用显示订单的信息来做Front running

凡事有一利必有一弊。冰山订单虽然保护了发单者的利益,但是对于其他市场参与者来说却又变成了一种不公平的规则。那些有真实的交易需求的参与者,会因为对局势的误判而损失惨重。所以接下来的问题就变成,如何发现市场上的冰山订单?

首先有一种最简单的方法。有的时候,冰山订单是挂在最优买价和卖价之间(spread),像这样:

对于这种情况,有一个非常简单的探测方法,即发一个最小额度的限价单在spread里,紧跟着取消这个订单。比如这个例子中,发出一个卖价为99的限价单然后取消。因为这个价格本身对不上显式的买价(98),如果没有冰山单的存在,一定不会成交。但有冰山单的情况下,一旦交易所收到这个卖单,会立刻成交冰山单中对应的量,而之后的取消指令就无效了。这样,以一种微小的成本,就可以发现市场中隐藏着的订单。事实上,的确有人会做这种事情,频繁的发单然后取消,在最优价差之间形成一种高频扰动,用来探测隐藏单。

为了应对这种扰动探测,大家一般都不会直接挂单在spread里。而是会像之前那样和普通的限价单挂在一起,这样发生交易之后,你就很难推测消耗掉的究竟是正常的限价单,还是冰山订单。那么应该怎么做呢?

首先有一个直接的思路。冰山订单的存在,一定程度上反映了挂单人对市场情况的解读,认为有必要使用冰山订单而做出的判断。需要强调的是,使用冰山订单并不是没有代价的,因为你隐藏了真实的需求,在屏蔽掉潜在的攻击者的同时,也屏蔽掉了真正的交易者!而且会使得成交时间显著增加--因为没人知道你想买/卖这么多,你只能慢慢等待对手盘的出现。所以当有人下决定发出冰山订单的时候,也会有对市场情况的考虑,只有合适的时机才会做这种选择。

什么是合适的时机?有一些数据应该是相关的,比如买卖价差spread,买单量对卖单量的比值等。对这些数据,你可以在历史数据上做回归分析,建立起他们和冰山订单之间的线性/非线性模型。通过历史数据训练出来的这个模型,就可以作为你在实时交易时使用的冰山订单探测器。这是 On the Dark Side of the Market: Identifying and Analyzing Hidden Order Placements 这篇论文使用的方法。

基本模型可以定义为:F(spread,bidSize/offerSize,……) = Probability(Iceberg)

如果你想玩高深的,还可以在此基础上做HMM,SVM,神经网络之类的高级模型,但基本思路是一致的:通过盘口分析计算存在冰山订单的概率。

~~~~~~~~~~~~~~~~~~

上面说的这个方法,看起来很高级,实际效果如何呢?我想大家也看出来了,这种建模不是很精确。作为事后分析手段用来说明什么情况下可能会出现冰山订单还不错,但是作为实时交易的探测器就不是很放心。因为使用的信息太模糊了,而且说到底建模的对象只是一种相关性,没有什么保证冰山订单的发送者一定是按照这个逻辑出牌的。

所以接下来介绍的,才是真正具有高频玩家神采的方法,来自 Prediction of Hidden Liquidity in the Limit Order Book of GLOBEX Futures 这篇论文。

~~~~~~~~~~~~~~~~~~

高频世界里,有一条永恒的建模准则值得铭记:先看数据再建模。如果你看了上面的介绍就开始天马行空的思考数学模型,那基本上是死路一条。我见过很多年轻人,特别有热情,一上来就开始做数学定义,然后推导偏微分方程,数学公式写满一摞纸,最后一接触数据才发现模型根本行不通,这是非常遗憾的。

而看了数据的人会怎么样呢?他很可能会发现,对于冰山订单的处理,交易所的规则是非常值得寻味的。有的交易所是这样做的:一个冰山订单包含两个参数,V表示订单总量,p表示公开显示的量。比如V=100,p=10的冰山单,实际上隐藏的量是90。如果有针对这个订单的交易发生,比如交易量10,交易所会顺序发出三条信息:
  1. 成交10
  2. Order Book的Top bid size -10
  3. 新Bid +10
这三条信息一定会连续出现,并且第三条和第一条的时差dt很小。这样做的原因是尽管冰山订单存在隐藏量,但是每次的交易只能对显示出的量(p)发生,p被消耗掉以后,才会从剩余的隐藏量中翻新出一分新的p量。这样,每个人从交易所收到的信息仍然可以在逻辑上正确的更新Order Book,就好像冰山订单并不存在一样。

因此,一旦在数据中观察到这个规律,我们就可以非常有把握的判定市场中存在冰山订单,并且连p的值都可以确定!接下来的关键问题是,如何确定V的值,即判断这个冰山订单的剩余存量有多少?

这个问题从本质上说没法精确求解,因为V和p都是由下单人自己决定的,可以是任意值。但可以从两点考虑:第一,两个值都是整数;第二,人类不是完美的随机数生成器,下决定会遵循一定规律。

从这两点出发,可以对V和p建立概率模型,即计算一个给定的(V,p)值组合出现的概率是多少?这里不去深入探讨数学分析,感兴趣的朋友可以自己去看原文。简单说,可以在历史数据上通过kernel estimation技术来估算他们的概率密度函数的形状。顺带一提,如果你亲手编写过这种估算程序,就会理解我为什么在“要想成为一名优秀的 Quant 需要什么样的编程水平?”这个答案中如此强调编程的重要性。在数据上估算出来的概率密度函数可能会是这样的:

这样,当你在实时数据中观测到一个p的值时,就可以得出对应的V值的条件概率密度函数,即上图的一个切面,比如(p = 8):

接下来显然就很容易计算V最可能是什么值了。这条函数曲线还有一个重要的作用是帮助你动态评估剩余存量,比如当你观察到已经有5份p被消耗掉,即可推出V>=40,由上图即可推出新的V值和剩余存量(V-5p)。

综上,算法的核心在于,通过在实时数据中监测短时间内连续出现的三条相关记录判断冰山订单的存在,而对冰山订单的量化则通过由历史数据训练出的概率模型来完成。

相信你也会看出,这种算法并不是什么作弊神器。它只是利用市场上的公开数据所做的一种推测。而且这个推测也仅仅是基于概率的,更多的应该是作为一种参考。它对做市商这种流动性提供者很有意义,可以使他们避免因为对局势的误判而遭受损失。但如果你想用它来作为一种攻击手段,觉得自己能发现隐藏大单而去Front run,那实在是很不明智的选择。

最后,这种算法也只是针对特定的交易所。其他的交易所也许不会采用同样的冰山订单处理方式。所以真正有价值的是这种从实际数据出发的建模思路,具体的算法并不值钱。

~~~~~~~~~~~~~~~~~~

这个小算法给你展示了高频交易领域的“冰山一角”。它看起来也许不算很复杂,但是我却很喜欢。因为它清晰地展示了什么叫做先有思路,再有量化。因为有“冰山订单”这样一个从经济学基本的供需关系出发的真实需求,通过分析实际数据找到一丝线索,最后通过数学模型刻画出定量的策略,这才是漂亮的策略研发。

如果违背这个原则,一上来就去搬各种高级的模型去套数据,指望模型自动给你生成交易信号,这在我看来无异于痴人说梦。遗憾的是,这个梦的确太过诱人,而这个世界也从来不缺少莽夫。

且行且珍惜。