Search code examples
kdb

How to find the days having a drawdown greater than X bips?


What would be the most idiomatic way to find the days with a drawdown greater than X bips? I again worked my way through some queries but they become boilerplate ... maybe there is a simpler more elegant alternative:

q)meta quotes
c   | t f a
----| -----
date| z    
sym | s    
year| j    
bid | f    
ask | f    
mid | f    

then I do:

bips:50;
`jump_in_bips xdesc distinct select date,jump_in_bips from (update date:max[date],jump_in_bips:(max[mid]-min[mid])%1e-4 by `date$date from quotes where sym=accypair) where jump_in_bips>bips;

but this will give me the days for which there has been a jump in that number of bips and not only the drawdowns.

I can of course put this result above in a temporary table and do several follow up selects like:

select ... where mid=min(mid),date=X
select ... where mid=max(mid),date=X

to check that the max(mid) was before the min(mid) ... is there a simpler, more idiomatic way?


Solution

  • I think maxs is the key function here, which allows you to maintain a running historical maximum, and you can compare your current value to that maximum. If you have some table quote which contains some series of mids (mids) and timestamps (date), the following query should return the days where you saw a drawdown greater than a certain value:

    key select by `date$date from quote 
      where bips<({(maxs[x]-x)%1e-4};mid) fby `date$date
    

    The lambda {(maxs[x]-x)%1e-4} is doing the comparison at each point to the historical maximum and checking if it's greater than bips, and fby lets you apply the where clause group-wise by date. Grouping with a by on date and taking the key will then return the days when this occurred.

    If you want to preserve the information for the max drawdown you can use an update instead:

    select max draw by date from 
      (update draw:(maxs[mid]-mid)%1e-4 by date from @[quote;`date;`date$])
      where bips<draw
    

    The date is updated separately with a direct modification to quote, to avoid repeated casting.