Trabajando con Python sobre las estadisticas sobre opciones del SPX y RUT ( Parte 1 )

Trabajando con Python sobre las estadisticas sobre opciones del SPX y RUT ( Parte 1 )

Todos los notebooks los podreis encontrar aqui:

 
https://github.com/Tvix22/thepythonlab/tree/master/Lab1%20-%20ThePythonLab

Recuerda pasarte por el canal de Telegram, Python Para Trading

LAB1 - Trabajando con estadisticas sobre las opciones del SPX

En este articulo vamos a tratar un uso basico de pandas. Crearemos un dataframe de una serie de archivos separados por comas , y lo guardaremos en pickle para su posterior uso.
Ademas realizaremos un analisis exploratorio de los datos que nos puede dar una vision preliminar de lo que estamos tratanto.

Cargamos todas las librerias necesarias

In [1]:
import pandas as pd 
import os
import numpy as np 
import seaborn as sns
import scipy 
import datetime 
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
pylab.rcParams['figure.figsize'] = 30, 12 
plt.style.use('ggplot')

Vamos a crear el dataframe

Vamos a declarar una carpeta, donde tendremos nuestros archivos csv que queramos anyadir a nuestro dataframe para su posterior tratamiento

In [2]:
mainpath = '../../datasets/lab1/'
files = os.listdir(mainpath)
Symbol = 'SPX'
symboldataname = 'spx_stats.pickle'
Symbol2 ='RUT'
symboldataname2 = 'rut_stats.pickle'

Vamos a cargar todos los archivos que hay dentro del mainpath, y indexarlos por quotedate

In [3]:
datos={}
contador = 1
df = pd.DataFrame()
data = pd.DataFrame()


for file in range(len(files)):
    usefile = files[file]
    print("Archivo numero :" + str(contador) + " de un total de " + str((len(files))) + " archivos")
    contador = contador +1
    ruta = mainpath + "/" + str(usefile) 
    df = pd.read_csv(ruta,parse_dates=True,index_col=['quotedate'])
    datos[usefile] = df
        
