Существует ли более элегантный / функциональный способ расчета средней цены?

#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 рассчитал среднюю цену, взвешенную по количеству.