
    ƫ9ju              	       P   d dl Zd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZej$                  j'                  ej$                  j)                  ej$                  j+                  ej$                  j-                  e      d                   d dlmZ d dlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z%m&Z' dZ(dZ)dZ*dZ+d	Z,d
Z-dZ.dZ/ddddddZ0d Z1e,fdZ2e-fdZ3d Z4d Z5d Z6	 d dl7Z7d dl8m9Z9 d Z;d Z<dZ=da>d Z?d Z@eAd k(  r e@        yy# e:$ r dZ7dZ9Y )w xY w)!    Nz..)library_activation_scores)
RESULTS_DIRWINNERS_DIR
SWEEPS_DIRREPORTS_DIRSCORE_START	TRAIN_ENDMVRV_BEAR_THRESHOLDMVRV_BULL_THRESHOLDcomposite_scoreget_min_tradeszresults/sweep_database.dbzresults/optuna_studies   g      ?  皙?i@KL i 	= calmar_ratiosortino_ratiosharpe_ratiopnl_dd_ratior   )Calmar RatioSortino RatioSharpe RatioP&L/DD Ratio	Compositec                 |   |dk(  r| S d| j                   vrt        d| d       | S | d   }|dk(  r||k  }n|dk(  r||k\  }n||k\  ||k  z  }t        |       }| j                  |   j	                         j                  d      } t        d	| d
| d| dt        |        d| dt        |       |z  dz  dd       | S )zFilter df to only bars matching the requested regime using the 'zscore' column.
    Returns filtered copy. If 'zscore' column is absent, warns and returns df unchanged.allzscorez[WARNING] --regime=zK requested but 'zscore' column not found in data; no regime filter applied.bearbullTdropz[regime=z] bear_thr=z
 bull_thr=z: kept /z
 IS bars (d   z.1fz%))columnsprintlenloccopyreset_index)dfregimebear_thresholdbull_thresholdzmaskn_befores          G/Users/jameslopez/projects/TradingBot25/strategies/optimize_strategy.py_apply_regime_maskr1   3   s     	rzz!#F8+vwx	
8A>!	6	N"^#N(:;2wH					(	(d	(	3B	HVHK'7z.AQ Rb'!H:ZB0@0DS/IM NI    c                 \   t         j                  j                  t              st	        j
                         S 	 t        j                  t              }t	        j                  d| d| d|| |t        |f      }|j                          |S # t        $ r t	        j
                         cY S w xY w)zEReturn a DataFrame of top_k rows for this asset/TF from the sweep DB.zOSELECT * FROM sweep_results WHERE asset=? AND timeframe=? AND schema_ver=? AND z>0 ORDER BY z DESC LIMIT ?)params)ospathexistsSWEEP_DB_FILEpd	DataFramesqlite3connectread_sqlDB_SCHEMA_VERclose	Exception)asset	timeframedb_coltop_kconnr)   s         r0   _load_db_top_resultsrF   I   s    77>>-(||~}-[[BBH Jx}. %M5A	
 	

	 ||~s   AB B+*B+c                 $   | j                   st        |       dk  ri S t        dt        t        |       |z              }| j	                  |      }i }t        ||      D ]  \  }}|j                  |      }	|	|	j                         j                         r8|	j                         j                  j                  t              }
t        |
      dk  rtt        j                  |
ddg      \  }}|||k\  ||k  z     }t        |      dk  r|||<    |S )a:  
    Compute biased sampling ranges from the top fraction of historical results.
    Returns dict: param_name -> (biased_vals_array | None).
    biased_vals_array contains the subset of the param grid that falls in the p5-p95
    range of the top performers.  None means no meaningful signal (use full range).
       
      _      )emptyr%   maxintheadzipgetisnar   dropnavaluesastypefloatnp
