如何在Q / KDB中的表中处理类型F.

时间:2016-05-13 15:24:04

标签: kdb

我已经开始学习q / KDB了一段时间,所以提前原谅我的琐碎问题,但我面临以下问题,我不知道如何解决。

我有一张名为“res”的表格显示,侧面,订单总数和一些simbols的average_price

<div id="a">a</div>
<div id="b">b</div>
<div id="c">c</div>
<script>
  var a = "a";
  var b = "b";
  var c = "c";
  document.getElementById(a).style.color = "blue";
  document.getElementById(b).style.color = "red";
  document.getElementById(c).style.color = "green";
</script>

使用这些类型

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  

现在我的问题从这里开始,想象一下我将position_summary表加入另一个表,附加另一个类型为f的“current_price”列

我想要做的是确定未平仓头寸的点数。

我试过这种方式:

c             | t f a
--------------| -----
sym           | s   s
close_position| F    
average_price | F    
open_pos      | F    
open_wavgprice| f 

但我得到'类型错误,

当然因为sum_order是F型而open_wavgprice和current_price是f。我在互联网上搜索了我对F型没有太多了解。

首先:我该如何处理?我试过“演员”或使用“raze”但没有效果,而且我不确定他们在这个特殊场合是否正确。

第二:有没有更好的方法在查询表中使用“if-then”(例如,简单的英语:如果此列的这一行然后采用另一列的上一个/下一个或前一个的第二个或第三个/下一栏)

谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

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

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

结果似乎在&#34;关闭&#34;的每一行中都有一个数字。专栏,但事实上它有两个。您可能会注意到上面显示中每个数字前的额外空格,或者您可以显示第一行

q)first 0!summary
sym  | `A
close| 0N 91

并看到&#34;关闭&#34;中的第一行列是0N 91。由于0N等缺失值显示为空格,因此很难在之前的显示中看到它们。

不难理解你是如何得到这两个价值观的。由于您按sym选择,每列按符号分组,对于符号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]是元素最小值,可以在q中写为a & b,因此您的条件表达式可以写为

q)size & prev size
0N 91

现在我们可以看到?为什么会给你类型错误

q)close:exec close from summary
q)close
 91
 47

虽然显示屏是欺骗性的,但是&#34;关闭&#34;以上是两个向量的列表:

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

但我不认为这是你想要的。计算摘要表时,问题就开始了。我希望收盘位是&#34; B&#34;订单减去&#34; S&#34;可以计算为

的订单
q)select close:sum ?[side=`B;size;neg size] by sym from res
sym| close
---| -----
A  | 4
B  | -13

现在,您应该能够修复摘要查询中的其余列。只需确保在每个列的表达式中使用sum等聚合函数。

答案 1 :(得分:0)

类型select first each close_position, first each average_price..... 表示&#34;单元格&#34;在列中包含浮点数而不是原子数。所以你的列实际上是向量的向量而不是平面向量。

在你的情况下,你在每个单元格中都有一个大小为1的向量,所以在你的情况下你可以这样做:

f

将为您提供select close_position:?[prev[sum_order]>sum_order;last sum_order; last prev[sum_order]..... 类型。

我不是100%在第一个查询中尝试做的事情,而且我没有q终端可以检查,但您可以将其放入查询中:

override func viewWillAppear(animated: Bool) {
    //1
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
    //2
    self.setStatusBarStyle(UIStatusBarStyle.LightContent)
    //3
    if self.respondsToSelector(#selector(setNeedsStatusBarAppearanceUpdate)){
        self.setNeedsStatusBarAppearanceUpdate()
    }

}

即。获取列表中的最后一个sum_order。