文諦資產(chǎn)首席策略官劉一夫、首席框架官吳永華、首席數(shù)據(jù)分析師王哲
上海文諦資產(chǎn)管理有限公司(以下簡(jiǎn)稱“文諦資產(chǎn)”)秉持理性、務(wù)實(shí)、高效、專業(yè)的投資精神,憑借科學(xué)的量化投資戰(zhàn)略、先進(jìn)的量化交易技術(shù)和成熟的風(fēng)險(xiǎn)管理能力深耕量化領(lǐng)域,以創(chuàng)造長(zhǎng)期穩(wěn)定收益為投資目標(biāo),為國(guó)內(nèi)外投資者和合作機(jī)構(gòu)提供專業(yè)的投資服務(wù)。文諦資產(chǎn)業(yè)務(wù)持續(xù)保持穩(wěn)健發(fā)展,公司主要從事CTA和股票的量化策略研究與運(yùn)作。
大數(shù)據(jù)技術(shù)的飛速發(fā)展為量化投資注入了新鮮活力,隨著數(shù)據(jù)挖掘工具的更迭換代,各大投資機(jī)構(gòu)也在不斷夯實(shí)自身的數(shù)據(jù)處理和分析能力。文諦資產(chǎn)作為量化統(tǒng)計(jì)及應(yīng)用數(shù)學(xué)領(lǐng)域的投顧專家,在存儲(chǔ)、計(jì)算和分析大量時(shí)間序列數(shù)據(jù)的過(guò)程中,選擇了高性能的分布式時(shí)序數(shù)據(jù)庫(kù)DolphinDB作為強(qiáng)有力的研究工具。在合作的三年間,DolphinDB為文諦資產(chǎn)提供了集數(shù)據(jù)庫(kù)、分布式計(jì)算和編程建模于一體的專業(yè)服務(wù)。本文由文諦資產(chǎn)的首席策略官劉一夫、首席框架官吳永華、首席數(shù)據(jù)分析師王哲共同撰寫(xiě),分享關(guān)于DolphinDB的使用場(chǎng)景、使用效果、技術(shù)服務(wù)、選型過(guò)程和學(xué)習(xí)經(jīng)驗(yàn)。
1.使用場(chǎng)景
我們主要在行情存儲(chǔ)、因子挖掘和模型回測(cè)三方面用到了DolphinDB。
1.1行情存儲(chǔ)
在行情存儲(chǔ)方面,我們主要使用DolphinDB進(jìn)行數(shù)據(jù)的入庫(kù)、清洗與查詢。
在存儲(chǔ)數(shù)據(jù)時(shí),我們借助DolphinDB的分布式特性,通過(guò)提前確定好數(shù)據(jù)導(dǎo)入的分區(qū)字段與分區(qū)粒度,提高后續(xù)數(shù)據(jù)檢索與分析的效率。比如在查詢數(shù)據(jù)時(shí),DolphinDB會(huì)以分區(qū)字段為數(shù)據(jù)過(guò)濾,通過(guò)SQL引擎快速定位要查找的數(shù)據(jù)塊,從而避免對(duì)整張表進(jìn)行掃描,這極大提高了查詢速度。此外,為方便后續(xù)的數(shù)據(jù)分析工作,我們會(huì)使用DolphinDB對(duì)海量時(shí)序數(shù)據(jù)進(jìn)行高效清洗,找出并消除殘缺、錯(cuò)誤或重復(fù)的數(shù)據(jù),進(jìn)而輸出一份高質(zhì)量的、滿足業(yè)務(wù)需求的數(shù)據(jù)。相比其他數(shù)據(jù)清洗工具隨著數(shù)據(jù)量的增大自身性能會(huì)下降的情況,DolphinDB在實(shí)際應(yīng)用中能夠保持穩(wěn)定性能。
1.2因子挖掘
在因子挖掘方面,我們主要使用DolphinDB處理數(shù)據(jù)量龐大、運(yùn)算復(fù)雜的工作任務(wù)。
目前我們處理的總數(shù)據(jù)量大概在幾十TB,每日新增數(shù)據(jù)約為70GB。在使用過(guò)程中,我們不僅會(huì)用到DolphinDB高速存取數(shù)據(jù)的基本功能,同時(shí)會(huì)用到其內(nèi)置的多范式編程語(yǔ)言與多種計(jì)算引擎。
比如在處理一些tick數(shù)據(jù)時(shí),我們會(huì)使用DolphinDB完成前期的一些運(yùn)算,然后通過(guò)Python API,將計(jì)算結(jié)果導(dǎo)入Python模型進(jìn)行組合。其中我們會(huì)用到DolphinDB的流計(jì)算框架,進(jìn)行流數(shù)據(jù)的發(fā)布、訂閱、預(yù)處理、實(shí)時(shí)內(nèi)存計(jì)算以及復(fù)雜指標(biāo)計(jì)算等。以DolphinDB內(nèi)置的時(shí)間序列聚合引擎為例,僅需設(shè)定幾個(gè)參數(shù)指標(biāo),配合wsum、corr等聚合函數(shù)的使用,就可以快速便捷地實(shí)現(xiàn)復(fù)雜的滑動(dòng)時(shí)間窗口聚合計(jì)算。
1.3模型回測(cè)
在模型回測(cè)方面,我們會(huì)用到DolphinDB提供的函數(shù)接口、元編程和計(jì)算框架,根據(jù)這些現(xiàn)有的方法和框架來(lái)進(jìn)行高效回測(cè)。
一些現(xiàn)成函數(shù)如context by、crossStat等的使用可以幫助我們大大提升數(shù)據(jù)處理、特別是編程的工作效率。例如context by,該函數(shù)作為DolphinDB的獨(dú)創(chuàng)功能可以實(shí)現(xiàn)對(duì)時(shí)序數(shù)據(jù)的快速分組。相比group by每組只能返回一個(gè)標(biāo)量值的特性,context by可以使每一個(gè)組返回一個(gè)和組內(nèi)元素?cái)?shù)量相同的向量。并且在回測(cè)工作中,group by只能配合聚合函數(shù)使用,但是context by可以與其他聚合函數(shù)、移動(dòng)窗口函數(shù)或累計(jì)函數(shù)等結(jié)合使用,這極大方便了研發(fā)工作。總的來(lái)說(shuō),DolphinDB獨(dú)創(chuàng)的諸多函數(shù)功能豐富、使用方便,切實(shí)有效地幫助我們提升了回測(cè)效率。
函數(shù)示例:DolphinDB context by vs group by
同時(shí),我們會(huì)使用DolphinDB的元編程功能。利用元編程設(shè)計(jì)的程序具有讀取、生成、分析及轉(zhuǎn)化其他程序的功能。通過(guò)生成動(dòng)態(tài)表達(dá)式以及延遲執(zhí)行的元編程,使得研究人員即便在代碼運(yùn)行時(shí)仍可自行修改代碼。此外,一些計(jì)算框架如MapReduce幫助我們進(jìn)行并發(fā)計(jì)算,極大提升了計(jì)算效率。
2.使用效果
在行情存儲(chǔ)方面,我們的研究人員能夠清晰感受到DolphinDB的壓縮比率之高和數(shù)據(jù)落庫(kù)速度之快。舉例來(lái)說(shuō),在處理幾十TB的歷史數(shù)據(jù)時(shí),需要在DolphinDB中壓縮數(shù)據(jù),而DolphinDB的壓縮比例非常優(yōu)秀,最高可以達(dá)到10:1,能夠切實(shí)地滿足我們的業(yè)務(wù)需求。
在因子挖掘方面,我們經(jīng)常會(huì)計(jì)算一些復(fù)雜因子。比如使用單日新增數(shù)據(jù)計(jì)算一個(gè)復(fù)雜因子,可以實(shí)現(xiàn)秒級(jí)計(jì)算。如果使用大量的歷史數(shù)據(jù),整個(gè)測(cè)試的運(yùn)算時(shí)間甚至可以控制在分鐘級(jí)別。
在模型回測(cè)方面,由于DolphinDB支持?jǐn)?shù)據(jù)項(xiàng)目化的批量處理,因此總體的回測(cè)效率很高。比如在進(jìn)行某個(gè)特定參數(shù)的測(cè)試,整體時(shí)間可以控制在1分鐘內(nèi)。再比如對(duì)大量歷史數(shù)據(jù)測(cè)試全方位的特定參數(shù),從邏輯的實(shí)現(xiàn)到最后的產(chǎn)出,整體效率非常高。
3.技術(shù)服務(wù)
談及對(duì)DolphinDB最深刻的印象,就是技術(shù)支持服務(wù)。
2020年,我們與DolphinDB CEO周小華博士及技術(shù)團(tuán)隊(duì)當(dāng)面進(jìn)行了深入交流。周博士為我們提供了許多專業(yè)的建議,同時(shí)技術(shù)團(tuán)隊(duì)針對(duì)我們的業(yè)務(wù)需求進(jìn)行了詳細(xì)記錄,并且在后續(xù)的跟蹤服務(wù)中幫助我們逐一實(shí)現(xiàn)了需求。
在之后的使用中,我們也會(huì)遇到技術(shù)疑惑與功能需求。比如今年在處理一些高頻數(shù)據(jù)時(shí),我們急需一些函數(shù)的詳細(xì)用法。在與我們溝通后,DolphinDB的工程師及時(shí)教授了我們關(guān)于函數(shù)的構(gòu)建、以及改善調(diào)優(yōu)的方法。在平時(shí)的技術(shù)咨詢中,不論是多晚,即便有時(shí)是在周末,我們總會(huì)得到技術(shù)支持工程師們的及時(shí)回復(fù)。當(dāng)然,除了技術(shù)咨詢,我們也會(huì)向DolphinDB提出一些開(kāi)發(fā)需求。比如實(shí)現(xiàn)因子,雖然有些因子是不常規(guī)的、甚至非常復(fù)雜,DolphinDB的工程師們都會(huì)通過(guò)現(xiàn)有的功能向我們提供支持。還有必須提的一點(diǎn),我們?cè)?jīng)向DolphinDB溝通了一個(gè)特別的功能需求,結(jié)果這個(gè)功能很快就在下一個(gè)版本中得到實(shí)現(xiàn)。從需求的提出到功能的實(shí)現(xiàn),整體速度確實(shí)是非常驚人的。
無(wú)論是支持效率,還是專業(yè)程度,我們對(duì)DolphinDB的技術(shù)支持服務(wù)都非常滿意。
4.時(shí)序數(shù)據(jù)庫(kù)選型
我們?cè)谶x型時(shí)對(duì)比了多家時(shí)序數(shù)據(jù)庫(kù),其中主要考慮的是Kdb+與DolphinDB。
Kdb+作為金融領(lǐng)域的老牌時(shí)序數(shù)據(jù)庫(kù),雖然名氣大、使用面廣,但是其作為國(guó)外廠商缺乏國(guó)內(nèi)的技術(shù)支持,并且其語(yǔ)法晦澀,培訓(xùn)成本和學(xué)習(xí)成本較高。
DolphinDB在查詢和存儲(chǔ)方面的性能明顯優(yōu)于其他數(shù)據(jù)庫(kù),其具備的多種流計(jì)算引擎對(duì)于流數(shù)據(jù)處理非常友好。同時(shí)DolphinDB具有高壓縮比,內(nèi)置豐富的金融函數(shù)庫(kù),可以極大便捷研發(fā)生產(chǎn)。此外,DolphinDB可以提供及時(shí)專業(yè)的技術(shù)支持,同時(shí)上手門檻較低。
最終,我們選擇了集存儲(chǔ)、計(jì)算與開(kāi)發(fā)于一體的高性能分布式時(shí)序數(shù)據(jù)庫(kù)DolphinDB。
5.學(xué)習(xí)和使用經(jīng)驗(yàn)
總體來(lái)看,DolphinDB的入門是比較容易的。如果有Python和SQL的語(yǔ)法基礎(chǔ),那么只需一兩周的時(shí)間就可以上手DolphinDB。
若要更加精進(jìn)地使用DolphinDB,需要對(duì)DolphinDB進(jìn)行更加深入的了解。首先要了解存儲(chǔ)引擎的架構(gòu),目前DolphinDB使用的是OLAP和TSDB兩種引擎,可以提供很高的寫(xiě)入吞吐。其次,要深入理解數(shù)據(jù)庫(kù)的設(shè)計(jì)原理,比如分區(qū)表的工作原理,這會(huì)大大提升數(shù)據(jù)查詢的效率。然后,在數(shù)據(jù)計(jì)算方面要學(xué)習(xí)一些高效處理所需的函數(shù),這樣在實(shí)際業(yè)務(wù)場(chǎng)景中可以更加自如地使用函數(shù)。最后,要保持一顆學(xué)習(xí)的心態(tài)。因?yàn)镈olphinDB在不斷地優(yōu)化提升,不斷地?cái)U(kuò)展迭代一些新的功能,要用好DolphinDB,一定要保持學(xué)習(xí)態(tài)度、緊跟版本技術(shù)動(dòng)態(tài)。
6.結(jié)尾
在友好合作的三年間,DolphinDB切實(shí)有效地助力文諦資產(chǎn)進(jìn)行量化投研。希望DolphinDB可以精益求精,未來(lái)在行業(yè)中的發(fā)展越來(lái)越好,越來(lái)越強(qiáng)。文諦資產(chǎn)也會(huì)堅(jiān)守不斷追求創(chuàng)新、大膽向前的精神,推動(dòng)量化投資向更高更遠(yuǎn)發(fā)展。