
    ^i              	       	   d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZ ddlZddlZddlZddlZddlZddlZddlmZ 	 ddlZ ej.                  dd	      j1                         d
k(  Z ej.                  dd
      j1                         d
k(  Zeres	 ed       n ederdnd        ej8                  j;                  ej8                  j=                  ej8                  j=                  ej8                  j?                  e                           ejB                  ejD                          ejF                  e$      Z%d Z&	 ddl'm(Z(  e(       Z)e%jU                  d       	 ddl-m-Z- e-j\                  Z/e/re%jU                  d       ne%ja                  d       	 ddl1m2Z2m3Z3 dZ4e%jU                  d        eddd !      Z5e5jm                  ed"d#gdd$gd$g%       ded&e7d'e8fd(Z9dfd&e7fd)Z:d* Z; G d+ d,e      Z< G d- d.e      Z=i Z> G d/ d0      Z? G d1 d2      Z@d3e@d4e
fd5ZAd3e@d4eBfd6ZCd7e8d4ee
   fd8ZDe5j                  d9      d:        ZFe5j                  d;      d<        ZGe5j                  d=      d>        ZHe5j                  d?      dgd@e8fdA       ZJe5j                  dB      ded&e7d'e8fdC       ZKe5j                  dD      dfd&e7fdE       ZLe5j                  dF      dG        ZMe5j                  dH      dIe<dJefdK       ZOe5j                  dL      dIe=dJefdM       ZPe5j                  dN      dOe8fdP       ZQe5j                  dQ      dR        ZRe5j                  dS      d7e8fdT       ZSe5j                  dU      dV        ZTe5j                  dW      dIe
e8ef   fdX       ZUd7e8dIe=fdYZVdZe8d[e
e8ef   d\ee
e8ef      fd]ZWdZe8d[e
e8ef   d\ee
e8ef      fd^ZXe$d_k(  rddlYZY eYj                  d`dadbddcd       yy# e$ r dZY w xY w# e$ r!Z+e%jY                  de+        dZ)Y dZ+[+dZ+[+ww xY w# e$ r#Z+e%jY                  de+        dZ-dZ/Y dZ+[+dZ+[+ww xY w# e$ r#Z+e%jY                  de+        dZ2dZ4Y dZ+[+dZ+[+ww xY w)hzn
FastAPI Microservice for QuantEdge AI
Provides high-performance NBA data processing and backtesting services
    )FastAPIHTTPExceptionBackgroundTasks)CORSMiddleware)	BaseModel)DictListAnyOptionalN)datetimePRODUCTION_MODEfalsetrueALLOW_MOCK_DATAu2   🚨 PRODUCTION MODE: Mock data fallbacks DISABLEDu#   🔧 DEV MODE: Mock data fallbacks ENABLEDDISABLED)levelc                    t        | t              r-| j                         D ci c]  \  }}|t        |       c}}S t        | t              r| D cg c]  }t        |       c}S t        | t
              r,| t        d      k(  s| t        d      k(  s| | k7  r	| dkD  rdS dS | S 	 ddl}t        | |j                        rt        |       S t        | |j                        r2t        |       }|t        d      k(  s|t        d      k(  r	|dkD  rdS dS |S t        | |j                        r| j                         S t        | d      r| j                         S 	 | S c c}}w c c}w # t        $ r Y | S w xY w)zTRecursively replace infinity, NaN values and numpy types with JSON-compatible valuesinfz-infr   gR?@gR?Nitem)
isinstancedictitemsclean_infinity_valueslistfloatnumpyintegerintfloatingndarraytolisthasattrr   ImportError)objkvr   npvals         0/var/www/html/eventheodds/python_service/main.pyr   r   '   sQ   #t8;		D1(++DD	C	8;<%d+<<	C	%,#v"63#: 1W61'1
	#rzz*3xC-Cj%,&#v*>%(1W69'9
C,zz|#f%xxz! & 
1 E<(  	
	s<   EE$$E! 	AE! E! E! %E! 7E! !	E.-E.)UniversalBacktestingEngineu2   ✅ UniversalBacktestingEngine loaded successfullyu1   ❌ Failed to import UniversalBacktestingEngine: )cache_serviceu   ✅ Redis cache service enabledu4   ⚠️ Redis cache service disabled - using fallbacku$   ❌ Failed to import cache service: F)sports_engineSportsBacktestingEngineTu1   ✅ Sports backtesting engine loaded successfullyu0   ❌ Failed to import sports backtesting engine: zQuantEdge AI Python Servicez6High-performance NBA data and backtesting microservicez1.0.0)titledescriptionversionzhttp://localhost:3000zhttp://localhost:3003*)allow_originsallow_credentialsallow_methodsallow_headerslimitseasonc           	      ~   t         r6t        j                  ||       }|rt        j	                  d| d|  d       |S t
        s[t        rt        st        dd      t        j                  d       dd	d
ddddddg}t         rt        j                  ||| d       |S 	 dt
        j                  v rt
        j                  d   d   } |dd      }t        |t              rf|r$|D cg c]  }|j                  d      |k(  s| }}|d|  }t         r3t        j                  |||        t        j	                  d| d|  d       |S t        rt        st        dd      dd	d
ddddddg}	t         rt        j                  |	|| d       |	S c c}w # t        $ r"}t        j!                  d|        Y d}~qd}~ww xY w)z6Load NBA games data using the real engine with cachingu%   ✅ Cache hit for NBA games (season: z	, limit: )  zFNBA data service unavailable and mock data disabled in production modestatus_codedetailz1Backtesting engine not available, using mock datazmock-001LALGSWz
2024-01-152023-24x   s   home)game_id	home_team	away_team	game_dater8   
home_score
away_scorewinner   	ttl_hoursnbadata_loaderN1dayr8   u$   💾 Cached NBA games data (season: zError loading NBA games: z=NBA API unavailable and mock data disabled in production modezfallback-001)CACHE_ENABLEDr,   get_nba_gamesloggerinfoBACKTESTING_ENGINEr   r   r   warningset_nba_gamesmarket_enginesr   r   get	Exceptionerror)
r7   r8   cached_data	mock_datarP   datagameresultefallback_datas
             r*   load_nba_gamesrd   t   s    #11&%@KK?xyQVPWWXYZ?_ 
 	JK &"")#!! 	
	 ''	65AN6&555,;;EB=QKtV,D$%-1RTTXXh5G65QDRDRfu !!//FKK"FvhiX]W^^_ `a
 R
 	
 &%		
M ##M65ANI S  604556s2   AF &F FAF F 	F<F77F<c           	         t         r2t        j                  |       }|rt        j	                  d|  d       |S ddddddd	d
ddddddddd
dgd|  }t         r/t        j
                  ||        t        j	                  d|  d       |S )z"Load NBA players data with cachingu&   ✅ Cache hit for NBA players (limit: r:   lebron_jameszLeBron Jamesr?   SFg     <@gffffff @g333333&@)ppgapgrpg)	player_idnameteampositionstatsstephen_curryzStephen Curryr@   PGgL8@gffffff@g      @Nu%   💾 Cached NBA players data (limit: )rR   r,   get_nba_playersrT   rU   set_nba_players)r7   r]   r^   s      r*   load_nba_playersrt      s     #33E:KK@qIJ
 ("!#d;	
 )#!#c:	
 uI$ %%i7;E7!DE    c                     t         r-t        j                         } | rt        j	                  d       | S dddddddd	ddd
dddddddddg}t         r,t        j
                  |d       t        j	                  d       |S )z Load NBA teams data with cachingu   ✅ Cache hit for NBA teamsr?   zLos Angeles LakerszLos AngelesWestern)team_idrl   city
conferencer@   zGolden State WarriorszSan FranciscoBOSzBoston CelticsBostonEasternNYKzNew York KnickszNew York   rM   u   💾 Cached NBA teams data)rR   r,   get_nba_teamsrT   rU   set_nba_teams)r]   r^   s     r*   load_nba_teamsr      s     #113KK56 (!#		
 +##		
 $#		
 %#		
'I8 ##I=01ru   c                   b    e Zd ZU eed<   dZeed<   dZeeee	f      ed<   dZ
eeee	f      ed<   y)StrategyRequeststrategy_coderO   marketNparamstime_period)__name__
__module____qualname__str__annotations__r   r   r   r   r
   r    ru   r*   r   r     s@    FC'+FHT#s(^$+,0K$sCx.)0ru   r   c                       e Zd ZU dZee   ed<   eed<   eed<   eeef   ed<   dZ	eeeef      ed<   dZ
ee   ed<   dZee   ed	<   dZeeeef      ed
<   dZeeeef      ed<   dZeeeef      ed<   dZee   ed<   y)BacktestRequestNr8   strategy_namer   r   r   r   1hour	timeframewalk_forward_configwalk_forward_periodsoptimization_configFuse_intrabar_ticks)r   r   r   r8   r   r   r   r   r
   r   r   r   r   r   r   r   boolr   ru   r*   r   r     s     FHSM KcN,0K$sCx.)0#'M8C='&Ix}&48$sCx.1859(4S>2948$sCx.18)..ru   r   c                       e Zd ZdZdZdZdZy)	JobStatuspendingrunning	completedfailedN)r   r   r   PENDINGRUNNING	COMPLETEDFAILEDr   ru   r*   r   r   )  s    GGIFru   r   c                       e Zd ZdedefdZy)BacktestJobjob_idrequestc                     || _         || _        t        j                  | _        t        j                         | _        d | _        d | _	        d | _
        d | _        y )N)r   r   r   r   statusr   utcnow
