
    h"j(B                        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
 d dlmZmZ d dlmZmZ d dlZ ej"                  d       ddddd	d
ddddd
Zg ddgdgdgdgdgdgdgdgdgdgdgdZdddd d!d"d#d$d%d&d'd(dZ G d) d*      Z G d+ d,e      Z G d- d.ej.                        Zd3d/Zd4d0Zd1 Zed2k(  r e       \  ZZZyy)5    N)Dataset
DataLoader)datetime	timedeltaignoreMARKET_CRASHVOLATILITY_SPIKEBULL_RUNLIQUIDITY_CRISISGEOPOLITICALNATURAL_DISASTERPOLICY_SHOCKTECH_BUBBLECURRENCY_CRISISNORMAL)
r                           	   )z^GSPCz^DJIz^IXICz^FTSEz^N225z^GDAXIz^FCHIz^HSIz^BSESNz	000001.SSz^KS11z^BVSPz^GSPTSEz^AXJOUSAUKJapanGermanyFrance	Hong_KongIndiaChinaSouth_KoreaBrazilCanada	Australia)gqB@gaTR'W)g{I@g6[)gC6B@gHa@)g>yX5I@gI+$@)gH.!G@g=yX@)gQ6@gPs׊\@)g#4@gaTR'S@)gJ{/LA@gh oZ@)gW2A@g[Ӽ_@)gQx,g~:pI)g{L@g.1Z)g?F9g&䃞͸`@c                   ,    e Zd ZdZddZd Zd ZddZy)	GlobalEventDataCollectorz.Collect global financial data and event labelsNc                     || _         |xs# t        j                         j                  d      | _        i | _        g | _        y )Nz%Y-%m-%d)
start_dater   nowstrftimeend_datedataevents)selfr+   r.   s      ?/home/per/Documents/IsentropicLang/forecaster_yfinance_event.py__init__z!GlobalEventDataCollector.__init__E   s4    $ GHLLN$;$;J$G	    c           	      
   t        d       g }t        j                         D ]l  \  }}|D ]b  }	 t        j                  || j
                  | j                  d      }||d<   ||d<   ||d<   |j                  |       t        d| d| d	       d n t        j                  |t        t        |            D cg c]  }| c}      | _        | j                  S # t        $ r}t        d
| d|        Y d}~d}~ww xY wc c}w )z+Fetch all global indices from Yahoo FinancezFetching global market data...FstartendprogressCountryTicker
Index_Name     ✓ Fetched z ()     ✗ Failed : N)keys)printGLOBAL_INDICESitemsyfdownloadr+   r.   append	Exceptionpdconcatrangelenmarket_data)r1   all_indicescountrytickerstickerr/   eis           r2   fetch_global_indicesz-GlobalEventDataCollector.fetch_global_indicesK   s   ./ . 4 4 6 
	9GW! 	99;;vT__$--bghD&-DO%+DN)/D&&&t,N6("WIQ?@	9
	9 99[5[IYCZ7[a7[\ ! 9M&A37889 8\s   AC7	D 
	C="C88C=c                    t        d       dddddd}i }|j                         D ]r  \  }}	 t        j                  || j                  | j
                  d	      }|j                  s%|d
   j                         ||<   t        d|        nt        d|        t t        j                  |      | _        | j                  S # t        $ r}t        d| d|        Y d}~d}~ww xY w)z9Fetch macroeconomic indicators (VIX, yields, commodities)z
Fetching macro indicators...z^VIXz^TNXCL=FGC=FDX-Y.NYB)VIXTNXrV   rW   rX   Fr6   Closer=   u     ✗ No data for r?   r@   N)rB   rD   rE   rF   r+   r.   emptysqueezerH   rI   	DataFrame
macro_data)r1   macro_tickersr_   namerQ   r/   rR   s          r2   fetch_macro_indicatorsz/GlobalEventDataCollector.fetch_macro_indicators_   s    ./"
 
)//1 		3LD&3{{6dmm^cdzz'+G}'<'<'>Jt$N4&12.tf56		3 ,,z2	  3dV2aS1223s   A,C	C%
C  C%c           	         t        d       i }t        j                         D ]  }| j                  | j                  d   |k(     }t	        |      dk(  r2t        |j                  t        j                        r#|j                  d      d   j                         n|d   }|j                         }|j                  |      j                         t        j                  d      z  }t        j                   t	        |            }t#        t	        |            D ]  }	|	|k  r	|j$                  |	   }
|j$                  |	   }|j$                  t'        d|	dz
        |	dz    }|
d	k  rd||	<   Q|j$                  |	   |j$                  t'        d|	dz
           z  dz
  d
kD  rd||	<   |dkD  rd||	<   |	dkD  r[t)        |d      rO|d   j$                  |	   |d   j$                  t'        d|	dz
        |	 j                         dz   z  }|dk  sd||	<   d||	<    t        j*                  ||j                  d      ||<    || _        |S )z
        Detect events from market data using conditional logic
        Returns event labels for each date and country
        z%
Detecting events from market data...r:   r   r   )levelr[      r   gg333333?r   g?Volumeg333333?r   r   
event_type)indexra   )rB   rC   rA   rM   rL   
isinstancerh   rI   
MultiIndexgroupbymean
pct_changerollingstdnpsqrtzerosrK   ilocmaxhasattrSeriesevent_labels)r1   windowrw   rO   country_datapricesreturns
volatilityr0   rS   daily_returnvolprice_slicevol_drops                 r2   detect_eventsz&GlobalEventDataCollector.detect_eventsy   sO   
 	67%**, )	]G++D,<,<Y,G7,RSL< A% GQQ]QcQcegererFs\)))27;@@B  zF  GN  zOF '')G 0446EJ XXc&k*F3v;' "v:  '||A ooa($kk#a1+ac:  %' !F1Ikk!nv{{3q!A#;'??!CtK !F1I3Y !F1IUw|X>+H5::1=hAWA\A\]`abdefgdg]hijAkApApAruvAvwH#~$%q	 !F1I1"4 %'IIfFLL|$\L!S)	]V )r4   )z
