a
    ƒp€jX  ã                   @   s¨   d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 e
dƒZdZe d¡Ze d¡Zd	d
„ Zddd„Zdd„ Zdd„ Zdd„ Zedkr¤eƒ  dS )a   Counterfactual: at 1-of-3 near kickoff, is it better to FLATTEN or to CROSS OUT?

Today the Poly-US quoter buys back the single sold leg (FLATTEN_1OF3) and goes
flat. That bucket is the maker's largest loss: 79 books, -$23.01, roughly -29c
a book. The alternative is to finish the book instead -- cross BOTH unsold legs
into their bids at whatever price is there, ending short all three outcomes for
a locked, outcome-independent P&L.

This prices that alternative at the EXACT moment each flatten actually fired,
using the bids logged for the other two legs in the same snapshot window, so
the two rules are compared on identical market state rather than on a model.

  flatten P&L    = -( (ask - sold)*100 + taker_fee(ask)*100 )   [+ rebate earned]
  cross-out P&L  = (sold + bid_b + bid_c - 1)*100 + rebate
                   - taker_fee(bid_b)*100 - taker_fee(bid_c)*100

Both are realised before kickoff, so neither carries match risk and they are
directly comparable. No settlement data is needed.

Usage:  python research\pus_flatten_vs_complete.py
é    N)Údefaultdict)ÚPathz'E:\soccer\research\mm_polyus_quotes.csvg¸…ëQ¸®?z#=>\s*cost\s*([+-]?[\d.]+)c/contractzsold @([\d.]+)c                 C   s   t |  d|   S )Né   )ÚTAKER_THETA)Úp© r   ú-E:\soccer\research\pus_flatten_vs_complete.pyÚ	taker_fee%   s    r	   c              	   C   s*   z
t | ƒW S  ttfy$   | Y S 0 d S ©N)ÚfloatÚ	TypeErrorÚ
ValueError)ÚxÚdr   r   r   Ú_f)   s    
r   c                  C   sÈ   t t ¡ ƒd } t t| ¡ tdd„ ƒ}| jdddd��P}t 	|¡D ]4}| 
d¡| 
d	¡ }}|rD|rD|| |  |¡ qDW d   ƒ n1 sŽ0    Y  | ¡ D ]"}| ¡ D ]}|jd
d„ d� q¬q |S )Nzmm_polyus_quotes.snap.csvc                   S   s   t tƒS r
   )r   Úlistr   r   r   r   Ú<lambda>3   ó    zload.<locals>.<lambda>Ú zutf-8Úreplace)ÚnewlineÚencodingÚerrorsZ
event_slugZmarket_slugc                 S   s   |   d¡pdS )NÚtsr   )Úget©Úrr   r   r   r   ;   r   ©Úkey)r   ÚtempfileZ
gettempdirÚshutilZcopyfileÚQUOTESr   ÚopenÚcsvZ
DictReaderr   ÚappendÚvaluesÚsort)ÚtmpÚbooksZfhr   ÚevÚslugÚlegsÚvr   r   r   Úload0   s    2r-   c                 C   st   d\}}| D ]V}t | d¡ƒ}|du sd|  k r:dk s>q q| d¡pJd|krV|}q|du r|}q|durp|S |S )z‘Best bid for a leg at the snapshot nearest to (and not after) `ts`,
    falling back to the closest later row if the leg had not started quoting.)NNZp_bidNr   r   r   r   )r   r   )Úrowsr   ÚbestZpriorr   Úbr   r   r   Úbid_at?   s    r1   c                     s^  t ƒ } g }|  ¡ D �]°\}‰d  }‰ ˆ ¡ D ]:\}}|D ]$}d| d¡pJdv r8|| }‰  q^q8|r, qhq,|snq| d¡pzd‰t |d ¡t |d ¡ }}|r|s¤qt| d¡ƒ}	t| d¡ƒ }
