You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:37:20