percentile)df_topparam_namesparam_vals_arraystop_fracn_top
top_subsetbiasednamevalscol	col_cleanp5p95biased_valss                 r0   _compute_biased_rangesrh   [   s     ||s6{R'	CFh./0EU#JF+'89
dnnT";#((*..*JJL''..u5	y>A--	Ar73CDBJ43;78{a"t : Mr2   c           	         	 ddl m}m} i }|j	                         D ]  \  }}d|v r7|d   }t        |      dkD  s ||D 	cg c]  }	t        |	       c}	      ||<   At        j                  |d   |d   |d         }t        |      dkD  sp |t        |d         t        |d         t        |d         	      ||<    |S # t        $ r i cY S w xY wc c}	w )
z<Build Optuna distribution objects for all non-locked params.r   )FloatDistributionCategoricalDistributionrU      startstopstep)ro   )	optuna.distributionsrj   rk   ImportErroritemsr%   rW   rX   arange)
r[   r\   params_configrj   rk   distsra   configrb   vs
             r0   _build_optuna_distributionsry   x   s    S E%++-fv(#D4y1}56NAuQx6NOd99VG_fVnfVnMD4y1}/&/*$r(Ovf~.d . L#  	 7Os   C  C
CCc           
         	 ddl }|j                  j                  |j                  j                         | j
                  st        |       dk  ryt        |d|      }|D ]  }|j                  |d        |sy|j                  d      }g }	| j                         D ]z  \  }
}|j                  |      }|*t        |t              rt        j                  |      s|dk  rEi }d}|j!                         D ]  \  }}|j                  |      }|%t        |t              rt        j                  |      rd} nt        |      }ddlm} t        ||      r|j&                  ut)        ||j*                  z
  |j&                  z        }t)        |j*                  ||j&                  z  z   d	      }t-        |j*                  t/        |j0                  |            }|||<    |sD	 |	j3                  |j4                  j7                  ||t        |      
             } t        |	      dk  ry|j;                  |	       |S # t        $ r Y yw xY w# t8        $ r Y w xY w)z
    Create an in-memory Optuna study pre-populated with top DB results.
    Used only for importance analysis at the end of a run.
    Returns the study, or None if optuna is unavailable / not enough data.
    r   N   maximize)	directionTF)rj      )r4   distributionsvalue)optunaloggingset_verbosityWARNINGrr   rM   r%   ry   popcreate_studyiterrowsrR   
isinstancerW   rX   isnanrs   rq   rj   ro   roundlowrN   minhighappendtrialcreate_trialr@   
add_trials)rZ   r[   ru   rC   locked_paramsr   rv   ra   studytrials_rowscorer4   validdistvalrj   n_stepss                      r0    _build_optuna_study_from_resultsr      s   $$V^^%;%;< ||s6{R''T=IE		$ *5EF//#3=Zu5"((5/eWXj++-JD$''$-C{z#u5"((3-*C>$ 12tyy7Ltxx499 <=DHHw'::A>$((C		3$78F4L ( 	MM&,,33U%, 4  - $8 6{R	VL]  P  		s#   3H= "6I=	I	I		IIc                 ^   	 ddl }|j                  j                  d      }|j                  j                  | |      }t        j                  t        d       t        j                  j                  t        d	| d
| d      }d| d| dt        j                  j                         j                  d       d| dt        | j                         dddg}	t!        |j#                         d      D ]B  \  }
\  }}dt%        dt'        |dz              z  }|	j)                  d|
 d| d|dd| d	       D t+        |d      5 }|j-                  dj                  |	      dz          ddd       t        d|        y# t        $ r}t        d|        Y d}~yd}~ww xY w# 1 sw Y   <xY w) z2Write param importance report to results/reports/.r   N*   )seed)	evaluatorz(   [Optuna] Importance analysis failed: Texist_okoptuna_importance_r   z.mdu"   # Optuna Parameter Importance —  z*Generated: z%Y-%m-%d %H:%Mz  | Metric: z  | Trials: z*
