
    aj                       d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZmZ d dlmZmZmZ  ed	
           G d d                      Zd'dZdddd(dZd)d"Zd*d+d%Zed&k    r e e                      dS ),    )annotationsN)	dataclass)Path)MappingSequence)	BotConfigRuntimePaths)Candlefetch_hyperliquid_candles)effective_required_drop_pctleverage_for_coinroe_crash_required_drop_pctT)frozenc                  t    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   dS )CrashFrequencystrcoinfloatleveragerequired_drop_pctroe_equivalent_drop_pctinteventscandlesdaysevents_per_dayzfloat | Nonemedian_gap_hoursworst_drop_pctN)__name__
__module____qualname____annotations__     crash_frequency.pyr   r      s{         IIIOOO""""KKKLLLKKK""""r$   r   r   Sequence[Candle]idxr   window_candlesreturnr   c                    t          d||z
  dz             }t          d | ||dz            D                       }| |         j        }|dk    s|dk    rdS ||z
  |z  dz  S )Nr      c              3  $   K   | ]}|j         V  d S N)high).0rows     r%   	<genexpr>z$_rolling_drop_pct.<locals>.<genexpr>   s$      ;;Csx;;;;;;r$           g      Y@)maxclose)r   r'   r(   startr.   r4   s         r%   _rolling_drop_pctr6      sz    3'!+,,E;;75#'>#:;;;;;DCLEqyyEQJJsT\T!U**r$      )window_minutesinterval_minutesr   r   cfgr   r8   
int | Noner9   c               Z   |p|j         }t          dt          ||z                      t          ||           }fdt	          t                              D             }g }d}t          |          D ]9\  }	}
|
| k    }|r)|s'|                    t          |	j	                             |}:d t          ||dd                    D             }|r%t          |          t          |          dz           nd }t                    dk    r8t          d         j	                  t          d         j	                  z
  dz  nd	}t          |                                 t          ||           t          |d
          t          t          ||           d
          t          |          t                    t          |d          |dk    r t          t          |          |z  d
          nd	|t          |d          nd |rt          t          |          d
          nd	
  
        S )Nr+   c                2    g | ]}t          |          S r#   )r6   )r/   r'   r   r(   s     r%   
<listcomp>z&count_crash_events.<locals>.<listcomp>/   s&    \\\w^<<\\\r$   Fc                $    g | ]\  }}||z
  d z  S )i  r#   )r/   abs      r%   r>   z&count_crash_events.<locals>.<listcomp>7   s$    CCCtq!QUdNCCCr$      r   iQ r2      )
r   r   r   r   r   r   r   r   r   r   )crash_window_minutesr3   roundr   rangelenzipappendr   tssortedr   upperr   r   min)r   r   r:   r8   r9   requireddropsevent_tsin_eventcandledrophitgaps
median_gapr   r(   s    `             @r%   count_crash_eventsrX   $   s$    $?s'?NE.3C"CDDEEN*355H\\\\\cRYllH[H[\\\EHHGU++  xi 	.x 	.OOE&),,---CCs8Xabb\'B'BCCCD15?c$ii1n--4JGJ7||WXGXGXU72;>""U71:=%9%99UBB^aDZZ\\"3--!,, %&A#t&L&La P P8}}G4^^9=uS]]T11555s1;1Gz1---T/4=uSZZ+++#   r$   rowsSequence[CrashFrequency]
hours_backc               `   dd| dd|dz  dddd	g}t          | d
           D ]t}|j        dn
|j        dd}|                    |j         d|j        dd|j        dd|j        dd|j        dd|j         d|j	        dd| d|j
        dd           ud                    |          S )NzCrash Frequency ReportzWindow: zm rolling high-to-close dropz	History:    z.1fdzWThreshold: max(strategy flash_crash_trigger_pct, crash_roe_trigger_pct / coin_leverage) c                     | j          | j        fS r-   )r   r   )items    r%   <lambda>z)render_frequency_report.<locals>.<lambda>P   s    t/B.BDI-N r$   )keyzn/ahz: lev=gzx required=z.2fz% (15% ROE equiv=z%), coverage=z
d, events=z
, per_day=z.3fz, median_gap=z, worst=%
)rL   r   rJ   r   r   r   r   r   r   r   r   join)rY   r8   r[   linesr0   gaps         r%   render_frequency_reportrk   H   sW    ?>???*JO****a
E d N NOOO 
 
+3eeC<P9W9W9W9Wx x xs|W x x#:OW x x!9]x xLOH]x xjx x,/,>wx xQTx x^a^pwx x x	
 	
 	
 	

 99Ur$   argvlist[str] | Nonec           
     &   t          j                    }t          j        |          }t	          j        d          }|                    ddt          |j                  pg d           |                    dt          d	           |                    d
d           |                    dt          d	           |
                    |           }|j                            d          r't          |j                            d                    nd}|j        dz  }g }|j        D ]w}t!          |                                |j        |j        ||j                  }	|	r>|                    t+          |                                |	||j        |                     xt/          ||j        |j                  }
|j        d|j        dz   d|j         dz  }|                    |
d           t5          |
           t5          d|            dS )Nz3Measure leverage-normalized crypto crash frequency.)descriptionz--coins*)BTCETHSOLHYPE)nargsdefaultz--hours-backip  )typerv   z
--interval5m)rv   z--window-minutes   mr7   candle_cache)intervalr[   	cache_dir
tls_verify)r:   r8   r9   )r8   r[   crash_frequency_r]   d_z.txtzutf-8)encodingzReport: r   )r   	from_filer	   from_configargparseArgumentParseradd_argumentlistallowed_coinsr   
parse_argsr|   endswithrstripruntime_dircoinsr   rM   r[   r~   rJ   rX   r8   rk   reports_dir
write_textprint)rl   r:   pathsparserargsr9   r}   rY   r   r   reportreport_paths               r%   mainr   Z   sB   



C$S))E$1fgggF
	d3;L6M6M6nQnQnQnooo
S'BBB
d333
*bAAAT""D9=9O9OPS9T9T[s4=//44555Z[!N2I!#D
 S S+DJJLL4=]a]l  yB  OR  O]  ^  ^  ^ 	SKK*4::<<cZ^Zm  AQ  R  R  R  S  S  S$T$:MZ^ZijjjF#&eB9N&e&eRVR_&e&e&eeK6G444	&MMM	
"[
"
"###1r$   __main__)r   r&   r'   r   r(   r   r)   r   )r   r   r   r&   r:   r   r8   r;   r9   r   r)   r   )rY   rZ   r8   r   r[   r   r)   r   r-   )rl   rm   r)   r   )
__future__r   r   dataclassesr   pathlibr   typingr   r   configr   r	   historical_replayr
   r   	near_missr   r   r   r   r6   rX   rk   r   r   
SystemExitr#   r$   r%   <module>r      s   " " " " " "  ! ! ! ! ! !       $ $ $ $ $ $ $ $ * * * * * * * * ? ? ? ? ? ? ? ? a a a a a a a a a a $
 
 
 
 
 
 
 
+ + + + "&! ! ! ! ! !H   $    2 z
*TTVV

 r$   