目录

关于本书

「盐」系列电子书出版序

作者序

第一章 大电子交易时代皇冠上的明珠

1.1 什么是高频交易系统

1.2 高频交易的第一推动力 —— 追逐流动性的交易所们

1.3 高频交易的理论基石 —— 市场微观结构

第二章 纳秒，微波，FPGA：高频交易黑科技

2.1 高频交易软硬件是怎么架构的

2.2 C++ 为核心语言的高频交易系统是如何做到低延迟的

2.3 高频交易系统的开发语言选择之 C++ VS Java

2.4 高频交易系统如何在多线程和端口通讯之间取舍

第三章 数字炼金术：高频交易策略谈

3.1 金樽清酒斗十千 —— 交易数据时序建模

3.2 拔剑四顾心茫然 —— 交易数据采样方法

3.3 欲渡黄河冰塞川 —— 高频交易策略实战

3.4 直挂云帆济沧海 —— 策略研发工具篇

第四章 在光电幻影中挥动数字之刃的人们

4.1 交易策略研发人员为什么不用自己的钱交易，而要去基金公司上班

4.2 Quant 和程序员到底有什么差别

4.3 要想成为一名 Quant 需要什么样的编程水平

4.4 P Quant 和 Q Quant 哪个是未来

4.5 如何成为一名优秀的 Quant

第五章 失落凡间的真秘籍

5.1 研究高频交易有哪些好的参考书目

5.2 高频交易领域的学术文献

关于本书

《我是高频交易工程师——知乎董可人自选集》/董可人

出品人 周源

编辑 梅莹 刘强

设计 郝小好

策划 成远

联系我们 weekly@zhihu.com

本电子书版权为北京智者天下科技有限公司所有，未经书面授权，不得在任何地区以任何方式反编译或节录本书内容。

ZHI-BN:9-0057-0000151104-1

DNA-BN：ECFD-N000000670057

最后修订：2015 年 11 月 04 日

出版：浙江出版集团数字传媒有限公司

浙江 杭州 体育场路 347 号

互联网出版许可证：新出网证（浙）字 10 号

电子邮箱： cb@bookdna.cn

网址： www.bookdna.cn

本书电子版如有错讹，祈识者指正，以便新版修订。

Zhejiang Publishing United Group Media CO., LTD, 2013

No.347 Tiyuchang Road, Hangzhou 310006 P.R.C.

service@bookdna.net

www.bookdna.net

「盐」系列电子书出版序

知乎创始人 周源

我们和这个世界，有一种天然的媒介，那就是存在于我们大脑里，没有被分享过的信息。如果有某种方式把每个人的知识、经验和见解都汇集起来，会不会像从信息海洋中源源不断地提取出知识之盐一样，极大地丰富很多人生活的味道？

这个问题，令人兴奋。知乎创立至今，诞生了一种新的知识生产方式，对世界的提问和回答，像是对一个无序的世界进行了一次次重构 —— 把彼此大脑里没有分享过的知识、经验和见解搬上了互联网，组成了一个全新的网络。而那些最有知识、经验和见解的人，就像盐，给这个世界带来味道。

您即将展开的这本书，属于知乎的「盐系列」丛书。我们希望这些作品保存一种海的味道，因为在知乎看来，每一位认真的知友，都是知识海洋中析出的智慧之盐。我们希望这一系列的每一本书，都可以为您透析世界的一个组成部分，亦或给您的生活增光添味。

读这书时，请别忘记，它诞生自一个有味道的人。

作者序

2010 年 5 月 6 日，美国股市意外崩盘，10 分钟内跌幅最高达到 9.2%。这次冲击造成华尔街上万亿美元凭空蒸发。事后，美国商品期货交易委员会的调查指出，事件虽然缘于交易员的误操作，但当时市场中的高频交易者们使用的交易算法也在其中起到推波助澜的作用，难辞其咎。

2012 年 8 月 1 日，当时美国最大的一家高频做市商骑士资本（Knight Capital Group）由于误把测试用交易软件部署到实时交易环境，在 45 分钟内疯狂执行了四百万次交易指令，涉及 154 只股票，造成的损失超过 10 亿美元。骑士资本自身更是因此亏损 4.4 亿美元，几近破产，最终被另一家高频交易公司 Getco 收购。

2013 年 8 月 16 日，中国的光大证券的自动交易系统因为技术缺陷，2 秒内生成超过 2 万笔委托单；其中 6413 笔直接发送至交易所，成交 72.7 亿人民币。此次故障使得当日上证综指一度上涨达 5.96％，对中国 A 股市场造成巨大冲击。光大证券也因此损失约 1.9 亿人民币。

2015 年 6 月 12 日至 8 月 6 日，近两月间，中国 A 股市场遭遇暴跌，两月内上证综指最大下跌达 34.9%。随后，监管部门出台了一系列政策，以抑制过度投机，促进国内市场规范化。其中特别引起国内量化交易从业者关注的，是中金所的一系列管控措施，包括限制交易者单个产品的单日开仓量，提高交易保证金，提高平今仓手续费，等等。这些措施在事实上抑制了国内刚刚萌芽不久的高频交易，从业者们何去何从一时间陷入迷雾之中。

在这一系列惊心动魄的事件中，「高频交易」这个名词像野马般冲入了大众视野。在这些爆破眼球的事件渲染下，高频交易自然而然地披上了一层神秘外衣。在有的人眼中，它是一台攫取暴利的印钞机；在有的人眼中，它破坏力极强，就是那个让市场崩盘的始作俑者。

但是，高频交易真的是大家眼中的妖魔吗？它到底是在做什么？它的商业运作模式是怎样的？又是什么样的人在这个行业中拨弄风云？作为一个每天都在从事相关工作的职业工程师，我希望根据自己的亲眼所见，在这本篇幅不长的电子书中描绘出具体的图景，告诉你这个行业里真实发生的事。

我本是一名计算机系的学生，终日与代码、屏幕和键盘打交道，似乎本应注定投身于互联网的大洪流。然而机缘巧合，最终的工作竟是研究交易算法，设计交易系统。转眼间入行已数年，我学习了千奇百怪的技术，见识了形形色色的人，虽前方仍是路漫漫，但已觉不虚此行。相比外界对高频交易所持的妖魔化印象，我想说的是，此行中自有奇巧机关、科学方法，以及系统工程；此中优秀者必要千锤百炼、凝聚心血，才能一展光彩。在我眼中，它是一门正正经经的生意，既非印钞之神器、暴富之法宝，也绝非市场之毒瘤、崩盘之祸首。

这本小书的主要内容取自我在知乎上「量化交易」和「高频交易」类话题下的回答。我力争将这些零散的回答归纳、整理出一条完整的脉络。但时间精力有限，难免有粗糙之处，还请各位读者海涵。

本书的组织结构如下：第一章描述行业背景，从宏观角度讲述高频交易是做什么的，以及它的业务模式和商业逻辑，还包括一些理论研究方面的进展，希望让那些对高频交易还一无所知的朋友增加一点了解；第二章从技术层面讲解高频交易系统的设计、架构和实现，从软硬件层面展示了电子时代工程师们怎样打造交易系统 ；第三章探讨交易数据建模和交易策略研发，给出了一个有实战价值的高频交易策略实例，也推荐了一些针对此类工作的工具，以供大家参考使用；第四章对此行业的从业者做了简单的速写，希望让大家了解到从事这项工作有哪些技能上的要求，入行要做哪些准备，等等；第五章给出了一些参考书目和学术文献，供有兴趣的读者进一步深入了解。

我是一名高频交易工程师。我热爱我的职业，也愿意向你讲述它的精彩之道。若你对我所置身的行业有兴趣，就请抽出半日余暇，将这本小书作为漫游指南，对此领域一窥堂奥。

第一章 大电子交易时代皇冠上的明珠

1.1 什么是高频交易系统

根据现在市面上的主流认知，我想大多数人概念里的高频交易系统是这样的：

· 交易指令完全由电脑发送，对市场数据的响应延时在微秒级；

· 系统由专用的软硬件组成，研发时需要大量计算机专家级的工作；

· 系统的硬件需要放在离交易所主机很近的位置上，所谓 co-location。并且得到专门的准入许可证，交易指令直接发送至交易所。

符合以上三点的，就可以叫做高频交易系统。现在市面上的主流媒体，包括大部分新闻和畅销书在谈到这个话题时，说的也就是这种系统。或许有人会说，这三条中没有一条在谈频率，只能叫低延迟系统不叫高频交易。事实上，所谓「高频」，并非一定是指成交的频率高，有些系统只是下委托单和修改、回撤委托单的频率高，真正的成交次数可能并不多，也一样可以叫做高频交易系统。 如果你对这个描述仍有疑问，那么我必须要指出，事实上还有一个非常官方的定义，来自美国证券交易委员会（SEC）。SEC 也很难给出明确的定义，最终的描述是基于 5 个特性：

· 使用超高速的复杂计算机系统下单

· 使用 co-location 和直连交易所的数据通道

· 平均每次持仓时间极短

· 大量发送和取消委托订单

· 收盘时基本保持平仓（不持仓过夜）

见：http://www.sec.gov/rules/concept/2010/34-61358.pdf

除此之外，还存在很多妖魔化高频交易的言论，比如：

· 超强的盈利能力（仿佛高频交易的机器就跟印钞机似的）；

· 纯粹靠交易赚钱，有着神秘的数学模型和尖端科技，精准地预测市场走势，带着无可比拟的优势在市场上呼风唤雨；

· 利用速度优势割其他机构类交易者的肉（大家认为这是作弊）。

回想一下，有没有人对你高谈阔论高频交易时提到这里任何一点？你听完以后有何感想，是好生羡慕，心潮澎湃，还是满腔愤恨上天不公？别着急，继续往下看，相信你看完这个回答以后，能够形成一个正确的概念。下次再遇到这种人，就直接请他闭嘴。特别是那些对高频交易有兴趣但还没入门的朋友，希望你能有一个正确的认识。否则，当你历尽千辛万苦，怀着满腔热情加入一家 HFT（High Frequency Trading），以为从此以后你的工作就是对海量数据做高深莫测的数学模型，架起机器冲进市场草割那些无知的低频交易者，白花花的银子便像雪片一样落进你的口袋，你很可能要失望。

摒除这些错误的观念，这个行业的真正的精髓才能向你展开：偏执的科技至上理念，极其复杂的技术难题，疯狂追求机器极致的性能，以及高强度的同业竞争。这些才是我认为的本行业最吸引人的特点，它们本身就足够让人着迷了。至于赚钱，建议你把它当作承担压力、努力工作之后的回报，而不要幻想无意间被葵花宝典砸到学得惊世神功，从此纵横股市点石成金；这种神话至少在这个行业是不存在的。

传说中，高频交易的盈利能力很强。但现实很残酷。和任何其他行业一样，赚大钱的的确有，赔钱的也大把存在。我想这个行业之所以特别吸引眼球，主要是因为它融合了「金融」和「计算机」这两个热门词汇，而且确实是一个高科技行业（相信没几个行业会关心光速在不同介质中的区别），因此很容易给外人一种神秘感。但如果只盯着金字塔顶端的几家公司便下结论，就好比看了乔丹集锦以后便认为所有打篮球的人都特别能扣篮一样，是不现实的。

特别需要说明的是，由于高频交易系统对低延迟的敏感性，研发时需要投入大量的人力、物力，要高薪聘专业的计算机专家，花钱买昂贵的硬件，租用专门的微波通信线路。但这一切都不能保证你得到一个预想中的「低延迟」系统。整个系统的设计和开发是一个非常复杂的工程，而且交易系统对于准确性和稳定性的要求极高，若是不够精密，上线后会出现各种问题，根本无法使用。如此大规模的投入，很多时候换来的是一个残次品系统。非常非常多的公司因为搞不定技术问题而赔钱关门。

这里有一个深远的问题，即高频交易是一个金融和计算机相结合的产业，但同时精通这两者的人才是非常稀少的。金融人士主导的项目会缺乏对技术的判断能力，IT 人士主导又会对需求把握不清。在对性能不敏感的行业中这可能不是太大的问题，可以按照传统的甲方乙方方式解决，若有问题慢慢扯皮。但在这个高竞争行业，没有太多时间可以用来浪费在扯皮上。投产的系统可能慢上几微秒就是废物，而那时往往会发现基本的设计就有问题，根本无力回天。这种超高难度的研发压力，其实才是高回报的缘由。

根据美国证券交易委员会（SEC）2010 年给出的这份报告 Concept Release on Equity Market Structure |http://www.sec.gov/rules/concept/2010/34-61358.pdf  中的定义，高频交易主要包括这几种x类型：

· 被动做市（Passive Market Making）。这种策略是在交易所挂限价单进行双边交易以提供流动性。所谓双边交易，是指做市商手中持有一定存货，然后同时进行买和卖两方交易。这种策略的收入包括买卖价差（spread）和交易所提供的返佣（rebate）两部分。

· 套利（Arbitrage）。这个策略应该是大家比较熟悉的，就是看两种高相关性的产品之间的价差。比如说一个股指 ETF 的价格，理论上应该等于组成该 ETF 的股票价格的加权平均（具体计算方式按照此 ETF 定义来看）。但因为种种原因，有时我们会发现市场上这两种价格并不一致，此时即产生套利机会，可以买入价低一方，同时卖出价高一方，以赚取其间的差价。随着市场流动性的增强，这种机会发生的次数和规模会越来越小，并且机会往往转瞬即逝，因此往往需要借助高频交易的技术来加大搜寻的规模和把握交易时机。

· 结构化（Structural，此处翻译或许不当）。这是最恶的，也是公众眼中最能引人对高频交易诟病的策略。简单说就是利用技术手段，比如高速连接和下单，来探测其他较慢的市场参与者的交易意图并且抢在他们之前进行交易，将利润建立在他人的损失上。这种策略到底有多少人在用，报告中没有指明。我个人的看法是这种短视的策略或许能帮你赚一点快钱，但从任何角度看都是一种饮鸩止渴的行为。高频交易本身有远超于此的价值，实在不值得为此浪费精力。

· 趋势（Directional）。这个策略本身在中低频也存在。简而言之，就是预测一定时间内的价格走势，顺势而为。这种策略在高频的玩法不同之处在于，高频交易的主要数据源是比 tick 更低一级的 order book events，所以可以在委托单的粒度上进行分析和预测，来抓大单的动向。此外，报告中还提到一种操作手法，和中低频类似的，所谓「拉高出货」，即自己先下点单快速推高或拉低价格，人为制造一种趋势，来吸引其他人入场。关于这些，相信有中低频或日内经验的高手们更清楚该如何做，我就不多说了。

