o
    -h>3                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZ	eddddZej
ddd	d
 Zej
dddd Zej
dddd Zdd Zdd Zdd Zdd ZdS )    N)datetime)Celerychordtaskszredis://localhost:6379/0)brokerbackendbacktestingmarket_queue)queuec                 C   sJ   | \}}}}}}}}}	}
}t |d}t|}t||||||||	|
|
S )N%Y-%m-%d)r   strptimepdread_csvprocess_day)argsfile_date_str	file_pathhorario
call_delta	put_deltacall_spread
put_spread
takeProfitstopLossunitdesplazamiento	file_datedf r   4/var/www/html/backtestingmarket/neutralEdge_tasks.pyprocess_day_task   s   
r   c           	      C   s   dd | D } | sddg dS d}t |}tt|d |d }d	}t j|d dd
gd}t |d jd|d< tt|d |d
 }| D ]}|d dd }|||d< |||d< qGd| ddS )Nc                 S   s   g | ]}|d ur|qS Nr   ).0resr   r   r   
<listcomp>   s    z%aggregate_results.<locals>.<listcomp>errorz$No se encontraron datos procesables.statusmessagedataz4/var/www/html/flask_project/spx_history_with_gap.csvdategapz(/var/www/html/flask_project/holidays.csvevent)headernamesr
   Time r   GapNewssuccessz"Datos procesados con gap y eventos)r&   r(   r'   )	r   r   dictzipto_datetimedtstrftimesplitget)	resultscsv_path_gapdf_gapgap_dictcsv_path_eventos
df_eventoseventos_dictr"   date_strr   r   r   aggregate_results   s$   
rB   c              	      s  t d | d}|dv rd| }| d}| d}| dd | d	 d
  | d	 d | d| d| d| d d
 | d d t| d t|d}t|d}d}| d| d}g }t|D ]Q}	tj|	}
|
	dd
d}t|dk rt d|
 d ql|d }zt|d}W n ty   t d|
 d Y qlw ||  kr|krn ql|||	f ql|jdd d |sd d!g d"S  f	d#d$|D }td%d$ |D t }|jS )&Nz!Iniciando tarea de backtesting...symbol)SPXXSPRUT$
fechaDesde
fechaHastar   z:00deltascallputr   r   r   spreadsr   r
   z"/var/www/html/flask_project/chainsz/optionChain_z_*.csvz.csv _   u&   ⚠ Advertencia: Nombre inesperado en z, archivo ignorado.u   ⚠ Error: Fecha inválida en c                 S   s   | d S )Nr   r   )xr   r   r   <lambda>e   s    z*process_backtesting_task.<locals>.<lambda>)keyr$   z4No se encontraron archivos en el rango seleccionado.r%   c                    s0   g | ]\}}| d | fqS )r
   )r7   )r!   r   r   	r   r   r   r   r   r   r   r   r   r   r   r#   k   s    z,process_backtesting_task.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )r   s)r!   r   r   r   r   r#   v   s    )printr9   floatr   r   globospathbasenamereplacer8   len
ValueErrorappendsortr   rB   rV   id)r(   rC   fecha_desdefecha_hastafecha_desde_dtfecha_hasta_dtdirectory_pathpatternfiles_with_datesr   	base_namepartsr   file_date_dt	args_listjobr   rU   r   process_backtesting_task;   sX   





ro   c
                    s$  t j| d dd| d< t|d  | d jj| d< tt fdd| d  D }