data = pd.concat(datos.values(), keys=datos.keys() , sort='True')
Archivo numero :1 de un total de 96 archivos
Archivo numero :2 de un total de 96 archivos
Archivo numero :3 de un total de 96 archivos
Archivo numero :4 de un total de 96 archivos
Archivo numero :5 de un total de 96 archivos
Archivo numero :6 de un total de 96 archivos
Archivo numero :7 de un total de 96 archivos
Archivo numero :8 de un total de 96 archivos
Archivo numero :9 de un total de 96 archivos
Archivo numero :10 de un total de 96 archivos
Archivo numero :11 de un total de 96 archivos
Archivo numero :12 de un total de 96 archivos
Archivo numero :13 de un total de 96 archivos
Archivo numero :14 de un total de 96 archivos
Archivo numero :15 de un total de 96 archivos
Archivo numero :16 de un total de 96 archivos
Archivo numero :17 de un total de 96 archivos
Archivo numero :18 de un total de 96 archivos
Archivo numero :19 de un total de 96 archivos
Archivo numero :20 de un total de 96 archivos
Archivo numero :21 de un total de 96 archivos
Archivo numero :22 de un total de 96 archivos
Archivo numero :23 de un total de 96 archivos
Archivo numero :24 de un total de 96 archivos
Archivo numero :25 de un total de 96 archivos
Archivo numero :26 de un total de 96 archivos
Archivo numero :27 de un total de 96 archivos
Archivo numero :28 de un total de 96 archivos
Archivo numero :29 de un total de 96 archivos
Archivo numero :30 de un total de 96 archivos
Archivo numero :31 de un total de 96 archivos
Archivo numero :32 de un total de 96 archivos
Archivo numero :33 de un total de 96 archivos
Archivo numero :34 de un total de 96 archivos
Archivo numero :35 de un total de 96 archivos
Archivo numero :36 de un total de 96 archivos
Archivo numero :37 de un total de 96 archivos
Archivo numero :38 de un total de 96 archivos
Archivo numero :39 de un total de 96 archivos
Archivo numero :40 de un total de 96 archivos
Archivo numero :41 de un total de 96 archivos
Archivo numero :42 de un total de 96 archivos
Archivo numero :43 de un total de 96 archivos
Archivo numero :44 de un total de 96 archivos
Archivo numero :45 de un total de 96 archivos
Archivo numero :46 de un total de 96 archivos
Archivo numero :47 de un total de 96 archivos
Archivo numero :48 de un total de 96 archivos
Archivo numero :49 de un total de 96 archivos
Archivo numero :50 de un total de 96 archivos
Archivo numero :51 de un total de 96 archivos
Archivo numero :52 de un total de 96 archivos
Archivo numero :53 de un total de 96 archivos
Archivo numero :54 de un total de 96 archivos
Archivo numero :55 de un total de 96 archivos
Archivo numero :56 de un total de 96 archivos
Archivo numero :57 de un total de 96 archivos
Archivo numero :58 de un total de 96 archivos
Archivo numero :59 de un total de 96 archivos
Archivo numero :60 de un total de 96 archivos
Archivo numero :61 de un total de 96 archivos
Archivo numero :62 de un total de 96 archivos
Archivo numero :63 de un total de 96 archivos
Archivo numero :64 de un total de 96 archivos
Archivo numero :65 de un total de 96 archivos
Archivo numero :66 de un total de 96 archivos
Archivo numero :67 de un total de 96 archivos
Archivo numero :68 de un total de 96 archivos
Archivo numero :69 de un total de 96 archivos
Archivo numero :70 de un total de 96 archivos
Archivo numero :71 de un total de 96 archivos
Archivo numero :72 de un total de 96 archivos
Archivo numero :73 de un total de 96 archivos
Archivo numero :74 de un total de 96 archivos
Archivo numero :75 de un total de 96 archivos
Archivo numero :76 de un total de 96 archivos
Archivo numero :77 de un total de 96 archivos
Archivo numero :78 de un total de 96 archivos
Archivo numero :79 de un total de 96 archivos
Archivo numero :80 de un total de 96 archivos
Archivo numero :81 de un total de 96 archivos
Archivo numero :82 de un total de 96 archivos
Archivo numero :83 de un total de 96 archivos
Archivo numero :84 de un total de 96 archivos
Archivo numero :85 de un total de 96 archivos
Archivo numero :86 de un total de 96 archivos
Archivo numero :87 de un total de 96 archivos
Archivo numero :88 de un total de 96 archivos
Archivo numero :89 de un total de 96 archivos
Archivo numero :90 de un total de 96 archivos
Archivo numero :91 de un total de 96 archivos
Archivo numero :92 de un total de 96 archivos
Archivo numero :93 de un total de 96 archivos
Archivo numero :94 de un total de 96 archivos
Archivo numero :95 de un total de 96 archivos
Archivo numero :96 de un total de 96 archivos
In [4]:
data.head(5)
Out[4]:
calloicallvolcommentiv30calliv30meaniv30putputoiputvolsymboltotalvol
quotedate
L2_optionstats_20020226.csv2002-02-26379771370NaN0.40000.40720.41432463873A1443
2002-02-2648794570NaN0.29120.28710.282933643488AA1058
2002-02-2658020NaN0.62450.62450.62454460AAI0
2002-02-261245611304NaN0.57880.55520.5317671651160AAPL2464
2002-02-26218040NaN0.40480.40480.404812652ABF42

Como podemos observar, necesitamos manipular el dataframe para adaptarlo a nuestras necesidades, le quitaremos el multinidice, y seleccionaremos sol las columnas que nos interesen.
ademas tambien lo ordenaremos

In [5]:
data = data[['symbol','iv30call','calloi','callvol','iv30put','putoi','putvol','iv30mean','totalvol']]
data = data.droplevel(level=0)
data = data.sort_index(axis=0)
In [6]:
data.head(5)
Out[6]:
symboliv30callcalloicallvoliv30putputoiputvoliv30meantotalvol
quotedate
2002-02-01RUT0.219859381070.1924635050.2061112
2002-02-01SPX0.1864759979427330.1785961768524040.182495137
2002-02-01OEX0.196589936106610.2025103760139370.199524598
2002-02-01NDX0.3723128288000.34832336510910.36031891
2002-02-04SPX0.2140760140222050.2138969114448130.213967018

Ahora, vamos a crear dos dataframes cada uno con un ticker distinto, y los guardaremos en formato pickle para su posterior uso

