API (Application Program Interface), son un conjunto de protocolos y definiciones que permiten que la comunicación entre dos o mas equipos se lleve a cabo. Las funciones que puede tener una API depende de quien la publica, pudiendo especificar desde servicios muy simples de consulta, hasta complejos conjuntos de herramientas.
El objetivo de una API es la de proveer herramientas automatizadas que permiten:
API Specification, es la documentación que describe el proceso para realizar la conexión entre programas. Es la definición de requerimientos técnicos indispensables para obtener el funcionamiento esperado del API.
"El modelo de banca abierta busca que la información pública, agregada y transaccional de las entidades financieras (y de otros participantes del sistema financiero), así como de los usuarios, pueda ser intercambiada, con el fin de promover mayor competencia entre los intermediarios y ofrecer productos y servicios a la medida de los usuarios." fuente: deloitte.com
En otras palabras, es la publicación de un API por parte de las entidades financieras y otros participantes del sistema.
LEY PARA REGULAR LAS INSTITUCIONES DE TECNOLOGÍA FINANCIERA
Última reforma publicada DOF 20-05-2021
Artículo 76.- Las Entidades Financieras, los transmisores de dinero, las sociedades de información crediticia, las cámaras de compensación a que se refiere la Ley para la Transparencia y Ordenamiento de los Servicios Financieros, las ITF y las sociedades autorizadas para operar con Modelos Novedosos estarán obligadas a establecer interfaces de programación de aplicaciones informáticas estandarizadas que posibiliten la conectividad y acceso de otras interfaces desarrolladas o administradas por los mismos sujetos a que se refiere este artículo y terceros especializados en tecnologías de la información, con el fin de compartir los datos e información siguiente:
I. Datos financieros abiertos: son aquellos generados por las entidades mencionadas en el primer párrafo de este artículo que no contienen información confidencial, tales como información de productos y servicios que ofrecen al público general, la ubicación de sus oficinas y sucursales,cajeros automáticos u otros puntos de acceso a sus productos y servicios, entre otros y según sea aplicable;
II. Datos agregados: son los relativos a cualquier tipo de información estadística relacionada con operaciones realizadas por o a través de las entidades mencionadas en el primer párrafo de este artículo, sin contener un nivel de desagregación tal que puedan identificarse los datos personales o transacciones de una persona. Solamente tendrán acceso a los datos agregados las personas que cuenten con los mecanismos de autenticación que establezcan las Comisiones Supervisoras, o el Banco de México para el caso de las cámaras de compensación y sociedades de información crediticia a que se refiere el primer párrafo de este artículo, mediante disposiciones de carácter general que para tal efecto emitan, y
III. Datos transaccionales: son aquellos relacionados con el uso de un producto o servicio, incluyendo cuentas de depósito, créditos y medios de disposición contratados a nombre de los clientes de las entidades mencionadas en el primer párrafo de este artículo, entre otra información relacionada con las transacciones que los clientes hayan realizado o intentado realizar en su Infraestructura Tecnológica. Estos datos, en su carácter de datos personales de los clientes, solo podrán compartirse con la previa autorización expresa de éstos.
La información mencionada en el párrafo anterior solo podrá ser utilizada para los fines estrictamente autorizados por el cliente. Las entidades mencionadas en el primer párrafo de este artículo deberán de interrumpir el acceso de información tan pronto el titular retire su consentimiento, existan vulnerabilidades que pongan en riesgo la información de sus clientes o el tercero incumpla con los términos y condiciones que se hayan pactado para el intercambio de información. Dicha interrupción deberá ser notificada en un período no mayor a dos horas a partir de su detección a las Comisiones Supervisoras o al Banco de México, según corresponda y dichas autoridades en el ámbito de su competencia podrán ordenar el restablecimiento del acceso a la información, en los casos en que se determine que la interrupción fuera injustificada, independientemente de las sanciones administrativas que correspondan.
continúa...
Información sensible que nos identifica o nos hace identificables, como la edad, estatura, nombre, patrimonio, teléfono, CURP. También existen datos personales a nivel físico o biológico como, ADN, huella dactilar, tipo de sangre. Incluso existen huellas personales digitalizadas como las cookies.
¿Cómo se beneficia la industria financiera del open banking? ¿Qué puedes programar o para qué aprovecharías la información de Twitter, INEGI, YaHoo! juntas? ¿Qué beneficios tenemos si se conocen nuestros datos personales?
Diversas entidades financieras y no financieras, publican sus API's de forma gratuita a través de sus páginas de internet.
YaHoo! es ampliamente reconocida para la descarga de información de datos financieros de las emisoras públicas cuyos títulos se negocian en los mecados de valores de diversas partes del mundo, incluídos los de EE.UU., México y el OTC Pink.
Para hacer uso de la API de YaHoo! nos apoyaremos en la librerías quantmod
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
Para la descarga de precios de alguna emisora utilizaremos la función getSymbols()
# Observen que la función regresa una nueva variable con el nombre de la emisora
getSymbols('ALSEA.MX', from='2021-01-01')
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
##
## This message is shown once per session and may be disabled by setting
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## [1] "ALSEA.MX"
summary(ALSEA.MX)
## Index ALSEA.MX.Open ALSEA.MX.High ALSEA.MX.Low
## Min. :2021-01-04 Min. :22.36 Min. :22.74 Min. :22.00
## 1st Qu.:2021-03-10 1st Qu.:27.79 1st Qu.:28.72 1st Qu.:27.58
## Median :2021-05-19 Median :33.94 Median :34.80 Median :33.23
## Mean :2021-05-18 Mean :33.17 Mean :33.79 Mean :32.69
## 3rd Qu.:2021-07-23 3rd Qu.:37.97 3rd Qu.:38.83 3rd Qu.:37.42
## Max. :2021-09-29 Max. :42.43 Max. :44.00 Max. :42.02
## ALSEA.MX.Close ALSEA.MX.Volume ALSEA.MX.Adjusted
## Min. :22.57 Min. : 254430 Min. :22.57
## 1st Qu.:28.07 1st Qu.: 1082022 1st Qu.:28.07
## Median :34.05 Median : 1596070 Median :34.05
## Mean :33.22 Mean : 2014442 Mean :33.22
## 3rd Qu.:38.06 3rd Qu.: 2509614 3rd Qu.:38.06
## Max. :42.39 Max. :12361991 Max. :42.39
Intentamos para múltiples variables
# Los tickers de las emisoras que se negocian en el mercado mexicano, debe incluir .MX
ticker <- c('CEMEXCPO.MX', 'ALFAA.MX', 'VOLARA.MX', 'FEMSAUBD.MX')
ticker
## [1] "CEMEXCPO.MX" "ALFAA.MX" "VOLARA.MX" "FEMSAUBD.MX"
# Pasamos como parámetro la lista con los nombres de los tickers
getSymbols(ticker, from='2020-01-01')
## [1] "CEMEXCPO.MX" "ALFAA.MX" "VOLARA.MX" "FEMSAUBD.MX"
# Utilizamos las siguientes líneas para extraer los datos de las múltiples variables que
# nos regresa getSymbols y juntamos los precios de cierre ajustado en un solo data frame
dataEnv <- new.env()
getSymbols(ticker, from='2020-01-01', env=dataEnv)
## [1] "CEMEXCPO.MX" "ALFAA.MX" "VOLARA.MX" "FEMSAUBD.MX"
# Extrae los objetos nombrados de una variable de un Environment y los integra en una lista
plist <- eapply(dataEnv, Ad)
# Hacemos un merge de todos los elementos de la lista
adj_prices <- do.call(merge, plist)
head(adj_prices)
## CEMEXCPO.MX.Adjusted VOLARA.MX.Adjusted ALFAA.MX.Adjusted
## 2020-01-02 7.16 20.020 16.10172
## 2020-01-03 7.19 20.190 16.30100
## 2020-01-06 7.20 19.795 16.47537
## 2020-01-07 7.07 20.060 16.07183
## 2020-01-08 7.20 20.250 16.38072
## 2020-01-09 7.10 20.395 16.34086
## FEMSAUBD.MX.Adjusted
## 2020-01-02 174.8112
## 2020-01-03 176.6028
## 2020-01-06 176.4968
## 2020-01-07 177.8645
## 2020-01-08 176.8050
## 2020-01-09 175.9093
# Algo opcional puede ser cambiar el nombre de las columnas
# Imprimimos el nombre de las columnas antes del cambio
colnames(adj_prices)
## [1] "CEMEXCPO.MX.Adjusted" "VOLARA.MX.Adjusted" "ALFAA.MX.Adjusted"
## [4] "FEMSAUBD.MX.Adjusted"
# Nombres de las columnas después del cambio
colnames(adj_prices) <- ticker
colnames(adj_prices)
## [1] "CEMEXCPO.MX" "ALFAA.MX" "VOLARA.MX" "FEMSAUBD.MX"
#Obtenemos el rendimiento del año
#monthlyReturn(adj_prices[,4])
#yearlyReturn(adj_prices[,4])
#return <- c()
#for(i in 1:ncol(adj_prices)){
# return[i] <- yearlyReturn(adj_prices[,i])
#}
#retornos_2020 <- as.data.frame(adj_prices["2020",][nrow(adj_prices["2020",])]) / as.data.frame(adj_prices["2020",][1]) - 1
#retornos_2020
retornos_2020 <- as.data.frame(tail(adj_prices["2020",], n=1)) / as.data.frame(head(adj_prices["2020",], n=1)) - 1
retornos_2020
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 2020-12-31 0.4343575 0.2372627 -0.1084417 -0.1524105
Cargamos librería dplyr para las siguientes operaciones
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
##
## first, last
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#Precios Máximos
prices_max <- as.data.frame(adj_prices) %>% summarise_if(is.numeric, max)
prices_max
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 1 17.64 45.81 16.95519 179.32
#Últimos precios
ult_precio <- tail(adj_prices, n=1)
ult_precio
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 2021-09-29 14.66 45.72 14.41 179.32
# Calculamos la serie histórica de los retornos
retornos_precios <- diff(adj_prices, arithmetic = FALSE) - 1
retornos_precios <- na.omit(retornos_precios)
head(retornos_precios)
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 2020-01-03 0.004189944 0.008491558 0.012376252 0.0102484850
## 2020-01-06 0.001390821 -0.019564189 0.010696764 -0.0005998887
## 2020-01-07 -0.018055556 0.013387168 -0.024493468 0.0077492675
## 2020-01-08 0.018387553 0.009471636 0.019218903 -0.0059569156
## 2020-01-09 -0.013888889 0.007160494 -0.002433105 -0.0050663271
## 2020-01-10 0.011267606 0.009070851 -0.023170690 -0.0063517124
Calculamos la media de los retornos con la función colMeans()
#calculamos la media de los retornos diarios
means <- colMeans(retornos_precios)
class(means)
## [1] "numeric"
means
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 0.0021043256 0.0025992346 0.0002950289 0.0002366599
Calculamos la volatilidad de los retornos como la desviación estándar de los mismos.
# volatilidad de los retornos
std_dev <- as.data.frame(retornos_precios) %>% summarise_if(is.numeric, sd)
std_dev
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 1 0.03085447 0.03718936 0.03316652 0.01902059
Calculamos la razón de Sharpe
# Sharpe
sharpe <- (means - 0.0004) / std_dev
sharpe
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 1 0.05523755 0.05913613 -0.003164972 -0.00858754
Calculamos la correlacion de los retornos con la función cor()
#Matriz de correlacion de los retornos
correl_returns <- cor(retornos_precios)
correl_returns
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## CEMEXCPO.MX 1.0000000 0.3663129 0.2578630 0.2940771
## ALFAA.MX 0.3663129 1.0000000 0.2346226 0.4161658
## VOLARA.MX 0.2578630 0.2346226 1.0000000 0.1836368
## FEMSAUBD.MX 0.2940771 0.4161658 0.1836368 1.0000000
Cargamos un archivo en formato .xlsx que contiene información adicional de nuestras acciones. Hacemos uso del paquete readxl
# Cargar un archivo con otros datos de las acciones, recomendations
library(readxl)
datos_xl <- read_xlsx('ACCIONES.xlsx', sheet = 'Hoja1')
class(datos_xl)
## [1] "tbl_df" "tbl" "data.frame"
Convertimos datos_xl a solo data frame
datos_xl <- as.data.frame(datos_xl)
class(datos_xl)
## [1] "data.frame"
datos_xl
## ticker Price Target Recommendation
## 1 CEMEXCPO.MX 18.25 BUY
## 2 ALFAA.MX 50.00 BUY
## 3 VOLARA.MX 15.90 HOLD
## 4 FEMSAUBD.MX 170.00 HOLD
Cambiamos el nombres de los renglones, esto es, cambiar el índice del data frame
row.names(datos_xl) <- datos_xl$ticker
datos_xl
## ticker Price Target Recommendation
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY
## ALFAA.MX ALFAA.MX 50.00 BUY
## VOLARA.MX VOLARA.MX 15.90 HOLD
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD
#Si queremos borrar la columna ticker aplicamos la siguiente linea
#datos_xl$ticker <- NULL
Con la función cbind podemos agregar columnas a nuestro conjunto de datos Incorporamos la media a nuestra base de datos datos_xl. Importante conocer la clase de variable.
class(means)
## [1] "numeric"
cbind(datos_xl, means)
## ticker Price Target Recommendation means
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
datos_xl <- cbind(datos_xl, means)
datos_xl
## ticker Price Target Recommendation means
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
colnames(datos_xl)[4] <- "Media Retornos"
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
Incorporamos el retorno del 2020 a nuestra base de datos
# Hay que transopner el data frame retornos_2020
retornos_2020 <- t(retornos_2020)
retornos_2020
## 2020-12-31
## CEMEXCPO.MX 0.4343575
## ALFAA.MX 0.2372627
## VOLARA.MX -0.1084417
## FEMSAUBD.MX -0.1524105
# Cambiamos el nombre de la columna
colnames(retornos_2020) <- "Retornos 2020"
# Comprobamos la estructura de nuestra base de datos y la actualizamos
cbind(datos_xl, retornos_2020)
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020
## CEMEXCPO.MX 0.4343575
## ALFAA.MX 0.2372627
## VOLARA.MX -0.1084417
## FEMSAUBD.MX -0.1524105
datos_xl <- cbind(datos_xl, retornos_2020)
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020
## CEMEXCPO.MX 0.4343575
## ALFAA.MX 0.2372627
## VOLARA.MX -0.1084417
## FEMSAUBD.MX -0.1524105
Incorporamos los precios máximos a nuestra base de datos
class(prices_max)
## [1] "data.frame"
prices_max
## CEMEXCPO.MX ALFAA.MX VOLARA.MX FEMSAUBD.MX
## 1 17.64 45.81 16.95519 179.32
prices_max <- t(prices_max)
colnames(prices_max) <- "Precio maximo"
cbind(datos_xl, prices_max)
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo
## CEMEXCPO.MX 0.4343575 17.64000
## ALFAA.MX 0.2372627 45.81000
## VOLARA.MX -0.1084417 16.95519
## FEMSAUBD.MX -0.1524105 179.32001
datos_xl <- cbind(datos_xl, prices_max)
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo
## CEMEXCPO.MX 0.4343575 17.64000
## ALFAA.MX 0.2372627 45.81000
## VOLARA.MX -0.1084417 16.95519
## FEMSAUBD.MX -0.1524105 179.32001
Incorporamos la volatilidad
class(std_dev)
## [1] "data.frame"
std_dev <- t(std_dev)
colnames(std_dev) <- "Volatilidad"
cbind(datos_xl, std_dev)
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447
## ALFAA.MX 0.2372627 45.81000 0.03718936
## VOLARA.MX -0.1084417 16.95519 0.03316652
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059
datos_xl <- cbind(datos_xl, std_dev)
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447
## ALFAA.MX 0.2372627 45.81000 0.03718936
## VOLARA.MX -0.1084417 16.95519 0.03316652
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059
Incorporamos los valores de la razón de Sharpe
class(sharpe)
## [1] "data.frame"
sharpe <- t(sharpe)
colnames(sharpe) <- "Sharpe Ratio"
cbind(datos_xl, sharpe)
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad Sharpe Ratio
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447 0.055237554
## ALFAA.MX 0.2372627 45.81000 0.03718936 0.059136131
## VOLARA.MX -0.1084417 16.95519 0.03316652 -0.003164972
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059 -0.008587540
datos_xl <- cbind(datos_xl, sharpe)
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad Sharpe Ratio
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447 0.055237554
## ALFAA.MX 0.2372627 45.81000 0.03718936 0.059136131
## VOLARA.MX -0.1084417 16.95519 0.03316652 -0.003164972
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059 -0.008587540
Incorporamos el último precio conocido a nuestra base
class(ult_precio)
## [1] "xts" "zoo"
ult_precio <- t(ult_precio)
colnames(ult_precio) <- "Ult_precio"
cbind(datos_xl, ult_precio)
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad Sharpe Ratio Ult_precio
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447 0.055237554 14.66
## ALFAA.MX 0.2372627 45.81000 0.03718936 0.059136131 45.72
## VOLARA.MX -0.1084417 16.95519 0.03316652 -0.003164972 14.41
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059 -0.008587540 179.32
datos_xl <- cbind(datos_xl, ult_precio)
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad Sharpe Ratio Ult_precio
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447 0.055237554 14.66
## ALFAA.MX 0.2372627 45.81000 0.03718936 0.059136131 45.72
## VOLARA.MX -0.1084417 16.95519 0.03316652 -0.003164972 14.41
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059 -0.008587540 179.32
Revisamos nuestra base de datos completa
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad Sharpe Ratio Ult_precio
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447 0.055237554 14.66
## ALFAA.MX 0.2372627 45.81000 0.03718936 0.059136131 45.72
## VOLARA.MX -0.1084417 16.95519 0.03316652 -0.003164972 14.41
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059 -0.008587540 179.32
Con la base de datos podemos manipuar los datos y crear nueva información Por ejemplo, el promedio de los retornos por tipo de Recomendación de las acciones
datos_xl %>% group_by(Recommendation) %>% summarise(Promedio=mean(`Media Retornos`))
## # A tibble: 2 x 2
## Recommendation Promedio
## <chr> <dbl>
## 1 BUY 0.00235
## 2 HOLD 0.000266
Creamos una columna nueva que nos muestre la diferencia porcentual entre el precio objetivo y el precio actual (último precio)
datos_xl <- datos_xl %>% mutate(oportunidad_retorno = `Price Target` / Ult_precio - 1)
datos_xl
## ticker Price Target Recommendation Media Retornos
## CEMEXCPO.MX CEMEXCPO.MX 18.25 BUY 0.0021043256
## ALFAA.MX ALFAA.MX 50.00 BUY 0.0025992346
## VOLARA.MX VOLARA.MX 15.90 HOLD 0.0002950289
## FEMSAUBD.MX FEMSAUBD.MX 170.00 HOLD 0.0002366599
## Retornos 2020 Precio maximo Volatilidad Sharpe Ratio Ult_precio
## CEMEXCPO.MX 0.4343575 17.64000 0.03085447 0.055237554 14.66
## ALFAA.MX 0.2372627 45.81000 0.03718936 0.059136131 45.72
## VOLARA.MX -0.1084417 16.95519 0.03316652 -0.003164972 14.41
## FEMSAUBD.MX -0.1524105 179.32001 0.01902059 -0.008587540 179.32
## oportunidad_retorno
## CEMEXCPO.MX 0.24488404
## ALFAA.MX 0.09361327
## VOLARA.MX 0.10340042
## FEMSAUBD.MX -0.05197416
Creamos un nuevo data frame
alsea <- data.frame(
ticker = 'ALSEA.MX',
`Price Target` = 23,
Recommendation = 'SELL'
)
alsea
## ticker Price.Target Recommendation
## 1 ALSEA.MX 23 SELL
rownames(alsea) = 'ALSEA.MX'
alsea
## ticker Price.Target Recommendation
## ALSEA.MX ALSEA.MX 23 SELL
Si usamos rbind() para agregar el nuevo renglón, encontraremos problemas puesto que no es compatible con el data frame datos_xl por el número de columnas.
rbind(datos_xl, alsea)
# Para que rbind pueda funcionar, el número de elementos de alsea debe ser igual al número de columnas de nuestra tabla destino