get_prices_yahoo()
Buscar AMZN, SPOT, TSLA en Yahoo! Finance
Veamos algunos ejemplos en la siguiente tabla:
Ticker | Yahoo! Finance | ISIN | CUSIP |
---|---|---|---|
IBM | IBM | US4592001014 | 459200101 |
AAPL | AAPL | US0378331005 | 037833100 |
¿Porqué hay un brico del punto verde al punto naranja?
El NYSE, donde se hacen las transacciones de las acciones de IBM, funciona días hábiles entre 9:30am y 4:00pm EST (Eastern Standard Time). Se dice que el precio de apertura (open) es el primer precio después de las 9:30am al que se pacta una transacción de IBM en el día. El precio de cierre (close) es el último precio antes de las 4:00pm al que se pacta una transacción de IBM en el día.
En realidad, los precios de cierre y apertura no son exactamente el primer y último precio al que se cierra una transacción. Dependiendo de la casa de bolsa, los precios de cierre y apertura que se publican pueden ser el promedio de los precios pactados en los últimos/primeros minutos del día de operación.
Paquetería R disponible en github en https://github.com/audiracmichelle/optimist
En R para descargarla se usa
#devtools::install_github("audiracmichelle/optimist")
library(optimist)
get_
y en el drop-down aparecerán varias opciones de la paquetería junto con su descripción y parámetros
¿Cómo se usa?
optimist
está inspirada en los lenguajes que usan sintaxis de lenguaje naturalCargamos los datos
+ AMZN, SPOT, TSLA
price <- get_prices_yahoo(c('AMZN','SPOT','TSLA'),
from = '2012-12-31',
to = '2019-04-30')
price
class(price)
## [1] "xts" "zoo"
head(price)
## AMZN.Adjusted SPOT.Adjusted TSLA.Adjusted
## 2012-12-31 250.87 149.01 33.87
## 2013-01-02 257.31 149.01 35.36
## 2013-01-03 258.48 149.01 34.77
## 2013-01-04 259.15 149.01 34.40
## 2013-01-07 268.46 149.01 34.34
## 2013-01-08 266.38 149.01 33.68
tail(price)
## AMZN.Adjusted SPOT.Adjusted TSLA.Adjusted
## 2019-04-22 1887.31 135.92 262.75
## 2019-04-23 1923.77 138.79 263.90
## 2019-04-24 1901.75 135.62 258.66
## 2019-04-25 1902.25 132.82 247.63
## 2019-04-26 1950.63 138.25 235.14
## 2019-04-29 1938.43 138.14 241.47
#Para el seminario usamos plotly
#install.packages("plotly")
library(plotly)
#' @title plotly_xts
#' @description Plots time series from xts
#' @param x xts
plotly_xts <- function(x, ...){
x %<>%
as.data.frame() %>%
tibble::rownames_to_column("date") %>%
mutate(date = as.Date(date)) %>%
gather(key, value, -date)
p <- x %>%
plot_ly(x = ~date,
y = ~value,
color = ~key, ...) %>%
add_lines()
p
}
¿Cuál es la diferencia de la siguiente gráfica y la que vimos en Yahoo! Finance?
price %>%
plotly_xts()
price %>%
get_dlyChg_from_price() %>%
get_cumRet_from_dlyChg() %>%
plotly_xts()
Veamos las gráficas de los precios ajustados diarios en los objetos
herdez
ygigante
herdez <- getSymbols('herdez.mx', auto.assign=FALSE,
from = '2016-12-31', to = '2017-12-31')
herdez <- Ad(herdez)
gigante <- getSymbols('gigante.mx', auto.assign=FALSE,
from = '2016-12-31', to = '2017-12-31')
gigante <- Ad(gigante)
plot_xts(herdez) +
labs(title = 'Precios ajustados de Herdez')
plot_xts(gigante) +
labs(title = 'Precios ajustados de Gigante')
¿Porqué el precio de Gigante parece que se estaciona en distintos periodos en comparación con el precio de Herdez?
head(herdez)
## HERDEZ.MX.Adjusted
## 2017-01-02 35.13019
## 2017-01-03 35.45668
## 2017-01-04 35.54063
## 2017-01-05 35.35407
## 2017-01-06 34.67310
## 2017-01-09 33.88021
head(gigante)
## GIGANTE.MX.Adjusted
## 2017-01-02 39
## 2017-01-03 39
## 2017-01-04 39
## 2017-01-05 39
## 2017-01-06 39
## 2017-01-09 39
Las bolsas de valores determinan los sistemas y medios electrónicos en los que se hacen las operaciones de compra-venta de instrumentos financieros. Supongamos que manejamos un portafolio en una casa de bolsa que tiene acciones de Gigante que queremos vender. El 3 de Enero de 2017 colocamos un precio de venta de 42 pesos en los sistemas de la casa de bolsa, pero no hay ninguna postura de compra en todo el día. Entonces el precio de cierre del 3 de Enero se queda igual al precio de cierre del 2 de Enero (39 pesos). Esto se repite día con día, no hay posturas de compra y no logramos vender esas acciones. Entonces el precio de Gigante se mantiene en 39 pesos.
El 27 de Febrero decidimos bajar nuestra postura a 41 pesos y finalmente alguien accede a colocar una postura de compra a ese precio. Se cierra la operación y el precio de cierre de Gigante de ese día se fija en 41 pesos como se ve en la gráfica.
¿Cómo crees que se mide que tan líquido es un instrumento?
¿Porqué no son comparables los rendimientos aculumados de los siguientes activos?
price <- get_prices_yahoo(c('IBM',
'herdez.mx',
'gigante.mx',
'MXN=X'),
from = '2016-12-31',
to = '2017-12-31')
price %>%
get_dlyChg_from_price() %>%
get_cumRet_from_dlyChg() %>%
plotly_xts()
Supongamos que un inversionista americano decide invertir por un año en \(\text{xyz}\), una acción mexicana listada en la BMV (Bolsa Mexicana de Valores). Para poder comprar \(\text{xyz}\) el inversionista debe cambiar sus dólares a pesos.
Al final del año el rendimiento en pesos de \(\text{xyz}\) es 0% y el peso se fortalece contra el dolar. El inversionista vende \(\text{xyz}\) y recibe pesos. Al cambiar los pesos por dólares el inversionista recibe más pesos que los que invirtió inicialmente pues el valor del peso contra el dolar aumentó.
Esto significa que, aunque el rendimiento en pesos de \(\text{xyz}\) fue 0%, el rendimiento en dólares que recibó el inversionista fue mayor a cero.
En la imagen podemos ver marcado en amarillo el nombre la casa de valores donde están listadas las acciones de IBM (NYSE) y la denominación de la emisión (USD).
Calculemos el rendimiento de IBM en pesos usando cambios relativos:
dlyChg$IBM_MXN.Adjusted
la serie de cambios diarios de IBM en pesos.dlyChg <- price %>% get_dlyChg_from_price()
dlyChg$IBM_MXN.Adjusted <- dlyChg$IBM.Adjusted * dlyChg$MXN.X.Adjusted
dlyChg %>% get_cumRet_from_dlyChg() %>% plotly_xts()
Comparemos en Yahoo! Finance: AMX.MX y AMX, AMZN y AMZN.MX
¿Cuál es la diferencia de los precios de cierre y ajustados?
ibm <- getSymbols.yahoo('IBM', auto.assign=FALSE,
from = '2016-12-31', to = '2017-12-31')
# obtenemos los cambios diarios de ibm
ibm_dlyChg <- get_dlyChg_from_price(ibm)
# acumulamos los cambios diarios
ibm_cumRet <- get_cumRet_from_dlyChg(ibm_dlyChg)
plot_xts(ibm_cumRet[, c('IBM.Close', 'IBM.Adjusted')])
Los precios ajustados eliminan el efecto que tienen los dividendos en los precios de cierre de los instrumentos financieros.
ibm_dividends <- getDividends('IBM',
from = '2016-12-31',
to = '2017-12-31')
ibm_dividends
## IBM.div
## 2017-02-08 1.4
## 2017-05-08 1.5
## 2017-08-08 1.5
## 2017-11-09 1.5
Veamos los precios de cierre y los pagos de dividendo de IBM entre el 7 y el 9 de febrero de 2017.
cbind(ibm[, 'IBM.Close'], ibm_dividends)['2017-02-07/2017-02-09', ]
## IBM.Close IBM.div
## 2017-02-07 178.46 NA
## 2017-02-08 176.17 1.4
## 2017-02-09 177.21 NA
Si solo vemos el precio debajo de IBM.Close
, podríamos pensar que un inversionista que tenía una acción de IBM tuvo una perdida de -2.29 (176.17 - 178.46) dólares del 7 al 8 de febrero de 2017 . Sin embargo, esto no es cierto porque el inversionista recibió 1.4 dólares como pago en dividendos.
Una serie de precios ajustados es una serie de precios ‘hipotéticos’ cuyo valor representa una inversión:
Construcción de pesos ajustados
Supongamos que tenemos una serie de precios de cierre \(p^0, p^1, \dots, p^T\) de una acción \(\text{xyz}\) y que en \(d\) esta acción tuvo un pago de dividendos por un monto \(\text{div}^d\).
Queremos construir una serie de precios \(p^0_\text{prima}, p^1_\text{prima}, \dots, p^d_\text{prima}\) de una acción hipotética \(\text{xyz}_\text{prima}\) que replique a \(\text{xyz}\) pero sin pagos de dividendos. Esto significa que deben cumplirse los siguientes tres supuestos:
Combinando (2) y (3) llegamos a
\[ \delta^{d-1} = \delta_\text{prima}^{d-1} \\ \frac{p^{d-1}}{p^{d-2}} = \frac{p_\text{prima}^{d-1}}{p_\text{prima}^{d-2}} = \frac{p^{d-1} - \text{div}^d}{p^{d-2}_\text{prima}} \]
de donde obtenemos el valor de \(p^{d-2}_\text{prima}\)
\[ p^{d-2}_\text{prima} = \left(\frac{p^{d-1}-\text{div}^d}{p^{d-1}}\right)p^{d-2} \]
Usando (3) y el resultado anterior, obtenemos el valor de \(p^{d-3}_\text{prima}\)
\[ \delta^{d-2} = \delta^{d-2}_\text{prima} \\ \frac{p^{d-2}}{p^{d-3}} =\frac{p^{d-2}_\text{prima}}{p^{d-3}_\text{prima}} = \frac{\left(\frac{p^{d-1} - \text{div}^d}{p^{d-1}}\right)p^{d-2}}{p^{d-3}_\text{prima}} \\ p^{d-3}_\text{prima} = \left(\frac{p^{d-1}-\text{div}^d}{p^{d-1}}\right)p^{d-3} \]
Si continuamos con este proceso (con inducción), entonces se cumple para toda \(t\) distinta de \(d\) que
\[ p_\text{prima}^t = \left(\frac{p^{d-1}-\text{div}^d}{p^{d-1}}\right)p^t \]
Así \(\left(\frac{p^{d-1}-\text{div}^d}{p^{d-1}}\right)\) es el factor de ajuste del precio al tiempo \(d\), y \(p^t_\text{prima}\) es el precio ajustado de \(p^t\).
Vamos a suponer que podemos comprar fracciones de títulos de acciones.Normalmente, no son fáciles de conseguir en el mercado fracciones de títulos de instrumentos listados en casas de bolsa. En contraste, es fácil invertir en fracciones de tipos de cambio.
Imaginemos que al inicio del 2017 invertimos en un portafolio con la siguiente composición:
Estos pesos los guardamos en H0
(initial holdings).
H0 <- c(
HERDEZ.MX.Adjusted = 0.3,
GIGANTE.MX.Adjusted = 0.2,
MXN.X.Adjusted = 0.4,
IBM_MXN.Adjusted = 0.1
)
Quisiéramos conocer el rendimiento acumulado en 2017 de este portafolio.
Construcción de rendimiento acumulado de un portafolio
Supongamos que tenemos un portafolio con \(n\) activos y el peso inicial de apertura de las componentes del portafolio está dado por \(H^0 = (H_1^0, H_2^0, \dots, H_n^0)\) con \(\sum H_i^0 = 1\). Con esto, tenemos que
\[ \sum_j H_j^0 \delta_j^{0,t} \]
donde \(\delta_j^{0,t}\) es el rendimiento acumulado del activo \(j\) al tiempo \(t\).
\[ H_i^0\delta_i^{0,t} + (1-H_i^0) \]
\[ h_i^t = \frac{H_i^0 \delta_i^{0,t}}{\sum_j H_j^0 \delta_j^{0,t}} \]
Regularmente nos referiremos a los pesos de cierre de un portafolio simplemente como pesos del portafolio.
Calculemos el rendimiento acumulado de nuestro portfalio, así como las contribuciones al rendimiento acumulado y los pesos en cada \(t\) de los componentes.
cumRet <- dlyChg %>% get_cumRet_from_dlyChg()
cumRet <- cumRet[, c('HERDEZ.MX.Adjusted',
'GIGANTE.MX.Adjusted',
'MXN.X.Adjusted',
'IBM_MXN.Adjusted')]
portfolio_cumterm <- xts(order.by = index(cumRet))
portfolio_cumRet <- xts(order.by = index(cumRet))
portfolio_cumRet$portfolio <- 0
portfolio_contrib <- xts(order.by = index(cumRet))
for(c in 1:ncol(cumRet)) {
portfolio_cumterm <- cbind(portfolio_cumterm,
H0[c] * cumRet[ ,c])
portfolio_cumRet$portfolio <-
portfolio_cumRet$portfolio + portfolio_cumterm[ ,c]
portfolio_contrib <- cbind(portfolio_contrib,
portfolio_cumterm[ ,c] + (1 - H0[c]))
}
portfolio_weights <-
portfolio_cumterm / as.numeric(portfolio_cumRet$portfolio)
Ahora, veamos las contribuciones y el rendimiento acumulado que acabamos de calcular.
plotly_xts(cbind(portfolio_cumRet, portfolio_contrib))
En la medida en la que se mueven los precios de los componentes los pesos de cierre se van moviendo los peso iniciales (de apertura) de cada activo dentro del portafolio.
plot_xts(portfolio_weights)
A las posiciones \(H_i^0<0\) se les llama posiciones cortas. Tener una posición corta en el componente \(i\) de un portafolio significa colocar una venta en corto en el activo \(i\). Si ese activo da un rendimiento \(\delta_i^\mathbb{T}\) en el periodo \(\mathbb{T}\), entonces la contribución del activo \(i\) al tiempo \(T\) será \((-H_i^0 \delta_i^\mathbb{T})(1-H_i^0)\).
Se dice que se está rebalanceado un portafolio cuando en una fecha se decide cambiar los pesos de los componentes del portafolio a un nivel específico. Para esto, se tienen que realizar transacciones de compra venta. Las casas de bolsa cobran costos de transacción que son comisiones por realizar transacciones de compra venta.
En la vida real se tienen que considerar los costos de transacción para deteminar el desempeño de una inversión. Además las operaciones se cierran a precios de mercado (intradía) y no necesariamente a precio de cierre. Es posible que haya operaciones de compra venta que no logran ejecutarse por temas operativos o de liquidez.
Vamos a suponer que siempre que deseamos modificar los porcentajes de los componente de un portafolio:
El 30 de junio del 2017 decidimos hacer un rebalanceo de nuestro portafolio para llevar los pesos de los componentes a los siguientes niveles:
Estos pesos los guardamos en Hb
.
Hb <- c(
HERDEZ.MX.Adjusted = 0.25,
GIGANTE.MX.Adjusted = 0.2,
MXN.X.Adjusted = 0.55,
IBM_MXN.Adjusted = 0.0
)
Con este cambio, ¿cuál es el rendimiento acumulado en 2017?
Construcción de rendimiento acumulado de un portafolio después de un rebalanceo
Si el día \(b\) se realiza un rebalanceo, asumimos que ese día se vende a precio de cierre la posición con pesos \(h^b = (h_1^b, h_2^b, \dots, h_n^b)\) y se compra a ese mismo precio la posición con pesos de rebalanceo \(H^b = (H_1^b, H_2^b, \dots, H_n^b)\) tales que \(\sum H_i^b = 1\). De esta manera el día \(b+1\) los pesos de apertura de los componentes del portafolio quedan en \(H^b\).
Dado este rebalanceo y bajo estos supuestos tenemos que, para \(t \leq b\) el rendimiento acumulado, las contribuciones y pesos se calculan igual que antes. En el caso de \(t > b\) se cumple que:
\[ \sum_j H_j^0 \delta_j^{0,b} \sum_k H_k^b \delta_j^{b,t} \]
\[ \left(H_i^0\delta_i^{0,b} + (1-H_i^0)\right)\left(H_i^b\delta_i^{b,t} + (1 - H_i^b)\right) \]
\[ h_i^t = \frac{\left(\sum_j H_j^0 \delta_j^{0,b}\right)\left(H_i^b \delta_i^{b,t}\right)}{\left(\sum_j H_j^0 \delta_j^{0,b}\right)\left(\sum_j H_j^b \delta_j^{b,t}\right)} = \frac{H_i^b \delta_i^{b,t}}{\sum_j H_j^b \delta_j^{b,t}} \]
Para obtener estos valores nos será util tomar en cuenta que
\[ \delta_j^{b,t} = \frac{\delta_j^{0,t}}{\delta_j^{0,b}} \]
Considerando los pesos de rebalanceo del 30 de junio, vamos a obtener el nuevo rendimiento acumulado de nuestro portfalio y las contribuciones de los componentes.
dlyChg <- dlyChg[, c('HERDEZ.MX.Adjusted',
'GIGANTE.MX.Adjusted',
'MXN.X.Adjusted',
'IBM_MXN.Adjusted')]
rebWeight <- xts(rbind(H0, Hb),
order.by = c(index(cumRet)[1], as.Date('2017-06-30')))
rebalance <- get_rebalance(dlyChg, rebWeight)
plotly_xts(cbind(rebalance$portValue, rebalance$portContrib))
El rebalanceo que se hizo el 30 de junio provocó que disminuyera el rendimiento final del portafolio
Después del rebalanceo, al fijar el peso de IBM en cero, a partir del 30 de junio su contribución se mantiene fija
Los pesos de cierre del portafolio antes y después del rebalanceo del 30 de junio muestran cambios
plot_xts(rebalance$portWeight)
El valor de un portafolio en \(t\) es el rendimiento acumulado en \(t\) por un valor inicial \(V_0\) que puede ser un precio, una cantidad de dinero o un nivel de puntos arbitrario.
¿Qué son los índices?
¿Cómo se calcula la capitalización de mercado de un activo?**
Algunos índices de acciones famosos son:
También existen índices de bonos y de commodities:
Los primeros índices fueron creados y publicados por periódicos financieros para resumir las fluctuaciones diarias de los precios de las acciones. El precursor del Wall Street Journal* llamado Dow Jones and Co’s Customer’s Afternoon letter creó en 1884 al Dow Jones, este índice sigue siendo una de las principales referencias para los inversionistas americanos junto con el S&P500.*
Hoy existen empresas como Standard & Poor’s Financial Services LLC* (S&P) y Morgan Stanley Capital International (MSCI) que son proveedores de índices. Estas empresas desarrollan metodologías proprietarias para definir sus índices.*
Por lo regular las metodologías para construir índices de acciones y bonos consisten en:
Asignar pesos de rebalanceo a cada componente del índice. Los tipos de índices más comunes son:
Determinar la frecuencia de los rebalanceos del índice. Regularmente los índices se rebalancean semestralmente o trimestralmente
Ver mapa que muestra la capitalización de mercado en miles de millones de dólares para cada país en el mundo en 2015
Estados Unidos, con un market cap de 19.8 billones de dólares, es el más grande y representa el 52% del valor del mercado en el mundo. Japón es el segundo lugar con $3 billones, seguido por UK en $2.7 billones.
Fondo que replica el valor de algún índice o activo (puede no ser operado en bolsa, como el oro). Una de sus cualidades es que los ETF’s son listados en bolsa y pueden ser operados como cualquier acción.
¿Porqué no comprar todas las acciones de un índice y replicarlo en un portafolio?
Si quisiéramos replicar el valor de un índice necesitaríamos el capital necesario para comprar todos las activos en el índice con su peso correspondiente. Para eso, necesitaríamos mucho capital. De igual manera, si quisiéramos aumentar o disminuir nuestra posición en el índice sería muy complicado porque tendríamos que comprar o vender todos los componentes con consecuencias de costos de transacción y operativos.
Por otro lado, si quisiéramos invertir en el valor del oro tendríamos que conseguir lingotes de oro y no podríamos comprar fracciones de lingotes. Además al momento de vender, podría ser complicado encontrar alguien interesado en esos lingotes.
Los ETFs se han vuelto muy populares porque son muy fáciles de operar y permiten tener exposición a distintas fuentes de valor. A partir del 2013, éstos son los instrumentos más operados globalmente; de hecho, el instrumento más operado en el mundo es el SPY. Este ETF lo ofrece State Street Global Advisors* y replica el valor del S&P 500.*
¿En qué unidades está el índice, en qué unidades está el SPY?
Dependiendo de la serie que se consiga, el SPY cobra distintas comisiones.
#Modificar get_prices_yahoo
get_prices_yahoo2 <- function (yahoo_id, column = "Adjusted", from = "2007-01-01",
to = Sys.Date(), ..., periodicity = "daily")
{
series <- list()
i <- 0
for (id in yahoo_id) {
col <- paste(toupper(gsub("\\^", "", id)), ".", column, sep = "")
ss <- getSymbols.yahoo(id, auto.assign = FALSE, from = from,
to = to, periodicity = periodicity, ...)[, col]
i <- i + 1
series[[i]] <- ss
}
series <- do.call(cbind, series)
series <- na.locf(series, na.rm = FALSE, fromLast = TRUE)
series
}
spy <- get_prices_yahoo2(c('spy', '^GSPC'),
from = '2016-12-31',
to = '2018-12-31',
periodicity = 'weekly')
spy %>% plotly_xts()
spy %>% get_dlyChg_from_price() %>% get_cumRet_from_dlyChg() %>% plotly_xts()
Para conocer los valores en los que se encuentra invertido un ETF es necesario encontrar el prospecto de información del ETF. Para el caso de ETFs de índices, el prospecto indica el nombre del índice que busca replicar. También resulta muy útil visitar la página https://www.etf.com/ para encontrar los específicos de un ETF particular.