Ciencia de datos en la nube

Análisis de inversión con IPython y pandas

La Ciencia de Datos es una especialización creciente que tocó muchos de los siguientes temas: Computación en nube, big data, matemáticas, teoría de negocios y teoría de ciencias de la computación. Un lenguaje de scripting como Python usualmente es una gran opción para el ciclo típico de elaboración de prototipos para asegurarse de que las matemáticas del problema funcionen, posteriormente "productizando" el resultado hacia una agrupación centralizada de servidores de nube. Este artículo presenta algunos ejemplos prácticos de análisis de inversiones y análisis estadísticos usando IPython y pandas.

Noah Gift , Founder, CTO, Giftcs

Noah GiftNoah Gift es líder técnico experimentado y desarrollador de software en AT&T Interactive. Resuelve problemas interesantes en diversos lenguajes incluyendo Python/Iron Python, Erlang, F#, C#, y JavaScript. (También trabajó en Caltech, Disney Feature Animation, Sony Imageworks, y Weta Digital.) Es miembro de la Fundación Python Software, y también es autor de muchos artículos de developerWorks y co-autor de Python For Unix and Linux System Administration. Obtuvo su título en Ciencias Nutricionales en el Cal Poly San Luis Obispo, y una maestría de ciencias en Sistemas de Información de Computadora en CSULA, y es candidato a maestría en UC Davis con especialización en análisis de negocios, finanzas, e iniciativa empresarial. En su tiempo libre, compone música en piano y corre en maratones. Lo encuentra en su sitio web, en Twitter, o para consultoría.



27-05-2013

Introducción

Tomemos un tipo de análisis muy común. Usted probablemente ha hecho esto por sí mismo. Suponga que desea analizar el rendimiento de una acción. Usted puede:

  1. Encontrar una acción en Yahoo finance.
  2. Descargar los datos históricos como archivo CSV.
  3. Importar el archivo CSV hacia Excel.
  4. Realizar el análisis matemático: Regresión, estadística descriptiva, u optimización linear usando la herramienta Excel Solver.

Eso está bien, pero este artículo le muestra una manera más sencilla, más intuitiva y más poderosa para realizar el mismo tipo de análisis usando IPython y pandas.

La biblioteca de IPython es una de las herramientas claves para un científico de datos que usa Python. Esta herramienta es un diferenciador de Excel, específicamente debido a que usted puede explorar datos y análisis interactivamente desde un prompt interactivo. Los ejemplos de este artículo usan principalmente IPython como el mecanismo para ejecutarlos.

La Python Data Analysis Library (pandas) es una biblioteca licenciada BSD de código abierto que proporciona estructuras de datos y herramientas de análisis de datos de alto rendimiento para el lenguaje de programación Python.

Iniciar

Para iniciar con IPython y pandas, configure su sistema operativo Linux o Unix como Ubuntu o OS X.

  1. Instale pip, una herramienta para instalar y gestionar paquetes Python. Usted puede haber usado easy_install antes — pip es un reemplazo de easy_install. Para instalar pip, vaya a la página de ín dice de pip del sitio web de Python y siga las instrucciones.
  2. Ahora que tiene pip, instale IPython usando este comando:
    sudo pip install IPython
  3. Use pip para instalar pandas:
    sudo pip install pandas
  4. Una herramienta más para instalar — matplotlib, una biblioteca de trazado para el lenguaje de programación Python y su extensión de matemática numérica NumPy. Use este comando:
    sudo pip install matplotlib

Usted tiene todas las piezas que necesita, así que iniciemos.


Introducción de Pandas

Para alimentar su portafolio de inversiones en pandas, use este código:

Listado 1. Pandas portfolio ingestion
    In [1]: import pandas.io.data as web
    
    In [2]: from pandas import DataFrame
    
    In [3]: data_feed = {}

    In [4]: symbols=['AAPL','FB', 'GOOG', 'SPLK', 'YELP', 'GG','BP','SCPJ','JNJ', 'OMG']
    
    In [5]: for ticker in symbols:
    ...:         data_feed[ticker] = web.get_data_yahoo(ticker, '05/21/2012', '11/1/2012')
    ...:
    
    In [6]: price = DataFrame({tic: data['Adj Close']
    ...:     for tic, data in data_feed.iteritems()})
    
    In [7]: volume = DataFrame({tic: data['Volume']
    ...:     for tic, data in data_feed.iteritems()})
    
    In [8]: returns = price.pct_change()

Para determinar los porcentajes de retorno para el año y trazarlos, el método return DataFrame puede ser llamado junto con plot. Esto se hace llamando a sum que suma cada columna en DataFrame, y al usando matplotlib, que realiza el levantamiento pesado para crear la gráfica mostrada en la Figura 1.

Listado 2. Retornos para el año
    In [9]: import matplotlib.pyplot as plt
    In [10]: returns.sum().plot(kind='bar',title="% Return For Year")
    Out[10]: <matplotlib.axes.AxesSubplot at 0x10c1b0350>
    In [11]: plt.show()

Aquí está el resultado:

Figura 1. Retornos para año
Returns for year

Como puede observar en la Figura 1, Facebook tuvo un IPO irregular y el último año ha perdido cerca del 40% de su valor IPO. En comparación, Yelp — en la misma industria — ha ganado casi 40%. En retrospectiva, disminuyendo Facebook y yendo lejos con Yelp podría haber llevado a un retorno el último año que hubiera casi duplicado la inversión original. La salida de texto para el comando sum() muestra los valores reales en crudo de los retornos anuales en este código:

Listado 3. Salida en crudo de sum
    In [12]: returns.sum()
    Out[12]:
    AAPL    0.077139
    BP      0.155668
    FB     -0.376935
    GG      0.285309
    GOOG    0.124510
    JNJ     0.140735
    OMG     0.145005
    SCPJ    0.189855
    SPLK    0.021382
    YELP    0.357202

Otra manera de ver los datos es creando un histograma del porcentaje diario de retorno para el año y observar si esto revela cualquier conocimiento subyacente acerca de los datos. Afortunadamente, esto es bastante sencillo como el ejemplo de código muestra abajo:

Listado 4. Creando un histograma de retornos diarios
    In [13]: returns.diff().hist()
    Out[13]:
    array([[Axes(0.125,0.677778;0.158163x0.222222),
    Axes(0.330612,0.677778;0.158163x0.222222),
    Axes(0.536224,0.677778;0.158163x0.222222),
    Axes(0.741837,0.677778;0.158163x0.222222)],
    [Axes(0.125,0.388889;0.158163x0.222222),
    Axes(0.330612,0.388889;0.158163x0.222222),
    Axes(0.536224,0.388889;0.158163x0.222222),
    Axes(0.741837,0.388889;0.158163x0.222222)],
    [Axes(0.125,0.1;0.158163x0.222222),
    Axes(0.330612,0.1;0.158163x0.222222),
    Axes(0.536224,0.1;0.158163x0.222222),
    Axes(0.741837,0.1;0.158163x0.222222)]], dtype=object)
    
    In [14]: plt.show()

El código en el Listado 4 da esta gráfica:

Figura 2. Retornos diarios de histograma
Chart showing histogram daily returns

Otra manera de ver los datos es tomando los retornos diarios y realizar una gráfica de líneas para el año. La muestra de código de abajo muestra cómo hacer esto:

Listado 5. Gráfica de línea de correlación del portafolio Pandas para el año
    In [15]: returns.plot(title="% Daily Change For Year")
    Out[15]: <matplotlib.axes.AxesSubplot at 0x10b56e850>
    
    In [16]: plt.show()

Aquí está el resultado:

Figura 3. Retornos diarios de histograma como gráfica de líneas
Chart showing histogram daily returns as a line chart

Un problema con esta sencilla gráfica es que es un poco difícil descubrir qué está pasando. Un manera de lidiar con estos datos de series de tiempo es usar la función cumsum , y posteriormente graficarla.

