
    }i;)                     >   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mZ ddlmZm	Z	m
Z
 ddlmZmZmZmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZm Z  dAde!d	e"d
ee	   fdZ# G d d      Z$ G d d      Z%	 	 	 dBde!de&d	e"de'd
e	e!e
f   f
dZ(e)dk(  rddl*Z* e+e*jX                        dkD  re*jX                  d   ndZ- e+e*jX                        dkD  r e&e*jX                  d         ndZ.de- dZ/ e0dd         e0d        e0de- de.d        e0d         e(e/e.      \  Z1Z2 e0dd         e0d         e0d         e0d!e.dd"e1d   dd#e1d$   d%d&        e0d'e1d(    d)e1d*   d+d,        e0d-e1d.   d/d0e1d1   d/        e0d2e1d3   d/d4e1d5   d+d,        e0d6e1d7   d/        e0d8e1jg                  d9d      d:z  d/d,        e0d;e1jg                  d<d      d+d,        e0d=e1jg                  d>       d?e1jg                  d@              yy)Cum  
PolyEdge v2 — Realistic Backtest

Instead of simulated market prices, this version models what actually happens:

1. Polymarket sets a strike price at the start of each 5-min period
2. Market makers quote YES/NO prices based on recent vol + order flow
3. We model the "crowd" as using a SIMPLER vol model (historical, not EWMA)
4. Our edge: we use a BETTER vol model (EWMA + momentum) 
5. The "mispricing" = difference between crowd's model and our model

This is more realistic because:
- We're not assuming random noise
- The edge comes from a genuine modeling advantage
- Edge is small and realistic (1-5% typical)
    N)datetime)ListDictAny)calc_fair_valuerealized_volmomentum_driftnorm_cdf)RiskManagercalc_taker_fee)INITIAL_BANKROLLSLIPPAGE_PCTVOL_LOOKBACK_BARSMOMENTUM_LOOKBACKMOMENTUM_WEIGHTMIN_EDGEKELLY_FRACTIONMAX_BET_PCTMIN_BET_USDMAX_BET_USDUSE_LIMIT_ORDERSMAX_MARKET_PRICEMIN_MARKET_PRICEfilepathmax_rowsreturnc           	         g g }}t        | d      5 }t        j                  |      }t        |       d}|D ][  }|r||k\  r nR	 t	        j
                  |d   dd d      }|j                  t        |d                |j                  |       |dz  }] ddd       g }	d}
dx}x}x}}t        ||      D ]l  \  }}|j                  |j                  dz  dz  dd      }||
k7  r$|
|	j                  |
||||d	       |}
|x}x}x}}St        ||      }t        ||      }|}n |
r|	j                  |
||||d	       |	S #  Y xY w# 1 sw Y   xY w)
z/Load tick data and resample to M5 OHLC candles.rr   N   z%Y%m%d %H:%M:%S      )minutesecondmicrosecond)timeopenhighlowclose)r&   csvreadernextr   strptimeappendfloatzipreplacer"   maxmin)r   r   pricestimesfr+   countrowtcandlescurrent_startohlcp	bar_starts                    8/var/www/html/crpytotradingbot/polymarket/backtest_v2.pyload_m5_candlesrC   $   s   EF	h	 AV 		CEX-%%c!fSbk3DEeCFm,Q
			 GMAAE6" 
