#kdb
#kdb
Вопрос:
Я сталкивался с этой задачей несколько раз и считаю, что она довольно распространена в торговле: вычислить средневзвешенную цену по объему.
У меня есть эта таблица, в которой представлены значения цены и кол-ва:
t:([] qty:500j, 1400j, 1700j, 600j, 1500j, 1500j, 1200j, 1300j, 1600j, 1700j; price:9.96 9.94 10.02 9.91 9.93 10.03 10.09 9.97 9.98 10.08)
Обычно я рассчитываю среднюю цену следующим образом:
(sum exec qty*price from t)%(sum exec qty from t)
Есть ли более функциональный способ? Может быть, с помощью наречий?
Ответ №1:
Используйте функцию ‘wavg‘:
q)select qty wavg price from t
Комментарии:
1. Не знал, что такая функция существует. Спасибо. Всегда впечатляет, насколько мощным является q и позволяет выразить то, что вы хотите выразить, с таким небольшим количеством кода.
Ответ №2:
При использовании таблицы без ключа:
t[`qty]wavg t[`price]
Ответ №3:
Самым простым способом было бы использовать select qty wavg price from t
, однако замена select
на exec
вернет атомарное значение, а не таблицу, которая могла бы лучше соответствовать вашим потребностям
exec qty wavg price from t
wavg рассчитал среднюю цену, взвешенную по количеству.