
    0i              
       &
   d dl Zd dlZd dlmZ d dlmZ d dlm	Z
 dZdZdZ ed        ej                  dd	d
      Zed   j#                         j$                  j'                         Zej*                  d k(  r ed       ed ee       d       d Z ee      Z edej4                          dej6                  j9                   ee      d      z  Z ej<                  eeg      Z eedd      ZejA                  e       ejB                  Z" edddd      Z# ejH                  e      Z% ed       d Z&g Z'	 g Z(g Z) e*e ee            Z+ e,de+      D ]3  Z-e)j]                  ee-dz
  e-        e(j]                  ee-dz
  e-dz
          5  ej^                  e)      ja                  d      Z1 ej^                  e(      ja                  d      Z2ejg                  e1      Z4e&d k(  re#jk                  e2e4e%       ne#jk                  e2e4       e#jg                  e2      Z6e1e"e6   z
  Z7 ejp                  e7dz        Z9e'j]                  e9       e&dz  d k(  r ede& de9d        e&d!k\  rne&dz  Z&4 ed"e'd#   d        dYd$Z:dZd%Z; ed&e d'       ed#   Z< e:ee<ee#e"      Z= e;ee      Z> e
j~                  d(dd)*      \  Z@ZAeAd    j                  e'd+d,-       eAd    j                  d.       eAd    j                  d/       eAd    j                  d0       eAd    j                  d1       eAd   j                  ed2d3d45       eAd   j                  d6       eAd   j                  d7       eAd   j                  d8       eAd   j                          ed#   ZH ejH                  e      ZIeAd   j                  eIe=ddd f   d9dd:5       eAd   j                  eIe>d+dd;d<=       eAd   j                  eHd>d?d@eHdAB       eAd   j                  eIe=ddd f   dCz  e=ddd f   dDz  d9dEdFG       eAd   j                  dHe dI       eAd   j                  dJ       eAd   j                  d8       eAd   j                           e
j                           e
j                           edK        edLe dM        edN        ed7dOdPdQdRdPdSdR        edT       dUD ])  ZNeNek  s	 eeNdOdVe=eNdz
  d f   dWdXe>eNdz
     dW       +  edN       y)[    N)KMeans)MLPClassifierd   i,  (   zDownloading BTC data...zBTC-USD2y1d)periodintervalClosezNo BTC data was downloaded. Check internet access, yfinance availability, or provide a cached data source before running this forecast.zBTC data loaded: z daysc           
         g }t        t        |             D ]  }| |   }|dkD  rt        j                  || |dz
     z        nd}|dk\  r;t        j                  t        j                  | |dz
  | | |dz
  |dz
   z              }nd}|dk\  r|| |dz
     z
  | |dz
     z  }nd}|dk\  r$t        j
                  | |dz
  |       }||z  dz
  }nd}|j                  |||||g        t        j                  |      S )z'Build feature vector from price series.r            {Gz?      )rangelennplogstdmeanappendarray)	pricesfeaturesipretvolmommarel_mas	            btc_40_day_forecast.pycreate_featuresr%      s   H3v; 41I *+QbffQ!_%A 6&&qs1qs1Q3 ?@ACC6vac{?fQqSk1CC7"Q(BVaZFFCc623-4. 88H    zFeature vector shape: r      *   
   )
n_clustersrandom_staten_init)2      r   F)hidden_layer_sizesmax_iter
warm_startr+   z
Training ODE-CCT BTC Model...   )classeszEpoch z: MSE = z.6fi  zTraining complete. Final MSE: c                    g }|dddf   }g }t        |       D ]  }	|j                  |      d   }
||
   j                         }|t        j                  j                  |j                  d         z  }|d|z  z   }|j                  |       |dddf   }|j                  |d           t        j                  |      j                         S )z
    ODE-CCT Forecast: System oscillates independently.
    Uses cluster assignment + small perturbation to explore future.
    Nr   r   g      ?)
r   predictcopyr   randomrandnshaper   r   squeeze)steps
last_stategfMnoise_scaleoutxcycle_historystepcluster
next_stateperturbations                r$   predict_ode_cctrI   w   s    
 C47A Me ,))A,q/ wZ__&
 #RYY__QWWQZ%@@#"44


: tQw 	Z]+%,( 88C=  ""r&   c                 f   g }|| ddf   }t        |       D ]  }t        j                  t        j                  |       dz        }||j	                         z  }t        j                  ||z        }|j                  |       t        j
                  |dd |      } t        j                  |      S )z,
    Simple AR fallback for comparison.
    Nr   g?r   )r   r   exparangesumr   r   )r<   serieswindowrB   last_weightspreds           r$   
predict_arrT      s     C6'(A+D5\ )&&"))F++c127;;= vvdWn%

4yyab4() 88C=r&   z
Generating z-day forecast...r   )r   r)   )figsizebluegffffff?)coloralphaz!ODE-CCT Training: MSE ConvergenceEpochMSEr   blackg?z	BTC Close)rW   	linewidthlabelzBTC-USD Historical PriceDayzPrice (USD)redzODE-CCT Forecastz--zAR Forecast)rW   r\   	linestyler]   green:zLast Price: $z.0f)yrW   r`   r]   gffffff?g?g?u	   ±5% Band)rW   rX   r]   zBTC-USD z-Day Forecastz
Days Aheadz=
============================================================zBTC Forecast - Next z Daysz<============================================================z<6 zODE-CCTz<15ARz<------------------------------------------------------------)r   r'   r)      r   z $z>12,.0fz   $)r   )r   )Onumpyr   yfinanceyfsklearn.clusterr   sklearn.neural_networkr   matplotlib.pyplotpyplotpltNNNFORECAST_DAYSprintdownloadbtcdropnavaluesflattenclosesizeRuntimeErrorr   r%   rN   r:   r8   r9   noisehstackr>   fitcluster_centers_r@   r?   rL   r3   r   mse_historyXytminupperr   idxr   r   r;   yt_X_r6   r   partial_fitpred_clusterserrrM   mserI   rT   r=   forecast_odeforecast_arsubplotsfigaxesplot	set_title
set_xlabel
set_ylabel
set_yscalelegend
last_pricedaysaxhlinefill_betweentight_layoutshowd r&   r$   <module>r      s     " 0 
 
   bkk)D48 	G$$,,.::?
	H  #e*U+ ,: 
	 v||n- . 	ryys6{A..	FE?	#
 ab4 fXeZ\]
"))A,
 ' (

A	BCK EQ &
		&Qs#$	Ac!e$%& "((2,

q
!C	!		Q	B			#AAv	b!W-	b! IIbMM
- 
 C
"&&a.Cs3w!|qc#c+,DyFA; > &{2s&;< =
#D* m_$45 6 BZ
 }j!QB /
 CLLAx0	T Q[c 2 Q  5 6 Q  7  Q  5  Q  5  QU'S D Q  , - Q  5  Q  = ! Q  2Y
ryy QT<1%UaGY Z QT;fTQ^ _ Q*GsMR\]`QaBb c Q  T"1a4(4/"1a4(4/!K  A Q  H]O=9 : Q  <   Q  = ! Q      

 m  ]O51 2 f r
!Ic?!D:. / f	 WAM2bac1f-g6d;qs;KG:TUVW fr&   