wldtw2008 發表於 14-11-27 00:01

Time series database (時間序列的資料庫)

本帖最後由 wldtw2008 於 14-11-27 00:06 編輯

小弟最近花了點時間想要找一個適合的TimeSeriesDatabase來儲存巨量的交易資料(例如多商品的毫秒級的五檔買賣價與口數),下面是一個提供很不錯的討論串:
http://stackoverflow.com/questions/8816429/is-there-a-powerful-database-system-for-time-series-data

看了一下,發現KairosDB+Cassandra 可能會是一個很棒的解決方案 (https://code.google.com/p/kairosdb/)
由KairosDB提供接口,做資料的吞吐、與時間序歸檔(因為雖然是把毫秒級的資訊寫入,但真實應用大概也是歸檔成一秒鐘的開高低收)。而下層使用Cassandra做真正的資料儲存。依照他的講法,單一節點的狀況下他一秒鐘可以節取五萬個資料點,應該是很夠很強了。

另外我也研究了在金融計量領域上很有名的KDB (http://kx.com/),這東西是一個in-memory, nosql db,他幾乎生來就是為了金融界的高頻交易(HFT)而存在的,他可以直接給R提供資料串,他的32Bit版本是免錢的,令人驚訝的是,KDB整個下載下來只有幾個檔案,主程式竟然只有300kb。但他是商用軟體,並非開源open source code,我也搞不定他的save to txt / load from txt,對他的興趣稍為沒那麼大。

我懂報價從上到下的處理但是不懂DB,或許有同好懂DB、懂實際的使用與操作,那麼大家可以一起討論討論。也歡迎玩全沒經驗沒想法的人一起來看看。傳統的開高低收衍生出來的策略就是那麼回事,我也不能確定那些海量的稍縱即逝的資料中,到底能不能衍生出新的策略提供利潤。
在台灣,這是一個完全未知的領域(我想連交易所自己都沒有保存歷史的五檔資料),但有開始才有可能成功,開始的第一步就是要把資料擷取收集下來,如果連收集都沒辦法,那就是連第一步都踏不出去,那根本不可能成功的。



graphalgo 發表於 14-11-27 08:31

"連交易所自己都沒有保存歷史的五檔資料"

我記得期交所不是有在賣揭示檔?
一個月3000元
還是說揭示檔不是五檔資料

TrendRover 發表於 14-11-27 09:24

mc 8.7以後好像就可以自己讀取 ask bid 的上下午檔資料,缺點是太慢嗎?歷史資料有人買過嗎?kway裡的data 好像有類似的名子是相同東西嗎?

wldtw2008 發表於 14-11-27 12:27

本帖最後由 wldtw2008 於 14-11-27 12:29 編輯

TrendRover 發表於 14-11-27 09:24 static/image/common/back.gif
mc 8.7以後好像就可以自己讀取 ask bid 的上下午檔資料,缺點是太慢嗎?歷史資料有人買過嗎?kway裡的data ...
MC是QM功能很強沒話說,但是他消耗的資源也是誇張的多,而且MC+QM真的是很肥大。我覺得他處理十數檔、秒級以上的OK。但如果要處理上百檔、秒內的資料就不太行了。
其中一個很大的關鍵是,台灣交易所不計選擇權,光是期貨商品,就有快一千隻(股票期貨、各月份合約加加起來),如果想用QM去收,光每個月新增Instrument就讓人放棄了,所以並不適合的。

最適合的還是串流打進去,他就自己存起來,自動新增商品這種模式。

swwang1999 發表於 14-11-27 15:15

本帖最後由 swwang1999 於 14-11-27 15:17 編輯

哇 ! W大是要開創訊號源......有機會的話....希望能跟著學習...
一直想說 , 如果可以把 MC 的訊號源擷取後 , 再轉發到其它家中
的電腦 , 就不用買兩份訊號源 , 給不同的電腦 , 程式或者系統

wldtw2008 發表於 14-11-27 15:55

swwang1999 發表於 14-11-27 15:15 static/image/common/back.gif
哇 ! W大是要開創訊號源......有機會的話....希望能跟著學習...
一直想說 , 如果可以把 MC 的訊號源擷取後...

一直以來我提供的報價工具都是在做這件事。

不過這篇TimeSeriesDB 其實主要的目的是即時、巨量、雜亂資料的捕捉,如果能捕捉下來,並用簡單的工具作時間序列後存取(就是歸檔),那才有辦法提供後續的回測使用。

lv052 發表於 14-11-27 16:26

程式新手~~~感謝分享{:4_90:}

wldtw2008 發表於 14-11-27 23:03

本帖最後由 wldtw2008 於 14-11-27 23:14 編輯

剛剛花了一點時間把KairosDB+Cassandra裝起來,這兩套都是java base的東西,亦即他可以在任何平台上執行。
隨便找了一個分檔資料灌進去做測試,看來效果不錯,匯入與查詢的速度真的夠快。

下面是小時線

這是分線


另外,我還故意把Cassandra 行程砍掉再開,發現不只KairosDB會自動連上Cassandra,甚至連Cassandra的資料都還保存著。真的是很滿意!

對了順道一提,我研究過influxdb 這個很夯的TimeSeriesDB,但由於他只支援http的方法來吞吐,效率實在差到無法接受。

wcyjulian 發表於 14-11-28 14:28

本帖最後由 wcyjulian 於 14-11-28 14:32 編輯

我也有需要儲存自己爬(web crawling)回來的大量數據, 現在是單純用matlab的mat檔或hdf5檔, 檔案小存取效率很高, 還沒必要用到NoSQL資料庫, 感謝拋出心得感想, 啟發想了解time series db的技術資料

Druid, Geras, InfluxDB, KairosDB, OpenTSDB這些機制都是透過自訂的資料介面,送到Cassandra, Druid,
HBase, MongoDB 後端NoSQL databases儲存, 各有不同功能特點, 青菜蘿蔔就看自己所好, big data 擅長處理是非結構, 雜湊, 揮發性的資料, 對於時間序列這種dense的資料有多少顯著性幫助, 我是暫時中性看法.
小小好奇一下, 其實KairosDB query跟KairosDB 一樣都用json格式傳遞(為了webservice共通方便,看三四個都支援), 效率差異差在哪?

我用python kairos, 寫個網頁撈即時期交所或yahoo finance資料存到cassandra或redis, code很精簡不用30行, 現在有些策略正用ibpy下ib交易模擬單, 以後也許會串起用.

擺脫既有的交易軟體跟市場框框, 還有很多很有趣的交易策略可以做 :)

wldtw2008 發表於 14-11-29 00:53

本帖最後由 wldtw2008 於 14-11-29 01:30 編輯

剛剛花了一點時間,寫了一支py,透過小弟的DDE2TickQuote or D2TQMini 收到報價後直接灌到KairosDB。
Ins2KairosDB.pyimport time
import sys
import time
from socket import socket

#Read one line
def readlines(sock, recv_buffer=4096, delim='\n'):
      buffer = ''
      data = True
      while data:
                data = sock.recv(recv_buffer)
                buffer += data

                while buffer.find(delim) != -1:
                        line, buffer = buffer.split('\n', 1)
                        yield line
      return

#get tick from linedata
def parseTickQuote(linedata):
      iBeg = linedata.find("01_ID=")
      if iBeg >= 0:
                #print linedata
                iBeg += 6;
                iEnd = linedata.find(",", iBeg);
                symbol = linedata
                allKeyVals = linedata.split(",")
                dbPrice=0.0
                for oneKeyVal in allKeyVals:
                        keyVal = oneKeyVal.split("=")
                        if (len(keyVal)!=2):
                              continue
                        key=keyVal.upper()
                        if key == "C":
                              dbPrice=float(keyVal)
                              break
                return symbol, dbPrice, -999, 1
      iBeg = linedata.find("00_ID=")
      if iBeg >= 0:
                #print linedata
                iBeg += 6
                iEnd = linedata.find(",", iBeg);
                symbol = linedata
                allKeyVals = linedata.split(",")
                dbAsk=0.0;
                dbBid=0.0;
                for oneKeyVal in allKeyVals:
                        keyVal = oneKeyVal.split("=")
                        if (len(keyVal)!=2):
                              continue
                        key=keyVal.upper()
                        if key == "BID":
                              dbBid=float(keyVal)
                        elif key == "ASK":
                              dbAsk=float(keyVal)
                return symbol, dbBid, dbAsk, 0
      return "N/A", -999, -999, -999

def loopClient(sreverIp, serverPort):
      sockRcv = socket()
      sockRcv.connect((sreverIp, serverPort))
      str2KairosDB = ""
      for line in readlines(sockRcv):
                symbol, price1, price2, torq = parseTickQuote(line)
                if (symbol == "N/A"):
                        continue
                #print line
                curTime_m = int(round(time.time() * 1000))
                #put wtx.c 1417096644358 9002
                if (torq==1):
                        str2KairosDB="put %s.c %d %f\n"%(symbol,curTime_m,price1)
                else:
                        str2KairosDB="put %s.b %d %f\n"%(symbol,curTime_m,price1)
                        str2KairosDB+="put %s.a %d %f\n"%(symbol,curTime_m,price2)
                #if (symbol == SymbolA or symbol == SymbolB):
                #       newTickString = getDiffTickStr(SymbolOutput, SymbolA, SymbolB)
                if (str2KairosDB != ""):
                        sys.stdout.write(str2KairosDB)
                        sys.stdout.flush()

      sockRcv.close()


szQuoteIP = sys.argv
szQuotePort = sys.argv
loopClient(szQuoteIP, int(szQuotePort));
只要報價有來就全部自動存到KairosDB,效果不錯,查詢出來的摩台(我只收了1.5hr)Bid/Ask/Last圖如下


PS.我是在Linux 搭配 pipe netcat 執行這個py,命令如下
python Ins2KairosDB.py 192.168.1.1 4568 | netcat 192.168.1.217 4242

wldtw2008 發表於 14-11-29 01:01

本帖最後由 wldtw2008 於 14-11-29 01:03 編輯

其實KairosDB query跟KairosDB 一樣都用json格式傳遞(為了webservice共通方便,看三四個都支援), 效率差異差在哪?
其實最顯著的差別是寫資料進去的時候。
web格式的,不管是json或是xml,或是純post,都要帶入很多多餘的tag,並且一個標準的http協定,還要有header,總的來說,一個商品跳動一個tick,想用http web送進去,一個TCP/IP封包,起碼要200~400Bytes跑不掉。
但KairosDB支援telnet文字格式(port 4242)寫入,以我剛的例子,平均每個tick送進的tcp/ip封包只有40byte以內(如put STW.a 1417192944464 343.500000)。

印象中 #8樓中,同樣的資料串塞入influxdb大概花了三四個小時,而透過telnet模式塞入KairosDB只花了幾分鐘。一整天下來,十個百個商品,幾萬個tick跳下來(寫進去DB),差異就很明顯了...

wldtw2008 發表於 14-11-29 01:23

RE: Time series database (時間序列的資料庫)

我用python kairos, 寫個網頁撈即時期交所或yahoo finance資料存到cassandra或redis, code很精簡不用30行, 現在有些策略正用ibpy下ib交易模擬單, 以後也許會串起用.
擺脫既有的交易軟體跟市場框框, 還有很多很有趣的交易策略可以做 :)
對啊,python超方便,我現在越來越多程式都用python寫。我更推薦使用linux,他免錢又好用,真的會愛上!