在这几种策略中，做市商策略是事实上最好的业务模式，具备可持续发展的性质。做市商在市场上充当流动性提供者，通俗地说，就是有任何人想买一个东西（比如股票、期货），你要保证能卖给他；有任何人想卖一个东西，你要保证从他那买。「保证」的意思就是如果市场上没有别人出头，做市商就必须出来——隐含的意思就是，做市商是所有人的对手盘。

这里需要仔细想一下，一般情况下，如果你想买一支股票，往往是因为你看好它会升值，而你的对手盘跟你交易，是因为他认为会贬值，你们有一个价值判断上的分歧。那么做市商为什么能豪气干云地出头做所有人的对手盘，是因为他喜欢跟别人唱反调吗？

当然不是。做市商的策略，本质上是认为市场价格在短期内具有波动性，涨上去的价格会落下来，反之亦然。所以他可以选择承担一定的风险，暂时从你手里把东西买过来，过一段时间价格变得有利时再卖掉。注意这里的风险是真实存在的，没有什么保证价格一定会向着做市商有利的方向变化。时间跨度越大，这种风险也越大。做市商承担了这种风险，买过来的东西需要持有一定时间作为库存，来赚取因为波动性而产生的一点点价差（通常是一分、两分）。也有更稳妥一些的做法，是通过其他高相关性的产品做对冲，比如买进一只股票的同时卖出它的期货，这个模型更复杂一些，对算法和性能的要求也更高。这种生意的本质决定了必须要能大量买卖，才能积少成多，形成效益。

有风险就意味着有可能赔钱，所以就产生了两种不同的做市商。

第一种是胆大的土豪。由于有钱，所以买人，买设备，全都要最好的，不信赚不到钱。这种人我们称为 noncontractual market maker，他来做市全凭自己兴趣。

第二种是胆小的，觉得自己没把握一直赚钱，可能就不敢做了。这时有一个角色就不高兴了——它的名字叫交易所。交易所的存在，就是提供交易平台，然后通过对每笔交易收手续费来赚钱。如果没有人交易，显然它赚不到钱。为什么没人交易呢？因为有需求的人可能找不到对手盘，大家对价格的趋势判断是一致的，都在观望。这个情况对交易所很不利，所以它希望引入做市商。做市商一来，就能把门面撑起来（对，在中国，我们有时管这叫「托」。不同的是，做市商的确承担了风险，也参与了真金白银的交易，给交易者们营造了一个更友好的交易环境，所以是受到大家认可的）。大家一看场子里有很多人在交易，就愿意也掺一脚了。交易的人多了，交易所就很开心。所以它会付钱给做市商，可能还减免手续费什么的给点小福利。这样一来，这种做市商即使生意做得不好赔点钱，可算上交易所的报酬，也还是能盈利。这样的人，我们叫做 contractual market maker。就是说，他会和交易所签订一个合同，承诺提供多少流动性；交易所也相应地给一些报酬和福利。

请注意，这种业务里做市商不是很需要预测市场走势的能力，只要能做到不赔钱就可以赚进交易所的酬劳。这个时候关键点来了，就是如何做到不赔钱？一个是按照上面说过的，做好对冲；另一个就是发现形势不利的时候要能及时撤单——这个是最考验低延迟的地方，速度慢就会发生来不及撤单而遭受损失的情况。

所以，做市这种行为的特点和市场上的需求，决定了 HFT 是最适合做这件事的。这也是为什么我们经常说 HFT 给市场提供流动性。

另外一种套利策略则是指，找到两种强相关性的证券，通过消除两者间不合理的价差来盈利。一个极端的例子是，ETF（Exchange Traded Funds）和组成 ETF 的那些股票。如果你知道 ETF 的计算方式，就可以用同样的方式通过那些股票的价格来计算一个 ETF 的期望价格。有的时候，由于种种原因，你发现这个价格和你在市场上看到的 ETF 价格不一样，你就知道显然是市场发生了一些混乱，早晚这个价格会变回来。这时你就可以买入（卖出）ETF，卖出（买入）那些股票，坐等价格回归，可以稳赚不赔。

这个策略听起来很美，可实际上竞争非常激烈，因为任何人都可以做这件事。参与的人多了，市场就会少犯错误，同时每个人的利润空间也变小了。当你的套利收入不足以支撑 HFT 的研发维护成本的时候，离关门也就不远了。

所以总结起来，做市是比较主流的 HFT 业务。而正是由于做市商这种和所有人做对收盘的业务模式，使得大部分交易都是通过做市商的参与来完成的，也就不难理解为什么 70%的交易都是由 HFT（做市商）来完成的了。

从以上两种业务可以很清楚地看出，没有任何作弊空间。简单地说，HFT 的竞争对手一定是另一个 HFT。

那么 HFT 有那么多速度优势，跟交易所搅基（co-location），系统延迟搞到微秒级，他一定比其他人更先看到市场数据，为什么不能利用这个作弊？

回答这个问题，一定要明确的是：所有交易都是在交易所内部完成的。没有人能在别人的交易指令传入交易所之前就探测到。从理论上就根本没有任何作弊的可能（别拿交易所当傻瓜）。HFT 的速度优势是指，当交易所完成一笔交易，在通知所有交易者的时候，HFT 因为在通信线路的上游，所以会比别人先看到这条交易确认信息。这个时候他可能会根据自己对这条信息的理解以及业务需求，增加或者撤掉自己的一些单子，但这些都是完全正常的交易操作，不存在任何恶意。并且由于这条信息是发送给所有人的，任何人都会对此作出解读和反应。但只有那些在同一个时间粒度上工作的交易者之间才可能存在竞争（之后再解释这个问题）。而对于最初这条交易的发起者来说，由于交易已经完成，所以不存在任何被攻击的可能。

上面说到，HFT 的优势，在于他可以第一时间对交易所放出的交易确认信息作出反应。但是这个信息如果没有对手盘就毫无价值。而一个接受信息慢，且反应时间在毫秒级以上的机构用户，怎么可能参与进来做 HFT 的对手盘呢？这句话可能还是不太容易理解，我举一个比较夸张的例子：如果你的操作频率以十年为最小单位，买进一支股票以后十年不做任何操作，很显然没有任何人在这十年内可以找你做对手盘，这种情况下所有其他交易者对你来说都是 HFT，你却不会担心他们对你有什么影响。例子虽然夸张，但 HFT 和机构用户之间的差距其实就是这么大——他们生活在不同的世界里。他们的业务本来就不冲突，且根本就不是一个层面上的东西。比较 HFT 和机构用户，就好像比较百米速跑和马拉松运动员的速度一样，毫无意义。

对于机构用户来说，需要理解电子交易市场的规则。有人用那种，看到屏幕上有一个价格，点了鼠标，结果发现成交价不一样，来说明是背后有人捣鬼；这属于脑袋进水的逻辑。特别需要注意的是市价单（Market Order）本来就是不保证成交价的，指令发给交易所，交易所根据当时的情况，算出是什么价就给你什么价，这没什么好委屈的。如果想要确保价格，请使用限价单（Limit Order），保证成交价格，但是不保证时间。这两种单是所有人都可以使用的，没有任何不公平可言。

最后说说 HFT 可能存在的问题。Flash Crash 是真实发生过的，也是最大的隐患。当一个市场上 70%的交易都是 HFT 完成的时候，我们必须要能对 HFT 的系统有信心。这就需要 HFT 的开发流程标准化，接受开发过程的评审，有严格的测试体系。几个技术宅关在小黑屋里鼓捣出来的东西，没人敢拍胸脯保证不会死机。关于这一点，目前看的确是比较差的，需要尽快规范起来。这才是公众需要关注的重点。

1.2 高频交易的第一推动力 —— 追逐流动性的交易所们

高频交易是现在金融交易世界中一个热门的名词，越来越多的交易通过自动化的超高速计算机系统来完成。这件听起来颇有些玄幻的事情，实际上背后有着非常真实而具体的经济学意义。我所了解的高频交易系统，并不像一些「江湖传说」中所描述的，是科技怪才利用高科技手段对无知的人们进行金融攻击而获利。相反，这种系统往往是为了服务于某种具体的、有正面意义的经济目标而设计的。为了说明这一点，我要在这篇文章中讨论以下两个问题：

· 高频做市策略的动机和驱动力

· 高频做市商所做交易的行为本质

上一章中提到，高频交易主流的策略是做市（market making）提供流动性。根据美国证券交易委员会（SEC）的报告，高频交易大致有 5 个特性：

· 使用超高速的复杂计算机系统下单

· 使用 co-location 和直连交易所的数据通道

· 平均每次持仓时间极短

· 大量发送和取消委托订单

· 收盘时基本保持平仓（不持仓过夜）

可以看到，这里并没有一条提到这种交易是单纯以低买高卖为目的。事实上，对很多以做市为目的的高频交易商来说，赚取买卖价差虽然是件美好的事，但并不是绝对需要的盈利手段。

那么，利润到底是如何产生的呢？答案是来自交易所。

交易所对做市商提供的报酬可以包括两个部分。第一是每笔交易的返佣（rebate）。返佣的数值一般很小（远远小于 tick size），但如果交易笔数巨大，积少成多，便可以成为不菲的收入。通过赚取返佣，做市商只需要保证每笔交易不赔即可，并非一定要追求低买高卖，反而是要保证自己的委托单能尽可能多地被执行，以争取更大的流量。为了做到这一点，下单和改单的速度是个关键，这也是为什么这一行如今被以速度见长的高频交易商把持的原因。

第二是固定的佣金。这是比返佣更吸引人的部分。这种情况下，做市商只需保证每月或每天参与一定规模的交易，就可以再额外从交易所处获取一笔不小的收入。这种模式的好处在于，做市商不仅不用追求买卖价差，甚至连流量也不需争抢，只要完成限定的额度即可，难度大大降低。

分析以上两种模式，有些朋友也许会想到一个聪明的点子：既然我只需参与交易就可得到收入，那我可不可以自己下单自己填，左手卖右手买，无本万利呢？很遗憾的是，自己和自己交易是绝对的违规操作，不可以这样做。因此，做市商面临的问题，是如何在不赔钱的情况下尽量争取更多的交易机会。同时，这种交易模式和通常大家口口相传的那种交易相比，有两点显著的不同：

a. 并非以「低买高卖」为主要盈利手段，因此收益率、夏普率等通常交易策略的评判标准对此并不适用。

b. 一般的交易策略以盈利为目的，并不追求下单数量和次数。做市策略，交易本身即是目的，交易的量越多，收益越多。

当然，赔钱的买卖没有人会做，即便不以买卖价差绝对值为核心目标，价差本身仍然是非常重要的要素，至少不能高买低卖。从这一点上说，对价格的变化及波动的判断和预测一样要做，做出的也是货真价实的交易策略。

关于做市商如何各显神通，这里暂且不表。说回这种模式的根源，为什么交易所愿意用这样的方式雇佣做市商呢？有两个原因。

第一，交易本身和其他人类社会的行为一样，受到表面信息的影响很大。在商业社会，任何企业都需要做广告来吸引潜在客户。而对交易来说，交易量本身即是重要信息，交易量越大，越说明对应的商品容易买卖（所谓流动性好），人们就更愿意进行交易。因此，即使是单一的交易所，也有动机通过雇佣做市商来增加市场上的交易量，从而吸引更多客户。

第二，更现实的问题是，欧美市场发展到今天，呈现出一种完全碎片化的趋势。不论是欧洲还是美国，其作为一个整体，都可用地域宽广来形容，其境内的交易所分散在各个地区，并且始终处于一种动态博弈和平衡之中。

在欧洲，以股票交易为例，主流的交易所（集团）有这几家：

o London Stock Exchange Group （旗下包括 London Stock Exchange，Borsa Italiana，Turquoise）

o Euronext （被洲际交易所 ICE 并购）

o NASDAQ OMX

o BATS Chi-X Europe

o Deutsche Borse Group

这些交易所旗下的平台（Trading Venue）遍布欧洲，在提供相似的交易服务的同时，又分别受所在国家的政策影响。

在美国，三大主流股票交易所有：

o The New York Stock Exchange

o NASDAQ Stock Market

o BATS Exchange

虽然美国本身是一个国家，但是境内仍然出现多家交易所并存的现状，同一支公司的股票可能在多家交易所同时挂牌交易。这意味着在同一时间，不同交易所内的股票价格需要同步。美国人使用一种叫 Tape （见 National market system plan | https://en.wikipedia.org/wiki/National_market_system_plan ）的东西来发布同步后的价格，但这种方案本身存在若干技术隐患。之前就出现过这类的恶劣事件：高频交易者依靠技术手段和高速连接，利用不同交易所同 Tape 上价格发布的时间差来探测其他低速交易者的交易意图，抢在他们之前进行交易来盈利。

这些交易所彼此之间往往处于竞争模式。其中最为基本的模式是交易所间的并购。关于这方面的新闻和资料，随手一搜就有很多：

· 全球交易所掀起并购潮 | http://finance.sina.com.cn/focus/jxshb/

· 强者恒强，大者恒大 | http://www.shfe.com.cn/jrysp/38/16.pdf

· 洲际交易所以 82 亿美元并购纽约-泛欧交易所集团 | http://cn.reuters.com/article/2012/12/21/ice-82-nyse-euronext-idCNCNE8BK01120121221

· 全球交易所跨国并购趋势及我国的对策思考 | http://www.sse.com.cn/researchpublications/research/c/research20060901b.pdf

并购可以使两家交易所进行资源整合，从而减少竞争成本。但这种大手笔毕竟消耗巨大，不能随意为之。而在日常业务中的短兵相接则更为常见。因为交易所的主要收入来源是手续费，而市场总的交易量有限，在此间交易所交易的量多了，彼间交易所的利润就会受损。因此，为了争夺交易量，交易所就需要各尽所能，提高自身的竞争力。首先可以进行的自身改造是交易机制和技术。比如说设置不同的 tick size（最小报价单位，比如若设 tick size 为一分，那么报价只能取 100.1 或 100.2，而不能取到 100.15 这样的值），提供更丰富的委托单类型（除标准的限价单、市价单外，往往还需隐藏单 Hidden/Iceberg Order，即时限价单 Immediate Or Cancel Order），设置开盘时竞价集合的规则和时长，等等。这些都会对交易过程造成影响，改变交易者们的行为模式，从而影响交易所对交易者们的吸引力。

