o
    9h_                  	   @   sP  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d dlmZ ededdZd	Zed
d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"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/d0 Z&dS )1    N)	Blueprintjsonifyrequest)datetime)	lru_cache)AsyncResultbacktestingIdea	templates)template_folderz/var/www/html/flask_project/   )maxsizesymbolfechabasereturnc              	   C   s   t j|d}| dv rdnd}t j|d| |  d| d}t j|d| |  d| d}t j|r=t| }n0t j|rXtj|d	gd
}tj	t
j||dd ntd|  tjd| d 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.csv	timestamp)parse_dateszstd)compressionz+[ERROR] Ni CSV ni PARQUET encontrados para u/   [ERROR] No se encontró ni Parquet ni CSV para 
bid_callask_call   avg_callbid_putask_putavg_putstrikeT)inplace)ospathjoinexistspq
read_table	to_pandaspdread_csvwrite_tablepaTablefrom_pandasprintsysstderrwrite	DataFrame	set_index)r   r   r   folderprefixpq_pathcsv_pathdf r@   8/var/www/html/backtestingmarket/backtestingIdeaCelery.py_load_chain   s      rB   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    rG   r   r#   r$   r!   r   r    rG   )r/   r0   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_receivedrG   r@   r@   rA   /calcular_credito_y_underlying_desde_archivo_csv9   s0   
r[   c                    s  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 ][\}}	t|	d d}
|	d }t|	d  d| }|	d }|	d
 }|	d }|
|vrz
t||
|||
< W n
   t ||
< Y ||
 }t	|||||\}}t
|ttfstd|
 d| d| d|  qHt|}t|| }|d ur |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
|ttfrzt|d dnd |||d urt|dnd |rt|| dnd |d
 |
|v r||
= t  qHt|}|d jdd}||d dk jd }||d dk  jd }||||fS )NSymbolr   Dayc                    $   | d dkr| d   S | d   S )NOption_TyperH   Strike1r@   rowdesplazamientor@   rA   <lambda>e      $ z-calcular_precios_verticales.<locals>.<lambda>   )axisStrike1_Desplazadoc                    r^   )Nr_   rH   Strike2r@   ra   rc   r@   rA   re   h   rf   Strike2_Desplazado%Y-%m-%dHour r_   [SKIP] u#    - Crédito inválido para strikes /rH   d   ITMOTMITM PERRORr!   )
r]   TimeStrikesOptionCreditPriceCloseP/LDiffitmOtmr|   Tskipna)rM   r/   rJ   copyapplyiterrowsstrftimerB   r9   &calcular_credito_y_underlying_desde_df
isinstanceintfloatr5   (obtener_ultimo_underlying_price_desde_dfabsmaxminappendroundgccollectsumshape)vertical_strikes_dfpath_csv_baserd   desdehasta
resultadosr   df_cacher   rb   r   horaspecific_timerO   rP   rQ   df_chaincredit_resultunderlying_price_specific_timeunderlying_price_16
spreadDiffganancia_dia	valor_itmr~   df_resultadosprofit_total	positivos	negativosr@   rc   rA   calcular_precios_verticalesY   s   




 



 