In [7]:
symboldata = data[data['symbol'] == Symbol]
symboldata2 = data[data['symbol'] == Symbol2]
symboldata = symboldata[['iv30call','calloi','callvol','iv30put','putoi','putvol','iv30mean','totalvol']]
symboldata2 = symboldata2[['iv30call','calloi','callvol','iv30put','putoi','putvol','iv30mean','totalvol']]
symboldata = symboldata.sort_index(axis=0)
symboldata2 = symboldata2.sort_index(axis=0)
symboldata.to_pickle('/home/py/datasets/pickle'+ '/' + symboldataname)
symboldata2.to_pickle('/home/py/datasets/pickle' + '/' + symboldataname2 )
In [8]:
symboldata.head(5)
Out[8]:
iv30callcalloicallvoliv30putputoiputvoliv30meantotalvol
quotedate
2002-02-010.1864759979427330.1785961768524040.182495137
2002-02-040.2140760140222050.2138969114448130.213967018
2002-02-050.2056752064391310.2282987312567600.216995891
2002-02-060.2237769705429540.22781006851457150.225888669
2002-02-070.2004767797329720.23331022354578890.216890861
In [9]:
symboldata2.head(5)
Out[9]:
iv30callcalloicallvoliv30putputoiputvoliv30meantotalvol
quotedate
2002-02-010.219859381070.1924635050.2061112
2002-02-040.23366000860.24126352850.2374171
2002-02-050.2549607610890.2461636824110.25053500
2002-02-060.2575664950.2635848618540.26051859
2002-02-070.25186147280.294595721530.2732181

Cargamos el pickle, y comparamos la velocidad de carga en comparacion del read csv

In [10]:
df1 = pd.read_pickle('/home/py/datasets/pickle'+ '/' + symboldataname)
df2 = pd.read_pickle('/home/py/datasets/pickle'+ '/' + symboldataname2)

Calculamos la correlacion de una ventana de 5 periodos entre dataframes

In [11]:
df1.iv30put.rolling(5).corr(df1.iv30call.rolling(5)).plot(color='r',alpha=0.3)
plt.legend(['IV CORR'])
df1.putoi.rolling(5).corr(df1.calloi.rolling(5)).plot(color='b',alpha=0.4)
plt.legend(['IO CORR'])
df1.putvol.rolling(5).corr(df1.callvol.rolling(5)).plot(color='g',alpha=0.5)
plt.legend(['VOL CORR'])
Out[11]:
<matplotlib.legend.Legend at 0x7f81d72b30b8>
In [12]:
correlacion = df1.corr(method = 'kendall')
correlacion_mean = correlacion.mean() 

Vamos a visualizar las correlaciones entre las variables

In [13]:
correlacion.plot.bar()
Out[13]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f81d7284748>

Con esta forma de visualizar la informacion, queda clara, pero aun podriamos visualizarla mucho mejor mediante un mapa de calor

In [14]:
mask = np.zeros_like(correlacion, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True


plt.figure(figsize=(12,10),dpi=80)
sns.heatmap(correlacion,mask=mask,
            cmap='RdYlGn',center=0, annot=True)
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f81d7173f60>
In [15]:
correlacionintermarket = pd.DataFrame(index=df1.index)
correlacionintermarket['iv30callRUT'] = df2.iv30call
correlacionintermarket['calloiRUT'] = df2.calloi
correlacionintermarket['callvolRUT'] = df2.callvol
correlacionintermarket['iv30putRUT'] = df2.iv30put
correlacionintermarket['putoiRUT'] = df2.putoi
correlacionintermarket['putvolRUT'] = df2.putvol
correlacionintermarket['ivmean30RUT'] = df2.iv30mean
correlacionintermarket['totalvolRUT'] = df2.totalvol
correlacionintermarket = correlacionintermarket.corr(method = 'kendall')
correlacionintermarketmean = correlacionintermarket.mean()
In [16]:
mask = np.zeros_like(correlacionintermarket, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True


plt.figure(figsize=(12,10),dpi=80)
sns.heatmap(correlacionintermarket,mask=mask,
            cmap='RdYlGn',center=0, annot=True)
Out[16]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f81d7091b70>
In [ ]:
 
In [ ]:
 
In [ ]:
 

Como conclusion, hemos visto como cargar muchos archivos en un mismo dataframe, luego hemos manipulado las columnas para adaptarlas a nuestras necesidades y mas tarde, hemos realizado un analisis exploratorio de los datos.

Todos los notebooks los podreis encontrar aqui:

Share:

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *