Gestión de Carteras Mapa de Calor
Gestión de Carteras Mapa de Calor
Importamos librerias
In [1]: import math
import numpy as np
import scipy.stats as scs
import statsmodels.api as sm
import pandas as pd
from pylab import mpl, plt
In [48]: symbols = ['SPY', 'GLD', 'AAPL.O', 'MSFT.O'] #definición de un vector con los activos que queremos (comillas individuales)
data = (pd.DataFrame(raw[symbols].dropna()))
print(data)
In [53]: rets=np.log(data).diff().dropna()
SPY 0.102928
Out[54]:
GLD 0.009141
AAPL.O 0.212359
MSFT.O 0.136648
dtype: float64
In [56]: weights = np.random.random(noa) #DEFINIMOS UN VECTOR, NUMPY biblioteca de funciones matemáticas, random son funciones aleatorias
print(weights)
In [58]: np.dot(rets.mean().T *252, weights) #calculamos la rentabilidad multiplicando las rentabilidades medias
#transponemos la matriz de las medias y se multiplica por los pesos de manera aleatoria
0.10784694169942974
Out[58]:
0.016698627439456583
Out[59]:
0.1292231691278951
Out[60]:
In [61]: def port_ret(weights): #definimos una función portfolio returns, sujeta a los parámetros (weights) precisa de la sangría (:)
return np.dot(rets.mean().T *252, weights)
In [63]: prets = [] #se van guardando los datos de cada resultado de un bucle
pvols = []
In [65]: for p in range (2500): #definimos el bucle, empezamos en p(o cualquier letra)(0) y terminamos en 2500
weights = np.random.random(noa)
weights /= np.sum(weights)
prets.append(port_ret(weights)) #dentro de la caja donde se guardan los datos, agregando datos a la lista
pvols.append(port_vol(weights))
In [66]: prets = np.array(prets) #convertimos la caja donde se guardan los datos en un vector
pvols = np.array(pvols)
In [71]: min_func_sharpe(eweights)
-0.8436203363155412
Out[71]:
fun: -0.8976673894091783
Out[72]:
jac: array([-2.45951116e-04, 1.93044543e-05, 8.96826386e-05, 8.30516219e-05])
message: 'Optimization terminated successfully'
nfev: 30
nit: 6
njev: 6
status: 0
success: True
x: array([0.25454109, 0.04228126, 0.51191352, 0.19126413])
In [73]: opts['x'].round(3)
In [74]: port_ret(opts['x']).round(3)
0.161
Out[74]:
In [75]: port_vol(opts['x']).round(3)
0.18
Out[75]:
0.8976673894091783
Out[76]:
fun: 0.10942155263366907
Out[77]:
jac: array([0.10939826, 0.10944918, 0.11098003, 0.10948556])
message: 'Optimization terminated successfully'
nfev: 45
nit: 9
njev: 9
status: 0
success: True
x: array([0.54326308, 0.45567521, 0. , 0.0010617 ])
In [78]: optv['x'].round(3)
In [79]: port_ret(optv['x']).round(3)
0.06
Out[79]:
In [80]: port_vol(optv['x']).round(3)
0.109
Out[80]:
0.5504173647607122
Out[81]:
Frontera eficiente
In [82]: cons = ({'type': 'eq', 'fun': lambda x: port_ret(x) - tret},
{'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bnds = tuple((0, 1) for x in weights)
In [85]: print(tvols)
In [94]: opt