Listado 6. Suma acumulativa
In [17]: ts = returns.cumsum()

In [18]: plt.figure(); ts.plot(); plt.legend(loc='upper left')
Out[18]: <matplotlib.legend.Legend at 0x10c69cb50>
    
In [19]: plt.show()

El resultado, mostrado en la Figura 4, nos da incluso más información acerca de su portafolio. Al realizar un análisis de series de tiempo y graficar los resultados, es aparente que Facebook tuvo una temporada más dura de lo que se pensó originalmente. Mientras que fue hacia abajo en el año en un 40%, en un punto estuvo 60% abajo en septiembre. Intuitivamente, los datos adicionales acerca del movimiento de la acción indican que la desviación estándar es bastante alta para Facebook. Debido a que la desviación estándar representa aproximadamente el riesgo, esto es algo al que se tiene que estar atento mientras se formula este portafolio y determina los pesos.

Figura 4. Suma acumulativa del portafolio
Chart showing cumulative sum of portfolio

Determinar la correlación del cambio de porcentaje entre diez acciones es tan sencillo como llamar al método corr en los retornos de DataFrame.

Listado 7. Correlación de portafolio Pandas de cambio de porcentaje
    In [9]: returns.corr()
    Out[9]:
            AAPL        BP        FB        GG      GOOG       JNJ       
                      OMG      SCPJ      SPLK      YELP
    AAPL  1.000000  0.169053  0.094286  0.134131  0.376466  
                      0.163904  0.411568  0.117152  0.368266  0.124856
    BP    0.169053  1.000000  0.011832  0.294994  0.291391  
                      0.437816  0.436781 -0.009499  0.224151  0.084014
    FB    0.094286  0.011832  1.000000 -0.065156  0.081912  
                      0.020755  0.130815  0.039980  0.038010  0.343646
    GG    0.134131  0.294994 -0.065156  1.000000  0.302844  
                      0.138329  0.206255 -0.066144  0.148690 -0.006135
    GOOG  0.376466  0.291391  0.081912  0.302844  1.000000  
                      0.144882  0.305486 -0.001538  0.226364  0.154207
    JNJ   0.163904  0.437816  0.020755  0.138329  0.144882  
                      1.000000  0.268308  0.021108  0.190023 -0.009803
    OMG   0.411568  0.436781  0.130815  0.206255  
                      0.305486  0.268308  1.000000  0.117257  0.279653  0.146944
    SCPJ  0.117152 -0.009499  0.039980 -0.066144 -
                      0.001538  0.021108  0.117257  1.000000 -0.017114  0.058541
    SPLK  0.368266  0.224151  0.038010  0.148690  0.226364  
                      0.190023  0.279653 -0.017114  1.000000  0.215260
    YELP  0.124856  0.084014  0.343646 -0.006135  0.154207 
                    -0.009803  0.146944  0.058541  0.215260  1.000000
    In [58]: plt.show()

Teoría de portafolio

Hasta ahora, el análisis ha sido bastante sencillo. El análisis de inversión usualmente involucra la determinación de un portafolio óptimo que pueda "ganar en el mercado". El mercado es típicamente referido como el índice Standard and Poor 500. No hay prueba definitiva de que los fondos mutuos puedan en realidad ganar en el mercado a través de habilidades (no suerte). Las probabilidades están a favor de que usted pueda vencer en los fondos mutuos mediante una inversión pasiva en fondos de índice ya que la gran mayoría de los fondos mutuos no puede ganar al portafolio del mercado año tras año.

Pese al hecho de que profesionales entrenados con ejércitos de matemáticos con doctorados, científicos de cohetes, y miles de millones de dólares de capital no pueden ganar en el mercado, intentemos hacerlo con pandas en su tiempo libre. El primer paso es ver cómo se apila su portafolio contra el portafolio del mercado, el Standard and Poor 500.