d	}d
}|
D ]}||kr?t	d  dS | | d |k 
 }|jrQ|d7 }q2t|d t| |d< t|d t| |d< |d  }|d  }|j|df }|j|df }|t| }|t| }||||h}t|d  }||s|d7 }q2t|||||}|du rq2||	d 8 }|jd
 d }|jd
 d }t| ||||||||	\}}}}t |dt|t|t|t|t|tr|nt |dt|t|t|t|t|t|d  S dS )u   
    Encuentra las filas con el timestamp más cercano o posterior al tiempo objetivo, selecciona los strikes del Iron Condor y calcula el crédito inicial.
    Si los strikes necesarios no están disponibles, intenta con el siguiente timestamp.
    	timestamp%Y-%m-%d %H:%M:%S)formatr.   %H:%M:%S	only_timec                 3   s    | ]	}| kr|V  qd S r    r   )r!   ttarget_timer   r   	<genexpr>   s    z.find_next_closest_time_rows.<locals>.<genexpr>
   r   uE   ❌ No se encontraron 4 strikes válidos en los primeros 10 intentos.N   
delta_calldelta_call_diff	delta_putdelta_put_diffstriked   underlying_price)r.   z	SPX PriceOutcomezInitial CreditzCredit at Occurrencez
Occur Timez	Stop LosszTake ProfitzSell Call StrikezBuy Call StrikezSell Put StrikezBuy Put Strike)r   r5   r   r   timer6   sortedsetuniquerW   copyemptyabsrX   idxminlocissubsetcalculate_iron_condor_creditiloc evaluate_iron_condor_performancer7   str
isinstance)r   target_time_strr   r   r   r   r   r   r   r   future_timesmax_intentosintentosru   rows_at_timeidx_min_callidx_min_put	sell_callsell_putbuy_callbuy_putstrikes_neededavailable_strikescredit	spx_priceopening_timestamp	resultadofinal_credit
occur_time	evolutionr   rv   r   find_next_closest_time_rows~   sd   "	

r   c
                 C   s&   t | |||||||||	
}
|
r|
S d S r    )r   )day_dfr   r   r   r   r   r   r   r   r   resultr   r   r   r      s   r   c              
      s4  t t||||g\}}}} d t d<  fdd||||fD }|r'd S z_  d |k jd }  d |k jd }  d |k jd }  d |k jd }	|d |d  d }
|d |d  d }|d |d	  d }|	d |	d	  d }|
| ||  }|W S  ty } zW Y d }~d S d }~ww )
Nr   c                    s   g | ]}| d  j vr|qS )r   )values)r!   r   r   r   r   r#      s    z0calculate_iron_condor_credit.<locals>.<listcomp>r   bid_callask_call   bid_putask_put)maprX   astyper   
IndexError)r   r   r   r   r   missing_strikessell_call_rowbuy_call_rowsell_put_rowbuy_put_rowsell_call_pricebuy_call_pricesell_put_pricebuy_put_pricer   er   r   r   r      s(   r   c	                 C   sX  t |}t |}tt |d }t| d | d< | | d |k d} ||||h}	| | d |	 } | jr>d||dfS | d | d  d | d	< | d
 | d  d | d< | jddd	dgd}
|
d	|f |
d	|f  |
d|f |
d|f   d |
d< |
d j	ddd
 |
d< g }|
 D ]B\}}|d }t|tjr|jd }||dt |d ||| k rd||d|f  S ||| krd||d|f  S q| d jd }td|| }td|| }|| }|d }|| }|dkr||krdnd}t||}n|dk r|| k rdnd}t|| }nd}||| d jd d|fS )Nr   rp   r   Neutrors   r   r   r   mid_callr   r   mid_put)indexcolumnsr   r      rz   )windowmin_periodsr   rq   )rp   r   Gananciau   Pérdidar   rQ   zGanancia Parcialu   Pérdida Parcial)rX   roundr   r5   sort_valuesisinr   r7   pivotrollingmeaniterrowsr   Seriesr   r`   maxmin)r   r   r   r   r   initial_credittake_profit	stop_lossr   r   pivot_dfcredit_evolutionrp   rowcurrent_creditlast_underlying_pricecall_spread_intrinsicput_spread_intrinsictotal_loss_points
total_losspnlr   r   r   r   r      s\   


r   )rY   rZ   pandasr   r   celeryr   r   numpynptaskr   rB   ro   r   r   r   r   r   r   r   r   <module>   s"   






BS