将 var 应用于 table 中一列的最后 n 个数字
Apply var to the last n numbers of a column in a table
在 KDB 中,我有一个包含 4 列的 table,其中一列是 returns 列。我想创建第 5 列来计算指定列的过去 x 元素的方差 (var)。我已经通过创建价格列的 returns 的两列来解决这个问题,但是当我需要引用不止一个先前的元素时,我被卡住了。
示例:
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 术语。
您可能想在讨论 sliding windows 的 wiki 上查看此页面。它用这个例子描述滑动 window 函数 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 个值不为空。如果您希望排除这些值,则需要对 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
在 KDB 中,我有一个包含 4 列的 table,其中一列是 returns 列。我想创建第 5 列来计算指定列的过去 x 元素的方差 (var)。我已经通过创建价格列的 returns 的两列来解决这个问题,但是当我需要引用不止一个先前的元素时,我被卡住了。
示例:
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 术语。
您可能想在讨论 sliding windows 的 wiki 上查看此页面。它用这个例子描述滑动 window 函数 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 个值不为空。如果您希望排除这些值,则需要对 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