上海晨宇財富投資管理有限公司是一家專注於國內證券市場低風險投資機會的量化對沖基金。其主要投資方向為a股、期貨、債券。公司秉承「用數據了解市場,用模型分析對手,用復利回報投資」的投資理念,致力於為客戶提供優質的多策略投資管理方案,創造高回報率、低退出的投資收益。
圖1 辰鈺的核心策略發展圖圖1陳鬱核心戰略發展圖
目前我公司使用的系統可以輕鬆做到滴答到交易微秒級延遲,支持多策略、大並發上報,支持券商多種風控模式,形成了低延遲、高並發、強風控的明顯優勢。
圖2 辰鈺投資與 DolphinDB 合作案例宣傳圖圖2晨宇投資與DolphinDB合作案例宣傳圖
投資交易,提高整個流程的效率。
在系統中,我們使用高性能時間序列數據庫DolphinDB來幫助提高投資研究和交易的生產效率。
面對每天20GB左右的新數據,DolphinDB在我們的研究中起到了輔助作用。目前我們的主要業務是數據挖掘和策略研究。在量化過程中,如因子挖掘、性能計算等,對數據處理的性能要求非常高。使用DolphinDB後,業務效率提升了5-10倍。
圖3 DolphinDB 的系統架構圖圖3 dolphin db系統架構圖
首先,我們使用DolphinDB來準備、清理和挖掘數據。比如數據清理。隨著數據的不斷增長,不完整、錯誤或重復的數據不可避免地會出現,因此在進行因素挖掘、策略研究等操作之前,需要找出並消除這些不規範的數據。之前使用的數據清理工具性能會隨著數據量的增加而下降,無法處理TB級別以上的數據。但通過DolphinDB內置的分布式文件系統和合理的分區設計,分布式計算和數據清理的性能不會隨著數據量的增加而下降,效率目前提高了70倍以上。
其次,利用DolphinDB強大的流數據功能,幫助指數增強、CTA、套利的策略研究。比如中證500指數就加強了。我們以大量全新的阿爾法因子為技術核心,同時結合新修訂的交易算法和日內回轉交易算法進行選股。在R&D環境下,通過市場回放的方式模擬實時數據流。通過數據流的訂閱和發布機制以及時間序列聚合引擎、響應狀態引擎、橫截面引擎等各種流量計算引擎,實時高效地計算出主買方和主賣方的價格指數,大大提高了R&D效率。
最後,我們使用DolphinDB的分布式計算功能來處理高頻數據。在研究和制定策略時,我們需要逐一處理大量的市場數據。之前使用的關係數據庫性能很差,遠遠不能滿足我們的業務需求。DolphinDB的分布式架構可以在毫秒級輕鬆訪問和計算海量數據。比如處理一些股票或者標的,每天需要幾十萬甚至幾百萬次的自動交易,關係數據庫很難處理。但是,DolphinDB可以根據數據逐一快速建立策略,大大提高了R&D效率。
由於團隊中的技術人員大多熟悉Python,在實際使用中,我們將DolphinDB封裝成一個庫,可以通過Python直接訪問。只需一行命令,DolphinDB的海量存儲和快速計算功能就能得到高效充分的利用。
存儲主鍵
在使用DolphinDB之前,我們使用文件系統、MySQL和PostgreSQL來存儲數據。
在使用文件系統之前,數據會留在本地,然後由Python計算。然而,該文件系統在實際應用中存在一些不足。首先,文件系統的IO是存儲過程中的一大瓶頸。其次,在處理大量數據時,文件系統過大,存儲和查詢費時費力。同樣,MySQL和PostgreSQL在實際測試中都非常慢。如果要處理的數據量很大,系統甚至可能無法工作。
因此,我們想建立一個新的系統。考慮的主要數據庫是DolphinDB、MongoDB和KDB+。
由於MongoDB缺乏函數支持,舊代碼難改,KDB+的語言難學,整體使用緩慢,所以我們放棄了這兩個數據庫。
另一方面,DolphinDB具有比KDB+更好的性能,語言SQL易於使用,並提供豐富的財務功能。在低頻向高頻轉變的過程中,原來的系統無法處理突然增加的數據,但DolphinDB是這方面的專家,新系統的速度可以提高10倍左右。在逐個處理數據時,相比以前使用的文件系統,現在的系統效率有了很大的提高,使用起來也很方便。另外,DolphinDB作為一站式數據庫,集分布式存儲、編程建模和高性能計算於一體,在研究過程中可以快速提取一些特定數據,大大加快了我們的研究進度。
代碼「恐懼」
因為之前很多業務使用Python進行相關計算,所以需要將代碼轉移到DolphinDB。這時候,一件極其變態的事情發生了——用Python和DolphinDB計算同一個問題,最後卻得到了不同的結果!
哪個計算結果是正確的?
為什麼會這樣?
會影響實際生產嗎?
帶著這些疑惑,我不斷調試,終於發現原來是Python的腳本出現了編寫錯誤。一個因子的計算方法有很多種,需要深入到每個因子的具體要求去對應,對應的代碼會比較複雜。當時Python的腳本中使用了很多嵌套循環,寫出來的代碼也比較複雜,所以寫腳本難免會有錯誤。但是,DolphinDB的語言非常簡潔。其實不需要那麼多循環,只需要一行代碼就可以全部解決。這大大降低了腳本出錯的概率,同時也能減輕開發者的壓力,有效提高研發效率。
最後,本文
我覺得用好DolphinDB的關鍵是理解架構。只有了解一些技術細節,比如分區表的設計原理,才能高效地使用工具進行定量研究。剛開始用DolphinDB的時候,發現系統的響應速度並不是特別快。後來研究了DolphinDB的底層架構,重新優化了代碼,發現速度立馬提高了很多。所以我覺得DolphinDB考驗的是用戶的水平。用不同的設計方法來解決具體的業務問題,會產生完全不同的效率。
這里簡單分享一下我們使用DolphinDB提高投資和研究效率的經驗。希望有更多的朋友知道和使用DolphinDB這個高性能的時間序列數據庫!