o
    Ji+                     @   sr   d dl Z d dlZd dlZd dlZd dlZdZi ZdddddZ	dd	d
dddZ
dd Zdd Zdd Zdd ZdS )    Nz-/var/www/html/backtestingmarket/resultadosNewConservador
IntermedioAgresivozUltra AgresivoconsinteagreultrSPXXSPSPYQQQRUT)r
   r   r   r   r   c              
   C   sD   t jtd|  d| d| d}t|}|sdS t|t jjdS )u6   Busca el CSV más reciente para una combinación dada.P&L__z	_MULTI_*_z	_CT_0.csvNkey)ospathjoinDIRECTORIO_RESULTADOSglobmaxgetmtime)
estrategiasymbolriesgopatronarchivos r   -/var/www/html/backtestingmarket/combinadas.py_buscar_csv!   s   
r!   c                     sV  t jtd} t| }g }|D ]}t j|}|ddd}zk|d }|d }td||}|rt j	|rt
|| dt|| }	|d	 }
|d
 }|
dd  d|
dd	  d|
d	d  }|dd  d|dd	  d|d	d  }||||	||t||d W q ttfy   Y qw ddddd |j fddd |S )z
    Lee /resultadosNew/ y devuelve las combinaciones disponibles
    donde existen AMBOS csvs (Vertical + IronCondor).
    Retorna lista de dicts: [{symbol, riesgo, label}, ...]
    zP&L_Vertical_*_MULTI_*_CT_0.csvr    r      
IronCondoru    —       N   /)r   r   labeldesdehastariesgo_labelr         r   c                    s   | d   | d dfS )Nr   r   c   )getxorden_riesgor   r    <lambda>U   s    z/get_combinaciones_disponibles.<locals>.<lambda>r   )r   r   r   r   r   basenamereplacesplitr!   existsSYMBOL_LABELSr1   RIESGO_LABELSappend
IndexError	Exceptionsort)r   
archivos_vcombinaciones	archivo_vnombrepartesr   r   
archivo_icr*   	desde_str	hasta_str	desde_fmt	hasta_fmtr   r4   r    get_combinaciones_disponibles.   s>   
,,
rK   c                 C   s>   t d| |}t d| |}|r|sdS ttj|tj|S )z-Retorna el max mtime de los dos CSVs del par.Verticalr%   N)r!   r   r   r   r   )r   r   csv_vcsv_icr   r   r    _get_mtime_pairY   s
   rO   c           1         s  |  d| }t | |}|du rdS |tv r$t| }|d |kr$|d S td| |}td| |}t|}t|}tj|d dd	|d< tj|d
 dd	|d< tj|d dd	|d< tj|d
 dd	|d< t|d |d< t|d |d< |jddddd|jdddddj	j}	j
|	 j
|	 tdd jD }
t|	}dd }|}|}g }|
D ]}|
D ]}|jvs|jvrq|  }|  }|j	|j}t|dk rq|| ||  }t| }t| }|t|t|tt| dt|dtt|dk dtt|| || dtt| dt|dkr5|| nddtt|d	 qqt|}|jddddd}|jddddd}||d d k  jddddd}fd!d"|
D fd#d"|
D  ttfd$d%d&d'dd( }tt  fd)d%d&d'dd* }i }|D ]?}i ||< |D ]5}|jv r|jv r|  }|  }|j	|j}tt|| ||   d+|| |< qqd,d- }|r|d nd} g }!| rg }"|D ]l}#|#d.   }|#d/   }|j	|j}t|dk r%q|| ||  d0 }t|jd1|d2< |d2d0  }$t|$dk }%tt|$}&|"i |#|%|&t|%|& dtt|$ d+d3 q|"j d4d% d5 |"dd( }'|"d }(||(d. |(d/ })|| d. | d/ }*d6d7 }+|'|(| d8d |)jD d9d |)j!D d:d;d |*jD d<d |*j!D d:|+|(d. |(d/ |+| d. | d/ d=}!t"j#$|},|,%d>d?&d}-|-d@ }.|-d* }/i dA| dB|dCt'(||dD|dE|.dd  dF|.dd@  dF|.d@d  dG|/dd  dF|/dd@  dF|/d@d  dH|dI|dJ|dK|dL|dM|dN|dO|dP|!dQ| }0||0dRt|< |0S )Su   
    Corre el análisis completo de estrategia combinada.
    Usa cache en memoria — invalida si los CSVs cambiaron.
    Retorna dict con todos los datos para el template.
    r   NmtimedatarL   r%   Horacoerce)errorszP/LPLDaymean)indexcolumnsvaluesaggfuncc                 S   s   g | ]	}t |s|qS r   )pdisna.0hr   r   r    
