如何在kdb中计算连续相同价格区间的时间差(支持多标的)
解决KDB中连续相同价格区间的首尾时间差计算问题
问题背景
现有KDB表结构:
tab:([]date:2024.01.02;time:(10:01;10:02;10:04;10:09;10:20;10:30;11:01;11:05;11:30;11:44);sym:`MSFT;price:1 1 1 3 3 3 1 1 4 4)
需求是计算每个连续相同价格区间的首尾时间差(比如第一个价格1的区间时间差为10:04-10:01=3分钟),后续重复价格属于独立区间,不能重叠计算。此前尝试select last time by date,sym,time,price from tab无效,需实现正确方法并支持多标的场景。
核心思路
关键是用rle(游程编码)标记每个连续价格区间的组号,通过组号实现连续区间的区分,再按组聚合首尾时间计算差值。
实现步骤
1. 单标的场景处理
先为单标的表生成连续价格的分组ID:
// 生成连续价格的分组标记 tab:update groupId:rle[price][0] from tab;
rle[price]返回两个列表,第一个是重复的价格值,第二个是每个值的连续长度,取第一个列表即可为每行分配对应的连续组号(比如前3行组号为0,接下来3行组号为1,以此类推)。
接着按分组聚合计算时间差:
// 按日期、标的、组号、价格分组,计算首尾时间及差值 result:select date, sym, price, startTime:first time, endTime:last time, duration:endTime-startTime by date, sym, groupId, price from tab; // 清理冗余的groupId字段 result:select date, sym, price, startTime, endTime, duration from result;
执行后会得到每个连续价格区间的时间差,完全符合需求。
2. 多标的场景扩展
如果表包含多个标的(如sym字段有MSFT、AAPL等),只需在生成组号时按sym分组处理,保证每个标的的连续价格分组独立:
// 按标的分组,生成各自的连续价格组号 tab:update groupId:each rle[price][0] by sym from tab;
后续聚合逻辑和单标的一致,最终结果会自动区分不同标的的独立连续价格区间。
验证结果
用示例表执行上述代码后,得到结果如下:
date sym price startTime endTime duration ------------------------------------------------ 2024.01.02 MSFT 1 10:01 10:04 00:03 2024.01.02 MSFT 3 10:09 10:30 00:21 2024.01.02 MSFT 1 11:01 11:05 00:04 2024.01.02 MSFT 4 11:30 11:44 00:14
每个连续价格区间的时间差被正确计算,重复价格的独立区间也被准确区分。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

