In [1]:
import statsmodels.formula.api as sm
from datetime import datetime
import pandas as pd
import pandas.io.data as web
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
pd.set_option('max_columns', 30)
%matplotlib inline
Filtro de celdas para correr todo
In [2]:
run_console = True
update_from_yahoo = False
update_from_Quandl = False
update_from_dropbox = False
plot_on = True
Descargar datos de la web y guardar en archivo csv
In [3]:
if update_from_yahoo:
today = datetime.now()
ipsa = web.DataReader('^IPSA', 'yahoo', start=datetime(2003, 1, 10), end=today)['Close']
spy = web.DataReader('SPY', 'yahoo', start=datetime(1993, 1, 29), end=today)['Close']
eem = web.DataReader('EEM', 'yahoo', start=datetime(2003, 4, 15), end=today)['Close']
vea = web.DataReader('VEA', 'yahoo', start=datetime(2007, 7, 26), end=today)['Close']
df = pd.DataFrame()
df['ipsa'] = ipsa
df['spy'] = spy
df['eem'] = eem
df['vea'] = vea
df.to_csv('INDEX.csv')
In [4]:
if update_from_Quandl:
import Quandl
df = Quandl.get('BNP/USDCLP')
df.to_csv('USDCLP.csv')
In [5]:
# Datos que actualiza usuario del foro chilebolsa
if update_from_dropbox:
import urllib2
url = 'http://dl.dropboxusercontent.com/u/35775157/multifondos_afp.txt'
res = urllib2.Request(url)
csvio = urllib2.urlopen(res)
df = pd.read_csv(csvio, index_col=['<TICKER>', '<DTYYMMDD>'], parse_dates=True, usecols=['<TICKER>', '<DTYYMMDD>','<CLOSE>'])
df = df.unstack('<TICKER>')
df.columns = df.columns.droplevel()
df.to_csv('AFP.csv')
Leer datos desde archivos csv y guardar en DataFrame data
In [6]:
data = pd.read_csv('INDEX.csv', parse_dates=True, index_col='Date')
data['usd'] = pd.read_csv('USDCLP.csv', parse_dates=True, index_col='Date')
In [7]:
data.info()
data.tail()
Out[7]:
In [8]:
if plot_on:
data.plot(subplots=True, figsize=(10, 10), sharex=True)
#plt.legend(loc='best')
Variación porcentual diaria de los datos en DataFrame data_pc
In [9]:
data_pc = data.pct_change()
data_cum = data_pc.cumsum()
if plot_on:
data_pc.plot(subplots=True, figsize=(10, 10), sharex=True)
data_cum.plot(figsize=(10, 10))
Edu7 https://twitter.com/AlephEdu sugiere la siguiente ponderación de índices para "simular" variación fondo A
In [10]:
edu_pc = pd.DataFrame()
edu_pc['A'] = 0.20*data_pc['spy'] + 0.15*data_pc['ipsa'] + 0.17*data_pc['eem'] + 0.06*data_pc['vea'] + 0.50*data_pc['usd']
edu_pc['A1'] = 0.21*data_pc['spy'] + 0.15*data_pc['ipsa'] + 0.125*data_pc['eem'] + 0.13*data_pc['vea'] + 0.57*data_pc['usd']
edu_cum = pd.DataFrame()
edu_cum['A'] = edu_pc['A'].cumsum()
edu_cum['A1'] = edu_pc['A1'].cumsum()
In [11]:
if plot_on:
edu_pc['2011':][['A','A1']].cumsum().plot(figsize=(10, 10))
Guardar valores cuota de multifondo de todas las AFP en m_afp
In [12]:
m_afp = pd.read_csv('AFP.csv', parse_dates=True, index_col=['<DTYYMMDD>'])
In [13]:
m_afp.info()
Guardar valores cuota fondo A en DataFrame a_afp
In [14]:
a_afp = pd.DataFrame()
a_afp['CAPITAL-A'] = m_afp['CAPITAL-A']
a_afp['CUPRUM-A'] = m_afp['CUPRUM-A']
a_afp['HABITAT-A'] = m_afp['HABITAT-A']
a_afp['MODELO-A'] = m_afp['MODELO-A']
a_afp['PLANVITAL-A'] = m_afp['PLANVITAL-A']
a_afp['PROVIDA-A'] = m_afp['PROVIDA-A']
In [15]:
if plot_on:
a_afp['2011':].plot(figsize=(10, 10))
Ver si existe correlación de valores cuota del fondo A para distintas AFP (Efecto manada)
In [16]:
a_afp.corr()
Out[16]:
Variación porcentual diaria de los valores cuota fondo A en DataFrame a_afp_pc
In [17]:
a_afp_pc = a_afp.pct_change()
Variación acumulada de valores cuota fondo A en DataFrame a_afp_cum
In [18]:
a_afp_cum = a_afp_pc.cumsum()
Agregar carteras A y A1 inferidas por Edu7
In [19]:
a_afp_pc['A'] = edu_pc['A']
a_afp_pc['A1'] = edu_pc['A1']
a_afp_cum['A'] = edu_cum['A']
a_afp_cum['A1'] = edu_cum['A1']
Dibujar gráfico variación acumulada.
In [20]:
if plot_on:
#Dibujar gráfico aproximado tendencias variación acumulada, ajusta inicio acumulación con distintos ejes (derecha e izquierda).
#a_afp_cum['2013':][['A','A1','CUPRUM-A']].plot(secondary_y=['A','A1'], figsize=(10, 10))
a_afp_pc['2013':][['A','A1','CUPRUM-A']].cumsum().plot(figsize=(10, 10))
Observaciones:
Dibujar gráfico variación valor cuota Fondo A y E de AFP Cuprum.
In [21]:
if plot_on:
m_afp['2013':][['CUPRUM-A','CUPRUM-E']].plot(figsize=(10, 10))
In [22]:
if plot_on:
a_afp_pc['2013':].cumsum().plot(x='CUPRUM-A', y='A', style='o', markersize=3, figsize=(10, 10))
In [23]:
if plot_on:
a_afp_pc['2013':][['A','A1','MODELO-A']].cumsum().plot(figsize=(10, 10))
Observaciones:
Dibujar gráfico variación valor cuota Fondo A y E de AFP Modelo.
In [24]:
if plot_on:
m_afp['2013':][['MODELO-A','MODELO-E']].plot(figsize=(10, 10))
In [25]:
if plot_on:
a_afp_pc['2013':].cumsum().plot(x='MODELO-A', y='A', style='o', markersize=3, figsize=(10, 10))
Cálculo de coeficientes por regresión lineal
In [26]:
rl_pc = pd.DataFrame()
rl_pc['spy'] = data_pc['spy']
rl_pc['ipsa'] = data_pc['ipsa']
rl_pc['eem'] = data_pc['eem']
rl_pc['vea'] = data_pc['vea']
rl_pc['usd'] = data_pc['usd']
rl_pc['cuprum_A'] = a_afp_pc['CUPRUM-A']
rl_pc['modelo_A'] = a_afp_pc['MODELO-A']
Estimación de cartera de Edu7 https://twitter.com/AlephEdu
Cálculo de coeficientes por regresión lineal para AFP Cuprum
In [27]:
result = sm.ols(formula="cuprum_A ~ spy + ipsa + eem + vea + usd", data=rl_pc['2013':].cumsum()).fit()
print result.params
Observaciones:
Cálculo de coeficientes por regresión lineal para AFP Modelo
In [28]:
result = sm.ols(formula="modelo_A ~ spy + ipsa + eem + vea + usd", data=rl_pc['2013':].cumsum()).fit()
print result.params
Observaciones:
In [29]:
if run_console:
%qtconsole
In [29]:
In [29]: