量化系统工程师需要学什么?(转)

原文链接 - 知乎

作者:陈益波

转载记:作者的专业水平虽然大部分人达不到,但是可以作为学习计算机编程的一个清单,文章很多经验之谈在学长学姐那里也听过,脚踏实地,立意高远。

作者于2015年博士毕业加入一家量化私募公司,刚好做了四年系统工程师的工作。本文作为这个岗位所用到的技能总结,希望对想进入这个行业的人有所帮助。本人非科班出身,工作中用的技术大多数通过自学获得,有不足之处还请同行多多指教,有好的学习资料希望不吝推荐!

量化交易这些年在国内方兴未艾,这几年国外顶级量化交易公司纷纷进入国内来捞金。预计未来量化交易在中国会有一个长足发展。一般量化团队分两类技术工种,策略开发岗系统开发岗本文介绍系统开发岗涉及的一些技术知识,文中前面几点C++、 操作系统、网络等是核心技能,后面几点是辅助技能。精学其中的一部分就足以找到工作

一. C++编程

C++是核心语言,必须非常熟练地掌握。低频的交易系统可以不用C++,但是对于延迟有要求的策略,通常都是使用C++作为交易系统的开发语言。入门推荐看《C++程序设计教程》。该书我大学时的ACM教练钱能老师写的,写的非常深入浅出,里面还介绍了STL的使用方法,对于初学者很有实用性。很意外的在 【**学习C++从入门到精通的的十本最经典书籍**】 的帖子中看到此书,说明钱能老师的书是受到读者认可的。

【**C++十本经典书籍】帖子中说到的《Effective C++》《More Effective C++》也是我看过的很经典的书籍。还有《Inside the C++ Object Model》虽然我没看过,但是看内容应该也是很值得一读的书。C++ FAQ LITE《C++ FAQ Book》**的子集,是一本很实用的C++学习和准备面试的书籍。

《深入Linux内核架构》也是一本学习C++的好书,既可以了解Linux的内核架构逻辑,又可以参考里面涉及的代码,Linux内核的代码中本身也有很多值得学习的地方。比如里面多处用到的__cacheline_aligned_in_smp就是对提升性能非常有用的cache line对齐编程。

说到C++,顺便提一下写C++会用到的代码版本管理工具Git,编译器g++ 和编译管理工具makefile和调试工具gdb

Git是Linux之父Linus Torvalds为了开发Linux而开发的一个非常好用的代码版本管理工具。它是码农必须掌握的工具。在这里推荐廖雪峰Git教程,写的相当好。廖雪峰的官网还有介绍Python等别的实用的语言的入门教程,有兴趣也可以看看。

**g++是Linux环境下最常用的编译器,使用g++编译、链接、生产可执行文件、静态链接库及动态链接库,怎么加入依赖的头文件和依赖的库这些都是必须学会的基本操作。g++编译时可以选的参数非常多,有的参数可以起到调试或编译优化的作用,如果是要成为高频系统工程师,编译优化也是必须要学的。熟悉g++**的使用方法会让工作事半功倍。

makefile是Linux 环境下最常用的编译管理工具,需要简单的了解makefile是如何工作和使用的。量化系统并不是特别大型的系统,makefile不是核心需求,只需要看得懂makefile文件的意思并能依葫芦画瓢就能满足日常工作需求。 这里推荐一篇写的比较详细的博文Makefile 使用总结 - wang_yb - 博客园

gdb是C++的debug工具,最常用的时候是代码崩溃了,通过core文件来查看崩溃时堆栈状态来定位bug的位置。在代码运行中偶尔也会用到pstack来查看各线程堆栈状态,这个也是一个比较有用的工具。

二. Linux环境

Shell 语言是Linux环境的基础语言,Shell脚本经常会在定时任务中用到。推荐一个网站吧 Shell 教程 | 菜鸟教程
我在工作中很常用的有下列Linux命令。如果有不熟悉的可以多了解一下,都是比较实用的。

