No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

C谩lculo de riesgo en inversiones

23/28
Recursos

Aportes 17

Preguntas 1

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Existe una funci贸n en scipy stats para hacer z-scores. permite estandarizar los valores de xi en zi.

Con esta funci贸n, hice la estandarizaci贸n de las 4 inversiones de la siguiente manera:

from scipy import stats

az = stats.zscore(a)
bz = stats.zscore(b)
cz = stats.zscore(c)
dz = stats.zscore(d)

y obtuve por resultado el siguiente gr谩fico:

Not茅 que la fracci贸n de retorno, a pesar de tener las mismas proporciones en todas las inversiones, ahora pasa a tomar valores estandarizados; de igual manera grafiqu茅 el resultado de los riesgos con los valores en z-score y la gr谩fica resultante es la siguiente:

Dentro del gr谩fico del mismo s贸lo me aparecen d y a, justamente las opciones que coincidimos son las 鈥渕ejores鈥 para invertir.

nota: solo agregu茅 esa l铆nea de c贸digo con la funci贸n z-score y reemplac茅 los nombres de las variables en los pasos siguientes 馃榿

Los resultados me dieron similar a los de mis compa帽eros, pero quise graficarlos en histogramas para ver que se pod铆a interpretar, y vi dos cosas.

  • Primero, creo que por la imprecisi贸n del sistema todos tenemos en la inversi贸n a que el resultado es 1, pero en teor铆a no podr铆amos estimar el z para este caso porque la STD es cero y no podemos dividir por cero. Aunque por logica como todos los valores se ubican en la media, su valor deberia ser cero para todos los valores .
  • Segundo, La inversi贸n que mejor comportamiento tiene es la b porque existen una mayor cantidad de datos que se ubican al lado derecho del gr谩fico y tienden a llegar hasta una desviaci贸n est谩ndar de la media.
z = np.array([(i - M[j]) / S[j] for j, i in enumerate(I)])
fig, ax = plt.subplots(2, 2, figsize=(12, 7), dpi=100, facecolor='white')

k = [(0, 0), (0, 1), (1, 0), (1, 1)]
names = ['Inversion a', 'Inversion b', 'Inversion c', 'Inversion d']
colors = ['blue', 'orange', 'green', 'red', ]

for j, i in enumerate(I):
    ax[k[j]].hist(i, bins=15, density=True, label=names[j], color=colors[j])
    ax[k[j]].set_title(names[j])
plt.show()

Yo hice algunas modificaciones:

import numpy as np
a = np.array([0.1]*50)
b = np.sin(np.linspace(0,4,50)) + np.random.uniform(-0.1,0.1,50)
c = np.cos(np.linspace(2,6,50)) + np.random.uniform(-0.1,0.1,50)
d = [i - np.random.uniform(0,0.8) for i in np.linspace(0,1,50)]

I = np.array([a,b,c,d])
ZI = [(i - np.mean(i))/np.std(i) for i in I]

# Graficando
fig,ax  = plt.subplots(1,1,figsize=(15,7),dpi=120)
ax.plot(np.linspace(0,50,50),ZI[0], marker='o', linestyle='dashed',label='Inversi贸n a')
ax.plot(np.linspace(0,50,50),ZI[1], marker='o', linestyle='dashed',label='Inversi贸n b')
ax.plot(np.linspace(0,50,50),ZI[2], marker='o', linestyle='dashed',label='Inversi贸n c')
ax.plot(np.linspace(0,50,50),ZI[3], marker='o', linestyle='dashed',label='Inversi贸n d')
ax.set_xlabel('Tiempo')
ax.set_ylabel('Fraccion de retorno')
ax.legend()
plt.show()

Me da el siguiente grafico:

