Kdb 如何选择存在x BIP差异的价格序列的指数?

Kdb 如何选择存在x BIP差异的价格序列的指数?,kdb,q-lang,Kdb,Q Lang,我有一个价格系列,我想知道x bips变化的指数。我想出了一个非常难看的方法来循环完成这个任务 q)bips:200 q)level:0.001*bips / 0.2 q)price: 1.0 1.1 1.3 1.8 1.9 2.0 2.3 q)ix:0 q)lastix:0 q)result:enlist lastix q)do[count price;if[abs(price[ix]-price[lastix])>level;result,:ix;lastix:ix];ix:ix+1]

我有一个价格系列,我想知道x bips变化的指数。我想出了一个非常难看的方法来循环完成这个任务

q)bips:200
q)level:0.001*bips / 0.2
q)price: 1.0 1.1 1.3 1.8 1.9 2.0 2.3
q)ix:0
q)lastix:0
q)result:enlist lastix
q)do[count price;if[abs(price[ix]-price[lastix])>level;result,:ix;lastix:ix];ix:ix+1];
q)result
  0 2 3 6
这是一个简单的O(n)算法,它遍历价格序列,并从第一个元素开始保留一个标记的索引(lastix),直到找到一个差价大于
bips
when found保存该索引并用找到的索引更新lastix。。。有没有更惯用的方法

我在循环中的if条件有点缺陷,我不知道为什么我选择
abs(price[lastix]-price[ix])
而不是
abs(price[ix]-price[lastix])
结果不正确

更新:我知道
delta
,但它只比较连续的元素,这不是我在OP中需要的。如果OP中的价格系列示例不明确,并且通过简单使用
delta
得到正确的结果,我深表歉意。这里我有一个新价格系列的反例:

q)price: 1.0 1.1 1.21 1.42 1.4 1.32 1.63
q)where abs deltas price > level
,0
这是不正确的。被接受的答案产生的正确结果仍然是正确的

0 2 3 6

我不确定这是否正是您想要的,但Delta将为您提供连续对之间的变化:

q)deltas price
1 0.1 0.2 0.5 0.1 0.1 0.3
检查您的条件将返回一个布尔列表:

q)level<=deltas price
1011001b

q)level我不确定这是否正是您想要的,但Delta将为您提供连续对之间的更改:

q)deltas price
1 0.1 0.2 0.5 0.1 0.1 0.3
检查您的条件将返回一个布尔列表:

q)level<=deltas price
1011001b
q)级别
level:0.001*bips:200;
结果:其中水平<代码>水平:0.001*bips:200;

结果:其中level您在答案中包含了index
0
,但如果您想排除它,您可以使用以下两种参数形式:


q)其中level您已在答案中包含索引
0
,但如果您想排除它,您可以使用以下两种参数形式:


q)其中level我想你在找这样的东西,也许:

f:{where differ{$[level<abs[y-x];y;x]}\[x]}
由于最终值大于0.2,大于1.8,因此更新级别的最后一个值

q)f newprice
0 2 3 6
谢谢,
Ryan

我想你在找这样的东西,也许:

f:{where differ{$[level<abs[y-x];y;x]}\[x]}
由于最终值大于0.2,大于1.8,因此更新级别的最后一个值

q)f newprice
0 2 3 6
谢谢,
Ryan

这个答案产生了正确的结果!非常感谢。哦,这个解决方案缺少一个
abs
,也就是说,它应该是
f:{在不同的地方{$[levelAh当然,我把这个变化误解为增加。现在编辑,谢谢。这个答案产生了正确的结果!谢谢!哦,这个解决方案缺少
abs
,也就是说,它应该是
f:{在不同的地方{$[levelAh当然,我误解了这一变化是一种增长。现在编辑,谢谢。