另一方面，为了改善流动性质量，还必须引入高水平的做市商。做市商的作用有多重要？《Market Microstructure in Practice》一书中给出过一个具体的例子（见书中 2.1.3）。Turquoise 是欧洲一家另类交易平台（MTF，基本上你可以认为就是一种交易所）。在它的运作早期，同为它注资的金融机构签订了做市协议，由这几家机构来进行做市提供流动性。但是遗憾的是这些机构并非专业做市商，仅仅为履行协议而刻板行事，导致 Turquoise 的日内成交量分布几乎保持在一条水平线上。这意味着在该交易所内发生的交易主要是由做市商人为填筑，缺乏外界参与者。因此，当协议期满这些做市机构离场后，Turquoise 的交易量在一周之内腰斩，并且至今也未恢复。

以上两个方面是交易所自身可以决定的因素，但问题还远不只这么简单。在交易所搞世界大战的同时，作为交易的发动主体，各家银行、基金也需要自主评估不同交易所的情况，从而优化每一笔具体交易的去向。有时交易所 A 比 B 提供更好的最优价格，或是 B 比 C 提供更多的可用流量，交易员当然希望能够动态地寻找最佳交易所来完成交易。由此首先催生出一种叫做智能委托单路由（Smart Order Routing，SOR）的技术，利用计算机自动搜寻当前情况下的最佳交易所。

随着各家银行、基金大量部署 SOR，流量在不同交易所间的流动变得相当容易，任何风吹草动都会对交易所本身迅速造成影响。这使得交易所更加需要投入资源来优化自身的性能，不惜重金聘请做市商入场，甚至有时更会驱动高频做市商利用技术优势，通过一系列的对冲、套利等操作，直接竞争其他交易平台上的流量。这正是高频交易今天在欧美风生水起的原因。

理解了这背后的深层次原因，你就会发现，所谓的「低买高卖」「扰乱市场」「闪电委托单」等噱头绝非这一业务的真正逻辑。在技术高速发展的时代，因为新技术的不完善而出现一些漏洞或缺陷是在所难免的，但若因此以为这些问题即是死结，或是想凭借这些来盈利而进入市场，则就因小失大了。

分析至此，我们可以来回答本文开头所提出的两个问题：

·  高频做市策略的动机和驱动力：在市场碎片化的大背景下，各家交易所为提高自身竞争力从而吸引更多交易量，必须聘请高水平做市商入驻，帮助改进流动性质量。

·  高频做市商所做交易的行为本质：这种交易只求参与其中，作为买卖双方的中转即可，并不需要追求买卖价差的绝对数值。极端情况下，参与程度（Participation Rate）本身即为所出售的产品，而具体的某笔交易并不必以盈利为目的。

最后，相信大家更加关心的，是这种业务模式在国内的发展前景如何。从现状来看，我国的金融市场仍然处于从重度管控逐渐向开放发展的阶段，金融相关的产品和技术也还远未跟上潮流（我们的股票交易所只有沪深两处且彼此无交集，期权更是迟迟未开）。因此短期内，应该并不会出现高频交易技术的大规模应用。但从长远看，以我国体量来说，技术发展是迟早的事，相信这一天不会太远。

1.3 高频交易的理论基石 —— 市场微观结构

经典的经济学理论讲的是供需关系决定价格，一般会画两条曲线分别表示供需双方，曲线交点处就是市场价格。这种理论相对来说是很宏观的，因为它只能告诉你根据计算市场价格应该是多少，但不会告诉你这个价格在真实的市场上是怎么形成的。在真实世界，显然不会有人在做买卖之前会先拿出一张白纸往上画供需曲线然后求价格，实际上大家是通过一系列的协商和交互才能最终确定价格。市场微结构就是对交易市场的规则和交易过程的研究，目的是从微观层面上理解价格形成的过程，以及市场规则和结构对交易的影响。

对市场微结构的研究本身由来已久，但第一次把这种工作冠以市场微结构这个名字的，应该是 1976 年 Mark Garman 的一篇论文 Market microstructure | http://www.sciencedirect.com/science/article/pii/0304405X76900064 ,论文名字就叫市场微结构，堪称本领域的开山之作。这篇文章分析了两种交易模式（Dealer 和 Auction），给微结构研究提供了一个很好的示范。

但真正将微结构研究系统地梳理总结，形成一门学科的集大成者，则是 1995 年出版的康奈尔大学教授 Maureen O'Hara 的经典著作《Market Microstructure Theory》。在那个年代，交易电子化才刚刚起步，今天的高频交易在当时还远未萌芽，因此当时对微结构的研究显然和高频交易扯不上什么关系。事实上，这本书也是理论意义远大于实践，它提供了一套理论分析框架，用博弈论、贝叶斯学习等技术对微结构建模和分析。

那个时代的学者们更多的是想要建立起交易市场的物理模型，希望像分析物理问题一样来分析交易市场。在这本书里提到的模型大都是理论上的创造，比如会把市场中的参与者分成几种类型，例如做市商、内幕交易者（informed trader）、无内幕消息者（uninformed trader）等等。有的模型很简单地假定市场价格是做市商通过对自己的库存管理来决定的，有的则是假定价格是通过内幕交易者和其他人之间的博弈来决定，其他人通过贝叶斯方法来不断推测市场上的内幕消息。这些假设的不同会导致模型中的均衡点随之变化。研究者一般是希望通过这些分析来揭示市场中的内在规律，比如 Spread 是如何形成的，成交量对价格有没有影响，等等。

特别值得一提的是，这本书由浅入深一步一步地拓展研究的深度。通读本书，可以很好地帮助你理解学者们是如何构建分析理论的。比如说最初的模型可能只是假设内幕交易者根据内幕消息来下单，整个市场按照每人轮番下单的顺序方式进行交易。在此基础上，可以增加一点变化，使做市商可以通过分析市场上的订单流来推测有多少内幕消息。更进一步，内幕交易者可以变得更聪明，通过模仿无消息者的交易模式来隐藏自己的交易。之后，可以让无消息者也采取策略，让他们对做市商和内幕交易者的行为作出推断和应变。如此，每一步的改进都会让模型更加复杂，也更加逼近真实世界。通过对不断完善的模型的分析，市场的很多内在特质就会不断被揭示出来。

但可以看出，这门学科的重点是帮助理解市场结构和运作原理，并非传播赚钱秘笈。所以如果你想通过学习研究这些内容来寻找或者制定交易策略，很可能要失望。甚至在早期，这些理论模型也不需要考虑实际数据，其中很多更是直接假定价格过程是一个鞅，走的是 Q 宗的路子（具体可见 「 P Quant 和 Q Quant 到底哪个是未来？| http://www.zhihu.com/question/24820388/answer/29150204 」）。

沿着这条道路，2006 年出版了纽约大学教授 Joel Hasbrouck 的一本著作《Empirical Market Microstructure : The Institutions, Economics, And Econometrics of Securities Trading》，提供了该领域内一些较新的进展。这本书出版于《Market Microstructure Theory》的十年之后，思路上一脉相承，两本对照着看可以看到很多熟悉的概念，比如序贯交易模型（Sequential Trade）、库存模型等等。在思想上，仍然是用理论模型教你去理解市场结构。

也许一些实战大牛会对这些研究表示不屑，认为这种纸上谈兵的理论模型根本不能刻画真实的市场和人性。但我认为，要想真正对市场结构有深入理解，这是唯一可行的科学道路。真实世界中的变化有千千万，如果不能有效地化繁为简，提炼出抽象的数理模型，我们根本无从探寻市场本质。的确有些传说中的交易员通过经验或是直觉把握到了一些致胜秘笈，但很难让人相信这些技能在脱离了当时的市场环境或是操作人本身的特点之后还能够轻易地复刻。微结构的很多研究或许看起来简陋，但是这些简陋的模型却给更深层次的研究提供了坚实的基础，是无法忽略的。

到此为止，微结构的研究都和今天我们所说的高频交易没有太直接的联系。你在这些书里不会看到所谓的低延迟和 Co-location 等新名词。但学者们显然更清楚这些问题，高频交易作为一个新兴的热门话题也得到学界的关注。2014 年，Maureen O'Hara 就给出一篇论文 High Frequency Market Microstructure | http://www2.warwick.ac.uk/fac/soc/wbs/subjects/finance/fof2014/programme/maureen_ohara.pdf  ，介绍在高频交易时代微结构的研究方向，比如高频时代交易规则应该怎么设计，如何监管等问题。

这里值得一提的是这样一篇论文：Zhou Yueshen 的 Queuing Uncertainty | http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2336122 就把延迟这个概念引入了微结构的理论模型中，对有延迟情况下的做市商策略做了理论分析。这篇论文赢得了 11th International Paris Finance Meeting 的 Best Paper Award，作者本人也凭这篇论文拿到 INSEAD 的教职（顺带一提，此人师从 Albert Menkveld，近两年在高频交易方向也有好几篇很好的论文）。

最后要提的是一本最为切合本题的著作，即 2013 年出版的《Market Microstructure in Practice》。这本书不同于之前几本的地方在于，通过大量的数据分析从实践角度解释了微结构在交易方面的价值。比如介绍了因为欧美市场碎片化（fragmentation）而导致的一系列包括高频交易在内的新兴技术（Smart Order Routing，HFT，Dark Pool），各家交易所是如何通过改进交易机制（缩减 tick size，引进做市商等策略）来竞争客户，交易市场上的一些特征数据（order size，spread）的变化趋势，等等。

至于这本书的价值和深度如何，我觉得可以用这句我最喜欢的金句来说明：

HFT (High Frequency Trading) is the price to pay for fragmentation; it is not possible to put trading venues in competition without agents building high-frequency liquidity bridges across them.

这可算是对 HFT 的存在和发展最透彻的解读了。

另外，虽然这本书的主题是微结构，但实际上会让你对交易技术的发展历史和趋势有一个宏观的了解。看完这本书，你会对高频交易者到底在做什么有更深入的了解。（特别一提，这本书实际上对 HFT 持批判态度，并且给出了很多非常有含金量的分析，这也是本书非常值得一读的原因之一。）

第二章 纳秒，微波，FPGA：高频交易黑科技

2.1 高频交易软硬件是怎么架构的

前文提到，高频交易对计算机执行系统的要求非常苛刻，对执行速度、响应延迟的追求已经近似疯狂。那么这种极度精密的高性能系统一般是怎样架构设计的呢？在开始讲解之前，我们需要先澄清两个容易引起误解的概念：

第一，延迟和流量是不同的概念。低延迟不等于高数据量，事实上大部分时间交易数据流量并不大，一个 market 一天最多也就几个 GB。但 HFT 系统需要在流量高峰时也能快速响应，所以更看重延迟。这也是 HFT 系统和互联网系统最大的区别所在：HFT 系统的精髓在于把单机的软硬件系统的性能发挥到极致，而不是像互联网那样强调高负载和延展性，动辄用几千台机器搭集群的做法在这里是不适用的。用互联网系统的性能指标来认知 HFT 系统也是没有意义的，像淘宝这样的应用需要保证交易的正确和一致性，包括从终端用户的浏览器到淘宝后台，再到银行接口之间一系列复杂的事务性数据操作，这个场景和 HFT 直接对接交易所走高速线路收发交易指令有天壤之别，不能用同样的思维去理解。

第二，一个 HFT 业务包括从主机到交易所的整条通信线路，在这条线路上有很多段不同的延迟，是需要分开讨论的。如果是做跨交易所的交易，首先需要考虑的是两个交易所之间的网络延迟。当数据通过网络到达主机的时候，有一个最基本的 tick-to-trade 延迟，是指主机接收到数据到作出响应所需的时间。但这个东西的测量很需要技术含量，根据不同的测量方式，它可能包括或不包括网卡及网络栈的处理时间。所以拿到一个 HFT 系统的延迟数据时，首先要搞清楚它指的是什么，然后再来讨论。

有人提到从一个直连计算节点的 router 的角度来观测。这是一个理论上看起来可行但实际仍然很模糊的概念，因为一般 router 本身是不做存储和处理的。一个 router 会收发大量不同的数据，要理解一个接收到的包是对之前发出去的某个包的「回应」，是需要相当的处理逻辑的，一般很难这样测。比较合理的测试仍然是在主机端做记录，测试从收到市场数据（tick）的 TCP/UDP 包到发送交易指令（trade）包的时差。目前（2014 年）的情况是，这个延迟如果平均控制在个位数字微秒级就是顶级了。因为网络传输才是延迟的大头，如果网络上的平均延迟是 1 毫秒（1000 微秒）以上，你的单机延迟是 2 微秒还是 20 微秒其实是没有区别的。一般单机比网络低一个数量级就可以了，比如网络上需要 100 微秒（很现实的数字），单机控制在 10 微秒足以保证速度上没有劣势。至于公众报道，有时是为博人眼球，难免有夸大的成分，不必太当真。

接下来说说，身为一名高频交易工程师，我对高频交易系统架构各个层面的理解。

首先，网络架设上光纤肯定是最差的方案。国外几个主要的交易所（同一洲内）之间基本上都有微波（microwave/milliwave）线路，比光纤的延迟要低很多，延迟敏感的应用一定要选择这种线路。这个差距首先受制于光在光纤中的传播速度只有在空气中的 2/3 左右。另外，在大城市建筑密集地区（也正是一般交易所的所在地），光纤的复杂布线会进一步增大延迟，差距可能增至 2 到 3 倍。

但微波技术有两个主要的缺点：第一是微波在空气里传播受天气影响很大，刮风下雨都会导致通信受损，有时直接故障，所以需要备用的光纤线路，以及监控天气…… 这方面进一步的发展可能是激光技术；第二是带宽太小，如果是跨交易所的业务，不可能通过微波来转移大流量的市场数据，只能用来收发下单指令，这方面有一些潜在发展空间，比如可以做一点有损压缩，传一个缩减版的市场数据，也能起到加快信息传递作用。这块网络服务本身就是一个独立的业务了，一般所说的 colocation 也是由服务商负责的，HFT 主要需要的是选择适合自己的服务商。

网络线路确定以后，数据就送到了 HFT 主机。这时候需要决定网卡的方案。专用的网卡除了自身硬件的设计外，一定需要的是切换掉系统自带的 kernel space TCP/IP stack，避免昂贵的 context switching。网络栈上的 I/O 延迟，收包、发包加起来做到 2～3 微秒是可以的。这个层面上 FPGA 是很有应用价值的，因为可以做一些额外的逻辑处理，进一步解放 CPU。

