如何 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
谢谢,
瑞安
我有一个价格系列,我想知道发生 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
谢谢, 瑞安