我也是不想一直在在開高低收裡頭找資料了,想研究一些其他的東西。所以第一件事情就是找個穩定的DB,把我有興趣的資訊塞進去,半年一年後,再拿出來看看能否產生正期望值。找資料並不難,難的是持之以恆的把資料保存下來。只要這個資料你有、別人沒有,那就有機會了!!


以往是想過用SqlLite、mySql那種DB,但是想到要跟odbc打交道就很煩,一件很簡單的事情用sql去搞就變的超麻煩... 剛好最近很流行in memory db/ nosql db,就花了一點時間研究,也才知道原來現在有這種TimeSeries Query的外掛(嚴格講來大多數的TSDB不是DB,大多都是都是上層)



看來wcyjulian大很有實際使用的經驗的吧,小弟是這一兩個星期才開始研究,我也只是google了一些資料文章而以,並沒有實際操作過,尤其是不曉得這些上層Druid, Geras, InfluxDB, KairosDB, OpenTSDB、下層Cassandra, Druid, HBase, MongoDB 搭配起來到底哪個比較適合金融市場的特性...希望w大能多指點一點迷津。
尤其是這些上層好像都不是給金融報價專用,金融報價最起碼要用到開高低收。 高低一般都有,但開收好像就都沒有了....

wcyjulian 發表於 14-11-29 02:22

