o
    Υh,^                     @   s"  d dl Z d dlZd dlmZmZmZ d dlmZ d dlZd dl	Z	d dl
mZ d dlZd dlmZ d dlZededdZdZd	ed
ededejfddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zejddgdd d! Z d"d# Z!ejd$d%gdd&d' Z"ejd(d%gdd)d* Z#dS )+    N)	Blueprintjsonifyrequest)datetime)	lru_cachebacktestingIdea	templates)template_folderz/var/www/html/flask_project/symbolfechabasereturnc              	   C   s   t j|d}| dv rdnd}t j|d| |  d| d}t j|r-t| }nt S |d |d	  d
 |d< |d |d  d
 |d< |j	ddgdd |S )Nchains)SPXRUTXSP$ optionChain__z.parquetbid_callask_call   avg_callbid_putask_putavg_put	timestampstrikeT)inplace)
ospathjoinexistspq
read_table	to_pandaspd	DataFrame	set_index)r
   r   r   folderprefixpq_pathdf r.   2/var/www/html/backtestingmarket/backtestingIdea.py_load_chain   s    r0   c                 C   s6  zt j| tdd}t |d |d< ||d |k }|jr!W dS ||d ||g }|dkr7|g d }n
|dkrA|g d	 }||d |k jd
 }||d |k jd
 }	|dkrp|d |d  d }
|	d |	d  d }n|dkr|d |d  d }
|	d |	d  d }|
| }|d }||fW S    Y dS )N	   )usecolsr   r   Nr   PUT)r   r   r   underlying_priceCALL)r   r   r   r5   r   r   r   r   r   r   r5   )r'   read_csvrangeto_datetimeemptyisiniloc)archivo_option_chainstrike1strike2option_typetimeHouroption_chain_dffiltered_chainstrikes_datastrike1_datastrike2_datastrike1_avgstrike2_avgcredit_receivedr5   r.   r.   r/   /calcular_credito_y_underlying_desde_archivo_csv,   s0   
rJ   c                    s  dd l }g }| d jd }t| d | d< | | d t|k| d t|k@   } | j fdddd| d< | j fd	ddd| d
< i }|  D ]M\}	}
t|
d d}|
d }t|
d  d| }|
d }|
d
 }|
d }||vrz
t|||||< W n
   t	 ||< Y || }t
|||||\}}|d u s|d u rtd| d| d| d|  qLt|}t|| }|d ur |dkr|t||kr|| d }nJ|t||k r|d }n>|t|| d }|d | }n.|t||k r|| d }n|t||kr|d }nt||| d }|d | }nd }|d ur^|dkrE|t||kr7d}n)|t||k rBd}nd}n|t||k rPd}n|t||kr[d}nd}nd}|||| d| |t|d d|||d ur}t|dnd |rt|| dnd |d
 ||v r||= |  qLt	|}||d  |d  @   }tdt| dt|t|   |d jdd }||d dk jd }||d dk  jd }||||fS )!Nr   SymbolDayc                    $   | d dkr| d   S | d   S )NOption_Typer6   Strike1r.   rowdesplazamientor.   r/   <lambda>Z      $ z-calcular_precios_verticales.<locals>.<lambda>   )axisStrike1_Desplazadoc                    rM   )NrN   r6   Strike2r.   rP   rR   r.   r/   rT   ]   rU   Strike2_Desplazado%Y-%m-%dHour rN   [SKIP] u.    - Strikes faltantes o underlying vacío para /r6   d   ITMOTMITM PERRORr   )
rL   TimeStrikesOptionCreditPriceCloseP/LDiffitmOtmrh   ri      [INFO] Ideas válidas:  / Descartadas: rk   Tskipna)gcr<   r'   r9   copyapplyiterrowsstrftimer0   r(   &calcular_credito_y_underlying_desde_dfprint(obtener_ultimo_underlying_price_desde_dfabsmaxminappendroundcollectnotnulllensumshape)vertical_strikes_dfpath_csv_baserS   desdehastarr   
resultadosr
   df_cacher   rQ   r   horaspecific_timer>   r?   r@   df_chaincredit_resultunderlying_price_specific_timeunderlying_price_16
spreadDiffganancia_dia	valor_itmrm   df_resultadosprofit_total	positivos	negativosr.   rR   r/   calcular_precios_verticalesL   s   




 








$r   c              
   C   s  zg|j ddd}|  }||d |k }||d ||g }|js,t|d  dk r3td W dS ||d |k jd }||d |k jd }	|d	|   }
