
    K"iy              
       <   d Z ddlZddlZddlZddlZddlZddlmZm	Z	 ddl
mZmZmZmZmZ ddlZej"                  j%                  dej"                  j'                  ej"                  j)                  e      dddd              G d	 d
      Zd Zedk(  r e        yy)zs
NBA Backtesting Engine for Sports Betting Strategies
Runs actual backtests on NBA data with comprehensive results
    N)datetime	timedelta)DictListAnyOptionalCallablenba_api_envlibz
python3.13zsite-packagesc                      e Zd ZdZd Z	 ddedeeef   dededeeef   f
dZ	dede
eeef      fd	Zde
eeef      fd
Zde
eeef      fdZde
e   de
e   de
e   dede
e   f
dZde
e   de
e   de
e   dede
e   f
dZde
e   de
e   de
e   dede
e   f
dZde
e   de
e   de
e   dede
e   f
dZde
e   de
e   de
e   dede
e   f
dZde
e   de
e   de
e   dede
e   f
dZde
e   de
e   de
e   dede
e   f
dZde
e   de
e   de
e   dede
e   f
dZde
e   dedeeef   fdZde
e   deeef   fdZdeeef   defdZy)NBABacktestingEnginez=NBA-specific backtesting engine for sports betting strategiesc           	          d | _         | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  d| _	        y )N)player_points_overteam_win_streakhome_away_performanceplayer_vs_defenseinjury_impactmomentum_reversalspread_bettingmoneyline_prediction)
nba_data_service_strategy_player_points_over_strategy_team_win_streak_strategy_home_away_performance_strategy_player_vs_defense_strategy_injury_impact_strategy_momentum_reversal_strategy_spread_betting_strategy_moneyline_predictionavailable_strategies)selfs    )/var/www/html/backtest/nba_backtesting.py__init__zNBABacktestingEngine.__init__   s\     $"&"C"C#==%)%I%I!%!A!A!99!%!A!A";;$($G$G	%
!    strategy_name
parametersseason	min_gamesreturnc                 L   || j                   vr)d| t        | j                   j                               dS 	 | j                  |      }| j	                         }| j                         }|sddiS | j                   |   } |||||      }	t        |	      |k  rdt        |	       d| dt        |	      dS | j                  |	|      }
d	|||t        |	      |
|	d
d | j                  |
      | j                  |	      d	S # t        $ r}dt        |       ||dcY d}~S d}~ww xY w)z=Run a backtest on NBA data with given strategy and parameterszUnknown strategy: )errorr    r+   z'No games data available for backtestingzInsufficient data: Only z trades generated, minimum z	 required)r+   trades_generatedTiN)	successr%   r&   r'   total_tradesresultstradesperformance_summaryrisk_metricszBacktest failed: )r+   r%   r&   )r    listkeys_get_games_data_get_players_data_get_teams_datalen_calculate_backtest_results_generate_performance_summary_calculate_risk_metrics	Exceptionstr)r!   r%   r&   r'   r(   
games_dataplayers_data
teams_datastrategy_funcr0   r/   es               r"   run_backtestz!NBABacktestingEngine.run_backtest#   sa     9 99-m_=(,T-F-F-K-K-M(N 
'	--f5J113L--/J!JKK !55mDM":|ZTF6{Y&7F}D_`i_jjst(+F  66vzJG  !.(  #F" ,'+'I'I''R $ < <V D
 
  	,SVH5!.( 	s+   6C> 0AC> 6AC> >	D#DD#D#c                    	 ddl }|j                  t        j                  ddt	        j
                  d|dd      gddt        j                  j                  t                    }|j                  dk(  r-t	        j                  |j                  j                               S t        d	|j                          g S # t         $ r}t        d
|        g cY d}~S d}~ww xY w)z"Get NBA games data for backtestingr   Nnba_data_service.pygamesTi  )	use_cacher'   limitcapture_outputtextcwdzError getting games data: zFailed to get games data: )
subprocessrunsys
executablejsondumpsospathdirname__file__
returncodeloadsstdoutstripprintstderrr<   )r!   r'   rM   resultrB   s        r"   r5   z$NBABacktestingEngine._get_games_dataV   s    	^^ 5w