文件目录操作: mkdir, cd, pwd, which

文件查看,查找: ls, cat, more, less, grep, tail, find, ldd, whereis, tee, awk

文件操作: cp, scp, rm, gzip, gunzip, zip, unzip, tar, mv, ln

日期时间: ntpdate, date

网络: ping, telnet, traceroute, tcpdump, netstat, wget

用户权限: useradd, passwd, chmod, chown, chgrp, sudo, visudo, su, who

硬盘管理: df, du, mount, unmout, fs

进程管理: ps, kill, killall, pstack, whom, fg, bg

CPU:turbostat

应用安装: rpm, yum

定时任务:crontab

在Linux下编辑文件我使用的是Vim这个工具,Linux vi/vim | 菜鸟教程

三. 计算机网络协议和编程

交易并不是在单机上完成,一般量化交易至少会涉及交易服务器、交易柜台、行情源机器、监控后台等多个机器,这些机器之间是通过网络交互的。只有学会了网络编程,才能让这些机器间连成一体。关于网络的各种概念的入门,我是通过网易云课堂上的免费视频学的。看完后就能明白虚拟机网络设置时的网桥、NAT等是啥意思,碰到公司网络问题就能比较容易解决。或者要配置专线网络时运营商让操作的IP、路由、网段,网关,防火墙等东西能有个概念,然后按部就班就能顺利完成专线组网。网易云课堂上有很全的编程语言、计算机技术、前端技术、大数据、人工智能的免费和收费资料,想学计算计技术推荐上这个网站上上网课。

简单实用的网络工具如zeromq编程,zeromq是非常好用的一个消息队列工具,支持全部主流语言。基础点的如socket编程。在这里推荐三本书《UNIX环境高级编程》,《UNIX网络编程》,《TCP/IP详解》

再复杂的就是kernel bypass技术了。为了更快的获得行情和下单交易返回,kernel bypass是非常有必要学会的技术。业界最常用的网卡硬件是基于Solarflare网卡,该网卡提供3个层级的kernel bypass。最简单的就是onload, 不需要用户改代码,安装了网卡驱动后,在程序使用onload启动就可以了,非常的简单易用。第二个层级是tcpdirect,速度上要比onload再快一点,但是需要用户修改代码。ef_vi则是最最底层的,跳过所有协议栈,直接读取网卡的某条一条特定的RX队列。做的比较专业的高频团队一般都是使用ef_vi来接收行情。这个网卡的相关资料可能登录 Solarflare官网下载官方使用文档进行学习。

OpenOnload(链接已挂,自行查找)

除了Solarflare,Exanic X10 似乎最近也比较火,据说性能上比Solarflare X2522有微弱的优势,但是兼容性上好像要稍微差一点

熟悉计算机网络不仅是为了更快的写程序,同时也是为了解决实际工作中经常会碰到的网络问题,如果多个网卡下的DNS,、网关、网络、路由、组播等的设置。

四. 操作系统原理

中断、上下文切换、内核调度、内存管理、用户态、内核态这些内容不熟悉操作系统的话,会导致很难明白为什么这些对交易会造成负面影响以及如何才能优化的,同时像共享内存,信号量,memory map这些功能的使用也离不开对操作系统的理解。以下推荐几本我看过的书籍。

《30天自制操作系统》是一本写的比较有趣味性的书籍。书中做的系统虽然很粗糙,但是把操作系统的概念,开机发生的事情、中断、CPU调度、内存分配等概念深入浅出的介绍清楚了。

《操作系统精髓与设计原理》是我读的第一本关于操作系统的书,也是高校里操作系统这门课的教科书。作者William Stallings是毕业于MIT的计算机博士,世界知名的计算机学者和畅销书教材作者。该作者关于计算机的其他书有空也是值得一读的。

《深入Linux内核架构》是推荐一读的好书,里面含有一小部分源码,写的很详实,入木三分。Linux的内核源码是非常注重性能的,通过这本书也能学点怎么让代码性能更优。

