標籤:

要想成為一名優秀的 Quant 需要什麼樣的編程水平?

本人美本,金融數學,之前正式系統學習的編程課就是一門c++,寫過最複雜的一個程序也就是一個類似於下棋的一個小遊戲(一點都不好玩,真的。。。。。。。),

class, iostream,pass by referrence到是都用到了。。

現在在一個quant trading team 做實習。。。每天也就是用vba幫人家處理下數據。。。實習中發現大部分的trader都是計算機科班出身,他們雖然口頭上說,不需要什麼太高深的編程水平。但我覺得他們編程水平還是比我強太多。因此我想問問知乎上的各位那些有工作經驗的大牛們,你們覺得什麼的計算機水平才夠用?


做中頻arb trading的進來隨便說說,可能跟HFT的情況大不同, 估計也不適合pricing或risk。首先是要思路清晰。flowchart也好,偽代碼也好,數學證明也好,紙上或chalk talk也罷,都要求清晰明確的思路。

其次c的底子必須好。關鍵代碼靠它,這不用說了。

然後要有一兩個快速實現的工具語言,其實就是python/R二選一。原因是方便,package多,不用reinvent the wheel, 讓人集中精力做理論和模型。 R上手快,python數學包更多,擴展性更好,與c混合容易。R適合學術,隨手研究,基本沒法做trading production (缺乏各種API, 埠通訊也不行)

最後要會一兩個腳本處理數據用。awk+sed, 或者土一點用perl也成。再懂點sql就更好了.

說到底,coding是idea的體現形式,但不是idea本身。pm手上book size大的,可以養一兩個desk quant幫你寫,或再養個碼農做execution. book小於100mm的, 上面這些弄好了,光桿司令也不是不可以(只要有中後台給你做settlement和financing).


首先恭喜你猜對了,他們騙你的。

想在交易行業中做一個優秀的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這條路,要有不斷學習新技能的覺悟。像我們這些計算機出身的人,也要去補之前沒學過的數學和金融。大家的背景不同,起點優勢不同,但是努力的方向是一致的。

只有打通任督二脈的那一天,你才會成為真正的英雄。

到那時,你才不會再被代碼困擾,只因為你心中已然無碼。

若上天再給你一次機會面對那個意中人,

請記得告訴她:

只是因為在人群中多看了你一眼

再也沒能忘掉你容顏

祝你幸福。

(全劇終)

~~~~~~~~~~~~~~

註:

有人問到我提到的分析軟體組合。Mathematica, R, Java/Scala這三者可以任兩者組合互通,我有時甚至三者連起來用。參考資料請看:

J/Link User Guide

rJava - Low-level R to Java interface

Rengine

這當然不是唯一的技術棧。此間精髓僅在於靈活運用計算機知識進行組合搭配,打造最適合自己需要的終極大殺器。


謝邀!

簡單說一下吧,其實在任一行業,要成為優秀的軟體工程師,編程水平都應該是要求比較高的,一方面要深入了解行業知識,另一方面要能把相關業務通過編程實現出來,熟練掌握至少一門編程語言是必須的,假定你暫時不是在美國這類的地方做高頻交易,還不需要用到FPGA, 或GPU編程(CUDA計算)這些相對另類的做法,你不會C/C++也是可以的,現在也有用JAVA來寫交易策略的,用Python的也很多,R更多是用來做模型研究,國內對應的好像Matlab多些,大家都用,為了便於交流,可能也會被動地改用Matlab, 總之,這個要看團隊的頭怎麼選擇。

另一方面,Quant的工作其實很雜,經常會遇到數據的預處理,比如,載入到數據分析工具中,甚至還要做一定的數據清洗工作,這類工作可能需要編寫一些特定的小程序來處理。然後才能比較方便地用Python或R或Matlab來分析,同時也可能需要對數據進行分段分區處理再合併。

等模型研究完成後,就可以通過編寫交易策略來驗證,這個過程中需要考慮的東西就更多一些,比如實時行情的訂閱,歷史行情的準備,其他相關數據的預載入等,在策略的初始化工作都要預先準備好,在策略收到行情的處理邏輯中,需要考慮演算法的性能和效率,可能需要比較強的演算法設計和實現的能力,甚至一些估計值的計算方法,不過好在這些大部分有前輩的論文作為參考,有些甚至有開源代碼的實現,交易策略的實現中,對編程的要求是快速實現交易思路,並且要防止各種邊界錯誤,保證能穩定地按預期運行,儘可能地避免不必要的錯誤,對Quant的要求是編碼規範性要好,邏輯的考慮要做到全路徑覆蓋,各類邊界條件要考慮清楚,避免不必要的錯誤,另外,能自己編寫一些測試用例會更好,這樣每次策略修改後,能做一個基本的跑通測試,再經過模擬交易後容易快速上線。