1IIahh!mq%8PQIR	%(q!TU`abc%MAAAq	AAq	AA
 q!AXYZ[N' s$   1EAD>E>E EEc            	       <    e Zd ZdZd ZdefdZddedededefd	Zy
)
CrowdModelz
    Simulates what the 'crowd' (other Polymarket traders) would price the binary at.
    Uses a simpler model: simple historical vol, no momentum adjustment.
    c                      g | _         g | _        y Nr4   returnsselfs    rB   __init__zCrowdModel.__init__N       #%$&    pricec                    | j                   r>| j                  j                  t        j                  || j                   d   z               | j                   j                  |       t        | j                         dkD  r| j                   dd  | _         t        | j                        dkD  r| j                  dd  | _        y y N   i8r4   rI   r.   mathloglenrK   rO   s     rB   updatezCrowdModel.updateR       ;;LLR)@ AB5!t{{c!++de,DKt||s"<<.DL #rN   current_pricestriketime_minr   c           	         t        | j                        dk  ry| j                  dd }t        d |D              t        |      z  }d}t        j                  ||z        }t        |d      }|dz  }|t        j                  |      z  }	|	d	k  r	||kD  rd
S dS t        j                  ||z        d|dz  z  |z  z   |	z  }
t        dt        dt        |
                  S )zDPrice the binary using simple historical vol (no momentum, no EWMA).         ?iNc              3   &   K   | ]	  }|d z    yw)   N ).0r   s     rB   	<genexpr>z*CrowdModel.price_binary.<locals>.<genexpr>b   s     '1!Q$'s   i g?i  g|=g      ?g        g      rb   g{Gz?g\(\?)	rW   rI   sumrU   sqrtr2   rV   r3   r
   )rK   r[   r\   r]   recentvarbars_per_yearvolTsigma_sqrt_td2s              rB   price_binaryzCrowdModel.price_binary[   s    t||r! cd#'''#f+5!iim+,#tn &TYYq\)%'&039c9hh}v-.$a-11DDT4T8B<011rN   N      @__name__
__module____qualname____doc__rL   r/   rY   ro   rc   rN   rB   rE   rE   I   s:    '/E /2% 2 2% 2Z_ 2rN   rE   c            	       <    e Zd ZdZd ZdefdZddedededefd	Zy
)
SmartModelza
    Our model: EWMA vol + momentum adjustment.
    Has a genuine edge over the crowd model.
    c                      g | _         g | _        y rG   rH   rJ   s    rB   rL   zSmartModel.__init__w   rM   rN   rO   c                    | j                   r>| j                  j                  t        j                  || j                   d   z               | j                   j                  |       t        | j                         dkD  r| j                   dd  | _         t        | j                        dkD  r| j                  dd  | _        y y rQ   rT   rX   s     rB   rY   zSmartModel.update{   rZ   rN   r[   r\   r]   r   c                     t        | j                        t        k  ryt        | j                  t         d d      }t	        | j
                  t              }t        |||||t              S )z'Price binary using EWMA vol + momentum.r`   N   )	ewma_span)r[   r\   rk   time_to_expiry_mindriftmomentum_weight)	rW   rI   r   r   r	   r4   r   r   r   )rK   r[   r\   r]   rk   r   s         rB   ro   zSmartModel.price_binary   sc    t||004<<):(:(;<Kt{{,=>''+
 	
rN   Nrp   rr   rc   rN   rB   rx   rx   r   s:    '/E /
% 
 
% 
Z_ 
rN   rx     bankrollverbosec                    t        | |      }|rt        dt        |       d       t               }t	               }t        |      }t        t        d      dz   }g }	g }
d}t        |      D ]<  \  }}|d   j                         }||k7  r|}|j                          |j                          |j                  |d          |j                  |d          ||k  ro|d   }||d	z
     d   }|j                  ||d
      }|j                  ||d
      }||z
  }|
j                  |       t        |      t         k  r|dkD  rd}|}|t"        kD  rd}d	|z
  }|t"        kD  rt        |      }|t$        k  r|j'                         \  }}|s||z   }t        dt)        d|            }d	|z
  |z  }|dk  rI||z  d	|z
  z
  |z  }|dk  r^|t*        z  |j,                  z  }t        t.        t)        |t0        |j,                  t2        z              }t)        |t4        z   d      }||z  }|d   |kD  }|dk(  xr |xs
 |dk(  xr | }|r	|d	|z
  z  } n| } t6        st9        ||      nd}!|t;        |d         ||||| |!| |!z
  |||||d}"|j=                  |"       |	j                  |"       ? |j?                         }#t        |      |z
  |#d<   |
