我有股票交易数据库(名称“TRADES”),我正在尝试做一个简单的循环(使用函数EACH),它将对每个超过预定数量阈值的所有数量求和ISIN。数据如下所示:
q) select TIME, PRICE, QUANTITY from TRADES where ISIN=`IT123
TIME PRICE QUANTITY
8:58:05 9.47 66
9:00:09 9.47 55
9:00:56 9.48 107
9:01:06 9.49 7
9:01:33 9.50 9
9:03:11 9.07 200
9:06:27 9.07 100
9:07:46 9.12 65...
首先,我尝试使用一个ISIN代码:
q) myquant: ([] qu: 1 + til 100) //pre-define quantities from 1 to 100
q) f:{[x] (select sum QUANTITY from TRADES where ISIN=`IT123, QUANTITY> x)}
q) f each myquant.qu //use function EACH for all x that are in myquant
然后我得到了一些象形文字......也许是因为列表被错误地指定了?
我还需要进行这些计算,不仅仅针对一个,而是针对我在数据库中的所有ISIN(即“EACH distinct ISIN”)。
非常感谢您的帮助。
答案 0 :(得分:2)
鉴于一些trades
:
q)show trades:flip`isin`time`price`quantity!100?/:(`US5949181045`US38259P5089`US0378331005;24t;100f;100)
isin time price quantity
-------------------------------------------
US5949181045 18:45:28.487 60.91539 12
US5949181045 04:35:02.468 98.30794 62
US0378331005 23:39:20.774 75.43122 18
US38259P5089 09:37:08.266 38.13679 37
US0378331005 12:09:01.385 3.112646 17
..
对于范围为0到100的minQty
:
q)raze {[minQty] select sum quantity by isin,minQty:minQty from trades where quantity>minQty} each til 100
isin minQty| quantity
-------------------| --------
US0378331005 0 | 1537
US38259P5089 0 | 1767
US5949181045 0 | 1435
US0378331005 1 | 1537
US38259P5089 1 | 1767
..
结果给出每个isin的总和数量,其中数量>给定的minQty
答案 1 :(得分:2)
几个选项:
SOL1:
q) s1:{[mqty]`mqty xasc ungroup select mqty,quantity:sum @/:quantity where each quantity>/:mqty by isin from trades}
q) s1 myquant.qu
Sol2:
在没有行符合数量条件的情况下,扩展MdSalih解决方案以处理方案
q) s2:{a:ungroup select minQty:x ,quantity:0 by isin from trades;
b:raze {[minQty] select sum quantity by isin,minQty:minQty from trades where quantity>minQty} each x;
`minQty xasc a lj b }
q)s2 myquant.qu
编辑(对于ISIN分区目录):
如果您将ISIN作为不是int的分区键(从注释中的示例看起来如此),那么kdb将不会将其识别为分区数据库。
有关详细信息:http://code.kx.com/q4m3/14_Introduction_to_Kdb+/#1432-partition-domain
您必须手动加载列/表并进行计算。一个解决方案是:
q) src_path:"C:\q\"
q) raze {[isin;mqty]a:get hsym `$src_path,isin,"\trades\quantity";flip `isin`mqty`quantity!count[mqty]#/:(enlist isin;mqty;sum @/:a where each a>/:(),mqty)}[;myquant.qu] each ("ISIN01";"ISIN02")