Quant trader是個相對而言有些特殊性的行業,不太像其他行業,Quant的工作相對而言比較難以產品化,也就是說,交易思路可能變化很快,如果總是依賴於別人幫你實現的話,溝通成本會非常高,效率會非常低下,有個基礎平台,比如在現在的大的投行,強大的IT硬體資源、軟體平台、數據、各類中間件等都會讓你的工作變得很容易,基本上只要專註於兩件事情就好了,一是數據分析和挖掘,找到合適的交易模型,二是把交易模型在平台的SDK基礎上實現出來,能通過行情驅動進行交易就OK了。 在這個基礎上,需要掌握的編程水平其實要求並不是太高,主要是把自己需要的數據準備好,適當加工,在演算法方面能夠實現並適當優化就可以了,其他的基本上都可以通過調用現成的服務來完成,具體的細節和實現不用深入考慮,有問題還有相關團隊可以隨時支持。

但如果是需要自己從頭做起,需要的掌握的東西可就多了,從數據接收開始,需要了解網路通訊方面的編程知識、多線程概念、緩存,數據的載入,以及如何實現和優化一些數據的計算公式,有些策略可能還需要用到一些演算法交易,像VWAP,TWAP之類對數據的預處理、速度方面都有一定的要求,因為程序實現變得複雜,多線程之類的問題跟網路糾纏在一起會導致調試工作變得很麻煩,需要比較高的程序調試技巧。

暫時就想到這麼多,總體來講,在有平台基礎的情況下,編寫策略會更簡便,平台的復用也使得很容易定位問題是策略本身的問題還是基礎的底層問題,成熟的平台會對策略的開發編程、和快速產品化起到非常重要的作用。


既然你沒說清楚你想當quant trader/analyst/developer里的哪個,我就都說一下。

我周圍的trader有兩類,一類是計算機專業出身,一般搞高頻的居多;另一類是物理專業出身,搞統計套利的居多。

計算機背景的trader,一般團隊里會帶幾個搞物理/數學的,彌補其數理思維能力的不足;物理背景的trader,一般團隊里都會帶幾個純碼農解決implementation的問題。

根據我的經驗,計算背景trader團隊里的junior們,一般很快就會理解策略和市場,用不了幾年就會成為「物理背景trader」。而物理背景trader團隊里的碼農們,通常都會幹一輩子developer,很少能轉型成「計算機背景trader」。

現在活躍的這些計算機背景的trader們,絕大多數是一畢業就當trader,經歷了2000年前後的hf創業大潮和金融危機後的人員大流動,活到今天的;很少是developer轉型的。

回到你的問題上來,你需要多強的編程能力,取決於你想進入「計算機背景trader的團隊里當analyst」,還是進入「物理背景trader的團隊里當developer」。如果你想進入第一個團隊,你應該努力精通一切「理論上的模型」,包括現在流行的ML和一直很流行的各種基於隨機過程的定價模型。如果你想進入第二個團隊,你大概需要精通底層的各種實現,高並發,高性能,分散式等等hard core的技能。

因為你具體問編程這方面,我講一下我了解到的quant developer的基本要求吧。所有基礎演算法都應該能從理論上推導,照著面Google SDE的要求去準備,大概涵蓋MIT 6006的內容就足夠了,不用太複雜,需要能用C白板編程bug free。需要完全熟悉計算機架構,cpu的原理,編譯原理,最好自己寫過OS,分散式的一些基礎理論和實現。這塊理論方面,我建議你按照two sigma對developer的要求準備。另外,最好有不錯的github的活躍度。

如果是quant analyst,編程要求就小多了,一般看天賦和智商的成分比看技能儲備要大一些。我面人的話一般MIT學物理的天才少年這類的,就算完全不會LSTM也沒關係。這塊對編程的要求主要就是能用python/r/julia/matlab快速實現原型。不過如果你和我一樣,是一個天資平平野雞大學本科生,請務必可以手動推所有主流統計學習演算法、概率論、和所有經典的定價模型。

