量化系統工程師需要學什麼?
原創: 陳益波 FICC與資産配置 昨天
題記:作者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有微弱的優勢,但是相容性上好像要稍微差一點。
熟悉計算機網絡不僅是為了更快的寫程式,同時也是為了解決實際工作中經常會碰到的網絡問題,如果多個網卡下的網絡,路由,多點傳播等的設定。
四、作業系統原理
中斷、上下文切換、核心排程、記憶體管理、使用者态、核心态這些内容不熟悉的話,會導緻很難明白這些對交易會造成怎麼樣的影響以及如何才能優化的,以下推薦幾本我看過的書籍。
《30天自制作業系統》是一本寫的比較有趣味性的書籍。書中做的系統雖然很粗糙,但是把作業系統的概念,開機發生的事情、中斷、CPU排程、記憶體配置設定等概念深入淺出的介紹清楚了。
《作業系統精髓與設計原理》是我讀的第一本關于作業系統的書,也是高校裡作業系統這門課的教科書。作者William Stallings是畢業于MIT的計算機博士,世界知名的計算機學者和暢銷書教材作者。該作者關于計算機的其他書有空也是值得一讀的。
《深入Linux核心架構》是推薦一讀的好書,裡面含有一小部分源碼,寫的很詳實,入木三分。Linux的核心源碼是非常注重性能的,通過這本書也能學點怎麼讓代碼性能更優。
了解系統原理的目的是為了做系統調優。通過系統調優配合上網絡調優,可以讓ping的結果飛快,交易系統運作起來快非常多。
五、計算機基本原理
BIOS和grub裡面有很多優化設定和CPU有關。了解了CPU工作原理,這樣在雙路CPU時才明白為什麼要用NUMA配置,要不要開超線程,交易的程式應該如何設定CPU親緣性和隔離,以及中斷服務如何優化。了解了cache的機制才明白為什麼要盡量在核心結構上做cache line對齊,讓記憶體通路盡量線性,保持記憶體通路的空間局部性和時間局部性。多了解點計算機的原理,才能更好的了解如何使用prefetch預取資料來優化效率。關于指令預取,這裡附帶一篇介紹性的文章。(CPU預取與性能簡介–CSDN部落格)
調優上光靠自己記錄和分析效率比較低。使用工具來幫忙分析會事半功倍,熟悉英特爾的VTune, 或谷歌的 Google CPU Profiler等工具是加分項。Vtune是收費軟體,可以申請試用一個月,功能非常強大,可以說是優化神器。
六、資料庫
量化交易很關鍵的就是資料庫及資料品質。了解資料庫的配置、上線、索引、備份、鏡像設定等設定在工作中涉及到資料庫時會有幫助。熟悉資料庫的進階用法會讓工作中和資料庫打交道時事半功倍。期貨的資料量并不是特别大,用MySQL或SQL Server存儲基本能滿足需求。但是證券的行情就不太行了,資料量太大了,特别是證券的逐筆資料,非常巨大。目前我還沒有找到特别合适的方法來存儲逐筆資料。同行們在這一點上如果有好的工具請多多指教!
七、主流櫃台系統
量化交易少不了與櫃台系統打交易。像期貨裡的盛立、飛創、易盛、飛馬、ctp、廣策,證券裡的LTS、寬睿、xtp、頂點、奇點等櫃台。有的櫃台網上是可以下載下傳API并申請模拟帳号去測試的。如果對接過其中的某個,在面試中屬于加分項。同行中有的團隊為了追求極緻速度會自己開發櫃台系統。關于交易櫃台的介紹,可以參考下面這篇文章一文讀懂量化系統接入及相關平台。
八、設計模式
設計模式也是有必要學習的一門課,是教你如何模式化的寫代碼的。推薦一本寫的蠻有意思的書《Head First 涉及模式》。
九、算法
算法在實際開發中被用到的非常非常少,感覺學過的各種确定性算法,啟發式算法,機器學習算法能被交易系統開發中用到的不足1%,但是學習算法對于訓練邏輯思維能力幫助非常大。可以這麼說,如果你能熟練掌握各種算法,那麼寫任何程式都是相當比較容易的。因為你的思維能力會被訓練的特别強。我在大學時主攻的是ACM程式設計競賽程式設計,通過學MIT的《算法導論》公開課,劉汝佳的《算法藝術與資訊學競賽》,同時也看了一些進階資料結構,動态規劃,機率論,博弈論,計算幾何,組合資料,線性規劃,等相關的書籍。刷北大,杭電等線上OJ。《ACM/IOI 國家隊集訓隊論文集錦》也看了其中的一小部分。從大二零基礎開始學算法,和兩個隊友一起花了近3年的時間學習各種算法,大三時成績還一般,最後在大四時超常發揮進入ACM全球總決賽,最後運氣極好的拿到了全球并列第20名的成績。
十、Python
Python是非常推薦熟練掌握的語言,既可以寫腳本,又可以寫對時效性要求不是那麼高的小工程,對資料分析的支援也特别好。C++ 加 Python 可以解決絕大多數量化工程師工作上的需求。關于Python的書知乎上有非常多的資料,這裡推薦其中的一篇:程式設計零基礎應當如何開始學習 Python?(請知乎搜尋)
十一、前端技術
交易系統怎麼樣至少都要有一個前端系統用于監控的。這個選擇性可以有很多,可以做成Windows應用,也可以是基于浏覽器的網頁,還可以做成手機app。選擇哪個主要就看各公司的喜好了。适當了解一些前端技術在做全棧工程師時會用得上。前端當然非常重要,但是由于前端的替代性強,選擇太廣,入職前不需要花很多的時間在這個上面。隻需要稍微了解一下C++ MFC, 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工程師在實作功能時應該多考慮到系統功能外的人性缺點,這樣會減少很多不必要的麻煩。比如當系統功能有變動,我一般是會釋出一個中間版本,既支援舊有的模式,又支援新功能,等所有交易員所有帳号都已經切換到了中間版本,再檢查所有新功能需要的配置變更是不是都已經改了。在确認都改動完成後,再釋出一個隻支援新配置模式的版本。這樣的系統疊代更新,就不會因為某個交易員某次更新忘記做相應的改動而出現錯誤。讓整個更新更加符合人性。為了減少人為操作錯誤,運維上要盡量自動化,腳本一次調試正确後,後面就不會再出差錯了。另外實在不可避免的,要多加一些容錯自動檢查和監控。系統啟動時巡檢易出錯的配置項是否符合一定的配置邏輯,如果出錯則報警退出。讓錯誤盡早發現,不要等進入交易時間了才發現錯誤。優秀的程式員應該不僅實作出功能,而且會做到以人為本,會預先思考使用者可能會犯的錯誤,在系統設計時加入相應的措施來避免出錯或能及時檢測到出錯。
最後提一點量化系統工程師雖然有一小部分工作和政策開發相關,比如都要寫程式。但是兩者的知識體系以及思維方式是非常不一樣的。在工作中要做好分工協作,相信做政策的同僚,遇到問題多跟公司内部人員溝通。在政策虧損時,不要試圖去幹預政策,這通常不是一件好事,畢竟隔行如隔山。
十八、與人為善
如果能掌握上面說的的那些要點,找個高薪的崗位并不困難。但是除了工資之外,工作環境的舒心順心,做事之外做人也是非常重要的。工作中,經常會碰到期貨公司、證券公司或第三方的技術故障,對待他們稍微寬容一些,學會與人進行良好溝通。不要碰到點小問題就把别人罵的狗血零頭,沒有必要。再說期貨公司、交易所、第三方在做到基本公平的情況下并非資源是完全平等配置設定的。處理好與外部的關系,在某些資源上别人也更願意更好更快地為你服務。很多時候,與人友善就是與己友善。從另一方面來說,人生要想走到更高一個發展台階,光憑技術單打獨鬥是很難的,要講究團隊協作。團隊協作、業務拓展,很多時候情商比智商更重要。
(感謝陳博士的分享,如果大家希望更多交流,歡迎公衆号留言或者知乎搜尋作者陳益波,https://www.zhihu.com/people/chen-yi-bo-31-39。)