created_at
started_atcompleted_atra   r\   )selfr   r   s      r*   __init__zBacktestJob.__init__0  sH    ''"//+ 
ru   N)r   r   r   r   r   r   r   ru   r*   r   r   /  s    s _ ru   r   jobreturnc           
         | j                   | j                  | j                  r| j                  j                         nd| j                  r| j                  j                         nd| j
                  r| j
                  j                         nd| j                  | j                  | j                  j                  | j                  j                  d	S )z/Serialize BacktestJob to dict for Redis storageN)	r   r   r   r   r   ra   r\   r   r   )r   r   r   	isoformatr   r   ra   r\   r   r   r   r   s    r*   serialize_jobr   ;  s     ****47NNcnn..047NNcnn..08;8H8H((224d**++$$22
 
ru   c                 r    t         r1t        r+t        j                  | j                  t	        |       d      S y)zSave job to Redisi   )ttl_secondsF)r,   rR   set_jobr   r   r   s    r*   save_job_to_redisr   I  s)    $$SZZs1CQUVVru   r   c                 F    t         rt        rt        j                  |       S y)zGet job from RedisN)r,   rR   get_job)r   s    r*   get_job_from_redisr   O  s    $$V,,ru   /c                  V   K   ddt        j                         j                         dS w)zHealth check endpointoperationalz QuantEdge AI Python Microservice)r   service	timestamp)r   r   r   r   ru   r*   rootr   U  s+       5__&002 s   ')z/healthc                     K   t         rdnd} t        rdnd}dddd| |t        j                         j	                         d	S w)
zDetailed health checkenableddisabledloadedr   healthyr   normalactive)r   uptimememory_usageconnectionsr,   backtesting_enginer   )rR   rV   r   r   r   )cache_statusengine_statuss     r*   health_checkr   ^  sK      !.9:L 2HM  %+__&002 s   ?Az/cache/statsc                  F   K   t         sddiS t        j                         S w)zGet cache statisticsr\   Cache service not available)rR   r,   	get_statsr   ru   r*   cache_statsr   n  s&      677""$$s   !z/cache/cleartypec                    K   t         sddiS | dk(  rt        j                         }n8| dk(  rt        j                         }n| dk(  rt        j                         }nddiS d| |dS w)	zClear cache by typer\   r   rO   backtestallz.Invalid cache type. Use: nba, backtest, or allT)success
cache_typekeys_cleared)rR   r,   clear_nba_cacheclear_backtest_cacheclear_all_cache)r   cleareds     r*   clear_cacher   v  sx      677u}//1		446	//1IJJ  s   A#A%z
/nba/gamesc                    K   	 t        | |      }d|t        |      dS # t        $ r*}t        j	                  d|        t        dd      d}~ww xY ww)zGet NBA games dataTr   r_   countzError fetching NBA games:   zFailed to fetch NBA gamesr<   N)rd   lenr[   rT   r\   r   )r7   r8   gamesrb   s       r*   rS   rS     sd     	Quf-Z
 	

  Q1!564OPPQs$   A A	A%AAAz/nba/playersc                    K   	 t        |       }d|t        |      dS # t        $ r*}t        j	                  d|        t        dd      d}~ww xY ww)zGet NBA players dataTr   zError fetching NBA players: r   zFailed to fetch NBA playersr<   N)rt   r   r[   rT   r\   r   )r7   playersrb   s      r*   rr   rr     sb     	S"5)\
 	

  S3A3784QRRSs$   A A	A%AAAz
