上一篇總結了一些入門的知識內容,本文結合個人經驗,總結編程軟體方面的內容,對各種軟體在量化上的應用做一個對比,供參考。首先我的觀點是,沒有最好的軟體,只有最適用的領域,先明確自己想做的是什麼,再選擇最合適的軟體。這不是一篇廣告文,也不是百度複製粘貼的結果。
我個人來說,最開始是大二做數學建模開始學matlab,不過現在來看其實建模用python也挺好,不明白為什麼當時所有的人都會推薦matlab,可能已經是一種傳統了吧。之後大三上統計課學習了R,上計量課學習了stata,之後大四研究生實習又學了python,vba。整體就是這樣,接下來分軟體說說自己的體會。
MATLAB全稱matrix laboratory,特性也跟名字一樣,對矩陣的處理功能非常強大,對不能裝到矩陣裡的元素比較吃力,當然也可以是我菜。
先說優點,量化或者數據分析來說,正如前面說的,matlab對矩陣的支持非常強大,二維以及更高維的矩陣,雖然python,r裡面也有矩陣這樣的數據類型,但感覺沒有matlab的好用,比如python裡的矩陣,剛開始學經常會被矩陣裡的中括號搞的很暈,二維或者以上的矩陣,每個元素都會帶一個[],matlab看多了用這個會有點不習慣,比如下面這些。
相比較來說,matlab的矩陣就非常簡潔了,至於支持矩陣運算和向量化的函數,這個各個軟體基本都差不多。
缺點來說,matlab對字符串的支持不是很方便,尤其是做量化很多時間都要考慮到日期,股票代碼等等文本數據,矩陣裡只能輸入數值形式的,字符串只能放到cell,struct,或者fints裡面,但這些的運算操作就沒有矩陣那麼方便了。一般都會用cell2mat,fts2mat之類的函數先轉成矩陣再處理。
此外,老版本的matlab沒有帶標籤的數據格式,類似python,r裡dataframe這種,用矩陣的話,需要自己記住每一列代表什麼含義,這種情況下自己寫還好,但看別人的代碼會非常痛苦。 新版本的裡面有table格式可以解決這個問題,但碰到的大部分用matlab的人都還是習慣用原來的那些數據類型。
還有,matlab中各種機器學習算法沒有python,r那麼全,如果是做這方面的話肯定不會選matlab。
最後,matlab不是免費的,雖然個人可以用破解的,但企業用破解的還是有風險,而且太大了,裝個python才幾百M,matlab幾G。
python應該是目前在量化/數據領域最廣泛應用的軟體了,之前實習也基本是用python,不論是數值還是文本數據,都能很好處理,而且也有各種算法模塊可以直接調用,省去了自己編寫的麻煩,語言也很簡潔。
所以如果是工作中用的話,最建議學的還是python,只要會用python裡的numpy,pandas,scipy,matplotlib,sklearn,一般的問題都能處理了。
但python也有他不適合的地方,python在量化上比較適合用在數據處理和回測上,但如果要做一些其他的就會存在一些問題,後面說sas的時候會舉一個例子。
R經常會被用來跟python做對比,我自己用下來的感覺是,量化/數據上能用python做到的,r都有類似的模塊可以做到,非常同質。之前刷kaggle也是用R刷的,各種機器學習算法也都有,沒什麼影響。
會有一些很細節的地方,可能r裡面有但是python裡面沒有,比如copula函數相關的,python裡面只有一兩個模塊,而且功能非常簡單,但r裡面有若干個模塊可以調用,而且有很詳細的說明文檔,所以如果做這塊不想自己寫的話,用r會好一些。
不過去實習下來感覺用R的非常少,學校裡老師上課寫論文倒是用R多一些,所以可能R更學院派一些。而且r跟其他語言交互一定沒有python方便,這也使得r的性價比低了不少。
SAS也是大三上統計課的時候學過,但這個我學的很粗淺了,非常不熟練,但印象非常深刻,因為實習時候碰到的一個具體問題。
SAS也是各種算法模塊都有,這一點跟上跟python,r不會差多少,但sas的代碼寫法跟其他軟體不太一樣,用多了python,r去寫那個還是感覺怪怪的。sas可以對一個命令逐行去運行,不需要自己加循環,可以少寫一點代碼。SAS有一些函數的默認跟其他軟體不太一致,比如merge函數,其他軟體一般是默認內連接,只保留匹配到的,但sas默認是外連接的。
SAS有一個非常好的特性是提取資料庫裡的數據,create table生成的數據是存在硬碟裡的,而python,r等等其他軟體提到的數據都是存在內存裡的,這樣就沒法用python和r提太多量的數據出來,而用sas甚至可以直接把全量數據提出來用,這樣的特性在一些時候會非常有優勢,比如在指數編制時候,python,r就有些廢了,成分股跟全量股票匹配再跟分紅配股股權分置等等這些做匹配的話,用python沒法一步到位,內存會爆掉,只能一期一期循環,但是用sas就很方便了,直接create table然後用sql語句匹配就可以了。
而且因為資料庫中是可以通過between語句進行時間點和時間範圍的匹配的,SAScreate table之後也可以,比如A表裡每行是具體的年月日,B表裡每行是起止時間段,這兩個表是可以根據起止時間段匹配的,但是python的pandas包以及R裡類似的包裡沒有這種操作,如果要實現點跟範圍的匹配,只能循環。這也是其他軟體不及sas的一點。總結起來SAS優點在於大數據和各種需要跟資料庫交互的操作。
SAS缺點也很明顯,非常大,十多G,很佔空間,啟動慢,而且還是收費的,破解很麻煩,所以選擇這個做量化回測的應該很少了,做風控數據還有指數編制的挺多。
VBA是比較特殊的一門語言,內嵌在OFFICE中,是VB的簡化版,不僅僅是針對EXCEL了,WORD,PPT裡都可以用,有時候也叫宏,基本是一樣的,只不過VBA是碼的,宏是錄的。
VBA最為人詬病的地方是他的編譯器實在是太垃圾了,而且還沒有其他插件可以支持,只能用官方的,長成下面這個樣子,excel/word裡按alt+F11可以打開。
看上去跟常見的編譯截面都差不多,有文件窗口、變量窗口、編譯窗口,歷史記錄也是有的,但真的去寫一兩次就知道有多坑了,debug非常不方便,報錯提示你可能根本不知道他在說什麼,不會像其他軟體那樣提示的很具體。
所以我一般能錄就錄,能不寫就不寫,錄的邏輯是,你可以在excel把你想通過代碼實現的功能操作一遍,編譯器裡會自動生成代碼,直接運行的話效果跟操作時一模一樣的,再稍微改一改就可以用了。但這種方法比較有局限性,他僅限於你的操作時能在當前的excel裡能內完成的,比如畫個圖,調個格式,做個數透什麼的,但如果你要把一個文件夾下幾千個excel併到一起執行一些操作,這就只能忍受垃圾編譯器慢慢寫了。
VBA最強大的地方在於跟OFFICE的交互,進而實現批量和自動化,這個是前面幾種語言比不了的,比如你可以用python/r做統計分析把數據輸出到excel裡,然後再用vba作圖/算各種統計量最後出一份報告或者做一份模板,整個流程最終可以實現自動化。
可以通過vba把excel的一張表視為資料庫中的表,用select語句進行操作,如果數據量很大的話,上百萬,直接操作分分鐘卡死,用vba會很快。
個人理解,excel中寫vba儘量減少激活各個sheet單元格,跳來跳去,有什麼東西可以直接往裡寫,這樣會快一些。word裡難度在於定位,excel因為是矩陣,有行列標好一些,word一種可以先把整個文檔都畫上無色的表格,然後表格內進行定位會容易一些,還有一種是控制光標的移動,設定移動單位,慢慢調。
STATA和EVIEWS是兩個功能非常類似的軟體,計量上用的比較多,我當時選擇了stata,沒有學EVIEWS,整體來說,都是計量軟體,STATA對面板數據支持比較多,EVIEWS對時間序列支持更好,STATA需要碼代碼,EVIEWS可以碼代碼,也可以用滑鼠點點點。
量化/數據上偶爾也會用到,比如做一做協整之類的檢驗,回歸等等,但必要性不是特別強,pyhon也可以完成。
如果你說SQL不算程式語言,我也贊成。
SQL是取數據必須用到的語言,所以這個必須看一看,基本上會SELECT,WITH語句就可以了。建庫,寫入等等的操作,實習生基本上是不會有的,所以除非你打算用自己的電腦建個庫,也不用太關注,用到的地方很少。
綜上,觀點很明確,如果你一定要學一門語言,個人感覺學python性價比最高,一方面基本上你所有需要的操作用python都能搞定,另一方面,python跟r很類似,python的numpy跟matlab邏輯差不多,會這一個以後需要學別的也能很快上手。
如果你一定要學兩門語言,或者說雖然不做量化/數據,但是我還是想學一門,我建議學VBA,會讓你的OFFICE非常溜。搞個下拉菜單,事件什麼的,更會讓別人對你刮目相看。
當然以上的並不全面,如果你是做高頻方面的,可能還需要學C++,如果是做數據可視化的,多半還需要Tableau。但不管怎麼樣,有空的時候還是先學一點比較好,臨時抱佛腳這種事情,絕對不適合零編程基礎的人。
最後,也想聽聽大家的看法!