+
    /iU                         R t ^ RIt^ RIt^ RIt^ RIHt RtRt^dt^t	Rt
Rt^t. ROtR tR tR	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tR t]R8X  d   ]! 4        R t R# )u   
KALSHIBOT LEARNING ENGINE  —  analyzer.py
Reads trade_analytics.json and finds what conditions actually win.
After 100+ trades it writes auto_params.json which the bot loads on startup.

Run anytime:  python analyzer.py
N)defaultdictz!C:\kalshibot\trade_analytics.jsonzC:\kalshibot\auto_params.jsong333333?皙?c                     \         P                  P                  \        4      '       g   \	        R 4       . # \        \        4      ;_uu_ 4       p \        P                  ! V 4      pRRR4       X Uu. uF  q"P                  R4      R8X  g   K  VNK  	  pp\	        R\        V4       R24       V#   + '       g   i     LR; iu upi )z=  No trade_analytics.json yet. Run the bot for a while first.Neventexitz	  Loaded z& completed trades from analytics log.
)
ospathexistsANALYTICS_PATHprintopenjsonloadgetlen)fdatarexitss       analyzer.py
load_exitsr      s    77>>.))MN		n		yy| 
91g& 8QQE9	Ic%j\!H
IJL	 
	9s   B/1CC/B?	c                 `   \        R  4      pV  F  pV! V4      pWF,          R;;,          ^,          uu&   WF,          R;;,          VP                  R^ 4      ,          uu&   VP                  R4      R8X  g   Ki  WF,          R;;,          ^,          uu&   K  	  \        RV R24       . p\        V4       F  pWF,          pVR,          \        8  d   K  VR,          VR,          ,          ^d,          p	VR,          VR,          ,          p
VP                  WhR,          WVR,          34       V! V4      pR\        V	^,          4      ,          pV	^78  d   R	M
V	^-8  d   R
MRp\        RVR RVR,          R RV	R RV V RV
R 24       K  	  V'       g   \        R\         R24       \        4        V# )c                      R ^ R^ RR/# )winstotalpnl         r       r   <lambda>!bucket_win_rate.<locals>.<lambda>%   s    61gq%"Er   r   r   outcomeWINr   u	     ── u    ──u   █u     ✅u     ⚠️     z<22  >4z trades  WR:z>5.1f%  z  avg P&L:$>+.3fz    Not enough data yet (need z+ per bucket).)r   r   r   sortedMIN_BUCKET_SIZEappendint)tradeskey_fnlabel_fntitlebucketstkrowsdwravglabelbarflags   &&&&          r   bucket_win_rater;   $   s}   EFG1I
7q 
5quuUA.55u$Jv!#  
IeWG
$%DG_JW:'i!G*$s*h7#Q'
BQuX67BF#8R*RU3Kr!G*RRJc#tfT_`cdi_jkl  ..?~NO	GKr   c                 (    R  p\        V R VRR7      # )c                 j    V ^8  d   RMRpV ^8:  d   T MV ^,
          pV^ 8X  d   ^MTpVR RVR RV 2# )   AMPM02dz:00-z:59 r   )hampmhrs   &  r   
hour_label'analyze_time_of_day.<locals>.hour_label@   sH    2vt4GqR1Wr"SbXT$00r   c                 &    V P                  R ^ 4      # )hourr   r2   s   &r   r   %analyze_time_of_day.<locals>.<lambda>F   s    QUU61-r   zWin Rate by Hour of Dayr.   r/   r0   r;   )r   rE   s   & r   analyze_time_of_dayrN   ?   s!    1
 5-,. .r   c                (    R p\        V VR RR7      # )z5Break win rate down by total confidence score bucket.c                     V P                  R ^ 4      pV^8  d   R# V^
8  d   R# V^8  d   R# V^8  d   R# V^8  d   R# V^(8  d   R# R# )confidence_scorez0-6   (below threshold)z7-9   (MEDIUM low)z10-14 (MEDIUM mid)z15-19 (MEDIUM high)z20-27 (near HIGH)z28-39 (HIGH)z40+   (HIGH strong)rI   r2   ss   & r   bucket(analyze_confidence_score.<locals>.bucketL   sQ    EE$a(U5V0V0V1V/VN1r   c                     R V  2# )zScore r   r3   s   &r   r   *analyze_confidence_score.<locals>.<lambda>W   
    vaS\r   zWin Rate by Confidence ScorerL   rM   r   rT   s   & r   analyze_confidence_scorer[   J   s!    2 5)13 3r   c                (    R p\        V VR RR7      # )z3Win rate by EXP (expiration value) component score.c                 r    V P                  R ^ 4      pV^ 8X  d   R# V^8  d   R# V^8  d   R# V^8  d   R# R# )	exp_scorezEXP=0  (no mispricing)zEXP=1-7  (weak)zEXP=8-14 (moderate)zEXP=15-24 (strong)zEXP=25+  (very strong)rI   rR   s   & r   rT   !analyze_exp_score.<locals>.bucket\   s=    EE+q!!V5U.V2V15r   c                     V # Nr   rW   s   &r   r   #analyze_exp_score.<locals>.<lambda>e       Qr   z/Win Rate by EXP Score (Expiration Value Signal)rL   rM   rZ   s   & r   analyze_exp_scorerd   Z   s#    6 5DF Fr   c                (    R p\        V VR RR7      # )z4Win rate by LAG (Kalshi lag vs BTC) component score.c                 `    V P                  R ^ 4      pV^ 8X  d   R# V^
8  d   R# V^8  d   R# R# )	lag_scorezLAG=0  (no lag detected)zLAG=1-9  (small lag)zLAG=10-19 (moderate)zLAG=20+  (strong lag)rI   rR   s   & r   rT   !analyze_lag_score.<locals>.bucketj   s3    EE+q!!V7V3V34r   c                     V # ra   r   rW   s   &r   r   #analyze_lag_score.<locals>.<lambda>r   rc   r   z,Win Rate by LAG Score (Kalshi Lag Detection)rL   rM   rZ   s   & r   analyze_lag_scorerk   h   s#    5 5AC Cr   c                $    \        V R R RR7      # )u/   Win rate by confidence tier — HIGH vs MEDIUM.c                 &    V P                  R R4      # )confidence_tier?rI   rJ   s   &r   r   %analyze_signal_tier.<locals>.<lambda>x   s    QUU#4c:r   c                     R V  2# )zTier: r   rW   s   &r   r   rp   y   rY   r   z,Win Rate by Confidence Tier (HIGH vs MEDIUM)rL   rM   )r   s   &r   analyze_signal_tierrr   u   s    5:)AC Cr   c                (    R p\        V VR RR7      # )zAFind which combinations of EXP+LAG together produce best results.c                 P   V P                  R ^ 4      ^ 8  pV P                  R^ 4      ^ 8  pV P                  R^ 4      ^ 8  p. pV'       d   VP                  R4       V'       d   VP                  R4       V'       d   VP                  R4       V'       d   RP                  V4      # R# )r^   rg   	mom_scoreEXPLAGMOM+none)r   r+   join)r2   explagmompartss   &    r   rT   #analyze_score_combo.<locals>.bucket~   s    eeK#a'eeK#a'eeK#a'U#U#U#"'sxx3V3r   c                     R V  2# )z	Signals: r   rW   s   &r   r   %analyze_score_combo.<locals>.<lambda>   s
    y_r   z4Win Rate by Signal Combination (which signals fired)rL   rM   rZ   s   & r   analyze_score_combor   |   s#    4 5,IK Kr   c                 (    R  p\        V VR RR7      # )c                 r    V P                  R ^ 4      pVR8  d   R# VR8  d   R# VR8  d   R# VR8  d   R# R	# )
momentum_strengthg      ?z	1.0x-1.5xg       @z	1.5x-2.0xg      @z	2.0x-3.0xg      @z	3.0x-5.0xz5.0x+rI   rR   s   & r   rT   )analyze_momentum_strength.<locals>.bucket   s:    EE%q)W[W[W[W[$r   c                     V # ra   r   rW   s   &r   r   +analyze_momentum_strength.<locals>.<lambda>   rc   r   z+Win Rate by Momentum Strength (x threshold)rL   rM   rZ   s   & r   analyze_momentum_strengthr      s#    % 5@B Br   c                 (    R  p\        V VR RR7      # )c                     V P                  R R4      pVR8  d   R# VR8  d   R# VR8  d   R# VR8  d   R	# VR
8  d   R# R# )entry_price      ?      ?z	0.15-0.25gffffff?z	0.25-0.35?z	0.35-0.45皙?z	0.45-0.55?z	0.55-0.65z	0.65-0.75rI   )r2   ps   & r   rT   $analyze_market_price.<locals>.bucket   sB    EE-%XkXkXkXkXk)r   c                     R V  2# )zContract @ r   rW   s   &r   r   &analyze_market_price.<locals>.<lambda>       {1#.r   zWin Rate by Entry PricerL   rM   rZ   s   & r   analyze_market_pricer      s!    * 5.,. .r   c                 (    R  p\        V VR RR7      # )c                 r    V P                  R ^ 4      pVR8  d   R# VR8  d   R# VR8  d   R# VR8  d   R# R	# )
btc_volatilityg{Gz?zvery_low  <0.02%皙?zlow       0.02-0.05%皙?zmedium    0.05-0.10%皙?zhigh      0.10-0.20%zextreme   >0.20%rI   )r2   vs   & r   rT   "analyze_volatility.<locals>.bucket   s>    EE"A&X0X4X4X40r   c                     R V  2# )zVolatility r   rW   s   &r   r   $analyze_volatility.<locals>.<lambda>   r   r   zWin Rate by BTC VolatilityrL   rM   rZ   s   & r   analyze_volatilityr      s!    1 5./1 1r   c                 (    R  p\        V VR RR7      # )c                 r    V P                  R R4      pVR8  d   R# VR8  d   R# VR8  d   R# VR8  d   R# R	# )
	secs_leftiX  i  z750-900s (12-15m left)z600-750s (10-12m left)i  z450-600s (7-10m left),  z300-450s (5-7m left)z< 300s   (<5m left)rI   rR   s   & r   rT   !analyze_time_left.<locals>.bucket   s=    EE+s#W5W5W4W32r   c                     V # ra   r   rW   s   &r   r   #analyze_time_left.<locals>.<lambda>   rc   r   z(Win Rate by Time Left in Window at EntryrL   rM   rZ   s   & r   analyze_time_leftr      s!    3 5=? ?r   c                 (    R  p\        V VR RR7      # )c                 `    V P                  R R4      pVR8  d   R# VR8  d   R# VR8  d   R# R# )market_spreadr   r   zspread <5c  (tight)zspread 5-10c333333?zspread 10-15czspread >15c (wide)rI   )r2   sps   & r   rT   analyze_spread.<locals>.bucket   s1    UU?D)$Y4$Y~$Y3r   c                     V # ra   r   rW   s   &r   r    analyze_spread.<locals>.<lambda>   rc   r   zWin Rate by Market SpreadrL   rM   rZ   s   & r   analyze_spreadr      s!    4 5.0 0r   c                    \        R  4      pV  Fp  pVP                  RR4      P                  4       ^ ,          pW,          R;;,          ^,          uu&   W,          R;;,          VP                  R^ 4      ,          uu&   Kr  	  \        R4       \	        VP                  4       4       FV  w  r4VR,          '       d   VR,          VR,          ,          M^ p\        RVR RVR,          R	 R
VR RVR,          R 24       KX  	  \        4        R# )c                      R ^ RR/# )countr   r   r   r   r   r   r   &analyze_exit_reasons.<locals>.<lambda>   s    7Auc":r   exit_reasonro   r   r   u%     ── Exit Reason Breakdown ──r$   z<8r%   r&   z trades  avg P&L:$r(   z	  total:$z>+.2fN)r   r   splitr   r)   items)r   reasonsr2   r   r5   r7   s   &     r   analyze_exit_reasonsr      s    :;GEE-%++-a0
7q 
5quuUA.  

12w}}''(zzah7#qQrF"QwZO+=c%[	RSTYRZ[`Qabc ( 
Gr   c                     R p \         P                  P                  V 4      '       g   \        R4       \        R4       R# \	        V 4      ;_uu_ 4       p\
        P                  ! V4      pRRR4       \        X4      ^
8  d   \        R\        V4       R24       R# \        R\        V4       R24       / pV FR  pVP                  R^ 4      pWS9  d   . W5&   VP                  R	^ 4      ;'       g    ^ pW5,          P                  V4       KT  	  \        R
4       \        V4       F  p\        W5,          4      ^8  d   K  \        W5,          4      \        W5,          4      ,          pV^ 8  d   RMR\        ^
\        \        V4      ^,          4      4      ,          p\        RVR RVR RV R\        W5,          4       R2	4       K  	  V Uu. uF  qDP                  R4      f   K  VNK  	  p	pV	'       d   V	RR  Uu. uF  qDR,          NK  	  p
p\        V
4      \        V
4      ,          p\        R4       \        RVR RVR8  d   RMR R24       V	RR  Uu. uF   qDP                  R4      f   K  VR,          NK"  	  ppV'       d)   \        R\        V4      \        V4      ,          R 24       \        4        R#   + '       g   i     EL[; iu upi u upi u upi ) z"C:\kalshibot\market_snapshots.jsonu)     ── BTC & Odds Trend Analysis ──uB       No market_snapshots.json yet — starts building as bot runs.
Nu3     ── BTC & Odds Trend Analysis ──
    Only u&    snapshots so far — need more data.
u$     ── BTC & Odds Trend Analysis (u    snapshots) ──rH   
btc_chg_5mz#  Average BTC 5-min change by hour:u   ▲u   ▼r$   rA   z	:xx  avg +.4fr'   z  (z	 samples)yes_askz
  Last 100 Kalshi snapshots:z    Avg YES ask : z.3fz  (market bias r   UPDOWN)spreadz    Avg spread  : i)r   r   r	   r   r   r   r   r   r   r+   r)   summinr,   abs)	snap_pathr   snapshour_pricesrS   rB   chgr7   r9   