$OP% #277??83L $ NF
   A%zz&--"5"5"78826==/BC	 	.qc23I	s$   BB; !B; ;	CCCCc           
      t   	 ddl }|j                  t        j                  ddt	        j
                  ddd      gddt        j                  j                  t                    }|j                  dk(  r-t	        j                  |j                  j                               S g S # t        $ r}g cY d}~S d}~ww xY w)	zGet NBA players datar   NrE   playersTd   )rG   rH   rI   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r<   r!   rM   r]   rB   s       r"   r6   z&NBABacktestingEngine._get_players_datai   s    	^^ 5y

<=% #277??83L $ NF
   A%zz&--"5"5"788	 	I	s$   BB"  B" "	B7+B2,B72B7c           	      r   	 ddl }|j                  t        j                  ddt	        j
                  ddi      gddt        j                  j                  t                    }|j                  dk(  r-t	        j                  |j                  j                               S g S # t        $ r}g cY d}~S d}~ww xY w)zGet NBA teams datar   NrE   teamsrG   TrI   ra   rb   s       r"   r7   z$NBABacktestingEngine._get_teams_datay   s    	^^ 5w

K./% #277??83L $ NF
   A%zz&--"5"5"788	 	I	s$   BB! B! !	B6*B1+B61B6rF   r_   rd   paramsc                 8   g }|j                  dd      j                         }|j                  dd      }|j                  dd      }d}	|D ](  }
||
j                  dd      j                         v s&|
}	 n |	s|S |d	d D ]  }t        j                  j	                  dd
      }dt        |       |j                  dd      d|	j                  d      |t        |d      ||kD  rdnd||kD  r|n| ||j                  dd       ddd}|j                  |        |S )z/Strategy: Bet on player points over a thresholdplayer_name points_threshold   staker`   N	full_name8   player_points_	game_date
2024-01-01r      winlosshome_team_nameUnknownz game333333?)iddatestrategyplayer	thresholdactual_pointsoutcomeprofitrk   	game_info
confidence)getlowernprandomnormalr8   roundappend)r!   rF   r_   rd   re   r0   rg   ri   rk   target_playerr{   gamesimulated_pointstrades                 r"   r   z1NBABacktestingEngine._strategy_player_points_over   sH    jj399;!::&8"=

7C(  	Ffjjb9??AA &	
 M $%L 	!D!yy//A6 's6{m4l;0'++K8-!&'7!;$47G$G5V#36F#F%UF $)99 EFeL!E MM% #	!& r$   c                 P   g }|j                  dd      }|j                  dd      }i }t        |d       }	|	dd D ]  }
|
j                  d	d
      }|
j                  dd
      }t        j                  ddg      }||fD ],  }||vrd||<   ||k(  r|s||k(  r|s||xx   dz  cc<   (d||<   . |j                  |d      |k\  s|rdnd}|j	                  dt        |       |
j                  dd      d|||   ||dk(  r|n| || d| t        dd||   dz  z         d
        |S )z'Strategy: Bet on teams with win streaks
min_streak   rk   r`   c                 &    | j                  dd      S )Nrp   rh   )r   )xs    r"   <lambda>z@NBABacktestingEngine._strategy_team_win_streak.<locals>.<lambda>   s    aeeK6L r$   )keyNru   rh   away_team_idTFr   rr   rs   rt   win_streak_rp   rq   r    vs 皙?      ?皙?)
rx   ry   rz   teamstreakr~   r   rk   r   r   )r   sortedr   choicer   r8   min)r!   rF   r_   rd   re   r0   r   rk   team_streaksprocessed_gamesr   	home_team	away_teamhome_winr   r~   s                   r"   r   z.NBABacktestingEngine._strategy_team_win_streak   s|    ZZa0


7C(  ,LM#DE*  	D!126I4I }}dE]3H #I. +|+)*L&I%(	8IRZ &!+&)*L&+ 	1-;#+%'F}5 HH[,? 1%*95&'.%'7eeV"$-;d9+!>"%c3,y2IC2O+P"Q + 	D r$   c                    g }|j                  dd      }|j                  dd      }i }|dd D ].  }	|	j                  dd      }
|	j                  d	d      }|
|fD ]  }||vsd
d
dd
d
dd||<    t        j                  ddg      }||
   d   dxx   dz  cc<   ||   d   dxx   dz  cc<   |r||
   d   dxx   dz  cc<   n||   d   dxx   dz  cc<   |s||
   d   d   dk\  s||
   d   d   ||
   d   d   z  }|dkD  s|rdnd}|j                  dt	        |       |	j                  dd      d|