z!| Rank | Parameter | Importance |z!|------|-----------|------------|rl   u   █r{   z| z | `z` | .4fz |w
u"      [Optuna] Importance report → )r   
importance'MeanDecreaseImpurityImportanceEvaluatorget_param_importancesr@   r$   r5   makedirsr   r6   joindatetimenowstrftimer%   r   	enumeraters   rN   r   r   openwrite)r   rA   rB   metric_namer   r   importanceseout_pathlinesrankra   impbarfs                  r0   _write_importance_reportr      s   %%MMSUMV	''==ey=Y
 KKd+ww||K+=eWAi[PS)TUH -UG1YK@
x((,,.778HIJ K Mc%,,.?-@	E++E '{'8'8':A>ktSc!U38_--r$tD6c#YauB?@ ? 
h				% 4'( 
	.xj
9:)  8<=$ 
	s#   =E? $F#?	F FF #F,)cudac            	      ,   g } t         r\| j                  dt        j                  d      dd       | j                  dt        j                         j                  dd       	 g d}t        j                  |ddd	
      }|j                  dk(  rg|j                  j                         j                  d      D cg c]  }t        |       c}\  }}}}| j                  d| d| d||z  dz  dd       dj                  |       S c c}w #  Y xY w)z"Retrieves CPU, RAM, and GPU stats.zCPU: N)intervalz3.0f%zRAM: )z
nvidia-smizD--query-gpu=temperature.gpu,utilization.gpu,memory.used,memory.totalz--format=csv,noheader,nounitsTr   )capture_outputtexttimeoutr   ,zGPU: zC z
% | VRAM: r"   .0fz | )psutilr   cpu_percentvirtual_memorypercent
subprocessrun
returncodestdoutstripsplitrO   r   )statscmdprocxtemputilmem_used	mem_totals           r0   get_hardware_statsr      s	   EuV//>tDAFGuV224<<TB!DE F~~c$T3O??a?C{{?P?P?R?X?XY\?].^?]!s1v?].^+D$)LL5bj(9:Lc9QRU8VVWXY::e /_Ds   &AD =D
*D 
D Dc                 ^    | dk  r| dS | dk\  r	| dz  ddS | dk\  r	| dz  ddS | dz  d	d
S )z2Formats large numbers into human-readable strings.i@B r   g   mBz.2fz	 trilliong    eAz billiong    .Ar   m )ns    r0   format_large_numberr      sU    9}!uoDyAdF3<y11Cx1S5+X..eC[?r2   g      >@        c                 :   t        j                          }| |k\  }|s|t        z
  t        k  ry |a||z
  }|dkD  r| |z  nd}|dkD  r|| z
  |z  nd}	t        t	        j
                  t        |	                  }
|dd}d| |z  dz  ddt        |        d	t        |       d
| d|
 d|dd|ddt                }t        j                  j                  d| d       |rt        j                  j                  d       t        j                  j                          y )Nr   )secondsz,.0fz it/sz
Progress: r"   z5.1fz% (r!   z
) | Rate: z | ETA: z | Best GPU Calmar: r   z (vs z) | z    r   )time_last_progress_timePROGRESS_INTERVALstrr   	timedeltarO   r   r   sysr   r   flush)	iterationtotal
start_time
best_scorebaseline_scorer   is_finalelapsedrate	remainingetarate_strlines                r0   print_progressr     s{   
))+CE!H226GGJG")A+9w1D.2Qh"d*AI
h  Y8
9CtE"H	%+D15H5S4TTUVijoVpUqq{  }E  |F  FN  OR  NS  Sg  hr  sv  gw  w|  }K  LO  |P  PT  Ug  Ui  Tj  kDJJr$t_%

