加密货币 ETF 在港获批开启机构时代,数据库的分析与应用将快速拉开机构间竞争差距
2024-04-17 11:36
Max.S
2024-04-17 11:36
订阅此专栏
收藏此文章
时序型数据库在海量数据处理、复杂指标计算、多表关联查询、实时数据分析、金融衍生品估值、分布式计算和高并发计算等方面具有优势。


撰文:Max Sun


香港数字资产 ETF 于 4 月 15 日强势登场,为数字资产市场发展注入了强劲动力的同时也为投资者提供了新的投资机遇。作为一种投资产品,数字资产正以不可阻挡之势席卷全球。


过去一个月的时间里,主流数字资产如 BTC、ETH 都经历了巨幅波动的行情,宣告着虚拟货币新一轮牛市的开启。这不仅吸引了大量投资者的目光,也对数字货币交易平台的技术提出了更高的挑战。


数据存储和处理的难题


数字货币交易市场与传统金融市场有着很大不同。它 7 天 24 小时不间断交易,每天产生的行情数据总量超过 10TB,并且还在持续增长。不同币种之间的行情数据量也极度不平衡,头部资产的数据量占据了绝大部分。


此外,不同币种的盘口行情数据深度差异巨大,有的只有十几档,有的则超过千档。更棘手的是,数字货币的行情波动异常迅猛,价格涨跌幅度巨大,这就对系统的延时提出了极高的要求。任何细微的延迟都可能导致交易失败,给投资者造成巨大的损失。


时序型数据库的破局


面对这些挑战,时序型数据库成为了金融交易平台、量化投资基金进行数据存储和处理的理想解决方案。时序型数据库专门为处理时间序列数据而设计,能够高效存储和查询海量数据。其优势在于能够快速处理大量数据写入和查询请求,满足数字货币交易市场的实时数据需求。


在有效压缩时间序列数据,降低存储成本。并且能够高效查询历史数据,支持各种复杂的时间序列分析。得益于这些优势,时序型数据库已经被传统金融如券商、银行、公募 / 私募基金等企业和组织广泛应用,为平台的安全稳定运行提供了坚实的基础。


在应用场景方面金融机构可以使用技术分析的方法,通过以图表、数据分析为主要手段对市场价格变化趋势做出预测,帮助团队做出交易决策。由于技术分析只研究价格,并不关注资产的类型,因此这一方法适用于一切交易市场。在加密货币形成交易市场后,技术分析便成为加密货币交易中的重要环节。


下面将结合代码为你展示如何通过高性能的实时计算实现常用的 9 种技术指标,并将他们通过可视化技术组合起来构建一个数字货币交易仪表盘。通过这些可视化仪表盘,我们可以识别市场趋势、观察价格波动、探索市场结构,从而为决策提供更全面的参考和洞察。(全部代码将在文中展示。)


本次展示的数据库我们采用 DolphinDB 完成指标的实时计算。DolphinDB 是一款基于高性能时序数据库的实时计算分析平台,有着轻便、一站式和计算性能强悍等特点,其可扩展的可视化能力,能够帮助用户非常方便地构建一个交互式仪表盘。


目前 DolphinDB 在传统金融领域已经为百余家机构提供数据计算服务,其中包括为国泰君安证券、富国基金、招商银行等。在数字资产领域也服务了交易所、做市商等多家机构。


8 种常用的技术指标


据公开资料显示,目前市场上的技术指标高达 100 多种。我们将选取包括滑动平均价格、K 线、动量震荡、布林带等最常用的 9 种技术指标。


滑动平均价格(MovingAverage,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 中(如何连接 DolphinDB 与 Grafana,请查看第三章节),选择图表类型为 Candlestick,输入下列语句并执行:


select first(price) as open, last(price) as close, min(price) as low, max(price) as high,sum(quantity) as volumefrom aggTradeStream10where temporalAdd(now(),-540,'m') < tradeTime and code=`BTCUSDTgroup by bar(tradeTime,1s)


上述语句对归集交易数据做了秒级聚合,结果如下图所示绘制了 BTC-USDT 过去 5 分钟内的秒级 K 线图:



相对强弱指数(RelativeStrengthIndex,RSI)


相对强弱指数是一种用于衡量价格变动速度和幅度的技术指标,其计算基于一定时间段内价格上涨和下跌的平均变化。该指标能很好地识别出交易市场的超买和超卖趋势,是最受欢迎的震荡指标之一。在 panel 中,选择图表类型为 Timeseries,GrafaStyle 为 Line(折线),输入下列语句并执行:


use taselect 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 volfrom aggTradeStream10where temporalAdd(now(),-32,'H') <= tradeTime and code="BTCUSDT"group by code, bar(tradeTime,1s) as time)


上述代码先对归集交易数据做了秒级聚合,再计算了秒级数据的相对强弱指数。结果如下图所示,绘制了 BTC-USDT 在过去 5 分钟内基于前 24 小时秒级聚合数据计算的相对强弱指数:



平滑异同平均线(MACD)


MACD 是利用收盘价的短期指数移动平均线与长期指数移动平均线之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标,是一种趋向类指标,对震荡行情有着很好的应用效果。在 panel 中,选择图表类型为 Timeseries,GrafaStyle 为 Line(折线),输入下列语句并执行:


use taselect 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 volfrom aggTradeStream10where 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 taselect 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 volfrom aggTradeStream10where 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,codeb = select corr(BTCUSDT, ETHUSDT) as corrVal from (select price from a pivot bytime,code) group by bar(time,1m) as timeselect 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 newfrom aggTradeStream10 where tradeTime > temporalAdd(now(), -1, "M") order by tradeTimedesc 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 valfrom (select getA(quantity, price, marketMaker) as val from aggTradeStream10 wheretradeTime between startTime0 and endTime0 group by datetime(tradetime) astradetime,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 和港府的审批,数字资产必将进入「机构时代」,时序型数据库凭借其高吞吐量、高效查询和良好的扩展性,记录下每一个交易、每一个事件、每一个决策,构建起完整的数字资产生命周期。


通过对历史数据的分析可以帮助交易者轻松分析市场数据洞察市场趋势,预测未来走向并开发最具时效的交易策略,为数字资产的投资、交易和管理提供强有力的数据支撑。

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

Max.S
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开