/nba/teamsc                     K   	 t               } d| t        |       dS # t        $ r*}t        j	                  d|        t        dd      d}~ww xY ww)zGet NBA teams dataTr   zError fetching NBA teams: r   zFailed to fetch NBA teamsr<   N)r   r   r[   rT   r\   r   )teamsrb   s     r*   r   r     s`     	Q Z
 	

  Q1!564OPPQs$   A A	A%AAAz/strategy/executer   background_tasksc                   K   	 t         j                  d| j                   d       | j                  dk(  r4t        | j                  | j
                  | j                         d{   }n3t        | j                  | j
                  | j                         d{   }d|ddS 7 >7 # t        $ r6}t         j                  d|        t        d	dt        |       
      d}~ww xY ww)zExecute a dynamic strategyz
Executing z	 strategyrO   NT2   )r   ra   execution_time_mszStrategy execution failed: r   r<   )rT   rU   r   execute_nba_strategyr   r   r   execute_financial_strategyr[   r\   r   r   )r   r   ra   rb   s       r*   execute_strategyr     s     \j 0	:; >>U"/0E0Ew~~W^WjWjkkF5g6K6KW^^]d]p]pqqF !#
 	
	 lq  \21#676QRUVWRXQY4Z[[\sM   C)A B' $B#%3B' B%	B' "C)#B' %B' '	C&01C!!C&&C)z/backtest/runc                   K   	 t         j                  d| j                   d| j                          g d}| j                  j	                         }|dv rd}|dv rd}|dk(  rd	}||v rt
        rt         j                  d
|        | j                  j                  dd      }|s| j                  r| j                  }t        j                  || j                  | j                  || j                  xs d      }t        |      }|j                  d      r
ddi|ddiS t        d|j                  dd            t        st        dd      | j                  j                  dd      xsF | j                  j                  dd      xs( t        | j                  j                  dd            dkD  }|rt!        d       t#        t%        j&                               }t)        ||       }|t*        |<   t-        |       t!        d|        |j/                  t0        ||        t!        d        d|d!d"d#d$S 	 | j2                  xs | j4                  }	t        j                  | j                  | j                  | j                  | j                  j                  d%d&      | j6                  |	| j8                  | j:                  | j                  '	      }tA        |tB              rd|v rt        d|d         t        |      }d|d4d5S # t<        $ r}
t         j?                  d(t#        |
              dd)t#        |
       dddd*t#        |
       d+g d,i | j                   d-| j                   i d.t#        |
       t#        |
      g g d/d0id1d2
cY d3}
~
S d3}
~
ww xY w# t        $ r  t<        $ r6}
t         j?                  d6|
        t        d7d6t#        |
             d3}
~
ww xY ww)8zJRun a backtest using UniversalBacktestingEngine or SportsBacktestingEnginezRunning z backtest for )rO   nflmlbnhlcfbcbbmmaufcncaabncaafepl
bundesligalaligaligue1seriea)r   r   r   )r   r   r   r   r   z"Using SportsBacktestingEngine for strategy_description 2025)sportr   r   r   r8   r   Tr   r     r\   zUnknown errorr<   r;    Backtesting engine not available	run_asyncFlarge_dataset	data_filer   z0DEBUG: Creating background job for large datasetz&DEBUG: Adding background task for job z)DEBUG: Background task added successfullyacceptedzPBacktest started in background. Use /backtest/status/{job_id} to check progress.z30-120 seconds)r   r   r   messageestimated_time
min_trades   	r   r   
parametersr  r   r   r   r   r   zBacktest execution failed: Visualization failed: z3Backtest core succeeded, but visualization failed: )total_tradeswin_ratetotal_profitnotez+Backtest completed with visualization error on z5Strategy executed successfully, visualization error: r  zChart generation failed)r\   
price_datatradessummary)
r   r\   resultsr  performance_summaryrisk_metricsequation_summarydetailed_statistics	trade_logchart_visualizationNd   )r   r  r   zBacktest failed: r   )"rT   rU   r   r   lowerSPORTS_ENGINE_AVAILABLEr   rZ   r   r-   run_backtestr8   r   r   rV   r   printr   uuiduuid4r   	job_storer   add_taskrun_backtest_backgroundr   r   r   r   r   r[   r\   r   r   )r   r   sports_marketsmarket_lowerr   ra   run_in_backgroundr   r   walk_forward_datarb   s              r*   r#  r#    s	    FRhw~~.nW=R=R<STU W~~++-?* L?* L5  L>).EKK<\NKL $+>>#5#56Lb#Q 'G,A,A'.'<'<$"//"%33~~%9~~/F +62Fzz)$t (  $FJJwP_<`aa "C8Z[[ NN{E2 9NN69"";34q8 	 DF&Ffg.C #Ifc":6(CD%%&=vwO=?   $m"2 '	 ' < < [@[@['44~~%33">>">>--lB?!++%6$+$?$?#*#=#=%33 5 
FL fd#6(9CwHH 'v. !$
 	
