
    \j                     P   S r SSKrSSKrSSKJr  SSKrSSKrSSK	r	SSK
r
SSKJrJrJrJrJrJr  \" \5      R'                  5       R(                  R(                  r\S-  S-  S-  r\S-  S-  S-  rS	\R0                  4S
 jrS	\4S jr\S:X  a  \R:                  " \" 5       5        gg)u  
Test "quote di apertura": il modello aggiunge valore rispetto alle quote
PRE-MATCH (quelle a cui si può realmente scommettere in anticipo)?

Il blend contro le quote di chiusura ha dato peso 0: il mercato a fine corsa
sa già tutto quello che sa il modello. Ma chi scommette non gioca alle quote
di chiusura: gioca a quelle disponibili giorni/ore prima. Qui misuriamo:

  1. quanto le quote pre-match sono più "deboli" di quelle di chiusura
  2. se blend(modello + pre-match) batte le pre-match da sole
  3. quanto del divario pre-match -> chiusura il modello riesce a colmare

Protocollo identico a blend.py: peso appreso sul train (2024/25), valutazione
out-of-sample sul test (2025/26), bootstrap a coppie per la significatività.

Uso:
    python scripts/blend_opening.py
    N)Path)RESULT_INDEXbootstrap_diff
fit_weightgeometric_blendlogloss	normalizedata	processedzbacktest_base.csvzbacktest_blend_opening.csvreturnc                    [         R                  " U R                  U R                  U R                  U R
                  SS9nUR                  5       nUR                  S5        [        R                  " UR                  5       / SQS9nUR                  5         [        R                  " US   5      US'   [        R                  " [        R                  UR                  / SQS9nS	 H  u  pVn[        R                   " X5   S
S9n[        R                   " X6   S
S9n	[        R                   " X7   S
S9n
UR#                  S5      U	R#                  S5      -  U
R#                  S5      -  US   R%                  5       -  nSU-  SU	-  -   SU
-  -   nSU-  U-  U   UR&                  US4'   SU	-  U-  U   UR&                  US4'   SU
-  U-  U   UR&                  US4'   M     [        R(                  " U/ SQ   U/SS9$ )uR   Probabilità implicite dalle quote pre-match (priorità: media > Pinnacle > B365).	tigertips)hostportuserpassworddatabaseaO  
        SELECT m.match_date, h.name, a.name,
               m.avg_home, m.avg_draw, m.avg_away,
               m.pinnacle_home, m.pinnacle_draw, m.pinnacle_away,
               m.b365_home, m.b365_draw, m.b365_away
        FROM matches m
        JOIN teams h ON h.id = m.home_team_id
        JOIN teams a ON a.id = m.away_team_id
    )datehomeawayavg_havg_davg_aps_hps_dps_ab365_hb365_db365_a)columnsr   open_hopen_dopen_a)indexr    ))r   r   r   )r   r   r   )r   r   r   coerce)errors   r"   r#   r$   r   r   r   )axis)pymysqlconnectr   r   r   r   cursorexecutepd	DataFramefetchallcloseto_datetimenpnanr%   
