概述
香港数字资产ETF于4月15日强势登场,为数字资产市场发展注入了强劲动力的同时也为投资者提供了新的投资机遇。作为一种投资产品,数字资产正以不可阻挡之势席卷全球。
过去一个月的时间里,主流数字资产如BTC、ETH都经历了巨幅波动的行情,宣告着虚拟货币新一轮牛市的开启。这不仅吸引了大量投资者的目光,也对数字货币交易平台的技术提出了更高的挑战。
数据存储和处理的难题
数字货币交易市场与传统金融市场有着很大不同,7天24小时不间断的交易每天产生的行情数据总量超过10TB,并且还在持续增长。不同币种之间的行情数据量也极度不平衡,头部资产的数据量占据了绝大部分。
此外,不同币种的盘口行情数据深度差异巨大,有的只有十几档,有的则超过千档。更棘手的是,数字货币的行情波动异常迅猛,价格涨跌幅度巨大,这就对系统的延时提出了极高的要求。任何细微的延迟都可能导致交易失败,给投资者造成巨大的损失。
时序型数据库的破局
面对这些挑战,时序型数据库成为了金融交易平台、量化投资基金进行数据存储和处理的理想解决方案。时序型数据库专门为处理时间序列数据而设计,能够高效存储和查询海量数据。其优势在于能够快速处理大量数据写入和查询请求,满足数字货币交易市场的实时数据需求。
在有效压缩时间序列数据,降低存储成本。并且能够高效查询历史数据,支持各种复杂的时间序列分析。得益于这些优势,时序型数据库已经被传统金融如券商、银行、公募/私募基金等企业和组织广泛应用,为平台的安全稳定运行提供了坚实的基础。
在应用场景方面金融机构可以使用技术分析的方法,通过以图表、数据分析为主要手段对市场价格变化趋势做出预测,帮助团队做出交易决策。由于技术分析只研究价格,并不关注资产的类型,因此这一方法适用于一切交易市场。在加密货币形成交易市场后,技术分析便成为加密货币交易中的重要环节。
下面将结合代码为你展示如何通过高性能的实时计算实现常用的9种技术指标,并将他们通过可视化技术组合起来构建一个数字货币交易仪表盘。通过这些可视化仪表盘,我们可以识别市场趋势、观察价格波动、探索市场结构,从而为决策提供更全面的参考和洞察。(全部代码将在文中展示。)
本次展示的数据库我们采用DolphinDB完成指标的实时计算。DolphinDB是一款基于高性能时序数据库的实时计算分析平台,有着轻便、一站式和计算性能强悍等特点,其可扩展的可视化能力,能够帮助用户非常方便地构建一个交互式仪表盘。
目前DolphinDB在传统金融领域已经为百余家机构提供数据计算服务,其中包括为国泰君安证券、富国基金、招商银行等。在数字资产领域也服务了交易所、做市商等多家机构。
8种常用的技术指标
据公开资料显示,目前市场上的技术指标高达100多种。我们将选取包括滑动平均价格、K线、动量震荡、布林带等最常用的9种技术指标,
滑动平均价格(Moving Average,MA)
滑动平均价格又叫移动平均线,是通过计算某段时间内的平均价格而生成的曲线,通常用于识别趋势的转折点、支撑位和阻力位。DolphinDB提供了超过1500个金融交易领域常用的计算函数,这里我们使用内置的tm系列函数,通过如下代码便可以快速计算出滑动平均价格指标。
select trade Time, code as pair, price
, tmavg(datetime(tradeTime),price,10s) as movingAvg10Sec
, tmavg(datetime(tradeTime),price,30s) as movingAvg30Sec
, tmavg(datetime(tradeTime),price,45s) as movingAvg45Sec
from (select * from aggTradeStream10 where code =`BTCUSDT order by id asc) where
tradeTime > temporalAdd(now(),-485m)
在Grafana创建panel后(如何连接DolphinDB与Grafana,请查看第三章节),选择图表类型为Timeseries,GrafaStyle为Line(折线),输入上述语句并执行,便可得到如下图所示的输出:绘制了BTC-USDT归集交易数据在过去5分钟的实时价格,以及对应10秒、30秒、45秒滑动窗口内的平均价格线。
K线图
K线是最重要的技术指标之一,多根K线图连接在一起,便形成价格走势线。我们可以通过以下代码实现K线的实时计算。在Grafana的panel中,选择图表类型为Candlestick,输入下列语句并执行:
select first(price) as open, last(price) as close, min(price) as low, max(price) as high,
sum(quantity) as volume
from aggTradeStream10
where temporalAdd(now(),-540,'m') < tradeTime and code=`BTCUSDT
group by bar(tradeTime,1s)
上述语句对归集交易数据做了秒级聚合,结果如下图所示绘制了 BTC-USDT 过去5分钟内的秒级 K 线图:
相对强弱指数(Relative Strength Index,RSI)
相对强弱指数是一种用于衡量价格变动速度和幅度的技术指标,其计算基于一定时间段内价格上涨和下跌的平均变化。该指标能很好地识别出交易市场的超买和超卖趋势,是最受欢迎的震荡指标之一。在panel中,选择图表类型为Timeseries,Grafa Style为Line(折线),输入下列语句并执行:
use ta
select time, rsi(close,20) as RSI, 70 as upperbond, 30 as lowerbond from (select first(price)
as open, last(price) as close, min(price) as lo, max(price) as hi, sum(quantity) as vol
from aggTradeStream10
where temporalAdd(now(),-32,'H') <= tradeTime and code="BTCUSDT"
group by code, bar(tradeTime,1s) as time)
上述代码先对归集交易数据做了秒级聚合,再计算了秒级数据的相对强弱指数。结果如下图所示,绘制了BTC-USDT在过去5分钟内基于前24小时秒级聚合数据计算的相对强弱指数:
平滑异同平均线(MACD)
MACD是利用收盘价的短期指数移动平均线与长期指数移动平均线之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标,是一种趋向类指标,对震荡行情有着很好的应用效果。在panel中,选择图表类型为Timeseries,Grafa Style为Line(折线),输入下列语句并执行:
use ta
select time, macd(close) as `DIF`DEA`MACD, 0 as zeroline from (select first(price) as open,
last(price) as close, min(price) as lo, max(price) as hi, sum(quantity) as vol
from aggTradeStream10
where temporalAdd(now(),-32,'H') <= tradeTime and code="BTCUSDT"
group by code, bar(tradeTime,1s) as time)
上述代码先对归集交易数据做了秒级聚合,再计算了秒级数据的MACD指标。结果如下图所示,绘制了BTC-USDT过去5分钟内基于前24小时秒级聚合数据计算的偏离值(DIF)、平滑移动平均线(DEA)和平滑异同平均线(MACD):
布林带(BollingerBands)
布林带指标通过在价格图表上绘制中轨(移动平均线)以及上下两条标准差线,来显示价格的波动范围和趋势。它常用于分析市场波动性、确认趋势方向以及识别买卖信号。在panel中,选择图表类型为Timeseries,GrafaStyle为Line(折线),输入下列语句并执行:
use ta
select time, bBands(close,5,2,2,2) as `Low`Mid`High from (select first(price) as open,
last(price) as close, min(price) as lo, max(price) as hi, sum(quantity) as vol
from aggTradeStream10
where temporalAdd(now(),-32,'H') <= tradeTime and code="BTCUSDT"
group by code, bar(tradeTime,1s) as time)
上述代码先对归集交易数据做了秒级聚合,再计算了秒级数据的布林带指标。结果如下图所示,绘制了BTC-USDT过去5分钟内基于前24小时数据计算的布林带:
交易对之间的相关性
接下来绘制不同交易对之间的相关性。在panel中,选择图表类型为Timeseries,GrafaStyle为Line(折线),输入下列语句并执行:
a = select avg(price) as price from aggTradeStream10 where code = `BTCUSDT or code =
`ETHUSDT group by bar(tradetime,1s) as time,code
b = select corr(BTCUSDT, ETHUSDT) as corrVal from (select price from a pivot by
time,code) group by bar(time,1m) as time
select time, tmavg(time, corrVal,1H) as corr1h
, tmavg(time, corrVal,24H) as corr24h from b
上述语句先对归集交易数据做了秒级聚合,再对聚合后的数据按1分钟的窗口计算相关性,最后对相关性做了1小时和24小时的滑动平均。结果如下图所示,绘制了BTC-USDT和ETH-USDT分钟频价格相关性经由1小时和24小时的滑动平均处理后的曲线:
实时交易表
实时的交易信息作为最基础的信息,可以帮助我们判断当前交易对中的事实交易情况,如买卖双方的情绪、多空双方力量对比等。我们在panel中,选择图表类型为Table,输入下列语句并执行,即可构建一个基于交易对的实时交易表。
select tradeTime as timestamp, code as pair, case when marketMaker = true then -1 *
quantity else quantity end as quantity,
case when marketMaker = true then round(-1*quantity*price,2) else round(quantity*price,2)
end as consideration,
case when (temporalAdd(now(), -8H)-tradeTime)\1000000<0.3 then "x" else "" end as new
from aggTradeStream10 where tradeTime > temporalAdd(now(), -1, "M") order by tradeTime
desc limit 50
结果如下图所示,展示了10个交易对的最近50条实时交易数据,每5s更新一次:
实时成交额(买卖方向)
实时成交额指标可以说明交易市场的活跃度以及资金规模,帮助我们了解市场情绪。在panel中,选择图表类型为Timeseries,GrafaStyle为Point(散点),输入下列语句并执行:
defg getA(quantity, price, marketMaker){
a = iif(marketMaker==true, -1,1)
return (a*quantity*price)[0]
}
select val
from (select getA(quantity, price, marketMaker) as val from aggTradeStream10 where
tradeTime between startTime0 and endTime0 group by datetime(tradetime) as
tradetime,code) pivot by tradeTime, code
如下图所示,展示了10种交易对最近5分钟的实时成交额,其中x轴代表时间,y轴代表成交额(美元),正值为买单,负值为卖单。
对上述数据感兴趣的小伙伴可以尝试使用Grafana连接DolphinDB进行测试,参照教程,安装dolphindb-datasource插件。安装成功并重启Grafana后,在DataSource中搜索“DolphinDB“,新建一个对应的数据源:
只需填写对应ip:port,以及拥有访问所需库表权限的用户名和密码,即可创建数据源。点击下方Save&test,如下所示表示成功连接:
创建数据源后,即可新建dashboard,在panel 中绘制可视化图表:
如上图所示,在Datasource处选择已保存的DolphinDB数据源,即可在下方代码框输入DolphinDB查询语句,按需绘制图表。
以上就是时序型数据库在技术指标上的一些应用,下面我们来看看时序型数据库在计算能力上的实战演示案列,由于目前数字资产领域的案例较少所以我们引用传统金融的一些数据。还是以DolphinDB为参考。
配置:CPU 16cores,内存512G,4*SSD固态磁盘
- 查询和聚合SQL性能
2700亿行数据集内,毫秒级完成查询和聚合计算(包含解压缩);
- 两两相关性计算
2700亿行数据集内,取出交易最活跃的500只股票(约2亿条数据),进行两两相关性计算,秒级完成。
- 交易成本计算
对交易表(2700万条数据)与报价表(8700万条数据)进行asofjoin与windowjoin,亚秒级完成。
- 因子实现
WorldQuant98号因子实现及计算,1年全市场日频数据,毫秒级完成计算。
- 数据降频
2700亿行数据集内,取65亿逐笔高频数据(300GB)压缩到分钟频(6100万),30秒完成。
- ArrayVector结构支持多档行情高效存储
多档Tick数据的存储,压缩比10:1。
- 实时K线合成及因子实时计算
全市场一天交易数据2亿行的回放,实时计算OHLC双均线因子。
- 外汇掉期估值
100万个外汇掉期合约估值计算,400毫秒完成。
- 分布式线性回归
10亿数据的线性回归计算,秒级完成。
- IOPV计算
计算一个ETF在一天所有逐笔交易数据时点的IOPV(盘中净值),单核亚秒级完成。
以上案例充分展示了时序型数据库在海量数据处理、复杂指标计算、多表关联查询、实时数据分析、金融衍生品估值、分布式计算和高并发计算等方面的强大能力。赋予了用户实时洞察数据、快速发现规律、辅助决策的能力。它已成为新一代数据基础设施的重要组成部分,必将引领数据分析技术的未来发展。
总结
随着ETF获得SEC和港府的审批,数字资产必将进入“机构时代”,时序型数据库凭借其高吞吐量、高效查询和良好的扩展性,记录下每一个交易、每一个事件、每一个决策,构建起完整的数字资产生命周期。
通过对历史数据的分析可以帮助交易者轻松分析市场数据洞察市场趋势,预测未来走向并开发最具时效的交易策略,为数字资产的投资、交易和管理提供强有力的数据支撑。
(文章内提及的均为免费资源,如需调用请点击联系即可)