本文介绍如何基于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