如何在kdb+中实现多列的行级指数移动平均(ema)?
在kdb+中实现行级EMA计算
问题原因
ema函数的设计目标是对列方向的时间序列计算指数移动平均,它默认接收单个向量(或多列独立序列)作为输入。当你直接传入(rnk1;rnk2)时,ema会将这两个列视为两个独立的时间序列处理,但update语句需要每行对应一个结果,维度不匹配导致触发'rank错误。
解决方案
要实现行级EMA计算,需将每行的多列值视为独立的小序列,对每个小序列单独计算EMA:
- 将每行的
rnk1和rnk2元素组合成列表(可通过row t或flip (rnk1;rnk2)实现); - 用
each遍历每个小序列,调用ema[alpha]计算该序列的EMA; - 若只需每个小序列的最终EMA值(与
avg返回单个值的逻辑一致),用last提取结果的最后一个元素。
代码示例
场景1:每行返回最终EMA值
alpha:0.5; t:([] rnk1:1 2; rnk2:3 4); show update r:last each ema[alpha] each row t from t;
执行结果:
rnk1 rnk2 r ----------- 1 3 2 2 4 3
场景2:每行返回完整EMA序列(列表形式)
show update r:ema[alpha] each row t from t;
执行结果:
rnk1 rnk2 r ----------- 1 3 1 2 2 4 2 3
等价写法(用flip构造行列表)
show update r:last each ema[alpha] each flip (rnk1;rnk2) from t;
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

