
    !\i                         d Z ddlmZ ddlmZmZ ddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZmZ  ej6                  e      Z G d de	      Zy)zBacktest agent    )Session)datetime	timedeltaN)	BaseAgent)MatchRepository)ModelRepository)MatchStatus)Feature)MatchPredictorprepare_target)FeatureBuilder)log_lossbrier_score_lossaccuracy_scorec                   p     e Zd ZdZdef fdZdefdZdej                  dej                  de
fdZ xZS )	BacktestAgentzAgent for backtesting modelsdbc                     t         |   |d       t        |      | _        t	        |      | _        t        |      | _        y )Nr   )super__init__r   
match_repor   
model_repor   feature_builder)selfr   	__class__s     !/app/app/agents/backtest_agent.pyr   zBacktestAgent.__init__   s7    _-)"-)"--b1    returnc           	         | j                         }	 | j                  j                         }|s+d}t        j	                  |       | j                  d|       y	 t        j                  |j                        }t        j                         t        d      z
  }t        j                         t        d      z
  }| j                  j                  ||d	
      }t        j!                  dt#        |       d       |D 	cg c]  }	|	j$                   }
}	| j&                  j)                  t*              j-                  t*        j.                  j1                  |
            j3                         }|D ci c]  }|j.                  | }}g }g }g }g }|D ]  }|j$                  |vr|j4                  |j6                  +||j$                     }| j8                  j;                  |      }|j=                  |       |j=                  t?        |             tA        jB                  |g      }|jE                  |      d   }|j=                  |       |j=                  tA        jF                  |              t#        |      dk(  r+d}t        j	                  |       | j                  d|       ytA        jB                  |      }tA        jB                  |      }tA        jB                  |      }tA        jB                  |      }tI        tK        ||            }tI        tM        ||            }tI        tO        |dk(  |dddf               }| jQ                  ||      }||||t#        |      d}t        j!                  d|        d|dd|dd|dd|dd	}| j                  d|       y# t        $ r7}d| }t        j                  |       | j                  d|       Y d}~yd}~ww xY wc c}	w c c}w # t        $ rB}tS        |      }t        j                  d| d       | j                  d|       Y d}~yd}~ww xY w)zRun backtestzNo active model foundF)successerrorzFailed to load model: NZ   )days   i  )	from_dateto_datelimitzBacktesting on z matchesr   z(No matches with features for backtesting)accuracyloglossbrierroi_simulationmatches_testedzBacktest results: zBacktest Results:
Accuracy: z.4fz

LogLoss: z
Brier: z
ROI Simulation: z.2f%T)r    logszBacktest failed: )exc_info)*	start_runr   
get_latestloggerwarning
finish_runr   loadartifact_path	Exceptionr!   r   nowr   r   get_finishedinfolenidr   queryr
   filtermatch_idin_all
home_score
away_scorer   build_feature_vectorappendr   nparraypredict_probaargmaxfloatr   r   r   _simulate_roistr)r   run_idmodel_record	error_msg	predictorer%   r&   matchesm	match_idsfeaturesffeature_dictXypredictionsprobabilities_listmatchfeaturefeature_vectorX_singleprobaprobabilitiesr(   r)   r*   r+   resultsr.   s                                 r   runzBacktestAgent.run   s   !e	??557L3	y)Y?*//0J0JK	 !);;Illnya'88Goo22# 3 G KK/#g,x@A (//w!wI/ww}}W-44  $$Y/ce  4<<8aAJJM8L< AAK!# 88</##+u/?/?/G&uxx0!%!5!5!J!J7!S(./ 88^$45!//9!<"))%0""299U#34 !" 1v{F	y)Y?AA((;/KHH%78M ^A{;<HHQ67G*16=A3FGHE "//=AN %""0"%a&G KK,WI67 38C.GTW=Xabghkall~  @N  OR  S  ST  UDOODtO4g  4QC8	Y'Y?	& 0
 =z  	AILL,YK84LHOOEO;		sd   AO7 N* 9BO7 ?O-AO7 1O2D%O7 +C>O7 *	O*3-O% O7 %O**O7 7	Q 8P==Qy_truey_probac                     d}d}t        t        |            D ]@  }t        j                  ||         }||   |   }|dkD  s)d}||z  }|||   k(  s9||dz  z  }B |dk(  ry||z
  |z  dz  }	|	S )z.Simple ROI simulation (for demonstration only)g        g?g      ?g      @r   d   )ranger;   rF   rI   )
r   rd   re   	total_bettotal_returni	predicted
confidence
bet_amountrois
             r   rK   zBacktestAgent._simulate_roi   s     	s6{#A		'!*-I I.JC 
Z'	 q	) J$44L $ >y(I5<
r   )__name__
__module____qualname____doc__r   r   boolrc   rF   ndarrayrJ   rK   __classcell__)r   s   @r   r   r      sC    &27 2iT iVBJJ   r   r   )rs   sqlalchemy.ormr   r   r   loggingnumpyrF   app.agents.baser   )app.core.db.repositories.match_repositoryr   )app.core.db.repositories.model_repositoryr   app.core.db.models.matchr	   app.core.db.models.featurer
   app.ml.modelsr   r   app.ml.featuresr   sklearn.metricsr   r   r   	getLoggerrp   r2   r    r   r   <module>r      sO     " (   % E E 0 . 8 * F F			8	$LI Lr   