
    b"i.=                         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rSSK	J
r
JrJrJrJr  SSKJrJr  SSKr\R$                  R'                  S\R$                  R)                  \5      5        SSKJr   " S S5      rg)zj
Parameter Optimization Engine for Trading Strategies
Premium feature with subscription tier restrictions
    N)DictListAnyOptionalTuple)datetime	timedelta)UniversalBacktestingEnginec                   `   \ rS rSrSrS r SS\S\S\\\4   S\\\	4   S	\\\4   S
\S\S\\\4   4S jjr
 SS\S\S\S\S\S\S
\S\S\	\   4S jjr SS\S\S\S\S\S\S
\S\S\	\   4S jjr SS\S\S\S\S\S\S
\S\S\	\   4S jjrS\S\S\4S jrS\	\   S\S\\\4   4S jrSrg)ParameterOptimizer   z>Optimizes trading strategy parameters using various algorithmsc                 t    [        5       U l        U R                  U R                  U R                  S.U l        g )N)grid_searchrandom_searchgenetic_algorithm)r
   engine_grid_search_random_search_genetic_algorithmoptimization_methods)selfs    5/var/www/html/leadgen/backtest/parameter_optimizer.py__init__ParameterOptimizer.__init__   s1    02,,!00!%!8!8%
!    Nmarketstrategy_namebase_parametersparameter_rangesoptimization_config	data_file	timeframereturnc                    UR                  SS5      nUR                  SS5      n	UR                  SS5      n
[        SU 35        [        SU 35        [        S	U	 35        [        S
U
 35        [        S[        UR                  5       5       35        XR                  ;  a  SSU 30$ U R                  U   nU" UUUUU	U
UUS9nU R                  X5      $ )a  
Optimize strategy parameters

Args:
    market: 'forex', 'crypto', 'stocks', 'nba'
    strategy_name: Name of strategy to optimize
    base_parameters: Base parameter values
    parameter_ranges: Parameter ranges to test {'param_name': [min, max, step]}
    optimization_config: Optimization settings
    data_file: Path to data file
    timeframe: Data timeframe

Returns:
    Dict with optimization results
methodr   max_evaluationsd   target_metricsharpe_ratiou)   🎯 Starting parameter optimization for z   Method: z   Max evaluations: z   Target metric: z   Parameters to optimize: errorzUnknown optimization method: )r   r   r   r   r&   r(   r!   r"   )getprintlistkeysr   _format_optimization_results)r   r   r   r   r   r    r!   r"   r%   r&   r(   optimizer_funcresultss                r   optimize_strategy$ParameterOptimizer.optimize_strategy!   s   $ %((=A-112CSI+//P9-IJF8$%$_$567"=/23+D1A1F1F1H,I+JKL222<VHEFF 226: '+-+'	
 00HHr   r&   r(   c	           
         / n	[        UR                  5       5      n
/ nUR                  5        H  u  p[        U5      S:X  a  Uu  pn[        R
                  " XU-   U5      n[        U[        5      (       aE  [        U[        5      (       a0  [        U[        5      (       a  U Vs/ s H  n[        U5      PM     nnUR                  U5        M  UR                  U5        M     [        [        R                  " U6 5      n[        U5      U:  a=  [        R                  R                  [        U5      USS9nU Vs/ s H  nUU   PM
     nn[        S[        U5       S35        / n[        U5       H  u  nnUR                  5       n[        U
5       H  u  nnUU   UU'   M      U R                   R#                  UUUUSUS9nUR%                  S5      (       ai  U R'                  UU5      nUR                  UUR%                  S	0 5      UUS
-   S.5        US
-   S-  S:X  a   [        SUS
-    S[        U5       S35        M  M  M     U$ s  snf s  snf ! [(         a   n[        SUS
-    SU 35         SnAGM  SnAff = f)zGrid search optimization   F)replacez   Grid search: Testing z parameter combinations
   r   r   
parametersdata_source
min_tradesr"   successr1      r9   metricsr(   evaluation_numberr      Completed / evaluations   Error in evaluation : N)r-   r.   itemslennparange
isinstanceintappend	itertoolsproductrandomchoicer,   	enumeratecopyr   run_backtestr+   _extract_metric	Exception)r   r   r   r   r   r&   r(   r!   r"   param_combinationsparam_namesparam_values
param_nameparam_rangemin_valmax_valstepvaluesvcombinationsindicesir1   comboparamsjbacktest_resultmetric_valuees                                r   r   ParameterOptimizer._grid_searchP   s     +0023 '7'='='?#J;1$)4&$7dNDAgs++
7C0H0HZX\^aMbMb.45fc!ffF5##F+##K0 (@ I--|<= |.ii&&s<'8/SX&YG5<=WLOWL=(\):(;;RST!,/HAu$))+F!*;!7:%*1Xz" "8"&++":":!"/% )!' #; # #&&y11#'#7#7#WLNN&,#2#6#6y"#E)5-.U	$  A|q(a!eWAc,6G5HUV ) 2# 0D g 6 >F  /Awb<=s%   $I:I$BI
I;I66I;c	           
      v   [        SU S35        / n	[        UR                  5       5      n
[        U5       GHQ  nUR	                  5       nUR                  5        H  u  p[        U5      S:X  af  Uu  nnn[        U[        5      (       d  [        U[        5      (       a  [        R                  " UU5      X'   M_  [        R                  " UU5      X'   Mz  [        R                  " U5      X'   M      U R                  R                  UUUUSUS9nUR                  S5      (       ab  U R!                  UU5      nU	R#                  UUR                  S0 5      UUS-   S	.5        US-   S-  S
:X  a  [        SUS-    SU S35        GMN  GMQ  GMT     U	$ ! [$         a   n[        SUS-    SU 35         SnAGM}  SnAff = f)zRandom search optimizationz   Random search: Testing z random parameter combinationsr5   r7   r8   r<   r1   r=   r>   r   rA   rB   rC   rD   rE   N)r,   r-   r.   rangerR   rF   rG   rJ   floatrO   uniformrandintrP   r   rS   r+   rT   rL   rU   )r   r   r   r   r   r&   r(   r!   r"   r1   rW   rb   rd   rY   rZ   r[   r\   r]   rf   rg   rh   s                        r   r   !ParameterOptimizer._random_search   s   
 	*?*;;YZ[+0023'A$))+F+;+A+A+C'
{#q(-8*GWd!'511Z5O5O-3^^GW-M*-3^^GW-M*)/{)CF& ,D"&++":":!"/% )!' #; # #&&y11#'#7#7#WLNN&,#2#6#6y"#E)5-.U	$  A|q(a!eWAo5FlST ) 21 (P 	  /Awb<=s   1BF
F8F33F8c	                 ,   [        SUS-  5      n	XY-  n
[        SU	 SU
 S35        / n[        UR                  5       5      n[	        U	5       H  n0 nUR                  5        H  u  nn[        U5      S:X  af  Uu  nnn[        U[        5      (       d  [        U[        5      (       a  [        R                  " UU5      X'   M`  [        R                  " UU5      X'   M{  [        R                  " U5      X'   M     UR                  U5        M     / n[	        U
5       GHW  n[        SUS-    S	U
 35        / nU H  nUR                  5       nUR                  U5         U R                   R#                  UUUUS
US9nUR%                  S5      (       aP  U R'                  UU5      nUUR%                  S0 5      UUS-   S.nUR                  U5        UR                  U5        M  M     U(       d  M  UR+                  S SS9  [-        SU	S-  5      nUSU nU Vs/ s H  nUS   PM
     nn[        U5      U	:  Ga9  [        R                  " U5      S   n [        R                  " U5      S   n!0 n"U H  n[        R                  " 5       S:  a	  U U   U"U'   OU!U   U"U'   [        R                  " 5       S:  d  MH  XO   n[        U5      S:X  ah  Uu  nnn[        U[        5      (       d  [        U[        5      (       a  [        R                  " UU5      U"U'   M  [        R                  " UU5      U"U'   M  [        R                  " U5      U"U'   M     UR                  U"5        [        U5      U	:  a  GM9  UnGMZ     U$ ! [(         a  n SnAGMS  SnAff = fs  snf )z%Simple genetic algorithm optimization      z   Genetic algorithm: z population, z generationsr5   z   Generation r=   rB   r7   r8   r<   r1   )r9   r?   r(   
generationNc                     U S   $ Nr(    xs    r   <lambda>7ParameterOptimizer._genetic_algorithm.<locals>.<lambda>  s	    !O2Dr   Tkeyreverse   r9   g      ?g?)minr,   r-   r.   rk   rF   rG   rJ   rl   rO   rm   rn   rP   rL   rR   updater   rS   r+   rT   rU   sortmax)#r   r   r   r   r   r&   r(   r!   r"   population_sizegenerations
populationrW   _
individualrY   rZ   r[   r\   r]   all_resultsrs   generation_resultsrd   rf   rg   resultrh   
elite_sizeeliteselitenew_populationparent1parent2childs#                                      r   r   %ParameterOptimizer._genetic_algorithm   s   
 b/Q"67%8&&7}[MQ]^_ 
+0023'AJ+;+A+A+C'
K{#q(-8*GWd!'511Z5O5O171Q
.171Q
.-3]];-GJ* ,D j) ( ,JN:>"2!K=AB "$(
(--/j)&*kk&>&>%&3#)$-#%"+ '? 'O '**955'+';';O]'[*0'6':':9b'I-9*4q.	" +11&9#**62 6 )8 & ##(Dd#S Q1 45J'4F @FFveeL1vNF n%7 --/= --/= "-J}},,3J,?j),3J,?j) }},&6&B{+q05@2GWd)'599ZQV=W=W4:NN7G4Tj 14:NN7G4Tj 106k0JE*-! #.$ %%e,3 n%76 (JU -X ] !  Gs   BM8N8
N	Nrf   c                    ^ TR                  S0 5      nS S S S S U4S jS S	.nX$;   a
  XB   " U5      $ UR                  S
S5      $ )z+Extract target metric from backtest resultsr1   c                 &    U R                  SS5      $ )Nr)   r   r+   rs    r   ry   4ParameterOptimizer._extract_metric.<locals>.<lambda>9      aeeNA&>r   c                 &    U R                  SS5      $ )Ntotal_profitr   r   r   s    r   ry   r   :  r   r   c                 &    U R                  SS5      $ )Nwin_rater   r   r   s    r   ry   r   ;  s    !%%
A"6r   c                 &    U R                  SS5      $ )Nprofit_factorr=   r   r   s    r   ry   r   <  s    quu_a'@r   c                 :    [        U R                  SS5      5      * $ )Nmax_drawdownr   )absr+   r   s    r   ry   r   =  s    s155+C'D&Dr   c                 (   > TR                  SS5      $ )Ntotal_tradesr   r   )r   rf   s    r   ry   r   >  s    o&9&9.!&Lr   c                 &    U R                  SS5      $ )N
expectancyr   r   r   s    r   ry   r   ?  s    AEE,$:r   )r)   r   r   r   r   r   r   r)   r   r   )r   rf   r(   r1   metric_mappings    `   r   rT   "ParameterOptimizer._extract_metric4  s\    !%%i4 ?>6@DL:
 *!099 {{>1--r   r1   c                 l   U(       d  SS0$ [        US SS9nUS   nU Vs/ s H  oUS   PM	     nnU Vs/ s H?  n[        U[        [        45      (       d  M   [        R
                  " U5      (       a  M=  UPMA     nnU(       aC  [        U5      n[        U5      n	[        R                  " U5      n
[        R                  " U5      nOS=n=n	=pUSS	 nS[        U5      US
   US   US   S.[        US5      [        U	S5      [        U
S5      [        US5      US.[        U5       VVs/ s HR  u  pUS-   US
   US   US   R                  SS5      US   R                  SS5      US   R                  SS5      S.S.PMT     snnU[        [        R                   " 5       5      S.$ s  snf s  snf s  snnf )z'Format optimization results for displayr*   z"No successful optimization resultsc                     U S   $ ru   rv   rw   s    r   ry   AParameterOptimizer._format_optimization_results.<locals>.<lambda>O  s	    q7Ir   Tr{   r   r(   Nrr   r9   r?   )r9   r(   r?      )
best_valueworst_valueaverage_valuestandard_deviationr(   r=   r   r   r)   )r   r   r)   )rankr9   r(   key_metrics)r<   total_evaluationsbest_result
statisticstop_5_resultsr   optimization_timestamp)sortedrJ   rK   rl   rH   isnanr   r   meanstdrG   roundrQ   r+   strr   now)r   r1   r(   sorted_resultsr   r   target_valuesr_   r   r   	avg_value	std_valuetop_5rb   r   s                  r   r/   /ParameterOptimizer._format_optimization_resultsH  s    ABB  -ISWX %Q' 6==W?+W=$1eMqZC<5PY[YaYabcYdMe]+Jm,K.I}-I?@@J@@y r" !$W),7!,_!=&y1 $J2$[!4!&y!!4&+Iq&9!.$ "+5!1 "2IA E"("6%+O%<$*9$5$9$9*a$H(.y(9(=(=na(P(.y(9(=(=na(P$		 "2 *&)(,,.&9;
 	
 >e8s   F&F+F+5F+)AF0)r   r   )N1hour)__name__
__module____qualname____firstlineno____doc__r   r   r   r   r   r2   rK   r   r   r   rl   rT   r/   __static_attributes__rv   r   r   r   r      s   H
 BI-I -IC -IRVWZ\_W_R` -I+/T	?-IQUVY[^V^Q_-I$'-I;>-IMQRUWZRZ^-Ib =DC3 Cs CT C&*C=@CQTC"C69CHLT
CN ?F2S 2 2t 2(,2?B2SV2!$28;2JNt*2l CJi iS iSW i,0iCFiWZi%(i<?iNRSWjiV.t .C .E .(9
DJ 9
s 9
W[\_ad\dWe 9
r   r   )r   ossysjsonrM   numpyrH   pandaspdtypingr   r   r   r   r   r   r	   rO   pathinsertdirname__file__universal_backtestingr
   r   rv   r   r   <module>r      sZ   
 
 
     3 3 (  277??8, - <k
 k
r   