2016-11-12 24 views
2

我有股票交易數據庫(名稱「TRADES」),我試着很長時間來做一個簡單的循環(與功能EACH),將所有數量都高於pre爲每個ISIN定義數量閾值。數據是這樣的:循環與QACH中的每一個KDB +

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(即「每個獨立的ISIN」)。

非常感謝您的幫助。

回答

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 
    .. 

對於minQty範圍從0至100:

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

+0

太好了,謝謝!也許你知道如何做多個循環,例如僅對ISIN的一個子集進行相同的計算(US0378331005,US5949181045)?而且,如果在某些minQty的情況下沒有總和數量時(如果minQty變得越來越大並且沒有數量求和),如何顯示0?再次感謝! – Linas

2

幾種選擇:

Sol 1:

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 

EDIT(對於ISIN分配DIR)來處理方案:

如果你有ISIN作爲不是int的分區鍵(因爲它看起來像你在註釋中的例子),那麼kdb不會將它識別爲ap創造性的數據庫。在

更多細節: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") 
+0

謝謝你的答案。但也許你也可以回答問題的第二部分,即如何做多個循環,例如如何僅對ISIN的一個子集進行相同的計算(US0378331005,US5949181045)? – Linas

+0

你可以通過ISIN列表作爲第二個參數(比如說'lstIsin')並在where子句中使用該列表進行過濾。就像 - >在哪裏輸入,數量> minQty。這是否回答你的問題? – Rahul

+0

它有幫助。但我想知道這個代碼(IstIsin中的哪個)可以幫助自動加載我的貿易數據庫(數百個分區)並進行計算:t_US0378331005:value':C:/ q/US0378331005 /; t_US5949181045:值':C:/ q/US5949181045 /;還有數百個。然後我需要執行每個db的計算:s_US0378331005:{[mqty]'mqty xasc ungroup select mqty,quantity:sum @ /:其中每個數量> /:來自t_US0378331005的mqty的數量}; s_US5949181045:{[mqty]'mqty xasc ungroup select mqty,quantity:sum @ /:quantity where each quantity> /:mqty from t_US5949181045};等等。 – Linas