
    #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JrJ	r	  SSK
JrJrJrJrJr  SSKr " S S5      rS r\S:X  a  \" 5         gg)	zg
Universal Backtesting Engine for Multiple Markets
Supports NBA, Forex, Crypto, and Stock data sources
    N)datetime	timedelta)DictListAnyOptionalCallablec                      \ rS rSrSrS r     SKS\S\S\\\4   S\S	\	S
\S\\\4   S\\\4   S\
S\S\\\4   4S jjrS rS rS\\   S\S\\\4   4S jrS\S\S\S\4S jrS\\   S\4S jrS\\   S\S\\   4S jrS rS rS \\   S\S\\   4S! jrS \\   S\S\\   4S" jrS \\   S\S\\   4S# jrS$ rS \\   S\S\\   4S% jrS \\   S\S\\   4S& jrS \\   S\S\\   4S' jrS \\   S\S\\   4S( jrS \\   S\S\\   4S) jrS* rS \\   S\S\\   4S+ jr S \\   S\S\\   4S, jr!S \\   S\S\\   4S- jr"S \\   S\S\\   4S. jr#S \\   S\S\\   4S/ jr$S \\   S\S\\   4S0 jr%S \\   S\S\\   4S1 jr&S \\   S\S\\   4S2 jr'S3\\   S\S\\\4   4S4 jr(S3\\   S\)RT                  S\S\\\4   4S5 jr+S3\\   S\\\4   4S6 jr,S7\\\4   S\S\4S8 jr-S3\\   S9\S\\\4   4S: jr.S3\\   S\4S; jr/S \\   S\S\S\\\4   S<\\\4   S
\S\\\4   4S= jr0S \\   S\S\S\\\4   S\\   4
S> jr1S3\\   S\\\4   4S? jr2S@\SA\S\\\4   4SB jr3SC\\   S\\\4   4SD jr4SC\\   S\4SE jr5SF\S\\   4SG jr6S\S\S\\\4   4SH jr7S\S\\\4   S\S\4SI jr8SJr9g)LUniversalBacktestingEngine   z1Universal backtesting engine for multiple marketsc                    SS K nUR                  S5      U l        U R                  R                  UR                  5        U R                  R
                  (       dM  UR                  5       nUR                  S5      nUR                  U5        U R                  R                  U5        U R                  5       U R                  5       U R                  5       U R                  5       S.U l        g )Nr   r   z4%(asctime)s - %(name)s - %(levelname)s - %(message)snbaforexcryptostocks)logging	getLoggerloggersetLevelINFOhandlersStreamHandler	FormattersetFormatter
addHandler_get_nba_engine_get_forex_engine_get_crypto_engine_get_stocks_enginemarket_engines)selfr   console_handler	formatters       7/var/www/html/leadgen/backtest/universal_backtesting.py__init__#UniversalBacktestingEngine.__init__   s    ''(DEW\\* {{##%335O))*`aI((3KK""?3 '')++---/--/	
    Nmarketstrategy_name
