
    i
.                         d Z ddlZddlZddlmZmZmZmZ ddl	m	Z	 ddl
mZ ddlZe G d d             Z G d d	      Z G d
 d      Zy)uc   
Système de Backtesting et Walk-Forward Testing
Inspiré de: Freqtrade et Intelligent Trading Bot
    N)ListDictOptionalTuple)datetime)	dataclassc                       e Zd ZU dZeed<   eed<   dZee   ed<   dZ	ee   ed<   dZ
eed<   d	Zeed
<   dZeed<   dZeed<   dZeed<   y)Tradeu   Représente un trade
entry_timeentry_priceN	exit_time
exit_priceg        quantityBUYsidepnlpnl_percent exit_reason)__name__
__module____qualname____doc__r   __annotations__floatr   r   r   r   r   strr   r   r        ./backtesting.pyr
   r
      s`    $(Ix!("&J&HeD#CKKr   r
   c            	           e Zd ZdZ	 	 	 ddededefdZddeded	ee   fd
Z	dde
dededefdZdeeef   defdZ	 ddedededefdZdefdZd ZdefdZy)BacktestEngineu<   
    Moteur de backtesting pour valider les stratégies
    initial_balancecommission_ratemax_positionsc                     || _         || _        || _        || _        g | _        g | _        g | _        g | _        || _        y N)	r"   balancer#   r$   open_tradesclosed_tradesequity_curvedrawdown_curvepeak_balance)selfr"   r#   r$   s       r   __init__zBacktestEngine.__init__    sK      /&.*(**, +r   Nprice	timestampr   c           	      &   t        | j                        | j                  k\  r$t        j                  d| j                   d       y|| j
                  | j                  z  }n||z  }|| j
                  kD  rt        j                  d       y|| j                  z  }||z
  |z  }| xj
                  ||z   z  c_        t        |||d      }| j                  j                  |       t        j                  d|dd	|dd
| j
                  d       |S )u   Exécute un ordre d'achatu   ⚠️ Max positions atteint ()Nu   ⚠️ Solde insuffisantr   )r   r   r   r   u	   ✅ BUY: .6f @ z	, Solde: z.2f)	lenr(   r$   loggingdebugr'   r#   r
   append)r-   r/   r0   r   position_size
commissionactual_quantitytrades           r   execute_buyzBacktestEngine.execute_buy/   s   t D$6$66MM:4;M;M:NaPQ  LL4+=+==M$u,M4<<'MM46 #T%9%99
(:5> 	34  $	
 	&	/#!6c%Idll[^M_`ar   r<   reasonc                 &   || j                   vry|j                  |z  }|| j                  z  }||z
  }| xj                  |z  c_        |j                  |j                  z  }||z
  |_        |j
                  |z  dz  |_        ||_        ||_        ||_	        | j                   j                  |       | j                  j                  |       t        j                  d|j                  dd|dd|j
                  dd|j                  dd		       |S )
u   Exécute un ordre de venteNd   u
   ✅ SELL: r3   r4   z, PnL: +.2fz (z%))r(   r   r#   r'   r   r   r   r   r   r   remover)   r8   r6   r7   )	r-   r<   r/   r0   r>   gross_proceedsr:   net_proceedsinitial_values	            r   execute_sellzBacktestEngine.execute_sellS   s   ((( %/#d&:&::
%
2 	$ ):):: =0	"YY6#= $ "&!!%(
5>>#"6c% E"YYt,Bu/@/@.FbJ 	K r   current_pricesc                 B   t        fd| j                  D              }| j                  |z   }| j                  j	                  ||d       || j
                  kD  r|| _        | j
                  |z
  | j
                  z  dz  }| j                  j	                  ||d       y)u    Met à jour la courbe d'équitéc              3      K   | ]7  }|j                   j                  |j                  |j                        z   9 y wr&   )r   getr   r   ).0r<   rG   s     r   	<genexpr>z/BacktestEngine.update_equity.<locals>.<genexpr>u   s9      #
 NN^//

E<M<MNN#
s   =A r0   equityr@   )r0   drawdownN)sumr(   r'   r*   r8   r,   r+   )r-   rG   r0   open_positions_valuetotal_equityrO   s    `    r   update_equityzBacktestEngine.update_equityr   s      # #
))#
  

 ||&::  """
 	 $+++ ,D&&59J9JJcQ""" $
 	r   current_pricestop_loss_pcttake_profit_pctc                 .   | j                   dd D ]  }|j                  dk(  s|j                  |z
  |j                  z  dz  }||k\  r| j                  |||d       ||j                  z
  |j                  z  dz  }||k\  sp| j                  |||d        y)u%   Vérifie les stop-loss et take-profitNr   r@   z	Stop LosszTake Profit)r(   r   r   rF   )r-   rT   r0   rU   rV   r<   loss_pct
