如何在Q/KDB的表格中处理F型表格
我已经开始学习Q/KDB一段时间了,因此我提前原谅了我的一些小问题,但是我面临着以下问题,我不知道如何解决。如何在Q/KDB的表格中处理F型表格
我有一个表列举了一些simbols的“资源”显示,侧,订单的总和并average_price
sym side | sum_order avg_price
----------| -------------------
ALPHA B | 95109 9849.73
ALPHA S | 91662 9849.964
BETA B | 47 9851.638
BETA S | 60 9853.383
与这些类型
c | t f a
---------| -----
sym | s p
side | s
sum_order| f
avg_price| f
我想计算关闭和开启位置,平仓点,平仓,平仓价格。
我已经使用这个查询,我认为这是很奇怪的(我相信会有更专业的方式来做到这一点),但它按预期工作
position_summary:select
close_position:?[prev[sum_order]>sum_order;sum_order;prev[sum_order]],
average_price:avg_price-prev[avg_price],
open_pos:prev[sum_order]-sum_order,
open_wavgprice:?[sum_order>next[sum_order];avg_price;next[avg_price]][0]
by sym from res
给我下表
sym | close_position average_price open_pos open_wavgprice
----------| ----------------------------------------------------
ALPHA | 91662 0.2342456 3447 9849.73
BETA | 47 1.745035 -13 9853.38
和类型
c | t f a
--------------| -----
sym | s s
close_position| F
average_price | F
open_pos | F
open_wavgprice| f
现在我的问题就在这里开始,可以想象我加入PO sition_summary表格与另一个表格附加另一个字段“current_price”的类型f
我想要做的是确定开放职位的点数。
我已经试过这样:
select
?[open_pos>0;open_price-open_wavgprice;open_wavgprice-open]
from position_summary
,但我得到了“错误类型,
当然是因为sum_order是F型和open_wavgprice和CURRENT_PRICE是F。我在互联网上搜索,我没有找到太多F型。
第一:我该如何处理?我尝试过“投”或使用“raze”,但没有效果,而且我不确定他们在这个特定的场合是否正确。
第二:有没有更好的方法在查询表中使用“if-then”(例如,用简单的英语:如果该列的这一行然后取另一列的前一个/后一个或第二个或第三个一首/下一列)
谢谢你的帮助
类型F
意味着该列中的“细胞”载浮的载体而不是原子。所以你的专栏实际上是一个矢量矢量而不是一个平面矢量。
你的情况,你必须在每个单元大小为1的矢量,所以你的情况,你可能只是这样做:
select first each close_position, first each average_price.....
,这将给你一个类型f
。
我不是100%对你试图在第一个查询做了,我没有含水终端用手去检查,但你可以把这个到你的查询:
select close_position:?[prev[sum_order]>sum_order;last sum_order; last prev[sum_order].....
即得到列表中的最后一个sum_order。
让我用一个稍微简单的表格重新表述您的问题:
q)show res:([sym:`A`A`B`B;side:`B`S`B`S]size:95 91 47 60;price:49.7 49.9 51.6 53.3)
sym side| size price
--------| ----------
A B | 95 49.7
A S | 91 49.9
B B | 47 51.6
B S | 60 53.3
你正在努力寻找每个符号使用这样的查询合闸位置:到
q)show summary:select close:?[prev[size]>size;size;prev[size]] by sym from res
sym| close
---| -----
A | 91
B | 47
结果似乎“close”列的每一行都有一个数字,但实际上它有两个。您可以在上面显示注意到每个号码前额外的空间,也可以显示的第一行
q)first 0!summary
sym | `A
close| 0N 91
,并看到,在“关闭”列中的第一行是0N 91
。由于缺少的值(如0N
)显示为空格,因此很难在先前的显示中看到它们。
不难理解你是如何得到这两个值的。既然你通过符号选择,每列得到由符号组合,而且为符号A,你有
q)show size:95 91
95 91
和
q)prev size
0N 95
导致
q)?[prev[size]>size;size;prev[size]]
0N 91
(回想一下,0N是小于任何其他整数)
作为一个附注,?[a>b;b;a]
是元素最小值和c一个被写成q中a & b
,所以你的条件表达式可以写成
q)size & prev size
0N 91
现在我们可以看到,为什么?
虽然显示是欺骗,“关闭”给你的错误类型
q)close:exec close from summary
q)close
91
47
以上是两个向量的列表:
q)first close
0N 91
和
q)last close
0N 47
有条件的载体不支持:
q)?[close>0;10;20]
'type
[0] ?[close>0;10;20]
^
一个可能可以治愈,通过使用each
:
q)?[;10;20]each close>0
20 10
20 10
但我不认为这是你想要的。计算汇总表时,您的问题就开始了。我希望在关闭位置,以成为“B”订单之和减去可以被计算为
q)select close:sum ?[side=`B;size;neg size] by sym from res
sym| close
---| -----
A | 4
B | -13
现在,你应该能够解决其余列在摘要中的“S”的订单总和查询。只要确保在每列的表达式中使用聚合函数(如sum
)。
实际上,您的第一个查询确实将列转换为键入f但奇怪的行为,它只显示空列。 – Max