parametersdata_source
min_trades	timeframewalk_forward_periodsoptimization_configuse_intrabar_ticksstrategy_codereturnc                    [        SU SU SUR                  SS5       35        XR                  ;  a)  SU 3[        U R                  R	                  5       5      S.$ U R                  U   nUS:X  Ga(  [        S	5        U
(       d  S
S0$ US:X  a-   U R                  5       nUS   " X5      nU R                  X5      $ SU R                  ;  a  U R                  5       U R                  S'   US   nUR                  SS5      n[        SU SU 35        U" UU5      n[        SU(       a  [        U5      OS S35        U(       d  S
SU S30$ [        U[        5      (       a&  [        U5      S:  a  [        R                  " U5      nO7[        U[        R                  5      (       a  UnO[        R                  " 5       n U R                  S   nUS   " UX5      nU R                  UU5      nS
U;   a  U$ U R                  UUU5      nSUUU[        U5      UUSS UU R!                  UU5      U R#                  U5      SU 3UU R%                  U5      UUR'                  5        S[        U5       S3S S![        [        R(                  R+                  5       5      S".S#.$ X+S$   ;  a%  S%U S&U 3[        US$   R	                  5       5      S'.$  US   nU" UR                  SS5      U5      nU(       d  S
SU S30$ [        U[        5      (       a&  [        U5      S:  a  [        R                  " U5      nO7[        U[        R                  5      (       a  UnO[        R                  " 5       nUS$   U   nU" UU5      n[        U5      U:  a  S)[        U5       S*U S+3[        U5      S,.$ U R                  UU5      nU R-                  UU5      nU R%                  U5      nSnU(       a9  US:w  a3  SS-KJn  U" 5       nU R3                  X!5      nUR5                  UUUUUUUS.9nSnU(       a,  [        U5      S:  a  UnUS:X  a  OU R7                  UXUXv5      nU R                  UUU5      nS
U;   a-  US
   R9                  S/5      (       a  / / 0 S0U[        U5      S1.S2.nSUUU[        U5      UUSS UU R!                  UU5      U R#                  U5      U R;                  X#U5      UUUUR'                  5        S[        U5       S3U	(       a  S3OS4-   S5S![        [        R(                  R+                  5       5      S".S#.n U(       a  S
U;  a  UU S6'   U(       a  UU S7'   U $ ! [         a$  nS[        U5       3[        U5      S.s SnA$ SnAff = f! [         a$  nS[        U5       3[        U5      S.s SnA$ SnAff = f! [         a  nS
S([        U5       30s SnA$ SnAff = f)8z@Run a backtest for any market with given strategy and parametersz'DEBUG: run_backtest called with market=z, strategy_name=z, data_file=	data_fileNonezUnknown market: )erroravailable_marketsdynamic_customz#DEBUG: Taking dynamic strategy pathr7   z.Dynamic strategy selected but no code providedr   executez'NBA dynamic strategy execution failed: )r7   detailsNdynamicdata_loaderz*DEBUG: Calling data_loader with data_file=, timeframe=zDEBUG: Data loader returned r   z recordszNo data available for z backtestingz#Dynamic strategy execution failed: TizDynamic strategy on z OHLC data (z trades)zDynamic strategy executionz4Verified - All results calculated from actual trades)r,   calculation_methodverification_status	timestamp)successr)   r*   r+   total_tradesresultstrades
all_tradesperformance_summaryrisk_metricsequation_summarydetailed_statistics	trade_logchart_visualizationverification_data
strategieszUnknown strategy for : )r7   available_strategieszStrategy execution failed: zInsufficient data: Only z trades generated, minimum z	 required)r7   trades_generated)ParameterOptimizer)r)   r*   base_parametersparameter_rangesr0   r5   r.   zVisualization errorzChart visualization unavailable)noter)   trades_count
price_datarE   
indicatorssummaryz with intrabar ticks zReal trade-by-trade analysisoptimization_resultswalk_forward_analysis)printgetr!   listkeys_get_nba_dynamic_engine_calculate_nba_backtest_results	Exceptionstr_get_dynamic_enginelen
isinstancepd	DataFrame_calculate_backtest_results"_generate_trade_visualization_data_generate_performance_summary_calculate_risk_metrics_generate_detailed_trade_logupper	Timestampnow_calculate_detailed_statisticsparameter_optimizerrR   _get_default_parameter_rangesoptimize_strategy_run_walk_forward_analysis
startswith_generate_equation_summary)!r"   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   market_enginenba_dynamic_enginebetser=   data_file_paramdatadata_dfdynamic_enginerE   rD   
chart_datastrategy_funcdetailed_statsrK   r\   rR   	optimizerrT   walk_forward_resultswf_strategy_nameresponses!                                    r%   run_backtest'UniversalBacktestingEngine.run_backtest'   s    	7x?OP]^jkukyky  {F  HN  lO  kP  Q  	R,,,+F84%)$*=*=*B*B*D%E 
 ++F3 ,,79 !QRR )-)E)E)G&-i8SD??QQ D$7$77595M5M5OD''	2 ,M:",..d"CB?BSS_`i_jkl"?I>4$SYA4NhWX#'=fX\%RSS dD))c$i!m ll40Gbll33"G llnG%)%8%8%CN+I6t]WF ::6:Ng%"N "DDVWV\]
  $$%2",$'K&$STl"(+/+M+MgW]+^$($@$@$H*>vh(G+2!%!B!B6!J+5*0,,.)9c&k]RZ'[.J/e%()9)9);%<	* . "==0=/J(,]<-H-M-M-O(P I+M:":>>+t#DiP#'=fX\%RSS dD))c$i!m ll40Gbll33"G llnG !.l ;M J&tZ8 v;#3CK=@[\f[ggpq$'K  226:F <<VWM55f=	  $=4D#D>*,I  $AA-X#,#>#>+ *!1$7%# $? $   $CIM, 00 '+'F'F&(($ <<VWfU
j Z%8%C%CDY%Z%Z ! =$$'K		J *$KSTl #'#E#Egv#V 88@ $ ? ?[a b#1"#-"(,,.!1c&k](S  rDWm  JL   M&D'] !1!1!34	"
0  G3G$G/CH+,  0DH,- ! #J3q6(!S#&q6 @ ! #Fs1vh!O#&q6 ~  I#>s1vh!GHHIsa   +U =V	 	,V: 6BV: 
V"V;VV	
V7V2,V72V7:
WWWWc           	      `    S[         [           S[        S[        S[         [           4S jnSU0$ )z1Dynamic strategy engine for custom code executionr   codeparamsr3   c                 	   SSK nSSKnUR                  " U 5      n[        S[	        UR
                  5       35        [        SUR                   35        SUR
                  ;   aF  UR                  " US   5      US'   [        SUS   R                  S5      R                  5        35        0 nUUUUS.n [        XU5        S
U;  a  [        S5      eUS
   n	 U	" UR                  5       U5      n
SU
R
                  ;  a  [        S5      e UR                  SS5      nSU
R
                  ;  d  SU
R
                  ;  a  [        S5      eU
R                  5       n[        [        U5      5      US'   SnS H  nXR
                  ;   d  M  Un  O   UcE  UR                   R"                  =(       d    SnUS:X  a   UR$                  " S[        U5      SS9US'   SnUS   R&                  nUS   R&                  nXR
                  ;   a  X\   R&                  OUR                   R&                  n/ nSnSnSn[        [        U5      5       GH  nUU   nUU   nUU   nSnUS:w  a&  US:X  a  SnOUS:X  a	  US:X  a  SnOUS:X  a  US:X  a  SnU(       a  US:X  a  UU-
  U-  U-  nSnUS:  a  SOSnOUU-
  U-  U-  nS nUS:  a  SOSnUR)                  S![        U5       3[+        U5      S"UU[-        U5      [-        U5      [-        U5      S#US:X  a  S$OS% S&U 3[-        U5      US:  a  [+        UU   5      OSS'.5        SnUS:X  d  GM   US:w  d  GM	  US:X  a  SOSnUnUnGM     U$ ! [         a  n[        S	U 35      eSnAff = f! [         a  n[        SU 35      eSnAff = f! [         Ga;  n[        S(U 35        / nUR                  SS5      nSnSnSnU
R/                  5        H  u  nnUS   nUS   n SU;   a  US   OUR"                  n!US:w  a  US:X  d  US:X  a  US:X  d  US:X  a  US:X  a  SnUS:X  a  U U-
  U-  U-  nOUU -
  U-  U-  nUR)                  S![        U5       3[+        U!5      S"US:X  a  SOS US:  a  SOS[-        U5      [-        U5      [-        U 5      S#US:X  a  S$OS% S&U  3S).	5        SnUS:X  d  M  US:w  d  M  US:X  a  SOSnU nU!nM     Us SnA$ SnAff = f)*z
Execute dynamically generated Python code on the data.
The code is expected to define a function `generate_signals(df, params)`
that returns a DataFrame with a 'signal' column (1, -1, 0).
r   Nz+DEBUG: Dynamic strategy DataFrame columns: z)DEBUG: Dynamic strategy DataFrame shape: datezDEBUG: First few dates:    )ri   nppandasnumpyz$Syntax error in generated strategy: generate_signalszDGenerated code must define a 'generate_signals(df, params)' functionz%Runtime error in strategy execution: signalz.Strategy output must contain a 'signal' columnstake  closez3DataFrame must contain 'signal' and 'close' columnsidx)r   rA   Daterq   timez
2025-01-011H)startperiodsfreqsynthetic_dateFT   SELLwinlossBUY_TO_COVERdynamic_r9   zClose LongShortz at )idr   strategyactionoutcomeprofitr   pricer   entry_price
entry_dateuE   ⚠️ Vectorized trade generation failed, falling back to iterrows: )	r   r   r   r   r   r   r   r   r   )r   r   rj   r^   r`   columnsshapeto_datetimeheadtolistexecrd   copyr_   rangerg   indexname
date_rangevaluesappendre   floatiterrows)"r   r   r   ri   r   dflocal_scopeglobal_scoper}   r   	result_dfr   date_colcolsignalspricesdatesrE   positionr   	entry_idxicurrent_signalcurrent_pricecurrent_dateshould_closer   r   r   r   rowr   r   r   s"                                     r%   execute_dynamic_strategyPUniversalBacktestingEngine._get_dynamic_engine.<locals>.execute_dynamic_strategy  s      d#B?RZZ@P?QRS=bhhZHI#^^BvJ76
0F1C1J1J1L0MNO K	LLT5
 "4 fgg'(:;MM)"'')V<	
 y000 PQQ

7D1 9#4#44yGXGX8X#$YZZ ^^% "#b'N5	  MCjj(#& N #!xx}}5H5(/1}}<Y\]_Y`gk/l+,#3 X,--G++/7::/E++288??	 s7|,A%,QZN$*1IM#(8L $)L1})Q.+/L%]~/C+/L%^!0C+/L##q=&3k&A[%PSX%XF%+F/5zevG&1M&A[%PSX%XF%3F/5zevG$,S[M":$'$5(8&,'.&+Fm%*5\%*=%9(.QvG.TTXYfXg&h+0+=CLPQ>#eI.>*?W['  $%  1}1)<(6!(;1&3$%	[ -^ U  L"Fqc JKKL  M"Gs KLLM@  ']^_]`ab

7D1!
'002FAs ]FLE*0C-3v;SXXD1}&A+(a-FVXL^fjl^lqw{|q|!"#q=&+k&9[%H5%PF&1E&9[%H5%PF$,S[M":$'I(808Af>06
u&+Fm%*5\%*5\(.QvG.TTXY^X_&`
' 
 $%1}1(.!1&+%)
9 3< O'so   4M M? 
A8N F6N N 
N 
M<)M77M<?
N	NNS%*DS ?S S S% S%r:   )r   r   re   )r"   r   s     r%   rf   .UniversalBacktestingEngine._get_dynamic_engine  sF    p	4: p	S p	$ p	SWX\S] p	f /
 	
r(   c                 N   ^  S[         S[        S[        [           4U 4S jjnSU0$ )z9NBA dynamic strategy engine for custom betting strategiesr   r   r3   c                   >^ SSK nSSKnSSKJn  SSKJn  U" 5       nUR                  S5      nUR                  5       nUR                  5       n	UR                  S5      n
U
(       aF  TR                  Xz5      n[        SU
R                  SS	5       35        [        S
[        U5       35        0 nUUUUUUU	S.n [        XU5        SU;  a  [        S5      eUS   n U" XxX5      n[        U[        5      (       d  [        S5      e/ SQnU H+  m[!        U4S jU 5       5      (       a  M  [        SU 35      e   U$ ! [         a  n[        SU 35      eSnAff = f! [         a  n[        SU 35      eSnAff = f)z
Execute dynamically generated Python code on NBA data.
The code is expected to define a function `generate_bets(games, players, teams, params)`
that returns a list of betting recommendations.
r   Nr   NBABacktestingEngine2023-24time_periodu$   📅 Filtered games to time period: descriptionUnknownz   Games in period: )ri   r   r   r   gamesplayersteamsz(Syntax error in generated NBA strategy: generate_betszTGenerated code must define a 'generate_bets(games, players, teams, params)' functionz)Runtime error in NBA strategy execution: z&Strategy output must be a list of bets)game_idbet_type
prediction
confidencer   c              3   ,   >#    U  H	  oT;   v   M     g 7fN ).0fieldbets     r%   	<genexpr>kUniversalBacktestingEngine._get_nba_dynamic_engine.<locals>.execute_nba_dynamic_strategy.<locals>.<genexpr>  s     E_EC<_s   zEach bet must contain: )r   r   r   nba_backtestingr   _get_games_data_get_players_data_get_teams_datar_   _filter_games_by_time_periodr^   rg   r   rd   rh   r`   all)r   r   ri   r   r   r   
nba_engine
games_dataplayers_data
teams_datar   r   r   r}   r   r|   required_fieldsr   r"   s                    @r%   execute_nba_dynamic_strategyXUniversalBacktestingEngine._get_nba_dynamic_engine.<locals>.execute_nba_dynamic_strategy  s     ) =-/J#33I>J%779L#335J !**]3K!>>zW
<[__]\e=f<ghi,S_,=>? K#'#LPT5
 k1 vww'8MQ$ZzR
 dD)) HII [OE_EEE#&=o=N$OPP  K3  P"J1# NOOP  Q"KA3 OPPQs0   :D= 	E =
EEE
E:'E55E:r:   )re   r   r   )r"   r   s   ` r%   rb   2UniversalBacktestingEngine._get_nba_dynamic_engine  s8    @	s @	D @	T$Z @	F 3
 	
r(   r|   r   c                 f   U(       d  SSSSSS.$ SSK Jn  U" 5       nUR                  S5      nU Vs0 s H%  ofR                  SUR                  SS5      5      U_M'     nnSnSn	Sn
UR                  S	S
5      n/ nU Hs  nUS   nUR                  U5      nU(       d  M"  U R	                  XU5      nUR                  U5        US   S:X  a  U	S-  n	XS   -  nM\  US   S:X  d  Mg  U
S-  n
XS   -  nMu     [        U5      nUS:  a  U	U-  OSn[        S U 5       5      n[        [        S U 5       5      5      nUS:  a  UU-  OSnU	S:  a  UU	-  OSnU
S:  a  UU
-  OSnU R                  U5      nSUU	U
UUUUUUUSS
 SSS[        U5      [        U5      S:  a  U[        U5      -  OSS.S.$ s  snf )z3Calculate backtest results for NBA betting strategyzNo bets generated by strategyr   )r7   
total_betstotal_profitwin_rateprofit_factorr   r   r   r   r[   r   d   r   r   r   r   r   c              3   @   #    U  H  oS    S:  d  M  US    v   M     g7fr   r   Nr   r   bs     r%   r   MUniversalBacktestingEngine._calculate_nba_backtest_results.<locals>.<genexpr>7  s     Pn(a8n   c              3   @   #    U  H  oS    S:  d  M  US    v   M     g7fr  r   r  s     r%   r   r  8  s     VNqkTUo{q{Nr  R?@TNzNBA Dynamic BettingNBA)strategy_typer)   seasontotal_games_analyzedbets_per_game)rB   r   winning_betslosing_betsr   r   r   avg_winavg_lossmax_drawdownr|   rZ   )
r   r   r   r_   _evaluate_nba_betr   rg   sumabs_calculate_max_drawdown)r"   r|   r   r   r   r   gamegames_lookupr   r  r  r   processed_betsr   r   
bet_resultr   r   
total_winstotal_lossesr   r  r  r  s                           r%   rc   :UniversalBacktestingEngine._calculate_nba_backtest_results  s    8 !!"  	9)+
//	:
 S]]R\$DHHT2,>?ER\]

7C(C)nG##G,D//5AJ!!*-)$-!8 44I&&0q 8 44 " (
0:Q<*,A PnPP
3VNVVW5AA5E
\16 0<a/?*|+Q1<q<+-a33NC $(& (* ("4C(!6#(+JADZSTATc*o!=Z[
 	
O ^s   ,F.r   r  r   c                    US   R                  5       nUS   nUR                  SS5      nUR                  SS5      nUR                  SS5      nSn	S	n
US
:X  a9  UR                  5       S:X  a	  Xx:  a  Sn	GOUR                  5       S:X  a  X:  a  Sn	OUS:X  aJ  UR                  SS5      nUR                  5       S:X  a  Xx-
  U:  n	OUR                  5       S:X  a  X-
  U:  n	OUS:X  d  US:X  aH  Xx-   nUR                  SS5      nUR                  5       S:X  a  X:  n	OjUR                  5       S:X  a  X:  n	OQUS:X  a&  [        R                  R	                  SS/USU-
  /S9n	O%[        R                  R	                  SS/USU-
  /S9n	U	(       a
  X:S-
  -  nSnOU* nSnS[        / 5       3US   UR                  SS5      UUUR                  SS5       SU S U SUR                  S!S"5       3UUUUUUS#.$ )$z"Evaluate the outcome of an NBA betr   r   r         ?
home_scorer   
away_scoreF      ?	moneylinehomeTawayspread
over_undertotallineoverunderplayer_pointsr   )pr   r   nba_bet_r   	game_datez
2024-01-01home_team_nameHome -away_team_nameAway)r   r   r   r   r   game_resultr   r   r   r   r!  r"  )lowerr_   r   randomchoicerg   )r"   r   r  r   r   r   r   r!  r"  wonpayout_multiplierr'  total_pointsr*  r   r   s                   r%   r  ,UniversalBacktestingEngine._evaluate_nba_betU  sL    z?((*&
WW\3/
 XXlA.
XXlA.
{"!V+
0G!!#v-*2I!WWXq)F!V+!.&8!!#v-!.&8%W)<%2L7761%D!V+")!!#w.")())""D%=Z:4N"OC ))""D%=Z:4N"OC !34FGVFG SWI&9~HH[,7 $"hh'7@A:,aPZ|[\]a]e]efvx~]  ]A  B$$$
 	
r(   c                 j    U(       d  gSnSnSnU H  nX%S   -  nX#:  a  UnX2-
  nXd:  d  M  UnM      U$ )z/Calculate maximum drawdown from betting resultsr   r   r   )r"   r|   cumulative_profitpeakr  r   drawdowns          r%   r  2UniversalBacktestingEngine._calculate_max_drawdown  sU    CX. '(/H&'  r(   r   r   c                    SSK J n  U(       d  U$ / nU GH!  nUR                  SS5      nU(       d  M   UR                  " UR                  SS5      5      nUR                  S5      nUS:X  am  UR                  S	5      n	UR                  S
5      n
U	(       aB  U
(       a9  U" U	SS5      nU" U
SS5      nXs=::  a  U::  a  O  M  UR	                  U5        M  M  M  M  US:X  ah  UR                  S	5      n	UR                  S
5      n
U	(       a<  U
(       a2  XR
                  s=::  a  U
::  a  O  GM  UR	                  U5        GM+  GM.  GM1  GM4  US:X  aB  UR                  S5      nU(       a'  UR
                  U:X  a  UR	                  U5        GMv  GMy  GM|  US:X  a  UR                  SS5      R                  5       nUR                  S5      nSSSSSSSSSSSSS.nUR                  U5      nU(       aD  U(       a:  UR
                  U:X  a'  UR                  U:X  a  UR	                  U5        GM  GM  GM  GM  GM!  GM$     U$ ! [         a  n SnAGM9  SnAff = f)z)Filter NBA games by specified time periodr   r   r0  r[   Zz+00:00typer  
start_yearend_year
   r         
year_rangeyear
month_yearmonth   r               	         )januaryfebruarymarchaprilmayjunejulyaugust	septemberoctobernovemberdecemberN)	r   r_   fromisoformatreplacer   rM  r8  rO  rd   )r"   r   r   r   filtered_gamesr  game_date_strr0  period_typerG  rH  season_start
season_endrM  
month_name	month_maptarget_monthr}   s                     r%   r   7UniversalBacktestingEngine._filter_games_by_time_period  s"   %LD HH["5M /$22=3H3Hh3WX	)oof5(*!,!>J*z:H!h'/
B'B%-h2%>
'B
B*11$7 C '/z !L0!,!>J*z:H!h%C8CC*11$7 D '/z !F*&??62D	$ 6&--d3 !7t !L0!,"!=!C!C!EJ&??62D $%!a! !Q!%&22SU!I $-==#<L#41GIOO_kLk&--d3 Ml1G| 1G l 	  s2   BH<H<AH<+H<?H<BH<<
IIc                 L   ^ SSK Jn  U" 5       mSU4S jjnUTR                  S.$ )zNBA market enginer   r   c                 &   > TR                  S5      $ )Nr   )r   )r5   r.   r   s     r%   nba_data_loaderCUniversalBacktestingEngine._get_nba_engine.<locals>.nba_data_loader  s    --i88r(   r=   rN   N1hour)r   r   rP   )r"   r   rq  r   s      @r%   r   *UniversalBacktestingEngine._get_nba_engine  s+    8)+
	9
 +$99
 	
r(   c                     SS jnS nUU R                   U R                  U R                  U R                  U R                  S.S.$ )zForex market enginec                 	  ^ [        SU  SU 35        [        S[        R                  " 5        35        U (       GaF  [        R                  R	                  U 5      (       Gd!  U R                  5       nSU SU S3n[        SU S[        R                  R	                  U5       35        [        R                  R	                  U5      (       aF   [        R                  " U5      n[        S	U S
U S[        U5       S35        UR                  S5      $ SU S3n[        R                  R	                  U5      (       aF   [        R                  " U5      n[        SU S
U S[        U5       S35        UR                  S5      $ U (       a  [        R                  R	                  U 5      (       a  U R                  SSU S35      n[        R                  R	                  U5      (       aC   [        R                  " U5      n[        SU S[        U5       S35        UR                  S5      $  [        R                  " U 5      n[        SU  S[        U5       S35        UR                  S5      $ SSKnSU S3n	UR                  U	5      n
U
 V^s/ s H!  m[        U4S jS 5       5      (       d  M  TPM#     n
nU
(       aI   [        R                  " U
S   5      n[        SU
S    S[        U5       S35        UR                  S5      $ [        SU S35        / S Qn/ n[        R                  " 5       [!        S!S"9-
  n[#        S!5       H  nU[!        US"9-   nU H  nS#S$S%S&S'S .U   n[$        R&                  R)                  SS(5      nUS)U-   -  nUS)[$        R&                  R)                  SS*5      -   -  nUR+                  UR-                  S+5      U[/        US,5      [/        US,5      [1        [&        R2                  " S-S.5      5      S/.5        M     M     U$ ! [         a  n[        SU S
U 35         SnAGN$SnAff = f! [         a  n[        SU S
U 35         SnAGNSnAff = f! [         a  n[        SU 35         SnAGN[SnAff = f! [         a  n[        SU 35         SnAGN>SnAff = fs  snf ! [         a  n[        SU 35         SnAGNSnAff = f)0z*Load forex CSV data with timeframe supportz/DEBUG: forex_data_loader called with data_file=r>   z"DEBUG: Current working directory: 	data/csv/_	_ohlc.csvzDEBUG: Looking for OHLC file: z
, exists: u    📊 Loaded forex OHLC data for rO    ( bars)recordsz"Error loading OHLC forex data for N.csvu   📊 Loaded raw forex data for  rows)z!Error loading raw forex data for u   📊 Loaded forex OHLC data: zError loading OHLC forex data: u   📊 Loaded raw forex data: zError loading forex data: r   
data/csv/*c              3   H   >#    U  H  oTR                  5       ;   v   M     g 7fr   r8  r   termfs     r%   r   ZUniversalBacktestingEngine._get_forex_engine.<locals>.forex_data_loader.<locals>.<genexpr>5  s'       9^  X]t9J  X]   ")r   xauusdeurusdgbpusdusdjpyaudusdusdcadu   📊 Auto-loaded forex data: z(Error loading auto-detected forex data: u&   📊 Generating sample forex data for 
 timeframeEURUSDGBPUSDUSDJPYAUDUSDUSDCADm  daysHzG?RQ?     b@q=
ףp?皙?{Gzt?r   Mb`?%Y-%m-%drR  '  順 )r   pairopenr   volume)r^   osgetcwdpathexistsrp   ri   read_csvrg   to_dictrd   re  globanyr   rr   r   r   r   r9  normalr   strftimeroundintrandint)r5   r.   include_intrabar_tickssymbol	ohlc_filer   r}   raw_filer  forex_patternforex_filesr  pairsr   	base_dater   r   r  
base_priceprice_change
open_priceclose_prices              `          r%   forex_data_loaderGUniversalBacktestingEngine._get_forex_engine.<locals>.forex_data_loader   s   CI;l[dZefg6ryy{mDE 	!:!:"*'xq9E	6ykBGGNN[dLeKfgh77>>),,R[[3 @9+UWX[\^X_W``fgh!zz)44
 'vhd377>>(++Q[[2 ?xr(SUVYZ\V]U^^def!zz)44
 RWW^^I66%--f)I6NO	77>>),,E[[3 =i[3r7)SYZ[!zz)44
<Y/B82c"gYfUV::i00
 (9=M))M2K&1  _kS  9^  X]  9^  6^1kK  _J[^4B9+a.9ICPRG9TZ[\::i00
 :9+ZPQFED )<<I3Z(9!+<<!D"&$%"&$" "J $&99#3#3Au#=L!+q</?!@J",BII4D4DQ4N0N"OKKK , 5 5j A4 %j! 4u[RS?T"%fnnUF&C"D!  "   KE % R B6("QCPQQR % Q A&A3OPPQ % E ?sCDDE ! <6qc:;;< _ ! JDQCHIIJs   AP =AP> (AQ' +AR R3/R3?AR8 
P;P66P;>
Q$QQ$'
R
1RR

R0R++R08
SSSc                     / SQn / n[         R                  " 5       [        SS9-
  n[        S5       GHN  nU[        US9-   nU  GH7  nSSSSSS.U   n[        R
                  R                  S	S
5      nUSU-   -  nUS[        R
                  R                  S	S5      -   -  n	UR                  UR                  S5      U[        US5      [        [        X5      S[        [        R
                  R                  S	S5      5      -   -  S5      [        [        X5      S[        [        R
                  R                  S	S5      5      -
  -  S5      [        U	S5      [        [
        R                  " SS5      5      S.5        GM:     GMQ     U$ )z&Generate sample forex data for testingr  r  r  r  r  r  r  r  r   r  r   r  r  rR  gMbP?r  r  )r   r  r  highlowr   r  r   rr   r   r   r   r9  r  r   r  r  maxr  minr  r  )
r  r   r  r   r   r  r  r  r  r  s
             r%   !_generate_sample_forex_data_localWUniversalBacktestingEngine._get_forex_engine.<locals>._generate_sample_forex_data_localU  se   FED )<<I3Z(9!+<<!D #'"&"'"&"&" "J $&99#3#3Au#=L!+q</?!@J",BII4D4DQ4N0N"OKKK , 5 5j A $ %j! 4 %c*&Ba#biiN^N^_`bgNhJiFi&jlm n$S%AQRYYM]M]^_afMgIhEh%iklm!&{A!6"%fnnUF&C"D!  "  6 Kr(   )trend_followingrange_tradingbreakout_tradingcarry_trademean_reversionrs  )Nru  F)_forex_trend_following_forex_range_trading_forex_breakout_trading_forex_carry_trade_forex_mean_reversion)r"   r  r  s      r%   r   ,UniversalBacktestingEngine._get_forex_engine  sP    S	j!	H -#'#>#>!%!:!:$($@$@#66"&"<"<	
 		
r(   r   c                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       H  nXxS-
  U n	[        S U	 5       5      n
[	        S U	 5       5      nXx   S   nXx   S	   nX:  aK  XU   S
   :  a  SOSnUR                  S[        U5       3Xx   S   SUSU
UUS:X  a  UOU* USU
S 3S.
5        M  Xx   S   U:  d  M  XU   S
   :  a  SOSnUR                  S[        U5       3Xx   S   SUSUUUS:X  a  UOU* USUS 3S.
5        M     U$ s  snf )zForex breakout trading strategyr  r  r   r      c              3   *   #    U  H	  oS    v   M     g7fr  Nr   r   ds     r%   r   EUniversalBacktestingEngine._forex_breakout_trading.<locals>.<genexpr>  s     8Ai   c              3   *   #    U  H	  oS    v   M     g7fr  Nr   r  s     r%   r   r    s     6v!uXvr  r  r   r  r   r   forex_breakout_r   r  BUYzBreakout above .5f)
r   r   r   r  r   breakout_levelr   r   r   r   r  r   zBreakout below )r_   r   rg   r  r  r   )r"   r   r   rE   r  r   r  	pair_datar   windowrecent_high
recent_lowcurrent_highcurrent_closer   s                  r%   r  2UniversalBacktestingEngine._forex_breakout_trading  s   zz&(+

7D) $>1f(=Q	>r3y>*AtA&F 888K6v66J$</L%L1M )#0Q<3G#G%V+CK=9%L0 2 #&1&'.%'7eeV" /C/@A  e$z1#0Q<3G#G%V+CK=9%L0 2 $&0&'.%'7eeV" /
3/?@ ; +T Y ?s   EEc                    / nUR                  SS5      nSS/nU Ha  nUS   U;   d  M  [        R                  " 5       S:  a  SOSnUR                  S	[        U5       3US
   SUS   SUUS:X  a  UOU* USS.	5        Mc     U$ )zForex carry trade strategyr   r   r  NZDUSDr  皙?r   r   forex_carry_r   r  r  z&Carry trade - long high yield currency)	r   r   r   r  r   r   r   r   r   )r_   r9  r   rg   )r"   r   r   rE   r   high_yield_pairsr  r   s           r%   r  -UniversalBacktestingEngine._forex_carry_trade  s    

7D) %h/I $44#)==?S#8%f(V6%f- -%f-#&'.%'7eeV"F
 
	   r(   c                 b   / nUR                  SS5      nUR                  SS5      nUR                  SS5      nU Vs/ s H  owR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GH*  n	XS-
  U	 n
U
 Vs/ s H  owS   PM	     nn[        R                  " U5      n[        R
                  " U5      nX   S   nUS	:  a  X-
  U-  OS	nX* :  a_  X:  a  S
OSnUR                  S[        U5       3X   S   SUS[        US5      [        US5      UUS
:X  a  UOU* USUS SUS S3S.5        M  X:  d  M  X:  a  S
OSnUR                  S[        U5       3X   S   SUS[        US5      [        US5      UUS
:X  a  UOU* USUS SUS S3S.5        GM-     U$ s  snf s  snf )zForex mean reversion strategyr  r  r   r   deviation_thresholdg       @r  r   r   r   r   forex_reversion_r   r  r  rP  rR  zMean reversion buy at r  z (Z: .2f))r   r   r   r  r   z_score
mean_pricer   r   r   r   r   zMean reversion sell at r_   r   rg   r   meanstdr   r  )r"   r   r   rE   r  r   r  r  r  r   r  r   r  	std_pricer   r  r   s                    r%   r  0UniversalBacktestingEngine._forex_mean_reversion  s   zz&(+

7D)$jj)>D $>1f(=Q	>r3y>*AtA&F*01&Qj&F1 JvI%L1MBKa-}1Y>UVG --#0#=%6,S[M:%L0 0 #$Wa0"'
A"6&'.%'7eeV" 6}S6IwWZm[\]  .#0#=%6,S[M:%L0 0 $$Wa0"'
A"6&'.%'7eeV" 7c7J%PWX[}\]^ ? +Z _ ? 2s   F'F'F,c                     SS jnS nUU R                   U R                  U R                  U R                  U R                  U R
                  S.S.$ )zCrypto market enginec                   ^
 U (       Ga  [         R                  R                  U 5      (       d  U R                  5       nSU SU S3n[         R                  R                  U5      (       aF   [        R
                  " U5      n[        SU SU S[        U5       S35        UR                  S5      $ SU S3n[         R                  R                  U5      (       aF   [        R
                  " U5      n[        SU SU S[        U5       S35        UR                  S5      $ U (       a  [         R                  R                  U 5      (       a  U R                  SSU S35      n[         R                  R                  U5      (       aC   [        R
                  " U5      n[        SU S[        U5       S35        UR                  S5      $  [        R
                  " U 5      n[        SU  S[        U5       S35        UR                  S5      $ SS
KnSU S3nUR                  U5      n	U	 V
^
s/ s H!  m
[        U
4S jS 5       5      (       d  M  T
PM#     n	n
U	(       aI   [        R
                  " U	S   5      n[        SU	S    S[        U5       S35        UR                  S5      $ [        SU S35        / SQn/ n[        R                  " 5       [        SS9-
  n[!        S5       H  nU[        US9-   nU H  nSSS S!S"S.U   n["        R$                  R'                  SS#5      nUS$U-   -  nUS$["        R$                  R'                  SS%5      -   -  nUR)                  UR+                  S&5      U[-        US'5      [-        US'5      [/        [$        R0                  " S(S)5      5      S*.5        M     M     U$ ! [         a  n[        S	U SU 35         S
nAGN$S
nAff = f! [         a  n[        SU SU 35         S
nAGNS
nAff = f! [         a  n[        SU 35         S
nAGN[S
nAff = f! [         a  n[        SU 35         S
nAGN>S
nAff = fs  sn
f ! [         a  n[        SU 35         S
nAGNS
nAff = f)+z+Load crypto CSV data with timeframe supportry  rz  r{  u!   📊 Loaded crypto OHLC data for rO   r|  r}  r~  z#Error loading OHLC crypto data for Nr  u    📊 Loaded raw crypto data for r  z"Error loading raw crypto data for u   📊 Loaded crypto OHLC data: z Error loading OHLC crypto data: u   📊 Loaded raw crypto data: zError loading crypto data: r   r  c              3   H   >#    U  H  oTR                  5       ;   v   M     g 7fr   r  r  s     r%   r   \UniversalBacktestingEngine._get_crypto_engine.<locals>.crypto_data_loader.<locals>.<genexpr>=  s(       ;R  ZQQU1779;L  ZQr  )r   btcusdethadasoldotbtcu   📊 Auto-loaded crypto data: z)Error loading auto-detected crypto data: u'   📊 Generating sample crypto data for r  BTCETHADASOLDOTr  r  ȯ  
  ?_   @Q?r   {Gz?r  rP  @B 逖 r   r  r  r   r  )r  r  r  rp   ri   r  r^   rg   r  rd   re  r  r  r   rr   r   r   r   r9  r  r   r  r  r  r  )r5   r.   r  r  r   r}   r  r  crypto_patterncrypto_filesr  cryptosr   r  r   r   r   r  r  r  r  s             `          r%   crypto_data_loaderIUniversalBacktestingEngine._get_crypto_engine.<locals>.crypto_data_loader  sC    	!:!:"*'xq9E	77>>),,S[[3 A&I;VXY\]_Y`Xaaghi!zz)44
 'vhd377>>(++R[[2 @8*TVWZ[]W^V__efg!zz)44
 RWW^^I66%--f)I6NO	77>>),,F[[3 >ykCPRG9TZ[\!zz)44
=Y/B9)Bs2wivVW::i00
 ))I>N99^4L'3  S|!s  ;R  ZQ  ;R  8RA|L  SK\!_5B:<?:K2cRTgYV\]^::i00
 ;I;jQR9GD )<<I3Z(9!+<<%F).tDQS\`!abh!iJ#%99#3#3At#<L!+q</?!@J",BII4D4DQ4M0M"NKKK , 5 5j AV %j! 4u[RS?T"%fnnWh&G"H!  &   K % S CF82aSQRRS % R B6("QCPQQR % F @DEEF ! =7s;<<= S ! KEaSIJJKs   ,AN4 AO AP 
AP, ,QQAQ 4
O>OO
P'O>>P
P)P$$P),
Q6Q

Q
Q:!Q55Q:c                     / SQn / n[         R                  " 5       [        SS9-
  n[        S5       GHN  nU[        US9-   nU  GH7  nSSSSSS.U   n[        R
                  R                  S	S
5      nUSU-   -  nUS[        R
                  R                  S	S5      -   -  n	UR                  UR                  S5      U[        US5      [        [        X5      S[        [        R
                  R                  S	S5      5      -   -  S5      [        [        X5      S[        [        R
                  R                  S	S5      5      -
  -  S5      [        U	S5      [        [
        R                  " SS5      5      S.5        GM:     GMQ     U$ )z'Generate sample crypto data for testingr  r  r  r  r  r  r  r  r   r  r   r  r  rP  r  r  )r   r  r  r  r  r   r  r  )
r  r   r  r   r   r   r  r  r  r  s
             r%   "_generate_sample_crypto_data_localYUniversalBacktestingEngine._get_crypto_engine.<locals>._generate_sample_crypto_data_localZ  se   9GD )<<I3Z(9!+<<%F  %##!#" "J $&99#3#3At#<L!+q</?!@J",BII4D4DQ4M0M"NKKK , 5 5j A"( %j! 4 %c*&Ba#biiN^N^_`bfNgJhFh&ikl m$S%AQRYYM]M]^_aeMfIgEg%hjkl!&{A!6"%fnnWh&G"H!  &  6 Kr(   )momentum_tradingr  r  volume_analysisrsi_divergencer  rs  rt  )_crypto_momentum_trading_crypto_mean_reversion_crypto_breakout_trading_crypto_volume_analysis_crypto_rsi_divergence_crypto_trend_following)r"   r  r  s      r%   r   -UniversalBacktestingEngine._get_crypto_engine	  sY    L	\!	H .$($A$A"&"="=$($A$A#'#?#?"&"="=#'#?#?

 
	
r(   c                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GHj  n[        R                  " XxS-
  U  Vs/ s H  ofS   PM	     sn5      n	[        R                  " XxS-
  U  Vs/ s H  ofS   PM	     sn5      n
Xx   S   nX:  a{  XxS-
     S   XxS-
     S	   ::  ae  XU   S	   :  a  S
OSnUR                  S[        U5       3Xx   S   SUS[        U	S5      [        U
S5      UUS
:X  a  UOU* USU	S SU
S S3S.5        M  X:  d  M  XxS-
     S   XxS-
     S	   :  d  GM  XU   S	   :  a  S
OSnUR                  S[        U5       3Xx   S   SUS[        U	S5      [        U
S5      UUS
:X  a  UOU* USU	S SU
S S3S.5        GMm     U$ s  snf s  snf s  snf )z5Crypto trend following strategy - simple MA crossoverr  r  r   r   rI  rR  r   r   r  r   r   crypto_trend_r   r  r  rP  MA crossover buy ($r   > $r  r   r   r   r  r   short_malong_mar   r   r   r   r   MA crossover sell ($ < $r_   r   rg   r   r  r   r  )r"   r   r   rE   r  r   r  symbol_datar   r,  r-  r   r   s                r%   r%  2UniversalBacktestingEngine._crypto_trend_following  s5   He,

7D)"&D$Q%%/V*Cq$Dr3{+,AwwK!A4FG4Fq'
4FGHHgg;tA3FG3Faz3FGHG'N73M !kA#&6w&?;QRsCSTZC[&[#0q>&3I#I%v)#f+7'N62 1$# %h 2$Wa0&'.%'7eeV" 3HS>gc]RST  #aC(8(A[STQTEUV\E](]#0q>&3I#I%v)#f+7'N62 1$$ %h 2$Wa0&'.%'7eeV" 4XcN$wsmSTU 7 -R W E  HGs   GGG
/G
c                 &   / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GH  nXxS-
  U n	U	 Vs/ s H  ofS   PM	     n
n[        R                  " U
5      n[        R
                  " U
5      nXx   S   nUS:  a  X-
  U-  OSn[        U5      S:  d  Mr  US	:  aP  X:  a  S
OSnUR                  S[        U5       3Xx   S   SUS[        US5      UUS
:X  a  UOU* USUS S3S.
5        M  US:  d  M  X:  a  S
OSnUR                  S[        U5       3Xx   S   SUS[        US5      UUS
:X  a  UOU* USUS S3S.
5        GM!     U$ s  snf s  snf )zCrypto mean reversion strategyr  r  r   r      r   r   rP  r   r   crypto_reversion_r   r  r  zMean reversion buy (Z: r  r  
r   r   r   r  r   r  r   r   r   r   r   zMean reversion sell (Z: )	r_   r   rg   r   r  r  r  r   r  r"   r   r   rE   r  r   r  r1  r   r  r   r  r  r   r  r   s                   r%   r!  1UniversalBacktestingEngine._crypto_mean_reversion  s   He,

7D)"&D$Q%%/V*Cq$Dr3{+,A 2a(F*01&Qj&F1JvI'N73MBKa-}1Y>UVG7|aR<'4'AevGMM 1#f+? +v 6$4"("'#(!#4#*+2e+;%%!&$;GC="J#  q['4'AevGMM 1#f+? +v 6$4"("(#(!#4#*+2e+;%%!&$<WSM"K# 7 -P U E 2s   F	F	3Fc                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GH	  nXxS-
  U n	[        S U	 5       5      n
[	        S U	 5       5      nX-
  nXx   S   nXx   S	   nXUS
-  -   :  aY  [
        R
                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUSU
UUS:X  a  UOU* USU
S 3S.
5        M  XUS
-  -
  :  d  M  [
        R
                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUSUUUS:X  a  UOU* USUS 3S.
5        GM     U$ s  snf )z Crypto breakout trading strategyr  r  r   r   r  c              3   *   #    U  H	  oS    v   M     g7fr  r   r  s     r%   r   FUniversalBacktestingEngine._crypto_breakout_trading.<locals>.<genexpr>  s     71vYr  c              3   *   #    U  H	  oS    v   M     g7fr  r   r  s     r%   r   r<    s     5feHfr  r  r  皙?r  r   r   crypto_breakout_r   r  r  zBreakout above $r  )
r   r   r   r  r   r  r   r   r   r   r   zBreakout below $)r_   r   rg   r  r  r9  r   )r"   r   r   rE   r  r   r  r1  r   r  
high_range	low_range
range_sizer  current_lowr   s                   r%   r"  3UniversalBacktestingEngine._crypto_breakout_trading  s   He,

7D)"&D$Q%%/V*Cq$Dr3{+,A 2a(F 777J5f55I#/J&>&1L%./K J,<==#)==?S#8%f,S[M:'N62 2$#&0&'.%'7eeV" 0C0@A  J,<==#)==?S#8%f,S[M:'N62 2$$&/&'.%'7eeV" 03@ 9 -R W Es   E4E4c                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GHP  nXxS-
  U n	[        R                  " U	 Vs/ s H  ofS   PM	     sn5      n
Xx   S   nXS-  :  d  ME  Xx   S   Xx   S	   -
  Xx   S	   -  nUS
:  at  [
        R
                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUS[        X-  S5      [        US5      UUS:X  a  UOU* USU SU
S S3S.5        M  US:  d  M  [
        R
                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUS[        X-  S5      [        US5      UUS:X  a  UOU* USU SU
S S3S.5        GMS     U$ s  snf s  snf )zCrypto volume analysis strategyr  r  r   r   rI  r        ?r   r  r  r  r   r   crypto_volume_r   r  r  rP  rQ  zHigh volume buy ( vs avg z.0fr  )r   r   r   r  r   volume_ratior  r   r   r   r   {Gzr   zHigh volume sell (r_   r   rg   r   r  r9  r   r  r"   r   r   rE   r  r   r  r1  r   r  
avg_volumecurrent_volumer  r   s                 r%   r#  2UniversalBacktestingEngine._crypto_volume_analysis!  s   He,

7D)"&D$Q%%/V*Cq$Dr3{+,A 2a(Fv!>v!H+v!>?J(^H5N S 00 +w 7+.:P PT_TbciTjj$&'-}}'=e6GMM .s6{m< +v 6$5"("'(-n.I1(M(-lA(>#*+2e+;%%!&$5n5EXjY\M]]^"_#  "E)'-}}'=e6GMM .s6{m< +v 6$5"("((-n.I1(M(-lA(>#*+2e+;%%!&$6~6FhzZ]N^^_"`# 5 -P U E "?s   F;F;G 
c                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GH  nXxS-
  U n	U	 Vs/ s H  ofS   PM	     n
n/ n/ n[        S[        U
5      5       Hd  nX   XS-
     -
  nUS:  a$  UR                  U5        UR                  S5        M9  UR                  S5        UR                  [	        U5      5        Mf     U(       a  [
        R                  " U5      OSnU(       a  [
        R                  " U5      OSnUS:  a  UU-  nS	S	SU-   -  -
  nOS	nXx   S   nUS
:  ae  [        R                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUS[        US5      UUS:X  a  UOU* USUS S3S.
5        GMi  US:  d  GMr  [        R                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUS[        US5      UUS:X  a  UOU* USUS S3S.
5        GM     U$ s  snf s  snf )zCrypto RSI divergence strategyr  r  r   r   r4  r   r   r   r  rK  r  r   r   crypto_rsi_r   r  r  rP  zRSI oversold (.1fr  )
r   r   r   r  r   rsir   r   r   r   F   r   zRSI overbought ()	r_   r   rg   r   r  r   r  r9  r  )r"   r   r   rE   r  r   r  r1  r   r  r   gainslossesjchangeavg_gainr  rsrS  r   r   s                        r%   r$  1UniversalBacktestingEngine._crypto_rsi_divergenceS  sP   He,

7D)"&D$Q%%/V*Cq$Dr3{+,A 2a(F +11&Qj&F1EF1c&k*VaC[0A:LL(MM!$LLOMM#f+. + */rwwu~AH*0rwwvaH!|(SAF^,'N73M Rx#)==?S#8%f'F}5'N62 0$# a=&'.%'7eeV" .s3iq9  r#)==?S#8%f'F}5'N62 0$$ a=&'.%'7eeV" 0S	; [ -t y E 2s   H?H?3Ic                     SS jnS nUU R                   U R                  U R                  U R                  U R                  S.S.$ )zStocks market enginec                   ^ U (       a  [         R                  R                  U 5      (       a  U R                  SSU S35      n[         R                  R                  U5      (       aC   [        R
                  " U5      n[        SU S[        U5       S35        UR                  S5      $  [        R
                  " U 5      n[        S
U  S[        U5       S35        UR                  S5      $ SS	K
nSU S3nUR                  U5      nU V^s/ s H!  m[        U4S jS 5       5      (       d  M  TPM#     nnU(       aI   [        R
                  " US   5      n[        SUS    S[        U5       S35        UR                  S5      $ [        SU S35        / SQn	/ n
[        R                  " 5       [        SS9-
  n[        S5       H  nU[        US9-   nU	 H  nSSSSSS.U   n[         R"                  R%                  SS5      nUSU-   -  nUS[         R"                  R%                  SS5      -   -  nU
R'                  UR)                  S 5      U[+        US!5      [+        US!5      [-        ["        R.                  " S"S#5      5      S$.5        M     M     U
$ ! [         a  n[        SU 35         S	nAGN	S	nAff = f! [         a  n[        SU 35         S	nAGNS	nAff = fs  snf ! [         a  n[        SU 35         S	nAGN}S	nAff = f)%z+Load stocks CSV data with timeframe supportr  rz  r{  u   📊 Loaded stocks OHLC data: r|  r}  r~  z Error loading OHLC stocks data: Nu   📊 Loaded raw stocks data: r  zError loading stocks data: r   r  c              3   H   >#    U  H  oTR                  5       ;   v   M     g 7fr   r  r  s     r%   r   \UniversalBacktestingEngine._get_stocks_engine.<locals>.stocks_data_loader.<locals>.<genexpr>  s(       ;M  ZLQU1779;L  ZLr  )stockaaplgooglmsfttslanvdau   📊 Auto-loaded stocks data: z)Error loading auto-detected stocks data: u'   📊 Generating sample stocks data for r  AAPLGOOGLMSFTTSLANVDAr  r        |       r  r   Q?r  rP  r   r  )r  r  r  re  ri   r  r^   rg   r  rd   r  r  r   rr   r   r   r   r9  r  r   r  r  r  r  )r5   r.   r  r   r}   r  stocks_patternstocks_filesr  r   r   r  r   r   r`  r  r  r  r  s           `          r%   stocks_data_loaderIUniversalBacktestingEngine._get_stocks_engine.<locals>.stocks_data_loader  s    RWW^^I66%--f)I6NO	77>>),,F[[3 >ykCPRG9TZ[\!zz)44
=Y/B9)Bs2wivVW::i00
 ))I>N99^4L'3  N|!s  ;M  ZL  ;M  8MA|L  NK\!_5B:<?:K2cRTgYV\]^::i00
 ;I;jQR>FD )<<I3Z(9!+<<#E*-SRU_b!cdi!jJ#%99#3#3At#<L!+q</?!@J",BII4D4DQ4N0N"OKKK , 5 5j AU %j! 4u[RS?T"%fnnXy&I"J!  $   KU % F @DEEF ! =7s;<<= N ! KEaSIJJKsW   (AJ +AJ; K!/K!?AK& 
J8J33J8;
KKK&
L	0LL	c                  j   / SQn / n[         R                  " 5       [        SS9-
  n[        S5       GH}  nU[        US9-   nU  GHf  nSSSSSS.U   n[        R
                  R                  S	S
5      nUSU-   -  nUS[        R
                  R                  S	S5      -   -  n	UR                  UR                  S5      U[        US5      [        [        X5      S[        [        R
                  R                  S	S5      5      -   -  S5      [        [        X5      S[        [        R
                  R                  S	S5      5      -
  -  S5      [        U	S5      [        [
        R                  " SS5      5      [        U	S[        R
                  R                  S	S5      -   -  S5      S.5        GMi     GM     U$ )z'Generate sample stocks data for testingrf  r  r  rl  rm  rn  ro  rp  r   r  r   rq  r  rP  {Gz?r  rr  r  )r   r  r  r  r  r   r  	adj_closer  )
r   r   r  r   r   r`  r  r  r  r  s
             r%   "_generate_sample_stocks_data_localYUniversalBacktestingEngine._get_stocks_engine.<locals>._generate_sample_stocks_data_local  s   >FD )<<I3Z(9!+<<#E !$!$ # # #" "J $&99#3#3At#<L!+q</?!@J",BII4D4DQ4N0N"OKKK , 5 5j A"' %j! 4 %c*&Ba#biiN^N^_`bfNgJhFh&ikl m$S%AQRYYM]M]^_aeMfIgEg%hjkl!&{A!6"%fnnXy&I"J%*;!bii>N>NqRW>X:X+Y[\%]	! 	 $  6 Kr(   )earnings_momentumvolume_breakoutr  r  gap_tradingrs  )N1day)_stocks_earnings_momentum_stocks_volume_breakout_stocks_mean_reversion_stocks_trend_following_stocks_gap_trading)r"   ru  rz  s      r%   r    -UniversalBacktestingEngine._get_stocks_engine  sO    4	l!	H .%)%C%C#'#?#?"&"="=#'#?#?#77	
 		
r(   c                 b   / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GH<  nXxS-
  U n	[        R                  " U	 Vs/ s H  ofS   PM	     sn5      n
Xx   S   nXS-  :  d  ME  Xx   S   Xx   S	   -
  Xx   S	   -  nUS
:  aj  [
        R
                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUS[        X-  S5      UUS:X  a  UOU* USUS SU
S S3S.
5        M  US:  d  M  [
        R
                  " 5       S:  a  SOSnUR                  S[        U5       3Xx   S   SUS[        X-  S5      UUS:X  a  UOU* USUS SU
S S3S.
5        GM?     U$ s  snf s  snf )zStocks volume breakout strategyr  rg  r   r   r  r  rP  r   r  r  r  r   r   stocks_volume_r   r}  r  zVolume breakout buy (,rH  z,.0fr  )
r   r   r   r  r   rI  r   r   r   r   rJ  r   zVolume breakout sell (rK  rL  s                 r%   r  2UniversalBacktestingEngine._stocks_volume_breakout  s   Hf-

7D)"&D$Q%%/V*Cq$Dr3{+,A 2a(Fv!>v!H+v!>?J(^H5NQ. +w 7+.:P PT_TbciTjj$&'-}}'=e6GMM .s6{m< +v 6$5"("'(-n.I1(M#*+2e+;%%!&$9.9K8T^_cSdde"f#  "E)'-}}'=e6GMM .s6{m< +v 6$5"("((-n.I1(M#*+2e+;%%!&$:>!:LHU_`dTeef"g# 1 -J O E "?s   F'F'F,
c                     / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GH  nXxS-
  U n	U	 Vs/ s H  ofS   PM	     n
n[        R                  " U
5      n[        R
                  " U
5      nXx   S   nUS:  a  X-
  U-  OSnUS:  aO  X:  a  S	OS
nUR                  S[        U5       3Xx   S   SUS[        US5      UUS	:X  a  UOU* USUS 3S.
5        M  US:  d  M  X:  a  S	OS
nUR                  S[        U5       3Xx   S   SUS[        US5      UUS	:X  a  UOU* USUS 3S.
5        GM     U$ s  snf s  snf )zStocks mean reversion strategyr  rg  r   r   r  r   r   r5  r   r   stocks_reversion_r   r  r  rP  zMean reversion buy at $r  r7  r   zMean reversion sell at $r  r8  s                   r%   r  1UniversalBacktestingEngine._stocks_mean_reversion-  s   Hf-

7D)"&D$Q%%/V*Cq$Dr3{+,A 2a(F*01&Qj&F1JvI'N73MBKa-}1Y>UVG|#0#=%6-c&k];'N62 0$#$Wa0&'.%'7eeV" 7c7JK  1#0#=%6-c&k];'N62 0$$$Wa0&'.%'7eeV" 8s8KL 5 -N S E 2s   E6E63E;c                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GHY  n[        R                  " XxS-
  U  Vs/ s H  ofS   PM	     sn5      n	[        R                  " XxS-
  U  Vs/ s H  ofS   PM	     sn5      n
Xx   S   nX:  as  XxS-
     S   U	::  ae  XU   S	   :  a  S
OSnUR                  S[        U5       3Xx   S   SUS[        U
S5      [        U	S5      UUS
:X  a  UOU* USU
S SU	S S3S.5        M  X:  d  M  XxS-
     S   U	:  d  M  XU   S	   :  a  S
OSnUR                  S[        U5       3Xx   S   SUS[        U
S5      [        U	S5      UUS
:X  a  UOU* USU
S SU	S S3S.5        GM\     U$ s  snf s  snf s  snf )zStocks trend following strategyr  rg  r   r   2   r   r  r   r  r   r   stocks_trend_r   r  r  rP  r)  r  r*  r  r+  r   r.  r/  r0  )r"   r   r   rE   r  r   r  r1  r   r-  r,  r   r   s                r%   r  2UniversalBacktestingEngine._stocks_trend_following^  s   Hf-

7D)"&D$Q%%/V*Cq$Dr3{+,Agg;tA3FG3Faz3FGHGwwK"Q4GH4Gq'
4GHIH'N73M!kA#&6w&?7&J#0q>&3I#I%v)#f+7'N62 1$# %h 2$Wa0&'.%'7eeV" 3HS>gc]RST  #aC(8(AW(L#0q>&3I#I%v)#f+7'N62 1$$ %h 2$Wa0&'.%'7eeV" 4XcN$wsmSTU 5 -P U E HHs   GGG	
/G
c                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       H  nXxS-
     S   n	Xx   S   n
X-
  U	-  n[        U5      S:  d  M,  US:  aY  Xx   S   U
:  a  S	OS
nUR	                  S[        U5       3Xx   S   SUS[        US-  S5      UUS	:X  a  UOU* USUS S3S.
5        M  US:  d  M  Xx   S   U
:  a  S	OS
nUR	                  S[        U5       3Xx   S   SUS[        US-  S5      UUS	:X  a  UOU* USUS S3S.
5        M     U$ s  snf )zStocks gap trading strategyr  rg  r   r   r   r   r  r  r   r   stocks_gap_r   r~  r   r  rP  zGap up fade (.1%r  )
r   r   r   r  r   gap_percentr   r   r   r   gQr  zGap down bounce ()r_   r   rg   r  r   r  )r"   r   r   rE   r  r   r  r1  r   
prev_closecurrent_opengap_pctr   s                r%   r  .UniversalBacktestingEngine._stocks_gap_trading  s   Hf-

7D)"&D$Q%%/V*Cq$Dq#k*+A$qS)'2J&>&1L $0J>G7|d"T>'2~g'>'MeSYGMM +CK=9 +v 6$1"("(',Ws]A'>#*+2e+;%%!&$1'#a"@#  u_'2~g'>'MeSYGMM +CK=9 +v 6$1"("'',Ws]A'>#*+2e+;%%!&$5gc]!"D# 1 ,J O Es   EEc                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       GH  nXxS-
  U n	U	 Vs/ s H  ofS   PM	     n
n[        R                  " U
SS 5      n[        R                  " U
S	S 5      nXx   S   nX:  a[  XxS
-
     S   U::  aM  XU   S   :  a  SOSnUR                  S[        U5       3Xx   S   SUSXx   S   UUUS:X  a  UOU* USS.5        M  X:  d  M  XxS
-
     S   U:  d  M  XU   S   :  a  SOSnUR                  S[        U5       3Xx   S   SUSXx   S   UUUS:X  a  UOU* USS.5        GM     U$ s  snf s  snf )zForex trend following strategyr  r  r   r   r  r   Nir   r  r   r   forex_trend_r   r  r  zMA crossover upr   r   r   r  r   r   
exit_pricer   r   r   r   r   zMA crossover down)r_   r   rg   r   r  r   )r"   r   r   rE   r  r   r  r  r   r  r   ma_shortma_longr   r   s                  r%   r  1UniversalBacktestingEngine._forex_trend_following  s   zz&(+

7D) !%>1f(=Q	>r3y>*AtA&F +11&Qj&F1wwvbc{+HggfSTl+G%L1M!i!nW&=&H#0Q<3G#G%V(V6%L0 1 ##,<#7"/&'.%'7eeV"/  #	A#w(?7(J#0Q<3G#G%V(V6%L0 1 $#,<#7"/&'.%'7eeV"1 ; +V [ ? 2s   FF3F
c                    / nUR                  SS5      nUR                  SS5      nUR                  SS5      nU Vs/ s H  owR                  S5      U:X  d  M  UPM     nn[        U[        U5      5       GH9  n	XU-
  U	 n
U
 Vs/ s H  owS   PM	     snU
 Vs/ s H  owS   PM	     sn-   n[        R                  " US	5      n[        R                  " US5      nX   S   nX   S   nX   S
   nX::  aZ  XS-
     S
   U:  aL  UX-   S-  :  a  SOSnUR                  S[        U5       3X   S   SUSUUUUS:X  a  UOU* USUS 3S.5        M  X:  d  M  XS-
     S
   U:  d  M  UX-   S-  :  a  SOSnUR                  S[        U5       3X   S   SUSUUUUS:X  a  UOU* USUS 3S.5        GM<     U$ s  snf s  snf s  snf )zForex range trading strategyr  r  r   r   range_periodr  r  r  P   r   r   rP  r   r   forex_range_r   r  r  zRange support at r  r  r   zRange resistance at )r_   r   rg   r   
percentiler   )r"   r   r   rE   r  r   r  r  r  r   r  r   r@  rA  r  rC  r  r   s                     r%   r  /UniversalBacktestingEngine._forex_range_trading  s   zz&(+

7D)zz."5 $>1f(=Q	>|S^4A~a0F)/0Ai0f3MfeHf3MMF vr2Jfb1I$</L#,u-K%L1M 'IcN7,Ci,O#0I4Ja3O#O%U[(V6%L0 / ##,"/&'.%'7eeV" 1)CA  +	A#w0G*0T#0I4Ja3O#O%U[(V6%L0 / $#-"/&'.%'7eeV" 4Z4DE A 5\ a ? 13Ms   F6F6F;G c                    / nUR                  SS5      nUR                  SS5      nUR                  SS5      nU Vs/ s H  owR                  S5      U:X  d  M  UPM     nn[        U[        U5      5       H  n	XU-
  U	 n
U
 Vs/ s H  owS   US   -
  US   -  PM     nn[        R                  " U5      nX   S   X   S   -
  X   S   -  nUS	:  d  M_  US
:  d  Mg  X   S   X   S   :  a  SOSnUR                  S[        U5       3X   S   SUS[        US5      UUS:X  a  UOU* USUS 3S.
5        M     U$ s  snf s  snf )z Crypto momentum trading strategyr  r  r   r   momentum_periodrR  r   r  r  r   r   r   crypto_momentum_r   r  r  rQ  zHigh momentum: z.2%)
r   r   r   r  r   momentumr   r   r   r   r0  )r"   r   r   rE   r  r   r  r  r1  r   r  returnsavg_momentumcurrent_returnr   s                  r%   r   3UniversalBacktestingEngine._crypto_momentum_trading0  sw   He,

7D) **%6:"&D$Q%%/V*Cq$DK(89A ?!215FEKLV'
QvY.!F);VGL777+L)nW5v8NNR]R`agRhhNd"~'9#.>'#:[^F=S#S%Y_,S[M:'N62 2$# %lA 6&'.%'7eeV" /S/AB  :, 1 E Ms   D;D;E c                    / nUR                  SS5      nUR                  SS5      nU Vs/ s H  ofR                  S5      U:X  d  M  UPM     nn[        S[        U5      5       H  n[        R                  R                  SS5      n	U	S:  d  M+  Xx   S	   Xx   S
   :  a  SOSn
UR                  S[        U5       3Xx   S   SU[        U	S5      U
U
S:X  a  UOU* USU	S 3S.	5        M     U$ s  snf )z!Stocks earnings momentum strategyr  rg  r   r   rR  r   r>  皙?r   r  r   r   stocks_earnings_r   r|  r   zEarnings beat by r  )	r   r   r   r  earnings_surpriser   r   r   r   )r_   r   rg   r   r9  r  r   r  )r"   r   r   rE   r  r   r  r1  r   r  r   s              r%   r  4UniversalBacktestingEngine._stocks_earnings_momentumR  s   Hf-

7D)"&D$Q%%/V*Cq$Dq#k*+A "		 0 0C 8 4'#.>'#:[^F=S#S%Y_,S[M:'N62 3$)./@!)D&'.%'7eeV" 12CC1HI
 
 ,& + Es   C,C,rE   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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 resultsr7   zNo trades to analyzer   r   r   r   r   r	  r            ?r  rP  inf   ∞rQ  r   )rC   winning_tradeslosing_tradesr   r   avg_profit_per_trader  r  r   sharpe_ratior  kelly_fractiontotal_stakereturn_percentage)ri   rj   rg   r  r  r  r  r   sqrtcumsum	expandingr  r  r  r   )r"   rE   r   r   rC   r  r  r   r   
avg_profitr  r  r  r  r   r  r  
cumulativerunning_maxrB  r  r  s                         r%   rk   6UniversalBacktestingEngine._calculate_backtest_resultsp  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
16 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(       a  Ub  UR                   (       a  SS0$  / / 0 0 S.n[        S[        U5      5      nUR                  U5      R	                  SS9nUR                  5        GHD  u  px U[        UR                  SUR                  S	U5      5      5      [        R                  " US
   5      (       a  [        US
   5      OS[        R                  " US   5      (       a  [        US   5      OS[        R                  " US   5      (       a  [        US   5      OS[        R                  " US   5      (       a  [        US   5      OS[        R                  " UR                  SS5      5      (       a  [        UR                  SS5      5      OSS.n	US   R                  U	5        GMG     [        R                  " U5      nUR                   (       aC  S[        US   5      US[        U5      S:  a  [        UR                   S   S   5      OSS.US'   U$ [        R"                  " US	   SSS9US'   UR%                  S/S9nUS   R&                  R)                  S5      US'   UR+                  S5      nUR-                  5       nSnS H  nXR.                  ;   d  M  Un  O   UcM  [        U5      [        US   5      US[        U5      S:  a  [        UR                   S   S   5      OSSS.US'   U$ [        R"                  " X   SSS9US'   UR%                  S/S9nUS   R&                  R)                  S5      US'   UR+                  S5      nUR                   (       d  UR                   (       aL  [        U5      [        US   5      US[        U5      S:  a  [        UR                   S   S   5      OSS.US'   U$ / SQn/ SQn/ SQnU H%  nXR.                  ;   d  M  UR                  U5        M'      US:X  a  SOS n[        R0                  " UUU   SS![        R2                  " US"9S#9nUR%                  S
/S9nUR                  5        GH0  u  nn[        UR                  S&S'5      5      R=                  5       n[        UR                  S(S)5      5      n[        UR                  S*S5      5      n[        UR                  S+S,5      5      n[        UR                  S-UR                  SS5      5      5      nUS:X  a  [        US   5      nUS   nSnUR                  5        H[  u  nn[        R"                  " UR                  SUR                  S	5      5      SSS9nUc  M@  UR)                  S5      nUU:X  d  MY  Un  O   Uc  GM<  S.nS/nUS':X  a  US0U-
  -  n US0U-   -  n!UUU-  U-  -   n"OUS0U-   -  n US0U-
  -  n!UUU-  U-  -
  n"S)n#US1:X  a'  US':X  a  U"U!S2-  :  a  S3n#OAUS4:X  a  U"U!S5-  ::  a  S3n#O/S6n#O,US7:X  a&  US':X  a  U"U S5-  ::  a  S8n#OUS4:X  a  U"U S2-  :  a  S8n#OS8n# Un$Sn%S9U;   a8  [        R                  " US9   5      (       a  [        R"                  " US9   SSS9n%OS:U;   a8  [        R                  " US:   5      (       a  [        R"                  " US:   SSS9n%OsS	U;   am  [        R                  " US	   5      (       aO  [        R"                  " US	   SSS9n&U&b3  US;;   a  [        R2                  " S0S<9O[        R2                  " S0S=9n'U&U'-   n%U%b  U%R)                  S5      n%UR                  5        H[  u  nn[        R"                  " UR                  SUR                  S	5      5      SSS9nUc  M@  UR)                  S5      nUU%:  d  MY  Un$  O   [?        U$US0-   5      n$[        U$[        U5      S0-
  5      n$[        UR                  S@SAU 35      5      [A        U5      UUUU[A        U5      U[        UR                  S	SB5      5      SC.[A        U$5      U"[        UR                  S9UR                  S	SB5      5      5      U#SD.U U!SE.UR                  SF0 5      U$U-
  SG.n(USH   R                  U(5        GM3     [        U5      [        US   5      US[        U5      S:  a  [        UR                   S   S   5      OSS.US'   U$ ! [        [        [        4 a  n
 Sn
A
GM  Sn
A
ff = f! [4         aX  n
[7        S$U
 S%35        UR-                  5       nU H(  nUUR.                  ;  d  M  [8        R:                  UU'   M*      Sn
A
GN"Sn
A
ff = f! [4         aU  n
U[?        S0[A        [        U5      S>-  5      5      -   n$[        U$[        U5      S0-
  5      n$[7        S?U
 35         Sn
A
GNSn
A
ff = f! [4         ab  n
[7        SIU SJ[        U
5       35        SSK!n)U)RE                  5         SK[        U
5       3/ / 0 SLUU(       a  [        U5      OSSM.SN.s Sn
A
$ Sn
A
ff = f)OzJGenerate comprehensive chart data with trade annotations for visualizationNr7   z,No trade or data available for visualizationrW      TdroprA   r   r  r   r  r  r   r  )r   rA   r  r  r  r   r  rX   ru  r   )rC   
price_barsr)   r.   
last_pricerZ   coerce)utcerrors)subset)rA   r   r   r   z'No timestamp column found in price data)rC   r  r)   r.   r  r7   )rA   r  r   )r  r  r  r   iQ i   backward)seconds)on	direction	toleranceu   ⚠️ merge_asof failed: z!, falling back to simple matchingr   r  r   unknownr   r   r  r   r  {Gz?r   r   g\(\?take_profitr   gRQ?profit_targetr   	stop_loss	exit_dateexit_timestamp)r   r   )hoursr  r>  u1   ⚠️ Exit bar matching failed, using fallback: r   trade_r[   )	bar_indexr   rA   )r  r   rA   reason)r  r  context)r   r   r   r   r   r   entryexitlevelsr  duration_barsrE   zVisualization error in rO   zVisualization error: zChart generation failed)r7   r)   rV   )r7   rX   rE   rY   rZ   )#emptyr  rg   tailreset_indexr   re   r_   ri   notnar   r   KeyError
ValueError	TypeErrorrj   ilocr   dropnadttz_localizesort_valuesr   r   
merge_asof	Timedeltard   r^   r   nanrp   r  r  	traceback	print_exc)*r"   rE   r,   r)   r   
chart_barsprice_dfr   r   bar_datar}   	trades_dfprice_df_copytimestamp_colr   required_colsoptional_cols
merge_colstolerance_seconds	merged_df	trade_idxr   r   r   r   r   entry_timestampentry_bar_idxp_rowbar_tsstop_loss_pcttake_profit_pctstop_loss_pricetake_profit_pricer  exit_reasonexit_bar_idxr  trade_entry_timemin_duration	trade_vizr  s*                                             r%   rl   =UniversalBacktestingEngine._generate_trade_visualization_data  s6
   ,0A0AKLLQ	  	J S#k"23J"''
3??T?JH %--/!$%(cggfc>R)S%T68hhs6{6K6Kc&k 2QR68hhs6{6K6Kc&k 2QR46HHSZ4H4HuSZ0a8:W8N8Ns7|!4TUAC#''RZ\]J^A_A_%!(<"=ef H |,33H= 0( V,I$%"%j&>"?$!(GJ8}WXGX%b(9'(B"C^_)
9% "! &(^^If4E4X`%aIk"!(((>I%.{%;%>%>%J%J4%PIk"!--k:I %MMOM !M<///$'M =
 $ %(	N"%j&>"?$!(GJ8}WXGX%b(9'(B"C^_F)
9% "!)+,$x*M+& *000FM)6{)C)F)F)R)RSW)XM+&)55kBM""ioo$'	N"%j&>"?$!(GJ8}WXGX%b(9'(B"C^_)
9% "! ;M5M7J$///%%c* %0-3x-?ET!MM!*-"( ll3DE	  "(((9I #,"4"4"6	3SWWXu56<<>cggi;<swwx34cgggs34 $CGGM3777A;N$OP!#"'G"5K #&k"2 $"*"3"3"5JC^^EIIk599VCT,U[_hpqF)!'!3!3D!9!_4,/M! #6 !( !%"&U?&1Q5F&GO(3q?7J(K%!,+/M!MJ&1Q5F&GO(3q?7J(K%!,+/M!MJ (e#:9JT9Q+Q&36)j<MPT<T.T&3&5&:49O+O&16)jOd<R.R&1&1%S#0L &*N"c)bhhs;7G.H.H)+K8Hd[c)d)S0RXXcBR>S5T5T)+<L8MSW`h)i3288CK+@+@+->>#f+4X`+a(+7DJNaDa2<<a+@gigsgsyzg{L-=-LN%1)7)C)CD)I +3*;*;*=JC%'^^EIIk599U[K\4]cgpx%yF%1)/););D)A#)^#;36L$) +> $'|]Q5F#GL#&|S]Q5F#GL cggdfYK,@AB ^$&$"%(%7!,%()<%= &)%6!+%(cggfb>Q)R%S"-	 &5'8  #wwy"5%1M%A/	2 8$++I6s #7z !$F!*\":; $CFx=STCTeHMM"$5g$>?Z[%Jy! K !*i8 j  021#5VWX%NN,	%C)"3"33)+	# &	0L ! S#03q#c(mc>Q:R3S#SL#&|S]Q5F#GLMaSQRR	SX  	+F82c!fX>?! 1Q9  6$39CKq
 
	s   Ag  2D=c/A.g  Bg  $Ag  :C
g  g  'g  =7c9 4D3g  +g  B(g  -Eee-e
D
g  c6*g  1c66g  9
e2e9eg  eg  
f=(A
f82g  8f==g   
h,
Ah'!h,'h,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   rR  rP  r  r   Nr   r   rF  lengthrF  r   r   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)ri   rj   rg   r   r  r  r  r  r  r  r  r  r  r   r  r  skewr  )r"   rE   r   r  var_95rV  cvar_95target_returndownside_returnsdownside_deviationr  r  r  rB  r  annual_returnr  streakscurrent_streakcurrent_typer   swin_streaksloss_streakss                           r%   rn   2UniversalBacktestingEngine._calculate_risk_metrics  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rD   c                    US   nUS   nUS   nUS   nUS   nSSSS	S
.R                  X"R                  5       5      nSU 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5      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       $ ! [        [        4 a    S!n
 N[f = f),z+Generate human-readable performance summaryr   r   r   r  r  r
  ForexCryptocurrencyStocksr   u   
🏀 **u=    BACKTEST RESULTS**

📊 **Overall Results:**
• Win Rate: u   %
• Total Profit: $u   
• Total Trades: rC   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  
        <   rF  u6   🏆 EXCELLENT - This strategy shows strong potential!7   g333333?u7   ✅ GOOD - Solid performance with room for optimizationr  r#  u3   🤔 FAIR - Breakeven performance, needs refinementu4   ⚠️ POOR - Strategy needs significant improvement)r_   rp   r   r  r  strip)r"   rD   r)   r   r   r   r  r  market_namerZ   pf_valratings               r%   rm   8UniversalBacktestingEngine._generate_performance_summary	  s   :&~.0~.~. &	

 #flln
% 	}  j  > ">*+ , "? #. ! > " *+, --.s23 4 y!" #
#$ %-./ 0O,- .+2	=)F r>fmMF^#NF^#JFKFRx= }} I& 	F	s   C C('C(basic_resultsc                    U(       d  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   nX3S   S:H     S   n	X3S   S:H     S   n
[        U	5      S:  a  U	R                  5       OSn[        U
5      S:  a  U
R	                  5       OSn[        U	5      S:  a  U	R	                  5       OSn[        U
5      S:  a  U
R                  5       OSn[        U	5      S:  a  U	R                  5       OSn[        U
5      S:  a  U
R                  5       OSn[        U	5      S:  a  U	R                  5       OSn[        U
5      S:  a  U
R                  5       OSnU	R                  5       n[        U
R                  5       5      nUS:  a  UU-  OSnUn[        U5      S:  a  UR                  5       S:  a  UR                  5       UR                  5       -  [        R                  " S5      -  nU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OSnSnUR                  5       nUR                  5       R                  5       nUU-
  nUR	                  5       n[        UUS:     5      S:  a  UUS:     R                  5       OSnUS:  a  [        UR                  S	   U-  5      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:  a   SU-
  S:  a  X-  SU-
  [        U5      -  -
  n'OS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R                  5       n)UR!                  5       n*UR#                  5       n+UUU[%        US-  S5      [%        US5      S.[%        UR                  5       S5      [%        US5      [%        US5      [%        US5      [%        US5      [%        US5      [%        US5      [%        US5      [%        US5      [%        US5      [%        US5      S.U['        S5      :w  a  [%        US5      OSUUS:w  a  [%        U[        U5      -  S5      OSU['        S5      :w  a  [%        US5      OS[%        U'S5      [%        U(S-  S5      S.[%        US5      [%        US5      [%        US5      [%        US5      [%        U)S5      [%        U*S5      [%        U+S5      S.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"U!S.[%        UR)                  S5      S5      [%        UR)                  S5      S5      [%        UR                  5       S5      [%        UR)                  S5      S5      [%        UR)                  S5      S5      S.[        U	5      S:  a  [%        U	R)                  S5      S5      OS[        U	5      S:  a  [%        U	R)                  S5      S5      OS[        U	5      S:  a  [%        U	R)                  S5      S5      OS[        U	5      S:  a  [%        U	R)                  S5      S5      OSS.[        U
5      S:  a  [%        U
R)                  S5      S5      OS[        U
5      S:  a  [%        U
R)                  S5      S5      OS[        U
5      S:  a  [%        U
R)                  S5      S5      OS[        U
5      S:  a  [%        U
R)                  S5      S5      OSS.S.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 comprehensive detailed statistics from actual tradesr   r   r   r   r   r	  r   r  r   Nr  rF  r  r  rP  rQ  )rC   r  r  win_rate_percentwin_rate_decimal)r   total_wins_amounttotal_losses_amountbiggest_winbiggest_losssmallest_winsmallest_lossaverage_winaverage_loss
median_winmedian_lossr  r  )r   profit_factor_numericwin_loss_ratiorecovery_factorexpectancy_per_tradekelly_fraction_percent)r  r  r  average_drawdownprofit_volatilityprofit_skewnessprofit_kurtosisr  )r  r  r  r  current_streak_typecurrent_streak_lengthr>  g      ??)p10p25
p50_medianp75p90)rT  rU  rW  rX  )profit_percentileswin_amount_percentilesloss_amount_percentiles)trade_analysisprofit_loss_analysisratios_and_factorsrH   streak_analysisdistribution_analysis)ri   rj   rg   r  r  r  medianr  r  r  r   r  r  r  r  r   r  r  r  r   quantile),r"   rE   r:  r   rC   r  r  r   profitswinning_profitslosing_profitsr@  rA  rB  rC  avg_win_amountavg_loss_amountrF  rG  r  r  r   r  r  negative_returnsr  r  r  rB  r  avg_drawdownrJ  r&  r'  r(  r   r)  r*  r+  
expectancyr  
profit_stdrO  rP  s,                                               r%   rs   9UniversalBacktestingEngine._calculate_detailed_statisticsK	  s    I\\&! 2wR9 678B)}6784@14D>0! X,	]e34X>yMV34X> 03?/Ca/Go))+Q/2>/BQ/F~))+A03O0Dq0H**,a03N0Ca0G**,Q 473G!3K--/QR36~3F3J.--/PQ14_1E1I_++-q
14^1Dq1Hn++-a %((*
>--/05AA5E
\16 w<! 1"<<>GKKM9BGGCLHL&w{3#$q(-=-A-A-Ca-G '1A1E1E1G G"''RU, V !LM ^^%
 **,002+||~8;HXPQ\<R8SVW8Wx1-224]^ FRTUEU#joob1L@A[a )}G,&!#!A%NNLN#ST!"& % ANNLNKL")@'QQvY%-?q'@#*B7aai6.A7B a<Q\Q."3X_I]8]^JJ a<NQ.?Q3F%!h,>CP_L`;`)abN C$=>NN [[]
!,,.!**, !-"0!.$)(S.!$<$)(A$6 !&gkkmQ 7%*:q%9',\1'=$[!4 %lA 6 %lA 6!&}a!8$^Q7 %oq 9#J2$[!4% =JUSX\<Y}a!8_d)6UdhiUi%_9M(Mq"Qou@OSXY^S_@_5!#<ej(-j!(<*/0Da*H# !&lA 6!&}a!8 %lA 6$),$:%*:q%9#(!#<#(!#< NY#K&HKqq{K&H"I^_O[3\'J\(\'J#Kab[f%k0Rk8k0R(SUV"Wlm]i5|1T|!!H+|1T)UWX#Yop'3)7  !!1!1#!6: !1!1$!7;"'(8!"< !1!1$!7; !1!1#!6:' GJ/FZ]^F^5!9!9#!>BdeGJ?G[^_G_5!9!9$!?CefGJ?G[^_G_5!9!9$!?CefFI/FZ]^F^5!9!9#!>Bde	+ FIEX[\E\5!8!8!=qAbcFI.FY\]F]5!8!8!>BcdFI.FY\]F]5!8!8!>BcdEHEX[\E\5!8!8!=qAbc	,&]C
 C	
+ ABv 'I'J0R1Ts0   0aaaa9a! a&a+a0c                 2   U(       d  g/ nUR                  S5        UR                  S5        UR                  S5        UR                  S5        Sn[        US5       GHb  u  pEX5S   -  nUR                  SS	5      nUR                  S
SU 35      nUR                  SS5      nUR                  SS5      n	UR                  SS5      n
UR                  SS5      nUR                  SS5      nU	S:X  a  SO	U	S:X  a  SOSnUR                  S5        UR                  SU 35        UR                  SU 35        UR                  SU SU	R                  5        35        UR                  SU
S 35        UR                  SUS  35        UR                  S!U 35        UR                  S"US 35        UR                  S#5        GMe     UR                  S5        UR                  S$US S%[	        U5       S&35        UR                  S5        S'R                  U5      $ )(z=Generate a detailed log of all trades with timestamps and P&LzNo trades to log.zP================================================================================z-DETAILED TRADE LOG - ALL TRADES CHRONOLOGICALr[   r   r   r   r   zN/Ar   Trade_r   UNKNOWNr   r  r   r   z	No signalr   u   ✅r   u   ❌u   ⚪2dzDate: zAction: z	Outcome: r3  zProfit/Loss: $z+.2fzStake: $r  zSignal: zCumulative P&L: $z(----------------------------------------zFINAL RESULT: $z total P&L from  tradesr1  )r   	enumerater_   rp   rg   join)r"   rE   	log_linescumulative_pnlr   trade
trade_datetrade_idr   r   r   r   r   outcome_symbols                 r%   ro   7UniversalBacktestingEngine._generate_detailed_trade_log	  s   &	"HI"!&!,HAHo-N 651Jyys|4HYYx3Fii	95GYYx+FIIgq)EYYx5F '.&6UWPVEVE\aNT"vj\23xx01y(8'--/9JKL~fT];<xc{34xx0100EFGX&/ -2 	?>$*??OPSTZP[}\cde"yy##r(   walk_forward_configc           
          [         R                  " U5      nSUR                  ;  aI  SUR                  ;   a  [         R                  " US   5      US'   OU R                  R                  S5        g[         R                  " US   5      US'   UR                  S5      R                  SS9nUR                  SS5      nUR                  S	S
5      n	UR                  S5      n
UR                  S5      nUR                  SU	5      nU
(       a  [         R                  " U
5      n
OUS   R                  5       n
U(       a  [         R                  " U5      nOUS   R                  5       nXwS   U
:  US   U:*  -     n[        U5      S:  a  SS[        U5      S.$ / nU
nSnSnX:  Ga  UU:  Ga  U[         R                  " US9-   nUnU[         R                  " U	S9-   nXwS   U:  US   U:  -     n[        U5      S:  a  GOXwS   U:  US   U:  -     nXwS   U:  US   U:  -     n[        U5      S:  d  [        U5      S:  a  GOGU R                  UR                  S5      X#U5      nU R                  UR                  S5      X#U5      nU R                  U5      nU R                  U5      nU R!                  UU5      nUR#                  US-   [%        UR'                  5       5      [%        UR'                  5       5      [        U5      [        U5      US.[%        UR'                  5       5      [%        UR'                  5       5      [        U5      [        U5      US.US.5        U[         R                  " US9-   nUS-  nX:  a	  UU:  a  GM  U R)                  U5      nUU	U[%        U
R'                  5       5      [%        UR'                  5       5      [        U5      S.UUU R+                  U5      U R-                  U5      S.$ ! [.         a9  nU R                  R                  SU 35        S[%        U5       3US.s SnA$ SnAff = f) aK  
Perform walk forward analysis to prevent overfitting

Parameters:
- in_sample_months: Months for training/optimization
- out_of_sample_months: Months for testing
- start_date: Optional start date (YYYY-MM-DD)
- end_date: Optional end date (YYYY-MM-DD)
- step_months: Months to advance each period (default = out_of_sample_months)
rA   r   z;No timestamp or date column found for walk forward analysisNTr  in_sample_monthsrW  out_of_sample_monthsr   
start_dateend_datestep_monthsr  z+Insufficient data for walk forward analysis)r7   required_minimumavailable_datar   r  )monthsr  rK  rI  r~  r   )r  r  data_pointsrE   metrics)period_numberin_sample_periodout_of_sample_periodoverfitting_analysis)r}  r~  r  r  r  total_periods)configurationr   overall_statisticsoverfitting_summaryrecommendationsz Error in walk forward analysis: zWalk forward analysis failed: )r7   r  )ri   rj   r   r   r   r7   r  r  r_   r  r  rg   
DateOffset_run_strategy_on_datar  _calculate_walk_forward_metrics_calculate_overfitting_metricsr   re   r   %_calculate_overall_walk_forward_stats_generate_overfitting_summary&_generate_walk_forward_recommendationsrd   )r"   r   r)   r*   r+   r{  r.   r   r}  r~  r  r  r  r/   current_startperiod_countmax_periodsin_sample_endout_sample_startout_sample_endperiod_datain_sample_dataout_sample_datain_sample_tradesout_sample_tradesin_sample_metricsout_sample_metricsoverfitting_metricsoverall_statsr}   s                                 r%   rw   5UniversalBacktestingEngine._run_walk_forward_analysis
  sq   F	d#B "**,RZZ'&(nnRZ&@B{OKK%%&cd nnR_=B{O,88d8CB  3667I2N#6#:#:;QST#U ,00>J*..z:H-11-AUVK ^^J7
_002
>>(3k?..0 _
2r+(7RSTB2w}J(+&)"g  $& &MLK*|k/I -EU0V V $1 !1BMMI]4^!^ ![/]"Br+YgGg!hi{#b( "$_%E"[/\iJi$j!k"$o9I&IbQ\o`nNn%o"p~&+s?/Cb/H $(#=#="**95vj$ 
 %)$>$>#++I6z%!
 %)$H$HIY$Z!%)%I%IJ[%\" '+&I&I%'9'# %++%1A%5&)-*<*<*>&?$'(:(:(<$='*>':"%&6"7#4) '**:*?*?*A&B$'(;(;(=$>'*?';"%&7"8#5- -@!- ( !.[0Q Q!y  *|k/I~ !FFG[\M )9,@#."%joo&7"8 #HMMO 4%()=%>" 0&3'+'I'IJ^'_#'#N#N}#]   	KK @DE9#a&B!4 	s3   A.P 1D$P G3P A4P 
Q.P?9Q?Qc                 
    [        U SU S35      " 5       nU(       d  / $ US   R                  U5      nU(       d  / $ U" XS9nU(       a  U$ / $ ! [         a*  nU R                  R	                  SU 35        / s SnA$ SnAff = f)z@Run a strategy on specific data subset for walk forward analysis_get__enginerN   )r   z'Error running strategy on data subset: N)getattrr_   rd   r   r7   )	r"   r   r)   r*   r+   rz   r   rE   r}   s	            r%   r  0UniversalBacktestingEngine._run_strategy_on_data
  s    	#DE&*ABDM 	 *,7;;MJM 	 #4;F#6++ 	KK GsKLI	s-   A A A A 
BA=7B=Bc           	         U(       d	  SSSSSSS.$ [         R                  " U5      nUS   n[        X"S   S:H     5      n[        U5      nUS:  a  XE-  OSnUR                  5       nUR	                  5       nUR                  5       n	U	R                  5       R                  5       n
X-
  n[        U5      S:  a  [        UR                  5       5      O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[        US-  S	5      [        US	5      [        US	5      [        US	5      [        US	5      S.$ )
z-Calculate key metrics for walk forward periodr   )rC   r   	total_pnl	avg_trader  r  r   r   r   r   r  r  rP  )ri   rj   rg   r  r  r  r  r  r  r  r  r   r  r  )r"   rE   r   rc  r  rC   r   r  r  r  r  rB  r  r  s                 r%   r  :UniversalBacktestingEngine._calculate_walk_forward_metrics
  sR    ! ! !  \\&!X,R9 6782w4@14D>0!KKM	LLN	 ^^%
 **,002+.1(ma.?s8<<>*Q w<! 1"<<>GKKM9BGGCLHLL )hna0y!,y!,!,2!,2
 	
r(   	in_sample
out_samplec                      UR                  SS5      nUR                  SS5      nUS:w  a  XC-
  [        U5      -  S-  nOSnUR                  SS5      nUR                  SS5      nXv-
  nUR                  SS5      n	UR                  SS5      n
X-
  n[        U5      [        U5      -   [        U5      -   nUS:  a  SnSnOUS	:  a  S
nSnOUS:  a  SnSnOSnSn[        US5      [        US5      [        US5      [        US5      UUUS:w  a  [        XC-  S5      OSUS:w  a  [        Xv-  S5      OSU	S:w  a  [        X-  S5      OSS.S.$ ! [         a7  nU R                  R                  SU 35        [        U5      SSS.s SnA$ SnAff = f)zMCalculate overfitting metrics between in-sample and out-of-sample performancer  r   r  r   r  r  LOWz+Strategy shows good out-of-sample stabilityr  MODERATEz1Some performance decay detected - monitor closelyHIGHz?Significant overfitting detected - strategy may need adjustmentCRITICALz1Severe overfitting - strategy likely curve-fittedrP  )	pnl_ratiowin_rate_ratior  )performance_decay_percentwin_rate_decay_percentsharpe_decayoverfitting_scoreoverfitting_risk_leveloverfitting_descriptionin_sample_vs_out_samplez'Error calculating overfitting metrics: ro  )r7   r  r  N)r_   r  r  rd   r   r7   re   )r"   r  r  in_pnlout_pnlperformance_decayin_win_rateout_win_ratewin_rate_decay	in_sharpe
out_sharper  r  
risk_levelrisk_descriptionr}   s                   r%   r  9UniversalBacktestingEngine._calculate_overfitting_metrics
  s   9	]];2F nn[!4G{&-&6#f+%E$L!$%! $--
A6K%>>*a8L)7N "na8I#:J%1L !$$5 6^9L LsS_O` ` !2%"
#P "R''
#V "S(#
#d '
#V  .33Da-H*/*B %lA 6%*+<a%@*4+;?E{w'7!;PQNY]^N^eL,F&JdeHQUVE**@!$D\],   	KK GsKLQ%&*3 	s   E	E 
F,FFFr   c                    U(       d  0 $ U Vs/ s H  o"S   S   S   S:  d  M  US   S   PM     nnU(       d  SS0$ U Vs/ s H  oDS   PM	     nnU Vs/ s H  oDS   PM	     nnU Vs/ s H  oDS	   PM	     nn[        U5      S
:  a  [        R                  " U5      OSn[        U5      S
:  a  [        R                  " U5      OSn	[        U Vs/ s H  o"S:  d  M
  UPM     sn5      n
U(       a  U
[        U5      -  OSn[        U5      [        [        R                  " U5      S5      [        [        R                  " U5      S5      [        [        U5      S5      [        [        R                  " U5      S5      [        US5      [        U	S5      [        US-  S
5      [        [        U5      S5      [        [        U5      S5      U(       a"  [        [        R                  " U5      S5      S.$ SS.$ s  snf s  snf s  snf s  snf s  snf )z<Calculate overall statistics across all walk forward periodsr  r  rC   r   r7   zNo valid out-of-sample periodsr   r  r  r   rP  r  )r  average_win_rateaverage_monthly_pnlr  average_sharpewin_rate_consistencypnl_consistencyprofitable_periods_percentbest_period_pnlworst_period_pnloverall_sharpe)rg   r   r  r  r  r  r  r  )r"   r   r.  out_sample_resultsr	win_ratespnlssharpe_ratioswin_rate_stdpnl_stdprofitable_periodsprofitability_rates               r%   r  @UniversalBacktestingEngine._calculate_overall_walk_forward_stats.  s   I MT  QGqYoWpqzW{  }K  XL  OP  XPBa 67	BG  Q!=>> -??,>qz],>	?(:;(:1+(:;4FG4Fq>*4FG -0	NQ,>rvvi(A"%d)a-"&&,Q !T!;TU!T!;<?C/#d); !!34 %bggi&8! <#(#:s4y!,#BGGM$:A>$),$:$Wa0*/0BS0H!*L$SY2 %c$i 3BOeBGGM$:A>
 	
 VW
 	
% Q @;G "<s(   G5G5G:G?)H	H	H	c           
      (   U(       d  g/ nUR                  S5        UR                  S5        U Vs/ s H
  o3S   S   PM     nnU Vs/ s H
  o3S   S   PM     nn[        R                  " U5      nUR                  S5      UR                  S5      UR                  S	5      UR                  S
5      S.nUR                  SUS 35        UR                  SU 35        UR                  S5        UR                  S5        UR                  S5        U Hc  nUS   n	US   n
U
S   nUR                  SU	 SU SU
S   S S35        UR                  SU
S   S S35        UR                  SU
S   S S35        Me     SR	                  U5      $ s  snf s  snf )z*Generate a summary of overfitting analysisz"No walk forward periods to analyzeu&   🎯 WALK FORWARD OVERFITTING ANALYSIS2==================================================r  r  r  r  r  r  r  )r  r  r  r  zAverage Overfitting Score: rR  zRisk Level Distribution: r[   zPERIOD-BY-PERIOD OVERFITTING:z------------------------------r  zPeriod rO   z risk (z score)z  P&L Decay: r  z+.1f%z  Win Rate Decay: r  r1  )r   r   r  countrs  )r"   r   linesr.  overfitting_scoresrisk_levelsavg_overfittingrisk_distributionperiodp_numanalysisrisks               r%   r  8UniversalBacktestingEngine._generate_overfitting_summaryT  s   7=>X W^^V]QR 678KLV]^T[\T[q/01IJT[\''"45$$U+#))*5%%f-#))*5	
 	2?32GHI01B0CDER 	45XF?+E45H45DLL75'D6BU9VWZ8[[bcdLL=2M)Nt(TTUVWLL-h7O.PQU-VVWXY  yy9 _\s   F
Fr  c                    / nU(       a  SU;   a  S/$ UR                  SS5      nUS:  a  UR                  S5        O)US:  a  UR                  S5        OUR                  S	5        UR                  S
S5      nXAR                  SS5      S-  :  a  UR                  S5        OUR                  S5        UR                  SS5      nUR                  SS5      nUS:  a  US:  a  UR                  S5        O)US:  a  UR                  S5        OUR                  S5        UR                  SS5      nUS:  a  UR                  S5        U$ US:  a  UR                  S5        U$ UR                  S5        U$ )z7Generate recommendations based on walk forward analysisr7   z;Unable to generate recommendations due to insufficient datar  r   rT  uK   ✅ Excellent consistency - strategy shows strong out-of-sample performancer  uS   ⚠️ Moderate consistency - strategy performs in most periods but monitor closelyuC   ❌ Poor consistency - strategy fails in most out-of-sample periodsr  r  r   u%   ✅ Good P&L stability across periodsuA   ⚠️ High P&L volatility - consider risk management adjustmentsr  r  r4  rI  u1   ✅ Strong and consistent win rate across periodsuC   ⚠️ Decent win rate but inconsistent - may need parameter tuningu9   ❌ Weak win rate - strategy may need fundamental changesr  rT  u9   ✅ Sufficient walk forward periods for reliable analysisrQ  u=   ⚠️ Moderate number of periods - consider adding more datauG   ❌ Insufficient periods - add more historical data for better analysis)r_   r   )r"   r  r  profitabilityr  avg_win_rater  r  s           r%   r  AUniversalBacktestingEngine._generate_walk_forward_recommendations|  s   = 8QRR &))*FJB""#pqb ""#xy""#hi (++,=qA../DaH3NN""#JK""#fg %(();Q?,001GK"!5!:""#VWB""#hi""#^_ &))/1=A""#^_  a""#bc  ""#lmr(   c                 6   0 nUS:X  a  / SQ/ SQ/ SQ/ SQS.nU$ US:X  a  / SQ/ S	Q/ S
Q/ SQS.nU$ US:X  a  / SQ/ SQ/ SQ/ SQS.nU$ US:X  a  / SQ/ SQ/ SQ/ SQS.nU$ US:X  a  / SQ/ SQ/ SQ/ SQS.nU$ US:X  a  / SQ/ SQ/ SQ/ SQS.nU$ / SQ/ SQ/ S
QS.nU$ ) z?Get default parameter ranges for optimization based on strategyr  )rR  r  r   )r  r  rR  )rx  r  rx  )r  r>  r  )short_ma_periodlong_ma_periodr  r  r  )rI  rK  rR  )rF  g      @r   )rR  r  rR  )r  r  r  )r  std_dev_multipliermax_holding_periodr  r  )r   rR  r   )rx  r  rx  )lookback_periodbreakout_thresholdconfirmation_periodr  r  )rR     r   )rJ  r2  rx  )r   rI  r   )r  momentum_thresholdexit_thresholdr  r  )gffffff?rS  r>  )r  r  r  )r  range_multiplierr  r  r  )rK  Z   r  )r  g{Gz?r  )r>  r   r>  )interest_diff_thresholdr  r  position_size_pct)r  r  r  r   )r"   r*   r)   rangess       r%   ru   8UniversalBacktestingEngine._get_default_parameter_ranges  s    --#-"-!3#5	Fb W ..%&5&0!5	FT I 00#.&:'0!3	FF ; 00#-&8"4&0	F8 - o- +$3!5#5	F*  m++=&2!3%4	F  "4#5&0F r(   c                    SUR                  5        SUR                  SS5      R                  5        S3nUS:X  a}  US:X  aB  USUR                  S	S
5       S3-  nUSUR                  SS5      R                  5        S3-  nGO:US:X  a  USUR                  SS5       S3-  nGOUS:X  a  US-  nGOUS-  nGOUS:X  a\  UR                  SS5      nUS:X  a
  USU S3-  nOUS:X  a
  USU S3-  nOUS :X  a
  US!U S3-  nOUS":X  a
  US#U S$3-  nOUS%U S3-  nOUS&:X  aL  UR                  S'S(5      nUS):X  a
  US*U S3-  nO{US":X  a
  US#U S+3-  nOkUS,:X  a
  US-U S3-  nO[US.U S3-  nOQUS/:X  aK  UR                  S'S05      nUS1:X  a
  US2U S3-  nO)US3:X  a
  US4U S3-  nOUS5:X  a
  US6U S3-  nO	US%U S3-  nUS7UR                  S8S95       S:3-  nU$ );z4Generate a concise equation summary for the strategyz**z Strategy:** rz  r3  z

r   player_points_overz!**Equation:** If Player_Points > points_threshold   z, WIN
z**Player:** player_namer   r1  team_win_streaku    **Equation:** If Win_Streak ≥ 
min_streakr   z, bet on team
home_away_performancez8**Equation:** Bet on home teams with >60% home win rate
z=**Equation:** Moneyline prediction with >55% win probability
r   r  r  r  z%**Equation:** If SMA(5) > SMA(20) on z, BUY
r  zA**Equation:** Buy at 20th percentile, Sell at 80th percentile on r  u=   **Equation:** Enter on ±10% breakout beyond 20-day range on r  z(**Equation:** If Z-Score < -2 or > 2 on z, trade mean reversion
z!**Equation:** Trend following on r   r  r  r  uA   **Equation:** If 5-day return > 2% AND volume > 1.5× average on z, mean reversion trade
r  z'**Equation:** High volume breakouts on z"**Equation:** Momentum signals on r   rg  r|  z+**Equation:** If earnings surprise > 5% on r}  uA   **Equation:** If volume > 2× average AND price > 20-day high on r~  u    **Equation:** Fade ±3% gaps on z**Stake:** $r   r   z per trade
)rp   re  titler_   )r"   r*   r+   r)   rZ   r  r  s          r%   ry   5UniversalBacktestingEngine._generate_equation_summary  s   v||~&mM4I4I#s4S4Y4Y4[3\\`aU? 44>z~~N`bd?e>ffmnn\*..	*R*X*X*Z)[[]^^"33=jnn\[\>]=^^mnn"99VW[\w>>&(3D 11B4&PP/1^_c^ddfgg"44Z[_Z``bcc"22EdVKcdd>tfBGGx^^He4F 22^_e^ffmnn"22EfXMeff"33DVHBOO?xrJJx^^Hf5F 33HPWXX"33^_e^ffmnn-/=fXRHH>vhbII\*..$"?!@MMr(   )r   r!   )NrI  ru  NNFN):__name__
__module____qualname____firstlineno____doc__r&   re   r   r   r  boolr   rf   rb   r   rc   r   r  r  r   r   r   r  r  r  r   r%  r!  r"  r#  r$  r    r  r  r  r  r  r  r   r  rk   ri   rj   rl   rn   rm   rs   ro   rw   r  r  r  r  r  r  ru   ry   __static_attributes__r   r(   r%   r   r      s%   ;
* U\;?:>/4)-\3 \s \SRUX \!$\9<\NQ\*.sCx.\ *.c3h\ )-	\
 $'\
 37sCx.\|w
rG
RL
DJ L
 L
QUVY[^V^Q_ L
\C
T C
 C
e C
 C
JDJ 5 &?$t* ?4 ?TXY]T^ ?B
D
L2DJ 2 2d 2htDz 4 DJ 46$t* 6d 6tDz 6p~
@1DJ 1 1d 1f04: 0t 0T
 0d1T$Z 1 1$t* 1f0DJ 0 0d 0dB4: Bt BT
 BHe
N-DJ - -d -^/4: /t /T
 /b0DJ 0 0d 0d-T
 -D -T$Z -`44: 4t 4T
 4l7d 7T 7d4j 7tT$Z  $t* Dd4j $ 4PT: <;
$t* ;
d ;
tTWY\T\~ ;
zVd VRTR^R^ Vhk Vptuxz}u}p~ VpJ
d4j J
T#s(^ J
X8T#s(^ 8S 8UX 8tc
T$Z c
PT c
Y]^acf^fYg c
J)$4: )$# )$VStDz S3 SWZ S-1#s(^SRVWZ\_W_R`S,/S48cNSj$t* c RU )-c3h<@J,)
d4j )
T#s(^ )
V; ;$ ;SWX[]`X`Sa ;z$
T$Z $
DQTVYQYN $
L& T$Z & C & P+D +TRUY +Z73 7 7PTUXZ^U^P_ 7r3 3cSVh 3ad 3il 3r(   r   c                  V  ^ 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  a\  UR                  US   US   UR                  S0 5      UR                  S	5      UR                  S
S5      UR                  SS5      5      nOSSU 30nU4S jm[        [        R                  " T" U5      5      5        g[        5       n[        S5        [        S5        [        S5        UR                  SSSSS.SS9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        UR                  S(S)S*SS+.SS9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)/z:Main function for testing the universal backtesting enginer   Nr   rP  r   r)   r*   r+   r5   r-   rI  r.   ru  r7   zUnknown command: c                   > [        U [        R                  5      (       a  [        U 5      $ [        U [        R                  5      (       a  [        U 5      $ [        U [        R                  5      (       a  U R                  5       $ [        U [        5      (       a,  U R                  5        VVs0 s H  u  pUT" U5      _M     snn$ [        U [        5      (       a  U  Vs/ s H  nT" U5      PM     sn$ U $ s  snnf s  snf r   )rh   r   integerr  floatingr   ndarrayr   dictitemsr`   )objkeyvalueitemconvert_numpy_typess       r%   r  !main.<locals>.convert_numpy_types/  s    c2::..s8OR[[11 :%RZZ00::<'T**NQiikZk
C!4U!;;kZZT**BEF#$/5#FFJ	 [Fs   -C6C<u&   🌍 Universal Backtesting Engine Testr  u$   
💱 Testing Forex Trend Following:r   r  r  r   )r  r   rR  )r-   rB   u   ✅ Forex backtest completed: rC   rq  u   📊 Win Rate: rD   r   r  u   💰 Total Profit: $r   u   ❌ Forex backtest failed: zUnknown erroru   
₿ Testing Crypto Momentum:r   r  r  )r  r   u   ✅ Crypto backtest completed: u   ❌ Crypto backtest failed: u1   
✅ Universal backtesting engine test completed!)sysrg   argvr   jsonloadsr   r_   r^   dumpsrd   re   r  )r   enginecommandr   resultr}   result2r  s          @r%   mainr)    s   
388}q+-((1+,/MA,=CHHQK(2!	.(,,8$?+JJ|R0JJ{+JJ|R0JJ{G4 "%6wi#@A $**089: ,-67h 	56$$-	 % 
 ::i  26.3I2J'RSOF9$5j$A#B!DE(	):>)J(KLM/

7O0T/UVW 	./%%t,	 & 
 ;;y!!3GN4K3LGTUOGI$6z$B#C1EF();N)K(LMN0Wo1V0WXYBCW  	$**gs1v./0HHQKK	s   7BI 
J("<J##J(__main__)r  r  r   r"  r   ri   r   r   r   r   typingr   r   r   r   r	   r9  r   r)  r  r   r(   r%   <module>r,     sQ   
 
 
    ( 6 6 E0 E0N`TDl zF r(   