2020-01-01N)r   )__name__
__module____qualname____doc__r3   rT   rb   r    r4   r2   r)   r)   B   s    8 (44r4   r)   c                   $    e Zd ZdZddZd Zd Zy)EventDatasetz0PyTorch Dataset for time series event predictionc           
      *   || _         g | _        g | _        t        |j                  t
        j                        r|j                  j                  d   n|j                  }|j                  |j                        }t        |      D ]  \  }}||k  rg }t        j                         D ]  }	||d   |	k(     }
t        |
      dkD  s|
d   j                  ||z
  | }t        |      |k(  sA|j                         j                  d      }|j!                  |j"                  d   |j%                         |j'                         |j(                  d   |j(                  d   z  dz
  g        |j                  ||z
  | }|j*                  D ]V  }|j!                  ||   j(                  d   ||   j                         j%                         ||   j'                         g       X |j-                  dt        j.                               j-                  |d      }| j                  j1                  |       | j                  j1                  |        t3        j4                  | j                        | _        t3        j4                  | j                        | _        y )Nr   r:   r   r[   r   r   )
seq_lengthfeatureslabelsri   rh   rI   rj   levelsintersection	enumeraterC   rA   rL   locrm   fillnaextendvaluesrl   ro   rs   columnsgetrv   rG   rp   array)r1   rM   r_   rw   r   common_datesdate_idxdatefeature_vectorrO   ry   rz   retsmacro_slicecolus_events                   r2   r3   zEventDataset.__init__   sM   $ 7AARARTVTaTa6b{((//2hshyhy#001A1AB'5 !	)NHd*$  N *..0 *;y+AW+LM|$q()'266x
7J8TF6{j0%00299!<&--"MM"- IIK HHJ#[[_v{{1~=A	/  %..*)<XFK"** %%$))"-$//1668$((*'  $''ryy{;??aHHMM  0KKx(C!	)F /hht{{+r4   c                 ,    t        | j                        S N)rL   r   )r1   s    r2   __len__zEventDataset.__len__   s    4==!!r4   c                     t        j                  | j                  |         t        j                  | j                  |   g      d   fS )Nr   )torchFloatTensorr   
LongTensorr   )r1   idxs     r2   __getitem__zEventDataset.__getitem__   s?      s!34e6F6FTWHXGY6Z[\6]]]r4   N)   )r   r   r   r   r3   r   r   r   r4   r2   r   r      s    :-,^"^r4   r   c                   *     e Zd ZdZd fd	Zd Z xZS )TimeSeriesEventTransformerz^
    Transformer model for event prediction
    Combines encoder with classification head
    c           	         t         |           t        j                  ||      | _        t        j
                  t        j                  dd|            | _        t        j                  |||dz  |d      }t        j                  ||      | _        t        j                  t        j                  |d      t        j                         t        j                  |      t        j                  d|            | _        y )Nr   r   T)d_modelnheaddim_feedforwarddropoutbatch_first)
