本文介紹如何基於TairSearch構建一個即時的股票K線指標服務。
背景資訊
投資者在進行股票投資活動前,通常需要藉助股票行情資料進行分析、判斷。在眾多股票行情指標中,K線是基礎指標,也是核心指標,K線可以演繹出多種其他指標。K線由開盤價、收盤價、最低價、最高價組成,可繪製成日K線、周K線、月K線、季度K線或者30分鐘K線等。
證券商會從證券交易所接收近乎即時的股票行情未經處理資料,並從以上資料中即時地計算出日K線、5分鐘K線等指標,而且投資交易行業對行情分析的即時性要求極高,大量的Realtime Compute和訪問請求是證券商等股票行情提供應商的重要挑戰。
TairSearch是集緩衝與計算於一體的即時全記憶體檢索系統,可作為股票行情的熱資料緩衝系統,服務於K線等需大量Realtime Compute的指標服務。本文將介紹如何基於TairSearch構建股票3分鐘K線Realtime Compute服務。
關於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