职分享 | 量化/高频交易技术面试指南

大家好,我是Lucy@FinTech 社区。

经常被小伙伴们问到如何准备Quant/C++Developer-量化/高频交易面试,以下的分享来自FinTech社区的陈益波博士,希望对你们有帮助,也欢迎加入FinTech社区讨论。

 

 

目录

一. C++编程

二. Linux环境

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

四. 操作系统原理

五. 计算机基本原理

六. 主流柜台系统

七. 设计模式

八. 算法

九. 金融相关知识


 

一. C++编程


 

C++是核心语言,必须非常熟练地掌握。低频的交易系统可以不用C++,但是对于延迟有要求的策略,通常都是使用C++作为交易系统的开发语言。


 

入门推荐看《C++程序设计教程》。写的非常深入浅出,里面还介绍了STL的使用方法,对于初学者很有实用性。


 

【C++十本经典书籍】帖子中说到的《Effective C++》和《More Effective C++》也是必读书籍。《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教程》,写的相当好。


 

二. 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、路由、网段,网关,防火墙等东西能有个概念,然后按部就班就能顺利完成专线组网。


 

在这里推荐三本书

1.《UNIX环境高级编程》

2.《UNIX网络编程》
 

3.《TCP/IP详解》


 


 

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

OpenOnload

support.solarflare.com


 

四. 操作系统原理


 

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


 

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


 

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


 

五. 计算机基本原理


 

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


 

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


 

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


 

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


 

六. 主流柜台系统


 

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

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

zhuanlan.zhihu.com。
 


 

七. 设计模式


 

设计模式也是有必要学习的一门课,是教你如何模式化的写代码的。我看的第一本设计模式的书籍叫《Head First 设计模式》,写的比较有趣很有可读性。学了设计模式后不要每次写个程序都思考这个应该要用什么模式。


 

八. 算法


 

因为你的思维能力会被训练的特别强。我在本科时主攻的是ACM/ICPC程序设计竞赛编程,通过学MIT的《算法导论》公开课,刘汝佳的《算法艺术与信息学竞赛》,同时也看了一些高级数据结构,动态规划,概率论,博弈论,计算几何,组合数学,线性规划,等相关的书籍。刷北大,杭电等在线Online Judge。《ACM/IOI 国家队集训队论文集锦》也看了其中的一小部分。


 

九. 金融相关知识


 

在找工作时并不需要提前学过金融,这点在入职后学习完全没有问题。不过多了解一些,面试时可以留下更好的印象,属于加分技能项。


 

在此一并推荐一下:

《宽客-华尔街顶级数量金融大师的另类人生》

《金融的逻辑》

《乱世华尔街》

《Flash Boys》


 

还有相对专业一些的书籍:

《High-Frequency Trading: A Practical Guide to Algorithmic Strategies and Trading Systems》

《Algorithmic_Trading_and_DMA》