JJr2   c                  '  hij t        j                  d      } | j                  dt        dd       | j                  dt        dd       | j                  d	t        d
       | j                  dt        dd       | j                  ddd       | j                  dt        dg dd       | j                  dt
        dd       | j                  dt        dddgd       | j                  d t        d d!       | j                  d"t        d d#       | j                  d$t        d%g d&d'       | j                  d(t
        t        d)t         d*       | j                  d+t
        t        d,t         d*       | j                         }d-d.d/d0d1d2}t        j                  j                  t        j                  j                  |j                              d3   }d4|v r8|j                  d4d5      \  }}||j                  ||j!                               }}nJ|j                  d6d5      }t#        |      d7k(  r|d3   n|}t#        |      d7k(  r|d5   j!                         nd1}|j$                  s||_        |j&                  s||_        |j$                   d8|j&                   |_        t        j                  j+                  t        j                  j-                  t.                    }	t        j                  j1                  |	t        j                  j                  |j2                              }
t        j                  j5                  |
      s:|j2                  }
t        j                  j5                  |
      st7        d9|
        y t8        j:                  j=                  d:|
      }t8        j:                  j?                  |      }|j@                  jC                  |       t7        d;|j                   d<d=       tE        jF                  |j                        }|jH                  j                  jK                         j                  jM                         |_$        t        j                  j                  t        j                  j                  |j2                              d3   }|jO                  d>d?      }|jP                  xs d@| dA}tS        |dB      5 }tU        jV                  |      }d d d        g g cijjY                         D ]  \  }}ij[                  |       dC|v rjj[                  |dC          0dD|v s5t]        j^                  |dD   |dE   |dF         }jj[                  |D cg c]  }ta        |dG       c}xs |dD   g        dHiv r5dIiv r1ijc                  dH      }j|   d3gk(  rijc                  dI      }dJgj|<   t        jd                  tf        dK       t        jd                  th        dK       t        jd                  tj        dK       t        j                  j1                  th        dL| d8|j(                   dM      }|jl                  }|}t7        dN|dOdP|jn                   dQ       d5}jD ]  }|t#        |      z  } |jp                  d3kD  xr ||jp                  kD  }|r|jp                  n|}|jr                  dk(  } | rdRn|rdSndT}!t7        dU|! dV|dWdX|jn                   dYd=       t        j                  j1                  tj        dZ| d8|j(                   dM      }"t        j                  j5                  |"      rt        jt                  |"       d }#d }$t        d[       }%tw        jv                         }&g }'d\}(|jx                  r]t{        |d]      rPt|        })d3}*t7        d^d=       |j                         }+d_|+jH                  v rxtE        j                  |+d_   d`      j                  j                  d       |+d_<   |+d_   dak\  |+d_   t        k  z  },|+j                  |,   j                         j                  db      }+t        |+|j                  |j                  |j                        }+|j                  |+      }-t#        |+      }.iD /cg c]  }/|/j                  dc      s|/ }0}/iD /cg c]	  }/dd|/v s|/ }1}/iD /cg c]  }/|/j                  de      s|/ }2}/jD cg c]  }t]        j                  |       }3}t        ij      D 4ci c]  \  }4}t#        |      d5k(  s|4|d3    }5}4}t        j                  |jn                  df      }6i }7t        }8| rt        |j$                  |j&                  |6      }9|9j                  sbt        |9i|3      }7t        dg |7j                         D              }:t7        dht#        |9       di|: djt#        i       dkt        dlz  dmdn	d=       nt7        dod=       	 |*|k  rt        |)||*z
        };t]        j                  |;t#        |0      ft\        j                  p      }<t]        j                  |;t#        |1      ft\        j                  p      }=t]        j                  |;d7ft\        j                  p      }>g }?t        t        i|3            D ]  \  }@\  }}| r|7j                  |      nd }A|At#        A      d7k\  rt	        |;t        z        }B|;|Bz
  }CAt\        j                  j                  d3t#        |A      |Bq         }D|t\        j                  j                  d3t#        |      |Cq         }Et]        j                  |;t\        j                  p      }F|D|Fd |B |E|F|Bd  t\        j                  j                  |F       n.|t\        j                  j                  d3t#        |      |;q         }F|?j[                  F       ||0v rF|<d d |0jc                  |      f<   N||1v rF|=d d |1jc                  |      f<   l||2v srF|>d d |2jc                  |      f<    |j                  |-|<|=|>      }Gt        |;      D ]  }HG|H   \  }I}J}K}L}M|Mdrk\  r*JdskD  r%dtIduz  z   dvkD  rdtIduz  z   dw|.z  z  dtz
  duz  }N|NJz  }Ondx}O|jn                  dyv rO}Pn|jn                  dzk(  rL}PnK}Pt]        j                  P      s{P|%kD  rP}%t        t#        i            D Qci c]  }Qi|Q   |?|Q   H    }R}Qi |RIJKLOMd{}$P|kD  r^P}|$}#tE        j                  |#g      j                  t        j                  j1                  th        d|| d8|j(                   dM      d}~       t#        |'      |(k  sP|'d3   d3   kD  s8t        t#        i            D Qci c]  }Qi|Q   |?|Q   H    }S}Q|Sj                  KLOMd       t#        |'      |(k  rt        j                  |'P|*Hz   Sf       t        j                  |'P|*Hz   Sf        |*|;z  }*| r|*|8k\  r|'r|8t        z  }8|'D Tcg c]  }T|Td7   	 }U}TtE        j                  |U      }V|Vj                  |jn                  |Vj                  |6            |V|6<   t        |Vi|3      }W|Wr7W}7t        d |7j                         D              }Xt7        d|*dWd|X dd=       t        |*||&||       |*|k  rny|j                         }Zd_|ZjH                  v rhtE        j                  Zd_   d`      j                  j                  d       |Zd_<   |Zd_   dak\  |Zd_   t        k  z  },|Zj                  |,   j                         }Zt        Z|j                  |j                  |j                        }Z|rijfdt        |      D        nifdt        j                  j D        }[t        |[      D ]  \  }H}\Zj                         }] |j                  |]fi |\}^|j                  |^      }_|_j                  |jn                  d      }P|P|%kD  rP}%i \_}$|P|kD  rP}|$}#t        Hd5z   ||&||       |Hd5z   |k\  s n t7        d       |'r|jn                  dk(  rdn|jn                  ht        |'D Tcg c]  }T|Td7   	 c}Thfdd      }`tE        j                  |`      j                  |"d}~       t7        dt#        |`       d|"        |$retE        j                  |$g      j                  t        j                  j1                  th        d|| d8|j(                   dM      d}~       t7        d       |#r||kD  rt7        d|jn                   d       nt7        d|jn                   d       | rX|'rUt7        dd=       |'D Tcg c]  }T|Td7   	 }a}TtE        j                  |a      }bt        j                  |jn                  df      }c|bj                  |jn                  |bj                  |c            |b|c<   t        |j$                  |j&                  |cd      }dtE        j                  |bj                  d      |dgd      j                         }et        ij      D 4ci c]  \  }4}t#        |      d5k(  s|4|d3    }f}4}t        ei|c|f      }g|g-t        g|j$                  |j&                  |jn                         nt7        d       t        j                  j                          t        j                  j                          t        rt        j                          t        j                  d3       y # 1 sw Y   {xY wc c}w c c}/w c c}/w c c}/w c c}w c c}}4w c c}Qw c c}Qw c c}Tw # t        t        f$ r}Yt7        dY        Y d }Y~YRd }Y~Yww xY wc c}Tw c c}Tw c c}}4w )NzOptimize Strategy Parameters)descriptionz--dataTzPath to data CSV)typerequiredhelpz--strategy_filez Name of the strategy Python filez--params_filez+Path to JSON file defining parameter ranges)r   r   z--random_searchi'  z$Number of random combinations to try)r   defaultr   z--gpu