講真的,沒有什麼高下之分。當一輩子developer,收入的Sharpe可能比我們高多了…


真的沒那麼難,別被他們嚇著了。這個領域,既不需要UI控制,也不需要並行計算等高大上,只需要統計分析,實現演算法,不算極度難。關鍵是勤奮和靈感。

手機打字,簡單說說必備的吧,我是土鱉出身,只撿實用的說。

1. 資料庫和SQL必須精通,這是篩選數據和統計分析的基礎。交易數據非常大,請謹慎使用。

2. excel,請別笑話,多維展現數據,進行圖形化數據分析,給你靈感,可以幫助你建立策略。

3. Python,進行策略回測。必須是python,市場變化這麼快,c和c++開發效率太低,根本來不及建模。

以上三步反覆進行,直至最優策略。大部分通過不了,小部分通過了也會失敗,有時還沒實施2次呢就失效了。所以你需要非常勤奮。

高大上的東西可以逐步補充。

市場兇殘,請一定純熟使用上述工具,日日更新策略,否則會被市場玩死。


熟悉金融工程的人都知道,金融工程需要學習許多軟體和編程語言,一般的選擇是matlab,C++,再加上一種統計或計量軟體,如SAS、Eviews、SPSS、stata等,但是金融工程同時還要學習許多艱深的數學知識,需要學習的數學除了一般的高等數學外還包括測度論、隨機過程、鞅過程、偏微分方程等等,更不用說還要學習經濟和金融方面的大量知識。如此多需要學習的東西嚇跑了一大堆人,也不符合現代科學越來越細化、專業化的要求,學的太多,學習時間不夠,導致很難深入金融工程內部,更別談創新了。

有鑒於此,我們有必要研究怎麼把寶貴的時間用在數學基礎知識和經濟金融領域知識上面,至於工具軟體和編程語言,能簡化盡量簡化,畢竟我們又不做程序員,沒必要學的太深。其中統計或計量軟體中最強大的無疑是SAS,那麼,能不能用一種工具代替或者近似代替matlab、C++和SAS三者呢?完全地代替顯然是不現實的,只能儘可能地從最大程度上代替它們,我的選擇是python。

python是一種動態編程語言,語法很簡潔,某種程度上類似於matlab和SAS,結合python的幾種強大的科學計算類庫:NumPy(主要是數學基礎方面的)、SciPy(數值計算上很強大,包含NumPy)、SymPy(符號運算庫)、matplotlib(繪圖庫)、Traits(程序界面庫)等,可以近似地替代matlab、C++和SAS三者。原因在於:

第一,python首先是一種完整的動態編程語言,雖然執行效率比不上C++,但是開發效率遠遠高於C++,學習成本較小,對於金融工程這種專業來講比C++更加合適,畢竟我們自己做模型的時候更在乎的是如何快速實現模型,而不是模型運行快幾秒鐘,當然對於金融方面的大規模產品,還是用C++更加合適,這就是程序員的事情了,我們一般不會去編寫幾萬行代碼的程序。從這個方面來講,python可以代替C++。

第二,python利用NumPy、Pandas、SciPy、SymPy、matplotlib等類庫,可以完成matlab 90%以上的功能,欠缺的只是極特殊的函數。而且這些都是免費的,中國現在雖然盜版很嚴重,但是明顯正在向正版化的方向發展,以後誰保證能得到免費的matlab?這些類庫也在一直發展中,超過matlab只是時間問題。不僅如此,python利用它的界面庫做程序界面是非常方便的,用的VB的都還記得可視化編程的爽快,python也可以實現,而且可以實現的更好,這是matlab遠遠不足的地方。利用這個功能,我們可以用python做好程序後發布給其他人使用,就像使用word這種程序一樣,這種方便程度是目前matlab遠遠不及的。再比如我們要抓取網上的一些數據,利用matlab就比較麻煩,而利用python就極為簡單。python可以大大加快我們研究的自動化程度和簡單程度,需要的只是好好學習一段時間python而已。