|	d	|   }|
| }|d
 }||fW S  t	y } ztd|  W Y d }~dS d }~ww )N   r   )secondmicrosecondr   r   r   u.   [WARNING] → No se encontraron ambos strikes.r3   avg_r5   z2[ERROR] calcular_credito_y_underlying_desde_df(): NN)
replacereset_indexr;   r:   r   uniquerx   r<   lower	Exception)r-   r>   r?   r@   rA   df_debugrC   rD   rE   rF   avg1avg2rI   r5   er.   r.   r/   rw      s(   
rw   c                 C   s&   z| j ddd jd W S    Y d S Nr   )byr5   )sort_valuesr<   )r-   r.   r.   r/   ry      s   ry   c                 C   s   |d u s| d u r
d S |d |d  }|d |d  }||d k s&||d kr/| t || d S |d |  kr@|d krA| d S  |d |  krO|d k r^n n| t|d | | d S |d |  k rl|d kr|n d S | t||d  | d S d S )NPut_Strike1Put_Strike2Call_Strike2Call_Strike1r`   )r{   r|   )r   r   strikesdiff_put	diff_callr.   r.   r/   )calcular_ganancia_perdida_dia_iron_condor   s    r   c                 C   s  dd l }g }| d jd }t| d | d< | | d t|k| d t|k@   } i }|  D ]\}	}
|
d d}|
d }t| d| }|
d | |
d | |
d	 | |
d
 | d}||vr{z
t|||||< W n
   t ||< Y || }t	|||\}}}	}	|d u s|d u rt
d| d| d q2t|}t|||}|d ur||d
 k s||d krd}n|d	 |  kr|d krn nd}nd}nd}|r||d  dnd }|r||d	  dnd }||||d
  d|d	  d|d  d|d  ||t|d dt|ttfrt|dnd | d| d|d	 ||= |  q2t|}||d  |d  @   }t
dt| dt|t|   |d jdd}||d dk jd }||d dk  jd }||||fS ) Nr   rK   rL   r[   r\   r]   r   r   r   r   )r   r   r   r   r^   u)    - Strikes faltantes o underlying vacío.ra   rb   rc   zN/Az.2fr_   r`   r   z(P) / z(C))	rL   re   rf   ri   rj   rh   rk   Difrm   rh   ri   rn   ro   rk   Trp   )rr   r<   r'   r9   rs   ru   rv   r0   r(   ,calcular_credito_y_underlying_iron_condor_dfrx   ry   r   r}   r~   
isinstanceintfloatr   r   r   r   r   )r-   r   rS   r   r   rr   r   r
   r   r   rQ   r   r   r   r   r   r   r5   r   r   rm   dif_calldif_putr   r   r   r   r.   r.   r/   calcular_precios_iron_condor  s   ,



 (



$r   c              
   C   sZ  z|   }||d |k }|jrtd W dS ||d |d |d |d |d g }i }| D ],\}}||d |k }	|	jrFd ||< q2|d	rU|	d
 jd ||< q2|	d jd ||< q2tdd | D rqtd W dS |d |d  }