store_truezEnable GPU acceleration)actionr   z--metricr   )r   r   r   r   r   zThe metric to optimize for. 'Composite' = Calmar*(1+log_bonus); GPU pre-filters by raw Calmar, composite applied at CPU verification step.)r   r   choicesr   z--baseline-scorer   z1The baseline score for the chosen metric to beat.z--searchrandomr   zvSearch strategy: 'random' (pure uniform) or 'optuna' (biased sampling from DB history + post-run importance analysis).z--timeframez\Timeframe suffix for output files (e.g. '1D'). Auto-derived from --data filename if not set.z--assetzcAsset name for output files (e.g. 'COINBASE_BTCUSD'). Auto-derived from --data filename if not set.z--regimer   )r   r   r   sidewayszPre-filter IS training bars by MVRV regime. 'bull': zscore >= bull_threshold; 'bear': zscore < bear_threshold; 'sideways': bear_threshold <= zscore < bull_threshold; 'all': no filter (default).z--regime-bear-thresholdzDzscore percentile below which bars are classified as Bear (default: z).z--regime-bull-thresholdzJzscore percentile at or above which bars are classified as Bull (default: 4H6H8H12H1D)240360480720r  r   z, rl   -rL   r   z"Error: Strategy file not found at strategy_modulezLoading data from z...)r   	strategy_ zstrategies/params_z.jsonrrU   rm   rn   ro   r~   i_regime_windowi_regime_entry_min_scoreg     @r   optimization_winner_z.csvz5Attempting to beat baseline Calmar (GPU pre-filter): r   z  [CPU optimising for: ]zOptuna-BiasedRandomGridz	Starting z Search with r   z iterations (optimizing for z)...optimization_sweep_infr   execute_gpu_batchz2Pre-calculating indicators and uploading to GPU...r   )utcz
2015-01-01r   i_w_	thresholdi_use_r   c              3   &   K   | ]	  }|d  y wNrl   r   .0rx   s     r0   	<genexpr>zmain.<locals>.<genexpr>  s     R*@QAMq*@   z   [Optuna] Loaded z DB rows; biased ranges for r!   z	 params (r"   r   z% exploitation).uJ      [Optuna] No DB history yet — running as random search this iteration.)dtype)sizer{   r   g      ?g      Y@g&.>g     v@g      $)r   r   r   )zTotal P&L %zMax Drawdown %r   r   r   Total Tradesoptimization_run_best_F)index)r   r   r   r$  c              3   &   K   | ]	  }|d  y wr  r   r  s     r0   r   zmain.<locals>.<genexpr>  s     '[3IaQ]3Ir!  z(
   [Optuna] Refreshed biased ranges at z
 samples (z params directed).z
Optimization stopped: c              3      K   | ]:  }t        t        D cg c]  }t        j                  |       c}             < y c c}w wN)dictrQ   r   choice)r  r   rx   r[   param_values_lists      r0   r   zmain.<locals>.<genexpr>  s?     ygxbcSIZ.[IZAv}}Q/?IZ.[\]gx.[s   AAAc              3   H   K   | ]  }t        t        |              y wr)  )r*  rQ   )r  cr[   s     r0   r   zmain.<locals>.<genexpr>  sM       NX  rW  mn  OS  TW  Xc  ef  Tg  Oh  rWs   "z

Optimization Complete.r   c                 (    | j                  d      S )Nr   )rR   )r   gpu_sort_keys    r0   <lambda>zmain.<locals>.<lambda>/  s    TUTYTYZfhiTjr2   )keyreversezTop z results saved to zBest result of this run saved.z/
[SUCCESS] GPU found improvement over baseline z" (pending CPU verification + WFO).z+
[INFO] No improvement found over baseline .z5
   [Optuna] Running parameter importance analysis...i  )rD   i  )ignore_indexuH      [Optuna] Not enough data for importance analysis (need ≥30 trials).)zargparseArgumentParseradd_argumentr   rO   rW   r
   r   