‡ fdd„ˆD ƒ}t|ƒdkrâq‡‡fd	d„|D ƒ}t	d
d„ |D ƒƒ�rqd}ˆˆ  D ]$}t
| d¡ƒ}|�r|} �q>�q|	|d  |d  d d | t|d ƒd  t|d ƒd  }| || d¡| d¡› d| d¡› �|	|d |d |
|||
 dœ	¡ q|�sØtdƒ d S t|ƒ}tdd„ |D ƒƒ}tdd„ |D ƒƒ}tdd„ |D ƒƒ}dd„ |D ƒ}td|› d�ƒ tddd ›d!d"d#›d!d$d%›d!d&d'›�ƒ tdd(d ›d!|d)›d!|d* d+›d!|| d,›�ƒ tdd-d ›d!|d)›d!|d* d+›d!|| d,›�ƒ td.|| d* d/›d0|| | d1›d2�ƒ td3|› d4|› d5d| | d6›d7�ƒ t|dk�rHd8t |¡d1›d9t |¡d1›d:t |¡d;›d<�ndƒ |dk�rjt |¡|d=  nd}|�r°td>t |¡| d1›dtt |¡| ƒd?k�r¦d@ndA› �ƒ tdBd„ |D ƒƒ}tdCdDd ›d!|d)›d!|d* d+›d!|| d,›dE�	ƒ tdF|| d* d/›d0|| | d1›d2�ƒ tdGd„ |D ƒƒ}tdH|› d4|› dI|| › �ƒ t|dJdK„ dL�d dM… }t|dNdK„ dL�d dM… }tdOƒ |D ]`}tdP|d dQ›d!|dR d dS… dT›dU|dV d;›dW|dX d;›d4|dY d;›d|dZ d[›d<�ƒ �qŠtd\ƒ |D ]`}tdP|d dQ›d!|dR d dS… dT›dU|dV d;›dW|dX d;›d4|dY d;›d|dZ d[›d<�ƒ �qød S )]NZFLATTEN_1OF3Úreasonr   r   r   c                    s   g | ]}|ˆ kr|‘qS r   r   ©Ú.0Ús)Ú	flat_slugr   r   Ú
<listcomp>d   r   zmain.<locals>.<listcomp>é   c                    s   g | ]}t ˆ | ˆƒ‘qS r   )r1   r3   )r+   r   r   r   r7   g   r   c                 s   s   | ]}|d u V  qd S r
   r   )r4   r0   r   r   r   Ú	<genexpr>h   r   zmain.<locals>.<genexpr>g        Zrebate_cr   g      ð?g      Y@éd   ÚdivÚhomez vs Zaway)	r)   r;   ÚmatchÚsoldÚb1Úb2ÚflatÚcrossÚdeltaz4no flattened books with both counterpart bids loggedc                 s   s   | ]}|d  V  qdS )rA   Nr   ©r4   r   r   r   r   r9   }   r   c                 s   s   | ]}|d  V  qdS )rB   Nr   rD   r   r   r   r9   ~   r   c                 s   s   | ]}|d  dkrdV  qdS )rC   r   r   Nr   rD   r   r   r   r9      r   c                 S   s   g | ]}|d  ‘qS )rC   r   rD   r   r   r   r7   €   r   z"FLATTEN vs CROSS-OUT at 1-of-3   (z! flattened books with both bids)
z  ZruleZ12ú ztotal c/contractz>18z$ at size 10z>14zper bookz>10Zflattenz>18,.1fé
   z>14,.2fz>10,.2fz	cross outz
  difference   : z+,.2fz
 dollars (z+.2fz c/contract per book)z  cross-out better on ú/z books (z.0fz%)z  delta mean z
c  median zc  sd z.2fÚcg      à?z  t = g\�Âõ(\ÿ?ZSIGNIFICANTznot significantc                 s   s    | ]}t |d  |d ƒV  qdS )rA   rB   N)ÚmaxrD   r   r   r   r9   •   r   z
  Zconditionalz)   <- pick the better of the two per bookz  gain over always-flatten: c                 s   s"   | ]}|d  |d krdV  qdS )rB   rA   r   Nr   rD   r   r   r   r9   š   r   z  would cross out on z books, flatten on c                 S   s   | d S ©NrC   r   r   r   r   r   r   �   r   zmain.<locals>.<lambda>r   é   c                 S   s
   | d  S rJ   r   r   r   r   r   r   ž   r   z!
  where crossing out helps most:z    Ú5r=   é"   Z34z sold r>   z bids r?   r@   rC   z+7.1fz
  where it hurts most:)r-   Úitemsr   ÚRE_COSTÚsearchÚRE_SOLDr   ÚgroupÚlenÚanyr   r	   r$   ÚprintÚsumÚ
statisticsZmeanZmedianZstdevÚabsÚsorted)r(   r.   r)   Zflat_rowr*   Zrsr   Zm_costZm_soldr>   Zflat_pnlZothersZbidsZrebr,   rB   ÚnZf_totZc_totZbetterr   ZseZbest_totZxsZworstr/   r   )r6   r+   r   r   ÚmainN   sÈ    

ÿÿ
ý
(00ÿ
&þ
ÿ
ÿþ ÿ ÿ
ÿ
0ÿÿÿ0ÿÿÿr[   Ú__main__)N)Ú__doc__r#   ÚosÚrer    rW   r   Úcollectionsr   Úpathlibr   r!   r   ÚcompilerO   rQ   r	   r   r-   r1   r[   Ú__name__r   r   r   r   Ú<module>   s&   


[