
    IriO                        U d 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Zddl	Z
ddlmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlZddlmZmZ ddlmZ dd	lmZ ddlZd
dddddddddd
Z ej        ej                     ej!        d          Z" G d d          Z# G d dej$                  Z% G d dej$                  Z& G d d          Z' edd d!"          Z(e()                    ed#gd$d#gd#g%           da*ee'         e+d&<    G d' d(e          Z, G d) d*e          Z- G d+ d,e          Z. G d- d.e          Z/ ej0                    Z1e(2                    d/          d0             Z3e(4                    d1e/2          d3             Z5e(4                    d4          d5             Z6e(7                    d6e-2          d7e,fd8            Z8e(7                    d9          d7e.fd:            Z9e(7                    d;          dNd<ee:         fd=            Z;e(4                    d>          d?             Z<e=d@k    r e>dA            e>dB            e>dC            e>dA            e>dDedE                      e>dFedG                      e>dHedI                      e>dA            ej?        dJedE         edG         dKdLM           dS dS )Oa8  
ML Inference Server V8 Lite
============================
FastAPI server for V8 Lite model with 24 features (18 technical + 6 String Theory).

Endpoints:
- POST /predict - Get trading signal from model
- GET /health - Health check
- POST /load-model - Load a new model
- GET /model-info - Get current model info
    N)datetime)Path)OptionalListDictAny)deque)FastAPIHTTPException)CORSMiddleware)	BaseModelz0.0.0.0i  z7/var/www/html/bestrading.cuttalo.com/models/btc_v8_litezmodel_best.pt<               
ףp=
?)
hostport	model_dirdefault_modellookbacknum_features
hidden_dim	num_heads
num_layersdropout)levelzml-inference-v8c                      e Zd ZdZedej        defd            Zedej        defd            Z	edej        defd            Z
edej        defd            Zedej        defd	            Zedej        defd
            ZdS )StringTheoryFastz8Optimized String Theory calculations for live inference.pricesreturnc                    t          |           }|dk     rdS t          j        t          j        | dz                       }t          |          dk     rdS |t          j        |          z
  }t          j        |          }t          j        |          t          j        |          z
  }t          j        |          }|dk     s|dk     rdS t          j	        t          j        ||z            t          j        |          z  dd          S )N         ?绽|=
   g?g?)
lennpdifflogmeancumsummaxminstdclip)r!   nreturnsmean_adjr-   RSs          Q/var/www/html/bestrading.cuttalo.com/services/ml-inference/inference_server_v8.py
hurst_fastzStringTheoryFast.hurst_fast=   s    KKr663'"&%0011w<<"3RWW---8$$F6NNRVF^^+F7OOu99E		3wrva!e}}rvayy0#s;;;    c                 *   t          |           dk     rdS t          j        | dd                    | dd         z  }t          j        |          }t          j        |          |dz   z  }t          j        |dz  t          |          dz  z             S )Nr$         ?r&   2   g      @)r(   r)   r*   r0   r,   tanhabs)r!   r3   volbiass       r7   catastrophe_fastz!StringTheoryFast.catastrophe_fastM   s    v;;3'&,''&R.8fWooww3;/wsRx#d))c/1222r9   r3   c                    t          |           dk     rdS t          j        | dd          \  }}||dk             }t          |          dk    rdS ||                                z  }t          j        |t          j        |dz             z             }t          j        |t          j        d          z  dd          S )	Nr'   r%      T)binsdensityr   r&      )r(   r)   	histogramsumr+   r1   )r3   hist_entropys       r7   entropy_fastzStringTheoryFast.entropy_fastV   s    w<<"3,wR>>>aD1H~t99>>3dhhjj 6$u!5!55666ww+Q222r9   c                     t          |           dk     rdS t          j        |           }t          j        |           }|dk     rdS t          j        ||z  dd          S )Nr'           r&   g333333ÿg333333?)r(   r)   r,   varr1   )r3   r,   rQ   s      r7   
kelly_fastzStringTheoryFast.kelly_fastb   sZ    w<<"3wwfWoo;;3wtcz5$///r9   c                    t          |           dk     rdS t          j        | dd                    | dd         z  }t          j        | dd                   | dd         z  }t          j        |g d          }t          j        |g d          }t          j        t          j        t          j        ||z
                      dz            S )	N(   r%   r<   r=   ii)   r>   K   d   )r(   r)   r*   