odds_snapsyes_asksavg_yesspreadss                r   analyze_market_snapshotsr      sa   6I77>>)$$9:ST	iAtyy|u
5zBDSZLPwxy	0U<N
OPKEE&!"eeL!$))c"	 
 

/0K {~"H+.!C$77auUc"c#c(S.6I.JJQsG9SJc#c#kn:M9NiXY	 ! #CUeeI&6!!UJC*4TU*;<*;QiLL*;<x=3x=0.0"73-wQT}tZ`>aabcd(245(9Y(91UU8_;1X;;(9YE.s7|CL/H.MNO	G7 
& D< Zs*   J<K%K<KK1K<K	c                    \        V 4      \        8  d"   \        R \         R\        V 4       R24       R# \        R\        V 4       R24       \        R 4      pV  Fc  pVP	                  R^ 4      pW,          R;;,          ^,          uu&   VP	                  R	4      R
8X  g   KH  W,          R;;,          ^,          uu&   Ke  	  VP                  4        UUu. uF9  w  r4VR,          \        8  g   K  VR,          VR,          ,          R8  g   K7  VNK;  	  ppp\        R 4      pV  F  pVP	                  R^ 4      p\        V^,          4      ^,          pWh,          R;;,          ^,          uu&   Wh,          R;;,          VP	                  R^ 4      ,          uu&   VP	                  R	4      R
8X  g   K  Wh,          R;;,          ^,          uu&   K  	  VP                  4        UUu. uF=  w  r4VR,          \        8  g   K  VR,          VR,          ,          \        8  g   K;  VNK?  	  ppp\        R 4      p	V  F|  pVP	                  RR4      p
\        V
^
,          4      ^
,          pW,          R;;,          ^,          uu&   VP	                  R	4      R
8X  g   Ka  W,          R;;,          ^,          uu&   K~  	  V	P                  4        U
Uu. uF=  w  rVR,          \        8  g   K  VR,          VR,          ,          \        8  g   K;  V
NK?  	  pp
pR\        \        R4      P                  P                  4       4      R\        V 4      R. R. R\        V4      RRR. /pV'       d/   VR,          P                  RV Uu. uF  q3R R2NK
  	  up 24       V'       d   VR,          P                  R V 24       V  Uu. uF*  p^VP	                  R!^ 4      u;8:  d
   ^8  g   K$  M K(  VNK,  	  ppV  Uu. uF  q"P	                  R!^ 4      ^8  g   K  VNK  	  pp\        V4      \        8  d   \!        R" V 4       4      \        V4      ,          pV\"        8  d&   VR,          P                  R#V^d,          R$ R%24       M/V\        8  d%   VR,          P                  R&V^d,          R$ R'24       \        V4      \        8  dS   \!        R( V 4       4      \        V4      ,          pVR,          P                  R)V^d,          R$ R*\        V4       R+24       V  Uu. uF6  q"P	                  R,^ 4      ^ 8  g   K  VP	                  R-^ 4      ^ 8X  g   K4  VNK8  	  ppV  Uu. uF  q"P	                  R-^ 4      ^ 8  g   K  VNK  	  pp\        V4      \        8  dS   \!        R. V 4       4      \        V4      ,          pVR,          P                  R/V^d,          R$ R*\        V4       R+24       \        V4      \        8  dS   \!        R0 V 4       4      \        V4      ,          pVR,          P                  R1V^d,          R$ R*\        V4       R+24       \%        \&        R24      ;_uu_ 4       p\(        P*                  ! VV^R37       RRR4       \        R44       VR,           F  p\        R5V 24       K  	  \        R64       R# u uppi u uppi u upp
i u upi u upi u upi u upi u upi   + '       g   i     Lq; i)7z  Auto-tune needs z+ completed trades. Have z so far. Keep running!
Nu   
  ══ AUTO-TUNE  (u    trades) ══c                      R ^ R^ /# r   r   r   r   r   r   r   &generate_auto_params.<locals>.<lambda>  s    VAga$8r   rH   r   r!   r"   r   gp=
ף?c                      R ^ R^ RR/# )r   r   r   r   r   r   r   r   r   r     s    F1WQuS#Ar   r   r   momentum_pctc                      R ^ R^ /# r   r   r   r   r   r   r     s    fQwq%9r   r   r   generated_atdatetimetrades_analyzed
good_hoursavoid_hoursbest_entry_pricesmomentum_thresholdgMbP?notesu6   Hour info (NOT blocking — informational only): best rA   z:xxzBest entry prices (60%+ WR): rQ   c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir!   r"   NrI   .0r2   s   & r   	<genexpr>'generate_auto_params.<locals>.<genexpr>9  s      E	1UU9-=u-DQQ	   (
(z"Low-score trades (7-14) losing at .0fu)   % — consider raising SCORE_MEDIUM to 15z#Low-score trades (7-14) winning at u$   % — SCORE_MEDIUM=7 is working wellc              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir   rI   r   s   & r   r   r   C  s      GAuuY/?/Faar   zHIGH confidence trades (28+): z
% WR over z tradesr^   rg   c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir   rI   r   s   & r   r   r   K  s      D1EE),<e,CQQr   zEXP-only trades: c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir   rI   r   s   & r   r   r   O  s      C155+;U+BQQr   zTrades with LAG signal: windentu     ✅ Wrote auto_params.jsonz     z5
  The bot will load these settings on next restart.
)r   MIN_TRADES_TO_TUNEr   r   r   r   r*   roundSTRONG_MIN_TRADESSTRONG_WIN_RATEstr
__import__r   nowr)   r+   r   STRONG_AVOID_RATEr   AUTO_PARAMS_PATHr   dump)r   	hour_winsr2   rB   r5   r   mom_winsrS   rT   
price_winsr   good_pricesparams	low_score
high_scorewr_lowwr_highexp_onlylag_anywr_expwr_lagr   notes   &                      r   generate_auto_paramsr     s&   
5z&&"#5"6 7%j\!9; 	<	#CJ<
?@ 89IEE&!W"55u$il6&:a&?&:  !* 1 U 1wZ?2 78y77Kt7S ! 1J U ABHEE%q)q1u!!Q&!QUU>1%==55u$h&6v&>!&C&>  !* 1 ? 1wZ#44 i'
*o= ! 1J ?
 9:JEE-%q2v#7#q(#55u$j&8&@A&E&@	 
 ",!1!1!3 c!3j$55 :;F)AgJ:NRa:a 1!3K c 	Z
