
    K"iy              
       >   S r SSKrSSKrSSKrSSKrSSKrSSKJrJ	r	  SSK
JrJrJrJrJr  SSKr\R"                  R%                  S\R"                  R'                  \R"                  R)                  \5      SSSS5      5         " S	 S
5      rS r\S:X  a  \" 5         gg)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                      \ rS rSrSrS r S S\S\\\4   S\S\	S\\\4   4
S	 jjr
S\S\\\\4      4S
 jrS\\\\4      4S jrS\\\\4      4S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\\   S\\   S\S\\   4
S jrS\\   S\S\\\4   4S jrS\\   S\\\4   4S jrS\\\4   S\4S jrSrg)!NBABacktestingEngine   z=NBA-specific backtesting engine for sports betting strategiesc           	          S U l         U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  S.U l	        g )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    1/var/www/html/leadgen/backtest/nba_backtesting.py__init__NBABacktestingEngine.__init__   s\     $"&"C"C#==%)%I%I!%!A!A!99!%!A!A";;$($G$G	%
!    strategy_name
parametersseason	min_gamesreturnc                 V   XR                   ;  a)  SU 3[        U R                   R                  5       5      S.$  U R                  U5      nU R	                  5       nU R                  5       nU(       d  SS0$ U R                   U   nU" XVXr5      n	[        U	5      U:  a  S[        U	5       SU S3[        U	5      S.$ U R                  X5      n
S	UUU[        U	5      U
U	S
S U R                  U
5      U R                  U	5      S.	$ ! [         a  nS[        U5       3UUS.s SnA$ SnAff = f)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_funcr2   r1   es               r#   run_backtest!NBABacktestingEngine.run_backtest#   sY     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6vJG  !.(  #F" ,'+'I'I''R $ < <V D
 
  	,SVH5!.( 	s+   ;D 6AD ;AD 
D(D#D(#D(c                     SSK nUR                  [        R                  SS[        R
                  " SUSS.5      /SS[        R                  R                  [        5      S9nUR                  S:X  a.  [        R                  " UR                  R                  5       5      $ [        S	UR                   35        / $ ! [          a  n[        S
U 35        / s SnA$ SnAff = f)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)   rP   resultrD   s        r#   r7   $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           
      v    SSK nUR                  [        R                  SS[        R
                  " SSS.5      /SS[        R                  R                  [        5      S9nUR                  S:X  a.  [        R                  " UR                  R                  5       5      $ / $ ! [         a  n/ s SnA$ SnAff = f)	zGet NBA players datar   NrH   playersTd   )rJ   rK   rL   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r>   r"   rP   r`   rD   s       r#   r8   &NBABacktestingEngine._get_players_datai   s    	^^ 5y

<=% #277??83L $ NF
   A%zz&--"5"5"788	 	I	s$   BB"  B" "
B8,B3-B83B8c           	      t    SSK nUR                  [        R                  SS[        R
                  " SS05      /SS[        R                  R                  [        5      S9nUR                  S:X  a.  [        R                  " UR                  R                  5       5      $ / $ ! [         a  n/ s SnA$ SnAff = f)zGet NBA teams datar   NrH   teamsrJ   TrL   re   rf   s       r#   r9   $NBABacktestingEngine._get_teams_datay   s    	^^ 5w

K./% #277??83L $ NF
   A%zz&--"5"5"788	 	I	s$   BB! B! !
B7+B2,B72B7rI   rc   ri   paramsc                 L   / nUR                  SS5      R                  5       nUR                  SS5      nUR                  SS5      nSn	U H*  n
XjR                  SS5      R                  5       ;   d  M(  U
n	  O   U	(       d  U$ US	S  H  n[        R                  R	                  SS
5      nS[        U5       3UR                  SS5      SU	R                  S5      U[        US5      X:  a  SOSX:  a  UOU* UUR                  SS5       S3SS.nUR                  U5        M     U$ )z/Strategy: Bet on player points over a thresholdplayer_name points_threshold   stakerd   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profitrq   	game_info
confidence)getlowernprandomnormalr:   roundappend)r"   rI   rc   ri   rk   r2   rm   ro   rq   target_playerr   gamesimulated_pointstrades                 r#   r   1NBABacktestingEngine._strategy_player_points_over   s6    jj399;!::&8"=

7C( Fjjb9??AA & 
 M $%LD!yy//A6 's6{m4l;0'++K8-!&'7!;$4$G5V#3#F%UF $)99 EFeL!E MM% # !& r&   c                 p   / nUR                  SS5      nUR                  SS5      n0 n[        US S9n	U	SS  H  n
U
R                  S	S
5      nU
R                  SS
5      n[        R                  " SS/5      nX4 H6  nX;  a  SX'   X:X  a  U(       d  X:X  a  U(       d  X==   S-  ss'   M2  SX'   M8     UR                  US5      U:  d  M  U(       a  SOSnUR	                  S[        U5       3U
R                  SS5      SUX   UUS:X  a  UOU* UU SU 3[        SSX   S-  -   5      S.
5        M     U$ )z'Strategy: Bet on teams with win streaks
min_streak   rq   rd   c                 &    U R                  SS5      $ )Nrv   rn   )r   )xs    r#   <lambda>@NBABacktestingEngine._strategy_team_win_streak.<locals>.<lambda>   s    aeeK6Lr&   )keyNr{   rn   away_team_idTFr   rx   ry   rz   win_streak_rv   rw   r    vs 皙?      ?皙?)
r~   r   r   teamstreakr   r   rq   r   r   )r   sortedr   choicer   r:   min)r"   rI   rc   ri   rk   r2   r   rq   team_streaksprocessed_gamesr   	home_team	away_teamhome_winr   r   s                   r#   r   .NBABacktestingEngine._strategy_team_win_streak   s`    ZZa0


7C(  ,LM#DE*D!126I4I }}dE]3H #.+)*L&%(8IRZ &!+&)*L& / 	1-;#+%'F}5 HH[,? 1%*5&'.%'7eeV"$-;d9+!>"%c3,2IC2O+P"Q + +D r&   c                    / nUR                  SS5      nUR                  SS5      n0 nUSS  GH@  n	U	R                  SS5      n
U	R                  S	S5      nX4 H  nX;  d  M
  S
S
S.S
S
S.S.X'   M     [        R                  " SS/5      nX   S   S==   S-  ss'   X   S   S==   S-  ss'   U(       a  X   S   S==   S-  ss'   OX   S   S==   S-  ss'   U(       d  M  X   S   S   S:  d  M  X   S   S   X   S   S   -  nUS:  d  M  U(       a  SOSnUR                  S[	        U5       3U	R                  SS5      SU
S[        US5      UUS:X  a  UOU* UU
 SU 3US.5        GMC     U$ )z,Strategy: Bet based on home/away performancerq   rd   
focus_homeTpNr{   rn   r   r   )winstotal)homeawayFr   r   rx   r   r      r}   ry   rz   
home_perf_rv   rw   r   r   z at home vs )r~   r   r   r   venuewin_rater   r   rq   r   r   )r   r   r   r   r:   r   )r"   rI   rc   ri   rk   r2   rq   r   team_performancer   r   r   r   r   home_win_rater   s                   r#   r   4NBABacktestingEngine._strategy_home_away_performance   s    

7C(ZZd3
 $%LD!126I4I #./?@16M`almWn-o$* /
 }}dE]3H '/8A=8'/8A=8 +F3F;q@; +F3F;q@; z.9&A'JaO 0 ;F CF KN^NijpNqryNz z 3&'/eVGMM *3v;-8 $l C$; )!'$)-$;#*+2e+;%%!&(1{,yk%J&3# 5 !P r&   c                    / nUR                  SS5      R                  5       nUR                  SS5      nSnU H*  n	XiR                  SS5      R                  5       ;   d  M(  U	n  O   U(       d  U$ U V
s0 s H*  oR                  SS5      [        R                  " SS	5      _M,     nn
US
S  GH#  nUR                  SS5      nUR                  SS5      n[        R                  " SS/5      (       a  UOUnX:X  a  SOSnUR                  US5      nSnSU-  n[
        R                  R                  UU-  S5      nSnUU:  a  SOSnUR                  S[        U5       3UR                  SS5      SUR                  S5      UU[        US5      [        US5      UUUS:X  a  UOU* UUR                  S5       SU 3[        SSU-
  5      S.5        GM&     U$ s  sn
f ) z0Strategy: Player performance vs opponent defenserm   rn   rq   rd   Nrr   abbreviationr   333333?ijr{   r   TFr   r         ?rp   rx         ry   rz   vs_defense_rv   rw   r      r   r   )r~   r   r   r   opponentr   defense_ratingr   r   r   r   rq   r   r   )r   r   r   uniformr   r   r   r   r:   r   max)r"   rI   rc   ri   rk   r2   rm   rq   r   r   r   team_defenser   r   r   r   r   r   base_performanceperformance_multiplierr   r   r   s                          r#   r   0NBABacktestingEngine._strategy_player_vs_defense  s    jj399;

7C( Fjjb9??AA & 
 M \aa[`SW4fnnS#6NN[`a$%LD!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   41Gc                    / nUR                  SS5      R                  5       nUR                  SS5      nSnU H*  n	XiR                  SS5      R                  5       ;   d  M(  U	n  O   U(       d  U$ USS  H  n
[        R                  " / SQ5      nU
R                  S	S5      nUR                  S5      U;  a  MD  S
nUSU-
  -  n[        R                  " 5       U:  nU(       a  SOSnUR	                  S[        U5       3U
R                  SS5      SUR                  S5      UUUS:X  a  UOU* UUR                  S5       SUS-   S3SU-
  S.
5        M     U$ )z2Strategy: Bet on injury impact on team performance	team_namern   rq   rd   Nrr   rs   )r   r   g?g333333?r{   r   rx   ry   rz   injury_impact_rv   rw   r   z with z% injury impact)
r~   r   r   r   r   r   r   rq   r   r   )r   r   r   r   r   r:   )r"   rI   rc   ri   rk   r2   r   rq   target_teamr   r   r   r   base_win_probadjusted_win_probr   r   s                    r#   r   ,NBABacktestingEngine._strategy_injury_impactO  sj    JJ{B/557	

7C( DHH["5;;==" 
 M$%LD"MM*<=M!126I {+9<  M -]1B C}})::H'eVGMM&s6{m4l;+#4!."#*e#3%% + <=VMRUDUCVVef-/ ! !: r&   c                 &   / nUR                  SS5      nUR                  SS5      n0 nUSS  GH^  n	U	R                  SS5      n
U	R                  S	S5      nX4 H  nX;  d  M
  / X'   M     [        R                  " S
S/5      nX   R                  U5        X   R                  U(       + 5        X4 H  n[	        X   5      S:  d  M  X   SS X'   M!     X4 H  n[	        X   5      U:  d  M  X   U* S n[        U5      nU(       d  M2  US   nU(       + n[        R                  " S
S/5      nUU:X  a  SOSnUR                  S[	        U5       3U	R                  SS5      SUU(       a  SOSUUUS:X  a  UOU* UU SU S3SS.5        M     GMa     U$ )z0Strategy: Bet on momentum reversal after streaksstreak_lengthr   rq   rd   iNr{   rn   r   TF
   ir   ry   rz   	momentum_rv   rw   r   winninglosingz momentum reversal after z game streak皙?)r~   r   r   r   streak_typer   r   r   rq   r   r   )r   r   r   r   r:   all)r"   rI   rc   ri   rk   r2   r   rq   recent_gamesr   r   r   r   r   recent_results	is_streakis_winning_streak
bet_on_winnext_game_winr   s                       r#   r   0NBABacktestingEngine._strategy_momentum_reversal  s    

?A6

7C( $%LD!126I4I #.+)+L& /
 }}dE]3H #**84#**x<8 #.|)*R/)5);CD)AL& /
 #.|)*m;%1%7%HN #N 3I y,:1,=)):%:
 )/tUm(D,9Z,G%f$-c&k]";$(HH[,$G(;$(8I9x-:'./6%/?eeV%*,061J=/Ye)f*.'  /- !d r&   c                 L   / nUR                  SS5      nUR                  SS5      nUSS  H  n[        R                  " U* U5      n	[        R                  " SS5      n
[        R                  " SS5      nX-
  nX:  nU(       a  S	OS
nUR	                  S[        U5       3UR                  SS5      SUR                  SS5      UR                  SS5      [        U	S5      U
UUUUS	:X  a  UOU* UUR                  SS5       SU	S SUR                  SS5       3SS.5        M     U$ )zStrategy: Point spread bettingrq   rd   spread_thresholdr   r   NZ      ry   rz   spread_rv   rw   r   r{   rn   r   rx    z+.1fr   gp=
ף?)r~   r   r   r   r   spread
home_score
away_scoremarginr   r   rq   r   r   )r   r   r   randintr   r:   r   )r"   rI   rc   ri   rk   r2   rq   r   r   home_spreadr   r   actual_margincovers_spreadr   s                  r#   r   -NBABacktestingEngine._strategy_spread_betting  s?    

7C(!::&8!<$%LD ..*:):<LMKC0JC0J '3M)7M,e&GMMF}-l;,!XX&6;!XXnb9Q/(('"#*e#3%% $)92 >?qT@RRVW[W_W_`nprWsVtu"  !: r&   c                    / nUR                  SS5      nUR                  SS5      nSnUSS  H  n	U[        R                  " SS	5      -   n
X:  d  M$  [        R                  " 5       U
:  nU(       a  S
OSnUR                  S[	        U5       3U	R                  SS5      SU	R                  SS5      [        U
S5      UUS
:X  a  UOU* UU	R                  SS5       S3U
S.
5        M     U$ )z%Strategy: Moneyline winner predictionrq   rd   confidence_thresholdr}   r   r   Ngr   ry   rz   
moneyline_rv   rw   r   r{   rn   r   z moneyline at home)
r~   r   r   r   win_probabilityr   r   rq   r   r   )r   r   r   r   r:   r   )r"   rI   rc   ri   rk   r2   rq   r   home_advantager   home_win_probr   r   s                r#   r    3NBABacktestingEngine._strategy_moneyline_prediction  s     

7C(%zz*@#F $%LD*V^^D#-FFM3!==?]:#+%&s6{m4 HH[,? 6 HH%5r:',]A'>&'.%'7eeV"$(HH-=r$B#CCU!V"/  !, r&   r2   c                    U(       d  SS0$ [         R                  " U5      n[        U5      n[        X3S   S:H     5      n[        X3S   S:H     5      nUS:  a  XT-  OSnUS   R                  5       nUS   R	                  5       n	US:  a  X3S   S:H     S   R	                  5       OSn
US:  a  X3S   S:H     S   R	                  5       OSnX3S   S:H     S   R                  5       n[        X3S   S:H     S   R                  5       5      nUS:  a  X-  O
[        S5      nUS   n[        U5      S	:  aM  UR                  5       S:  a9  UR	                  5       UR                  5       -  [        R                  " S
5      -  nOSnUS   R                  5       nUR                  5       R                  5       nUU-
  nUR                  5       nUS:  a:  U
S:  a4  US:  a.  US	U-
  U
[        U5      -  -  -
  n[        S[        US5      5      nOSnUUU[        US-  S5      [        US5      [        U	S5      [        U
S5      [        US5      U[        S5      :w  a  [        US5      OS[        US5      [        US5      [        US5      US   R                  5       US   R                  5       S:  a$  [        XS   R                  5       -  S-  S5      S.$ SS.$ )z(Calculate comprehensive backtest resultsr-   zNo trades to analyzer   ry   rz   r   r   infrx      g      ?rd   r   u   ∞   rq   )r0   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	DataFramer:   summeanabsfloatstdr   sqrtcumsum	expandingr   r   r   )r"   r2   rk   dfr0   r   r   r   r   
avg_profitr  r  
total_winstotal_lossesr  returnsr  
cumulativerunning_maxdrawdownr  r  s                         r#   r;   0NBABacktestingEngine._calculate_backtest_results  s   344\\&! 2wR9 678B)}6784@14D>0! (|'')\&&(
AORSAS"	]e+,X6;;=YZCPSTCT2mv-.x8==?Z[ 9./9==?
2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'{7H(HC'OQR!S
 	
 st
 	
r&   c                    U(       d  0 $ [         R                  " U5      nUS   n[        U5      S:  a  [        R                  " US5      nOSnX3S:     n[        U5      S:  a,  [        XUU:*     5      S:  a  XUU:*     R                  5       OUnOSnSnX3U:     n[        U5      S:  a`  [        R                  " [        R
                  " US-  5      5      n	U	S:  a*  UR                  5       U	-  [        R                  " S5      -  OSn
OSn
US   R                  5       nUR                  5       R                  5       nX-
  n[        UR                  5       5      nUS:  a#  UR                  S   [        U5      -  S-  nX-  nOSn/ nSnSnUS    H.  nUU:X  a  US	-  nM  US:  a  UR                  UUS
.5        S	nUnM0     US:  a  UR                  UUS
.5        U Vs/ s H  nUS   S:X  d  M  UPM     nnU Vs/ s H  nUS   S:X  d  M  UPM     nn[        US5      [        US5      [        U
S5      [        US5      U(       a  [        U Vs/ s H  nUS   PM
     sn5      OSU(       a  [        U Vs/ s H  nUS   PM
     sn5      OSU(       a4  [        [        R
                  " U Vs/ s H  nUS   PM
     sn5      S	5      OSU(       a4  [        [        R
                  " U Vs/ s H  nUS   PM
     sn5      S	5      OS[        US   R                  5       S5      [        US   R!                  5       S5      [        US   R#                  5       S5      S.$ s  snf s  snf s  snf s  snf s  snf s  snf )zCalculate detailed risk metricsr   r   r   r   r   Nr   rx   )typelengthr  ry   rz   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
  r:   r   
percentiler  r  r  r  r   r  r   ilocr   r   r  skewr*  )r"   r2   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=   ,NBABacktestingEngine._calculate_risk_metricsB  sI   I\\&! X,w<!]]7A.FF 1%v;?9<VfDT=U9VYZ9Zfv-.335`fGG "]#:; 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'@#*B7aai6.A7B !&fa 0"'"3"=!4!,2ITc"D11X;"DEZ[KWs#FAAhK#FG]^WbeBGG+,N+QQx[+,N$OQRShiYeuRWW<-P<aa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    M1M=M$M$M)9M.0M3,M8r1   c                 @   US   nUS   nUS   nUS   nUS   nSU SU SUS	    S
U SU SU SUS    SUS   S-   SUS    SUS    SUS    SUS    S3nUS:  a	  US:  a  SnO US:  a	  US:  a  S nOUS!:  a	  US":  a  S#nOS$nUSU 3-  nUR                  5       $ )%z+Generate human-readable performance summaryr   r   r  r  r  uP   
🎯 **Backtest Performance Summary**

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

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

📈 **Risk-Adjusted Returns:**
• Return %: r  u   %
• Kelly Fraction: r  rd   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)r]   )	r"   r1   r   r   r  r  r  summaryratings	            r#   r<   2NBABacktestingEngine._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&   )r!   r   N)2023-24r   )__name__
__module____qualname____firstlineno____doc__r$   r?   r   r   intrE   r   r7   r8   r9   r   r   r   r   r   r   r   r    r;   r=   r<   __static_attributes__ 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            	      F   SSK n [        U R                  5      S:  a  [        5       nU R                  S   n[        U R                  5      S:  a#  [        R
                  " U R                  S   5      O0 n US:X  aH  UR                  US   UR                  S0 5      UR                  SS	5      UR                  S
S5      5      nOSSU 30n[        [        R                  " U5      5        g[        5       n[        S5        [        S5        [        S5        UR                  SSSSS.S	S5      nUR                  S5      (       aP  [        SUS    S35        [        SUS   S    S35        [        SUS   S     35        [        S!US   S"    35        O[        S#UR                  SS$5       35        [        S%5        UR                  S&SSS'.S	S5      nUR                  S5      (       a<  [        SUS    S35        [        SUS   S    S35        [        SUS   S     35        O[        S#UR                  SS$5       35        [        S(5        g! [         aF  n[        [        R                  " S[        U5      05      5        U R                  " S5         SnAgSnAff = f))z4Main function for testing the NBA backtesting enginer   Nrx   r   rE   r'   r(   r)   rD  r*   r   r-   zUnknown command: u    🏀 NBA Backtesting Engine Testz2==================================================u%   
🏃 Testing Player Points Strategy:r   lebronrp   rd   )rm   ro   rq   r   r/   u   ✅ Backtest completed: r0   z tradesu   📊 Win Rate: r1   r   %u   💰 Total Profit: $r   u   📈 Sharpe Ratio: r  u   ❌ Backtest failed: zUnknown erroru'   
🏆 Testing Team Win Streak Strategy:r   )r   rq   u+   
✅ NBA Backtesting engine test completed!)rR   r:   argvr   rT   r[   rE   r   r^   rU   r>   r?   exit)rR   enginecommandrk   r`   rD   result2s          r#   mainrU    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HHQKK	s   6A4I 
J <JJ __main__)rI  rV   rR   rT   pandasr	  numpyr   r   r   typingr   r   r   r   r	   r   rW   insertjoinrX   rY   r   rU  rE  rL  r&   r#   <module>r\     s   
 
 
    ( 6 6  277<< 9=%Q]_no pg
 g
RD>L zF r&   