C  	LL6s1vh?@  1#a&:$% !$%QRUVWRXQYZ	 'T "'.'<'<&=T'..AQ$R')TUXYZU[T\] V"$  &(AB	( 	N   R(,-6GAx4PQQRst   O#DN O#DN 3O#5BL 4N O#	NA?N
NN O#NN O *1OO  O#z/strategies/{sport}r  c                    K   t         st        dd      | j                         }t        j                  |      }|st        dd|        ||t        |      dS w)z,Get available betting strategies for a sportr;   zSports engine not availabler<     zNo strategies found for sport: )r  
strategiesr   )r"  r   r!  r-   get_available_strategiesr   )r  sport_lowerr0  s      r*   get_strategiesr3  V  sg      #4QRR++-K77DJ6UV[U\4]^^  Z s   AAz/sports/availablec                  $   K   g d} | t         dS w)z,Get list of available sports for backtesting)rO   r   r   r   r   r   )sportssports_engine_available)r"  )r5  s    r*   get_available_sportsr7  h  s      8F#: s   z/backtest/status/{job_id}c                 h  K   | t         vrt        dd      t         |    }| |j                  |j                  j	                         |j
                  j                  |j
                  j                  d}|j                  r|j                  j	                         |d<   |j                  t        j                  k(  r.|j                  j	                         |d<   |j                  |d<   |S |j                  t        j                  k(  r,|j                  j	                         |d<   |j                  |d<   |S w)	z'Check status of background backtest jobr/  zJob not foundr<   )r   r   r   r   strategyr   r   r  r\   )r'  r   r   r   r   r   r   r   r   r   r   r   ra   r   r\   )r   r   responses      r*   get_backtest_statusr;  q  s     YODD
F
C **nn..0++$$KK--H ~~!$!9!9!;
zzY(((#&#3#3#=#=#? !jj
 O	 
y''	'#&#3#3#=#=#? IIOs   D0D2z/backtest/jobsc                    K   g } t         j                         D ]  \  }}| j                  ||j                  |j                  j
                  |j                  j                  |j                  j                         |j                  r|j                  j                         nd|j                  r|j                  j                         ndd        | t        |       dS w)zList all backtest jobsN)r   r   r   r9  r   r   r   )jobstotal)r'  r   appendr   r   r   r   r   r   r   r   r   )r=  r   r   s      r*   list_backtest_jobsr@    s      D ( 	jjkk((11..2248;#..224D<?<L<LC,,668RV
 		 3t9--s   CCz/rag/add-insightc           	        K   	 | j                  dd      }| j                  di       }| j                  dd      }|st        dd      t        j                  d	|j                  d
d       d|j                  dd              t	        t        j                               |||t        j                         j                         dd}	 ddl
}d} |j                  ||||dd      }|j                  dk(  r
dd|d   ddS t        d|j                   d|j                          dd|j                   |d   ddS # j                  j                   $ r,}t        d|        dd |d   d!t	        |      d"cY d}~S d}~wt"        $ r t        d#       dd$|d   d%dcY S w xY w# t$        $ r?}t        j'                  d&t	        |              t        d'd(t	        |             d}~ww xY ww))zHAdd successful strategy insights to RAG vector store for global learningcontentr  metadatasourceunknownr  zContent is requiredr<   u   🎯 RAG Insight Received: r   z - r9  T)idrB  rC  rD  received_at	processedr   Nz!http://localhost:5000/add-insight)rB  rC  rD     )jsontimeout   z.Insight successfully added to RAG vector storerF  	connected)r   r
  
insight_id
rag_statusu#   ⚠️ RAG service returned status : FzRAG service error: r\   u"   ⚠️ RAG service not available: z7RAG service not available - insight stored locally onlyoffline)r   r
  rN  rO  r\   u9   ⚠️ requests library not available for RAG integrationz6RAG integration unavailable - requests library missingunavailablezRAG insight addition failed: r   zFailed to add RAG insight: )rZ   r   rT   rU   r   r%  r&  r   r   r   requestspostr=   r$  text