![](

Para graficar la media y desviacion:

M = np.array([np.mean(x) for x in ZI])
S = np.array([np.std(x) for x in ZI])

fig,ax  = plt.subplots(1,1,figsize=(7,7),dpi=120)
ax.scatter(S[0],M[0], linestyle='dashed',label='Inversi贸n a')
ax.scatter(S[1],M[1], linestyle='dashed',label='Inversi贸n b')
ax.scatter(S[2],M[2], linestyle='dashed',label='Inversi贸n c')
ax.scatter(S[3],M[3], linestyle='dashed',label='Inversi贸n d')
ax.set_xlabel('Riesgo')
ax.set_ylabel('Retorno esperado')
ax.legend()
plt.show()

Me da los siguientes puntos:
Puedo ver que aun estandarizando los vectores la accion a sigue siendo la mejor inversi贸n.

![](

De acuerdo con la media de z_scores de c (que es 0), la inversiones c y a ( media z-scores = 1) deber铆an ser consideradas para el portafolio.

Hola Platzitueros,
Al correr en mi copia del colab el primer ejemplo del profesor, no me permit铆a hacer la gr谩fica. Me indicaba el siguiente error: AttributeError: 鈥榤odule鈥 object has no attribute 'pyplot鈥
Buscando, encontr茅 la siguiente explicaci贸n: Parece habitual hacerlo: import matplotlib.pyplot as pltmomento en el que puede utilizar las distintas funciones y clases que contiene:
Por lo tanto agregu茅 la importaci贸n del anterior y, 隆result贸! Entonces en mi c贸digo las importaciones fueron:

import matplotlib as plt
import matplotlib.pyplot as plt
import numpy as np```

Espero ayude a quien le suceda. Saludos

Creo que ser铆a mejor invertir en la opci贸n a, a menos que me haya equivocado al graficar ^^鈥

驴Por que los Z-scores de A son 1?
Si al hacerlo de forma manual se obtiene un 0/0 para cada elemento.

Muy interesante el uso del Mean (siendo el promedio de retorno) y la desviaci贸n est谩ndar (el riesgo) en inversiones aunque me genera la duda si en este caso la cantidad de sigmas se utilizan como mayor precisi贸n o certeza.

Aqu铆 se puede ver la variaci贸n con respecto a STD de cada inversi贸n. Las agrup茅 en una misma gr谩fica para poder deducir c煤al nos conciene m谩s

Aqu铆 la comparaci贸n de las graficas retorno/riesgo antes y despu茅s de la estandarizaci贸n.

NOTA: Cuando se calcula el vector a2 (a estandarizado) noten que el resultado deber铆a ser cero. Pero python devuelve un 鈥榗asi cero鈥 (algo como 1e-18) y cuando divide 鈥榗asi cero鈥 / 鈥榗asi cero鈥 da un uno, no un cero como deber铆a, por lo que lo cree con np.zeros(50) .
As铆 quedan las graficas estandarizadas:

Se nota que la verde es la mera buena, aunque tiene bastante riesgo.

Que buen contenido, gracias

al analizar los datos con una z score lo que creo que se hace es calcular un 铆ndice de que tan** buena idea** es invertir en cada punto del 铆ndice porque relaciona:

  1. la std que es cuanto fluct煤a lo
  2. x - avg que se puede interpretar como si el punto x esta en mejor (arriba del promedio) peor (debajo) en relacion al **promedio **
    y los relaciona de forma que x-avg/std por lo que x-avg puede ser alto(贸sea que ahora esta mejor) pero si fluct煤a (std) mucho su valor se va reducir de forma correspondiente

con lo que obtuve este grafico

del que se podr铆a interpretar que la inversi贸n d y c al final seria buena idea invertir en ellas, espec铆ficamente en la d por un posible alto rendimiento pese a su fluctuation adem谩s de que tiende a subir al largo plazo, y en la c porque esta subiendo considerablemente compar谩ndola con como empez贸


nota: la inversi贸n a no aparece por lo que su std es casi 0 y como se divide sus valores se pierden pero en teor铆a seria bajo porque la x-avg es casi 0 / std casi 0 por lo que se puede interpretar que no es tan buena idea a pesar de que es constante porque no te da tanto rendimiento

Ejercicio z-scores

Lo primero que realice fue estandarizar todos los valores dados por el profesor en la clase a los valores de z-scores mediante la f贸rmula dada y despu茅s graficar mi resultado con los nuevos valores estandarizados:

import matplotlib.pyplot as plt
import numpy as np

a = np.array([0.1]*50) 
b = np.sin(np.linspace(0,4,50)) + np.random.uniform(-0.1,0.1,50)
c = np.cos(np.linspace(2,6,50)) + np.random.uniform(-0.1,0.1,50)
d = [i - np.random.uniform(0,0.8) for i in np.linspace(0,1,50)]

def z (x):
  y= []
  a= np.mean(x)
  b= np.std(x)
  for i in x:
    f= (i-a)/b
    y.append(f)
  return y

a1 = np.array(z (a))  
b1 = np.array(z (b))  
c1 = np.array(z (c))  
d1 = np.array(z (d)) 

fig,ax  = plt.subplots(1,1,figsize=(15,7),dpi=120)
ax.plot(np.linspace(0,50,50),a1, marker='o', linestyle='dashed',label='Inversi贸n a')
ax.plot(np.linspace(0,50,50),b1, marker='o', linestyle='dashed',label='Inversi贸n b')
ax.plot(np.linspace(0,50,50),c1, marker='o', linestyle='dashed',label='Inversi贸n c')
ax.plot(np.linspace(0,50,50),d1, marker='o', linestyle='dashed',label='Inversi贸n d')
ax.set_xlabel('Tiempo')
ax.set_ylabel('Fraccion de retorno')
ax.legend()
plt.show()

Despu茅s, con los valores ya estandarizados, segu铆 los pasos vistos en clase para generar la gr谩fica para comparar el 鈥渞etorno de inversi贸n鈥 contra el 鈥渞iesgo鈥 mediante el siguiente c贸digo:

I1 = np.array([a1,b1,c1,d1])

M1 = np.array([np.mean(x) for x in I1])
S1 = np.array([np.std(x) for x in I1])

fig,ax  = plt.subplots(1,1,sharex=True, sharey=True,figsize=(7,7),dpi=100)
ax.scatter(S1[0],M1[0], linestyle='dashed',label='Inversi贸n a')
ax.scatter(S1[1],M1[1], linestyle='dashed',label='Inversi贸n b')
ax.scatter(S1[2],M1[2], linestyle='dashed',label='Inversi贸n c')
ax.scatter(S1[3],M1[3], linestyle='dashed',label='Inversi贸n d')
ax.set_xlabel('Riesgo')
ax.set_ylabel('Retorno esperado')
ax.legend()

plt.show()

Y la gr谩fica resultante fue esta:

Por alguna raz贸n google colab no me dej贸 graficar los 4 puntos simult谩neamente, as铆 que lo m谩ximo que me pudo mostrar al mismo tiempo fueron estos tres. En el caso de la inversi贸n a, esta se encuentra en la coordenada: 0,1, o sea 0 riesgo y 1 en retorno de inversi贸n.

Si alguien sabe a qu茅 se debe agradecer铆a mucho el aporte.

##Conclusiones
En base a los datos generados con la estandarizaci贸n las inversiones que yo realizar铆a ser铆an en la inversi贸n a y b por lo siguiente:

  • Inversi贸n a: Es una inversi贸n segura (el riesgo se encuentra en 0) que est谩 por encima de la media de retorno de inversi贸n.

  • Inversi贸n b: Es una inversi贸n riesgosa, pero igual de riesgosa que la inversi贸n c y d pero con un retorno de inversi贸n superior.

NOTA: Cualquier feedback es bienvenido para mejorar.

Este video me ayudo a entender mejor el concepto de z-scores:

https://www.youtube.com/watch?v=2tuBREK_mgE

Espero igual les sea de utilidad.

En realidad no se a que conclusi贸n llegar conlo obtenido con los valores de Z score porque no se como interpretarlos de manera correcta. A la conclusi贸n que llegu茅 es que la mejor inversi贸n ser铆a la A porque no hay riesgos de perdida aunque la ganancia sea minima o casi inexistente y considero que la opci贸n que tenga la media mayor de las inversiones que quedan seria la mejor porque significar铆a que normalmente estan arriba de lo que se espera.
Dando click aqu铆 puedes ingresar a mi notebook , me ser铆an de mucha utilidad sus aportes.

def z_score (x):
  return np.mean((x - np.mean(x)) / np.std(x))

z_scores = np.array([z_score(x) for x in I])

Y tuve como resultado array([ 1.00000000e+00, -9.76996262e-17, -6.21724894e-17, 1.99840144e-17])
Lo comprobe con la libreria scipy

from scipy import stats
z_scores_sci = np.array([ np.mean(stats.zscore(x)) for x in I])

el resultado fue el mismo

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats


if __name__=='__main__':

    a = np.array([0.1]*50)
    b = np.sin(np.linspace(0, 4, 50)) + np.random.uniform(-0.1, 0.1, 50)
    c = np.cos(np.linspace(2, 6, 50)) + np.random.uniform(-0.1, 0.1, 50)
    d = [i - np.random.uniform(0, 0.8) for i in np.linspace(0, 1, 50)]

    fig, ax = plt.subplots(1, 1, figsize=(15,7), dpi=120)
    ax.plot(np.linspace(0, 50, 50), a, marker ='o', linestyle='dashed', label='Inversion a')
    ax.plot(np.linspace(0, 50, 50), b, marker ='o', linestyle='dashed', label='Inversion b')
    ax.plot(np.linspace(0, 50, 50), c, marker ='o', linestyle='dashed', label='Inversion c')
    ax.plot(np.linspace(0, 50, 50), d, marker ='o', linestyle='dashed', label='Inversion d')
    ax.set_xlabel('Tiempo')
    ax.set_ylabel('Fraccion de retorno')
    ax.legend()
    #plt.show()

    I = np.array([a, b, c, d])
    M = np.array([np.mean(x) for x in I]) # Retorno esperado
    S = np.array([np.std(x) for x in I])    # Riesgo
    #graficar las desviacion estandar y media
    fig, ax = plt.subplots(1, 1, figsize=(7,7), dpi=120)
    ax.scatter(S[0], M[0], linestyle='dashed', label= 'Inversion a')
    ax.scatter(S[1], M[1], linestyle='dashed', label= 'Inversion b')
    ax.scatter(S[2], M[2], linestyle='dashed', label= 'Inversion c')
    ax.scatter(S[3], M[3], linestyle='dashed', label= 'Inversion d')
    ax.set_xlabel('Riesgo')
    ax.set_ylabel('Retorno Esperando')
    ax.legend()
    #plt.show()

    Zscore = np.array([(w - np.mean(w)*np.ones(len(w)))/np.std(w) for w in I]) # la hace lo mismo que la funcion Zcores de scipy 
    #print(Zscore)
    fig, ax = plt.subplots(1, 1, figsize=(15,7), dpi=120)
    ax.plot(np.linspace(0, 50, 50), Zscore[0], marker ='o', linestyle='dashed', label='Inversion a')
    ax.plot(np.linspace(0, 50, 50), Zscore[1], marker ='o', linestyle='dashed', label='Inversion b')
    ax.plot(np.linspace(0, 50, 50), Zscore[2], marker ='o', linestyle='dashed', label='Inversion c')
    ax.plot(np.linspace(0, 50, 50), Zscore[3], marker ='o', linestyle='dashed', label='Inversion d')
    ax.set_xlabel('Tiempo')
    ax.set_ylabel('Fraccion de retorno')
    ax.legend()
    plt.show()

![](
![](