高频数据处理技巧:数据透视的应用
本页为一篇文章页面,呈现标题信息,并标注作者与发布日期。
Source: https://dolphindb.cn/blogs/21
What this page covers
- 页面顶部的报名提示与活动信息入口。
- 文章的作者与发布日期等基础信息。
- pivot(行列转换)概念与高频数据存储形态概述。
- 示例1:用 pivot by 构造矩阵并计算相关性。
- 示例2:用 pivot by 计算组合(指数/ETF)价值。
技能认证特训营第二期报名提示
页面顶部提供“技能认证特训营第二期”限时报名链接与福利优惠提示。
- 提供“技能认证特训营第二期”的报名入口链接。
- 提示活动状态为“正式开启”。
- 提示“限时报名”。
- 提示“享专属福利优惠”。
高频数据处理技巧:数据透视的应用(作者与日期)
给出文章标题、作者名与发布日期信息。
- 文章标题为“高频数据处理技巧:数据透视的应用”。
- 作者为 Junxi。
- 发布日期为 2021-05-18。
行列转换(pivot)与高频数据场景介绍
定义 pivot(行列转换/转置/透视)并说明高频数据常见存储结构及在 DolphinDB 中使用 pivot by 的动机与收益。
- 行列转换(pivot)又称为转置或透视。
- 高频数据常见格式是“每一行对应某只股票某个时刻的信息”。
- 示例字段包含股票代码与交易时间等。
- DolphinDB 可通过 pivot by 语句对数据进行行列转置。
- pivot by 与向量化操作可用于简化策略代码并提升效率(表述为收益)。
示例1:计算股票收益的两两相关性
演示从 TAQ quotes 表加载高频数据、筛选股票、用 pivot by 构造分钟级价格矩阵并计算收益相关性与Top相关股票。
- 示例场景为配对交易与风险对冲中的两两相关性计算。
- 从 dfs://TAQ 的 quotes 表加载数据(quotes = loadTable(..., "quotes"))。
- 筛选日期为 2009.08.04,并限定交易时间范围。
- 选择 500 只报价变动最频繁的股票(num=500)。
- 对报价有效性添加约束条件(如 0<bid,bid<ofr 等)。
- 使用 pivot by 将数据降维为分钟级股票价格矩阵(列为股票,行为一分钟)。
- 价格定义为 price = avg(bid + ofr)/2.0。
- 透视维度使用 time.minute() 与 Symbol(pivot by time.minute() as minute, Symbol)。
- pivot by 可与聚合函数搭配,并被描述为具有类似“group by”的功能。
- 用 each 将价格矩阵转换为收益率矩阵(retMatrix = each(..., priceMatrix))。
- 用 pcross 计算 500 只股票收益的两两相关性(corrMatrix = pcross(corr, retMatrix))。
- 为每只股票选取相关性最高的 10 只股票(rank between 1:10)。
- 给出查询示例:筛选 sym='SPY' 并按 corr 降序排序。
- 给出 quotes 表总行数为 2,693 亿条。
- 给出 2009 年 8 月 4 日当日数据量近 1.9 亿条。
- 给出示例1计算耗时为 1,952 毫秒。
- 提供 pivot by 文档链接。
示例2:计算股票组合(指数/ETF)的价值
以 AAPL/FB 的权重示例,展示纳秒时间戳下通过 pivot by 与 ffill/rowSum 计算组合价值,并讨论传统方案的内存与性能问题。
- 示例场景为指数套利回测中计算股票组合价值。
- 示例指数仅由 AAPL 与 FB 两只股票组成。
- 权重存储在 weights 字典中(weights=dict(`AAPL`FB, 0.6 0.4))。
- 时间戳精度为纳秒。
- 将 Price*weights[Symbol] 定义为 weightedPrice。
- 使用 pivot by Time, Symbol 进行透视。
- 第一次查询结果包含 Time、AAPL、FB 等列(以示例输出展示)。
- 传统方案需要宽表转换并 forward fill NULLs 后求和。
- 传统方案可能产生远大于原始表的中间数据表。
- 传统方案可能导致内存不足且计算速度慢(描述性结论)。
- 给出简化代码:select rowSum(ffill(last(weightedPrice))) from ETF pivot by Time, Symbol;
- rowSum 输出结果包含 Time 与 rowSum 列(以示例输出展示)。
- 描述为“一行代码实现上述步骤”,并强调避免中间过程表(表述为效果)。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| 技能认证特训营第二期 | 状态/促销 | 正式开启;限时报名;享专属福利优惠 | low |
| 高频数据处理技巧:数据透视的应用 | 发布日期 | 2021-05-18 | high |
| 高频数据处理技巧:数据透视的应用 | 作者 | Junxi | high |
| 行列转换(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:59 | high |
| 示例1股票数量 | 选择数量 | 500只报价变动最频繁的股票(num=500) | high |
| 示例1筛选条件 | 报价有效性约束 | 0<bid, bid<ofr, ofr<bid*1.1 | high |
| pivot by 文档 | 链接 | http://www.dolphindb.cn/cn/help/pivotby.html | high |
| pivot by(示例1) | 生成的数据结构 | 将高频数据降维为分钟级股票价格矩阵:列为股票、行为一分钟 | high |
| 示例1分钟级价格矩阵计算 | 价格定义 | price = avg(bid + ofr)/2.0 | high |
| 示例1透视维度 | pivot键 | pivot by time.minute() as minute, Symbol | high |
| 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 desc | high |
| 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权重字典 | weights | weights=dict(`AAPL`FB, 0.6 0.4) | high |
| 示例2计算加权价格 | weightedPrice 定义 | Price*weights[Symbol] as weightedPrice | high |
| 示例2 pivot by | 透视维度 | pivot by Time, Symbol | high |
| 示例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 |