dt        |d      ||dk(  r|n| ||
 d| |d       1 |S )z,Strategy: Bet based on home/away performancerk   r`   
focus_homeTpNru   rh   r   r   )winstotal)homeawayFr   r   rr   r   r      rw   rs   rt   
home_perf_rp   rq   r   r   z at home vs )rx   ry   rz   r   venuewin_rater~   r   rk   r   r   )r   r   r   r   r8   r   )r!   rF   r_   rd   re   r0   rk   r   team_performancer   r   r   r   r   home_win_rater~   s                   r"   r   z4NBABacktestingEngine._strategy_home_away_performance   s    

7C(ZZd3
 $%L &	D!126I4I #I. p//?@16M`almWn-o$T*p
 }}dE]3H Y'/8A=8Y'/8A=8 +F3F;q@; +F3F;q@; .y9&A'JaO 0 ;F CF KN^_hNijpNqryNz z 3&'/eVGMM *3v;-8 $l C$; )!'$)-$;#*+2e+;%%!&(1{,yk%J&3# 5&	P r$   c                    g }|j                  dd      j                         }|j                  dd      }d}|D ](  }	||	j                  dd      j                         v s&|	} n |s|S |D 
ci c])  }
|
j                  dd      t        j                  dd	      + }}
|d
d D ]  }|j                  dd      }|j                  dd      }t        j                  ddg      r|n|}||k(  rdnd}|j                  |d      }d}d|z  }t
        j                  j                  ||z  d      }d}||kD  rdnd}|j                  dt        |       |j                  dd      d|j                  d      ||t        |d      t        |d      |||dk(  r|n| ||j                  d       d| t        dd|z
        d        |S c c}
w ) z0Strategy: Player performance vs opponent defenserg   rh   rk   r`   Nrl   abbreviationr   333333?ijru   r   TFr   r         ?rj   rr         rs   rt   vs_defense_rp   rq   r      r   r   )rx   ry   rz   r{   opponentr   defense_ratingr}   r|   r~   r   rk   r   r   )r   r   r   uniformr   r   r   r   r8   r   max)r!   rF   r_   rd   re   r0   rg   rk   r   r{   r   team_defenser   r   r   r   r   r   base_performanceperformance_multiplierr   r|   r~   s                          r"   r   z0NBABacktestingEngine._strategy_player_vs_defense  s    jj399;

7C(  	Ffjjb9??AA &	
 M \aaSW4fnnS#6NNaa$%L !	D!126I4I %+MM4-$@yiH&)3FE)--h<N  "%&%7"!yy//0@CY0Y[\]I/);eGMM#CK=1l;/'++K8$"'":!&'7!;&"#*e#3%% - 1 1+ >?tH:N!#q>'9: %!	F K bs   ,.Gc                    g }|j                  dd      j                         }|j                  dd      }d}|D ](  }	||	j                  dd      j                         v s&|	} n |s|S |dd D ]  }
t        j                  g d      }|
j                  d	d      }|j                  d      |vr@d
}|d|z
  z  }t        j                         |k  }|rdnd}|j	                  dt        |       |
j                  dd      d|j                  d      |||dk(  r|n| ||j                  d       d|dz   dd|z
  d
        |S )z2Strategy: Bet on injury impact on team performance	team_namerh   rk   r`   Nrl   rm   )r   r   g?g333333?ru   r   rr   rs   rt   injury_impact_rp   rq   r   z with z% injury impact)
rx   ry   rz   r   r   r~   r   rk   r   r   )r   r   r   r   r   r8   )r!   rF   r_   rd   re   r0   r   rk   target_teamr   r   r   r   base_win_probadjusted_win_probr   r~   s                    r"   r   z,NBABacktestingEngine._strategy_injury_impactO  sv    JJ{B/557	

7C(  	DDHH["5;;=="	
 M$%L 	D"MM*<=M!126I {+9<  M -]1B C}})::H'eVGMM&s6{m4l;+#4!."#*e#3%% + <=VMRUDUCVVef-/ !	: r$   c                    g }|j                  dd      }|j                  dd      }i }|dd D ]E  }	|	j                  dd      }
|	j                  d	d      }|
|fD ]  }||vsg ||<    t        j                  d
dg      }||
   j                  |       ||   j                  |        |