exceptionsRequestExceptionr$   r[   r\   )	r   rB  rC  rD  insight_datarS  rag_urlr:  rb   s	            r*   add_rag_insightrZ    s1    E\++i,;;z2.Xy1C8MNN 	1(,,vy2Q1RRUV^VbVbcmoxVyUz{|
 djjl# #??,668
)	9G$x}}W"$ 4 	H ##s*#O".t"4"-	  ;H<P<P;QQST\TaTaSbcd$!4X5I5I4JK".t"4")	  ""33 	6qc:; T*40'Q   	MN S*40+	 	  \4SVH=>6QRUVWRXQY4Z[[\sw   G/CF$ 	7D=  G/;D= <G/=F!!E=7F!8F$ <G/=!F!F$ G/ F!!F$ $	G,-:G''G,,G/c                 .
  K   	 t        d|         t        dt        t        j                                       | t        vrt        d|  d       yt        |    }t        d|         t        j
                  |_        t        j                         |_	        t        j                  d|  d|j                          t        d	       t        |d
d      xs t        |dd      }t        d|j                          t        j!                  |j                  |j"                  |j                  |j                  j%                  dd      |j&                  ||j(                  |j*                  |j,                  	      }t        dt/        |t0              rt        |j                               n
t3        |              |j%                  d|j%                  dg             }|j%                  dddi      }d|v s|j%                  d      s	 t        j4                  j%                  |j                  i       }|rd|v r|r|d   } ||j                  j%                  d      |j&                  |j*                        }	|	rt7        |	      dkD  r~ddl}
t/        |	t              r|
j;                  |	      }n|	}t        j=                  |||j                        }t        j                  d|  dt7        |j%                  dg              d       |j%                  dd      |j%                  dd      |j%                  d d      |j%                  d!d      |j%                  d"d      |j%                  d#d      |j%                  d$d      ||d%|j%                  dd       d&|j%                  dd       d'|j%                  d$d      |j%                  d#d      |j%                  d"d      d(|j"                   d)|j                   |d*d+}tE        |      |_#        t        jH                  |_        t        j                         |_%        t        j                  d,|  d-t7        |       d.       y# t>        $ r6}t        jA                  d|  d|        ddtC        |       i}Y d}~d}~ww xY w# t>        $ rl}t        jM                  d/|  d0tC        |              t        jN                  _        tC        |      |_&        t        j                         |_%        Y d}~yd}~ww xY ww)1zBackground task to run backtestz/DEBUG: run_backtest_background STARTED for job z DEBUG: Available jobs in store: zERROR: Job z not found in job_store!NzDEBUG: Found job in store: u&   🟡 Starting background backtest job z for z!DEBUG: About to call run_backtestr   r   z8DEBUG: Background job calling run_backtest with params: r  r  r  z/DEBUG: run_backtest returned result with keys: 
all_tradesr  r  r\   zVisualization not availablerP   r  r   u1   ✅ Regenerated visualization for background job rP  z trades plottedz6Could not regenerate visualization for background job r  r  r  r  avg_profit_per_tradeprofit_factorsharpe_ratiomax_drawdownzBackground backtest completed: z	 trades, z
% win rate)r`  r_  r^  r  z7Strategy executed successfully in background processing)r  r  r  r]  r^  r_  r`  r  r  r  r  r  r  r  u   ✅ Background backtest job z completed successfully with z trades visualizedu   ❌ Background backtest job z	 failed: )(r$  r   r'  keysr   r   r   r   r   r   rT   rU   r   getattrr   rV   r#  r   rZ   r   r   r   r   r   r   r   rY   r   pandas	DataFrame"_generate_trade_visualization_datar[   rW   r   r   ra   r   r   r\   r   )r   r   r   r-  ra   r  r  market_enginerP   data_sourcepddata_df	viz_errorcomplete_resultrb   s                  r*   r)  r)    s    d-?xHI0inn6F1G0HIJ"Kx'?@A+F845&&
!*<VHE'..IYZ[13 $G-CTJ{gV]_tvzN{HHXYZ $00>>!//~~~~)),;''!2 ' ; ;&99!// 1 

 	?WabhjnWoV[[]@Suy  {A  vB  @C  D  	E L&**Xr*BC$jj)>Jg@hi ))1D1H1H1R[ 2 A A E EgnnVX Y ]m%C"/">K"-**;7))22#K
 #s;'7!';+%k48&(ll;&?G&1G.@.c.c"GW^^/+ &WX^W__abefyf}f}  G  IK  gL  cM  bN  N]  %^  _ #JJ~q9

