小 T 導讀:對于(yu)青島協同創新金融研究院來說(shuo),一(yi)直打(da)交道(dao)的(de)交易記錄(lu)、價(jia)格等數據(ju)均(jun)為(wei)時序(xu)數據(ju),在選擇(ze)數據(ju)庫(ku)(Database)時,TDengine “一(yi)個設(she)備一(yi)張表”的(de)設(she)計吸(xi)引(yin)了他們的(de)目(mu)光(guang)。目(mu)前 TDengine 已經在其生產系統中穩定運行(xing)了 38 周(zhou)。本文總結了他們在選型、搭建等方面的(de)所(suo)思所(suo)想,以及應用 TDengine 之(zhi)后(hou)所(suo)取得的(de)效果(guo)。
企業簡介:
為切實服(fu)務國家經(jing)濟、金融(rong)(rong)發(fa)展(zhan)(zhan),中(zhong)國金融(rong)(rong)量化(hua)科(ke)學與(yu)(yu)技(ji)(ji)術協同(tong)(tong)創(chuang)新(xin)(xin)(xin)中(zhong)心(xin)(xin)在(zai)(zai)山東青島設(she)立了一個高端智(zhi)庫,即青島協同(tong)(tong)創(chuang)新(xin)(xin)(xin)金融(rong)(rong)研(yan)究(jiu)院。依托于創(chuang)新(xin)(xin)(xin)中(zhong)心(xin)(xin)的(de)國際頂級專家資源、在(zai)(zai)量化(hua)金融(rong)(rong)與(yu)(yu)金融(rong)(rong)科(ke)技(ji)(ji)領(ling)域的(de)國際領(ling)先理論(lun)研(yan)究(jiu)與(yu)(yu)實務技(ji)(ji)術成果,研(yan)究(jiu)院致力于促進我國金融(rong)(rong)領(ling)域創(chuang)新(xin)(xin)(xin)型尖(jian)端理論(lun)人才、適用(yong)性高端技(ji)(ji)術人才的(de)教育(yu)與(yu)(yu)培(pei)養,提升相(xiang)關(guan)領(ling)域在(zai)(zai)風險管理、資產定(ding)價、產品設(she)計等各方面(mian)的(de)定(ding)量分析與(yu)(yu)決策(ce)技(ji)(ji)術水平,積極(ji)維護金融(rong)(rong)穩(wen)定(ding)、促進金融(rong)(rong)發(fa)展(zhan)(zhan)。

開門見(jian)山地(di)說,我們選(xuan)擇 TDengine Database 的(de)理由很簡單——“一個設備一張表”的(de)模型很適(shi)合(he)我們的(de)量化分(fen)析場景。本質上來講,交(jiao)易記錄、價格等(deng)都是(shi)時序(xu)數據,其實(shi)就是(shi)“一只股(gu)票一張表”,所以(yi)十分(fen)契合(he)。
在(zai)我們的(de)(de)(de)業(ye)務場景(jing)中,TDengine 主要負(fu)責三點:一(yi)(yi)是對回測的(de)(de)(de)數(shu)據(ju)(ju)(ju)支(zhi)持(chi),因為(wei)(wei)它可以輕松抗住海量數(shu)據(ju)(ju)(ju)的(de)(de)(de)寫(xie)入(ru)。目前(qian)我們的(de)(de)(de)數(shu)據(ju)(ju)(ju)入(ru)庫方式是使用 Python 連接(jie)器直(zhi)接(jie)寫(xie)入(ru) TDengine(6030 端口)。具體方式為(wei)(wei):會通過券(quan)商的(de)(de)(de)直(zhi)連接(jie)口將他們提供的(de)(de)(de)數(shu)據(ju)(ju)(ju)做一(yi)(yi)個(ge) SQL 拼接(jie),利用拼接(jie) SQL 的(de)(de)(de)方式,單(dan)個(ge) SQL 寫(xie)入(ru)幾千行數(shu)據(ju)(ju)(ju),將大批數(shu)據(ju)(ju)(ju)一(yi)(yi)次性寫(xie)入(ru)到一(yi)(yi)個(ge)表中。目前(qian),我們每天新增數(shu)據(ju)(ju)(ju)量大概在(zai) 2000 萬行左右(you)。

(注:股票回(hui)測是指設(she)定(ding)了某(mou)些股票指標組合后,基于(yu)歷史(shi)(shi)已經(jing)發(fa)生(sheng)過的(de)真實(shi)行情數據,在歷史(shi)(shi)上某(mou)一個(ge)時間點開始,嚴格按照(zhao)設(she)定(ding)的(de)組合進行選(xuan)股,并模擬真實(shi)金融市場交易的(de)規則進行模型(xing)(xing)買入、模型(xing)(xing)賣出,得出一個(ge)時間段內(nei)的(de)盈利率(lv)、最大回(hui)撤率(lv)等數據。)

二是基于以上數據(ju)進行的回測(ce)數據(ju)分析。

三是部(bu)分盤中策略的數據預加(jia)載。
但因為這塊有(you)每秒幾萬次的查詢用(yong)在高頻業務上,所以(yi)暫時還沒(mei)有(you)嘗試應用(yong) TDengine,目前大(da)部分盤(pan)中(zhong)業務使用(yong)的還是 Redis。據社區工作(zuo)人員(yuan)表示,未來的 TDengine 3.0 版本(ben)將會支(zhi)持自定(ding)義時間范(fan)圍的緩(huan)存,屆時或許(xu)可以(yi)幫到我(wo)們(men)。

除了上述主(zhu)要(yao)的使用(yong)場景之外,TDengine 還(huan)幫助我們實現(xian)了部(bu)分深度學(xue)習模(mo)型的數據訓練和測試(shi)。