to_numericgtisnalocconcat)argsconncurdfprobhdaohodoavalid	overrounds                0C:\wamp64\www\Tigertips\scripts\blend_opening.pyload_prematch_probsrI   &   s   ??						$(MMKID
++-CKK  	 
clln /Y 
ZB 	JJL6
+BvJ<<bhh8VWD4a ]]252]]252]]252a2558#beeAh.h1D1D1FFFQVOa"f,	%&Vi%7$?!%&Vi%7$?!%&Vi%7$?!4 99b12D9BB    c                     [         R                  " SS9n U R                  SSS/S9  U R                  SSS/S9  [        R                  " U 5        U R                  5       n[        R                  " [        S	/S
9n[        U5      nUR                  U/ SQSS9nUR                  / SQS9nX"S   R                  UR                  5         nX"S   R                  UR                  5         n[        S[!        U5       SUR                   S[!        U5       SUR                   35        S nU" U5      u  pxpU" U5      u  pp[#        [$        XxU
5      n[        SUS 35        [%        XU5      n['        X5      n['        X5      n['        UU5      n['        X5      n[        SUR                   S[!        U5       S35        [        SS SS 35        [        SS US 35        [        S S US 35        [        S!S US 35        [        S"S US 35        [)        UX5      u  nnnUS#:  a  S$O	US#:  a  S%OS&n[        S'US( S)US( S*US( S+U 35        UU-
  nUU-
  nUS#:  a  [        S,US- S.US- SUU-  S/ S035        [        S15        UR+                  5       nUU/ S2Q'   UR-                  S35       H  u  nnUS4   R/                  [0        5      R3                  5       n['        U/ S2Q   R3                  5       U5      n['        U/ S5Q   R3                  5       U5      n[        S6US7 S8US- S9US- S:UU-
  S( 35        M     UR5                  [6        S;S<9  [        S=[6         35        g#)>NzBlend modello + quote pre-match)descriptionz--train-seasons+z2024/25)nargsdefaultz--test-seasonsz2025/26r   )parse_datesr)   left)onhow)mkt_hmkt_dmkt_ar"   r#   r$   )subsetseasonzTrain: z	 partite z	 | Test: c                     U / SQ   R                  5       U / SQ   R                  5       U / SQ   R                  5       U S   R                  [        5      R                  5       4$ )N)model_hmodel_dmodel_ar!   )rT   rU   rV   result)to_numpymapr   )r>   s    rH   unpackmain.<locals>.unpack[   s]    45>>@12;;=./88:8  .779; 	;rJ   z-Peso modello vs quote pre-match (train): w = z.3fz

=== Test z (z partite) === z<26zlog lossz>10zMercato closingz>10.4fzMercato pre-matchz
Modello DCzBlend modello+pre-matchr   z!il blend BATTE le quote pre-matchz#le quote pre-match battono il blendzdifferenza NON significativaz#
Delta log loss blend - pre-match: z+.4fz
 [IC 95%: z, z]  ->  zDivario pre-match -> closing: z.4fz; il modello ne colma z.0%)z%
Per lega (test, blend vs pre-match):)blend_hblend_dblend_aleaguer]   r!   z  z<5z blend z   pre-match z   gap F)r%   z
Salvato in: )argparseArgumentParseradd_argumentconfigadd_db_args
parse_argsr/   read_csvBT_PATHrI   mergedropnaisintrain_seasonstest_seasonsprintlenr   r   r   r   copygroupbyr_   r   r^   to_csvOUT_PATH) parserr;   btprematchtraintestr`   pm_trpo_tr_y_trpm_tepo_tepc_tey_tewp_blendll_openll_closell_blendll_model	mean_difflohiverdict	gap_total
gap_closedlggrpyll_bll_os                                    rH   mainr   J   s   $$1RSF
)ykJ
(i[I
vD	W6(	3B"4(H	(7V	DB	S	TB(|  !3!345El 1 123D	GCJ<y););(< =t9+Yt'8'8&9; <; #5ME! &tE% 	?E$7A	9!C
ABeA.Ge"Gu#Hw%Hu#H	K))*"SYK}
EF	RHZ$
%&	s#HV#4
56	 %gf%5
67	\#x/
01	&s+HV+<
=>&w<Ir2681f28:Q4-  
040@ AYbD		; < ("I8#J1}.yo >%%/$4BzI7Mc6RRSU 	V 

2399;D.5D	*+<<)CMl+446s<=FFH!Ls9:CCEqI2b'c
-SzPTUYHZ[\	 * 	KKK&	N8*
%&rJ   __main__)__doc__rh   syspathlibr   numpyr4   pandasr/   r+   rk   blendr   r   r   r   r   r	   __file__resolveparentPROJECT_ROOTro   rz   r0   rI   intr   __name__exit rJ   rH   <module>r      s   &  
     ' ' H~%%'..55

+
-0C
C& ;.1MM!C !CHCc CL zHHTV rJ   