請問CreateAnomalydetectionEngine 裡可以使用deltas(A>B)當作檢測A值穿越B嗎

我單純用A>B可以,但加deltas全部出不來,或者有沒有其他可以表達crossover之類的函數。

例如原本a<b, 當a>b 是穿越,只要警示這次就好,之後a>b不管。我單純測試可以,但用在異常檢測引擎就有問題。

attachments-2023-03-WpB7iaWB641285b3c97d7.png

请先 登录 后评论

1 个回答

wfHuang

对于当前点 A, B,要判断前面的线段是否发生 A > B 穿越,可以综合三个指标:

  • * 前一个点 A < 前一个点 B

  • * 当前点 A > 当前点 B

  • * A 所在线段斜率 > B 所在线段斜率

对应脚本如下:

share streamTable(1000:0, `time`sym`qty1`qty2, [TIMESTAMP, SYMBOL, INT, INT]) as trades
outputTable = table(1000:0, `time`sym`type`metric, [TIMESTAMP, SYMBOL, INT, STRING])
engine = createAnomalyDetectionEngine(name="anomalyDetection1", metrics=<[prev(qty1) <= prev(qty2) && qty1 >= qty2 && (qty1 - prev(qty1)) > (qty2-prev(qty2))]>, dummyTable=trades, outputTable=outputTable, timeColumn=`time, keyColumn=`sym)
subscribeTable(tableName="trades", actionName="anomalyDetectionSub1", offset=0, handler=append!{engine}, msgAsTable=true)
def writeData(n){
    timev = 2018.10.08T01:01:01.001 + 1..n
    symv =take(`A`B, n)
    qtyv1 = rand(1..10, n)
    qtyv2 = rand(4..14, n)
    trades.append!(table(timev, symv, qtyv1, qtyv2))
}
writeData(40);
select * from trades;
select * from outputTable

(1)验证 sym=`A,qty1 > qty2 的点:

t = select * from trades where sym = `A
plot(data=[t.qty1, t.qty2], labels=t.time)
attachments-2023-03-huHNFpfa641a65f3d4295.png

根据 sym=`A,qty1 和 qty2 的显示结果,可以看出警示点分别在 2018.10.08T01:01:01.0142018.10.08T01:01:01.0202018.10.08T01:01:01.030 位置。

select * from outputTable where sym=`A
attachments-2023-03-e84DqXUP641a6608cd0db.png

结果满足预期。

(2)验证 sym=`B,qty1 > qty2 的点:

t = select * from trades where sym = `B
plot(data=[t.qty1, t.qty2], labels=t.time)
attachments-2023-03-tgCMFlYb641a661288006.png
select * from outputTable where sym=`B
attachments-2023-03-sXgvKRus641a661a288ea.png

结果满足预期。

请先 登录 后评论