了解系统原理的目的是为了做系统调优。通过系统调优配合上网络调优,可以让ping的结果飞快,交易系统运行起来就快多了。

五. 计算机基本原理

BIOS和grub里面有很多优化设置和CPU有关。了解了CPU工作原理,这样在双路CPU时才明白为什么要用NUMA配置,要不要开超线程,交易的程序应该如何设置CPU亲缘性和隔离,以及中断服务如何优化。了解了cache的机制才明白为什么要尽量在核心结构上做cache line对齐,让内存访问尽量线性,保持内存访问的空间局部性和时间局部性。关于Cache,有一个老外做了7个很有意思的实验帮忙读者了解Cache对性能的影响《Gallery of Processor Cache Effects》,原文见下面这个卡片。

Gallery of Processor Cache Effectsimg

多了解点计算机的原理,才能更好的理解如何使用prefetch预取数据来优化效率。关于指令预取,这里附带一篇介绍性的文章。

CPU预取与性能简介 - LinuxPerformance.Topimg

调优上光靠自己记录和分析效率比较低。使用工具来帮忙分析会事半功倍,熟悉英特尔的VTune, 或谷歌的 Google CPU Profiler等工具是加分项。Vtune是收费软件,可以申请试用一个月,功能非常强大,可以说是优化神器。

六. 数据库

量化交易很关键的就是数据了。数据一般是存在数据库中。了解数据库的配置上线索引备份镜像设置等设置在工作中涉及到数据库时会有帮助。熟悉数据库的高级用法会让工作中和数据库打交道时事半功倍。期货的数据量并不是特别大,用MySQL或SQL Server存储基本能满足需求。但是证券的行情就不太行了,数据量太大了,特别是证券的逐笔数据,非常巨大。目前我还没有找到特别合适的方法来存储逐笔数据。同行们在这一点上如果有好的工具请多多指教!据说KDB+和Q语言结合起来非常强大,但是KDB很贵另外Q的学习难度也比较大,本人没有使用过。

七. 主流柜台系统

量化交易少不了与柜台系统打交道。像期货里的盛立飞创易盛飞马ctp广策、证券里的LT、 宽睿xtp顶点奇点等柜台。有的柜台网上是可以下载API并申请模拟帐号去测试的。如果对接过其中的某个,在面试中属于加分项。同行中有的团队为了追求极致速度会自己开发柜台系统。关于交易柜台的介绍可以参考下面这篇文章:

呆若木鸡:一文读懂量化系统接入及相关平台img

八. 设计模式

设计模式也是有必要学习的一门课,是教你如何模式化的写代码的。我看的第一本设计模式的书籍叫《Head First 设计模式》,写的比较有趣很有可读性。学了设计模式后不要每次写个程序都思考这个应该要用什么模式。最优秀的程序员应该像《笑傲江湖》中的令狐冲那样,学会独孤九剑后又全部忘掉。最后实际写的代码有时是非标准模式,有时是几种模式的结合。根据具体问题具体分析,千变万化,随机应变。武侠中的重剑无锋,无招胜有招,想必就是这个意思。

九. 算法

算法在实际开发中被用到的非常非常少,感觉学过的各种确定性算法,启发式算法,机器学习算法能被交易系统开发中用到的不足1%,但是学习算法对于训练逻辑思维能力帮助非常大。可以这么说,如果你能熟练掌握各种算法,那么写任何程序都是比较容易的。因为你的思维能力会被训练的特别强。我在本科时主攻的是ACM/ICPC程序设计竞赛编程,通过学MIT的《算法导论》公开课,刘汝佳的《算法艺术与信息学竞赛》,同时也看了一些高级数据结构动态规划概率论,博弈论,计算几何,组合数学,线性规划,等相关的书籍。刷北大,杭电等在线Online Judge。ACM/IOI 国家队集训队论文集锦也看了其中的一小部分。从大二零基础开始学算法,和两个队友一起花了近3年的时间学习各种算法,大三时成绩还一般,最后在大四时超常发挥拿到亚洲区域预赛金奖顺利晋级ACM/ICPC全球总决赛,最后运气极好的拿到了全球并列第20名的成绩。

