對海量增長的高頻數(shù)據(jù),關(guān)系型數(shù)據(jù)庫多次崩潰。在對 DolphinDB、MongoDB 和 KDB+ 進行充分調(diào)研對比后,辰鈺投資選擇了高性能、易學(xué)習(xí)、同時提供豐富金融函數(shù)的時序數(shù)據(jù)庫 DolphinDB。在DolphinDB 的助力下,辰鈺投資的量化投研效率得到極大提升。本文將由辰鈺投資分享使用DolphinDB的具體實踐。
本文作者:辰鈺投資 董事長 李棟,董事 陳志凌, 高級工程師 蘇虎臣
圖1 辰鈺的核心策略發(fā)展圖
目前辰鈺投資使用的系統(tǒng)可以輕松實現(xiàn) Tick-to-trade 微秒級延時,支持多策略、大并發(fā)報單,同時支持券商多種風(fēng)控模式,形成了低延時、高并發(fā)、強風(fēng)控的顯著優(yōu)勢。
投研到交易,全流程效率提升
在系統(tǒng)中,我們使用高性能時序數(shù)據(jù)庫 DolphinDB 來幫助提升投研和交易的生產(chǎn)效率。面對每天 20GB 左右的新增數(shù)據(jù),DolphinDB 在我們的研究端起到了支撐作用。目前我們的主要業(yè)務(wù)是數(shù)據(jù)挖掘和策略研究。在做量化的過程中比如進行因子挖掘、性能計算時,對數(shù)據(jù)處理的性能要求非常高。在使用 DolphinDB 后,業(yè)務(wù)效率提升了5-10倍。
圖2 DolphinDB 的系統(tǒng)架構(gòu)圖
首先,我們使用 DolphinDB 進行數(shù)據(jù)的準(zhǔn)備、清洗和挖掘。比如數(shù)據(jù)清洗。隨著數(shù)據(jù)量的持續(xù)增長,難免出現(xiàn)殘缺、錯誤或者重復(fù)的數(shù)據(jù),那么在進行因子挖掘、策略研究等操作前要先找出并消除這些不符合規(guī)范的數(shù)據(jù)。之前使用的數(shù)據(jù)清洗工具的性能會隨著數(shù)據(jù)量的增大而下降,無法處理 TB 級別以上的數(shù)據(jù)。但是通過 DolphinDB 內(nèi)置的分布式文件系統(tǒng),合理設(shè)計分區(qū),分布式計算與數(shù)據(jù)清洗性能基本不會隨著數(shù)據(jù)量的增大而下降,目前效率提升超過70倍。
其次,使用 DolphinDB 強大的流數(shù)據(jù)功能助力指數(shù)增強、CTA、套利等方面策略研究。比如中證500指數(shù)增強,我們以大量全新的 Alpha 因子為技術(shù)核心,同時結(jié)合全新改版的交易算法和日內(nèi)回轉(zhuǎn)交易算法進行選股。在研發(fā)環(huán)境中,以行情回放的方式模擬實時數(shù)據(jù)流,通過流數(shù)據(jù)訂閱發(fā)布機制和時間序列聚合引擎、響應(yīng)式狀態(tài)引擎、橫截面引擎等多種流計算引擎,實時高效地計算主買、主賣等量價指標(biāo),極大地提升了研發(fā)效能。
最后,我們使用 DolphinDB 的分布式計算功能處理高頻數(shù)據(jù)。研發(fā)策略時,需要處理大量的逐筆行情數(shù)據(jù),之前使用的關(guān)系型數(shù)據(jù)庫的性能非常差,遠遠不能滿足我們的業(yè)務(wù)需求。DolphinDB 的分布式架構(gòu)可以輕松實現(xiàn)對海量數(shù)據(jù)的毫秒級快速訪問和計算。再比如處理一些股票或者標(biāo)的,每天要進行幾十萬、甚至上百萬筆的自動交易,關(guān)系型數(shù)據(jù)庫很難對此進行處理,但是 DolphinDB 可以快速基于逐筆數(shù)據(jù)建立策略,極大提升了研發(fā)效率。由于團隊的技術(shù)人員大多熟悉 Python,在實際使用中,我們將 DolphinDB 封裝成一個庫,可以通過 Python 直接進行訪問。僅僅通過一行命令就可以高效、充分地使用 DolphinDB 的海量存儲和快速計算功能。
存儲大 PK
在使用 DolphinDB 前,我們先后使用過文件系統(tǒng)、MySQL 和 PostgreSQL 存儲數(shù)據(jù)。
之前使用文件系統(tǒng)會先將數(shù)據(jù)落在本地,然后用 Python 進行計算。但是文件系統(tǒng)在實際應(yīng)用中存在一些不足。首先,在存儲過程中文件系統(tǒng)的 IO 是一個很大的瓶頸。其次,在處理大量數(shù)據(jù)時,文件系統(tǒng)過于龐大,進行存儲、查詢等操作費時且費力。同樣地,MySQL 和 PostgreSQL 這兩個數(shù)據(jù)庫在實際測試中都非常慢。如果要處理的數(shù)據(jù)量很大,系統(tǒng)甚至?xí)o法工作。
因此,我們想要搭建一套新的系統(tǒng)。主要考慮的數(shù)據(jù)庫有 DolphinDB、MongoDB 和 KDB+。
由于 Mo
ngoDB 缺乏函數(shù)支持、舊代碼改起來比較費勁,KDB+的語言較難學(xué)習(xí),整體上手很慢,所以我們放棄了這兩個數(shù)據(jù)庫。
反觀 DolphinDB,性能比 KDB+更好,語言類 SQL 容易上手,同時提供豐富的金融函數(shù)。在低頻轉(zhuǎn)向高頻的過程中,原來的系統(tǒng)無法處理驟然劇增的數(shù)據(jù),但 DolphinDB 是這方面的專家,相較之下新系統(tǒng)的速度可以提升10倍左右。在處理逐筆數(shù)據(jù)時,相比之前使用過的文件系統(tǒng),現(xiàn)在的系統(tǒng)效率得到大大提升,并且使用起來也非常方便。此外,DolphinDB 作為一站式數(shù)據(jù)庫,綜合了分布式存儲、編程建模和高性能計算,可以在研究時快速抽取某些特定的數(shù)據(jù),這大大加快了我們的研究進度。
代碼“驚魂”
因為之前的很多業(yè)務(wù)都用 Python 進行相關(guān)計算,所以需要將代碼轉(zhuǎn)移到 DolphinDB 中。當(dāng)時發(fā)生了一件極其反常的事情——用 Python 和 DolphinDB 分別計算同一個問題,但最后得到了不同的結(jié)果!
究竟哪個計算結(jié)果是對的?為什么會發(fā)生這種情況?會不會影響到實際生產(chǎn)?
帶著這些疑慮,我不斷進行調(diào)試,最后發(fā)現(xiàn)原來是Python的腳本出現(xiàn)了編寫失誤。一個因子有很多計算方法,必須深入到每個因子的具體需求才能對應(yīng)實現(xiàn),相應(yīng)的代碼也會較為復(fù)雜。當(dāng)時 Python 的腳本中使用了很多嵌套循環(huán),編寫的代碼較多較復(fù)雜,難免出現(xiàn)腳本編寫錯誤的情況。但是 DolphinDB 的語言非常簡潔,實際中不需要那么多循環(huán),只要一行代碼就可以全部解決,這大大降低了腳本出錯的概率,同時也可以減輕開發(fā)人員的壓力,有效提升研發(fā)的效率。
本文最后
我覺得想要用好 DolphinDB,關(guān)鍵在于理解架構(gòu)。只有清楚一些技術(shù)細節(jié)比如分區(qū)表的設(shè)計原理,才能高效使用工具進行量化投研。剛開始使用 DolphinDB 的時候,我發(fā)現(xiàn)使用時系統(tǒng)的反應(yīng)速度并不是特別快,后來研究了 DolphinDB 的底層架構(gòu)后,我重新優(yōu)化了代碼,發(fā)現(xiàn)速度立刻提升了很多。所以我覺得 DolphinDB 比較考驗使用者的水平。使用不同的設(shè)計方法解決具體的業(yè)務(wù)問題,會得到完全不一樣的效率。
在此簡單分享我司使用 DolphinDB 提升投研效率的經(jīng)歷。希望有更多的朋友了解并使用高性能時序數(shù)據(jù)庫 DolphinDB!