parse_argsr5   r6   splitextbasenamedatarsplitrR   upperr%   rA   rB   asset_tfdirnameabspath__file__r   strategy_filer7   r$   	importlibr   spec_from_file_locationmodule_from_specloaderexec_moduler9   read_csvr#   lowerr   replaceparams_filer   jsonloadrs   r   rX   rt   r   r&  r   r   r   r   r   metricrandom_searchsearchremover   gpuhasattrGPU_BATCH_SIZEr'   to_datetimedttz_localizer	   r&   r(   r1   r*   regime_bear_thresholdregime_bull_thresholdprepare_gpu_data
startswitharrayrQ   METRIC_TO_DB_COLOPTUNA_REFRESHrF   rM   rh   sumrU   EXPLOIT_FRACTIONr   zerosfloat64r   r   randintshuffler  rangeisfiniter:   to_csvupdateheapqheappushheappushpopr   KeyboardInterruptr@   	itertoolsproductgenerate_signalscalculate_metricssortedconcatrP   drop_duplicatesr   r   r   r   r   stderrr   r?   exit)kparserargs
_MIN_TO_TFstem
asset_partperiodderived_asset
derived_tfparts
script_dirstrategy_pathspecstrategy_signalsr)   strategy_basenamestrategy_namerL  r   ru   ra   rw   rb   r   rw_idxrs_idxwinner_filenameinitial_best_scorer   total_combosrx   
use_random
iterations
use_optunasearch_labelsweep_filenamebest_resultrun_best_resultrun_best_scorer   top_results_heapMAX_SWEEP_RESULTS
BATCH_SIZEtotal_processeddf_gpur.   gpu_static_dataTpweight_namesthreshold_namesconfig_namesr\   r   r   rC   biased_rangesnext_refresh_at	df_db_topn_biasedcurrent_batch_sizeweights
thresholdsconfigsbatch_values_colsidxbiased_v	n_exploit	n_exploreexploit_colexplore_col
col_valuesgpu_resultsipnlddsharpesortinotradesannualised_pctcalmarcurrent_scorejcurrent_paramsres_dictitemheap_recordsdf_heap
new_biased	n_updatedr   df_cpu_basecombinationskwargsdf_cpusignalsmetricssorted_sweeprun_recordsdf_rundb_col_local
df_db_histdf_combinedlocked_params_localr   r0  r[   r,  sk                                                                                                           @@@r0   mainr    s8   $$1OPF
sT@RS
)dIkl
c8ef
)UIop
;TU