对于 FPGA，我的观点是，业务逻辑烧到硬件里的开发，调试成本和周期都是很难承受的，不看好作为长期发展的路线，这个东西其实和套利、数学模型一样，是吸引外行眼球的东西。但做专用的网络 I/O 设备却是比较有优势的。（这里可以另举一个例子以供思考 FPGA 的特点和适用性：目前很多主流交易所的技术架构上，为了适应高速交易的需要，市场数据是采取 UDP 双通道的方式发放的，即同一份数据发到两个 UDP broadcast channel 上，客户端需要自行收发排序。大家可以思考一下这种数据要如何编程才能高效稳定地处理，开发过程需要如何调试测试，如果数据协议发生变化要如何处理？FPGA 在这种场景中又该如何应用？这些当然是开放问题，但是应该有助于理解真实的需求。）

网络部分的问题解决以后，最后就是核心的业务逻辑的处理。这部分也许会用到一些数学建模，但是没有什么神话，并非什么菲尔兹奖得主才能搞的东西（那些人的用武之地更多是去投行那边做衍生品，那才是真正需要高等数学的东西）。很多时候核心的还是延迟，这个在计算机内部分两个部分：一是 Core 的使用率，比如 IRQ Balance，cpuisol，Affinity 等等，主要是要尽可能地独占 Core；另一个是 Cache Invalidation，从 L1/L2/L3 cache 到 TLB，Page Fault，Memory Locality 之类的，都要仔细考虑——这个更多考验的是对体系结构的理解和程序设计的功力，跟语言的关系不大。

具体选择哪种语言，首先是取决于公司的技术积累和市场上的技术人员供给。函数式语言（Erlang/OCaml 等）的好处是语言表达能力强、开发速度快、逻辑不容易出错，但相对的对机器底层的控制差一些，有时候他们的编译器或运行时干了什么不太容易搞清楚，所以在性能上的调优会比在 C++之类投入更多一点。这里面有一个取舍问题，要根据公司情况来具体分析。

业务逻辑部分其实相当简单。做这种高速交易肯定不会有什么凸优化、解微分方程之类复杂的运算，核心的部分一般就是加加减减，比比大小什么的。业务逻辑本身的处理完全可以做到纳秒级；如果看到有人宣称他们的延迟是纳秒级，一般是指这种。

操作系统同样是一个不需要神话的东西，普通的 Linux 已经有足够的空间用来做性能优化。简单地说，一个企业级的 Linux（如 Redhat）加上通用的架构（Intel 主流处理器）足以做到市面上已知的最低延迟，不必幻想有什么奇妙的软硬件可以做出超出想象的事情。

另外需要提醒大家注意的是，其实做一个低延迟系统，首先需要考虑的不一定是延迟能降到多低，而是怎么测量系统的延迟？对一个 HFT 系统来说，所谓的 Tick-To-Trade 延迟，一定要有既精确又不影响系统性能的测试方法才有意义。可以想象一下，最理想的测试场景一定是你的系统真正运行在直连交易所，有真实的市场数据传入的情况下，并且测试的代码就是真正的交易算法时，得到的数据才有意义。如何得到这个苛刻的测试环境，以及如何测量系统的各个部分的延迟，是一个非常有技术含量的工程，其难度往往并不亚于系统设计本身。

最后说点题外话。技术发展是非常快的，在这个时代没有什么秘密能永久封存，HFT/low latency trading 也不例外。现在欧美在这方面的市场已经逐渐趋近饱和，毕竟软硬件的性能都是有上限的。当大家都能达到微秒甚至纳秒级时，仅仅靠拼速度就没那么大优势了。目前虽然拼速度仍然有盈利空间，但是长远来看，一定需要在保证速度的基础上增加算法智能性和系统稳定性。从这个角度上来讲，类似把全部算法都烧进 FPGA 的做法是很难维持的，因为开发周期太长，成本太高。接下来真正有挑战的应该是高速系统和大数据的结合，这应该是一个很有想象力的空间。

2.2 C++ 为核心语言的高频交易系统是如何做到低延迟的

问题中限定语言是 C++，可讨论的范围就没那么广了。 首先我们要明确系统的需求。所谓交易系统，从一个应用程序的角度来说，有以下几个特点：

· 一定是一个网络相关的应用。假如机器没联网，肯定什么交易也干不了，所以系统需要通过 TCP/IP 连接来收发数据。数据要分两种，一种是从交易所发过来的市场数据，流量很大；另一种是系统向交易所发出的交易指令，相比前者流量很小，这两种数据需要在不同的 TCP/IP 连接里传输。

· 因为是自动化交易系统，人工干预的部分肯定比较小，所以图形界面不是重点。而为了性能考虑，图形界面需要和后台分开部署在不同的机器上，通过网络交互，以免任何图形界面上的问题导致后台系统故障或者被抢占资源。这样又要在后台增加新的 TCP/IP 连接。

· 高频交易系统对延迟异常敏感，目前（2014 年）市面上的主流系统（可以直接买到的大众系统）延迟至少在 100 微秒级别，顶尖的系统（HFT 专有）可以达到 10 微秒以下。有人说低延迟不难 C++随便写写，延迟轻松做到几百微秒，但这是肯定不行的，这样的性能对于高频交易来说会是一场灾难。

· 系统只需要专注于处理自己收到的数据，不需要和其他机器合作，不需要担心流量过载。

有了以上几点基本的认识，我们可以看看用 C++作为开发语言有哪些需要注意的地方。

首先，前两点需求就决定了，这种系统一定是一个多线程程序。虽然对于图形界面来说，后台系统相当于一个服务端，但这部分的性能不是重点，用常用的模式就能解决（也许这里你可以介绍一下常用的 C++ Client/Server 库，或者内嵌 Web Server 之类的；应该有丰富的选择，这里不展开讨论）。而重要的面向交易所那端，系统其实是一个客户端程序，只需要维护好固定数量的连接就可以了。为延迟考虑，一定要选择异步 I/O（阻塞的同步 I/O 会消耗时间在上下文切换）。这里有两点需要注意：

· 是否可以在单线程内完成所有处理？考虑到市场数据的流量远远高于发出的交易指令，在单线程内处理显然是不行的，否则可能收了一大堆数据还没开始处理，错过了发指令的最佳时机。

· 有人认为要压低平时的资源使用率，这是完全错误的设计思路。问题同样出在上下文切换上，一旦系统进入 IDLE 状态，再重新切换回处理模式是要付出时间代价的。正确的做法是在线程同步代码中保持对共享变量/内存区的疯狂轮询，一旦有消息就立刻处理，之后继续轮询，这样是最快的处理方式。（顺便提一下，现在的 CPU 一般会带有环保功能，使用率低了会导致 CPU 进入低功耗模式，同样对性能有严重影响。真正的低延迟系统一定是永远发烫的！）

现在我们知道核心的模块是一个多线程的、处理多个 TCP/IP 连接的模块，接下来就可以针对 C++进行讨论。因为需要对接收到的每个 TCP 或 UDP 包进行处理，所以首先要考虑的是如何把包从接收线程传递给处理线程。我们知道 C++是面向对象的语言，一般情况下最直观的思路是创建一个对象，然后发给处理线程，这样从逻辑上看是非常清晰的。但在追求低延迟的系统里不能这样做，因为对象是分配在堆上的，而堆的内存结构对我们来说是完全不透明的，没办法控制一个对象会具体分到内存的什么位置上。这直接导致的问题是本来连续收到的网络包，在内存里的分布是分散的，当处理线程需要读取数据时就会发生大量的 Cache Miss，产生不可控的延迟。所以对 C++开发者来说，第一条需要谨记的应该是，不要随便使用堆（关键字 new）。核心的数据要保证分配在连续内存里。

另一个问题在于，市场数据和交易指令都是结构化的，包含了股票名称、价格、时间等一系列信息。如果使用 C++ class 来对数据进行建模和封装，同样会产生不可知的内存结构。为了严格控制内存结构，应该使用 struct 来封装。一方面在对接收到的数据解析时可以直接定义名称，一方面在分配新对象（比如交易指令）时可以保证所有数据都分配在连续的内存区域。

以上两点是关于延迟方面最重要的注意事项（如果能真正做好这两点，大概剩下的唯一问题是给系统取个好名字吧。There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton）。除此之外，需要考虑的是业务逻辑的编写。高频交易系统里注定了业务逻辑不会太复杂，但重要的是要保证正确性和避免指针错误。正确性应该可以借助于 C++的特性，比如强类型、模板等以加强验证，但这方面我不熟悉，就不多说了。高频系统往往运行时要处理大量订单，所以一定要保证系统运行时不能崩溃，一旦 coredump 后果很严重。这个问题也许可以多做编译期静态分析来加强，或者需要在系统外增加安全机制，这里不展开讨论了。

以下是几点引申思考：

· 如何存储系统日志？

· 如何对系统进行实时监控？

· 如果系统 coredump，事后如何分析并找出问题所在？

· 如何设计保证系统可用性，使得出现 coredump 之类的情况时可以及时切换到备用系统？

这些问题相信在 C++框架内都有合适的解决方案，我对此了解不多，所以只列在这里供大家讨论。

注：关于 C++在性能方面的一些最新发展，包括内存结构的一些分析，可以参看 Modern C++: What You Need to Know | http://channel9.msdn.com/Events/Build/2014/2-661 。

2.3 高频交易系统的开发语言选择之 C++ VS Java

据我有限的了解，国外的很多课程还是在教怎么用 C++ 实现定价计算。但这并不代表现状就是正确的选择。我认为这属于历史遗留问题，而金融业吸收 IT 新技术需要时间。事实上写过 C++ 就会发现，这种语言对学金融工程的人来说是多么不友好，难学难用。很多业界的公司会开发自己的脚本语言供 Quant 使用，再由专门的程序把脚本翻译成快速实现。

所以，对于学金融工程 Master 来说，的确需要学好编程，但具体什么语言不是很重要。如果你觉得去上培训班能更有效率地学习，那么可以一试；如果是学 Java，只需要学 SE 即可。至于认证，它所代表的东西，也许对一些商业银行的后台事务性系统开发会有一些帮助，但是对 Quant 或高性能交易系统来说是完全无关的，我也没有听说过任何招聘此类工作的公司会要求这些认证。

而对于交易系统来说，C++ 也绝对不是唯一的选择。Java 程序即使不做优化，达到百微秒级的水平也是不难的。实际上经过 JIT 处理后，字节码是直接翻译到机器码的，并且由于是动态编译，越是复杂的算法，越能得到更好的优化，甚至可能得到比 C++ 更好的性能。

而 Java 中最被人诟病的性能杀手 GC 是实际上可以控制的。这里有两个原则：第一，精确控制 GC 的触发时间；第二，对 GC 调优减少耗时。关于第一点，JVM 有特定的指令用来触发 GC（见 JVM(TM) Tool Interface 1.2.1| http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html#ForceGarbageCollection ），可以自己控制 GC 时机；关于第二点，官方的 HotSpot 虚拟机自带很多 GC 参数可以调节就不说了，而针对交易特别开发的 Zing 更是针对实时应用做了专门优化。另外，为追求性能做到极致的话，最好的方法是不要 GC。比如自己做一个 Pool 来缓存对象，而不要每次都 new 一个新的。当然这些需要对 Java 的运行机制有深刻理解，但是相比复杂的 C++ 来说，Java 的开发难度绝对不在同一个数量级上。

事实上，真正对性能有高要求的话，大部分功夫都要花在语言之外。Memory Hierarchy 怎么控制，进程间通信怎么处理，网络传输怎么做，这些对性能的影响都要远远超过语言本身。举个简单的例子，大家应该都知道文件读写操作是很耗时的，那么你也许会举例来吐槽 Java 的 nio，再讲讲 C++ 怎么做异步。但实际上呢？这些都弱爆了，根本就没抓到点上。用 Memory-mapped file，直接读写内存，不需要经过 syscall，比什么 I/O API 都快，而你真正需要关心的问题其实是系统级的 Page faults。任何语言只要支持这种操作，用起来效果都一样（想看实例的话请看这里：Java-Chronicle | https://github.com/OpenHFT/Java-Chronicle/blob/master/docs/HowItWorks.md ）。

对这些有深入理解以后就会发现，如果你采用 C++ 作为主开发语言的话，后果就是承受所有 C++ 在开发上的不便，却只能得到仅仅在语言范围内的非常有限的性能提升（甚至还不一定有）；随着系统复杂度的增加，最终会倒在开发和维护瓶颈上。

另外值得一提的是，对于交易系统这种对稳定性极度敏感的应用，当你的 C++ 系统在运行时因为某种意想不到的原因（比如网络数据 corrupted，或者程序 bug）而 coredump 的时候，才真正让你欲哭无泪，很可能连排查问题的希望都没有。在这方面 Java 的相对成熟的异常处理机制是有先天优势的。

注：

这个链接：虚拟研讨会：在低延迟环境中使用 Java | http://www.infoq.com/cn/articles/low-latency-vp ，提供了更丰富的观点和讨论。其中的 Peter Lawrey 是 Java 的性能专家，为很多高频交易业者提供咨询服务，我也从他的文章中得到过很多启发。此人是 Stack Overflow 上 Java 话题下排名第三的贡献者，看他的博客 Vanilla #Java 绝对帮你对 Java 的理解正三观。对他的工作感兴趣的朋友可以看如下两个 Slides：

http://www.slideshare.net/PeterLawrey/introduction-to-chronicle-low-latency-persistence

http://www.slideee.com/slide/open-hft-libraries-in-java

另外一个值得看的博客是 Mechanical Sympathy | http://mechanical-sympathy.blogspot.co.uk/ ，也提供了很多 Java 性能方面的文章。

2.4 高频交易系统如何在多线程和端口通讯之间取舍

高频交易系统特别符合《人月神话》中推荐的外科手术团队的开发模式。开发这种高精密系统，人多了其实有负面作用，最好的办法是以一两个高水平程序员为主力设计和开发，再加几个杂兵跑堂就可以了。所以解决这个问题有一个四海通行的终极大法：让老板涨工资，高薪聘请一流的技术专家。当你有一个一流高手坐镇主攻的时候，解耦就从多人协作变成一项个人品味的问题了，只要根据主攻手的口味选择方案就好。

当然我明白人在江湖，身不由己。以上建议对于已经有很多历史遗留问题或者起了一半的项目来说显然是远水解不了近渴。所以下面尝试给点实际的建议。