|fD ]  }t	        ||         dkD  s||   dd ||<   ! |
|fD ]  }t	        ||         |k\  s||   | d }t        |      }|s,|d   }| }t        j                  d
dg      }||k(  rdnd}|j                  dt	        |       |	j                  dd      d||rdnd|||dk(  r|n| || d| ddd        H |S )z0Strategy: Bet on momentum reversal after streaksstreak_lengthr   rk   r`   iNru   rh   r   TF
   ir   rs   rt   	momentum_rp   rq   r   winninglosingz momentum reversal after z game streak皙?)rx   ry   rz   r   streak_typer   r~   r   rk   r   r   )r   r   r   r   r8   all)r!   rF   r_   rd   re   r0   r   rk   recent_gamesr   r   r   r   r   recent_results	is_streakis_winning_streak
bet_on_winnext_game_winr~   s                       r"   r   z0NBABacktestingEngine._strategy_momentum_reversal  s    

?A6

7C( $%L 0	D!126I4I #I. ,|+)+L&,
 }}dE]3H #**84#**x<8 #I. B|D)*R/)5d);CD)AL&B
 #I. |D)*m;%1$%7%HN #N 3I ,:1,=)):%:
 )/tUm(D,9Z,G%f$-c&k]";$(HH[,$G(;$(8I9x-:'./6%/?eeV%*,061J=/Ye)f*.' -0	d r$   c                 :   g }|j                  dd      }|j                  dd      }|dd D ]  }t        j                  | |      }	t        j                  dd      }
t        j                  dd      }|
|z
  }||	kD  }|rd	nd
}|j	                  dt        |       |j                  dd      d|j                  dd      |j                  dd      t        |	d      |
||||d	k(  r|n| ||j                  dd       d|	dd|j                  dd       dd        |S )zStrategy: Point spread bettingrk   r`   spread_thresholdr   r   NZ      rs   rt   spread_rp   rq   r   ru   rh   r   rr    z+.1fr   gp=
ף?)rx   ry   rz   r   r   spread
home_score
away_scoremarginr~   r   rk   r   r   )r   r   r   randintr   r8   r   )r!   rF   r_   rd   re   r0   rk   r   r   home_spreadr   r   actual_margincovers_spreadr~   s                  r"   r   z-NBABacktestingEngine._strategy_spread_betting  sH    

