o
    3hu0                     @   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opcionsigma_queue)queuec                 C   s   | \}}}}}}}}}	}
}t |d}zt|}W n ty9 } zdd| d| g |dW  Y d }~S d }~ww t||||||||	|
|
S )N%Y-%m-%derrorzError leyendo z: )statusmessagedatafile)r   strptimepdread_parquet	Exceptionprocess_day)argsfile_date_str	file_pathhorario
call_delta	put_deltacall_spread
put_spread
takeProfitstopLossunitdesplazamiento	file_datedfe r$   1/var/www/html/opcionsigma.spxbutterflies/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>r   z$No se encontraron datos procesables.r   r   r   z4/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   read_csv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$   
rF   c                    s  |  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}g }t|D ]m}tj|}	|	dd	d}
t
|
dk r|qdz
t|
d d}W n	 ty   Y qdw ||  kr|krn qd|dd}tj|szt|}|j|ddd W n ty } zW Y d }~qdd }~ww |||f qd|jdd d |sdd g d!S  f	d"d#|D }td$d# |D t }|jS )%Nsymbol)SPXXSPRUT$
fechaDesde
fechaHastar   z:00deltascallputr   r   r   spreadsr    r
   z//var/www/html/flask_project/chains/optionChain_z_*.csvz.csv _   z.parquetFsnappy)indexcompressionc                 S   s   | d S )Nr   r$   )xr$   r$   r%   <lambda>k   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
   )r;   )r(   r!   r   	r   r   r    r   r   r   r   r   r   r$   r%   r*   o   s    z,process_backtesting_task.<locals>.<listcomp>c                 S   s   g | ]}t |qS r$   )r&   s)r(   r   r$   r$   r%   r*   t   s    )r=   floatr   r   globospathbasenamereplacer<   len
ValueErrorexistsr   r6   
to_parquetr   appendsortr   rF   r]   id)r   rG   fecha_desdefecha_hastafecha_desde_dtfecha_hasta_dtpatternfiles_with_datesr   	base_namepartsfile_date_dtparquet_pathr"   r#   	args_listjobr$   r\   r%   process_backtesting_task@   s`   






rw   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)formatr1   %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)r1   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   r9   r   r   timer:   sortedsetuniqueprintcopyemptyabsr^   idxminlocissubsetcalculate_iron_condor_creditiloc evaluate_iron_condor_performancer;   str
isinstance)r"   target_time_strr   r   r   r   r   r   r   r    future_timesmax_intentosintentosr}   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$   r~   r%   find_next_closest_time_rowsy   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)mapr^   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   r#   r$   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   rx   r   Neutror{   r   r   r   mid_callr   r   mid_put)rW   columnsr   r      r   )windowmin_periodsr   ry   )rx   r   Gananciau   Pérdidar   rU   zGanancia Parcialu   Pérdida Parcial)r^   roundr   r9   sort_valuesisinr   r;   pivotrollingmeaniterrowsr   Seriesr   rh   maxmin)r"   r   r   r   r   initial_credittake_profit	stop_lossr   r   pivot_dfcredit_evolutionrx   rowcurrent_creditlast_underlying_pricecall_spread_intrinsicput_spread_intrinsictotal_loss_points
total_losspnlr   r$   r$   r%   r      s\   


r   )r_   r`   pandasr   r   celeryr   r   numpynptaskr&   rF   rw   r   r   r   r   r$   r$   r$   r%   <module>   s"   





8S