Di KDB saya memiliki tabel dengan 4 kolom, salah satunya adalah kolom pengembalian. Saya ingin membuat kolom ke-5 yang menghitung varians (var) dari elemen x terakhir dari kolom tertentu. Saya telah mengelola ini dengan dua kolom yang membuat pengembalian kolom harga, tetapi macet ketika saya perlu merujuk lebih dari satu elemen sebelumnya.

Contoh:

t:([] td:2001.01.01 2001.01.02 2001.01.03 2001.01.04 2001.01.05 2001.01.06; px:121 125 127 126 129 130)
t:update retLogPcnt:100*log px%prev px from t
/t:update retClassic:((px-prev px)%prev px) from t
t:update mvAvgRet:2 mavg retLogPcnt from t
t

Output dari baris terakhir:

td         px  retLogPcnt mvAvgRet 
-----------------------------------
2001.01.01 121                     
2001.01.02 125 3.252319   3.252319 
2001.01.03 127 1.587335   2.419827 
2001.01.04 126 -0.790518  0.3984085
2001.01.05 129 2.35305    0.7812659
2001.01.06 130 0.7722046  1.562627 

Output yang diinginkan jika menghitung, sebagai ilustrasi saja, var dari tiga angka retLogPcnt terakhir:

td         px  retLogPcnt mvAvgRet  varRetns
---------------------------------------------
2001.01.01 121                     
2001.01.02 125 3.252319   3.252319  
2001.01.03 127 1.587335   2.419827  
2001.01.04 126 -0.790518  0.3984085 2.752321
2001.01.05 129 2.35305    0.7812659 1.791392
2001.01.06 130 0.7722046  1.562627  1.647022

Jadi nomor var pertama telah dihitung dengan:

q)var 3.252319 1.587335 -0.790518

Bagaimana saya bisa menambahkan kolom tambahan ini? Saya melakukan beberapa upaya yang mirip dengan contoh rata-rata bergerak saya di atas (t:update mvAvgRet:2 mavg retLogPcnt from t) namun saya tidak berhasil.

Mohon maaf jika sudah pernah dijawab sebelumnya; Saya melakukan pencarian di forum tetapi tidak dapat menemukan apa pun yang membantu saya. Ini mungkin karena memahami terminologi kdb.

1
Sven F. 6 Januari 2018, 02:04

1 menjawab

Jawaban Terbaik

Anda mungkin ingin memeriksa halaman ini di wiki yang membahas jendela geser. Di mana itu menggambarkan fungsi jendela geser swin dengan contoh ini:

q)swin:{[f;w;s] f each { 1_x,y }\[w#0;s]}
q)swin[avg; 3; til 10]
0 0.33333333 1 2 3 4 5 6 7 8

Ini dapat dimodifikasi untuk tujuan Anda dengan menggunakan daftar float untuk memulai dengan:

swin:{[f;w;s] f each { 1_x,y }\[w#0f;s]}

Seperti yang:

q)update varRetns:swin[var;3;retLogPcnt] from t
td         px  retLogPcnt mvAvgRet varRetns
-------------------------------------------
2001.01.01 121                     0
2001.01.02 125 3.25232    3.25232  2.64439
2001.01.03 127 1.58733    2.41983  0.693043
2001.01.04 126 -0.790518  0.398408 2.75232
2001.01.05 129 2.35305    0.781266 1.79139
2001.01.06 130 0.772205   1.56263  1.64702

Yang dekat dengan output contoh Anda kecuali untuk 3 nilai awal yang bukan nol. Jika Anda ingin mengecualikan nilai-nilai ini, perubahan lebih lanjut diperlukan pada fungsi var, yang telah saya definisikan sebagai newVar:

newVar:{$[any null x;0Nf;var x]}

q)update varRetns:swin[newVar;3;retLogPcnt] from t
td         px  retLogPcnt mvAvgRet varRetns
-------------------------------------------
2001.01.01 121
2001.01.02 125 3.25232    3.25232
2001.01.03 127 1.58733    2.41983
2001.01.04 126 -0.790518  0.398408 2.75232
2001.01.05 129 2.35305    0.781266 1.79139
2001.01.06 130 0.772205   1.56263  1.64702
2
Thomas Smyth 6 Januari 2018, 09:24