第三,python代替SAS。這個方面其實python沒有明顯的優勢,在統計功能上比不過SAS,但是利用python的好處在於:我們不需要再次學習SAS語言,特別是對於金融工程專業來講,沒有那麼多時間和必要性去學習SAS,我們又不是搞專業數據統計的。SAS的大部分功能python都可以實現,不過實現起來比SAS困難一些,對於金融工程專業的人來說,選擇SAS還不如選擇python+Eviews的組合,Eviews是非常簡單,幾乎不需要學習。python的學習比較簡單,也非常值得。

選擇python的最大好處在於可以節省學習的時間,而且彈性較強,可以適應未來多變的需求。剩下的時間不如去好好研究下怎麼在金融工程理論與應用方面創新,就不需要浪費時間在學習工具上了。


說說外匯trade的經驗,以下說的都是這個,有些偏題。

提供借鑒而已。

俺也算是外匯玩家,畢竟活下來了。

但是距離我理想的trader,還有差距。外匯交易,跟quant有所不同,但是共通點更多。

鄙人代碼經驗極其豐富,但竊以為碼農到trader,實在只是極少數成功者。

也許因為幾乎所有的寬客都來自這個行業,使你誤以為只有碼農才能當好quant。

編程其實只是其次,最難做到的是對交易本身,對操作者自身,以及相關而來的概率的含義,有深刻透徹,近乎完全正確的理解。不正確不完整不通透不要緊,但是你必須知道自己米有完全弄懂,這時候理論絕對不要用於實踐,直覺都比理論可靠。重要的不是不懂,而是絕對不要對於不完全懂的事務,下達任何結論。尤其是金融理論和概率高手,最容易犯「剛愎」錯誤。

然後就是紀律,嚴格的執行紀律,才能保證你成為survivor。你不是賭徒,牢牢的記住和執行這一點並不容易。有人認為紀律應該在第一條。但我認為,如果在對市場對人性的理解上無法進步,你永遠無法成為一個偉大的trader。


有兩撥人,一波從金融工程出發的,一波從計算機出發的,路數不一樣,金融工程出發的人更注重策略的開發回測,調試最優化什麼的留給第二波的吧。


想在華爾街 當量化交易員 出國讀研 選什麼專業合適 多謝回復


個人覺得最重要的是策略的測試與優化,這個不限於編程語言,可以是C/C++/Java,或者任何一個,比如有的用weka,有的用R等外部的工具,用java和C++調用都行。關鍵是策略的本身,當策略經過測試之後,成熟了,要上線了,可以根據交易系統的特點選用技術,比如鏈接CTP用C++較好,也可用java,不過這步我覺得最簡單了。策略的產生、測試、優化是最負責的,也是最有難度的。


哎,都是為了賺錢,相煎何必太急. 滿足了以上諸位所描述的所有條件, 不一定就能做的多好. 自己只要有一兩個強項, 也可能開天闢地. 我認識些賺了錢的人其實也不懂多少...

不過, 硬體達標, 機會是要多很多.干這個的,思路重要,邏輯上講得通, 恰好又能匹配當前(近期)市場, 說不定就OK了, 比會寫OS重要多了, 反正我不會寫OS.

交易不僅是科學, 也是哲學, 心理學. 我自己在思考策略的同時, 更多的是從數學以外的角度去思考背後的市場邏輯, 邏輯看起來差不多了, 搞個模擬, 大致測一下概率分布, 做到心中有數, 了解需要迴避的場景就好了. PS我主要面向A股和股指期貨市場(非商品), 除了套利外不做其他類型全自動交易.

相對微觀交易量化研究, 我更重視對大盤和板塊的分析, 這個就不怎麼靠多高深的計算機水平.但分析時需要用的系統確實是完全獨立搭建起來的, 比如說網路層, 分散式處理服務等, 這可能需要一定的計算機水平, 我是賴, 不想去學習新東西, 也怕用別人的遇到問題的時候解決不了.但毫無疑問現成的成熟框架會做的更好, 門檻也更低.

所以有夢想的兄弟們就入門吧,不要怕,都是那麼過來的,管你是學什麼出生.


我是從計算機學習


有些人亂講

幾十g怎麼能算大數據

金融里 中數據多 sql l夠用了


推薦閱讀:

什麼是隱含波動率 (Implied Volatility) ?
如何評價 2015 年 Quantnet 排名?
存在商用的 option pricing 軟體么?
什麼是 Risk Quant?主要的工作內容是什麼?
怎樣用R畫股票秒級的連續時間序列走勢圖?

TAG:寬客Quant |