如何在kdb中针对指定规模循环单元格数据计算精准VWAP价格?
KDB+ 计算指定规模对应的精准VWAP价格
先来看你的示例表:
mkt:([] date:2018.05.05 2018.05.05 2018.05.05 2018.05.05; time:2018.05.05D01:30:00 2018.05.05D01:30:01 2018.05.05D01:30:01 2018.05.05D01:30:02; bid:((1.2110 1.21105);(1.2111 1.2109 1.2112);(1.2111 1.2109);(1.2110 1.21105)); bidSize:((3000000 1000000);(500000 1000000 1000000);(1000000 2000000);(1000000 1000000)); ask:((1.2111 1.21115);(1.2112 1.2110 1.2113);(1.2112 1.2110);(1.2111 1.21115)); askSize:((3000000 1000000);(500000 1000000 1000000);(1000000 2000000);(1000000 1000000)))
你提到之前用整行加权平均的方案精度不足,想要通过循环单元格内的数据,精准计算指定规模对应的VWAP。咱们可以这么实现:
步骤1:写单条记录的VWAP计算函数
先搞一个处理单条记录的辅助函数,它会逐层累加订单簿的规模,直到达到目标量,精准计算对应的加权均价:
calcVwap:{[targetSize; prices; sizes] // 计算每个层级的累计规模 cumSizes: sums sizes; // 找到第一个累计规模超过/等于目标的层级 idx: first where cumSizes >= targetSize; // 如果总规模不够目标,返回0(你可以根据需求改成其他逻辑,比如返回最后一层均价) if[idx=0; :0f]; // 计算前面完整层级的总金额和总规模 prevTotal: sum prices[0:idx-1] * sizes[0:idx-1]; prevSize: sum sizes[0:idx-1]; // 计算当前层级需要补的剩余规模对应的金额 remaining: targetSize - prevSize; currentTotal: prices[idx] * remaining; // 总VWAP = 总金额 / 目标规模 (prevTotal + currentTotal) % targetSize }
步骤2:写处理整张表的主函数
把上面的辅助函数应用到整张表的每一行,同时计算累计规模方便后续过滤:
getTargetVwap:{[targetSize; table] select date, time, // 给每一行的bid和ask分别计算目标规模的VWAP bidVwap: calcVwap[targetSize]'[bid; bidSize], askVwap: calcVwap[targetSize]'[ask; askSize], // 计算累计的bid/ask总规模,用于找到首次达标记录 cumulBidSize: sums sum each bidSize, cumulAskSize: sums sum each askSize from table }
步骤3:调用函数并验证
现在你可以传入目标规模(比如5000000)和你的表来计算:
// 计算目标规模5000000的VWAP result: getTargetVwap[5000000; mkt] // 查看结果 result
如果要找到累计bid规模首次达到5000000的那条记录,直接过滤就行:
1#select from result where cumulBidSize >= 5000000
这个方案的核心是逐层级累加计算,不会像整行wavg那样忽略“只取到某一层部分规模”的情况,精度会更准确。
内容的提问来源于stack exchange,提问作者matthew.j
相关产品推荐
相关产品推荐