%;%D%D%H%H%J!KU!4F w!WpzX{pzkl^a[bbeYfpzX{W|}~w!>{mLM #MUa1551CQ+G&L"&L!&L!UIM"IUee,>&Bb&H!!UJI
9~**E	EEIV%%7O""4VCZ4D E6 78 &7O""5fSj5E F1 23 :++GGG#j/Yw,WS[,=ZJGXX_`	b ![5aEE+a$81$<{STAUYZAZ5H[ =5aEE+a$81$<5G=
8}'DDDs8}Tws
3/z#h-P	R
7|&CCCc'lRw&vcz#&6jWgV	X 
	$	$		&!A& 
% 
(*wdVn  	CE[U?c Y|
 NI" \= 
%	$s   Z71Z7Z7$Z=?Z=!Z=[&[[<[	
:![ [$[0[[[1[
[[3[[""[2	c                     \        R4       \        R4       \        R4       \        4       p V '       g   R# V  Uu. uF  qP                  R4      R8X  g   K  VNK  	  pp\        R V  4       4      p\	        V4      \	        V 4      ,          ^d,          p\        R\	        V 4       24       \        RVR R	\	        V4       R
\	        V 4      \	        V4      ,
           R24       \        RVR 24       \        RV\	        V 4      ,          R R 24       \        V 4       \        V 4       \        V 4       \        V 4       \        V 4       \        V 4       \        V 4       \        V 4       \        V 4       \        V 4       \        V 4       \!        V 4       \#        4        \%        4        \'        V 4       \        R4       \        R4       \        R4       \        R4       R# u upi )
z  KALSHIBOT LEARNING ENGINENr!   r"   c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5i)r   NrI   r   s   & r   r   run.<locals>.<genexpr>g  s     3UEE%OOU    z  Total trades   : z  Win rate       : z.1fz%  (zW / zL)z  Total P&L      : $z+.2fz  Avg per trade  : $z+.3fz7  Tip: run this again after every few hours of trading.z5  Auto-tunes ONLY on 60%+ or 40%- WR with 20+ trades.z>==============================================================z?
==============================================================z?==============================================================
)r   r   r   r   r   r[   rr   r   rd   rk   rN   r   r   r   r   r   r   r   analyze_price_patternsr  )r   r2   r   	total_pnlr6   s        r   runr  ]  s   	-	
'(	-LE;1y!1U!:QQD;3U33IIE
"S(B	E
|
,-	3xtCI;d3u:c$i;O:PPR
ST	 4 0
12	 3u:!5d ;2
>?U#eee$ue5	&M	
CD	
AB	-9 <s   G!G!__main__c                  	   Rp Rp\         P                  P                  V 4      '       g   \        R4       \        R4       R# \	        V 4      ;_uu_ 4       p\
        P                  ! V4      pRRR4       X Uu. uF5  qDP                  R4      '       g   K  VP                  R4      R8w  g   K3  VNK7  	  pp\        R	\        V4       R
24       \        V4      ^8  d   \        R\        V4       R24       R# . RLOp. RMOp. RNOp. p	^p
V EF  w  rV EF  w  rV Uu. uF;  pWR,          u;8:  d
   V8  g   K  M K  WR,          u;8:  d
   V8  g   K5  M K9  VNK=  	  pp\        V4      V
8  d   K_  \        R V 4       4      p\        R V 4       4      p\        V4      pVV,          pVV,          p\        R V 4       4      V,          pVR8  dg   V	P                  RRRW.R^ ^.RW.RRR\        V^4      R\        V^4      RVRRVR  R!VR  R"V^<,           R!V^<,           R#V^d,          R$ R%2/	4       EK&  VR8  g   EK0  V	P                  RRRW.R^ ^.RW.RR&R\        V^4      R\        V^4      RVRRVR  R!VR  R"V^<,           R!V^<,           R'V^d,          R$ R%2/	4       EK  	  EK  	  V	'       d   \        R(\        V	4       R)24       \        V	R* R+R,7       F^  pVR,          R8  d   R-MVR,          R.8  d   R/MR0p\        R1V R2VR,           24       \        R3VR,          R4 R5VR,           R624       K`  	  M\        R74       \        R84       RO F  w  rV Uu. uF   qKVR,          u;8:  d
   V8  g   K  M K  VNK"  	  pp\        V4      ^8  d   KC  \        R9 V 4       4      \        V4      ,          pV^ 8  d   R:MR;p\        R<VR  R!VR  R=VR4 R>V R?\        V4       R@24       K  	  \        4        RA\        \        RB4      P                  P!                  4       4      RC\        V4      RD\        V	4      REV	/p\	        VRF4      ;_uu_ 4       p\
        P"                  ! VV^RG7       RRR4       V	'       d&   \        RH\        V	4       RI24       \        RJ4       R# \        RK4       R#   + '       g   i     ELP; iu upi u upi u upi   + '       g   i     Lm; i)Pu   
Read contract_price_log.json, group resolved observations by price range + time bucket,
find which combinations reliably move in one direction.
Writes price_patterns.json — loaded live by the bot for bonus scoring.
z$C:\kalshibot\contract_price_log.jsonz C:\kalshibot\price_patterns.jsonu&     ── Price Pattern Analysis ──uD       No contract_price_log.json yet — starts building as bot runs.
Nresolvedr!   UNKNOWNu!     ── Price Pattern Analysis (u    resolved observations) ──z$    Need 20+ resolved windows. Have z. Keep running!
皙?no_askr   c              3   D   "   T F  qR ,          R8X  g   K  ^x  K  	  R# 5i)r!   YES_WONNr   r   r   s   & r   r   )analyze_price_patterns.<locals>.<genexpr>  s     IV|y/H!!V    
 c              3   D   "   T F  qR ,          R8X  g   K  ^x  K  	  R# 5i)r!   NO_WONNr   r  s   & r   r   r    s     HV|x/G!!Vr  c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5ino_movedNrI   r  s   & r   r   r    s     DVuuZ33Vr  r   typeNO_PRICEno_range	yes_range
secs_range	directionr   	frequencyavg_no_movedsamplesr8   zNO@z.2f-z | zmin | YES wins r   %r   zmin | NO wins z  Found z reliable price patterns:
c                     V R ,          # )r&  r   )xs   &r   r   (analyze_price_patterns.<locals>.<lambda>  s    +r   T)keyreverseu   🟢 STRONGg
ףp=
?u	   🟡 GOODu	   🔵 FAIRr$   r%   z           avg price move: r   z  |  z samplesu:       No strong patterns found yet — keep collecting data.u)   
  ── Price Trajectory Insight ──c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5ir  rI   r  s   & r   r   r    s     <VuuZ++Vr  fellrosez    NO priced u   ¢: avg moved z (z) over z observationsr   r   resolved_obspatterns_foundpatternsr   r   u     ✅ Wrote z  patterns to price_patterns.jsonz:     Bot loads these automatically on next window change.
u:     price_patterns.json updated — no strong patterns yet.
))r   r   )r   r   )r   r   )r   333333?r6  r   r   r   r   ffffff?)r:  g333333?))r   r6  r7  r8  r9  )r:  r  )r  ?)r;  g
ףp=
?))    x   )r=  r   )r     )r>    )r?  i  ))r   r   )r   r   )r   r   )r   r   r	   r   r   r   r   r   r   r   r+   r   r)   r   r   r   r   r   )log_pathpat_pathr   logr   r  	NO_RANGES
YES_RANGES	SECS_BINSr5  MIN_PAT_SAMPLESn_lon_his_los_hirT   yes_wonno_wonnyes_freqno_freqr'  r   confavg_mover%  outputs                              r   r  r    s    8H3H77>>(##67UV	h1DIIaLcV3a%%
"3i8HI8U3HV	-c(m_<Z
[\
8}r4S]OCTUVJI<JKIHO!%LT!) 9A83t3 3 K.747 7 F 9 6{_,hIVIIGHVHHF&kA{H{GDVDDqHL4*4,1a& 4,$%!"4"E,$:!CSz4*Cbz4QS8*Tcdlmpdpqtcuuv"w
! 
 D*4,1a& 4,&%"3"E,$:!CSz4*Cbz4QS8*Tbcjkncnorbsst"u
! 
3 & "N X'BCD&>MA$%kNd$:=qQ\~aeOekvDDb7-./.0A$/GuQy\NZbcd N
 	JK 
68B%DX8)Ct)C!)C!XDv;?H<V<<s6{J&lF	tCj$s>(4PRS\R]]dehioepdqq~  	A C 
G 	c*Z"8"A"A"E"E"GHc(mc(mh	F 
h		499VQq#A	S]O+KLMKMKMo 
V$9b E 
	sZ   R38SS-SS7S;SSS!S=SSS3S	S&	)MonTueWedThuFriSatSun)!__doc__r   r   mathcollectionsr   r
   r   r   r*   r   r   r   DAYSr   r;   rN   r[   rd   rk   rr   r   r   r   r   r   r   r   r   r  r  __name__r  r   r   r   <module>r_     s      #84    26	.3 FCCK B.1?
0
!F[F~%N zEcNr   