本帖最後由 wcyjulian 於 14-11-29 02:40 編輯

wldtw2008 發表於 14-11-29 00:53 static/image/common/back.gif
剛剛花了一點時間,寫了一支py,透過小弟的DDE2TickQuote or D2TQMini 收到報價後直接灌到KairosDB。
Ins2K ...
{:4_113:}
印象中好像你都用vc寫, 原來python也沒問題, 如果打算跑計量交易的話, 可以考慮python, 用scipy, numpy, matplotlib, quantlib-python, zipline, 稍微拼湊一下程式就可以跑回測跟計量交易, 也是考慮再三, 暫時把已經寫一堆的c#, matlab code擺著, 改用python處理交易跟驗證計量交易模型(這些packages拼湊起來, 功能也不輸給高貴的matlab)
您很厲害, 交易這條資訊流我看您也摸得差不多了吧 {:4_121:} telnet mode確實會比較快, 應該就是binary stream跟xml/json plain text 大小上的差別, 仔細看了一下, 它有支援 Compressed Upload, 應是http header加上 Content-Encoding: gzip壓縮文字檔節省時間, 我覺得應該速度就不會差太多, 看您要不要實際比較一下.

其實之前我一直注意的是CEP, Esper您有興趣話可以看看



wcyjulian 發表於 14-11-29 11:04