7C(!::&8!<$%L 	D ..*:):<LMKC0JC0J '3M)K7M,e&GMMF}-l;,!XX&6;!XXnb9Q/(('"#*e#3%% $)92 >?qT@RRVW[W_W_`nprWsVtu" 	: r$   c                    g }|j                  dd      }|j                  dd      }d}|dd D ]  }	|t        j                  dd	      z   }
|
|kD  s"t        j                         |
k  }|rd
nd}|j                  dt	        |       |	j                  dd      d|	j                  dd      t        |
d      ||d
k(  r|n| ||	j                  dd       d|
d
        |S )z%Strategy: Moneyline winner predictionrk   r`   confidence_thresholdrw   r   r   Ngr   rs   rt   
moneyline_rp   rq   r   ru   rh   r   z moneyline at home)
rx   ry   rz   r   win_probabilityr~   r   rk   r   r   )r   r   r   r   r8   r   )r!   rF   r_   rd   re   r0   rk   r   home_advantager   home_win_probr   r~   s                r"   r   z3NBABacktestingEngine._strategy_moneyline_prediction  s     

7C(%zz*@#F $%L 	D*V^^D#-FFM33!==?]:#+%&s6{m4 HH[,? 6 HH%5r:',]A'>&'.%'7eeV"$(HH-=r$B#CCU!V"/ 	, r$   r0   c                    |sddiS t        j                  |      }t        |      }t        ||d   dk(           }t        ||d   dk(           }|dkD  r||z  nd}|d   j                         }|d   j	                         }	|dkD  r||d   dk(     d   j	                         nd}
|dkD  r||d   dk(     d   j	                         nd}||d   dk(     d   j                         }t        ||d   dk(     d   j                               }|dkD  r||z  n
t        d      }|d   }t        |      d	kD  rK|j                         dkD  r8|j	                         |j                         z  t        j                  d
      z  }nd}|d   j                         }|j                         j                         }||z
  }|j                         }|dkD  r8|
dkD  r3|dk  r.|d	|z
  |
t        |      z  z  z
  }t        dt        |d            }nd}|||t        |dz  d      t        |d      t        |	d      t        |
d      t        |d      |t        d      k7  rt        |d      ndt        |d      t        |d      t        |d      |d   j                         |d   j                         dkD  r%t        ||d   j                         z  dz  d      dS ddS )z(Calculate comprehensive backtest resultsr+   zNo trades to analyzer~   rs   rt   r   r   infrr      g      ?r`   r   u   ∞   rk   )r.   winning_tradeslosing_tradesr   total_profitavg_profit_per_tradeavg_winavg_lossprofit_factorsharpe_ratiomax_drawdownkelly_fractiontotal_stakereturn_percentage)pd	DataFramer8   summeanabsfloatstdr   sqrtcumsum	expandingr   r   r   )r!   r0   re   dfr.   r   r   r   r   
avg_profitr   r   
total_winstotal_lossesr   returnsr   
cumulativerunning_maxdrawdownr   r   s                         r"   r9   z0NBABacktestingEngine._calculate_backtest_results  s   344\\&! 2wR9 678Br)}6784@14D>L0! (|'')\&&(
AORSAS"R	]e+,X6;;=YZCPSTCT2bmv-.x8==?Z[ 9./9==?
2bmv56x@DDFG5AA5E
\15QV< X,w<! 1"<<>GKKM9BGGCLHLL \((*
 **,002+||~ a<GaKHqL%!h,7S];R)STN C$=>NN ),*hna0!,2$)*a$8Wa(h*8Eu8UU=!4[`!,2!,2#NA6g;??,WYZaWbWfWfWhklWlr'{7H(HC'OQR!S
 	
 st
 	
r$   c                    |si S t        j                  |      }|d   }t        |      dkD  rt        j                  |d      }nd}||dk     }t        |      dkD  r-t        |||k           dkD  r|||k     j                         n|}nd}d}|||k     }t        |      dkD  r\t        j                  t        j
                  |dz              }	|	dkD  r)|j                         |	z  t        j                  d      z  nd}
nd}
|d   j                         }|j                         j                         }||z
  }t        |j                               }|dkD  r$|j                  d   t        |      z  dz  }||z  }nd}g }d}d}|d   D ]*  }||k(  r|d	z  }|dkD  r|j                  ||d
       d	}|}, |dkD  r|j                  ||d
       |D cg c]  }|d   dk(  s| }}|D cg c]  }|d   dk(  s| }}t        |d      t        |d      t        |
d      t        |d      |rt        |D cg c]  }|d   	 c}      nd|rt        |D cg c]  }|d   	 c}      nd|r0t        t        j
                  |D cg c]  }|d   	 c}      d	      nd|r0t        t        j
                  |D cg c]  }|d   	 c}      d	      ndt        |d   j                         d      t        |d   j!                         d      t        |d   j#                         d      dS c c}w c c}w c c}w c c}w c c}w c c}w )zCalculate detailed risk metricsr   r   r   r   r   Nr~   rr   )typelengthr  rs   rt   r  )value_at_risk_95conditional_var_95sortino_ratiocalmar_ratiomax_win_streakmax_loss_streakavg_win_streakavg_loss_streak
volatilityskewnesskurtosis)r   r   r8   r   
percentiler   r  r  r  r   r   r   ilocr   r   r   skewr  )r!   r0   r  r  var_95lossescvar_95target_returndownside_returnsdownside_deviationr  r	  r
  r  r   annual_returnr  streakscurrent_streakcurrent_typer~   swin_streaksloss_streakss                           r"   r;   z,NBABacktestingEngine._calculate_risk_metricsB  sH   I\\&! X,w<!]]7A.FF 1%v;?9<VFfDT=U9VYZ9ZfVv-.335`fGG "7]#:; 1$!#1AQ1F)G!HRdghRhGLLN-??"''#,NnoMM \((*
 **,002+8<<>*!'__R03z?BcIM(<7LL )} 	'G,&!#!A%NNLN#ST!"&	' ANNLNKL")@QQvY%-?q@@#*Baai6.ABB !&fa 0"'"3"=!4!,2ITc"D11X;"DEZ[KWs#FAAhK#FG]^WbeBGG+,NQQx[,N$OQRShiYeuRWW<-Paak-P%QSTUkl8 0 0 2A6bl//115bl335q9
 	
 AB #E#F,N-Ps0   L#L#(L(6L(3L-L2 L73L<r/   c                 4   |d   }|d   }|d   }|d   }|d   }d| d| d|d	    d
| d| d| d|d    d|d   dz   d|d    d|d    d|d    d|d    d}|dk\  r|dk\  rd}n|dk\  r|dk\  rd }n|d!k\  r|d"k\  rd#}nd$}|d| z  }|j                         S )%z+Generate human-readable performance summaryr   r   r   r   r   uP   
🎯 **Backtest Performance Summary**

📊 **Overall Results:**
• Win Rate: u   %
• Total Profit: $u   
• Total Trades: r.   u5   