:q1"JJ~q9$*JJ/Eq$I#ZZ;"JJ~q9"JJ~q9#6%DVZZP^`aEbDcclmsmwmw  yC  EF  nG  mH  HR  $S &

>1 = &

>1 =!'OQ!?
 $+#8#8"9gnn=M N#)R%
* +?;
((
#??,26(:WX[\bXcWddvwx=  [!WX^W__abkalmn'.2HYHX0Y&Z#[@  -3F89SVHMN%%
F	#??,	-si   TAR TF2R C<Q ER T	R$+RR RR 	T&A"TTTTcoder   r   c           	      t  K   t         st        d      	 dt         j                  v r[t         j                  d   }t        t         d      r8t         j	                         } |d   | |      }t         j                  ||      }|S ddddd	d
dddgdS # t        $ r}t        dt        |             d}~ww xY ww)z:Execute NBA strategy code using UniversalBacktestingEnginer  rO   _get_nba_dynamic_engineexecute   iX  g?001	moneylinerD   gffffff?rL  )rE   bet_type
prediction
confidencestake)bets_generatedtotal_stakeexpected_valuerecommended_betszNBA strategy execution failed: N)rV   r[   rY   r#   rn  _calculate_nba_backtest_resultsr   )rl  r   r   
nba_enginedynamic_enginebetsr  rb   s           r*   r   r   P  s     :;;D&555+::5AJ)+DE!3!K!K!M0~i0v>,LLTSYZ  "  % +"("& !	
 	
  D9#a&BCCDs5   B8A,B B8B B8	B5B00B55B8c           
         K   t         st        d      	 dddddddd	d
dgdS # t        $ r}t        dt        |             d}~ww xY ww)zExecute financial strategy coder        gףp=
?g      ?z2024-01-15T10:00:00ZAAPLBUYg      ?g     0g@)r   symbolactionru  entry_price)signals_generatedr  r  r^  recommended_signalsz%Financial strategy execution failed: N)rV   r[   r   )rl  r   r   rb   s       r*   r   r   q  sx     :;;J "$  "8$#"&#)$
 	
  J?AxHIIJs$   A$ A	A	AA		A__main__zmain:appz0.0.0.0i@  rU   )hostportreload	log_level)r   rA   )r   )r   )[__doc__fastapir   r   r   fastapi.middleware.corsr   pydanticr   typingr   r	   r
   r   rJ  asynciologgingsysosr%  r   rS  r$   getenvr!  r   r   r$  pathr?  dirnameabspath__file__basicConfigINFO	getLoggerr   rT   r   universal_backtestingr+   rV   rU   rb   r\   r,   r   rR   rW   sports_backtestingr-   r.   r"  appadd_middlewarer   r   rd   rt   r   r   r   r'  r   r   r   r   r   r   rZ   r   r   r   deleter   rS   rr   r   rT  r   r#  r3  r7  r;  r@  rZ  r)  r   r   uvicornrunr   ru   r*   <module>r     s  
 < ; 2  , ,    
 	  
 "))-w7==?6I"))-v6<<>&H?	
>?	/_	R\/]
^_ 0I JK L   ',, '			8	$<@35
KKDE
+!))M56MN$I"
KKCD 
'H   *,CD%%  P# PS Pd C  D)V1i 1/i / 	 	 	{ t ; 4 s x~      % % NC  ( Qs Q# Q Q S S S Q Q 
\O \ \ \* /HR HR? HR HRT 	   " 	  	$%c  &6 	. .  
G\4S> G\ G\Rf-# f- f-PDS D$sCx. DxX\]`be]eXfOg DBJ3 JS#X JU]^bcfhkck^lUm J4 zGKK o  Hj  
LLDQCHI  
LL7s;<MM  $
LLCA3GHM#$sZ   O6 P $7P- Q 6P PP*	P%%P*-Q2QQR Q;;R 