2016-11-12 5 views
2

나는 주식 거래 데이터베이스 (이름 "TRADES")를 가지고 있으며, 전 (pre) 이상의 모든 수량을 합산하는 간단한 루프 (EACH 기능 포함)를 만들기 위해 오랜 시간 노력하고 있습니다. 모든 ISIN에 대해 정의 된 수량 임계 값. 데이터는 다음과 같습니다 : 목록이 잘못 지정되어 있기 때문에 어쩌면 그것은이다 ...Q에서 각각의 루프 루프 KDB +

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 

그리고 나는 약간의 상형 문자를 얻을 :

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이 코드를 시도?

이 계산은 하나뿐 아니라 데이터베이스에있는 모든 ISIN (즉, "개별 고유 ISIN")에 대해서도 수행해야합니다.

미리 도움을 주셔서 대단히 감사드립니다.

답변

2

나타내는 일부 trades : 0 ~ 100 범위 minQty 들어

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

:

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

결과 금액>은 소정 minQty

+0

감사합니다. 또한 여러 루프를 수행하는 방법을 알고있을 수도 있습니다. ISIN (US0378331005, US5949181045)의 하위 집합에 대해서만 동일한 계산을 할 수 있습니까? 또한 minQty에 총 수량이없는 경우 0을 표시하는 방법 (minQty가 더 커지고 더 커지고 합계가없는 경우)? 다시 한 번 감사드립니다! – Linas

2

각 | SIN 대한 합계 금액 준다 몇 가지 옵션 :

솔 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 : 경우

없음 행 (ISIN은 DIR 분할 용) 수량 조건을

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 일치하지 않는 경우의 시나리오를 처리하기 MdSalih 용액 확장

당신은 int가 아닌 파티션 키로서 ISIN을 가지고 있습니다 (주석에서 여러분의 예제처럼 보입니다). 그러면 kdb는 그것을 ap로 인식하지 않을 것입니다 artitioned 데이터베이스. 에

자세한 내용 : 당신은해야합니다 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 절에이 인수를 사용하여 필터링하십시오. 마찬가지로 -> 어디에서 isinin, 수량> minQty 있습니다. 그 질문에 대답합니까? – Rahul

+0

도움이되었습니다.그러나이 코드 (IstIsin에있는 isin)가 자동으로 ISIN (수백 개의 파티션)의 무역 데이터베이스를로드하고 계산을 수행하는지 궁금합니다. t_US5949181045 : 값': C :/q/US5949181045 /; 그리고 더 많은 수백. 그렇다면 각각의 db에 대한 계산을 수행해야합니다. s_US0378331005 : {[mqty]'mqty xasc ungroup select mqty, quantity : sum @/: 수량 여기서 각 수량>/: mqty from t_US0378331005}; s_US5949181045 : {[mqty]'mqty xasc 그룹 선택 해제 mqty, 수량 : 합계/: 수량 여기서 각 수량>/: mqty from t_US5949181045}; – Linas