本文介紹如何基于TairSearch構建一個實時的股票K線指標服務。
背景信息
投資者在進行股票投資活動前,通常需要借助股票行情數據進行分析、判斷。在眾多股票行情指標中,K線是基礎指標,也是核心指標,K線可以演繹出多種其他指標。K線由開盤價、收盤價、最低價、最高價組成,可繪制成日K線、周K線、月K線、季度K線或者30分鐘K線等。
證券商會從交易所接收近乎實時的股票行情原始數據,并從以上數據中實時地計算出日K線、5分鐘K線等指標,而且投資交易行業對行情分析的實時性要求極高,大量的實時計算和訪問請求是證券商等股票行情提供應商的重要挑戰。
TairSearch是集緩存與計算于一體的實時全內存檢索系統,可作為股票行情的熱數據緩存系統,服務于K線等需大量實時計算的指標服務。本文將介紹如何基于TairSearch構建股票3分鐘K線實時計算服務。
關于TairSearch的詳細介紹及命令示例,請參見Search。
Demo演示
創建股票Schema
本示例中模擬每3秒產生一條原始行情數據??赏ㄟ^TFT.CREATEINDEX
命令以股票代碼為Key名稱創建該股票的對應Schema,Schema中包含最高價(high
)、最低價(low
)、開盤價(open
)、收盤價(close
)、成交量(amount
)、成交總額(volume
)與時間戳(date
)字段,以時間戳(date
)為索引。
如需增加或調整字段,可直接執行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"}
}
}
}'
預計輸出:
OK
導入股票數據
整理股票數據,寫入TairSearch文檔,代碼示例如下:
TFT.ADDDOC 58Z074 '{
"high": 1237.53,
"low": 887.54,
"open": 987.36,
"close": 997.53,
"volume": 110,
"amount": 2809,
"date": 1659922202
}'
計算實時K線
模擬計算3分鐘K線,需要獲取3分鐘內的開盤價、收盤價、最低價和最高價,代碼示例如下:
計算開盤價:
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庫,將上述搜索結果數據繪制K線的效果如下:
性能數據
計算開盤價或收盤價以及最高價、最低價的性能數據如下:
計算開盤價或收盤價。
測試命令:
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}}}}'
測試結果:
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"}}}}'
測試結果:
100.00% <= 2 milliseconds 65019.51 requests per second