首先，进程间通信（IPC）有很多种方法，端口通讯（Socket）绝对不是最快的那种。Named pipe 和共享内存都可以做得更好，事实上最快的办法是共享内存＋独占 CPU core；可以参考 Java-Chronicle | https://github.com/peter-lawrey/Java-Chronicle 的实现。这种方法做到几十纳秒的通信延迟是没问题的，见 fastest (low latency) method for Inter Process Communication between Java and C/C++ | http://stackoverflow.com/questions/2635272/fastest-low-latency-method-for-inter-process-communication-between-java-and-c。

关于端口通讯为什么慢，只要看这篇文章就可以理解：Know your TCP system call sequences | http://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/ ，见下图：

即便你用的是本地接口（localhost），一样要经过系统调用（System Call）切换进 Kernel Space，中间经过无数内存拷贝、协议检查之类浪费时间的事情。这些问题在共享内存方案下都不存在。所以一个简单的做法是重写你们的通信模块，采用这些更快的通信方法。

如果你的摊子实在太烂，以至于修改通信代码也是不能承受之重，那么还有一手叫做「替换系统调用」的秘籍。简而言之，就是用修改函数指针的方式把系统调用入口换成自己的程序，比如用共享内存来实现端口通讯的 API。这样的话，你可以在不改动现有程序的基础上改变通信方式，以提高通信速度。具体怎么做可以参考流行的开源实现 OpenOnload。虽然它主要是替换 TCP/IP 协议栈，但思路是一样的。

其实这个时候是最能体现 Java 等基于虚拟机字节码的语言的优势的。如果你用 Java，那么替换系统调用就很容易，对 JVM 上 instrumentation 即可，嫌麻烦可以直接用 JMockit 之类的库，用法很简单。

第三章 数字炼金术：高频交易策略谈

3.1 金樽清酒斗十千 —— 交易数据时序建模

对于策略工程师来说，拿到一份更新频率达到秒级以下的高频数据， 首先要面对的问题是该怎样建立时序模型。常见的时间序列（Time Series）方法，一般要求数据的时间点是等间距分布的，但是交易数据有时并不能满足这个条件，我们可能会发现在一段时间内出现频繁交易，在另一段时间内市场又趋于平静。针对这个问题，对交易数据建模就需要进行一些特别的处理，这里提供两种思路。

第一种是对数据进行 Down Sample，原始的高频数据虽然是非等间距的，你可以自己定义一个时间间隔重新抽样。这个时候需要注意的，是在抽样的时候需要仔细设计方法来计算抽样点的各项数值（价格、成交量等等）。简单的做法是用原始数据 fit 出一条曲线，然后按照新的时间点取曲线上对应的值，或者算抽样时间间隔内数据点的加权平均，权值可以是数据点之间的时间差，抑或成交量之类的。这种方法做完之后就可以用常用的时序模型的技术了。

第二种就是所谓的 Point Process，直接对时间点进行建模（而非像时间序列模型是对抽样点的数据进行建模）。最简单的 Point Process 是一般概率统计课上都会教的 Poisson Process，它的特点是每次事件发生都是独立的，时间差复合指数分布。其他答案中提到的 ACD 是一种升级版，对事件间的时间差进行建模，刻画了事件之间会彼此影响的情况。这个模型技术上跟 ARMA 是一套，只不过把时间序列换成了事件序列的时间差而已。

另外有一种 Point Process 族是对单位时间内事件发生的概率密度进行建模的。学术界研究比较多的一种叫 Hawkes Process，以前主要用来对地震的余震进行建模，后来大家觉得地震其实跟金融交易里的震荡也挺像，有一批人就尝试过往上套。

Hawkes Process 的思路是说历史上发生的事情对未来的概率密度函数有影响，只是随着时间流逝，这种影响会逐渐减弱（Decay）。技术上就是做一个 Kernel，所有的历史事件都输入这个 Kernel 来计算对未来的影响，Kernel 本身做成 Decay 的形式就可以模拟衰减了。

ACD 和 Hawkes Process 的比较也有人做过，比如这里 http://arxiv.org/abs/1306.2245 。

Point Process 还有一个高级点的变种叫做 Masked Point Process，思路是把每个事件的相关数据作为标记（Mask）附加到时间点上，这样一来，模型在对时间点建模的同时也兼顾了数据。而且这种标记可以是多个，对交易数据来说，价格、成交量、波动性等都可以作为标记。这样可以极大地扩充模型的描述能力。

这两种模型各有特点，但也存在一个共有的问题，就是其底层技术设计可以非常漂亮，各种数学性质都很完备，但是你把它往数据上一套，就会发现问题重重，很多时候连基本的统计检验都通不过。其中一个原因，是这些模型本身的思路出发点非常好，可问题是数据质量很难保证，要是你拿到的是不知经过了几层处理的 N 手数据，就更是很难说清问题究竟出在哪（具体例子见 http://arxiv.org/abs/1308.6756 ）。要知道高精度的 Timestamped 交易数据是相当难求的，但如果时间都不准的话又怎么上模型呢？

虽然有这些困难，但这也正是高频量化建模这个领域吸引人的地方，有难度才有挑战。既然现有的模型都不好用，就更是亟需学术界的精英们赶快开发新模型。而如果从实际的角度说，我觉得策略的思路是比模型更重要的事情。毫秒级甚至以下这个尺度上，基本上就是统计套利和高频做市的天下，若是做别的，我个人认为难度都会太大而不划算了。如果你的交易思路明确了，再选择什么模型其实就是按需决定而已。不要本末倒置。

3.2 拔剑四顾心茫然 —— 交易数据采样方法

时间序列分析（Time Series Analysis）中一般对采集到的信息都预设是一个真实信号和一个随机扰动的叠加。如果真实信号的频率高过 Nyquist Frequency（即采样率的一半），就会造成混叠（Aliasing）。混叠后的信号是不能处理的。如果做中低频的交易，针对 Aliasing 有两种情形：一是假设真实信号没有高频部分，因此可以进行中低频的采样；二是使用高频采样，然后再处理，只是交易频率较低。实际操作中哪种方法比较可取？

这里，我们首先要区分一下数据频率（收集到的市场数据中的频率）和交易频率（交易策略下单的频率）；以下讨论中提到的频率是指数据频率。真实信号里有没有高频部分不是我们假设的，而是根据数据来的。

如果你的数据是日线 OHLC，数据本身就已经做过采样过滤掉所有高频的成分了，可以直接上时间序列分析。

如果你的数据是那种快照形式的 L1 或者 L2，要看数据是怎么生成的。如果是按照比如每秒一次的方法，那也相当于是做过采样了；如果是按照每笔交易来记录的，那么每条消息的时间分布应该是不均匀的（Irregularly Spaced），这个时候如果你要用时间序列的方法，就需要重新采样。根据 Nyquesit-Shannon 定理，可以求出完全保真的采样频率（既 Nyquesit 频率），采样时间间隔等于数据中两条相邻消息的时间差最小的那个值的一半。

但实际上由于交易数据中噪音很多，你也不一定关心真正的高频部分，按照上面这种做法就不一定划算了，因为采样之后你的数据量会变大很多，而且为了得到采样值还得做很多插值工作，插出来的值也不一定对（两条消息之间的价格就不太好插，Last Price，Mid Price，或者 TWAP 都各有各的道理，但显然都不是完全准确的）。对于这种情况，我觉得起主导作用的还是你的关注点和策略特点。如果策略的频率大概是每分钟交易一次，那按每 5 秒或者每 10 秒采样一次估计已经很够用了，再高的频率你也用不上（毫秒以内的波动你是不敏感的）。

这样说是因为，交易市场始终是自上而下由现实世界驱动的。价格是由资产本身价值驱动，而不是反过来由高频交易者驱动价格，所以一般而言，高频的波动相对中低频很小，忽略掉也不会有什么影响。实际上我觉得只有一种情况需要考虑高频的污染，就是发生 Flash Crash 的时候。但这种情况实在太少见，而且一般不会反复出现。真的遇到的时候做单独处理就好了。

如果关心高频，那么处理的就是直连交易所收到的原始数据，可以完全重构 Order Book，数据量也远超其他形式。这个时候还是根据具体问题来分析。比如你关心交易数据，那么其他的委托修改、撤销之类的消息都可以忽略了，一下子就剪掉很多数据；如果关心的是 Order Book 动态变化过程，所有的消息就都应该考虑，这样当然计算量也会变得非常大。

接下来你可能考虑的就不仅仅是采样频率这种为时间序列技术的缺陷而妥协的方案了，可以考虑其他 irregular time spaced modeling 方法，比如 Autoregressive Conditional Duration 或者 Point Processes 之类，都可以直接在原始时间上建模。当然这个已经进入高频的领域了。

最后还是得强调，解决这个问题的思路是从需求出发，而不是保真。高频的部分肯定是存在的，只不过看你拿不拿得到，需不需要用到而已。如果本来就是做中低频交易，采样随便做做就好，几秒钟甚至几分钟采一次应该都不会有太大问题。

3.3 欲渡黄河冰塞川 —— 高频交易策略实战

这里先要向不熟悉背景的读者介绍一下什么叫做 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 | http://www.tinbergen.nl/~sofie2012/papers/HautschHuang2012.pdf 这篇论文使用的方法。

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

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

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

所以接下来介绍的，才是真正具有高频玩家神采的方法，来自 Prediction of Hidden Liquidity in the Limit Order Book of GLOBEX Futures | http://www.iijournals.com/doi/abs/10.3905/jot.2013.8.3.068#sthash.rg6lIM8a.dpbs 这篇论文。

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

而看了数据的人会怎么样呢？他很可能会发现，对于冰山订单的处理，交易所的规则是非常值得寻味的。有的交易所是这样做的。一个冰山订单包含两个参数：V 表示订单总量，p 表示公开显示的量。比如 V=100，p=10 的冰山单，实际上隐藏的量是 90。如果有针对这个订单的交易发生，比如交易量 10，交易所会顺序发出三条信息：

· 成交 10

· Order Book 的 Top bid size -10

· 新 Bid +10

这三条信息一定会连续出现，并且第三条和第一条的时差 dt 很小。这样做的原因是尽管冰山订单存在隐藏量，但是每次的交易只能对显示出的量（p）发生，p 被消耗掉以后，才会从剩余的隐藏量中翻新出一分新的 p 量。这样，每个人从交易所收到的信息仍然可以在逻辑上正确地更新 Order Book，就好像冰山订单并不存在一样。

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

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

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

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

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

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

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

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

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

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

3.4 直挂云帆济沧海 —— 策略研发工具篇

策略研究员在完成数学建模工作之后，在模型验证阶段往往会面临的难题是，面对大规模的交易数据，该如何有效地进行计算，得出最终结果。我们常见的情形是，一个策略研究员拿到一份有百万行内容的 CSV 文件，如果他缺乏一些计算机编程技巧，那么一定很头疼该如何处理这份数据。这里首先针对这种情况做一点分析。

按照平均每条数据 100 字节（相当高估的数值）来估算，这样一份文件也就是总计 100MB 数据量。这个数据量是什么概念呢？一块普通机械磁盘的读取速度大概有 80～100MB/S，也就是说，一两秒之内就能读取完全部数据。如果你做的计算仅仅是一些简单的查询或是加减乘除（比如 Moving Average），CPU 的速度会远远快于硬盘访问，即在一台普通的个人电脑上，或许在几秒内就能完成计算任务。这个数字是头脑中应该有的正确的估算。有了这个概念，我们再来看看问题该如何解决。

首先，CSV 格式是一个很差的存储格式。CSV 按行存储，每读入一行都要按照分隔符进行拆分。它的数据全部以文本形式存储，意味着每读入一个浮点数（比如 1.234）就要进行字符串到数字的转换。这些都是完全不必要的，会大大增加任务的处理时间。

其次，有人建议把数据导入到 SQL 数据库，这也是个坏主意。SQL 数据库的确可以提供一些便利的查询和索引，但是每次访问数据库都需要进行进程间通信。如果你需要逐条访问，这个通信时间也会非常漫长，远远超出真正计算所需要的时间。

简言之，以上两种方案里你的大部分时间都浪费在无意义的 I/O 上，计算机的使用效率非常低。

下面给出几种方案建议，可以根据个人情况选择：

a. 使用内存数据库（如 KDB），百万条数据导入内存数据库也不过 100MB 左右的内存占用，毫无压力。在此基础上使用系统支持的语言（比如 KDB 中的 Q）进行算法开发。这是 Quant 界比较常见的一种方案，应该有成熟社区，容易找到帮助。如果你所在的机构正好有这方面的技术积累，就更方便了。但是缺点在于，数学计算比较受限于系统，如果你用到一些系统没提供的算法，开发成本比较大。KDB 的语言本身需要陡峭的学习曲线，甚至很多方面可能非常晦涩，比如一个 ! 就可以根据上下文不同表示多种不同的操作符，从取模到生成列表，对于新手来说入门可能有些困难。

b. Python 神器：Python 是非常适合做 Quant 类工作的语言，本身就是科学计算方面的统治级语言，现在加入了 IPython，Pandas 等重量级神器，为 Quant 类工作量身定做，而且仍在飞速发展中，以后会越来越重要。IPython 提供一整套的类似 Matlab 的计算环境，包含了丰富的数学函数和画图工具，示例可参见 http://nbviewer.ipython.org。Pandas 则是专门针对金融类计算设计开发的计算库（Python Data Analysis Library），底层使用 HDF5 格式（一种高效的数据存储格式，对于金融时间序列来说远远优于 CSV），上层提供很多强大的内建函数（统计类的 mean，stddev，类 SQL 的 group by，order by，等等），而且本身工作在 Python 环境里，可以直接使用 Python 做编程方面的工作。更值得一提的是 HDF5 也是 Matlab 支持的存储格式，所以有必要的时候可以无缝迁移到 Matlab（如果正好有某个算法是 Matlab 提供而 Python 没有的）。需要强调的是 Python 在科学计算方面有巨大的优势，是统治级的语言，像并行计算，GPU 之类都有很好的支持，不用担心要自己搭框架。

