
    ^i              	       L	   S r SSKJrJrJr  SSKJr  SSKJr  SSK	J
r
JrJrJr  SSKrSSKrSSKrSSKrSSKrSSKrSSKJr   SSKr\R.                  " SS	5      R1                  5       S
:H  r\R.                  " SS
5      R1                  5       S
:H  r\(       a  \(       d	  \" S5        O\" S\(       a  SOS 35        \R8                  R;                  \R8                  R=                  \R8                  R=                  \R8                  R?                  \ 5      5      5      5        \RB                  " \RD                  S9  \RF                  " \$5      r%S r& SSK'J(r(  \(" 5       r)\%RU                  S5         SSK-J-r-  \-R\                  r/\/(       a  \%RU                  S5        O\%Ra                  S5          SSK1J2r2J3r3  Sr4\%RU                  S5        \" SSS S!9r5\5Rm                  \S"S#/SS$/S$/S%9  SeS&\7S'\84S( jjr9SfS&\74S) jjr:S* r; " S+ S,\5      r< " S- S.\5      r=0 r> " S/ S05      r? " S1 S25      r@S3\@S4\
4S5 jrAS3\@S4\B4S6 jrCS7\8S4\\
   4S8 jrD\5R                  S95      S: 5       rF\5R                  S;5      S< 5       rG\5R                  S=5      S> 5       rH\5R                  S?5      SgS@\84SA jj5       rJ\5R                  SB5      SeS&\7S'\84SC jj5       rK\5R                  SD5      SfS&\74SE jj5       rL\5R                  SF5      SG 5       rM\5R                  SH5      SI\<SJ\4SK j5       rO\5R                  SL5      SI\=SJ\4SM j5       rP\5R                  SN5      SO\84SP j5       rQ\5R                  SQ5      SR 5       rR\5R                  SS5      S7\84ST j5       rS\5R                  SU5      SV 5       rT\5R                  SW5      SI\
\8\4   4SX j5       rUS7\8SI\=4SY jrVSZ\8S[\
\8\4   S\\\
\8\4      4S] jrWSZ\8S[\
\8\4   S\\\
\8\4      4S^ jrX\$S_:X  a  SSKYrY\YR                  " S`SaSbSScSd9  gg! \ a    Sr GNf = f! \ a!  r+\%RY                  S\+ 35        Sr) Sr+C+GNSr+C+ff = f! \ a#  r+\%RY                  S\+ 35        Sr-Sr/ Sr+C+GNSr+C+ff = f! \ a#  r+\%RY                  S\+ 35        Sr2Sr4 Sr+C+GNSr+C+ff = f)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                 :   [        U [        5      (       a/  U R                  5        VVs0 s H  u  pU[        U5      _M     snn$ [        U [        5      (       a  U  Vs/ s H  n[        U5      PM     sn$ [        U [
        5      (       a/  U [        S5      :X  d  U [        S5      :X  d  X :w  a
  U S:  a  S$ S$ U $  SSKn[        XR                  5      (       a  [        U 5      $ [        XR                  5      (       a5  [        U 5      nU[        S5      :X  d  U[        S5      :X  a
  US:  a  S$ S$ U$ [        XR                  5      (       a  U R                  5       $ [        U S5      (       a  U R                  5       $  U $ s  snnf s  snf ! [         a     U $ f = f)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         I/home/hazypiff/Work/eventheodds/eventheodds_backup/python_service/main.pyr   r   '   sd   #t8;		D(++DD	C		8;<%d+<<	C		%,#v"63: 1W61'1
	#zz**3xC--Cj%,&#v*>%(1W69'9
C,,zz|#f%%xxz! & 
1 E<(  	
	s<   FF;(F $A
F /F 1F 3)F  F 
FF)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           	         [         (       a;  [        R                  " X5      nU(       a  [        R	                  SU SU  S35        U$ [
        (       dd  [        (       a  [        (       d
  [        SSS9e[        R                  S5        SS	S
SSSSSS./n[         (       a  [        R                  " X1U SS9  U$  S[
        R                  ;   a  [
        R                  S   S   nU" SS5      n[        U[        5      (       at  U(       a(  U Vs/ s H  ofR                  S5      U:X  d  M  UPM     nnUSU  n[         (       a3  [        R                  " XqU 5        [        R	                  SU SU  S35        U$ [        (       a  [        (       d
  [        SSS9eSS	S
SSSSSS./n	[         (       a  [        R                  " XU SS9  U	$ s  snf ! [         a"  n[        R!                  SU 35         SnAN{SnAff = f)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 &"")#!! 	
	 =''	5AN6&555,;;EB=QKtV,D$%%-1RTTXXh5G65QDTDRfu !=!//FKK"FvhiX]W^^_ `a
 R
 	
 &%		
M }##M5ANI S  604556s2   7AG 
G&G,AG G 
G3G..G3c           	      6   [         (       a8  [        R                  " U 5      nU(       a  [        R	                  SU  S35        U$ SSSSSSS	S
.S.SSSSSSSS
.S./SU  n[         (       a/  [        R
                  " X 5        [        R	                  SU  S35        U$ )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                      [         (       a3  [        R                  " 5       n U (       a  [        R	                  S5        U $ SSSSS.SSS	SS.S
SSSS.SSSSS./n[         (       a*  [        R
                  " USS9  [        R	                  S5        U$ )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                   j    \ rS rSr% \\S'   Sr\\S'   Sr\\	\\
4      \S'   Sr\\	\\
4      \S'   Srg)	StrategyRequesti  strategy_coderO   marketNparamstime_period )__name__
__module____qualname____firstlineno__str__annotations__r   r   r   r   r
   r   __static_attributes__r   ru   r*   r   r     s@    FC'+FHT#s(^$+,0K$sCx.)0ru   r   c                      \ rS rSr% Sr\\   \S'   \\S'   \\S'   \\\	4   \S'   Sr
\\\\	4      \S'   Sr\\   \S'   S	r\\   \S
'   Sr\\\\	4      \S'   Sr\\\\	4      \S'   Sr\\\\	4      \S'   Sr\\   \S'   Srg)BacktestRequesti  Nr8   strategy_namer   r   r   r   1hour	timeframewalk_forward_configwalk_forward_periodsoptimization_configFuse_intrabar_ticksr   )r   r   r   r   r8   r   r   r   r   r
   r   r   r   r   r   r   r   boolr   r   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                   $    \ rS rSrSrSrSrSrSrg)	JobStatusi)  pendingrunning	completedfailedr   N)	r   r   r   r   PENDINGRUNNING	COMPLETEDFAILEDr   r   ru   r*   r   r   )  s    GGIFru   r   c                   &    \ rS rSrS\S\4S jrSrg)BacktestJobi/  job_idrequestc                     Xl         X l        [        R                  U l        [
        R                  " 5       U l        S U l        S U l	        S U l
        S U l        g )N)r   r   r   r   statusr   utcnow
created_at
started_atcompleted_atra   r\   )selfr   r   s      r*   __init__BacktestJob.__init__0  sD    ''"//+ 
ru   )r   r   r\   r   r   ra   r   r   N)r   r   r   r   r   r   r   r   r   ru   r*   r   r   /  s    s _ ru   r   jobreturnc           
         U R                   U R                  U R                  (       a  U R                  R                  5       OSU R                  (       a  U R                  R                  5       OSU R
                  (       a  U R
                  R                  5       OSU R                  U R                  U R                  R                  U R                  R                  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                     [         (       a4  [        (       a)  [         R                  " U R                  [	        U 5      SS9$ g)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                 \    [         (       a!  [        (       a  [         R                  " U 5      $ g)zGet job from RedisN)r,   rR   get_job)r   s    r*   get_job_from_redisr   O  s    }$$V,,ru   /c                  X   #    SS[         R                  " 5       R                  5       S.$ 7f)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                     #    [         (       a  SOSn [        (       a  SOSnSSSSU U[        R                  " 5       R	                  5       S	.$ 7f)
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   ^  sO      !.9:L 2 2HM  %+__&002 s   A
Az/cache/statsc                  R   #    [         (       d  SS0$ [        R                  " 5       $ 7f)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                    #    [         (       d  SS0$ U S:X  a  [        R                  " 5       nO<U S:X  a  [        R                  " 5       nO U S:X  a  [        R                  " 5       nOSS0$ SU US.$ 7f)	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  sy      =677u}//1		446	//1IJJ  s   A.A0z
/nba/gamesc                    #     [        X5      nSU[        U5      S.$ ! [         a'  n[        R	                  SU 35        [        SSS9eSnAff = f7f)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     sa     	Qu-Z
 	

  Q1!564OPPQ$   A A
A"A

AAz/nba/playersc                    #     [        U 5      nSU[        U5      S.$ ! [         a'  n[        R	                  SU 35        [        SSS9eSnAff = f7f)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     sa     	S"5)\
 	

  S3A3784QRRSr   z
/nba/teamsc                     #     [        5       n SU [        U 5      S.$ ! [         a'  n[        R	                  SU 35        [        SSS9eSnAff = f7f)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                   #     [         R                  SU R                   S35        U R                  S:X  a4  [        U R                  U R
                  U R                  5      I Sh  vN nO3[        U R                  U R
                  U R                  5      I Sh  vN nSUSS.$  N> N! [         a3  n[         R                  SU 35        [        S	S[        U5       3S
9eSnAff = f7f)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%2.C  C%%C(z/backtest/runc                 *  #     [         R                  SU R                   SU R                   35        / SQnU R                  R	                  5       nUS;   a  SnUS;   a  SnUS:X  a  S	nX2;   a  [
        (       a  [         R                  S
U 35        U R                  R                  SS5      nU(       d  U R                  (       a  U R                  n[        R                  " UU R                  U R                  UU R                  =(       d    SS9n[        U5      nUR                  S5      (       a
  SS0UESS0E$ [        SUR                  SS5      S9e[        (       d
  [        SSS9eU R                  R                  SS5      =(       dK    U R                  R                  SS5      =(       d(    [        U R                  R                  SS5      5      S:  nU(       a  [!        S5        [#        [$        R&                  " 5       5      n[)        Xp5      nU[*        U'   [-        U5        [!        SU 35        UR/                  [0        Xp5        [!        S 5        SUS!S"S#S$.$  U R2                  =(       d    U R4                  n	[        R                  U R                  U R                  U R                  U R                  R                  S%S&5      U R6                  U	U R8                  U R:                  U R                  S'9	n[A        U[B        5      (       a  SU;   a  [        SUS   S9e[        U5      nSUS4S5.$ ! [<         a  n
[         R?                  S([#        U
5       35        SS)[#        U
5       3SSSS*[#        U
5       3S+./ S,0 U R                   S-U R                   30 S.[#        U
5       3[#        U
5      / / S/S00S1.S2.
s S3n
A
$ S3n
A
ff = f! [         a    e [<         a3  n
[         R?                  S6U
 35        [        S7S6[#        U
5       3S9eS3n
A
ff = f7f)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.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f.C #Ifc":6(CD%%&=v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   PD6O	 :P;D"O	 PBL2 98O	 1P2
O<A?O;O<O	  POO	 	P.PPPz/strategies/{sport}r  c                    #    [         (       d
  [        SSS9eU R                  5       n[        R                  " U5      nU(       d  [        SSU  3S9eUU[        U5      S.$ 7f)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_lowerr4  s      r*   get_strategiesr7  V  si      #"4QRR++-K77DJ6UV[U\4]^^  Z s   AA!z/sports/availablec                  $   #    / SQn U [         S.$ 7f)z,Get list of available sports for backtesting)rO   r   r   r   r   r   )sportssports_engine_available)r&  )r9  s    r*   get_available_sportsr;  h  s      8F#: s   z/backtest/status/{job_id}c                 t  #    U [         ;  a
  [        SSS9e[         U    nU UR                  UR                  R	                  5       UR
                  R                  UR
                  R                  S.nUR                  (       a  UR                  R	                  5       US'   UR                  [        R                  :X  a.  UR                  R	                  5       US'   UR                  US'   U$ UR                  [        R                  :X  a,  UR                  R	                  5       US'   UR                  US'   U$ 7f)	z'Check status of background backtest jobr3  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   D6D8z/backtest/jobsc                    #    / n [         R                  5        H  u  pU R                  UUR                  UR                  R
                  UR                  R                  UR                  R                  5       UR                  (       a  UR                  R                  5       OSUR                  (       a  UR                  R                  5       OSS.5        M     U [        U 5      S.$ 7f)zList all backtest jobsN)r   r   r   r=  r   r   r   )jobstotal)r+  r   appendr   r   r   r   r   r   r   r   r   )rA  r   r   s      r*   list_backtest_jobsrD    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           	        #     U R                  SS5      nU R                  S0 5      nU R                  SS5      nU(       d
  [        SSS9e[        R                  S	UR                  S
S5       SUR                  SS5       35        [	        [
        R                  " 5       5      UUU[        R                  " 5       R                  5       SS.n SSK
nSnUR                  " UUUUS.SS9nUR                  S:X  a
  SSUS   SS.$ [        SUR                   SUR                   35        SSUR                   3US   SS.$ ! WR                  R                    a,  n[        SU 35        SS US   S![	        U5      S".s SnA$ SnAf["         a    [        S#5        SS$US   S%S.s $ f = f! [$         a<  n[        R'                  S&[	        U5       35        [        S'S([	        U5       3S9eSnAff = f7f))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 - r=  T)idrF  rG  rH  received_at	processedr   Nz!http://localhost:5000/add-insight)rF  rG  rH     )jsontimeout   z.Insight successfully added to RAG vector storerJ  	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  rR  rS  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   rF  rG  rH  insight_datarW  rag_urlr>  rb   s	            r*   add_rag_insightr^    s.    E\++i,;;z2.Xy1C8MNN 	1(,,vy2Q1RRUV^VbVbcmoxVyUz{|
 djjl# #??,668
)	9G}}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   G1CF( 5D? G1;D? >G1?F%!F :F%;F( ?G1 "F%"F( #G1$F%%F( (
G.27G))G..G1c                 
  #     [        SU  35        [        S[        [        R                  5       5       35        U [        ;  a  [        SU  S35        g[        U    n[        SU  35        [        R
                  Ul        [        R                  " 5       Ul	        [        R                  SU  SUR                   35        [        S	5        [        US
S5      =(       d    [        USS5      n[        SUR                   35        [        R!                  UR                  UR"                  UR                  UR                  R%                  SS5      UR&                  UUR(                  UR*                  UR,                  S9	n[        S[/        U[0        5      (       a  [        UR                  5       5      O
[3        U5       35        UR%                  SUR%                  S/ 5      5      nUR%                  SSS05      nSU;   d  UR%                  S5      (       Gd   [        R4                  R%                  UR                  0 5      nU(       a  SU;   a  U(       a  US   nU" UR                  R%                  S5      UR&                  UR*                  5      n	U	(       a  [7        U	5      S:  a  SSKn
[/        U	[        5      (       a  U
R;                  U	5      nOU	n[        R=                  X[UR                  5      n[        R                  SU  S[7        UR%                  S/ 5      5       S35        UR%                  SS5      UR%                  SS5      UR%                  S S5      UR%                  S!S5      UR%                  S"S5      UR%                  S#S5      UR%                  S$S5      UUS%UR%                  SS5       S&UR%                  SS5       S'3UR%                  S$S5      UR%                  S#S5      UR%                  S"S5      S(.UR"                   S)UR                   3US*S+.n[E        U5      Ul#        [        RH                  Ul        [        R                  " 5       Ul%        [        R                  S,U  S-[7        U5       S.35        g! [>         a6  n[        RA                  SU  SU 35        SS[C        U5       30n SnAGNSnAff = f! [>         am  n[        RM                  S/U  S0[C        U5       35        [        RN                  Wl        [C        U5      Ul&        [        R                  " 5       Ul%         SnAgSnAff = f7f)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 rT  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)rd  rc  rb  r  z7Strategy executed successfully in background processing)r  r  r  ra  rb  rc  rd  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   r1  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 

 	?WabhjnWoWoV[[]@Suy  {A  vB  @C  D  	E L&**Xr*BC$jj)>Jg@hi ))1D1H1H1R1R[ 2 A A E EgnnVX Y ]m%C"/">K"-**;7))22#K
 #s;'7!';+%k488&(ll;&?G&1G.@.c.c"W^^/+ &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   UAS UGS DR *ES U
S+R?9S ?SS 
T>A#T94U9T>>Ucoder   r   c           	        #    [         (       d  [        S5      e S[         R                  ;   a^  [         R                  S   n[        [         S5      (       a6  [         R	                  5       nUS   " X5      n[         R                  XQ5      nU$ SSSSS	S
SSS./S.$ ! [         a  n[        S[        U5       35      eSnAff = f7f)z:Execute NBA strategy code using UniversalBacktestingEnginer	  rO   _get_nba_dynamic_engineexecute   iX  g?001	moneylinerD   gffffff?rP  )rE   bet_type
prediction
confidencestake)bets_generatedtotal_stakeexpected_valuerecommended_betszNBA strategy execution failed: N)rV   r[   rY   r#   rr  _calculate_nba_backtest_resultsr   )rp  r   r   
nba_enginedynamic_enginebetsr  rb   s           r*   r   r   P  s     :;;D&555+::5AJ)+DEE!3!K!K!M%i0>,LLTZ  "  % +"("& !	
 	
  D9#a&BCCDs5   CA1B CB C
C $B;;C  Cc           
         #    [         (       d  [        S5      e SSSSSSSS	S
S./S.$ ! [         a  n[        S[        U5       35      eSnAff = f7f)zExecute financial strategy coder	        gףp=
?g      ?z2024-01-15T10:00:00ZAAPLBUYg      ?g     0g@)r   symbolactionry  entry_price)signals_generatedr  r  rb  recommended_signalsz%Financial strategy execution failed: N)rV   r[   r   )rp  r   r   rb   s       r*   r   r   q  sz     :;;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   rN  asynciologgingsysosr)  r   rW  r$   getenvr%  r   r   r(  pathrC  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   rX  r   r'  r7  r;  r?  rD  r^  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KK o  Hj  
LLDQCHI  
LL7s;<MM  $
LLCA3GHM#$s`   P P$ 0*Q Q .Q: P! P!$Q*QQQ7Q22Q7:R# RR#