Concepto

Una serie de tiempo es una colección de observaciones sobre un determinado fenómico, efectuadas en momentos sucesivos, usualmente equiespaciados.

Algunos ejemplos de series de tiempo son:
1. Precios de acciones.
2. Niveles de inventario.
3. Rotación de personal.
4. Ventas.
5. PIB (GDP).

Más información:
Libro R for Data Science (2e).

Instalar paquetes y llamar librerías

Crear la serie de tiempo.

Ejemplo:
Los siguientes datos de producción trimestral inician en el primer trimestre del 2020.
Se busca pronosticar la producción de los siguientes 5 trimestres.

produccion <- c(50, 53, 55, 57, 55, 60)

ts <- ts(data = produccion, start = c(2020,1), frequency = 4)
ts
##      Qtr1 Qtr2 Qtr3 Qtr4
## 2020   50   53   55   57
## 2021   55   60

Crear el modelo ARIMA

ARIMA significa AutoRegressive Integrated Moving Average o Modelo Autoregresivo Integrado de Promedio Móvil.

arima <- auto.arima(ts, D=1)
arima
## Series: ts 
## ARIMA(0,0,0)(0,1,0)[4] with drift 
## 
## Coefficients:
##        drift
##       1.5000
## s.e.  0.1768
## 
## sigma^2 = 2.01:  log likelihood = -2.84
## AIC=9.68   AICc=-2.32   BIC=7.06
summary(arima)
## Series: ts 
## ARIMA(0,0,0)(0,1,0)[4] with drift 
## 
## Coefficients:
##        drift
##       1.5000
## s.e.  0.1768
## 
## sigma^2 = 2.01:  log likelihood = -2.84
## AIC=9.68   AICc=-2.32   BIC=7.06
## 
## Training set error measures:
##                      ME      RMSE       MAE        MPE      MAPE       MASE
## Training set 0.03333332 0.5787923 0.3666667 0.03685269 0.6429133 0.06111111
##                    ACF1
## Training set -0.5073047

Realizar pronóstico

pronostico <- forecast(arima, level= c(95), h=5)
pronostico
##         Point Forecast    Lo 95    Hi 95
## 2021 Q3             61 58.22127 63.77873
## 2021 Q4             63 60.22127 65.77873
## 2022 Q1             61 58.22127 63.77873
## 2022 Q2             66 63.22127 68.77873
## 2022 Q3             67 63.07028 70.92972
plot(pronostico)

Actividad 2: Hershey’s

Cargar base de datos

library(readxl)
lechita <- read_excel("Desktop/Primer Bloque/Modulo 1/Ventas_Históricas_Lechitas.xlsx")
lechita$Ventas <- as.numeric(lechita$Ventas)

Crear una serie de tiempo

ts1 <- ts(data = lechita$Ventas, start = c(2017,1), frequency = 12)
ts1
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2017 25520.51 23740.11 26253.58 25868.43 27072.87 27150.50 27067.10 28145.25
## 2018 28463.69 26996.11 29768.20 29292.51 29950.68 30099.17 30851.26 32271.76
## 2019 32496.44 31287.28 33376.02 32949.77 34004.11 33757.89 32927.30 34324.12
##           Sep      Oct      Nov      Dec
## 2017 27546.29 28400.37 27441.98 27852.47
## 2018 31940.74 32995.93 32197.12 31984.82
## 2019 35151.28 36133.07 34799.91 34846.17

Crear el modelo arima

arima1 <- auto.arima(ts1, D=1)
arima1
## Series: ts1 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8979
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202701:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
summary(arima1)
## Series: ts1 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8979
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202701:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
## 
## Training set error measures:
##                    ME    RMSE    MAE        MPE      MAPE       MASE      ACF1
## Training set 25.22158 343.864 227.17 0.08059932 0.7069542 0.06491044 0.2081026

Realizar pronóstico

pronostico1 <- forecast(arima1, level= c(95), h=12)
pronostico1
##          Point Forecast    Lo 95    Hi 95
## Jan 2020       35498.90 34616.48 36381.32
## Feb 2020       34202.17 33155.28 35249.05
## Mar 2020       36703.01 35596.10 37809.92
## Apr 2020       36271.90 35141.44 37402.36
## May 2020       37121.98 35982.07 38261.90
## Jun 2020       37102.65 35958.90 38246.40
## Jul 2020       37151.04 36005.73 38296.34
## Aug 2020       38564.64 37418.70 39710.58
## Sep 2020       38755.22 37609.03 39901.42
## Oct 2020       39779.02 38632.72 40925.32
## Nov 2020       38741.63 37595.28 39887.97
## Dec 2020       38645.86 37499.50 39792.22
plot(pronostico1)

Finanzas Corporativas

Instalar paquetes y llamar librerias

#install.packages("finreportr")
library(finreportr)

Información disponible

Con la función “FinReportR” podemos obtener la siguiente información:
- CompanyInfo() = Brinda información general como nombre, ubicación, ZIP, etc.
- AnnualReports() = Brinda el nombre, fecha, y número de acceso.
- GetIncome() = Estado de resultados.
- GetBalanceSheet() = Estado de resultados.
- GetCashFlow() = Brinda el flujo de efectivo.