percentiler?   r,   r@   )r!   r1r2q1q2s        r7   wasserstein_fastz!StringTheoryFast.wasserstein_fastl   s    v;;3WVCDD\""VCF^3WVCG_%%s3w7]2|||,,]2|||,,wrwrvb2g//#5666r9   c                    t          |           dk     rdS t          j        | dd                    | dd         z  }t          j        t          j        |          dz            }t          |          dk    r3t          j        t          |d         |d         z
            dz            nd}t          j        d	|z  d
|z  z   dd          S )Nr$   r%   r<   r=   r>   rH   r   rW   g333333?g?)r(   r)   r*   r?   r0   r@   r1   )r!   r3   rA   moms       r7   instability_fastz!StringTheoryFast.instability_fastv   s    v;;3'&,''&R.8gbfWoo*++>A'llQ>N>Nbgc'"+
233c9:::TUwsSy39,a333r9   N)__name__
__module____qualname____doc__staticmethodr)   ndarrayfloatr8   rC   rN   rR   r]   r`    r9   r7   r    r    :   s8       BB<2: <% < < < \< 3 3 3 3 3 \3 	3bj 	3U 	3 	3 	3 \	3 0BJ 05 0 0 0 \0 7 7 7 7 7 \7 4 4 4 4 4 \4 4 4r9   r    c                   0     e Zd Zddedef fdZd Z xZS )PositionalEncoding  d_modelmax_lenc                 `   t                                                       t          j        |                              d          }t          j        t          j        d|d          t          j        d           |z  z            }t          j        d||          }t          j	        ||z            |dd d dd df<   |dz  dk    r#t          j
        ||z            |dd d dd df<   n*t          j
        ||d d         z            |dd d dd df<   |                     d|           d S )NrH   r      g     @r=   pe)super__init__torcharange	unsqueezeexpr)   r+   zerossincosregister_buffer)selfrl   rm   positiondiv_termrp   	__class__s         r7   rr   zPositionalEncoding.__init__   s(   <((221559U\!Wa88RVG__<Lw<VWXX[GW--8h#6771aaaA:Q;!"Yx(':;;Bq!!!QTTzNN"Yx(3B3-'?@@Bq!!!QTTzNT2&&&&&r9   c                 T    || j         d d d |                    d          f         z   S )NrH   )rp   size)r{   xs     r7   forwardzPositionalEncoding.forward   s*    47111jqvvayyj=)))r9   )rk   )ra   rb   rc   intrr   r   __classcell__r~   s   @r7   rj   rj      s_        
' 
' 
'c 
' 
' 
' 
' 
' 
'* * * * * * *r9   rj   c                   J     e Zd ZdZdef fdZd Zd	dej        de	fdZ
 xZS )
TradingTransformerV8z&V8 Transformer with attention pooling.configc           
         t                                                       |                    dd          dz   }|                    dd          }|                    dd          }t          j        t          j        ||          t          j        |          t          j                    t          j        |dz                      | _	        t          ||                    d	d
                    | _        t          j        ||                    dd          |dz  |dd          }t          j        ||                    dd                    | _        t          j        t          j        |d          t          j        d                    | _        |dz  }t          j        t          j        ||          t          j        |          t          j                    t          j        |          t          j        |d                    | _        t          j        t          j        ||          t          j        |          t          j                    t          j        |          t          j        |d                    | _        d S )Nr   r   rH   r   r   r   r   ro   r   r   r   r   geluT)rl   nheaddim_feedforwardr   
