如何在KDB+中按Symbol计算表的累计加权平均价格(含全部历史记录)
KDB+ 按Symbol计算累计加权平均价格
需求说明
针对表内每个sym(Symbol),计算包含该Symbol所有历史记录的累计加权平均价格,加权因子为size,价格为price。
输入表
q)t:([]sym:`a`a`a`b`b;size:(2;6;2;7;5);price:(2;10;3;4;9)) q)show t sym size price -------------- a 2 2 a 6 10 a 2 3 b 7 4 b 5 9
解决方案
利用KDB+的分组累计计算能力,通过sums函数分别统计累计总成交额和累计总成交量,再做除法得到加权平均:
q)update avgPrice: (sums size*price) % sums size by sym from t
运行结果
q)show update avgPrice: (sums size*price) % sums size by sym from t sym size price avgPrice ----------------------- a 2 2 2 a 6 10 8 a 2 3 7 b 7 4 4 b 5 9 6.083333
(注:若需保留三位小数,可使用round[;3]处理结果,如update avgPrice: round[(sums size*price) % sums size;3] by sym from t)
代码解释
sums size*price:按sym分组后,计算每组内size*price的累计和(累计总成交额)sums size:按sym分组后,计算每组内size的累计和(累计总成交量)%:KDB+的除法运算符,将累计成交额除以累计成交量,得到累计加权平均价格by sym:确保每个Symbol的累计计算独立进行,不同Symbol的历史记录互不干扰
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