转者注:ACM/IOI 国家队集训队论文可以在Oi wiki/lib上看最新版

十. Python

Python是非常推荐熟练掌握的语言,既可以写脚本,又可以写对时效性要求不是那么高的小工程,对数据分析的支持也特别好。C++ 加 Python 可以应对绝大多数量化工程师工作上的需求。 关于Python的书知乎上有非常多的资料。这里引用其中的一个

编程零基础应当如何开始学习 Python?img

十一. 前端技术

交易系统怎么样至少都要有一个前端系统用于监控的。这个选择性可以有很多,可以做成Windows应用,也可以是基于浏览器的网页,还可以做成手机app。选择什么方案主要就看公司的喜好了。适当了解一些前端技术在做全栈工程师时会用得上。前端当然非常重要,但是由于前端的替代性强,选择太广,入职前不需要花很多的时间在这个上面。只需要稍微了解一下C#, java 或 pyhon web编程, 手机app编程就可以了。如果是对相应的技术特别感兴趣,多学点时髦的技术,工作后做一些好用的工具出来对团队提高工作效率也是非常有帮助的

十二. 其他技术

Java 语言依然是市场占有率蛮高开发系统非常好用的语言。Java语言有非常丰富和成熟的工具,对网页支持做的也很好,学习一下Java工作后可以在周边系统使用上。

R, matlab 这两个是除python外使用非常广泛的数据分析语言。如果有兴趣并且时间充足,稍微了解一点,在和策略开发人员做对接时可能会用上。当然,不了解也不会影响本职工作。

日常工作中运维也是需要的,特别是刚入职时,量化团队一般都比较小,入职初期各种打杂是难免的。用U盘装机Windows和Linux,给Linux配置机器名,网络,设置用户权限安装Java, Python,Openonload环境等这些都是工作中很可能会碰上的需求。复杂点的就是了解一些远程管理工具如IPMI,iLO进行远程机器管理甚至装机。这些不是核心,要是在学校如果闲着无聊多去捣鼓捣鼓,熟悉这些东西对工作是有帮助的。

十三. 金融相关知识

在找工作时并不需要提前学过金融,这点在入职后学习完全没有问题。不过多了解一些,面试时可以留下更好的印象,属于加分技能项。这一点上本人主要是通过考了CFA Level1稍微系统性学习金融相关的基础知识,大概全天侯地花了一个多月来准备这个考试,其实只要做一下CFA 的Notes和练几次模拟考就可以通过这个考试了。个人觉得CFA考试硬知识还是蛮多的,属于含金量蛮高的考试。考证方面除了CFA,也考过国内的证券从业资格考试基金从业资格考试,这两个考试在国内工作是蛮有用的,从业后很多公司会要求去考个从业资格,不如提前考了,部分基础知识对面试和工作是有帮助的。另外也看了一些和这个岗位相关性不大但是蛮有意思的书籍,在此一并推荐一下:《宽客-华尔街顶级数量金融大师的另类人生》《金融的逻辑》《乱世华尔街》《Flash Boys》,《打开高频交易的黑箱》等

还有相对专业一些的书籍:《High-Frequency Trading: A Practical Guide to Algorithmic Strategies and Trading Systems》《Algorithmic_Trading_and_DMA》

随着跟团队的融合,也需要不断了解策略方面的一些基础知识,比如说多因子模型、CTA策略、做市商策略等等,这样有利于跟研发人员进行对接,起到事半功倍的作用。这方面有很多书籍以及卖方研报可以学习。

十四. 逻辑问题