Listado 8. Gráfica de tiempo acumulativo SPY
        In [116]: market_data_feed = {}
        
        In [117]: market_symbols=['SPY']
        
        In [118]: for ticker in market_symbols:
        .....:         market_data_feed[ticker] = web.get_data_yahoo
                      (ticker, '05/21/2012', '11/1/2012')
        .....:
        
        In [119]: market_price = DataFrame({tic: data['Adj Close']
        .....:     for tic, data in market_data_feed.iteritems()})
        
        In [120]:
        
        In [120]: market_volume = DataFrame({tic: data['Volume']
        .....:     for tic, data in market_data_feed.iteritems()})
        
        In [121]: 
        
        In [121]: market_returns = market_price.pct_change()
        
        In [122]: market_returns.cumsum()
        In [123]: mts = market_returns.cumsum()
        
        In [124]: plt.figure(); mts.plot(); plt.legend(loc='upper left')
        Out[124]: <matplotlib.legend.Legend at 0x10b8f4650>
        
        In [125]: plt.show()

En este ejemplo, otra DataFrame se crea, para el mismo período de tiempo, y actúa como su "portafolio de mercado". La gráfica de la Figura 5 muestra el retorno generado para SPY, que es representativo del índice Standard and Poor 500.

Figura 5. Retorno generado para SPY
Chart of return generated for SPY

Con dos gráficas de series de tiempo separadas completadas, el próximo paso al realizar un análisis es ver su portafolio contra el portafolio del mercado. Dos maneras rápidas y aproximadas para hacer esto son (a) ver el retorno promedio/medio de su portafolio versus el portafolio del mercado, y (b) ver la desviación estándar (stdev), un representativo aproximado del riesgo en su portafolio versus el portafolio del mercado.

Listado 9. Ganando en el mercado
In [126]: sum_returns = returns.sum()
In [127]: sum_returns.mean()
Out[127]: 0.11198689337482581
In [128]: market_returns.sum().mean()
Out[128]: 0.093679854637400028
In [239]: market_returns.std()
Out[239]:
minor
SPY      0.008511        
In [240]: returns.std().mean()
Out[240]: 0.025706773344634132

En conclusión

En el ejemplo interactivo final en el Listado 9, usted gana en el mercado al obtener un retorno del 11% en su portafolio versus el portafolio del mercado de 9%. Sin embargo, antes de que pueda comenzar a realizar un fondo de protección, usted puede necesitar una buena historia para explicar por qué el portafolio del mercado tuvo un stdev del ,8% y su portafolio tuvo un stdev del 2%. La historia rápida es que usted arriesgó mucho y simplemente tuvo suerte. El análisis más a profundidad involucraría determinar alfa, beta, retorno esperado, y realizar análisis más avanzados, como Fama-French, y una optimización de frontera eficiente.

En este artículo fue usado Python para realizar un análisis rápido y aproximado de portafolio de inversiones. Python se está convirtiendo en el lenguaje al cual acudir para obtener análisis de datos del mundo real. Las bibliotecas como Pyomo, pandas, Numpy, e IPython eliminan muchas de las molestias de realizar matemáticas aplicadas avanzadas en Python. Si desea saber más acerca del análisis de portafolio, vea algunas sugerencias de lectura en Recursos.


Descargar

DescripciónNombretamaño
CSV file and source codesrc.zip6.30KB

Recursos

Aprender

Obtener los productos y tecnologías

  • Descargue pip y úselo para instalar IPython.
  • Evalúe los productos de IBM como mejor le parezca: descargue una prueba de producto, pruebe un producto online, use un producto en un entorno de nube o invierta unas cuantas horas en el Recinto de Seguridad de la SOA aprendiendo a implementar la Arquitectura Orientada a Servicios con eficiencia.

Comentar

  • Participe de la comunidad de developerWorks. Conéctese con otros usuarios de developerWorks mientras explora los blogs conducidos por desarrolladores, foros, grupos y wikis.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Cloud computing
ArticleID=931527
ArticleTitle=Ciencia de datos en la nube
publish-date=05272013