关于其他语言， 我自己很喜欢一个比较小众的组合：Mathematica+Java/Scala。 Mathematica 的优点在于，它本身提供函数式的编程语言，表达能力非常强大。比如 Map/Reduce 是标配，很多时候不需要去做烦人的 for 循环或下标控制，排版经常可以直接照数学公式原样输入，即直观又不容易写错；代码和输出混排的排版方式使得建模时的演算和推理过程非常流畅，甚至还可以直接生成动画，对于找直观理解非常有帮助（这几点分别被 IPython 和 R 偷师了一部分）。Mathematica 的缺点在于对金融类的时间序列数据没有很好的内建支持，使得存储和计算都会比较低效，因此需要用内嵌 Java 的方式来补足，对于数据格式或性能敏感的操作都可以用 Java/Scala 实现。在我心目中，这个组合无出其右，不论是快速建模还是建模转生产，都远远领先于其他选择。但 Mathematica 的商用授权很贵，如果公司本身不认可的话很难得到支持，这是最致命的缺陷。另外随着 Python 系的逐渐成熟，领先优势在逐渐缩小，长远来看 Python 的势头更好一些。

我在平时工作中会和一些偏 Quant 背景的人合作， 发现建模能力好的人往往在计算机方面基础比较薄弱（因为以前的训练重点不在这里）。他们也可以快速学习并掌握一种像 C++，Java 这样的语言，实现很多必要的功能。但是，一方面这些语言陡峭的学习曲线和繁琐的开发步骤会给他们真正要做的工作增加不必要的负担；另一方面一旦涉及到性能敏感的情景，他们对计算机体系结构缺乏理解的缺点就容易暴露——比如说很可能他们没有计算复杂度，内存碎片，Cache Miss，甚至多线程等概念，导致写出的程序存在相当大的隐患。

即使是计算机功底扎实的人，如果每天的工作需要在 C++，Python，R/Matlab，甚至一众脚本语言之前来回切换，思维负担也会非常重。人的精力是有限的，很难同时兼顾数学建模和底层代码调试这些差异巨大的工作。长期发展下去，最可能的结果就是要么远离建模，专心做生产环境开发；要么远离生产环境，专心建模。这种局面显然不论对个人还是团队都是有很大弊端的。

如果深入思考这个问题，相信不难得出结论，对于 Quant 来说，C++这种相当面向机器的语言肯定不是最佳选择。的确在历史上，它比更面向机器的 C 已经友好了很多，但是在计算机技术飞速发展的今天，如果还需要 Quant 大量使用 C++做建模类的工作，显然是很遗憾的事情。设想一下你拿到一份股票数据，不论你是想分析价格走势、成交量分布，还是波动性，第一件要做的事一定是画出图来看看，有一个直观认识。如果你的工具是 C++，肯定有很多时间花在编译、调试、再编译的过程上。好容易能解析文件了，接下来怎么算移动平均？怎么算波动性？全都要自己写代码。再然后怎么画图？这整个工作流程简直惨不忍睹，因为这些问题浪费掉你的大部分精力，而它们全部和你真正感兴趣的工作毫无关系。所以如果你是一个有着数理金融等背景的新人打算开始 Quant 生涯，在决定是否要投资到这项重量级技术上时需要慎重，即便它目前的市场定价可能仍在峰值。相比之下，我认为 Python 会是更理想的选择，既能很好地完成建模工作，也可以训练一定的编程技巧，使你在必要时也能胜任一些简单的 C++工作。

第四章 在光电幻影中挥动数字之刃的人们

4.1 交易策略研发人员为什么不用自己的钱交易，而要去基金公司上班

策略员加入基金公司工作至少有三个动机：

· 缺钱。这个很容易理解。或许你有不错的策略，但可能根本就没有足够的资金进行操作，那么公司首先可以帮你解决找钱的问题。最简单的做法是直接在公司管理的资金里划出一部分由你操作。

· 即使你有一定的资金，加入公司仍然有好处：使用更大的杠杆。假设你已经确切知道一个策略有效，比如年化 20%，那么使用自有资金进行操作，你可能只能投入 100 万，于是一年以后实际盈利 20 万。而如果该策略实际的资金容量可以到达 1000 万，那么你只要能从某种渠道（具体可查看「劣后」是个什么概念?经常用于什么场景? | http://www.zhihu.com/question/23274106 ）借到另外的 900 万，就可以赚得 200 万的收入；去掉对借贷方的补偿以后，仍然有远远超出原来用 100 万资金操作的收入。而这时怎么「借」就变成一个复杂的问题，其中可能涉及很多产品设计、法律条款等许多你并无兴趣也不想浪费精力的繁琐事务。借助公司的平台，这部分工作可以轻松转给其他专业人士。

· 除去资金层面，要实际运行一个策略，特别是量化类型的策略，往往还需要复杂的 IT 系统支持。即便你是一个策略开发全制霸的高手，也不可能凭自己一个人的力量完成所有系统的开发工作。那么假如你想自己干这件事，就必须去聘请一些专业的 IT 开发人员，而一个沉痛的事实是，这笔费用往往非常贵。一个策略辛苦跑到头，发现还不够支付程序员的工资，这总是一件令人心酸的事情。所以加入一家公司的第三个好处，是不同的策略人员之间可以对 IT 成本进行共享，毕竟很多 IT 基础架构和实际的策略并无直接关系，通过共享可以有效降低这部分的成本。

任何行业的发展都是由简单粗暴的个人手工作坊向着精细分工的工业化生产前进，量化交易也不例外。在这个行业越久，就越会发现所谓策略只是众多环节中的一环。因此，自己闭关面壁苦练出一条绝世策略，从而走上人生巅峰，这样的事情还是不要妄想的好。

4.2 Quant 和程序员到底有什么差别

有一些 Quant 朋友会自称为码农，因为日常大部分工作的确就是在写代码。事实上对于 Quant，有一个和码农对应的叫法是矿工。在美国的朋友大概都听说过「在东海岸就去花街当矿工，在西海岸就去硅谷做码农」的说法，也说明两者的确有一些相似性。

如果说区别呢，Quant 的工作主要还是和数字打交道，写程序的目的是为了用计算机去解决数字计算的问题，不论是 Q 宗定价还是 P 宗统计。相比之下，他们不会去关心 Web 开发有多少种框架， PHP 是不是最好的编程语言，MySQL 和 PostgreSQL 哪个性能更好这种一般意义上的程序员更可能关注的问题，很多时候也不需要深入理解编译器的工作原理，操作系统的 Kernel Space 和 User Space 有什么不同，CPU 里面有几级缓存等纯计算机专业的知识。

如果这个描述还不够形象的话，建议看看这几个问题下的讨论，感受一下真正的程序员的世界。都是我随便找的，主要是帮助非计算机科班的朋友理解下码农们平时都在为什么而战，这些东西又离 Quant 的工作多么遥远：

怎么样才算是精通 C++？ | http://www.zhihu.com/question/19794858#answer-313278

C++ 的什么是 Java 不能取代的？ | http://www.zhihu.com/question/20110924

Java 和 C# 最大的不同是什么？ | http://www.zhihu.com/question/20451584

CPU 的分支預測器是怎樣工作的？| http://www.zhihu.com/question/23973128

jmp 和 call 会打乱 CPU 流水线，那是不是应该尽量少用函数调用？| http://www.zhihu.com/question/20923905

对于有工科背景的朋友，可以看看这几个问题，感受一下 Quant 主要在做什么。当然区区几个问题无法包括全部，不过你可以和上面那几个对比一下，应该能感觉出区别来：

如何系统地学习随机过程？| http://www.zhihu.com/question/21454531

随机过程、机器学习和蒙特卡洛在金融应用中都有哪些关系？| http://www.zhihu.com/question/23527615/answer/25702970

为什么欧式股票期权的价值与股票的期望收益率无关？| http://www.zhihu.com/question/23730849

如何系统地自学金融工程，有哪些优质的书籍推荐？都有哪些学习方法心得？| http://www.zhihu.com/question/23507826

至于题目中提到的金融工程，这是一门非常具体的学科，一般是培训 Q 宗 Quant 的，但 Quant 并不都是学这个出身。如果除此之外没有接受过计算机专业的训练（不论科班还是自学），那么此专业毕业的学生是不太可能去找软件或互联网公司的工作的，技能上差别很大。

对了，有人可能会问到关于「青春饭」的问题。对此说说我的理解。

Quant 的工作始终是为金融业服务，相比于普通的软件开发，有着门槛高、专业方向明确的特点。像是互联网那种做个小网站或是开发 iPhone App 这种一个人买台电脑，在网上看看免费文档，再花几百块租个服务器就能从设计到开发再到运营全包的风格，做 Quant 工作是不太可能想象的。

Quant 的业务，比如说做衍生品定价，只能在投行里才有平台让你做这种工作，否则你自己设计一个衍生品出来，卖给谁？或者说交易策略研发，那就算你做纯个人的 Quant Trader，也需要拿出几万块钱来去股市开户练手，可能什么还没学到这点钱就打水漂了，足以打消大部分人的热情。高频交易更是需要 colocation；交易资金等高端要求，不是普通人付得起的，只能在专业公司里做。

这些因素决定了进入 Quant 行业的门槛很高。但一旦你入行了，会发现世界一下子变小了，和你竞争的都是那些和你一样费了九牛二虎之力爬进来的人，不会说某一天突然发现一些黄毛小子摆弄了一些你没玩过的设备，做出了超出你理解范围的事，然后把你淘汰掉（不理解的话，可以回顾一下 Google 是怎么革微软的命，Facebook 又是怎么革 Google 的命）。

所以在矿工这么个小圈子里，不爱折腾的大可以慢慢学，慢慢做。你会发现你的上级领导就是那个有十几二十年从业经验，对行业的理解，各方面技能都完爆你的大叔，而不太可能是一个有着天才头脑和想象力的年轻人。从职业发展的角度上说是一条比较稳定的路线。高技能前辈的存在，也让你对前进的方向看得更清楚，对专业技能的积累有更深刻的认识。我自己从 IT 业转过来，就明显感觉到合作或接触的人平均年龄和资历都比以前高了很多；入行时间久了，也渐渐搞明白难度在哪里，不会担心哪个年轻人能仅靠天赋或运气就后来居上，这是很有安全感的。

当然凡事各有利弊，门槛高、发展稳定的同时也意味着机会相对变少。的确也有人弄出一些天才策略而一夜暴富，但相比互联网行业五花八门的创业奇迹，这种情况的比例我感觉是比较少的，大多数人也就是天天干着这么一份绞杀脑细胞的工作换取一份稳定的收入。特别是像我这种从 IT 行业转过来的，回头看看，小伙伴们可能都在玩什么天使 A 轮 B 轮几百几千万的融资了，身边的 Trader 大叔还在为了今天交易赔了几百磅而郁闷，对比还挺强烈的。

所以对于想要入行的同学，我一向的建议是把你自己的兴趣放在第一位。如果对数字（学）对交易感兴趣，那么入这行没错；如果是为了挣大钱征服市场，让名片上的职位显得高端大气上档次，现实一定会给你看看它残酷的那一面。

4.3 要想成为一名 Quant 需要什么样的编程水平

想在交易行业中做一名优秀的 Quant，编程水平可能会在两个方面制约你的发展。至少，在我这个计算机科班出身的人看来，这是非常明显的问题。你要知道，每当我看到新来的编程小白 Quant， 一定要很真诚地告诉他，只有找到那个命中注定的编程师傅，才能成为一名真正的 Quant。

好了，故事开场前，最后说明一点。以下仅针对交易行业。卖方的衍生品定价和风控等内容我不熟悉，不发表意见。

一、性能不足

交易这一行是真真正正的大数据行业。一个交易所一天产生的数据轻轻松松便达到几十 GB。如果你做跨交易所的交易，这个数字还要翻几番。想想在这样的情况下，一个月的数据量有多大？一年的数据量又有多少？这么大的数据量，如果你的编程功底不扎实，跑一次回测可能就要几个小时甚至几天，就算你有再好的想法，这么慢的反馈也足够把你的灵感扼杀在摇篮里了。

这还不是最糟的。更坏的可能是，你写出来的程序根本无法处理这么大的数据量，要么内存不够用，要么计算时间太长以至于根本无法操作。必须说，若出现这种情况，后果很严重。

举一个例子。有一次，我有一个同事用 Python 写了一个分析程序，存在一个 bug 产生严重的内存泄漏，导致回测的时候才跑几天的数据，程序就崩溃了。更糟的是算法写得比较复杂，他想查出问题所在却根本无从下手。问题交给我以后，我只做了一点很简单的改动，对每天的处理开一个单独的进程处理，结束的时候关闭进程就会释放所有内存，问题就解决了。很多时候这种问题对编程高手来说只是小事一桩，但对编程经验不足的人来说却是天大的难题。

另外，现在的确在不断涌现出新的大数据技术，让人们可以更方便快捷地做处理。但是那些还远未到能直接运用到交易数据分析上的程度。非常大的可能是，你需要去理解这些技术的工作原理，然后对你手里的交易数据做适当的转换，才能利用这些技术来分析数据，而这些都是和编程水平直接挂钩的。

二、信息受限

做 Quant 最重要的能力是发现数据中的规律。但如果你只能拿到二手数据，很多原始信息都被过滤掉了，而你连那些信息长什么样子都没见过，又怎么能去分析其中的规律呢？

这绝不是危言耸听，还是看实例。高频交易最好的数据是直接从交易所收下来的最原始的数据，这个数据包含所有订单操作（增、删、改、成交）的记录，是研究市场微结构的最佳选择。可这种数据的格式往往是特殊的二进制编码，而且要进行特定的重构，才能还原出交易的过程（增、删、改都是动作，需要作用在对应的数据结构上），没办法直接用数学软件做分析。

有一次，我的一个纯金融背景的 Quant 同事想要分析一些这样的数据，但他处理不了那种原始格式（Matlab 显然是干不了这种事的），只好找我帮他。但我当时自己手里还有无数的任务在处理，没有太多时间，只能做最简单的处理，最后只把成交记录提取出来写成容易识别的格式给他。这样他拿到的数据里那些增删改的记录全都被过滤掉了，那他显然不可能去做任何关于这些记录的分析。对于一个 Quant 来说，当他受制于人的那一刻，就已经注定了是一场悲剧。

同样的事情，如果是我自己会怎么做呢？内嵌 Java 虚拟机进 Mathematica 或者 R，底层解码用 Scala，直接在程序内转成容易处理的数据结构，Mathematica/R 建模，作图，方案确定以后直接把 Scala 程序传到云服务器上跑回测。整个流程可以一气呵成，不需要麻烦任何人。更重要的是，我手里的信息是完整的，所以可以分析任何我感兴趣的数据。事实上，很多时候，秘密就隐藏在这些最原始的数据里。

