2016-05-13 61 views
0

我已经开始学习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”(例如,用简单的英语:如果该列的这一行然后取另一列的前一个/后一个或第二个或第三个一首/下一列)

谢谢你的帮助

回答

0

类型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。

+0

实际上,您的第一个查询确实将列转换为键入f但奇怪的行为,它只显示空列。 – Max

0

让我用一个稍微简单的表格重新表述您的问题:

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)。