profit_pcts           r   check_stop_loss_take_profitz*BacktestEngine.check_stop_loss_take_profit   s     %%a( 
	VEzzU""..>%BSBSSWZZ},%%e]I{S  -u/@/@@EDUDUUY\\
0%%e]I}U
	Vr   returnc                    | j                   sdddddS t        | j                         }| j                   D cg c]  }|j                  dkD  s| }}| j                   D cg c]  }|j                  dk  s| }}|dkD  rt        |      |z  dz  nd}t        d | j                   D              }|dkD  r||z  nd}|r-t	        j
                  |D cg c]  }|j                   c}      nd}|r-t	        j
                  |D cg c]  }|j                   c}      nd}	|r.t        t        d |D              t        d |D              z        nd}
| j                  rt        d | j                  D              nd}| j                  t        d | j                  D              z   }|| j                  z
  | j                  z  dz  }|t        |      t        |      |||||	|
|||d	S c c}w c c}w c c}w c c}w )
z'Calcule les statistiques de performancer   )total_tradeswin_rate	total_pnlavg_pnlr@   c              3   4   K   | ]  }|j                     y wr&   r   rK   ts     r   rL   z0BacktestEngine.get_statistics.<locals>.<genexpr>   s     :!:   c              3   4   K   | ]  }|j                     y wr&   rb   rc   s     r   rL   z0BacktestEngine.get_statistics.<locals>.<genexpr>   s     >!>re   c              3   4   K   | ]  }|j                     y wr&   rb   rc   s     r   rL   z0BacktestEngine.get_statistics.<locals>.<genexpr>   s     DbqQUUDbre   c              3   &   K   | ]	  }|d      yw)rO   Nr   )rK   ds     r   rL   z0BacktestEngine.get_statistics.<locals>.<genexpr>   s     FQ1Z=Fs   c              3   N   K   | ]  }|j                   |j                  z    y wr&   )r   r   rc   s     r   rL   z0BacktestEngine.get_statistics.<locals>.<genexpr>   s     )_!**q}}*D)_s   #%)r]   winning_tradeslosing_tradesr^   r_   r`   avg_winavg_lossprofit_factormax_drawdownroifinal_balance)r)   r5   r   rP   npmeanabsr+   maxr'   r(   r"   )r-   r]   rd   rk   rl   r^   r_   r`   rm   rn   ro   rp   final_equityrq   s                 r   get_statisticszBacktestEngine.get_statistics   s   !! !	  4--.%)%7%7E15519!EE$($6$6Dq!%%!)DDAMPQAQC',6#=WX:t'9'9::	.:Q.>)l*A>L"''.9Q1559:RS>K277=9aAEE9:QRgtC>~>>DbTaDbAbbcz{ KOJ]J]sF$2E2EFFcd ||c)_dN^N^)_&__t333t7K7KKsR )!.1 / " *()
 	
) FD :9s#   G"G" G'5G'G,G1c                 v   | j                         }t        d       t        d       t        d       t        d| j                  dd       t        d|d   dd       t        d	|d
   dd       t        d|d   dd       t        d       t        d|d   d       t        d|d   d       t        d|d   d       t        d|d   dd       t        d       t        d|d   dd       t        d|d   dd       t        d|d   d       t        d|d    dd       t        d!       y")#u"   Affiche un résumé des résultats=
============================================================u   📊 RÉSULTATS DU BACKTEST<============================================================zSolde initial:     z>12,.2fz USDTzSolde final:       rr   zROI:               rq   %zPnL Total:         r_   z<------------------------------------------------------------zTrades totaux:     r]   z>12zTrades gagnants:   rk   zTrades perdants:   rl   zWin Rate:          r^   z>12,.1fzGain moyen:        rm   zPerte moyenne:     rn   zProfit Factor:     ro   zMax Drawdown:      rp   =============================================================
N)rx   printr"   )r-   statss     r   print_summaryzBacktestEngine.print_summary   so   ##%m+,f#D$8$8#AGH#E/$:7#C5IJ#E%L#9;<#E+$6w#?uEFf#E.$9##>?@#E*:$;C#@AB#E/$:3#?@A#E*$5g#>a@Af#E)$4W#=UCD#E*$5g#>eDE#E/$:7#CDE#E.$9'#B!DEmr   filepathc                    | j                         | j                  D cg c]  }|j                  r|j                  j                         nd|j                  |j
                  r|j
                  j                         nd|j                  |j                  |j                  |j                  |j                  d c}| j                  D cg c]  }|d   j                         |d   d c}d}t        |d      5 }t        j                  ||d	       ddd       t        j                   d
