使用函数式更新批量添加参数化列及买卖信号计算实现
KDB+ 单行实现移动平均、信号转换及综合信号计算
原始表定义
t:([] ticker:`IBM`IBM`IBM`IBM`IBM; time:2025.04.07D09:15:00.000000000 2025.04.08D09:15:00.000000000 2025.04.11D09:15:00.000000000 2025.04.15D09:15:00.000000000 2025.04.16D09:15:00.000000000; close:22161.6 22535.85 22828.55 23328.55 23437.)
单行实现语句
update signal:{first key g where g=max g:count each group x} each flip ("sMA",string each 10+til 81) from update ("sMA",string each 10+til 81)!{?[x>=close;`BUY;`SELL]} each ("MA",string each 10+til 81) from update`[t;`ticker;("MA",string each 10+til 81)!{mavg[x;close]} each 10+til 81]
各部分说明
添加MA10至MA90列
用函数式update按ticker分组,通过10+til 81生成10到90的整数序列,批量生成MA10到MA90的列名,同时对每个n调用mavg[n;close]计算对应窗口的移动平均,最后通过字典映射一次性完成多列添加。生成sMA10至sMA90信号列
基于已生成的MA列,批量创建sMA前缀的信号列:用三元判断函数?[x>=close;BUY;SELL],当移动平均值大于等于收盘价时标记BUY,否则标记SELL。计算综合signal列
对每行的所有sMA信号列,先统计BUY和SELL的出现次数,取出现次数更多的信号作为该行的signal值;由于本例中信号列共81列(奇数),不会出现次数相等的情况,若需处理偶数列的平局场景,可自行调整判断逻辑。
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

