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