jueves, 3 de mayo de 2018

Estadísticas de la curva de capital

A continuación se muestra el código Python que lee una curva de capital (exportada de Amibroker y almacenada como CSV en la carpeta "Quotes") y genera las estadísticas de media, desviación estándar y ratio Sharpe de la curva de capital.

En la imagen se ve la curva que tiene una volatilidad anualizada del 20.52% y una ganancia media del 19.54%. Eso resulta en un Sharpe de 0.95.

En el código he puesto que pinte el letrero en marzo de 2008 porque la curva de capital empieza en el año 2008. Pero eso refleja mi poca experiencia en Python. Quizás alguien quiera corregirlo y decirme como ajustar el letrero de forma relativa a la esquina superior izquierda :)





----------------------------------------------------------------------------------------

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 26 22:12:03 2017
@author: OSCAR
ESTADISTICAS DEL EQUITY
"""
import pandas as pd 
import matplotlib.pyplot as plt  

#LEEMOS LOS FICHEROS DE LA CARPETA QUOTES 
path = 'C:/Users/OSCAR/Documents/Quotes/'
#ticker = '~~~EQUITY'            
ticker = '~~~EQUITY'     
precios = pd.read_csv(path + ticker + '.csv', 
                    usecols = ['Date','Close'], index_col=["Date"], parse_dates=True) 

#DIFERENCIAS
dif = precios - precios.shift()
dif_porc = dif / 100000   #todo respecto de 100.000
print(dif_porc.describe())

#DESV ANUALIZADA
desv_an = 100 * dif_porc.std() * 16
print("Desv Anualizada = %f " % desv_an)

#MEDIA
media = 100 * dif_porc.mean() * 252
print("Media Anualizada = %f " % media)

#SHARPE
SH = media/desv_an
print("SHARPE = %f " % SH)

#PINTAMOS EL EQUITY
plt.figure() #inicializar el gráfico
plt.plot(precios, color = 'blue', label = ticker)
plt.legend(loc = 'lower right')
plt.xlabel('Fecha')
plt.ylabel('Precio')
plt.text('2008-03-01',precios.iloc[-1]*0.8,
                 'Std = %0.3f' % desv_an['Close'] +' %'
        + '\n' + 'Med = %0.3f'% media['Close'] +' %'
        + '\n' + 'SH = %0.3f' % SH )
----------------------------------------------------------------------------------------

4 comentarios:

  1. Hola Óscar,

    Estaba leyendo este post y no entiendo qué quieres decir con lo siguiente:

    "En el código he puesto que pinte el letrero en marzo de 2008 porque la curva de capital empieza en el año 2008. Pero eso refleja mi poca experiencia en Python. Quizás alguien quiera corregirlo y decirme como ajustar el letrero de forma relativa a la esquina superior izquierda"

    Me podrías aclarar? :-) Gracias...

    ResponderEliminar
  2. Hola Alejandro. Lo que quiero decir con eso es que para pintar el letrero he mirado una fecha en el gráfico que salga más o menos en la parte izquierda (valor del eje x = marzo 2008). Pero eso es un "apaño" porque no servirá cuando cambien los años. Alguien con experiencia en Python pondrá coordenadas relativas al eje X y le servirá cualquier rango de fechas. Me refiero a hacerlo al estilo de lo que hice con el eje Y, pintar el cartel en el 80% del rango. No le he dedicado mucho tiempo a esto y aunque funciona es muy mejorable :) Saludos,

    ResponderEliminar
  3. Y algo así? https://drive.google.com/open?id=1YMg6tZmogsWg_vM7VV3pxZB0pOxiGaUS


    Aquí el código modificado:

    # -*- coding: utf-8 -*-
    """
    Created on Sun Mar 26 22:12:03 2017
    @author: OSCAR
    ESTADISTICAS DEL EQUITY
    """
    import pandas as pd
    import matplotlib.pyplot as plt

    #LEEMOS LOS FICHEROS DE LA CARPETA QUOTES
    path = 'C:/Users/OSCAR/Documents/Quotes/'
    #ticker = '~~~EQUITY'
    ticker = '~~~EQUITY'
    precios = pd.read_csv(path + ticker + '.csv',
    usecols = ['Date','Close'], index_col=["Date"], parse_dates=True)

    #DIFERENCIAS
    dif = precios - precios.shift()
    dif_porc = dif / 100000 #todo respecto de 100.000
    print(dif_porc.describe())

    #DESV ANUALIZADA
    desv_an = 100 * dif_porc.std() * 16
    print("Desv Anualizada = %f " % desv_an)

    #MEDIA
    media = 100 * dif_porc.mean() * 252
    print("Media Anualizada = %f " % media)

    #SHARPE
    SH = media/desv_an
    print("SHARPE = %f " % SH)

    #PINTAMOS EL EQUITY
    plt.figure() #inicializar el gráfico
    plt.xlabel('Fecha')
    plt.ylabel('Precio')
    plt.plot(precios, color = 'blue', label = ticker)
    #####################################################################################
    plt.plot([], [], ' ', label='Std = %0.3f' % desv_an['Close'] + ' %')
    plt.plot([], [], ' ', label='Med = %0.3f' % media['Close'] + ' %')
    plt.plot([], [], ' ', label='SH = %0.3f' % SH + ' %')
    #####################################################################################
    plt.legend(loc='upper left')

    ResponderEliminar
  4. Ahora sí! muchas gracias Alejandro, funciona perfectamente. Me alegra ver que alguien con pericia en Python sigue el blog :))))

    ResponderEliminar

ENTRADAS POPULARES