o
    Bf,                  	   @   s   d dl Zd dlmZ d dlmZ d dlmZm	Z	 d dl
Z
d dlZG dd dZdededefd	d
ZG dd dZdedede	eeef fddZdS )    N)interpolate)ListTuplec                   @   sL   e Zd Zdeeeef  fddZdedefddZdd	ed
efddZdS )LinearPiecewiseFunctionpointsc                 C   s@   t t|| _| jj\| _| _tj| j| jddt j	d| _
d S )NFlinear)bounds_errorkind
fill_value)nparraysortedr   Tx_valuesy_valuesr   interp1dinfinterpolator)selfr    r   5/home/garg/notebooks/polymarket/polymarket_classes.py__init__	   s
   z LinearPiecewiseFunction.__init__xreturnc                 C   s   t | |S N)floatr   )r   r   r   r   r   evaluate   s   z LinearPiecewiseFunction.evaluateNstartendc                 C   s   t jdd t | j| j t j| j| jddd t| j| jD ]\}}d|dd|dd	}t j|||fd
ddd q t d t 	d t 
d t d t | jd | jd  t   d S )N)
      )figsizered   )colorzorder(z.2fz, )zoffset points)r   r   center)
textcoordsxytexthazLinear Piecewise Functionr   zf(x)Tr   )pltfigureplotr   r   scatterzipannotatetitlexlabelylabelgridxlimshow)r   r   r   r   ylabelr   r   r   r/      s   



zLinearPiecewiseFunction.plot)NN)	__name__
__module____qualname__r   r   r   r   r   r/   r   r   r   r   r      s    r   func1func2r   c                 C   s   | j d |j d kr| j d |j d k s(|j d | j d kr,|j d | j d k r,td| j d |j d kr<| |}}n|| }}tt|j |j}|j d |j d krl|tt|j dd  |jdd   t|S |tt|j |j t|S )Nr,   r   z@The functions must not overlap except possibly at a single point   )r   
ValueErrorlistr1   r   extendr   )r>   r?   firstsecondcombined_pointsr   r   r   !combine_non_overlapping_functions#   s   ((
(rG   c                	   @   sn   e Zd Zdedeeeef  deeeef  fddZddefdd	Z	d
d Z
dd ZddedefddZdS )Booktoken_idbidsasksc                 C   sB   || _ tj d| _t|dd dd| _t|dd d| _d S )Nz%Y%m%d-%H%M%Sc                 S      | d S Nr   r   r   r   r   r   <lambda>B       zBook.__init__.<locals>.<lambda>T)keyreversec                 S   rL   rM   r   rN   r   r   r   rO   C   rP   )rQ   )rI   datetimenowstrftimetimer   rJ   rK   )r   rI   rJ   rK   r   r   r   r   ?   s   zBook.__init__r#   nc                 C   sz  t d| jd| j t d t ddddd t dd	d
ddd
ddddd	d
ddd
dd t d ttt| jt| j|D ]q}|t| jk rS| j| nd}|t| jk ra| j| nd}|\}}|\}}|rs|rs|| nd}	|r}|r}|| nd}
|s|r|dd
|dd
|	dnd}|s|r|dd
|dd
|
dnd}t | d|  ||d kr nqEt d d S )NrH   @zP--------------------------------------------------------------------------------Bidsz^39z | AsksPricez^11 Sizez^12z	Value ($)z^14) r^   r   z<11.2fz<12.2fz<14.2fz'                                       r@   )printrI   rV   rangemaxlenrJ   rK   )r   rW   ibidask	bid_pricebid_size	ask_priceask_size	bid_value	ask_valuebid_strask_strr   r   r   
print_bookE   s&   6 &&zBook.print_bookc                 C   sN   t d| j d| j dd}t| | W d    d S 1 s w   Y  d S )Nzbooks/_z.pklwb)openrI   rV   pickledump)r   fr   r   r   save_as_pickle`   s   "zBook.save_as_picklec                 C   s,   dd | j D }dd | jD }t||dS )Nc                 S      g | ]
\}}d | |fqS r@   r   .0priceamountr   r   r   
<listcomp>e       z)Book.get_inverse_book.<locals>.<listcomp>c                 S   rv   rw   r   rx   r   r   r   r|   f   r}   )rJ   rK   )rK   rJ   rH   )r   rJ   rK   r   r   r   get_inverse_bookd   s   zBook.get_inverse_book        initial_positionr   c                 C   s  |dfg}|dkr|}d}| j D ]\}}||7 }||| 7 }|||f qd}g }| jD ]3\}}	|dkr=|||	f q-t||	}
|||
 8 }||
8 }|||f |	|
kr`|||	|
 f q-d}|D ]\}}||8 }||d|  7 }|||f qet|S |}d}| jD ]\}}||8 }||d|  7 }|||f qd}g }| j D ]7\}}	|dkr|||	f qtt||	}
|d| |
 8 }||
7 }|||f |	|
kr|||	|
 f qd}|D ]\}}||7 }||| 7 }|||f qt|S )Nr   r   r@   )rK   appendrJ   minr   abs)r   r   r   curr_pos	curr_costrz   r{   
total_cost
new_levelsvolumetransacted_volumer   r   r   position_vs_costi   sd   

zBook.position_vs_costN)r#   )r   )r;   r<   r=   strr   r   r   r   intrn   ru   r~   r   r   r   r   r   r   rH   >   s    .rH   book1book2c                    s   dddg g d g g ddt tttf  dt tttf  dtf fdd}| j | j }}|j |j }}|||d |||d	 d
d }ttj	  d| d  d| d  d|d  d|d  	 dS )aD  
    Calculate arbitrage opportunity between two books, considering all price levels.
    Returns the final combined limit orders for each book using the deepest price.
    
    :param book1: First Book instance
    :param book2: Second Book instance
    :return: Tuple of (position_in_book1, position_in_book2, profit)
    r   )buysellrJ   rK   buy_from_book2c                    sH  d\}}|t | k r|t |k r| | \}}|| \}}||kr"d S t||}	|	||  }
|rJ|	7 |	8 d ||	f  d ||	f n|	8 |	7  d ||	f d ||	f |
7 |||	 f| |< |||	 f||< | | d dkr|d7 }|| d dkr|d7 }|t | k r|t |k sd S d S d S d S )N)r   r   r   r   r@   r   )rb   r   r   )rJ   rK   r   	bid_index	ask_indexrf   
bid_volumerh   
ask_volumetrade_volumetrade_profitorders_book1orders_book2position_book1position_book2profitr   r   process_arbitrage   s2   
(z.calculate_arbitrage.<locals>.process_arbitrageTFc                 S   sV   | sd S t dd | D }| d d dkrtdd | D ntdd | D }||fS )Nc                 s   s    | ]\}}|V  qd S r   r   )ry   ro   qtyr   r   r   	<genexpr>
      z>calculate_arbitrage.<locals>.combine_orders.<locals>.<genexpr>r   r@   c                 s   s    | ]\}}|V  qd S r   r   )ry   rz   ro   r   r   r   r     r   )sumr   ra   )orders	total_qty
best_pricer   r   r   combine_orders  s
   4z+calculate_arbitrage.<locals>.combine_orders,r   r   N)
r   r   r   boolrJ   copyrK   r_   rS   rT   )r   r   r   bids1asks1bids2asks2r   r   r   r   calculate_arbitrage   s   	

:&Nr   )numpyr   scipyr   matplotlib.pyplotpyplotr-   typingr   r   rS   rr   r   rG   rH   r   r   r   r   r   r   <module>   s     $