r|
D $cg c]  }$t        |$       }%}$tA        |
      t        |
      z  |#d<   tA        |%      t        |%      z  |#d<   t        |%      |#d<   tA        d |%D              |#d<   |#d   t        |
      z  dz  |#d<   |r(t;        ||   d         |#d<   t;        |d   d         |#d<   |#|	fS c c}$w )z4
    Run v2 backtest with crowd vs smart model.
    zLoaded z M5 candlesr_   
   Nr%   r)   r&   r    rq   r   buy_yesbuy_nog{Gz?gGz?)barr%   	directionbet_size	buy_pricewonpnlfeenet_pnledgecrowd_pricesmart_pricebtcr\   
total_barsavg_edgeavg_abs_edgemax_edgec              3   4   K   | ]  }|t         k\  sd   yw)r    N)r   )rd   es     rB   re   z"run_backtest_v2.<locals>.<genexpr>  s     +R!AMA+Rs   edge_above_thresholdd   edge_pct_tradeable
start_daterR   end_date)!rC   printrW   rE   rx   r   r2   r   	enumeratedatenew_daytickrY   ro   r.   absr   r   r   	can_trader3   r   r   r   r   r   r   r   r   strrecord_trade	get_statsrf   )&r   r   r   r   r:   crowdsmartriskwarmuptradesedge_distributioncurrent_dayicandlecdr\   
prev_closer   r   r   r   r   allowedreasonr@   bkelly_fbetactual_priceshares	btc_abover   r   r   tradestatsr   	abs_edgess&                                         rB   run_backtest_v2r      s    h1GG~[12LELEx D"B'",FFKw' c	6F^  "KLLN		 	VG_%VG_%v: QqS\'*
 ((VSA((VSA [(  & t9x!8!I#I++ IKI++t9D'' ..* c$l#]i'6q5AE?a'a<&6+s3T]][5PQR 9|3T:|# 7Of,	I%3)ah9N9`W`S`A,-C$C7Gn\3/Q v'"%Sy&&
" 	% eGcJ NNEg,/E, %67SV7	7 12S9J5KKj #IY ?n	Nj(++Ry+R(R$%&+,B&CcJ[F\&\_b&b"#!'&/&"9:lF 34j&= 8s   N__main__r    202601rb   z3/var/www/html/crpytotradingbot/data/monthly/BTCUSD_z.csv
z<============================================================z'PolyEdge v2: Smart Model vs Crowd ModelzMonth: z | Bankroll: $z,.2fRESULTSz  $u    → $z (
return_pctz+.2fz%)z
  Trades: total_tradesz | WR: win_ratez.1f%z  Avg Win: $avg_winz.2fz | Avg Loss: $avg_lossz  PF: profit_factorz | Max DD: max_drawdown_pctz	  Fees: $
total_feesz  Avg Edge: r   r   z  Tradeable bars: r   z
  Period: r   z to r   )r   )r   i T)4rv   rU   r*   osjsonhashlibr   typingr   r   r   
fair_valuer   r   r	   r
   r   r   r   configr   r   r   r   r   r   r   r   r   r   r   r   r   r   intrC   rE   rx   r/   boolr   rs   sysrW   argvmonthr   r   r   r   r   getrc   rN   rB   <module>r      s  "  
 	    " " N N ,   "c "S "d "J&2 &2R!
 !
L 	LLL L 	L
 
#s(^L^ zsxx=1,CHHQK(E%(]Q%6uSXXa[!DHDUG4PH	Bvh-	35	GE7.$
89	VH#Hh7ME6	Bvh-	G	VH	CfU:%6t$<Bu\?RSW>XXZ
[\	Ju^,-WU:5Fs4K1
MN	Ly)#.nU:=Ns<S
TU	F5)#.k%@R:STW9XXY
Z[	IeL)#.
/0	L>15c9#>a
@A	uyy)=qA#Fa
HI	Juyy./tEIIj4I3J
KL3 rN   