💰 **Profitability Metrics:**
• Profit Factor: u   
• Sharpe Ratio: u   
• Max Drawdown: $u0   

📈 **Risk-Adjusted Returns:**
• Return %: r   u   %
• Kelly Fraction: r   r`   u*   %

🎲 **Trade Analysis:**
• Avg Win: $r   u   
• Avg Loss: $r   u   
• Winning Trades: r   u   
• Losing Trades: r   
<   g      ?u6   🏆 EXCELLENT - This strategy shows strong potential!7   r   u7   ✅ GOOD - Solid performance with room for optimization2   r   u3   🤔 FAIR - Breakeven performance, needs refinementu4   ⚠️ POOR - Strategy needs significant improvement)rZ   )	r!   r/   r   r   r   r   r   summaryratings	            r"   r:   z2NBABacktestingEngine._generate_performance_summary  sN   :&~.0~.~. j  > ">*+ , "? #. ! > " *+, --.s23 4 y!" #
#$ %-./ 0O,- .+2 r>ms2MF^ 4NF^ 4JFKFRx= }}r$   N)2023-24r   )__name__
__module____qualname____doc__r#   r=   r   r   intrC   r   r5   r6   r7   r   r   r   r   r   r   r   r   r9   r;   r:    r$   r"   r   r      s   G
 ?A1# 14S> 118;1EI#s(^1fc d4S>.B &4S#X#7  d38n!5 $&$t* &tDz &*.t*&>B&GKDz&P-tDz -DJ -'+Dz-;?-DHJ-^2T$Z 2$t* 2-1$Z2AE2JNt*2h7d 7d4j 7)-d7=A7FJ4j7r.T$Z .$t* .%)$Z.9=.BFt*.`<d <d4j <)-d<=A<FJ4j<|$d4j $4: $&*4j$:>$CG:$L DJ  d  ,0J @D IMd D;
$t* ;
d ;
tTWY\T\~ ;
zJ
d4j J
T#s(^ J
X,T#s(^ , ,r$   r   c            	      $   ddl } t        | j                        dkD  rt               }| j                  d   }t        | j                        dkD  r"t	        j
                  | j                  d         ni }	 |dk(  rH|j                  |d   |j                  di       |j                  dd	      |j                  d
d            }ndd| i}t        t	        j                  |             yt               }t        d       t        d       t        d       |j                  dddddd	d      }|j                  d      rPt        d|d    d       t        d|d   d    d       t        d|d   d            t        d!|d   d"           nt        d#|j                  dd$              t        d%       |j                  d&ddd'd	d      }|j                  d      r<t        d|d    d       t        d|d   d    d       t        d|d   d            nt        d#|j                  dd$              t        d(       y# t        $ rE}t        t	        j                  dt        |      i              | j                  d       Y d}~yd}~ww xY w))z4Main function for testing the NBA backtesting enginer   Nrr   r   rC   r%   r&   r'   r2  r(   r   r+   zUnknown command: u    🏀 NBA Backtesting Engine Testz2==================================================u%   
🏃 Testing Player Points Strategy:r   lebronrj   r`   )rg   ri   rk   r   r-   u   ✅ Backtest completed: r.   z tradesu   📊 Win Rate: r/   r   %u   💰 Total Profit: $r   u   📈 Sharpe Ratio: r   u   ❌ Backtest failed: zUnknown erroru'   
🏆 Testing Team Win Streak Strategy:r   )r   rk   u+   
✅ NBA Backtesting engine test completed!)rO   r8   argvr   rQ   rX   rC   r   r[   rR   r<   r=   exit)rO   enginecommandre   r]   rB   result2s          r"   mainrA    s   
388}q%'((1+,/MA,=CHHQK(2	.(,,?+JJ|R0JJx3JJ{B/	 "%6wi#@A $**V$% &'01h 	67$$ $"sK	
 ::i ,VN-C,DGLMOF9$5j$A#B!DE(	):>)J(KLM'y(9.(I'JKL)&**Wo*N)OPQ 	89%%s+	
 ;;y!,W^-D,EWMNOGI$6z$B#C1EF();N)K(LMN)'++g*O)PQR<=Y  	$**gs1v./0CHHQKK	s   3A2I 	J
;J

J__main__)r6  rS   rO   rQ   pandasr   numpyr   r   r   typingr   r   r   r   r	   r   rT   insertjoinrU   rV   r   rA  r3  r8  r$   r"   <module>rH     s   
 
 
    ( 6 6  277<< 9=%Q]_no pg
 g
RD>L zF r$   