高频数据处理技巧:数据透视的应用

本页为一篇文章页面,呈现标题信息,并标注作者与发布日期。

Source: https://dolphindb.cn/blogs/21

What this page covers

技能认证特训营第二期报名提示

页面顶部提供“技能认证特训营第二期”限时报名链接与福利优惠提示。

高频数据处理技巧:数据透视的应用(作者与日期)

给出文章标题、作者名与发布日期信息。

行列转换(pivot)与高频数据场景介绍

定义 pivot(行列转换/转置/透视)并说明高频数据常见存储结构及在 DolphinDB 中使用 pivot by 的动机与收益。

示例1:计算股票收益的两两相关性

演示从 TAQ quotes 表加载高频数据、筛选股票、用 pivot by 构造分钟级价格矩阵并计算收益相关性与Top相关股票。

示例2:计算股票组合(指数/ETF)的价值

以 AAPL/FB 的权重示例,展示纳秒时间戳下通过 pivot by 与 ffill/rowSum 计算组合价值,并讨论传统方案的内存与性能问题。

Facts Index

Entity Attribute Value Confidence
技能认证特训营第二期报名链接https://www.qingsuyun.com/h5/e/217471/5/high
技能认证特训营第二期状态/促销正式开启;限时报名;享专属福利优惠low
高频数据处理技巧:数据透视的应用发布日期2021-05-18high
高频数据处理技巧:数据透视的应用作者Junxihigh
行列转换(pivot)别名又称为转置或者透视high
高频数据常见保存格式每一行为一个股票在某个时刻的信息medium
图片示例(高频交易数据)包含字段类型股票代码、交易时间、多级买卖价格(如 SellPrice01-10)及交易状态等字段;每行代表某只股票在特定时刻的市场快照low
DolphinDB行列转换方式可通过 pivot by 语句对原始数据或分组聚合结果进行行列转置high
pivot by 与向量化操作效果可简化策略代码并提高代码效率(用于高频数据处理与计算)low
两两相关性计算应用场景配对交易(pair trading)及风险对冲(hedging)中需要计算给定一篮子股票之间的两两相关性high
传统数据库与统计软件对复杂计算的限制传统数据库中无法执行该复杂计算;一般统计软件需要数据迁移且代码繁琐low
示例1数据源加载表quotes = loadTable("dfs://TAQ", "quotes")high
示例1筛选条件日期与时间范围dateValue=2009.08.04;time between 09:30:00 : 15:59:59high
示例1股票数量选择数量500只报价变动最频繁的股票(num=500)high
示例1筛选条件报价有效性约束0<bid, bid<ofr, ofr<bid*1.1high
pivot by 文档链接http://www.dolphindb.cn/cn/help/pivotby.htmlhigh
pivot by(示例1)生成的数据结构将高频数据降维为分钟级股票价格矩阵:列为股票、行为一分钟high
示例1分钟级价格矩阵计算价格定义price = avg(bid + ofr)/2.0high
示例1透视维度pivot键pivot by time.minute() as minute, Symbolhigh
DolphinDB pivot by能力描述pivot by 不仅转换为透视表,也可搭配聚合函数使用,具有“group by”的功能medium
each 高阶函数(示例1)用途将价格矩阵转换为收益率矩阵:retMatrix = each(def(x):ratios(x)-1, priceMatrix)high
pcross 高阶函数(示例1)用途计算500只股票之间收益的两两相关性:corrMatrix = pcross(corr, retMatrix)high
相关性TopN(示例1)Top数量每只股票选取相关性最高的10只股票(rank between 1:10)high
示例1查询与SPY相关性最高的10只股票select * from mostCorrelated where sym='SPY' order by corr deschigh
quotes表数据量总行数2,693亿条数据high
2009年8月4日 quotes 数据量当日行数近1.9亿条数据high
示例1计算耗时执行时间1,952 毫秒high
股票组合价值计算应用场景指数套利交易回测时,需要计算给定股票组合的价值high
一般数据分析系统(回测大数据量)问题对系统内存及速度要求极高low
DolphinDB database优化效果从底层进行优化,对硬件的要求不高low
示例2指数构成成分股与权重存储指数仅由两只股票组成:AAPL 与 FB;权重存在 weights 字典中high
示例2时间戳精度精度时间戳精度为纳秒high
示例2权重字典weightsweights=dict(`AAPL`FB, 0.6 0.4)high
示例2计算加权价格weightedPrice 定义Price*weights[Symbol] as weightedPricehigh
示例2 pivot by透视维度pivot by Time, Symbolhigh
示例2输出(第一次查询)结果表结构结果包含 Time、AAPL、FB 列(示例输出表展示多行时间戳与对应值)medium
纳秒时间戳回测(传统分析系统)处理方式与问题需将(时间,股票代码,价格)三列转为宽表并 forward fill NULLs,再求和;会产生远大于原始表的中间数据表,可能导致内存不足且计算速度慢medium
示例2规模假设(传统方案)数据量/成分股数量示例数据行数可达几亿或几十亿;成分股数量可较多(如 S&P500 指数的 500 只成分股)medium
DolphinDB pivot by(示例2)效果一行代码实现上述步骤;代码简洁;无需产生中间过程数据表;避免内存不足;极大提升计算速度low
示例2组合价值计算(简化代码)查询语句select rowSum(ffill(last(weightedPrice))) from ETF pivot by Time, Symbol;high
示例2输出(rowSum)结果表结构结果包含 Time 与 rowSum 列(示例输出表展示多行时间戳与对应 rowSum 值)medium