num_layers@   )superr3   nnLinearinput_projection	Parameterr   randnpos_encoderTransformerEncoderLayerTransformerEncodertransformer
SequentialReLUDropout
classifier)	r1   	input_dimr   r   r   num_classesr   encoder_layer	__class__s	           r2   r3   z#TimeSeriesEventTransformer.__init__   s     "		)W =<<Aq'(BC22#AI
 00:V--IIgr"GGIJJwIIb+&	
r4   c                     | j                  |      j                  d      }|| j                  d d d |j                  d      d d f   z   }| j	                  |      }|d d dd d f   }| j                  |      S )Nr   r   )r   	unsqueezer   sizer   r   )r1   xs     r2   forwardz"TimeSeriesEventTransformer.forward  sy     !!!$..q1  JQVVAYJ!122 Q aQhKq!!r4   )   r   r   
   皙?)r   r   r   r   r3   r   __classcell__)r   s   @r2   r   r      s    

*"r4   r   c                 F   | j                  |      } t        j                         }t        j                  | j                         |      }t        j                  j                  |dd      }g g g d}	t        |      D ]  }
| j                          d}|D ]{  \  }}|j                  |      |j                  |      }}|j                           | |      } |||      }|j                          |j                          ||j                         z  }} | j                          d}d}d}t        j                          5  |D ]  \  }}|j                  |      |j                  |      }} | |      } |||      }||j                         z  }t        j"                  |j$                  d      \  }}||j'                  d      z  }|||k(  j)                         j                         z  } 	 ddd       |t+        |      z  }|t+        |      z  }d	|z  |z  }|	d
   j-                  |       |	d   j-                  |       |	d   j-                  |       |j                  |       |
dz   dz  dk(  st/        d|
dz    d| d|dd|dd|dd        |	S # 1 sw Y   xY w)z Train the event prediction model)lrr         ?)patiencefactor)
train_lossval_lossval_accr   r   Nd   r   r   r   r   zEpoch /z | Train Loss: z.4fz | Val Loss: z | Val Acc: z.2f%)tor   CrossEntropyLossoptimAdam
parameterslr_schedulerReduceLROnPlateaurK   train	zero_gradbackwardstepitemevalr   no_gradrt   r/   r   sumrL   rG   rB   )modeltrain_loader
val_loaderepochsr   device	criterion	optimizer	schedulerhistoryepochr   batch_xbatch_youtputslossr   correcttotal_	predictedavg_train_lossavg_val_lossr   s                           r2   train_modelr     s   HHVE##%I

5++-"5I""44YSV4WIRB?Gv 'K
 , 	&GW&zz&17::f3EWG!GnGWg.DMMONN$))+%J	& 	

]]_ 	?$. ? #*::f#5wzz&7I. '2DIIK'$yyq99a(I0557<<>>?	? $c,&77#j/1-%'$$^4
""<0	!!'*|$AIq F57)1VHON3;O}]ijm\nnz  |C  DG  {H  HI  J  KO'KR N/	? 	?s   >B,JJ 	c                    ddl m} ddlm} t	        j
                  t        j                         D cg c]/  }|| j                  |d      t        | j                  |d         d1 c}      }ddddd	d
ddddddd}|d   j                  |      |d<   |j                  |j                  |d   d|d   |d   dddd            }|j                  dt        ddd      d d!"       |j                          |S c c}w )#ze
    Plot world map with event predictions
    predictions: dict {country: predicted_event_type}
    r   Nr   )rO   event
event_namezUnited StateszUnited Kingdomr   r   r    z	Hong Kongr"   r#   zSouth Korear%   r&   r'   r   rO   country_namezcountry namesr   r   RdYlGn_rzPredicted Event Type)	locationslocationmodeztext
colorscalecolorbar_titlezminzmax)r/   zGlobal Event Forecast MapFTequirectangular)	showframeshowcoastlinesprojection_typei  iX  )titlegeowidthheight)plotly.graph_objectsgraph_objectsplotly.expressexpressrI   r^   rC   rA   r   EVENT_TYPESmapFigure
Choroplethupdate_layoutdictshow)predictions	thresholdgopxrO   dfcountry_mappingfigs           r2   plot_world_map_predictionsr%  P  s3   
 & 
 &**,  koogq&A";??7A#>?	A 
B &6{7=h[	O I**?;B~ ))^$$
W+- ' 	) 	C )-

   	 HHJJOs   4C8c                     t        d       t        d       t        d       t        d      } | j                         }| j                         }| j	                         }t        dt        |       dt        |       d       t        |||d	      }t        d
t        |      z        }t        |      |z
  }t        j                  j                  j                  |||g      \  }}t        |dd      }	t        |dd      }
t        |j                  j                        dkD  r|j                  j                  d   nd}t        |ddddd      }t        dt!        d |j#                         D              dd       t        j$                  j'                         rdnd}t        d|j)                                 t+        ||	|
d|      }|j-                          t        j.                         5  t        j0                  |j                  dd        j3                  |      } ||      }t        j4                  |d      \  }}d d d        t        d        t        d!       t        d       i }t7        t8        j;                               D ]D  \  }}|t              k  s||   j=                         }|||<   t        |d"d#t>        |           F tA        |       |||fS # 1 sw Y   xY w)$Nz<============================================================z0GLOBAL EVENT FORECASTER - PyTorch Implementationz
2022-01-01)r+   z
Data collected: z market records, z macro recordsr   )r   g?    T)
batch_sizeshuffleFr   r   r   r   r   r   )r   r   r   r   r   r   z
Model initialized: c              3   <   K   | ]  }|j                           y wr   )numel).0ps     r2   	<genexpr>zmain.<locals>.<genexpr>  s     %LAaggi%Ls   ,z parameterscudacpuzTraining on: 2   )r   r   iz=
============================================================z#LATEST EVENT PREDICTIONS BY COUNTRY15z -> )!rB   r)   rT   rb   r   rL   r   intr   utilsr/   random_splitr   r   shaper   r   r   r0  is_availableupperr   r   r   r   r   rt   r   rC   rA   r   r  r%  )	collectorrM   r_   rw   dataset
train_sizeval_sizetrain_datasetval_datasetr   r   r   r   r   r   latest_featuresr  r   predicted_eventslatest_predictionsrS   rO   rg   s                          r2   mainrC    s   	&M	
<=	&M )LAI002K113J**,L	s;/00A#j/ARR`
ab ;
LRPG S3w<'(J7|j(H!&!1!1!>!>wU]H^!_M;mDILKBFJ .11A1A1G1G-H1-L  &&q)RUI&E 
!#%L9I9I9K%L"LQ!O{
[\ zz..0VeF	M&,,.)
*+%z"VTG 
JJL	 8++G,<,<ST,BCFFvNO,#iiQ78 
-	
/0	&M 3 3 56 @
7s#$$)!,113J*4w'WRL[%<$=>?	@ 12'---)8 8s   /AK!!K*__main__)r2  gMbP?r0  )r   ) yfinancerE   pandasrI   numpyrp   r   torch.nnr   torch.optimr   torch.utils.datar   r   r   r   warningsfilterwarningsr  rC   COUNTRY_COORDSr)   r   Moduler   r   r%  rC  r   r   r   r  r   r4   r2   <module>rO     s$         0 (     ! " &)YziZ]9ik" 
 !$ &""%&k kb6^7 6^r&" &"X2p0lA.H z"&&E7K r4   