activationbatch_firstr   r   dim)rq   rr   getnn
SequentialLinear	LayerNormGELUDropout
input_projrj   pos_encoderTransformerEncoderLayerTransformerEncodertransformerSoftmaxattention_poolpolicy_head
value_head)r{   r   	input_dimr   r   encoder_layerhead_hiddenr~   s          r7   rr   zTradingTransformerV8.__init__   s   JJ~r22Q6	ZZc22
**Y---Ii,,L$$GIIJw{##	
 
 .j&**ZQS:T:TUU2**[!,,&N
 
 
 0

<YZ@[@[\\ mBIj!,D,DbjUVFWFWFWXX Ao=Ij+..[0I0IGIIrz'**BIk1,E,E
 
 -Ij+..[0I0IGIIrz'**BIk1,E,E
 
r9   c                    |                      |          }|                     |          }|                     |          }|                     |          }t	          j        ||z  d          }|                     |          }t	          j        |d d ddf                   }t	          j        |d d ddf         dd          }| 	                    |          }|||fS )NrH   r   r   ro         r%   )
r   r   r   r   rs   rJ   r   r?   clampr   )r{   r   attnpolicyaction_meanaction_log_stdvalues          r7   r   zTradingTransformerV8.forward   s    OOAQQ""1%%Ia$hA&&&!!!$$j1Q300VAAAqsF^T3??""NE11r9   Tr   deterministicc                    |                      |          \  }}}|r(|                                |                                fS t          j        |          }t          j                            ||          }|                                }t          j        |dd          }|                                |                                fS )zGet action for inference.r=   rH   )r   squeezers   rv   distributionsNormalsampler   )	r{   r   r   r   r   r   
action_stddistactions	            r7   
get_actionzTradingTransformerV8.get_action   s    -1\\!__*^U 	:&&((%--//99Y~..
"))+zBBVR++~~00r9   )T)ra   rb   rc   rd   dictrr   r   rs   Tensorboolr   r   r   s   @r7   r   r      s        00"
t "
 "
 "
 "
 "
 "
H2 2 21 1EL 1 1 1 1 1 1 1 1 1r9   r   c                       e Zd ZdZdefdZdedefdZdde	e
         d	e
dej        fd
Zddede
d	e
deeef         fdZddee         fdZdS )InferenceEngineV8z<Manages model loading and inference for V8 with 24 features.r   c                 *   || _         t          j        t          j                                        rdnd          | _        d | _        i | _        i | _        |                    dd          | _	        t                              d| j                    d S )Ncudacpur   r   z!InferenceEngineV8 initialized on )r   rs   devicer   is_availablemodel
model_infoprice_buffersr   r   loggerinfo)r{   r   s     r7   rr   zInferenceEngineV8.__init__   s    lUZ-D-D-F-F#Q66ERR59
*, 02

:r22EEEFFFFFr9   
model_pathr"   c           	      x   	 t           j                            |          st                              d|            dS t          j        || j        d          }|                    d| j	                  }t          |          | _        | j                            |d                    | j                            | j                   | j                                         |                    dd          }t          |d          r|                                }|                    d	d          }t          |d          r|                                }|t#          j                                                    |t)          |t*          t,          f          rt-          |          n|d
dd |                                D             d| _        t                              d|            dS # t4          $ r@}t                              d|            ddl}|                                 Y d}~dS d}~ww xY w)zLoad a V8 PyTorch model.zModel not found: F)map_locationweights_onlyr   model_state_dictbest_rewardunknownitemepisodeV8_LITEr   c                 R    i | ]$\  }}t          |          |t          |          %S rh   )callablestr).0kvs      r7   
<dictcomp>z0InferenceEngineV8.load_model.<locals>.<dictcomp>  s0    YYYAXVW[[Y1c!ffYYYr9   )path	loaded_atr   r   versionfeaturesr   zV8 Model loaded: TFailed to load model: r   N)osr   existsr   errorrs   loadr   r   r   r   r   load_state_dicttoevalhasattrr   r   now	isoformat
isinstancer   rg   itemsr   r   	Exception	traceback	print_exc)r{   r   
checkpointmodel_configr   r   er   s           r7   
load_modelzInferenceEngineV8.load_model   s&   )	7>>*-- ===>>>uJT[W\]]]J &>>(DK@@L .l;;DJJ&&z2D'EFFFJMM$+&&&JOO %..	BBK{F++ 1)..00 nnY	::Gw'' )!,,.. #%\^^5577"5?cSX\5Z5Zku[111`k$YY1C1C1E1EYYY DO KK8J889994 	 	 	LL5!55666!!!55555		s   <G/  F-G/ /
H995H44H9r   r!   current_positionc           	         t          |          }t          j        |dft          j                  }t          j        |t          j                  }t          j        |          }|                                j	        }t          g d          D ]f\  }}	||	k    r[t          j        |          }
||	d         |d|	          z
  |d|	          z  |
|	d<   t          j        |
dz  dd          |dd|f<   gt          g d          D ]\  }}	||	k    r|                                                    |	                                          j	        t          j        d	          z  }t          j        t          j        |d
z  dd                    |ddd|z   f<   |                    d                                          j	        }|                    d                                          j	        }|                    d                                          j	        }t          j        t          j        ||z
  |dz   z  dz  dd                    |dddf<   t          j        t          j        ||z
  |dz   z  dz  dd                    |dddf<   t          j        t          j        ||z
  |dz   z  dz  dd                    |dddf<   t          j        ||d                   }t          j        |dk    |d          }t          j        |dk     | d          }t          j        |                              d                                          j	        }t          j        |                              d                                          j	        }t          j        ||dz   z            }d
d
d|z   z  z
  }t          j        |dz
  dz  dd          |dddf<   t          j        |          }|dk    r%|dd         |dd         z
  |dd         z  |dd<   t          j        |dz  dd          |dddf<   t          j        |          }|dk    r|dd         |dd         z
  |dd<   t          j        t          j        |d
z  dd                    |dddf<   t          j        |                              d                                          j	        }t          j        |                              d                                          j	        }t          j        t          j        ||z
  |dz   z  dd                    |dddf<   t'          d|          D ]f}t          j        t          j        ||dz
  |                   t          j        ||dz
  |                   z
  ||         z  dz  dd          ||df<   gt'          d|          D ]p}t          j        ||dz
  |                   }t          j        ||dz
  |                   }|dk    r*t          j        ||         |z
  |z  dz  dd          ||d f<   q|dk    r4|d!d         }t          j        |          |dd         z  }t,                              |          d"z
  dz  |d#<   dt,                              |          z
  |d$<   t,                              |          dz  dz
  |d%<   t,                              |          d&z  |d'<   t,                              |          dz  dz
  |d(<   t,                              |          dz  dz
  |d)<   t'          t)          d|| j        z
            |dz
            D ]}|dd*d+f         ||d*d+f<   ||ddd+f<   t          j        |d,d-d./                              t          j                  S )0zBCompute 24 features from price history (matches training exactly).rU   )dtype)rH      rE      r   Nr'   r   )r   rE   r   r   i  rW   r   r   r   r   r&   	      )prepend   rH   r>   r=      ir$      rE      ro      ir%   )r=      )r=      )r=   r$      )r=      )r=      )r=      r   r   rP   g      @r   )nanposinfneginf)r(   r)   rw   float32arrayfloat64pdSeries
pct_changevalues	enumerater1   rollingr0   sqrt
nan_to_numr,   r*   whereranger.   r/   r    r8   rC   rN   rR   r]   r`   r   astype)r{   r!   r   r2   r   
prices_arrprice_seriesr  iperiodretrA   sma_10sma_30sma_60deltagainlossavg_gainavg_lossrsrsirocr_   	vol_shortvol_longjr,   r0   pwr3   s                                  r7   compute_featuresz"InferenceEngineV8.compute_features  s   KK8QG2:666XfBJ777
y,,!,,..5
 ##5#5#566 	: 	:IAv6zzhqkk *677 3j6'6J JjYa[aZaYaNbbFGG!#r2q!9!9A #???33 	M 	MIAv6zz"--//77??CCEELrwW]^%']2739a3K3K%L%LAE" %%b))..007%%b))..007%%b))..007rwFUN/SVX/XZ\^_'`'`aaA-&Ve^0TWY0Y[]_`(a(abbB-f1DRW0X[]0]_acd(e(effB 
JqM:::x	5!,,x	E61--9T??**2..3355<9T??**2..3355<]8x%'7899C1r6N"'38r/2q99Bhqkkr66"233*TcT*::j#>NNCH'#(B22Bhqkkq55 nz#2#6CG-c	2q(A(ABBB Ij))11"5599;;B	9Z((004488::A-X1E(UZJZ0[]_ab(c(cddBr1 	| 	|A grvj2a.@'A'ABF:VWXZVZ[\V\K]D^D^'^blmnbo&ort&tvwyz{{HQUOOr1 	S 	SA7:ad1f-..D&AbDF+,,CQww"$':a=4+?3*F*JBPQ"R"RB 77CDD!BgbkkBssG+G 0 ; ;B ? ?# EJHV #3#D#DR#H#HHHV/<<WEEIAMHV/::7CCaGHV/@@DDqH1LHV/@@DDqH1LHV 3q!dm"344a!e<< 9 9%-b"R%i%8BrE"" +B}X3s4HHHOOPRPZ[[[r9   pairpricec                 p   | j         ddiS || j        vr.t          t          d| j        dz                      | j        |<   | j        |                             |           t          | j        |                   | j        k     rGdddd|||t          | j        |                   d	t          | j        |                    d
| j         d	S t          | j        |                   }|                     ||          }|| j         d         }t          j
        |                              d                              | j                  }t          j                    5  | j                             |d          \  }}ddd           n# 1 swxY w Y   |                                }	|                                }
|	dk    rd}t#          d|	dz
  dz            }n7|	dk     rd}t#          d|	 dz
  dz            }nd}dt%          |	          dz  z
  }||	||
|||t          | j        |                   dd	S )z"Get prediction for a trading pair.Nr   No model loadedx   ro   )maxlenWAITrP   zAccumulating data: /)	signalr   
confidencer   r*  r+  r|   history_lengthmessager   T)r   g333333?LONGr;   gffffff?g333333ӿSHORTHOLDr   )	r2  r   r3  r   r*  r+  r|   r4  r   )r   r   r	   r.   r   appendr(   listr)  rs   FloatTensorru   r   r   no_gradr   r   r/   r@   )r{   r*  r+  r   r!   r   r   r   r   
action_val	value_valr2  r3  s                r7   predictzInferenceEngineV8.predicto  s   :.// t)))',CT]Q=N4O4O'P'P'PDt$ 	4 ''... t!$'((4=88 !,"%d&8&>"?"?`T5G5M1N1N``QUQ^``
 
 
 d(.//((1ABB T]NOO, h''11!4477DD ]__ 	I 	I J11!41HHMFE	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I [[]]
JJLL	 FS:#3s":;;JJ$FSJ;#4";<<JJFs:44J  $(!$"4T":;; 

 

 
	
s    FFFNc                     |r,|| j         v r!| j         |                                          dS dS | j                                          dS )Clear price history buffer.N)r   clear)r{   r*  s     r7   clear_historyzInferenceEngineV8.clear_history  s]     	't)))"4(..00000 *) $$&&&&&r9   )r   N)ra   rb   rc   rd   r   rr   r   r   r   r   rg   r)   rf   r)  r   r   r?  r   rC  rh   r9   r7   r   r      s       FF
Gt 
G 
G 
G 
G+S +T + + + +ZT\ T\tE{ T\e T\TVT^ T\ T\ T\ T\l@
 @
C @
 @
 @
tTWY\T\~ @
 @
 @
 @
D' '(3- ' ' ' ' ' 'r9   r   zML Inference Server V8 Litez<Trading model inference API with 24 features (String Theory)z8.0.0)titledescriptionr   *T)allow_originsallow_credentialsallow_methodsallow_headersenginec                   2    e Zd ZU eed<   eed<   dZeed<   dS )PredictRequestr*  r+  rP   r|   N)ra   rb   rc   r   __annotations__rg   r|   rh   r9   r7   rN  rN    s4         
IIILLLHer9   rN  c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   d	Zee         ed
<   d	Z	ee         ed<   d	Z
ee         ed<   d	S )PredictResponser2  r   r3  r   r*  r+  r|   r4  Nr5  r   r   )ra   rb   rc   r   rO  rg   r   r5  r   r   r   rh   r9   r7   rQ  rQ    s         KKKMMMLLL
IIILLLOOO!GXc]!!!E8C=!GXc]!!!!!r9   rQ  c                       e Zd ZU eed<   dS )LoadModelRequestr   N)ra   rb   rc   r   rO  rh   r9   r7   rS  rS    s         OOOOOr9   rS  c                   B    e Zd ZU eed<   eed<   eed<   eed<   eed<   dS )HealthResponsestatusmodel_loadedr   uptimer   N)ra   rb   rc   r   rO  r   rh   r9   r7   rU  rU    s@         KKKKKKKKKLLLLLr9   rU  startupc                    K   t          t                    at          j                            t          d         t          d                   } t          j                            |           r9t                              |            t          	                    d|             dS t          
                    d|             dS )z)Initialize engine and load default model.r   r   zDefault V8 model loaded: zDefault model not found: N)r   CONFIGrL  r   r   joinr   r   r   r   warning)r   s    r7   startup_eventr^    s       v&&F GLL!4f_6MNNM	w~~m$$ D-(((???@@@@@B=BBCCCCCr9   z/health)response_modelc                     K   dt           rt           j        dundt           rt          t           j                  ndt          t	          j                    t          z
            ddS )zHealth check endpoint.healthyNFzN/Ar   )rV  rW  r   rX  r   )rL  r   r   r   r   r   startup_timerh   r9   r7   healthrc    s^       4:ED00(.9#fm$$$Ehlnn|344  r9   z/model-infoc                  L   K   t           rt           j        sddiS t           j        S )zGet current model information.r   r-  )rL  r   r   rh   r9   r7   r   r     s.        , ,*++r9   z/predictrequestc                    K   t           st          dd          t                               | j        | j        | j                  }d|v rt          d|d                   |S )zGet trading signal prediction.rk   Engine not initializedstatus_codedetailr     )rL  r   r?  r*  r+  r|   )re  results     r7   r?  r?    sh        N4LMMMM^^GL'-9IJJF&F7ODDDDMr9   z/load-modelc                    K   t           st          dd          t                               | j                  }|st          dd| j                   dt           j        dS )zLoad a new model.rk   rg  rh  rk  r   T)successr   )rL  r   r   r   r   )re  rn  s     r7   r   r   &  st        N4LMMMM 233G c4aWM_4a4abbbb6+<===r9   z/clear-historyr*  c                 x   K   t           st          dd          t                               |            d| pddS )rA  rk   rg  rh  Tall)rn  cleared)rL  r   rC  )r*  s    r7   rC  rC  4  sK        N4LMMMM
666r9   z/modelsc                    K   t           d         } t          j                            |           sg | dS d t          j        |           D             }|| t
          r+t
          j        rt
          j                            d          nddS )zList available models.r   )models	directoryc                 <    g | ]}|                     d           |S )z.pt)endswith)r   fs     r7   