|        yc c}w c c}w # 1 sw Y   ,xY w)u   Exporte les résultats en JSONN)r   r   r   r   r   r   r   r   r0   rN   rM   )
statisticstradesr*   w   )indentu   💾 Résultats exportés: )rx   r)   r   	isoformatr   r   r   r   r   r   r   r*   openjsondumpr6   info)r-   r   rd   edatafs         r   export_resultszBacktestEngine.export_results   s!    --/ ++  ?@ll!,,"8"8":PT#$==<=KK!6!6!8T"#,, !

55#$==#$==	$ **
  "#;!9!9!;k
0 (C  	)AIIdAa(	) 	28*=>3	) 	)s   BD3 D89D==E)g     @gMbP?   r&   )r   )g       @g      @)r   r   r   r   r   intr.   r   r   r=   r
   r   rF   r   rS   rZ   rx   r   r   r   r   r   r!   r!      s     18*/&', ,"', #," "8 "xPU "H%  ( TW >De,<  2 Z]V V8 V38VQVV,
 ,
\.?s ?r   r!   c                   P    e Zd ZdZddedefdZddededee   fdZdefd	Z	d
 Z
y)WalkForwardTesteru8   
    Walk-Forward Testing pour validation réaliste
    train_windowtest_windowc                 .    || _         || _        g | _        y r&   )r   r   results)r-   r   r   s      r   r.   zWalkForwardTester.__init__  s    (&r   r   n_splitsr[   c                     t        |      }g }t        |      D ]V  }|| j                  z  }|| j                  z   }|}|| j                  z   }	|	|kD  r |S ||| }
|||	 }|j	                  |
|f       X |S )uK   
        Découpe les données en fenêtres train/test successives
        )r5   ranger   r   r8   )r-   r   r   total_lengthsplitsitrain_start	train_end
test_starttest_end
train_data	test_datas               r   
split_datazWalkForwardTester.split_data  s     4yx 	3Ad...K#d&7&77I"J!D$4$44H,&  k)4JZ1IMM:y12	3 r   c           	      2   | j                  |      }t        |      D ]h  \  }\  }}t        j                  d|dz    dt	        |              t        di |}|j                         }	| j                  j                  ||	d       j | j                          y)u2   
        Exécute le walk-forward testing
        u   🔄 Walk-Forward    /)splitr   Nr   )
r   	enumerater6   r   r5   r!   rx   r   r8   print_walk_forward_summary)
r-   r   strategy_funckwargsr   r   r   r   backtestr   s
             r   run_walk_forwardz"WalkForwardTester.run_walk_forward   s     &*3F*; 	&A&
ILL-acU!CK=AB &//H
 ++-ELL! 	& 	'')r   c           
      @   | j                   syt        d       t        d       t        d       | j                   D ];  }|d   }t        d|d   dz    d	       t        d
|d   dd|d   dd|d           = t        j                  | j                   D cg c]
  }|d   d    c}      }t        j                  | j                   D cg c]
  }|d   d    c}      }t        d       t        d|dd       t        d|dd       t        d       yc c}w c c}w )u+   Affiche le résumé du walk-forward testingNrz   u$   🔄 RÉSULTATS WALK-FORWARD TESTINGr{   r   z
Split r   r   :z  ROI: rq   rA   z% | Win Rate: r^   z.1fz% | Trades: r]   z=
------------------------------------------------------------zMoyenne ROI:       r|   zMoyenne Win Rate:  r}   )r   r~   rs   rt   )r-   resultr   ravg_roiavg_win_rates         r   r   z,WalkForwardTester.print_walk_forward_summary;  s$   ||m45fll 	6F7OEHVG_Q./q12GE%L.nU:=Ns<S T">235 6	6 ''dllC1W:e,CDwwM1'
: 6MNm#GD>34#L#5Q78m DMs   D	DN)r@      )r   )r   r   r   r   r   r.   r   r   r   r   r   r   r   r   r   r      sI    S S 
t s 4; 0*T *6r   r   )r   numpyrs   r6   typingr   r   r   r   r   dataclassesr   r   r
   r!   r   r   r   r   <module>r      sS      . .  !  
 
 
`? `?FS Sr   