本帖最後由 wcyjulian 於 14-11-29 11:09 編輯

wldtw2008 發表於 14-11-29 01:23 static/image/common/back.gif
對啊,python超方便,我現在越來越多程式都用python寫。我更推薦使用linux,他免錢又好用,真的會愛上!

...
能抓老鼠用來賺錢的就是好工具 :)
我們應該在做同樣的事, 一磚一瓦自己堆是好事, 就是得自己慢慢摸,有機會的話看不定時討論做trading workshop, 我有些資料您應該會非常感興趣.

要自己存大量歷史資料, db dirty job是跑不了, 還很耗時, 像QuantGo , Algoseek賣的歷史資料不便宜, 資料品質很重要, 通常投資專業機構都會花錢買, big data我也沒比您多甚麼經驗, 現在是百花齊放, 跟美國大西部掏金劃地一樣, 東西很多, 附圖技術架構給您參考 就是撩起袖子做看結果如何, 有甚麼資料我再跟您分享.


time series database 在 document and key bases 那個區塊, 加上time indexing就變成tsdb





如果realtime ticks可以抓到, ohlc不就可以自己算嗎?

wcyjulian 發表於 14-11-29 12:57

To solo,
我權限不夠不能回訊息, 就這裡回你了

您好,
我也是自己評估了mc, ts這些軟體一段時間, 一來限制太多, 二來單純用幾個技術指標就能賺錢...我一直很難說服自己
bid/ask 十檔除了造市跟hft做spread 外, 不然就是佈單找最有效成交價位, 有甚麼策略會特別需要用這, 可以跟您請教, 可能要先談看想怎麼做, 我做計量交易, line: wcyjuian

如果有想走程式計量交易, 不管以前有沒有資訊底子, 就focus在一種技術上, 減少浪費生命, 可以考慮用python, 這是我眾裡尋他, 目前覺得是最好的選擇
頁: [1] 2 3
查看完整版本: Time series database (時間序列的資料庫)