# -*- coding: utf-8 -*-
"""
Created on Sat Jun 22 17:51:08 2019

@author: Oscar Flores
"""
#%% Importar Librerías. 
import pickle 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from Simulacion import Optimizacion
from Simulacion import Graficos
from Simulacion import Genetico
from Simulacion import Kclusters


simulacion = Optimizacion.simulacion
grafico = Graficos.simulacion
genetico = Genetico.genetico
k_clusters = Kclusters.k_clusters
#%%############################################################################
############################  Crear model_close ###############################'ALFAA.MX',
############################################################################### 

#%% Datos en csv
csv = ['AMXL.MX','WALMEX.MX','TLEVISACPO.MX','GMEXICOB.MX','GFNORTEO.MX','CEMEXCPO.MX','PENOLES.MX','GFINBURO.MX','ELEKTRA.MX','BIMBOA.MX','AC.MX','KIMBERA.MX','LABB.MX','LIVEPOL1.MX','ASURB.MX','GAPB.MX','ALPEKA.MX','GRUMAB.MX','ALSEA.MX','GCARSOA1.MX','PINFRA.MX']
for i in np.arange(len(csv)):
    csv[i] = '../Train/%s.csv'%csv[i] # Se utilizan datos hasta inicios de 2019. El resto del año queda para probar el modelo. 
#    csv[i] = '../Test/%s.csv'%csv[i] #Se utilizan todos los datos para hacer las pruebas
cetes = 'cetes_diarios.csv'

#ndias = [3,5,8,13,21,34,55,89,144]
#n_clusters = 2
ndias = [5,20,40,125]
n_clusters = 4
#%% Guardamos model_close en model_close.sav
nombre = 'model_close'
#k_clusters(csv, ndias, n_clusters, nombre)

#%% Importamos model_close para futuro uso.
model_close = pickle.load(open('model_close.sav','rb'))

#%% Se crea vector de toma de decisiones para futuro uso
#Ud = np.random.randint(-1,2,len(model_close)**len(ndias))
Ud = np.zeros(len(model_close)**len(ndias))
#%%############################################################################
######################  Simulación para optimización ##########################
###############################################################################

#%% Simulamos
Vp = simulacion(csv,ndias,model_close,Ud,cetes)
#Vp = simulacion(csv,ndias,model_close,padres[-4],cetes)
#Vp = simulacion(csv,ndias,model_close,np.ones(Ud.shape),cetes)

#%% Calculamos y graficamos algunos datos sobre el desempeño general
#Rend =  np.diff(Vp) / Vp[:,:-1] #Rendimientos diarios.
#Port = Rend.mean(axis=0) #Creamos un portafolio con la misma cantidad de dinero en cada activo. 
#Mean = Port.mean() #Se calcula el rendimiento esperado del portafolio y la estrategia aplicada
#Std = Port.std() #Se calcula la volatilidad diaria
#plt.scatter((Std*252)**0.5,Mean*252) #Se grafica la volatilidad anual contra el rendimiento anual. 
#

#%% Graficamos los ultimos n datos
#ult = 176
#plt.plot(Vp[:,-ult:].T/Vp[:,-ult]) #Se grafica el comportamiento en el periodo desconocido (ult dias)
#np.mean(Vp[:,-1].T/Vp[:,-ult]) #rendimiento promedio en periodo desconocido
#%%############################################################################
#########################  Simulación para Graficar ###########################
###############################################################################

#%% graficamos todas las simulaciones
#Sim = grafico(csv,ndias,model_close,Ud,cetes)
#Sim = grafico(csv,ndias,model_close,padres[-1],cetes)

#%%############################################################################
###################  Optimización por algorigmo genético ######################
###############################################################################
[punt,padres,hist_mean,hist_std,hist_cal,hist_padres] = pickle.load(open('Intento3.sav','rb'))

#%% Simulamos

l_vec = len(model_close)**len(ndias) # longitud de cada vector de toma de decisiones
n_vec = 128 # cantidad de vectores de toma de decisiones por generacion en potencias de 2. 
iteraciones = 100
C = 1 # aumenta o disminuye la pena a la volatilidad cuando se utiliza J = mean-C*std. C tiene que ser > 0
rf = 0.0471 # Tasa libre de riesgo (real, anual) promedio del periodo de entrenamiento
C0 = padres # La cantidad de vectores de condición inicial tienen que ser menor a la cantidad de vectores con la que se trabajará en el AG. 
nombre = 'Intento3_2'
#####genetico(func,C0,csv,cetes,ndias,model_close,l_vec,n_vec,iteraciones,C,rf,nombre):
#genetico(simulacion,C0,csv,cetes,ndias,model_close,l_vec,n_vec,iteraciones,C,rf,nombre)

#%%
[punt,padres,hist_mean,hist_std,hist_cal,hist_padres] = pickle.load(open(nombre + '.sav','rb'))

#%%
fig = plt.figure()
plt.plot(hist_cal)
plt.show()
#%%
fig = plt.figure()
plt.plot(hist_std[-1],hist_mean[-1],'k.')
plt.plot([0,hist_std[-1][-2]],[rf/252,hist_mean[-1][-2]])
plt.show()


#%%
#%%
#%%
#%%############################################################################
######################## GRAFICOS! para el artículo ###########################
###############################################################################

#%% Grafico para cuando se tiene posición larga en todos los activos. 
Ud = np.zeros(len(model_close)**len(ndias))
Vp = simulacion(csv,ndias,model_close,np.ones(Ud.shape),cetes)
fig = plt.figure(figsize=(10,6))
plt.plot(Vp.T)
plt.title('Assets')
plt.xlabel('business days since 2013-04-25')
plt.ylabel('position value')
fig.text(.5, -.0, '1424 business days with a long position, from 2013-04-25 to 2018-12-31', ha='center')
plt.show()
fig.savefig('Assets',bbox_inches='tight')

#%% Grafica de precios de cetes
cts = pd.read_csv('CETES28.csv',index_col='Fecha')
cts = cts.drop(columns = 'Unnamed: 0')
cts.plot().get_figure().savefig('Cetes.png',bbox_inches='tight')
#%%
# model_close[0].__dict__ # para recordar todos los atributos que tienen disponibles. 
fig = plt.figure()

plt.subplot(221)
plt.plot(model_close[0].cluster_centers_.T)
plt.title('5 days')
plt.subplot(222)
plt.plot(model_close[1].cluster_centers_.T)
plt.title('20 days')
plt.subplot(223)
plt.plot(model_close[2].cluster_centers_.T)
plt.title('40 days')
plt.subplot(224)
plt.plot(model_close[3].cluster_centers_.T)
plt.title('125 days')

fig.suptitle("Cluster Centers", fontsize=14)
fig.tight_layout(pad=2.0)
fig.savefig('Cluster_centers')
plt.show()
