在kdb中获取非重叠交易

问题描述 投票:0回答:1

我有一张桌子

t
作为

q)trades: ([]
    signalTime: 2024.01.05 2024.01.12 2024.01.19 2024.01.25 2024.02.02 2024.02.09 2024.02.16 2024.02.23 2024.03.01 2024.03.07;
    exitTime: 2024.01.25 2024.02.01 2024.02.08 2024.02.15 2024.02.22 2024.02.29 2024.03.07 2024.03.14 2024.03.21 2024.03.28
 );
signalTime exitTime
----------------------
2024.01.05 2024.01.25
2024.01.12 2024.02.01
2024.01.19 2024.02.08
2024.01.25 2024.02.15
2024.02.02 2024.02.22
2024.02.09 2024.02.29
2024.02.16 2024.03.07
2024.02.23 2024.03.14
2024.03.01 2024.03.21
2024.03.07 2024.03.28

我只想保留其干预日期(在

signalTime
exitTime
之间)不与任何其他交易(行)重叠的交易。或者,在任何给定日期内应该只有一笔交易。预期输出应该是

signalTime exitTime
----------------------
2024.01.05 2024.01.25
2024.02.02 2024.02.22
2024.02.23 2024.03.14

虽然我能够使用

do
循环构思解决方案,但我如何以更高效、更惯用的
q
来实现这一点?

这是我使用

do
循环解决方案的微弱尝试,尽管它并不完全正确。

removeOverlappingTrades:{[t]
    n: count t;
    accept: n#0b;          
    accept[0]: 1b;         
    lastExitTime: t[`exitTime][0]; 
    do[n-1; {[t;lastExitTime;accept;x]
        i: x+1;  // Current index
        if[t[`signalTime][i] >= lastExitTime;
           accept[i]: 1b;
           lastExitTime: t[`exitTime][i];
          ];
    }[t;lastExitTime;accept] each til n-1];
    t where accept
 };
kdb
1个回答
0
投票

此逻辑返回的行具有一些未出现在任何其他行中的日期:

//Extract unique dates and rows associated
q)r:ungroup select row:i,dates:signalTime + til each 1+exitTime-signalTime from trades
//Filter on dates that only appear on one row
q)r:select distinct row from r where 1=(count;row) fby dates
q)r
row
---
0
9
//Extract the rows from the input table
q)trades r`row
signalTime exitTime
---------------------
2024.01.05 2024.01.25
2024.03.07 2024.03.28
© www.soinside.com 2019 - 2024. All rights reserved.