具體落地與實際效果
在目前的業務中,我們選用(yong)了三臺 8 核 16G 服務器(qi),以此搭(da)建了三副(fu)本的集群。
這里大家需要注意,三節點并不代表三副本,也并不代表你的數據庫已經具備了高可用性。數據庫的高可用是在 "create database xxxx replica 1/2/3" 的過程中指定的,但是如果你忘記了也沒關系,后期可以通過 "alter database xxxx replica 1/2/3" 來動(dong)態地進(jin)行調整。TDengine 會自動(dong)復制(zhi)出一批分片(pian)(Vnode),并均勻地分布在各個(ge)節點之上,效果如下”show 庫名.vgroups”所示。
(注:如(ru)果數(shu)(shu)據量很大,在數(shu)(shu)據同步的(de)過程中由于網絡波動導致數(shu)(shu)據文件復制中斷,也(ye)可以手動復制 Vnode 目錄下的(de)文件到(dao)指定節點再(zai)啟動。)



根據不同類型的業務,我們創建了 7 張不同的超級表,子表數量為 33076 張,目前我們導入的數據總量已經達到了 46 億之多,其中最大的一張超級表達到了 26 億行,實際磁盤占用大概在 130GB 左右。表的列(lie)數如(ru)下圖”columns”所示,數據類型以 Float 為主。



下面我再(zai)列舉一些典型的(de)查詢場景:
select first(open), max(high), min(low), last(close), sum(volume), sum(amount) from 'bar_1m_SH600519' where trade_time >= '2021-12-25 09:30:00' and trade_time <= '2021-12-31 15:00:00' interval(30m) fill(null)
下(xia)圖為用 1 分鐘(zhong)的 bar 數據(ju)合成 30 分鐘(zhong)的 bar 數據(ju),查詢出的茅(mao)臺股票在一段時間內的開盤價(jia)、最(zui)(zui)高(gao)價(jia)、最(zui)(zui)低價(jia)、收盤價(jia)。

select code,name,trade_time,trade_date,open,high,low,price,pre_price,volume,amount,ask_price1,ask_volume1,ask_price2,ask_volume2,ask_price3,ask_volume3,ask_price4,ask_volume4,ask_price5,ask_volume5,bid_price1,bid_volume1,bid_price2,bid_volume2,bid_price3,bid_volume3,bid_price4,bid_volume4,bid_price5,bid_volume5 from tick_stock where trade_time >='2022-03-18 09:30:00' and trade_time <='2022-03-18 09:30:02' and code in ('002429.SZ', '000006.SZ')
下圖為查詢某兩(liang)支(zhi)股票在某個時間范(fan)圍內的 tick 數(shu)據。

期待 TDengine 3.0 版本
除了(le)數據(ju)(ju)庫(ku)(ku)本身的(de)功能(neng)(neng)之外,我(wo)們也注(zhu)意到(dao) TDengine 的(de)周邊生(sheng)態(tai)也在(zai)不斷(duan)完善。在(zai) 2.4 版(ban)本發(fa)布(bu)之后,它(ta)實(shi)現(xian)了(le)很多功能(neng)(neng)更(geng)新,其中包括一款(kuan)使(shi)(shi)用了(le)監(jian)控數據(ju)(ju)庫(ku)(ku)(log 庫(ku)(ku)) + Grafana 對 TDengine 進行監(jian)控的(de)解決方案——TDinsight。在(zai)此之前,我(wo)們使(shi)(shi)用的(de)一直是我(wo)自己編(bian)寫的(de)一款(kuan)監(jian)控程序,但 TDinsight 使(shi)(shi)最終的(de)展示效果更(geng)加清晰直觀(guan),數據(ju)(ju)庫(ku)(ku)的(de)運行狀態(tai)也更(geng)加一目(mu)了(le)然。
于是,我們立刻著手更(geng)新了 TDengine 2.4 版本(ben),并且部署了 TDinsight。
以下就是 Grafana 展示界面的一部分,可以看到,在當前并發寫入的規模下(每秒 1 萬-1.5 萬行),CPU 資源占用率只有 1.88%,內存占用只有 2G。盡管(guan)目前(qian)我們使用的是三臺 8 核(he) 16G 的機器,但卻(que)可(ke)以在(zai)相當(dang)長的時(shi)間(jian)內不用再擔心硬件資源問(wen)題了。


不知不覺中(zhong),TDengine 在(zai)生產系統中(zhong)已經跑了(le) 38 周了(le),整體(ti)來說各(ge)方(fang)面性(xing)能(neng)都(dou)不錯。偶爾(er)遇(yu)到的一些(xie)使用問題,也在(zai) TDengine 社區(qu)得到了(le)及時的幫助和解答,運行至今我們發(fa)現了(le)兩個小 Bug,官方(fang)都(dou)很快響應(ying)處(chu)理了(le)。盡管還有一些(xie)場景在(zai)當前(qian)的 2.0 版本(ben)還并不能(neng)完全適(shi)配,但 3.0 版本(ben)出爐后就可以解決了(le)。

最后祝(zhu) TDengine Database 越(yue)來越(yue)好吧,期待 3.0 版本(ben)的(de)發(fa)布讓它(ta)成為時序(xu)數據(ju)庫里的(de) Oracle。
作者:
William (QQ: 392667) 16 年股票投資經驗(yan),15年軟件(jian)開發(fa)(fa)經驗(yan),負責青島金融研究(jiu)院(yuan)量化系統整體架構,以(yi)及相關(guan)高頻交易(yi)模型的開發(fa)(fa)。


























