量化系统工程师需要学什么?(18条干货分享)
今天这篇文章来自Fintech社区小伙伴,他2015年博士毕业加入一家量化私募公司,已经做了四年系统工程师的工作。本文是根据这个岗位所用到的日常工作技能总结,希望对想进入这个行业的人有所帮助。由于作者非科班(博士管理科学专业)出身,工作中用的技术大多数通过自学获得,不足之处还请同行多包涵与指正,欢迎留言分享你的。
目 录
一、C++编程
二、Linux环境
三、计算机网络协议和编程
四、操作系统原理
五、计算机基本原理
六、数据库
七、主流柜台系统
八、设计模式
九、算法
十、Python
十一、前端技术
十二、其他技术
十三、金融相关知识
十四、逻辑问题
十五、硬件
十六、机器学习
十七、人性缺点
十八、与人为善
一、C++编程
C++是核心语言,必须非常熟悉,入门推荐看《C++程序设计教程》。该书我大学时的ACM教练钱能老师写的,写的非常深入浅出,里面还介绍了STL的使用方法,对于初学者很有实用性。很意外的在 【学习C++从入门到精通的的十本最经典书籍】 的帖子中看到此书,说明钱能老师的书是受到读者认可的。
【C++十本经典书籍】帖子中说到的《Effective C++》和《More Effective C++》也是我看过是很经典的书籍。还有《Inside the C++ Object Model》虽然我没看过,但是看内容应该也是很值得一读的书。
《深入Linux内核架构》也是一本学习C++的好书,既可以了解Linux的内核架构逻辑,又可以参考里面涉及的代码,Linux内核的代码中本身也有很多值得学习的地方。比如里面多处用到的 __cacheline_aligned_in_smp 就是对提升性能非常有用的chache line对齐编程。
说到C++,顺便提一下写C++会用到的代码版本管理工具Git,编译器g++ 和编译管理工具makefile和调试工具gdb。
Git是Linux之父为了开发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
文件查看,查: 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
硬盘管理: 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下载官方使用文档进行学习。
除了Solarflare,Exanic x10 似乎最近也比较火,据说性能上比Solarflare X2522有微弱的优势,但是兼容性上好像要稍微差一点。linux在线编程
熟悉计算机网络不仅是为了更快的写程序,同时也是为了解决实际工作中经常会碰到的网络问题,如果多个网卡下的网络,路由,组播等的设置。
四、操作系统原理
中断、上下文切换、内核调度、内存管理、用户态、内核态这些内容不熟悉的话,会导致很难明白这些对交易会造成怎么样的影响以及如何才能优化的,以下推荐几本我看过的书籍。
《30天自制操作系统》是一本写的比较有趣味性的书籍。书中做的系统虽然很粗糙,但是把操作系统的概念,开机发生的事情、中断、CPU调度、内存分配等概念深入浅出的介绍清楚了。
《操作系统精髓与设计原理》是我读的第一本关于操作系统的书,也是高校里操作系统这门课的教科书。作者William Stallings是毕业于MIT的计算机博士,世界知名的计算机学者
和畅销书教材作者。该作者关于计算机的其他书有空也是值得一读的。
《深入Linux内核架构》是推荐一读的好书,里面含有一小部分源码,写的很详实,入木三分。Linux的内核源码是非常注重性能的,通过这本书也能学点怎么让代码性能更优。
了解系统原理的目的是为了做系统调优。通过系统调优配合上网络调优,可以让ping的结果飞快,交易系统运行起来快非常多。
五、计算机基本原理
BIOS和grub里面有很多优化设置和CPU有关。了解了CPU工作原理,这样在双路CPU时才明白为什么要用NUMA配置,要不要开超线程,交易的程序应该如何设置CPU亲缘性和隔离,以及中断服务如何优化。了解了cache的机制才明白为什么要尽量在核心结构上做cache line对齐,让内存访问尽量线性,保持内存访问的空间局部性和时间局部性。多了解点计算机的原理,才能更好的理解如何使用prefetch预取数据来优化效率。关于指令预取,这里附带一篇介绍性的文章。(CPU预取与性能简介--CSDN博客)
调优上光靠自己记录和分析效率比较低。使用工具来帮忙分析会事半功倍,熟悉英特尔的V
Tune, 或谷歌的 Google CPU Profiler等工具是加分项。Vtune是收费软件,可以申请试用一个月,功能非常强大,可以说是优化神器。
六、数据库
量化交易很关键的就是数据库及数据质量。了解数据库的配置、上线、索引、备份、镜像设置等设置在工作中涉及到数据库时会有帮助。熟悉数据库的高级用法会让工作中和数据库打交道时事半功倍。期货的数据量并不是特别大,用MySQL或SQL Server存储基本能满足需求。但是证券的行情就不太行了,数据量太大了,特别是证券的逐笔数据,非常巨大。目前我还没有到特别合适的方法来存储逐笔数据。同行们在这一点上如果有好的工具请多多指教!
七、主流柜台系统
量化交易少不了与柜台系统打交易。像期货里的盛立、飞创、易盛、飞马、ctp、广策,证券里的LTS、宽睿、xtp、顶点、奇点等柜台。有的柜台网上是可以下载API并申请模拟帐号去测试的。如果对接过其中的某个,在面试中属于加分项。同行中有的团队为了追求极致
速度会自己开发柜台系统。关于交易柜台的介绍,可以参考下面这篇文章一文读懂量化系统接入及相关平台。
八、设计模式
设计模式也是有必要学习的一门课,是教你如果模式化的写代码的。推荐一本写的蛮有意思的书《Head First 涉及模式》。
九、算法
算法在实际开发中被用到的非常非常少,感觉学过的各种确定性算法,启发式算法,机器学习算法能被交易系统开发中用到的不足1%,但是学习算法对于训练逻辑思维能力帮助非常大。可以这么说,如果你能熟练掌握各种算法,那么写任何程序都是相当比较容易的。因为你的思维能力会被训练的特别强。我在本科时主攻的是ACM程序设计竞赛编程,通过学MIT的《算法导论》公开课,刘汝佳的《算法艺术与信息学竞赛》,同时也看了一些高级数据结构,动态规划,概率论,博弈论,计算几何,组合数据,线性规划,等相关的书籍。刷北大,杭电等在线OJ。《ACM/IOI 国家队集训队论文集锦》也看了其中的一小部分。
从大二零基础开始学算法,和两个队友一起花了近3年的时间学习各种算法,大三时成绩还一般,最后在大四时超常发挥进入ACM全球总决赛,最后运气极好的拿到了全球并列第20名的成绩。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论