¿Qué es un API?

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.

¿Qué es la Banca Abierta (Open Banking)?

"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...

¿Qué es un dato personal?

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.

Para discutir:

¿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?

API's Financieras

Diversas entidades financieras y no financieras, publican sus API's de forma gratuita a través de sus páginas de internet.

YaHoo!

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