r   c              
   C   s   z`|   }||d |k }||d ||g }|js%t|d  dk r,td W dS ||d |k jd }||d |k jd }	|d|   }
|	d|   }|
| }|d }||fW S  tyz } ztd	|  W Y d }~dS d }~ww )
Nr   r&   r!   u.   [WARNING] → No se encontraron ambos strikes.rE   r   avg_rG   z2[ERROR] calcular_credito_y_underlying_desde_df(): )	reset_indexrL   rK   lenuniquer5   rM   lower	Exception)r?   rO   rP   rQ   rR   df_debugrT   rU   rV   rW   avg1avg2rZ   rG   er@   r@   rA   r      s&   
r   c                 C   s&   z| j ddd jd W S    Y d S Nr   )byrG   )sort_valuesrM   )r?   r@   r@   rA   r      s   r   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_Strike1rq   )r   r   )r   r   strikesdiff_put	diff_callr@   r@   rA   )calcular_ganancia_perdida_dia_iron_condor   s    r   c                 C   s  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rxz
t||
|||
< W n
   t ||
< Y ||
 }t|||\}}}}t	|t
tfstd|
 d| d|  q.t|}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	|t
tfrt|d dnd t	|t
tfrt|dnd | d| d|d	 ||
= t  q.t|}|d jdd}||d dk jd }||d dk  jd }||||fS )Nr\   r   r]   rl   rm   rn   r   r   r   r   )r   r   r   r   ro   u    - Crédito inválido: rr   rs   rt   zN/Az.2frp   rq   r!   z(P) / z(C))	r]   rv   rw   rz   r{   ry   r|   Difr~   r|   Tr   )rM   r/   rJ   r   r   r   rB   r9   ,calcular_credito_y_underlying_iron_condor_dfr   r   r   r5   r   r   r   r   r   r   r   r   )r?   r   rd   r   r   r   r   r   r   rb   r   r   r   r   r   r   rG   r   r   r~   dif_calldif_putr   r   r   r   r@   r@   rA   calcular_precios_iron_condor   sn   ,



 ( 

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)zNo data foundNNNr&   r   r   r   r   Callr"   r   r%   c                 s   s    | ]}|d u V  qd S )Nr@   ).0vr@   r@   rA   	<genexpr>_  s    z?calcular_credito_y_underlying_iron_condor_df.<locals>.<genexpr>u;   [WARNING] Faltan strikes necesarios para calcular crédito.)NNNNrG   z8[ERROR] calcular_credito_y_underlying_iron_condor_df(): )ErrorNNN)
r   rK   r5   rL   items
startswithrM   anyvaluesr   )r?   r   rR   r   rT   rU   strike_valueskeyr&   rb   credit_callscredit_putsrZ   rG   r   r@   r@   rA   r   H  s>   


r   z/get_backtesting_ideaGET)methodsc               	   C   sd  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 | dkrzddl	m
}	 |	||| |}
td|
jiS | dkrt|}t|t|| |\}}}}t|tjd d!tt|d"t|t|d#S tdd$id%f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/rp   r   	_strikes_r   errorz Archivo de strikes no encontradoi  VERTICAL)run_backtesting_verticaltask_id
IRONCONDORrecords)orientr!   )datar   winslosseszEstrategia no reconocida  )r   argsgetr   r(   r)   r+   r   upperbacktestingIdea_tasksr   delayidr/   r0   r   PATH_UBUNTUastypeobjectto_dictr   r   r   )r   r   r   r   rR   r   desplazamientosrd   archivor   task
df_strikes	df_resulttotalr   r   r@   r@   rA   get_backtesting_ideap  sF   

r   z&/get_backtesting_idea_result/<task_id>c                 C   s^   t | }|jdkrtddiS |jdkrt|jS |jdkr(tdt|jdS td|jiS )NPENDINGstatusSUCCESSFAILUREr   message)r   stater   resultstrinfo)r   r  r@   r@   rA   get_backtesting_idea_result  s   



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/   r0   rJ   r   columnsrM   )rN   rS   r@   r@   rA   obtener_ultimo_underlying_price  s   
 r  z/procesar_fila_verticalPOSTc                  C   s<  t  } z| d}| d}| d}| d}| dd}dd |d	D \}}|d
kr8||k r8||}}|dkrE||krE||}}t||t}|jrXt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 ]Q\}}zH||d |k d|   jd }||d |k d|   jd }|| }|
| d }||dtt|d dtt|dd W q   Y qtd||| d	| |t|
d d|dt| ddW S  ty } ztdt|ddfW  Y d }~S d }~ww )Nr   r]   rv   rx   rw   r   c                 S      g | ]}t |qS r@   r   r   sr@   r@   rA   
<listcomp>      z*procesar_fila_vertical.<locals>.<listcomp>rp   rF   rH   r   No se pudo cargar option chainr   r   rn   '   No se pudo calcular el crédito inicialr   r&   r   r   rq   %Y-%m-%d %H:%M:%Sr!   r   creditprofit_losssuccessu"   Evolución de crédito calculada:  puntos)r   r   r   r   tipoinitial_credit	evolutionr     )r   get_jsonr   splitrB   r   rK   r   r/   rJ   r   r   r   r   r   groupbyr   rM   r   r   r   r   r   r  )r   r   r   r   r  strikes_rawrO   rP   r   time_objcredit_inicialr   r  df_filteredtsgroupr   r   credit_actualr  r   r@   r@   rA   procesar_fila_vertical  sb   





$$
"r$  z/procesar_fila_ironcondorc                     s  t  } z<| 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 ]e\}}z\||d k d jd }||d  k d jd }||d k d jd }||d k d jd }|| ||  }|| d }||dtt|d dtt|dd W q   Y qtd|| d	 d d	  t|d d|dt| ddW S  ty_ } ztdt|dd fW  Y d }~S d }~ww )!Nr   r]   rv   rw   r   rn   c                 S   r  r@   r	  r
  r@   r@   rA   r    r  z,procesar_fila_ironcondor.<locals>.<listcomp>rp   c                 S   r  r@   r	  r
  r@   r@   rA   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]: )NN)r   rM   r   r5   )
r?   r!  
df_momento
ts_primerodf_tsc1c2p1p2r   buy_callbuy_put	sell_callsell_putr@   rA   obtener_credito  s   z1procesar_fila_ironcondor.<locals>.obtener_creditor  r&   r"   r   r%   rq   r  r!   r  r  u%   Evolución de Iron Condor calculada: r  )r   r   r   r   r  r  r   r  )r   r  r   stripr  r   r   r   r   rB   r   rK   r/   rJ   r   r  rM   r   r   r   r   r   r  )r   r   r   r   r  	put_block
call_blockput1put2call1call2r   r  r   r1  r  timestamp_inicialr  r!  r"  r(  r)  r*  r+  r#  r  r   r@   r,  rA   procesar_fila_ironcondor  sl   




"r:  )'r(   pandasr/   flaskr   r   r   r   mathr   	functoolsr   pyarrowr2   pyarrow.parquetparquetr,   r6   celery.resultr   __name__backtestingIdea_bpr   r  r9   rB   r[   r   r   r   r   r   r   router   r  r  r$  r:  r@   r@   r@   rA   <module>   s>    # p	I(
2


: