對 Quant 而言 Python 的需求高嗎,除 C++ 外還有哪些流行的編程語言?
Python是非常適合做quant類工作的語言,本身就是科學計算方面的統治級語言,現在加入了IPython,pandas等重量級神器,為Quant類工作量身定做,而且仍在飛速發展中,以後會越來越重要。
關於其他語言,首先介紹一下我自己最喜歡的一個比較小眾的組合,Mathematica+Java/Scala。 Mathematica的優點在於:本身提供函數式的編程語言,表達能力非常強大,比如Map/Reduce是標配,很多時候不需要去做煩人的for循環或下標控制,排版經常可以直接照數學公式原樣輸入,即直觀又不容易寫錯;代碼和輸出混排的排版方式使得建模時的演算和推理過程非常流暢,甚至還可以直接生成動畫,對於找直觀理解非常有幫助(這幾點分別被IPython和R偷師了一部分)。Mathematica的缺點在於對金融類的時間序列數據沒有很好的內建支持,使得存儲和計算都會比較低效,因此需要用內嵌Java的方式來補足,對於數據格式或性能敏感的操作都可以用Java/Scala實現。這個組合在我心目中無出其右,不論是快速建模,還是建模轉生產,都遠遠領先於其他選擇。但Mathematica的商用授權很貴,如果公司本身不認可的話很難得到支持,這是最致命的缺陷。另外隨著Python系的逐漸成熟,領先優勢在逐漸縮小,長遠看Python的勢頭更好一些。
其他答案里也列舉了不少其他語言,我自己既做Quant的工作,也做軟體開發的工作,這裡想從一個軟體工程師的角度,說說我的理解。平時工作中會和一些偏Quant背景的人合作,很容易發現建模能力好的人往往在計算機方面基礎比較薄弱(因為以前的訓練重點不在這裡)。他們也可以快速學習掌握一種像C++,Java這樣的語言,實現很多必要的功能。但是一方面這些語言陡峭的學習曲線和繁瑣的開發步驟會給他們真正要做的工作增加不必要的負擔,另一方面一旦涉及到性能敏感的情景,他們對計算機體系結構缺乏理解的缺點就容易暴露,比如說很可能他們沒有計算複雜度,內存碎片,cache miss,甚至多線程等概念,導致寫出的程序存在相當大的隱患。
即使是計算機功底紮實,如果每天的工作需要在C++,Python,R/Matlab,甚至一眾腳本語言之前來回切換,思維負擔也會非常重,人的精力是有限的,很難同時兼顧數學建模和底層代碼調試這種差距巨大的工作。長期發展下去最可能的結果就是要麼遠離建模,專心做生產環境開發,要麼遠離生產環境,專心建模。這種局面顯然不論對個人還是團隊都是有很大弊端的。
如果深入思考這個問題,相信不難得出結論,對於Quant來說,C++這種相當面向機器的語言肯定不是最佳選擇。的確在歷史上,它比更面向機器的C已經友好了很多,但是在計算機技術飛速發展的今天,如果還需要Quant大量使用C++做建模類的工作顯然是很遺憾的事情。設想一下你拿到一份股票數據,不論你是想分析價格走勢,成交量分布,還是波動性,第一件要做的事一定是畫出圖來看看,有一個直觀認識。如果你的工具是C++,肯定有很多時間花在編譯,調試,再編譯的過程上,好容易能解析文件了,接下來怎麼算移動平均?怎麼算波動性?全都要自己寫代碼。再然後怎麼畫圖?這整個工作流簡直慘不忍睹,這些問題浪費掉你大部分精力,而他們全部和你真正感興趣的工作毫無關係。所以如果你是一個數理金融等背景的新人打算開始Quant生涯,在決定是否要投資到這項重量級技術上時需要慎重,即便它目前的市場定價可能仍在峰值。相比之下我認為Python會是更理想的選擇,即能很好的完成建模工作,也可以訓練一定的編程技巧,使你在必要時也能勝任一些簡單的C++工作。
最後同意 @袁浩瀚,不要拘泥於語言,不論學習那一種,對其他的語言還是要抱有開放的心態。另外世界變化很快,你會發現單一的語言分類方式其實是沒有意義的,每一門語言在發展過程中都會逐漸吸收其他語言的特性,比如Python本身就既有C/C++/Java那樣命令式的特點,也有函數式的特點,像pandas甚至還提供類似SQL的使用方式,在其他語言或系統里也都或多或少包含了不同的特點,可以在學習過程里慢慢體會。
謝邀。很抱歉這個問題我三天前有看到,當時欲答又止,因為我發現我可以兩行答完這個問題:
1、高
2、還有:Python, Java, Matlab, R, Q和某些公司內部自有語言(如高盛的自有語言)
但是我不希望敷衍了事,如果回答就展開了說,說說我心中最重要的五類語言。這不僅僅是對於一個Quant必須的,而是一個豐滿的程序員所必備的。在藝術中,藝永遠比術重要;在Quant相關知識中,intuition永遠比純technique更加重要。
兩年前在Princeton,我和一位研究計算機語言的PhD兩人吃飯聊天。他的主要研究方向就是新的計算機語言,及相關的邏輯學。大神如他一頓飯下來80%的時間處於放空狀態,基本沒在關注我,但我得到了我自以為深刻的理念:一種計算機語言是一種對應哲學的體現。
因此,在我看來,有五類語言構建了一個豐滿的編程能力強的Quant的一切,它們分別是:效率類語言(C、C++、Java等)、膠水類語言(Python、Ruby等)、科學類語言(Matlab、R、S等)、Alpha演算類語言(Lisp、Clojure等)、查詢類語言(SQL、Q等)。這是基於我理解淺薄的分類,完全與計算機科學的規範化分類(如面對對象語言、函數類語言)不相容。持不同意見者大可付之一笑。
1、效率類語言(C、C++、Java等):老派的Quant很多都是C++高手,特別是80年代湧入華爾街的那幫MIT的高能物理博士們。在那個年代,可以選擇的語言不多。要麼就Fortan,要麼就C/C++了。所以在當時基本上這些語言同時充當著基礎架構(infrastructure)和數值計算(比如Monte Carlo)的雙重目的。但是現在各種膠水類語言、科學類語言多了起來,而且由於單機性能越發強悍,效率再也不是唯一的訴求了,因此目前C++、Java大量應用於金融系統級的開發,和對於效率要求極高的實時定價等領域。從一個Quant的角度來看,這類語言最大的特點是快,編程複雜度高,維護難,同時原生語言普遍不支持向量運算。
2、膠水類語言(Python、Ruby等):我必須承認,這些語言是新世代Quant的福音。在國內工作的時候我目睹並參與了一個將原有的C++框架全部用Python重寫的項目,而現在JP Morgan這邊利率類產品的定價軟體也在從Java像Python轉移。實現同樣的代碼,Python、Ruby的實現速度比效率類語言快很多,而且在機器速度越來越快的今天,差距已經不是不可接受。這些語言最大的特點是比較快,編程複雜度高,維護相對簡單,同時大量的包(比如Numpy+Scipy)可以輕鬆實現向量運算。
3、科學類語言(Matlab、R、S等):一般而言,科學類語言最大的特點是支持向量運算,同時各種附加數學、統計包極其豐富,但運算速度無法與前兩類相比。在一個具體的投資/交易策略、模型投入實際使用前,你需要快速的去實現(Implement)和驗證(Back-testing)你的想法。這個時候,科學類語言就有絕對的優勢。驗證思路有效後,再用效率類語言或膠水類語言開發成系統級組件。你可以理解為科學類語言是用來造概念車的,而前兩類語言是用來量產的。而在具體的職業角度,造概念車的這幫人一般是Pure Quant,而實現量產的很多是Quant Developer。當然也有兩者合一的集大成者。
4、Alpha演算類語言(Lisp、Clojure等):我第一次對這類語言感興趣,是12年冬天接觸矽谷一家科技公司時(Prismatic,人工智慧新聞App),發現他們在用Clojure,也極力向我推薦Clojure。Clojure是基於Java封裝的語言,可以用Java虛擬機執行。但歸根結底,Clojure是Lisp這類語言。之前我長期沉迷於過程編程與面對對象等概念之中,第一次接觸Lisp很不習慣,但後面開始感嘆於這類語言之美。我個人感覺目前Quant界用這種語言偏少,但是不排除以後流行的可能。
5、查詢類語言(SQL、Q等):SQL就不必說了,金融公司很多時候都是使用Oracle等關係型資料庫,SQL是基礎。而我之前幾次面試也遇到了SQL的問題。Q是Morgan Stanley為了應對金融中的海量數據而採用的一種非關係型查詢語言,特點是極快,有SQL的基礎可以很快掌握。
全面的說:如果你是做Pure Quant,整天與交易策略和模型睡覺,那麼2、3是必須的;如果你是開發為主,或者是Quant Developer,那麼1、2、5是必須的;如果你立志讓編程不成為你做Quant的障礙,那麼1-5全都是必須掌握或至少了解其思想的。
不管是作為Quant還是Coder,都不可拘泥於語言。語言只是其背後設計哲學的體現。這就等同一個數量金融從業者不可拘泥於產品一樣。數量金融的根基永遠是供給需求、金錢時間價值這些基本的經濟學理論以及現金流的相關概率這些基本的統計學思想。如果拘泥於術而非藝,那路就會越走越窄。國外的話 比較流行的應該是R+Python,R用來快速實現和驗證你的策略。Python的好處在於速度比較快,移植到C++之類的也比較方便。
國內的情況就比較複雜了。首先是用Matlab的比R多多了,國外有版權問題,國內幾乎沒有這個問題,學校裡面又以教Matlab的巨多,所以導致了畢業以後用Matlab的人比較多。從金融工程的使用者來說這個比例應該在4:1到5:1之間。其次Python也有一些用戶,但是在行業內比想像的少,更不用說C++和JAVA之類的。
SAS是一個比較特別的異類,行業內有不少人用。當然比不過Matlab,數量應該和R類似,這點上我沒有精確的數字。用SAS的原因主要是因為和SQL之間的交互效率很高,但是SAS的編程方式比較奇怪。
SQL還是很有必要懂一點的,雖然未來的趨勢可能是大家更多的使用API的方式提取數據,但是如果要追求穩定性和速度,落地資料庫的方式還是逃不了的。所以做金融工程的最好還是要會SQL,當然只需要select和複雜的join就可以了。SQL方面,大家主要用SQL server和Oracle。目測MySQL非常少。
最後還有一個大家沒有提到的,但是非常重要的就是VBA,因為Excel的關係,其實VBA是一個很好地實現工具。也很多人用,國外的金融行業裡面VBA的應用也是非常多的,作為快速實現和展示的工具,VBA是非常好的東西。
語言只是工具。重要的是你掌握一種新語言要多少時間,而不是你已經會了多少。談得上基礎的只有C(雖然純quant researcher未必會用它寫一句code),其他都是酌情使用,會用一兩種即可。
quant常用語言標準有以下幾點:1、package豐富程度,2、community活躍度(方便上stackoverflow問題),3、API支持情況,包括maketdata和execution兩類,4、代碼效率,5、多線程和埠通訊能力。五項全能的沒有,python除了4差點其他還可以,適合作主力語言形成系統骨架。R的話只有1-2還成,這幾年有下坡路趨勢。c++/java之類更適合risk和IT做成熟產品,做研究環境太差。functional語言主要還是做risk和pricing的Q quant用的多。
python的效率問題這幾年有numba和pypy提供JIT以後改善很多。13年的問題至今,不知道還有沒有人關注,樓主是否已經總結出自己的經驗?
我是做產品的,坦率講談到編程我也是在學習、探索、理解中,就和大家分享下我的理解吧:
1、關於語言,我就從國內普遍應用角度說,策略研究類:Rmatlab,策略開發類:python,c++、c#;其他還有很多,這裡不贅述。從我接觸國內的情況來看,越來越多的趨向於python和c++的組合,因為用python開發效率更高,而c++執行效率更高。雖說差別『感覺』不大,但是高頻一些的策略,還是有差別。用python的大多都是自己研發的平台,支持python語言的量化交易產品並不多,有掘金、wind、可能還有,不缺定了。其他都是基於一種工具進行深度定製的。
2、對藝和術的理解,感覺像先有雞還是先有蛋的問題。我認為語言是敲門磚,舉個例子:
這和開發工程師一樣,必須總要學習新的東西,了解國外的前沿技術,以前國內的老工程師,都買國外的工程書看,雖然英文看著費勁,但是必須與時俱進。我認為quant更是如此。為什麼?無論從哪個角度講,量化交易,一定是技術驅動的業務創新的。
3、和大家分享一些我的總結:
Pycharm,推薦一款免費的Python IDE
IDE對比,開源才是硬道理
學習鏈接:
Python:
Python | Codecademy
PythonTab:Python中文開發者社區門戶
R:
R語言中文網-R語言論壇
最後分享一個:
做事就要像黑客一樣執著
當然還有一些,python的Ta-lib的東西,就不在這裡寫了。感興趣的可以交流互相學習。
有不足的大家請批評指正。
做這行的要麼會越做越快,要麼會越做越難大,然後越做越複雜。
但是:如果要快,就C++;能做複雜問題的,就Matlab。我的觀點,一個完整高效的交易平台和策略交易系統中,C++ + Matlab是必備最佳的。這是上面提到的五種編程語言里的核心的最佳搭配,其餘的比如資料庫語言,膠水語言,等等的可以人任意發揮。有一點是肯定的,像Python這樣的膠水語言顯然是代替不了的C++的核心作用。
每個Quant組裡因為人員發展原因都會有他們偏愛的程序。出現很多開發語言,不是流行的問題,那是換編程語言,時間成本太高的問題。
做交易員出生的人一般不會C++,花個把星期學一下python比較現實。程序員出生的 C++可以很牛叉,但不了解市場。像Matlab這樣的工具雖然國內用的人很多,也是限於工具運算的多,Matlab的核心是C寫的,但是國內研究過Matlab與C++介面的又有多少人能做到把Matlab當C++用,實現高頻級別的複雜的統計套利策略?
所有無法解決的技術問題時的中間狀態都會歸結於編程能力與時間成本的平衡問題。
所以,如果你有時間又想一輩子做好這行,那麼老老實實學習C++吧。呵呵 Good Luck~嚴格的說,quant需要掌握各種語言,不過perl,python,matlab,r,sql的語法相對簡單。一般python之類的都是做研究用的,真正寫大程序問題很多。寫production code的話還是編譯以後的比較好,C++至今還是主流,當然一般GUI都用C#寫。關鍵不是語言,而是一個人對整個架構的理解,包括演算法,甚至底層知識(內存操作,硬體等)。
Matlab和R就被鄙視了。。。
國外有一個很出名的individual quant非常推薦matlab,畢竟現在收費也便宜了,而且GUI特別友好,研究交易一體化,各種包也全,遇到問題可以直接問他們公司。。。他除了要收費其實沒啥缺點,當然系統太龐大也算缺點吧;
R是統計學家的最愛,也是用C++寫的,現在有RStudio之類的編輯也方便多了。各種包都有。
沒人注意到Julia嗎?雖然Julia的庫目前還不成熟,但考慮到其開發容易程度和執行速度,將來會有一定的佔有率的。
補充一下吧,C++在HFT里目前應該還是不可替代,分鐘級的Algo很多已經是Java了,C++的問題是好程序員少且貴,不容易維護。Q不是MS專屬的,它是KDB自帶的解決方案,理論上也可以用別的API去解決Accessing KDB的問題。
本身沒有最佳答案,適合就好。
那可多了,推薦apama
必須php呀。
那些不說或者反對的,要麼是水平不行,要麼是強迫自己愛好imac式的情懷。國內做量化的Matlab的最多,海龜用R的比較多,然後就是Python、C++/C#等
-----------2017-11-10更新--------------------------
3年時間過去了,現在Python在量化投資領域的應用已經非常普遍了,從量化領域各語言的用戶總量來說,Python快超過Matlab了,再加上現在量化雲平台大都基於Python,也助推了Python在量化投資領域的發展。
推薦:Wind 的萬礦量化分析雲平台(www.windquant.com),有興趣可以了解了解
我們真的需要高頻交易么?只有交易商才需要吧?
從投資收益角度來看,個人認為沒什麼必要去實現高頻交易。所以C++可以排除在外,能看懂就行了。
quant這行比較奇怪,沒人願意交流,也許怕別人賺自己錢,python根本不是問題
編程遇到困難根本不怕,你一個問題上stackoverflow無窮多人瘋狂的幫你解決,python腳本初中生就能寫了,寫不下去可能基礎差點,比如用些pandas,scipy之類
python無論數理統計還是機器學習都有無窮多的package幫你準備好,所以這玩意很簡單
但是假如你一個quant問題扔這裡,基本沒人願意具體答,也只能看點美國論文了解一點
所以難點根本不在編程,難點是你要自己研究strategy,如果自己強大一點去citadel之類學習一下,這公司常年招聘,不要本末倒置
python現在基本是一個全棧語言,我們做互聯網開發也在大規模使用python
優點:簡單,簡潔,表達能力強,海量庫(各行各業比如資料庫訪問/UI/各種網路協議支持/科學計算/統計/人工智慧都能找到現成的庫)
缺點:多線程支持不太好,性能差一些(可pypy, cython解決絕大部分問題),性能要求極高的場合可用C/C++來實現,給python調用
總之,牆裂推薦python
MATLAB:用於金融工程,計算能力強,支持斷點調試。
pyton:用法比較簡單。
R:主要用於數據分析和支持向量機。
C++,C#,java:主要做開發用,也很靈活。
Slang
Python之所以能在Quant流行是因為易學所以美國大學裡使用多,因此產生與數學科學分析相關的專業模塊,量化需要數學分析因此才會選擇Python。c++則在執行交易代碼上有速度優勢,用在交易部分,Python用在分析數據部分。
推薦閱讀: