基于TairSearch構(gòu)建股票K線實(shí)時計算服務(wù)
本文介紹如何基于TairSearch構(gòu)建一個實(shí)時的股票K線指標(biāo)服務(wù)。
背景信息
投資者在進(jìn)行股票投資活動前,通常需要借助股票行情數(shù)據(jù)進(jìn)行分析、判斷。在眾多股票行情指標(biāo)中,K線是基礎(chǔ)指標(biāo),也是核心指標(biāo),K線可以演繹出多種其他指標(biāo)。K線由開盤價、收盤價、最低價、最高價組成,可繪制成日K線、周K線、月K線、季度K線或者30分鐘K線等。
證券商會從交易所接收近乎實(shí)時的股票行情原始數(shù)據(jù),并從以上數(shù)據(jù)中實(shí)時地計算出日K線、5分鐘K線等指標(biāo),而且投資交易行業(yè)對行情分析的實(shí)時性要求極高,大量的實(shí)時計算和訪問請求是證券商等股票行情提供應(yīng)商的重要挑戰(zhàn)。
TairSearch是集緩存與計算于一體的實(shí)時全內(nèi)存檢索系統(tǒng),可作為股票行情的熱數(shù)據(jù)緩存系統(tǒng),服務(wù)于K線等需大量實(shí)時計算的指標(biāo)服務(wù)。本文將介紹如何基于TairSearch構(gòu)建股票3分鐘K線實(shí)時計算服務(wù)。
關(guān)于TairSearch的詳細(xì)介紹及命令示例,請參見TairSearch。
Demo演示
創(chuàng)建股票Schema
本示例中模擬每3秒產(chǎn)生一條原始行情數(shù)據(jù)。可通過TFT.CREATEINDEX
命令以股票代碼為Key名稱創(chuàng)建該股票的對應(yīng)Schema,Schema中包含最高價(high
)、最低價(low
)、開盤價(open
)、收盤價(close
)、成交量(amount
)、成交總額(volume
)與時間戳(date
)字段,以時間戳(date
)為索引。
如需增加或調(diào)整字段,可直接執(zhí)行TFT.UPDATEINDEX
。
代碼示例如下:
TFT.CREATEINDEX 58Z074 '{
"mappings": {
"properties": {
"high": {"index": false,"type": "double"},
"low": {"index": false,"type": "double"},
"open": {"index": false,"type": "double"},
"close": {"index": false,"type": "double"},
"volume": {"index": false,"type": "long"},
"amount": {"index": false,"type": "long"},
"date": {"index": true,"type": "long"}
}
}
}'
預(yù)計輸出:
OK
導(dǎo)入股票數(shù)據(jù)
整理股票數(shù)據(jù),寫入TairSearch文檔,代碼示例如下:
TFT.ADDDOC 58Z074 '{
"high": 1237.53,
"low": 887.54,
"open": 987.36,
"close": 997.53,
"volume": 110,
"amount": 2809,
"date": 1659922202
}'
計算實(shí)時K線
模擬計算3分鐘K線,需要獲取3分鐘內(nèi)的開盤價、收盤價、最低價和最高價,代碼示例如下:
計算開盤價:
TFT.SEARCH 58Z074 '{ "size": 1, "_source": {"includes": "open"}, "sort": [{"date": {"order": "asc"}}], "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}} }'
計算收盤價:
TFT.SEARCH 58Z074 '{ "size": 1, "_source": {"includes": "close"}, "sort": [{"date": {"order": "desc"}}], "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}} }'
計算最高價和最低價:
TFT.SEARCH 58Z074 '{ "size": 0, "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}}, "aggs": {"high": {"max": {"field": "high"}},"low": {"min": {"field": "low"}}} }'
繪制K線
通過Python Pyecharts庫,將上述搜索結(jié)果數(shù)據(jù)繪制K線的效果如下:
性能數(shù)據(jù)
計算開盤價或收盤價以及最高價、最低價的性能數(shù)據(jù)如下:
計算開盤價或收盤價。
測試命令:
redis-benchmark -r 1 -n 100000 TFT.SEARCH 58Z074 '{"size": 1, "_source": {"includes": "open"}, "sort": [{"date": {"order": "asc"}}], "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}}}'
測試結(jié)果:
100.00% <= 5 milliseconds 12078.75 requests per second
計算最高價、最低價:
測試命令:
redis-benchmark -r 1 -n 100000 TFT.SEARCH 58Z074 '{"size": 0,"query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}},"aggs": {"high": {"max": {"field": "high"}},"low": {"min": {"field": "low"}}}}'
測試結(jié)果:
100.00% <= 2 milliseconds 65019.51 requests per second