options(HTTPUserAgent = "a a@gmail.com")
CompanyInfo("JPM")
##               company        CIK  SIC state state.inc FY.end     street.address
## 1 JPMORGAN CHASE & CO 0000019617 6021    NY        DE   1231 383 MADISON AVENUE
##          city.state
## 1 NEW YORK NY 10017
AnnualReports("BABA", foreign = TRUE)
##    filing.name filing.date         accession.no
## 1       20-F/A  2024-02-23 0001193125-24-044480
## 2         20-F  2023-07-21 0000950170-23-033752
## 3         20-F  2022-07-26 0001104659-22-082622
## 4         20-F  2021-07-27 0001104659-21-096092
## 5         20-F  2020-07-09 0001104659-20-082409
## 6         20-F  2019-06-05 0001047469-19-003492
## 7         20-F  2018-07-27 0001047469-18-005257
## 8         20-F  2017-06-15 0001047469-17-004019
## 9         20-F  2016-05-24 0001047469-16-013400
## 10        20-F  2015-06-25 0001047469-15-005768
# google_income <- GetIncome("GOOG", 2016)
amazon_balance <- GetBalanceSheet("AMZN", 2015)
apple_cash <- GetCashFlow("AAPL", 2014)
options(HTTPUserAgent = "a a@gmail.com")
CompanyInfo("JPM")
##               company        CIK  SIC state state.inc FY.end     street.address
## 1 JPMORGAN CHASE & CO 0000019617 6021    NY        DE   1231 383 MADISON AVENUE
##          city.state
## 1 NEW YORK NY 10017
AnnualReports("BABA",foreign=TRUE)
##    filing.name filing.date         accession.no
## 1       20-F/A  2024-02-23 0001193125-24-044480
## 2         20-F  2023-07-21 0000950170-23-033752
## 3         20-F  2022-07-26 0001104659-22-082622
## 4         20-F  2021-07-27 0001104659-21-096092
## 5         20-F  2020-07-09 0001104659-20-082409
## 6         20-F  2019-06-05 0001047469-19-003492
## 7         20-F  2018-07-27 0001047469-18-005257
## 8         20-F  2017-06-15 0001047469-17-004019
## 9         20-F  2016-05-24 0001047469-16-013400
## 10        20-F  2015-06-25 0001047469-15-005768
google_income<-GetIncome("GOOG",2016)
amazon_balance <- GetBalanceSheet("AMZN",2015)
apple_cash<-GetCashFlow("AAPL",2014)

Conseguir los datos

options(HTTPUserAgent = "a a@gmail.com")
jpm_income_2015<-GetIncome("JPM",2015)
jpm_balance_2015 <- GetBalanceSheet("JPM",2015)
jpm_income_2018<-GetIncome("JPM",2018)
jpm_balance_2018 <- GetBalanceSheet("JPM",2018)
jpm_balance_2013<-GetBalanceSheet("JPM",2013)
jpm_balance_2016<-GetBalanceSheet("JPM",2016)

Manipulación de Datos

conjunto<-rbind(jpm_balance_2015,jpm_balance_2018,jpm_income_2015,jpm_income_2018,jpm_balance_2013,jpm_balance_2016)
conjunto<-conjunto%>%
  filter(Metric %in% c("Assets","Net Income (Loss) Attributable to Parent","Liabilities","Deposits"))
conjunto$endDate <- as.Date(conjunto$endDate)

conjunto_filtered <- conjunto %>%
  filter(endDate >= as.Date("2012-01-01") & endDate <= as.Date("2017-12-31")) %>%
  group_by(Metric, year = as.numeric(format(endDate, "%Y"))) %>%
  mutate(row_number = row_number()) %>%
  filter(row_number == 1) %>%
  select(-row_number) %>%
  ungroup()
conjunto_filtered<-conjunto_filtered%>%select(1,3,6)
df_pivot <- conjunto_filtered %>%
  spread(key = Metric, value = Amount)

# Opcional: Renombramos las columnas para que tengan nombres más descriptivos
names(df_pivot)[1] <- "Year"

df_pivot$Assets<-as.numeric(df_pivot$Assets)
df_pivot$Deposits<-as.numeric(df_pivot$Deposits)
df_pivot$Liabilities<-as.numeric(df_pivot$Liabilities)
df_pivot$`Net Income (Loss) Attributable to Parent`<-as.numeric(df_pivot$`Net Income (Loss) Attributable to Parent`)

Crear serie de tiempo

ts2<-ts(df_pivot$Deposits,start =c(2012,1),frequency =1)
ts2
## Time Series:
## Start = 2012 
## End = 2017 
## Frequency = 1 
## [1] 1.193593e+12 1.287765e+12 1.363427e+12 1.279715e+12 1.375179e+12
## [6] 1.443982e+12

Crear Modelo ARIMA

ARIMA significa AutoRegressive Integrated Moving Average o Modelo Autorregresivo Integrado de Promedio Movil

arima3<-auto.arima(ts2,d=1)
summary(arima3)
## Series: ts2 
## ARIMA(0,1,0) 
## 
## sigma^2 = 7.09e+21:  log likelihood = -132.88
## AIC=267.75   AICc=269.09   BIC=267.36
## 
## Training set error measures:
##                       ME        RMSE         MAE      MPE     MAPE     MASE
## Training set 41930432067 76865093443 69834432067 3.021252 5.201737 0.835714
##                    ACF1
## Training set -0.3972446

Generar el pronóstico

pronostico3 <- forecast(arima3,level=c(95), h=5)
pronostico3
##      Point Forecast        Lo 95        Hi 95
## 2018   1.443982e+12 1.278950e+12 1.609014e+12
## 2019   1.443982e+12 1.210592e+12 1.677372e+12
## 2020   1.443982e+12 1.158138e+12 1.729826e+12
## 2021   1.443982e+12 1.113918e+12 1.774046e+12
## 2022   1.443982e+12 1.074959e+12 1.813005e+12
plot(pronostico3)