<listcomp>       z&analizar_combinada.<locals>.<listcomp>c              	   S   sZ   g }t | jD ]#}| |  }|t|tt| dtt|dk dd q|S )Nr.   r   r/   )horasumwr)	sortedrY   dropnar=   introundfloatrd   rW   )dfprowsr`   sr   r   r    
hora_stats   s   
z&analizar_combinada.<locals>.hora_stats2   r.   r   r/   r(   )	hora_vhora_ictotalrW   winratecorrworstsharpenrr   F)	ascending   recordsrv   rt   g?c                    &   i | ]}t |t |   qS r   rh   rj   rg   rd   r^   )vpr   r    
<dictcomp>      & z&analizar_combinada.<locals>.<dictcomp>c                    r{   r   r|   r^   )icpr   r    r~      r   c                        |  S Nr   r2   )v_sumsr   r    r6          z$analizar_combinada.<locals>.<lambda>T)r   reverse   c                    r   r   r   r2   )ic_sumsr   r    r6      r   r'   r#   c           	      S   sl   | |   }||   }|j|j}|| ||  d }t|jd|d< |dd 	 }|S )NplMmonth)
rg   rX   intersectionrenameto_framer\   to_datetime	to_periodgroupbyrd   )	vp_dficp_dfhvhicvs_sic_sccombomonthlyr   r   r    monthly_stats   s   z)analizar_combinada.<locals>.monthly_statsrp   rq   r   r   r   )	meses_posmeses_totalconsistencyworst_monthc                 S   s   | d  | d  fS )Nr   rr   r   r2   r   r   r    r6          r   c           	      S   sd   | |   }||   }t|j|j}|j| |j|   }| }dd |jd d d D S )Nc                 S      g | ]	}t t|d qS r#   ri   rj   r_   vr   r   r    ra      rb   z<analizar_combinada.<locals>.equity_curve.<locals>.<listcomp>r.   )rg   rf   rX   r   loc
sort_indexcumsumrZ   )	r   r   r   r   r   r   r   dailycumr   r   r    equity_curve   s
   z(analizar_combinada.<locals>.equity_curvec                 S      g | ]}t |qS r   strr_   mr   r   r    ra      r   c                 S   r   r   r   r   r   r   r    ra      rb   )labelsrZ   c                 S   r   r   r   r   r   r   r    ra     r   c                 S   r   r   r   r   r   r   r    ra     rb   )top_estabilidadpar_establepar_ganadormonthly_establemonthly_ganadorequity_estableequity_ganadorr   r"   r&   r   r   r-   n_diasr+   r)   r,   top_pl
top_sharpetop_corrv_hora_statsic_hora_stats
hm_v_horashm_ic_horashm_data	stability	mejor_par)rP   rQ   ))rO   _cacher!   r\   read_csv
to_numericr   pivot_tablerX   r   r   rf   rY   lenrg   rj   rW   stdr=   rh   ri   rd   rt   min	DataFramesort_valuesheadto_dictr   r   r   r   r@   rZ   r   r   r7   r8   r9   r<   r1   )1r   r   	cache_keymtime_actualentradarM   rN   r   iccommonhorasr   rn   r   r   
resultadosr   r   r   r   r   r   rW   r   df_rr   r   r   top_v_htop_ic_hr   r   r   stability_dataestabilidadrr   r   r   r   r   r   r   r   
nombre_csvrE   rG   rH   rQ   r   )r   r   r   r}   r    analizar_combinadab   s.  







&""& ,,	
r   )r   r   timepandasr\   numpynpr   r   r<   r;   r!   rK   rO   r   r   r   r   r    <module>   s,   	+	