n  O]  dp  q
*J}~

hS[H\P  Q C  Ec  d
	T  Af  g

eEhr  s 1GZcdwcxxz{  }
1GZij}i~  A  B  CD d4TRJ77BGG,,TYY78;Dt|![[q1
F$.
vv||~0VzC#$'J!Oa),UqU1X^^%d
::"
>>#zzl!DNN#34DM !:;JGGLLRWW-=-=d>P>P-QRM77>>-(**ww~~m,7GH>>112C]SD ~~66t<KK,-	tyyk
-T:	TYY	B%%'++113BJ (()9)9$:L:L)MNqQ%--k2>M""S(:;L:MU&SK	k3	1		! 
  &("K"%++-f4 v$$VH%5699VG_fVnfVnMD$$4%@4aeAqk4%@%UVG_DUV . K',F+,U""#45V$+ &&'ABF)0	f% KKd+KKd+KK
T*ggll;2F}oUVW[WdWdVeei0jkO,,#J	ABTUXAYYpquq|q|p}}~
  A LA ##a'ML4;M;M,MJ'1##|J(J'1OJTZL	Il^=A>Z[_[f[fZggk
ltxyWW\\*0CM?RSTXTaTaSbbf.ghN	ww~~n%ryy'@KOEl]NJ xxG,.AB#
B$OV^^#^^F6NEHHTTUYZF6N6Nl2vf~7RSDZZ%**,88d8CF#FDKK9S9SUYUoUop*;;FCK#.G;a!,,v2F;G&1Fk[A5E1kF#.I;a!,,x2H;I8IJ8IRXXd^8IJ-0>O-P`-PTQTWXYTZ^_T_AaD-P` "%%dkk>B(,TZZPI?? 6y+O` aR-*>*>*@RR+C	N+;;WX`Waabcfgrcsbt u*3.s33CELPR bjno^	2!J.%(Z/5Q%R"(($6L8I#JRTR\R\]XX'93;O&PXZXbXbc
(($6#:"**M$&!)23{DU3V)W%C$:D}006$H+H0B$'(:=M(M$N	$6$B	&.ryy/@/@CMXa/@/b&c&*299+<+<QD	PY+<+Z&[%'XX.@

%S
1<
:I.1<
9:.		))*5%)"))*;*;As4yOa*;*b%c
%,,Z8|+XbL<N<Nt<T9T1U0_i*Q@U@UVZ@[=[2\-Yc'!\=O=OPT=U:U2V) *X, /@@RY[egno12A7B1~4CVWf |ScC%K6G45O+.u+<%!)*Ls*RV[)[!/"!4!&{{&CC )/7(/(.;;}5x$~5)6[`adepaq[r)s[rVW+a.:KA:Nq:Q*Q[r)s+[^ +[Cce;AT[;ASY+[ ):5)6J*9KLL+7>>rww||K[qr  rA  AB  CG  CP  CP  BQ  QU  ZV  @W  _d>  e+,/@@MTdefTghiTjDjUZ[^_j[kUl#mUlPQKN4Ea4H4K$KUl#m RY9?QW)Y Z/03DD!NN+;m__`M`bj=kl!--.>P_bcPcem@noS 3V  #55 /_"DIY#~5O8H#I8HDG8HL#I ll<8G&-kk$++w{{6?R&SGFO!7N_!`J!(2$''[=3G3G3I'[$[	 I/Z[I\ ]""+,>@GKM 
J
Tfgw "J.D ggi[((("$..V1D$"O"R"R"^"^_c"dK'<7K<OS\<\]D%//$/446K(dkk4C]C]_c_y_yz ~Hyglmwgxy  NX  r{  rC  rC  EV  rW  NX"<0IAv %%'F7&77I&IG&88AG#KKS9M~-!."7V"7w"7 :-!.J"1K1q5*j*FXY1u
"E 1$ 

&')-)C~3CD3C4tAw3CDJjtxy
\")).)FS&''9.9IJK
o&'..rww||KKaboappqrvrr  rA  AE  JF  0G  OT.  	U.0z$66
 	@Mopq<T[[MKL &FdS+;<+;4tAw+;<k*'++DKKH%zz$++vzz,7OP|)$**dnnlZ^_
iiS!1: >TRbbd36{DU3Vf3V41aZ]^_Z`deZeq!A$w3Vf0m\CV
 $UDJJT\]JJJJ

HHQK} 
 	 &Al HFIJ`R *t $n $J "9- 	2,QC011	2H E* = gs   AM&.AM3
 AM87AM8	AM=AM=AN,AN6AN#AN:ANH#AN! 1CAN! ANBAN! #AN! 9ANA>AN! 
ANBAN! B%AOF6AOJAOJ&AOM&AM0NAN! N!AO	N0AOOAO	__main__)Bpandasr9   numpyrX   rn  r5   r   rer   importlib.utilrD  r6  rM  r   r   r   rj  r;   r6   r   rA  r   r@  rB  
strategiesr   librw   r   r   r   r   r   r	   r
   r   r   _composite_scorer   _get_min_tradesr8   OPTUNA_STUDIES_DIRr>   ra  OPTUNA_TOP_KOPTUNA_TOP_FRACr_  rU  r^  r1   rF   rh   ry   r   r   r   numbar   rr   r   r   r   r   r   r  __name__r   r2   r0   <module>r     sR      	 
 	          RWW__X-F MN O 7 O  O  O 1-   %%$$' , :F $ M\ :07t;:
   $B
 zF a  FDs   1
D 	D%$D%