2016-05-13 5 views
0

Ich habe begonnen, q/KDB seit einer Weile zu lernen, deshalb verzeihen Sie mir im Voraus für triviale Frage, aber ich bin mit dem folgenden Problem konfrontiert, ich weiß nicht, wie zu lösen .Wie man Typ F in einer Tabelle in Q/KDB behandelt

Ich habe eine Tabelle "res" zeigt, Seite, Summierung von Aufträgen und average_price einiger Simbols namens

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 

mit diesen Typen

c  | t f a 
---------| ----- 
sym  | s p 
side  | s  
sum_order| f  
avg_price| f  

I enge und offene Positionen berechnen möchten , Durchschnittspunkt, der durch die enge Position und den Durchschnittspreis der offenen Position gebildet wird.

ich diese Abfrage verwendet haben, die ich glaube, es ist ziemlich bizarr ist (ich bin sicher, es wird eine professionelle Art und Weise, es zu tun), aber es funktioniert wie

erwartet
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 

mir die folgende Tabelle geben

sym  | close_position average_price open_pos open_wavgprice 
----------| ---------------------------------------------------- 
ALPHA  | 91662   0.2342456  3447 9849.73  
BETA  | 47    1.745035  -13  9853.38 

und Typen sind

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

Nun mein Problem hier beginnt, stelle ich mir po beitreten sition_summary Tabelle mit einer anderen Tabelle anfügen eine andere Spalte "current_price" des Typs f

Was ich tun möchte, ist die Punkte der offenen Positionen zu bestimmen.

Ich habe auf diese Weise versucht:

select 
    ?[open_pos>0;open_price-open_wavgprice;open_wavgprice-open] 
    from position_summary 

aber ich habe ‚Typ Fehler,

sicher, weil sum_order Typ F ist und open_wavgprice und CURRENT_PRICE sind f. Ich habe im Internet gesucht, indem ich nicht viel über F-Typ gefunden habe.

Erstens: Wie kann ich damit umgehen? Ich habe versucht, "caste" oder "raze" zu benutzen, aber keine Effekte und außerdem bin ich nicht sicher, ob sie bei dieser besonderen Gelegenheit richtig sind.

Zweitens: Gibt es eine bessere Möglichkeit, "Wenn-Dann" in Abfragetabellen zu verwenden (z. B. in Plain English: Wenn diese Zeile dieser Spalte dann die vorherige/nächste einer anderen Spalte oder die zweite oder dritte von vorherige/nächste Spalte)

Danke für Sie F bedeutet die „Zelle“ in der Spalte enthält einen Vektor von Schwimmern, anstatt ein Atom

Antwort

0

Art helfen. Ihre Spalte ist also eher ein Vektor von Vektoren als ein flacher Vektor.

In Ihrem Fall haben Sie einen Vektor der Größe 1 in jeder Zelle, so in Ihrem Fall, dass Sie nur tun konnten:

select first each close_position, first each average_price..... 

, die Ihnen f eine Art geben.

Ich bin nicht 100% auf, was Sie in der ersten Abfrage vorhatten, und ich weiß nicht aq Terminal Hand zu überprüfen, aber man könnte dies in Ihrer Anfrage setzen:

select close_position:?[prev[sum_order]>sum_order;last sum_order; last prev[sum_order]..... 

dh holen Sie sich die letzte sum_order in der Liste.

+0

Eigentlich konvertiert Ihre erste Abfrage wirklich Spalten in Typ f, aber seltsames Verhalten zeigt nichts als eine leere Spalte. – Max

0

Lassen Sie mich Ihre Frage umformulieren eine etwas einfachere Tabelle:

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 

Sie versuchen die Schließposition für jedes Symbol zu finden, eine Abfrage wie folgt aus:

q)show summary:select close:?[prev[size]>size;size;prev[size]] by sym from res 
sym| close 
---| ----- 
A | 91 
B | 47 

Das Ergebnis scheint habe in jeder Zeile der Spalte "close" eine Zahl, aber tatsächlich zwei. Sie können oben im Display einen zusätzlichen Raum vor jeder Nummer merken, oder Sie können

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

und sehen Sie die erste Zeile angezeigt wird, dass die erste Zeile in der „Nähe“ Spalte 0N 91 ist. Da die fehlenden Werte wie 0N als Leerzeichen angezeigt werden, war es schwierig, sie in der früheren Anzeige zu sehen.

Es ist nicht schwer zu verstehen, wie Sie diese beiden Werte haben. Da Sie von sym auswählen, jede Spalte von Symbol und das Symbol A gruppiert wird, haben Sie

q)show size:95 91 
95 91 

und

q)prev size 
0N 95 

die

q)?[prev[size]>size;size;prev[size]] 
0N 91 

(Es sei daran erinnert, dass 0N zu

führt, ist kleiner als jede andere ganze Zahl.)

Als Randnotiz ist ?[a>b;b;a] elementweise minimal und c ein als a & b in q geschrieben werden, so dass Ihr bedingter Ausdruck könnte als

q)size & prev size 
0N 91 

wir sehen können jetzt geschrieben werden, warum ? gab Ihnen den Typ Fehler

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

Während das Display täuscht, „close“ obige ist eine Liste von zwei Vektoren:

q)first close 
0N 91 

und

q)last close 
0N 47 

Der Vektor bedingt nicht, dass unterstützen:

q)?[close>0;10;20] 
'type 
    [0] ?[close>0;10;20] 
    ^

Man kann wahrscheinlich, dass Heilung von each mit:

q)?[;10;20]each close>0 
20 10 
20 10 

Aber ich glaube nicht, das ist das, was Sie wollen. Ihr Problem ist bei der Berechnung der Übersichtstabelle aufgetreten.Ich würde erwarten, dass die Schließposition die Summe von „B“ Aufträge abzüglich der Summe der „S“ Aufträge, die als

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

nun berechnet werden können, sollten Sie in der Lage sein, den Rest der Spalten in Ihrer Zusammenfassung zu beheben Abfrage. Stellen Sie nur sicher, dass Sie eine Aggregationsfunktion wie sum im Ausdruck für jede Spalte verwenden.

Verwandte Themen