Kdb 将var应用于表中列的最后n个数字

Kdb 将var应用于表中列的最后n个数字,kdb,q-lang,Kdb,Q Lang,在KDB中,我有一个包含4列的表,其中一列是returns列。我想创建一个第五列,用于计算指定列的过去x个元素的方差(var)。我通过两列创建价格列的回报来管理这一点,但是当我需要引用前面的多个元素时,我就卡住了 例如: t:([] td:2001.01.01 2001.01.02 2001.01.03 2001.01.04 2001.01.05 2001.01.06; px:121 125 127 126 129 130) t:update retLogPcnt:100*log px%prev

在KDB中,我有一个包含4列的表,其中一列是returns列。我想创建一个第五列,用于计算指定列的过去x个元素的方差(var)。我通过两列创建价格列的回报来管理这一点,但是当我需要引用前面的多个元素时,我就卡住了

例如:

t:([] td:2001.01.01 2001.01.02 2001.01.03 2001.01.04 2001.01.05 2001.01.06; px:121 125 127 126 129 130)
t:update retLogPcnt:100*log px%prev px from t
/t:update retClassic:((px-prev px)%prev px) from t
t:update mvAvgRet:2 mavg retLogPcnt from t
t
最后一行的输出:

td         px  retLogPcnt mvAvgRet 
-----------------------------------
2001.01.01 121                     
2001.01.02 125 3.252319   3.252319 
2001.01.03 127 1.587335   2.419827 
2001.01.04 126 -0.790518  0.3984085
2001.01.05 129 2.35305    0.7812659
2001.01.06 130 0.7722046  1.562627 
如果计算最后三个retLogPcnt数值的var(仅作为图示),则需要输出:

td         px  retLogPcnt mvAvgRet  varRetns
---------------------------------------------
2001.01.01 121                     
2001.01.02 125 3.252319   3.252319  
2001.01.03 127 1.587335   2.419827  
2001.01.04 126 -0.790518  0.3984085 2.752321
2001.01.05 129 2.35305    0.7812659 1.791392
2001.01.06 130 0.7722046  1.562627  1.647022
因此,第一个var数通过以下公式计算:

q)var 3.252319 1.587335 -0.790518
如何添加此额外列?我做了一些类似于上面移动平均线示例的尝试(
t:update mvAvgRet:2 mavg retLogPcnt from t
),但没有成功


如果之前已经回答过,则表示歉意;我确实搜索了论坛,但没有找到任何对我有帮助的东西。这很可能是因为熟悉了kdb术语。

您可能想在讨论kdb的wiki上查看此页面。其中,本示例描述了滑动窗口功能
swin

q)swin:{[f;w;s] f each { 1_x,y }\[w#0;s]}
q)swin[avg; 3; til 10]
0 0.33333333 1 2 3 4 5 6 7 8
这可以通过使用浮动列表进行修改,以达到您的目的:

swin:{[f;w;s] f each { 1_x,y }\[w#0f;s]}
以便:

q)update varRetns:swin[var;3;retLogPcnt] from t
td         px  retLogPcnt mvAvgRet varRetns
-------------------------------------------
2001.01.01 121                     0
2001.01.02 125 3.25232    3.25232  2.64439
2001.01.03 127 1.58733    2.41983  0.693043
2001.01.04 126 -0.790518  0.398408 2.75232
2001.01.05 129 2.35305    0.781266 1.79139
2001.01.06 130 0.772205   1.56263  1.64702
除了最初的3个值不为null外,它与示例输出非常接近。如果您希望排除这些值,则需要进一步更改
var
函数,我已将其定义为
newVar

newVar:{$[any null x;0Nf;var x]}

q)update varRetns:swin[newVar;3;retLogPcnt] from t
td         px  retLogPcnt mvAvgRet varRetns
-------------------------------------------
2001.01.01 121
2001.01.02 125 3.25232    3.25232
2001.01.03 127 1.58733    2.41983
2001.01.04 126 -0.790518  0.398408 2.75232
2001.01.05 129 2.35305    0.781266 1.79139
2001.01.06 130 0.772205   1.56263  1.64702

非常感谢托马斯,感谢你的帮助,特别是指给我看
swin