上面说了这么多，是不是意味着必须像计算机系同学一样，从头苦学所有计算机专业课呢？

当然不是。计算机专业的很多技能，像是操作系统、网络通信、编译器、多线程之类，都跟 Quant 的工作没什么关系，即使你对那些不熟悉，也不用怕。

但是基本的数据结构和算法，是应该扎实掌握的。你应该知道数组、链表、哈希表这些数据结构的原理和区别，能够自己实现一些基本的搜索，排序算法，这会帮助你能正确地估算程序运行时间和需要的内存等资源，出现性能瓶颈的时候也可以自己分析。

对一些进程间通信的方式，比如文件，socket，或者共享内存，应该有基本的理解，这会让你能够组合不同的工具（比如 Excel 和 C++）来实现复杂的功能，很多时候这些小组合会让你事半功倍。

有的同学希望我推荐一些这方面的入门书籍。我思来想去，还是决定推荐这本经典的《Introduction to Algorithms》和《Computer Systems - A Programmer’s Perspective》。我承认这两本大部头看起来有一些难度，但是， 请大家努力学（hui）习（dao）。即使你只是简单地通读一遍，相信也会受益匪浅。对编程语言也要多了解一些，特别是如果你没听说过函数式语言（Functional programming），最好去学一下。这对 Quant 工作是有极大帮助的。

问题中提到的那几种 C++功能，class/iostream/reference 都是最基本的概念，只掌握这些是远远不够的。不过我也不建议一开始就拿 C++试刀，就算是计算机科班出身，也没几个人能真正精通 C++，做 Quant 又何必和自己过不去呢？去学一下 Python 或者 Scala 吧，这些比 C++友好得多。对于 Quant 来说，他们才是传说中你等的那个人。

最后说说有些 Trader 为什么会说不需要太高深的编程水平。很简单，公司招人是需要你产出的，招你进来的时候编程水平是什么样他们心里有数，自然不会要求你做力所不及的事情。如果你满足于一直给别人打下手，只去做别人安排好的工作，出了问题找 IT 部门（如果有的话）解决，那保持现状也是可以的。只是这样显然很难成为一名优秀的 Quant。

走上 Quant 这条路，要有不断学习新技能的觉悟。像我们这些计算机出身的人，也要去补之前没学过的数学和金融。大家的背景不同，起点和优势也各不相同，但是努力的方向是一致的。

只有打通任督二脉的那一天，你才会成为真正的英雄。到那时，你才不会再被代码困扰，只因为你心中已然无码。

4.4 P Quant 和 Q Quant 哪个是未来

武林史上，剑气之争向来难离恩怨情仇。这一次也不例外。先来介绍一下本篇主角，Q 宗与 P 宗。

Q 是指风险中性测度。风险中性的意思主要是说历史数据不能帮助你预测未来的走势，所以你的决策是没有风险补偿的。这当然是一个非常虚幻的假设，但是由此而得的模型可以给出漂亮的数学性质，而且可以在缺乏数据的情况下得到一些结论，所以有一定的实际意义。涉及的数学技术主要是随机过程、偏微分方程之类。在数学派系里，这些显得相对高端，一般人概念里都是那些思维不同于常人的人捣鼓的玩意。

P 是指真实概率测度。所谓真实，主要是说模型依赖的概率分布是从历史数据上估算出来的。严格来讲，我个人不认为这种东西叫做「真实」，最多只能说是从真实数据上估算出来的，显然没有什么东西保证历史一定会重演（比如黑天鹅）。但是这个是目前大家公认的说法，所以咱们不较真。从定义可以看出这套方法主要依赖数据，数据量越大估算的效果越好。涉及的技术主要是时间序列（ARIMA，GARCH 之类），Bayesian，以及现在流行的机器学习等方法。不难看出，为了倒腾数据，这套方法练到上层就要开始刷装备。在电子化时代这最终演化为拼机房的「军备竞赛」。

两者对比可以看出：Q 重模型而轻数据，P 则重数据而轻模型。当然两者也都要即有模型也有数据，但从应用上来讲，Q 者是模型固定，用数据来精化模型的参数（calibration）；P 者则可以有若干备选模型，由数据的计算结果来选择最佳的模型（estimation）。

这个区别也造成在业界的划分。Q 可以让你在缺少数据的情况得出一些结论，从而可以凭空制造一些东西出来，所以卖方（投行）用来做衍生品定价，业务模式是开发新的衍生品出来卖出去。P 则喜欢大数据量，这天然就是买方（Hedge Fund 类）所需要的技术，因为他们本来就需要针对大量证券做出筛选和投资决策，业务是数据驱动的。

理清两者的区别后，就可以看出发展方向上的不同。从本质上说，Q 宗是一种制造业，大家比的就是造出更多更好的衍生品来卖，但如果生产出来的东西没人买，显然生意就做不下去。而 P 宗其实属于服务业，那些数据技术不会给你创造出什么新产品，而是通过对本来就存在的业务（比如投资决策）进行精细加工，来达到优化的目的（特别值得强调的是，量化的核心价值始终在于优化，绝非单纯追求所谓 alpha 者之超额收益。事实上，若你真能勘破此间真谛，牢牢把握住优化求精的思想，即使不关心 alpha，也足以让你在「乱世」中安身立命）。但如果大家都在既定条件下优化到了极限，显然也就不会再继续投入。

分析到这里可以看出，这两者的思路都有可取之处——从逻辑上讲都有继续发展的空间。以长远的眼光来看，很难分出高下。

但回顾历史，P 宗一度因为走的是统计一派处于数学鄙视链底端的屌丝路线，手里的数据也实在不够看，很长时间里挺不受人待见的。

在那段非主流的日子里，生活挺心酸的。大家经常嘲笑他们搅来搅去就会弄点回归、算个均值，太没出息。手里的数（kou）据（liang）有限，没事只能发呆。在那个洪荒的时代，也实在没什么好装备，练功只能靠山寨。

同一时段，Q 派则充分发挥人脑优势，气势逆天。华尔街上，精通此道的数学、物理博士们一时风头无两，是各大行纷纷争抢的宠儿。主流金融机构都在热衷于开发各种复杂的衍生品，发挥到极致后可以把能卖的不能卖的都打包到一块，盘子越做越大，一派不尽长江滚滚来的势头。他们甚至连诺奖都不放过。另外当年衍生品大行其道的时候，Q 宗的定价能力甚至还可以用来寻找市面产品的错误定价，从而发现能直接盈利的套利机会。这一切给 Q 宗带来爆发式的增长。

但时来运转，进入新世纪，开始出现 Q 弱 P 强的趋势。这里面主要有两点原因。

第一是 2008 年金融危机一来，已（zou）臻（huo）化（ru）境（mo）的 Q 宗搞出来的那些已经无人能看懂的衍生品让人无语地一把烧掉了大家的钱，使人们意识到这条路线的危险性。

2008 年在 Q 宗的心底留下一个挥之不去的烙印，华尔街上 Q 宗子弟「尸横遍野」，自此之后风光不再。更有甚者，在当年辉煌的废墟之下，大量遗留下来的已经定型的 Q 类工作不再需要太多的数学分析，反而蜕变成相当机械性的体力活。而伴随着竞争者的涌入，定价错误的机会也一减再减。这一切成为了今日 Q 宗的梦魇。

但若透过现象看本质，你会发现人家的心法根基仍在，说不定哪一天就会上演绝地反攻。永远不要低估一个文艺青年追求理想的决心。

第二点，随着 IT 业接二连三的产业升级，个人电脑、互联网，到现在的智能手机，催生出能极其方便地处理海量数据的计算技术，美其名曰「大数（xing）据（zuo）技（suan）术（ming）」。这直接带来 P 宗迫切需要的装备升级。

同时金融业也开始推行电子化。交易所的电子化，以及自动化交易直至最近的高频交易，带来交易数据的极速增长。技术和数据二者兼具，P 宗心中梦幻的舞台开始浮现，一举成为时代选择的新星。而在这个拼爹的新世纪，假人力者似乎注定只能在其背后叹息。

但不要忘了，天下武学本是一家。若执着于派系之分，终不免落入下乘。要想达至 Quant 最高境界，就必须要了解宇宙苍生。事实上，Q 宗一派已然深谙此道。君不见各大藤校 Q 宗培训班早已明修暗度地引入 P 宗修习课程。正所谓蓦然回首，那人已在痴痴地等。此道亦应为 P 宗所用。武学正宗是为 Q 中有 P，P 中有 Q，道法自然。

由是者，古老的数学家们用纸与笔推演的疯狂，在数字化时代化身为集成电路中奔驰的 0 与 1。我相信时至今日，人们仍未能完全明了此间图景的全部可能。在新的时代，程序代码已经开始成为继数学之后的新生一代科学普适性语言。硅基装备给碳基人类带来的，更是希望之翼。

随着人们生产、收集、分析数据的能力大规模提升，我们眼前展开的是一个前所未有的数据时代。也许在浪潮之后，我们会发现这场数据盛宴并不一定能带来对世界本源的更深层认识，但是在这时代开端，无人知晓山的另一边是什么风景。好奇心的驱使已经足以使世人疯狂。谁又能抵挡得住名为可能性者的诱惑呢？

4.5 如何成为一名优秀的 Quant

在十几年前，我刚上大学的那个年代，还没人听说过 Quant 这个职业。我自然也从未在大学期间思考过为了成为一名 Quant 该做哪些准备。然而物换时移，我竟然误打误撞进入了这个行业。所以本篇于我而言，更多的是在回答这个问题：如果重走一次大学路，该做哪些准备以更好地应对今天的工作？我本想罗列一些课程和技术，但思来想去，还是觉得以道御术者方为上乘。所以本篇务虚。

在开篇之前，针对题目中描述的背景，先提供两个相关的知乎问题作为背景资料，它们特别针对 Quant 的工作内容和非金融本专业人士做了一些解释：

· P Quant 和 Q Quant 到底哪个是未来？| http://www.zhihu.com/question/24820388/answer/29150204

· 非金融专业人士，可以通过什么途径进入金融业？| http://www.zhihu.com/question/20146419/answer/26894153

特别强调，以下观点仅为本人以入行不深的浅薄资历所得出的个人理解，不代表我自认为优秀 Quant。如有不同意见，欢迎友好交流。

首先来说一说 Quant 这份职业的吸引人之处。我相信，对于很多年轻人来说，Quant 还是一个传说中的职业，对于 Quant 平时的工作都干些什么，可能还只是凭一些网上的传言和想象。在传说中，不论是卖方投行的定价 Quant，还是买方基金的投资 Quant，都需要操纵高深的数学模型，编写精密的计算机程序，如鬼神般穿行于市场间，十步杀一人，千里不留行。

但是古往今来，所有美丽的传说，虽然动人之处各有不同，却有一个共同的特点：离现实太遥远。入行以后你会发现，和所有其他行业一样，大部分时间里你的工作内容可能都是琐碎和枯燥的，包括一些拼体力的编程，调试，清洗数据，分析日志。而实际上外界所传的 Quant 种种美好的数学建模和理论分析，能够在其中占据一成就已经很不错。所以，当你下决心要成为一名职业 Quant 时，首先要做好心理准备，经得起这些枯燥和琐碎，才能最终品尝那一点点甘醴。

看到这里，如果你仍要坚持，那我们就先来一点干货。这是一份真正的投资公司（G-Research）给出的参考面试题：

http://www.gresearch.co.uk/careers/quantitative-analyst/sample-questions.pdf

这份题目至少可以让你对将要面对的面试筛选标准有一个感性认识。如果你被其中的某道题目难住，可以在日后的学习中重点补充相关的知识。

当然，这份题目主要是针对买方 Quant 而言。可以看出它注重的是概率、统计和编程。如果你的目标是卖方投行，需要的可能是随机过程、微分方程和编程。当然这只是几门核心技能，仅仅掌握这些是不足以让你在竞聘者中脱颖而出的。要想于众人中崭露头角 ，必须狠下心来吃得苦中苦，不要在你的成绩单上留下弱项。

说到这里，若你的心灵比较脆弱，可能已经遭受了重大的「创伤」。但是很遗憾，这就是现实。

更加遗憾的是，入行后你很可能会发现，这些费尽苦心学来的技能，就和高考成绩一样只能作为进入行业的敲门砖，并不是保证你取得成功的终极武器。我相信会对 Quant 感兴趣并以此为职业目标的，多半是理工科背景相对较强的朋友。外界的宣传很可能给大家一种印象，认为 Quant 这种工作就是理工科的科学家们使用各种奇技淫巧来玩弄金融市场，从而操纵全人类的修真之道。但实际如何呢？进入这一行你会发现，金融首先是一门关于人的学科，科学手段在这里并非用来探寻宇宙本源，而是为人服务的。若是忽略了这一点，就会迷失本心。

当你日后遭遇那些面目可憎的高层们，就会明白我在说什么。

我们知道，长期经受理工科思维训练的人，很容易沉迷于甚至迷信技术。但是要记住，那些位居高位的权臣们，绝非按照数学定理或是电脑程序来出牌。他们甚至有时还会做出让你匪夷所思的行为。你要理解，这并非他们的错，因为这就是人性，是人性啊！

谨记始皇遗训：模型未稳市场变，土豪原来不读书。这个世界的残酷之处正在于，财富和权力往往掌握在你无法理解的人手中。而他们对于这些资源的使用方式很可能超出你的想象。

但是不要气馁。无论人性如何，自然之奥妙恰恰在于，适者生存（而非强者生存）。正是因为人性之复杂，市场之变化莫测，我们才需要依赖科学手段来进行精确的定量分析，从而帮助决策者得到对真实问题更清晰的认识和理解。这才是一个优秀的 Quant 真正的价值。要想达此境界，必须要具备的精神是：理性、执着、专注。

而这几条在我看来，任何一个智商正常的人，只要经过足够有质量的科学训练，都可以达到。外界往往夸大宣传这个行业偏爱天才级的头脑和最高端的学历，但从我的经验来看，这绝非必需项，甚至也有反例。

曾经我有一个同事，大家公认他非常聪明。甚至在他离开公司多年后，他的名字还被大家用来作为天才的代名词。我们有一个专门用来编写交易算法的自制编程语言，他曾经花了几天时间就重写了这个语言的编译器，使它更加高效和安全。那些代码如此神奇，其中有些奇思妙想的段落至今已经无人能看懂，但它运行多年从没出过 Bug。但是这样一个人，却最终并不被大家欢迎而离开了团队。因为那种对于智力因素的过度追求，使得他成为一个极其难以合作的人。接手一份自己完全看不懂的代码并深深地感到智商上的羞辱，没有人会喜欢这样。人与人之间也不是这样进行合作的。

