如何 select 价格序列的指数存在 x 点的差异?

How to select the indices of a price series where there is a difference of x bips?

我有一个价格系列,我想知道发生 x 点变化的指数。我想出了一个非常丑陋的方法来循环完成这个,例如

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 的价格保存该索引并使用找到的索引更新 lastix ...是否有更惯用的方法来做到这一点?

我在循环中的 if 条件有些缺陷不知道为什么如果我检查 abs(price[lastix]-price[ix]) 而不是 abs(price[ix]-price[lastix]) 它不会给出正确的结果。

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

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

我不确定这是否正是您要查找的内容,但增量会为您提供连续对之间的变化:

q)deltas price
1 0.1 0.2 0.5 0.1 0.1 0.3

正在检查您的条件return一个布尔列表:

q)level<=deltas price
1011001b

最后 'where' 将 return 索引:

q)where level<=deltas price
0 2 3 6

谢谢, 杰米

level:0.001*bips:200;
result:where level<=abs deltas price:1.0 1.1 1.3 1.8 1.9 2.0 2.3;

result
0 2 3 6

这是否接近您要查找的内容?

Deltas 检查当前值和下一个值之间的差异,abs 将取绝对值,然后您将每个差异与您预定义的 "level" 进行比较, 使用 where 找到关联的索引。

您在答案中包含了索引 0,但如果您想排除它,您可以使用 deltas:

的两个参数形式
q)where level<=abs deltas[price 0;price]
2 3 6

第一个参数设置要带走的初始值,在本例中是 price 列表的第一个元素。

这可能有益的一个例子是,如果您是 运行 分区数据库中每个日期的函数,您可以传入前一天的最后一个值以确保您没有得到bips.

没有显着差异的指数

我想你可能正在寻找这样的东西:

f:{where differ{$[level<abs[y-x];y;x]}\[x]}

这会继承上一个满足条件的值,并使用 if 与 scan 副词进行比较,然后使用 difference 来找出满足条件并更新值的位置。

如果我没有正确理解你的问题,那么

应该会得出相同的结果
newprice:1 1.1 1.3 1.8 1.9 2 2.1

由于最终值大于 0.2 大于 1.8,因此更新级别的最后一个值。

q)f newprice
0 2 3 6

谢谢, 瑞安