【问题标题】:Apply var to the last n numbers of a column in a table将 var 应用于表中列的最后 n 个数字
【发布时间】:2018-01-05 23:04:46
【问题描述】:

在 KDB 中,我有一个包含 4 列的表,其中一个是返回列。我想创建第 5 列来计算指定列的过去 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 q-lang


    【解决方案1】:

    您可能想在讨论 sliding windows 的 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
    

    这 close 到您的示例输出,除了最初的 3 个值不为空。如果您希望排除这些值,则需要对 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
    

    【讨论】:

    • 非常感谢 Thomas,感谢您的帮助,特别是指点我 swin。
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2021-12-08
    • 2020-02-13
    • 1970-01-01
    • 2023-02-10
    • 2011-06-13
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多