<listcomp>zlist_models.<locals>.<listcomp>E  s)    DDDA!**U2C2CDaDDDr9   r   N)rs  rt  current)r[  r   r   r   listdirrL  r   r   )r   rs  s     r7   list_modelsr{  >  s       {#I7>>)$$ 69555DDI..DDDF4:Zv?PZ6$((000VZ  r9   __main__z<============================================================zML INFERENCE SERVER V8 LITEz+24 Features: 18 Technical + 6 String TheoryzHost: r   zPort: r   zModel dir: r   zinference_server_v8:appFr   )r   r   reload	log_levelrD  )@rd   r   sysjsonrs   torch.nnr   numpyr)   pandasr
  r   pathlibr   typingr   r   r   r   collectionsr	   loggingfastapir
   r   fastapi.middleware.corsr   pydanticr   uvicornr[  basicConfigINFO	getLoggerr   r    Modulerj   r   r   appadd_middlewarerL  rO  rN  rQ  rS  rU  r   rb  on_eventr^  r   rc  r   postr?  r   r   rC  r{  ra   printrunrh   r9   r7   <module>r     s  
 
 
 
			 



                             , , , , , , , , , , , ,        * * * * * * * * 2 2 2 2 2 2        J$
 
  ', ' ' ' '		,	-	-C4 C4 C4 C4 C4 C4 C4 C4T* * * * * * * *"A1 A1 A1 A1 A129 A1 A1 A1PZ' Z' Z' Z' Z' Z' Z' Z'B g
'N     %%%     '+"# * * *    Y   " " " " "i " " "    y       Y    x|~~ iD D D >22  32    *_55
> 
 
 
 65
 -
>. 
> 
> 
> 
> 
7 7hsm 7 7 7 7   $ z	E(OOO	E
'(((	E
7888	E(OOO	E
#6&>
#
#$$$	E
#6&>
#
#$$$	E
-{+
-
-...	E(OOOGK!F^F^      r9   