实际上，一个经受过合格的科学训练的家伙，即便羽翼未丰，只要能虚心学习，认真负责地把前辈们交代的工作做好，日积月累，也足以成长为值得信任的骨干。

也有一些名牌大学的理工科博士，虽然技术水平还不错，但是却缺乏深刻的理解能力，处理问题总是浮于表面。以至于稍微复杂一点的问题，就会做出让人哭笑不得的方案，接手的同事甚至只能重头再做一遍。

需要强调，对于 Quant 这种高技术工种，合作是非常重要的。必须尽可能地融入一个优秀的团队，最大程度地得到别人的帮助。这样才能扬长避短，充分发挥自己的优势专长解决最重要的难题。而以我的经验来看，团队里最受欢迎的是一种 T 字型人才。即对自己擅长的领域有深入的理解，同时对其他相关的领域也保持好奇心和基本的了解。这样的人更有可能作为角色成员，有机地成为团队的一部分。唯有如此，别人才愿与你同舟共济。

现代科学的精妙之处，正在于它为技术密集型工作提供了一种通用的合作语言。只要遵循和贯彻科学原则，取长补短，一群平凡的人也可以打造出强力装备，完成本不可能完成的任务。

说到这里，必须要强调一下，我绝非反对智商和学历所起的作用。我认为它们的确在一定程度上对于获得进入这个行业的资格有很大的帮助。但只是要想追求卓越，这些条件既非必要也不充分，要理性看待。

在我的心目中，优秀的 Quant 应该是一个真正的专家。而当我在这里谈论专家时，我在谈论的，其实是大前研一在《专业主义》一书中给出的定义：

专家要控制自己的情感，并靠理性而行动。他们不仅具备较强的专业知识和技能以及较强的伦理道德，而且无一例外地将顾客放在第一位，具备永不衰竭的好奇心和进取心，严格遵守纪律。以上条件全部具备的人，我们称之为专家。 无论前提条件发生多大的变化，都能够认清深层变化的本质，比别人发挥出更大的能力，这样的人才是专家。

对于一个有志于成为优秀的 Quant 的人，我建议要时时提醒自己不要局限在数理模型和技术细节中。比具体的技术实现更重要的，是面对金融交易中种种错综复杂的难题时，做到对问题的真正理解，以最有效的方式拯救他人于水火，让他们在黑暗的深渊中找到光。如此才合金融一脉以人为本之道。我相信只有领悟此道，你的职业生涯才会开启新的篇章。

最后要说的是，一入 Quant 深似海，这是一个充满了压力、竞争和挑战的行业。因此，健康的身心是你日后在漫长的职业生涯中应对重压的必备条件。为此，在大学阶段，你要学会生活。培养一个健康的爱好，坚持锻炼身体，保证规律生活。这些看似和学业无直接相关的行动，在从业后日复一日的工作中，会慢慢成为你坚实的依靠。

特别是，学会和家人及爱人相处，不要因为工作忽略她们。她们的支持和鼓励是你陷入过劳的桎梏时最需要的帮助。

第五章 失落凡间的真秘籍

5.1 研究高频交易有哪些好的参考书目

兼听则明，让我们从两方面来研读。

正方：

Inside the Black Box: A Simple Guide to Quantitative and High Frequency Trading: Rishi K. Narang

关于高频交易业务和策略，这是我看过的讲得最清楚的一本书。作者本人就是资深从业者(Tradeworx co-founder）。关于高频交易的几种不同策略都有非常清晰的解释，前半部关于 Quant Trading 的讲解也非常精彩。如果想要对高频交易业务有一个全面、正确的理解，这本书是必读的。

必须强调的是，这是这张书单里唯一正确给出 Top of Order Book（ToB）示例的一本书。Order book 是高频交易策略最核心的概念，不管你是想介绍交易策略，还是想说明高频交易的弊端，如果没有正确的 ToB 分析，一定是耍流氓。那么 ToB 长什么样呢？像下图这样。

这里不解释这张表的内容，因为书里说的很清楚，感兴趣的朋友可以自己去看。我想说的重点是，请记得这张表的样子。如果一篇关于高频交易策略的文章没有给出类似的东西，那么它的论点一定是非常值得怀疑的，意味着：

· 它不知道策略具体是怎么执行的，即在纸上谈兵；

· 它的逻辑经不起推敲，事实上通过分析 ToB，很可能会得出完全相反的结论。

ToB 变化是交易世界中的原子事件。而正因为 HFT 可以看到所有的 ToB 事件，用这个原子级的数据说话就必须是一条铁律。这一条也是任何人都要遵守的，和立场无关。

The Science of Algorithmic Trading and Portfolio Management: Robert Kissell

这一本书主要是讲量化交易，教你如何系统化、科学化地研究交易策略，这部分是本书精髓。最后一章介绍了一些高频交易算法，但主要是关于套利方面，相比上面一本显得不够全面，或者说，不够「高频」 。但整本书宏观来看仍然十分优秀，对于量化交易技术的阐述非常全面。

Algorithmic Trading and DMA: An introduction to direct access trading strategies: Barry Johnson

这本书从目录上来看就是值得推荐的，主要是因为它介绍了不同的订单类型（Order Type）和下单策略，这个是 HFT 的重点研究对象，是必须要了解的。

All About High-Frequency Trading (All About Series): Michael Durbin

本书作者也是资深从业者，曾经参与过 Citadel 的高频交易系统的开发。这本书属于入门级读物，没有涉及高深的技术和理论，适合没有相关背景或是刚入门的朋友阅读。

反方：

Flash Boys: Michael Lewis

本书是关于 HFT 最热门的畅销书，目前最著名的反 HFT 著作，作者是记者。但撇开立场不谈，这本书以记者的视角，从多个角度挖掘了很多关于 HFT 行业的信息，这些是很值得读的，可以帮你获得感性认识（你至少会了解为了比拼交易速度，有人会开山凿洞，架天线搞微波，这都是真实的产业）。

Broken Markets: How High Frequency Trading and Predatory Practices on Wall Street Are Destroying Investor Confidence and Your Portfolio

主编也是交易行业资深从业者（Themis Trading co-founder）。本书也提供了非常全面的审视 HFT 的视角，技术水平上比 Michael Lewis 的高很多，给你提供了更多的技术细节。但是我个人认为本书主编的立场值得怀疑。我猜 HFT 对 Themis Trading 的业务冲击比较大，所以他们急于出来打压，这从他们主页上力推 Flash Boys 可见一斑。

非常需要强调的是这本书里对技术细节的展示非常有迷惑性，有很多危言耸听的言论是经不起推敲的。比如说其中（第七章 It's the Data, Stupid）提到交易所给 HFT 提供的数据中包含了 Order ID，以此来说明 HFT 可以根据 ID 来判断机构用户的大单。这里的问题在于同一个 ID 只能对应一个 Order，如果你把一个大单拆成若干小 Order，每个都会有不同的 ID，不可能有人能看到一个就推出整体的大单，而这是目前主流算法交易引擎都会做的事情。单凭这一点我不认为可以构成攻击 HFT 的理由，最多说明机构用户需要升级他们的引擎。

因为这本书里到处有这种迷惑性言论包装在不详细的技术细节展示里，所以建议大家谨慎阅读。非常耐人寻味的是，作为一本专业人士编写的书，竟然没有一处使用 ToB 分析来说明问题。就冲这一点，要是我有钱的话，绝对投给 Tradeworx，不给 Themis Trading。

The Problem of HFT: Collected Writings on High Frequency Trading & Stock Market Structure

一些反对、质疑 HFT 的言论。这本书相对比较简单，可以轻松阅读 。

5.2 高频交易领域的学术文献

首先提两本相关的学术著作：一本是 2011 年的论文集 Econophysics of Order-driven Markets，收录了一系列关于盘口和高频数据建模的论文；另一本是 2013 年的 High-Frequency Trading book，包含一些策略研究和机器学习方面的应用。这两本书一定程度上可以反映学界目前对这个领域的研究现状。

接下来提几位重量级的学者，他们发表的相关论文都很有影响力，值得一读。

· Robert Almgren 在策略执行（execution）、交易成本（trisection cost）以及 Portfolio 方面都有一系列著名的论文。

· Rama Cont 近几年有好几篇关于 Order Book 建模的非常不错的文章。

· Michael Kearns 本人是计算机系做机器学习的大牛，但是常年混迹于投资界（似乎参与某基金公司的策略研发）。关于机器学习在交易方面的应用，看他写的会比较有帮助。

我认为，不能简单地下结论说这个方面业界远远领先于学界。首先，业界的热门方向肯定会得到学界的关注，如果业界真的有重要的发现，在学界是会有反应的。但是为什么使得大家感觉在交易这个领域没有什么重量级的学术著作？我个人的理解是，主要是由于学界和业界的关注点非常不同。金融交易本身就不是一个纯理工性质的学科，它也包含很多人文方面的特性，比如行为金融学一脉，所以具体的应用上有时候很难涉及特别学术的东西。业界做的东西很多时候在学界看来是非常简单的，有相当多属于工程方面的优化，这些东西做出来非常有效果，但是写成论文就不那么好看了。

另外一个问题是，学界的确相当缺乏第一手资料。尤其是近几年高频交易开始火热以后，高精度的交易数据更是难求。交易所和一些数据公司都是用来高价出售的，做学术的人往往买不起太好的数据。即使通过一些途径得到一些数据，学界的人由于远离生产一线，也经常会发生对数据的理解偏差。

举一个例子。去年有人写了一篇 Critical reflexivity in financial markets: a Hawkes process analysis | http://arxiv.org/pdf/1302.1405v2 ，用一种随机过程的模型来说明近年因为自动化交易的增加，导致市场中在微观尺度上出现一种连锁反应的现象（即一个交易事件可能会引发多个后续的交易事件）。模型做得很漂亮，数据分析也很充分，看起来很不错。但是紧接着就有人写了一篇唱反调的

Apparent criticality and calibration issuesin the Hawkes self-excited point process model: application to high-frequency financial data | http://arxiv.org/pdf/1308.6756v3.pdf ，详细地分析了交易数据源里可能存在的问题。比如说，交易所在发出市场数据的时候可能会做一个打包处理，使得一个短时间内相邻几条交易的时间戳看起来是一样的，这样显然导致对时间的分析是有很大误差的。对这种细微的问题，如果没有一线生产的相关经验和深入理解，很容易带来研究方向上的误导。

不过当今时代最重要的特征，是世界变化太快。优秀的学者有越来越多的机会接触实际生产，所以如果单纯认为他们很「傻」是很危险的。刚才提到的 Michael Kearns 就对机器学习在这方面的应用有过精彩的论述（Machine Learning for Market Microstructure and High-Frequency Trading | http://www.cis.upenn.edu/~mkearns/papers/KearnsNevmyvakaHFTRiskBooks.pdf ）：

· Machine learning provides no easy paths to profitability or improved execution, but does provide a powerful and principled framework for trading optimization via historical data.

· We are not believers in the use of machine learning as a black box, nor the discovery of 「surprising」 strategies via its application. In each of the case studies, the result of learnings made broad economic and market sense in light of the trading problem considered. However, the numerical optimization of these qualitatitve strategies is where the real power lies.

人家显然很明白，机器学习这一套的核心价值不是用来做什么预测和盈利策略（所谓的寻找 Alpha），而是优化。这种认识显然比很多业界人士还要透彻得多。

Table of Contents

目录

关于本书

「盐」系列电子书出版序

作者序

第一章 大电子交易时代皇冠上的明珠

1.1 什么是高频交易系统

1.2 高频交易的第一推动力 —— 追逐流动性的交易所们

1.3 高频交易的理论基石 —— 市场微观结构

第二章 纳秒，微波，FPGA：高频交易黑科技

2.1 高频交易软硬件是怎么架构的

2.2 C++ 为核心语言的高频交易系统是如何做到低延迟的

2.3 高频交易系统的开发语言选择之 C++ VS Java

2.4 高频交易系统如何在多线程和端口通讯之间取舍

第三章 数字炼金术：高频交易策略谈

3.1 金樽清酒斗十千 —— 交易数据时序建模

3.2 拔剑四顾心茫然 —— 交易数据采样方法

3.3 欲渡黄河冰塞川 —— 高频交易策略实战

3.4 直挂云帆济沧海 —— 策略研发工具篇

第四章 在光电幻影中挥动数字之刃的人们

4.1 交易策略研发人员为什么不用自己的钱交易，而要去基金公司上班

4.2 Quant 和程序员到底有什么差别

4.3 要想成为一名 Quant 需要什么样的编程水平

4.4 P Quant 和 Q Quant 哪个是未来

4.5 如何成为一名优秀的 Quant

第五章 失落凡间的真秘籍

5.1 研究高频交易有哪些好的参考书目

5.2 高频交易领域的学术文献

Table of Contents

目录

关于本书

「盐」系列电子书出版序

作者序

第一章 大电子交易时代皇冠上的明珠

1.1 什么是高频交易系统

1.2 高频交易的第一推动力 —— 追逐流动性的交易所们

1.3 高频交易的理论基石 —— 市场微观结构

第二章 纳秒，微波，FPGA：高频交易黑科技

2.1 高频交易软硬件是怎么架构的

2.2 C++ 为核心语言的高频交易系统是如何做到低延迟的

2.3 高频交易系统的开发语言选择之 C++ VS Java

2.4 高频交易系统如何在多线程和端口通讯之间取舍

第三章 数字炼金术：高频交易策略谈

3.1 金樽清酒斗十千 —— 交易数据时序建模

3.2 拔剑四顾心茫然 —— 交易数据采样方法

3.3 欲渡黄河冰塞川 —— 高频交易策略实战

3.4 直挂云帆济沧海 —— 策略研发工具篇

第四章 在光电幻影中挥动数字之刃的人们

4.1 交易策略研发人员为什么不用自己的钱交易，而要去基金公司上班

4.2 Quant 和程序员到底有什么差别

4.3 要想成为一名 Quant 需要什么样的编程水平

4.4 P Quant 和 Q Quant 哪个是未来

4.5 如何成为一名优秀的 Quant

第五章 失落凡间的真秘籍

5.1 研究高频交易有哪些好的参考书目

5.2 高频交易领域的学术文献