|d |d  }|
| }|d jd }|||
|fW S  t	y } ztd|  W Y d }~dS d }~ww )Nr   u,   [WARNING] No hay datos después del timeHour)NNNNr   r   r   r   r   Callr   r   r   c                 s   s    | ]}|d u V  qd S )Nr.   ).0vr.   r.   r/   	<genexpr>w  s    z?calcular_credito_y_underlying_iron_condor_df.<locals>.<genexpr>u;   [WARNING] Faltan strikes necesarios para calcular crédito.r5   z8[ERROR] calcular_credito_y_underlying_iron_condor_df(): )
r   r:   rx   r;   items
startswithr<   anyvaluesr   )r-   r   rA   r   rC   rD   strike_valueskeyr   rQ   credit_callscredit_putsrI   r5   r   r.   r.   r/   r   `  s>   


r   z/get_backtesting_ideaGET)methodsc               	   C   sT  t jd} t jd}t jdd}t jdd}t jdd}t jd	d
 }|dv r6ddddd}nddddd}|| }d| d| d| d| d	}tj|s^tddidfS t	|}	|
 dkrvt|	t|| |\}
}}}n|
 dkrt|	t|| |\}
}}}ntddidfS t|
tjd d!tt|d"t|t|d#S )$Nr   r   r
   r   
estrategiaVerticalr   1340risk
Intermedio)r   r   r   ii)conservador
intermedioagresivoultra_agresivor   z7/var/www/html/backtestingmarket/predictor_data/makekos/r_   r   	_strikes_z.csverrorz Archivo de strikes no encontradoi  VERTICAL
IRONCONDORzEstrategia no reconocida  records)orientr   )datar   winslosses)r   argsgetr   r    r!   r#   r   r'   r7   upperr   PATH_UBUNTU_CHAINSr   astypeobjectto_dictr   r~   r   )r   r   r
   r   rA   r   desplazamientosrS   archivo
df_strikes	df_resulttotalr   r   r.   r.   r/   get_backtesting_idea  sB   
r   c                 C   sV   z$t | }t |d |d< |jdd}d|jv r"|d jd W S d W S    Y d S r   )r'   r7   r9   r   columnsr<   )r=   rB   r.   r.   r/   obtener_ultimo_underlying_price  s   
 r   z/procesar_fila_verticalPOSTc               
   C   sJ  t  } z| d}| d}| d}| d}| dd}dd |d	D \}}|d
kr9||k r9||}}|dkrF||krF||}}t||t}|jrYtddddfW S t	| d| }	t
|||||	\}
}t|
ttfs~tddddfW S g }| }||d |	k }|dD ]^\}}zU||d |k d|   jd }||d |k d|   jd }|d jd }|| }|
| d }||dtt|d dtt|dtt|dd W q   Y qtd||| d	| |t|
d d|dW S  ty$ } ztdt|ddfW  Y d }~S d }~ww )Nr
   rL   re   rg   rf   r   c                 S      g | ]}t |qS r.   r   r   sr.   r.   r/   
<listcomp>      z*procesar_fila_vertical.<locals>.<listcomp>r_   r4   r6   r   No se pudo cargar option chainstatusmessager   r]   '   No se pudo calcular el crédito inicialr   r   r   r   r5   r`   %Y-%m-%d %H:%M:%Sr   r   creditprofit_lossr5   success)r   r
   r   r   tipoinitial_credit	evolution  )r   get_jsonr   splitr0   r   r:   r   r'   r9   rw   r   r   r   r   groupbyr   r<   r}   rv   r~   r   str)r   r
   r   r   r   strikes_rawr>   r?   r   time_objcredit_inicialr   r   df_filteredtsgroupr   r   r5   credit_actualr   r   r.   r.   r/   procesar_fila_vertical  sd   





$$
"r  z/procesar_fila_ironcondorc                     s  t  } zB| d}| d}| d}| dd }z7|d\}}dd |d	D \}}d
d |d	D \}	}
t||t||t|	|
t|	|
 W n tyj   tdd| ddf Y W S w t	||t
}|jr~tddddfW S t| d| }| }||d |k } fdd}|||\}}|d u rtddddfW S g }|dD ]r\}}zi||d k d jd }||d  k d jd }||d k d jd }||d k d jd }|d jd }|| ||  }|| d }||dtt|d dtt|dtt|dd W q   Y qtd|| d	 d d	  t|d d|dW S  tye } ztdt|ddfW  Y d }~S d }~ww ) Nr
   rL   re   rf   r   r]   c                 S   r   r.   r   r   r.   r.   r/   r     r   z,procesar_fila_ironcondor.<locals>.<listcomp>r_   c                 S   r   r.   r   r   r.   r.   r/   r     r   r   u   Strikes inválidos: r   r   r   r   c           
   
      s   zU| | d |k }|d   }| | d |k }||d k d jd }||d  k d jd }||d k d jd }||d k d jd }|| ||  |fW S  tyo }	 ztd|	  W Y d }	~	dS d }	~	ww )Nr   r   r   r   r   u   [ERROR crédito inicial]: r   )r|   r<   r   rx   )
r-   r
  
df_momento
ts_primerodf_tsc1c2p1p2r   buy_callbuy_put	sell_callsell_putr.   r/   obtener_credito#  s   z1procesar_fila_ironcondor.<locals>.obtener_creditor   r   r   r   r   r5   r`   r   r   r   r   )r   r
   r   r   r   r   r  )r   r  r   stripr  r{   r|   r   r   r0   r   r:   r'   r9   r   r  r<   r}   rv   r   r~   r  )r   r
   r   r   r  	put_block
call_blockput1put2call1call2r   r  r	  r  r  timestamp_inicialr   r
  r  r  r  r  r  r5   r  r   r   r.   r  r/   procesar_fila_ironcondor  sn   




"r#  )$r    pandasr'   flaskr   r   r   r   mathrr   	functoolsr   pyarrowpapyarrow.parquetparquetr$   sys__name__backtestingIdea_bpr   r  r(   r0   rJ   r   rw   ry   r   r   r   router   r   r  r#  r.   r.   r.   r/   <module>   s6     ~!	Y(
0

B