本人学习华尔街的对冲基金公司,在面试中也会拿一两个逻辑问题来考察一下面试选手的思维方式。推荐看一下《Heard on The Street: Quantitative Questions from Wall Street Job Interviews》的第一部分,纯算术和逻辑题。属于有点意思的题目。但和工作的关系相关性不大。如果回答不出来对最终的录取与否影响非常小。但是如果能回答得出来,是属于加分项。

十五. 硬件

我们这个岗位如果只是程序写的好,但是使用的硬件很差那也是有点跑车引擎装在拖拉机上跑的感觉。认识行业内靠谱的硬件商,找到能提供靠谱的超频服务器并能帮忙做优化,有故障时及时响应的供应商在工作中能省掉很多麻烦事。如果您有优质的供应商欢迎推荐!

十六. 机器学习

机器学习和大数据是当前的大热门技术,在量化交易中也有一些用武之地。另外学习机器学习背后的算法思路对于训练逻辑,了解数据分析很有帮助。如果空闲时对这块内容感兴趣,个人非常推荐您去好好学学机器学习的常用算法,如线性回归、逻辑回归、K-Means、KNN、支持向量机、决策树、增强学习、推荐系统、神经网络等等非常经典的算法,熟悉这些算法并做一些实验。如果您能熟练掌握上面说的那些技能并熟悉机器学习算法的使用,那么就业时进入AI领域去当算法工程师也是前景非常不错的岗位。目前就业市场AI人才缺口很大。比较容易拿到高薪offer。机器学习这块可以到Coursera上看吴恩达的机器学习公开课,讲的非常清楚。

十七. 人性的缺点

所有的系统最后做出来都是给人去使用的,写程序要考虑到人是有缺点的,比如会健忘、漏操作、误操作、看错东西、敲错数字等。IT工程师在实现功能时应该多多考虑到系统功能外的人性缺点,这样会减少很多不必要的麻烦。比如当系统功能有变动,我一般是会发布一个中间版本,既支持旧有的模式,又支持新功能,等所有交易员所有帐号都已经切换到了中间版本,再检查所有新功能需要的配置变更是不是都已经改了。在确认都改动完成后,再发布一个只支持新配置模式的版本。这样的系统迭代升级,就不会因为某个交易员某次升级忘记做相应的改动而出现错误。让整个升级更加符合人性。为了减少人为操作错误,运维上要尽量自动化,脚本一次调试正确后,后面就不会再出错了。另外实在不可避免的,要多加一些容错自动检查和监控。系统启动时巡检易出错的配置项是否符合一定的配置逻辑,如果出错则报警退出。让错误尽早发现,不要等进入交易时间了才发现错误。优秀的程序员应该不仅实现出功能,而且会做到以人为本,会预先思考用户可能会犯的错误,在系统设计时加入相应的措施来避免出错或能及时检测到出错。这里顺便提一点,量化系统工程师虽然有一小部分工作和策略开发相关,比如都要写程序。但是两者的知识体系以及思维方式是非常不一样的。在工作中要做好分工协作,相信做策略的同事,遇到问题多跟公司内部人员沟通。在策略亏损时,不要试图去干预策略,这通常不是一件好事,毕竟隔行如隔山。

十八. 与人为善

如果能掌握上面说的的那些要点,找个高薪的岗位并不困难。但是要工作的舒心顺心,做事之外做人也是非常重要的。工作中,经常会碰到期货公司、证券公司或第三方的技术故障,对待他们稍微宽容一些,学会与人进行良好沟通。不要碰到点小问题就把别人骂的狗血零头,没有必要。再说期货公司、交易所、第三方在做到基本公平的情况下并非资源是完全平等分配的。处理好与外部的关系,在某些资源上别人也更愿意更好更快地为你服务。很多时候,与人方便就是与己方便。从另一方面来说,人生要想走到更高一个发展阶段,光凭技术单打独斗是很难的,要依靠团队作战。团队协作,业务拓展,很多时候情商比智商更重要