-
Notifications
You must be signed in to change notification settings - Fork 0
/
bcra_balance_historico.R
276 lines (216 loc) · 10.2 KB
/
bcra_balance_historico.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
# Librerías ---------------------------------------------------------------------
library(readxl)
library(tidyverse)
library(lubridate)
library(dplyr)
library(tidyr)
library(writexl)
# Datos a modificar ------------------------------------------------------------
# En esta sección figura el último año en el que se extraen datos
# Afecta a la creación del vector hojas. Luego se borra.
ult <- 2022
# Preparación previa -----------------------------------------------------------
# Indica el link que lleva a la base de datos a utilizar
link <- "https://www.bcra.gov.ar/Pdfs/PublicacionesEstadisticas/Serieanual.xls"
# Configuración de seguridad para descarga
options(
"download.file.method" = "libcurl",
"libcurl" = "--tlsv1.2",
"httr_oob_default" = TRUE
)
# Indica donde descargar el archivo
download.file(link, destfile = "SerieBCRA.xls", mode = "wb")
# Crea un objeto con los nombres de cada hoja del archivo que se descarga, para luego leerlas
hojas <- c(paste0("Serie semanal ", 1998:2005), paste0("serie semanal ", 2006:ult))
# Objeto al que se le asignara la información
datos <- NULL
# Limpieza
rm(ult)
# Loop de extracción -----------------------------------------------------------
# Loop para que lea hoja por hoja el archivo Excel y lo guarde en un data frame ordenado
# En 2022, hubo un cambio de metodología contable. La fecha 31/12/22 tiene dos entradas:
# - La que histórica
# - La que continua desde el 31/12 en adelante
# Como solución, se quita el ajuste y la brecha se comienza a ver en 2023
for (j in hojas) {
if (j == "serie semanal 2022") {
serie <- read_excel("SerieBCRA.xls", sheet = j, skip = 3) %>% # skip=3 indica que ignore las primeras 3 filas
select(-ncol(.)) %>%
rename(Grupo = 1) %>% # Renombra la 1er columna como Grupo
gather(key = "dia", value = "Monto", -Grupo) %>% # Transpone datos (formato largo)
filter(!is.na(Monto)) %>% # Borra filas sin datos
mutate(Monto = as.numeric(Monto)) %>%
mutate(Grupo = trimws(gsub("[^[:alnum:] ]", "", Grupo)), # Unifica nombres
Grupo = gsub(" ", " ", toupper(Grupo)), # Todo mayúscula
Grupo = chartr("?????", "AEIOU", Grupo), # Borra tildes
fecha = as.Date(as.numeric(dia), origin = "1899-12-30")) # Convierte fecha a formato R
} else {
serie <- read_excel("SerieBCRA.xls", sheet = j, skip = 3) %>% # skip=3 indica que ignore las primeras 3 filas
rename(Grupo = 1) %>% # Renombra la 1er columna como Grupo
gather(key = "dia", value = "Monto", -Grupo) %>% # Transpone datos (formato largo)
filter(!is.na(Monto)) %>% # Borra filas sin datos
mutate(Monto = as.numeric(Monto)) %>%
mutate(Grupo = trimws(gsub("[^[:alnum:] ]", "", Grupo)), # Unifica nombres
Grupo = gsub(" ", " ", toupper(Grupo)), # Todo mayúscula
Grupo = chartr("?????", "AEIOU", Grupo), # Borra tildes
fecha = as.Date(as.numeric(dia), origin = "1899-12-30")) # Convierte fecha a formato R
}
## Problema de los 31 de diciembre con asteriscos en la fecha, se elimina el *
serie$fecha[is.na(serie$fecha)] <- dmy(gsub(" .*", "", serie$dia[is.na(serie$fecha)]))
## Se junta todo, uniendo filas y eliminando la columna Día
datos <- bind_rows(datos, serie) %>% select(-dia)
}
## Se remueve la base del último año ingresado al loop
rm(serie, hojas)
# Orden y depuración --------------------------------------------------------------
datos <- datos %>%
filter(!is.na(Grupo)) %>%
select(fecha, Grupo, Monto)
# Funciones --------------------------------------------------------------------
# La función realiza tres procesos recurrentes para cuando se trasladan datos,
# desde el dataframe "datos" hacia el dataframe "semanal":
# - Borra fechas duplicadas
# - Borra la columna Grupos del dataframe "datos"
# - Renombra la columna "Monto" por la variable que se está tratando
# Los parámetros de la función son:
# - base = la base de datos que va a ser afectada por la función.
# - col = el string de la columna renombrada por la función
bcra <- function(base, col) {
base <- base[(!duplicated(base)),]
base$Grupo <- NULL
names(base)[names(base) == "Monto"] <- col
return(base)
}
# Filtrado de las bases semanales-----------------------------------------------
## * tipo_cambio ####
TdC <- filter(datos, Grupo == "TIPO DE CAMBIO")
## * activo_bcra ####
# Total Activo
TA <- filter(datos, Grupo == "TOTAL DEL ACTIVO")
## * reservas_pesos ####
# Reservas internacionales en pesos ($)
RIP <-filter(datos, Grupo %in% c("RESERVAS INTERNACIONALES","RESERVAS DE LIBRE DISPONIBILIDAD",
"ORO DIVISAS COLOCACIONES A PLAZO Y OTROS"))
## * divisas_pesos ####
DIV <- filter(datos, Grupo == "DIVISAS")
## * convenio_multilateral ####
CONV <- filter(datos, Grupo %in% c("CONVENIOS MULTILATERALES DE CREDITO", "CONVENIOS MULTILATERALES DE CRÉDITO"))
## * titulos_publicos ####
TPUBL <- filter(datos, Grupo %in% c("TITULOS PUBLICOS"))
### NOTA: TITULOS PUBLICOS en mayúsculas y sin acento toma el rubro más agregado del balance.
### Si se toman con acento (Ej: Títulos) capta rubros desagregados.
## * adelantos_transitorios ####
AT <-filter(datos, Grupo == "ADELANTOS TRANSITORIOS AL GOBIERNO NACIONAL")
## * credito_sist_financiero ####
# Créditos al sistema financiero del país
C <-filter(datos, Grupo == "CREDITOS AL SISTEMA FINANCIERO DEL PAIS")
## * pasivo_bcra ####
# Total Pasivo
TP <- filter(datos, Grupo == "TOTAL DEL PASIVO")
## * base_monetaria ####
# Base monetaria en millones de pesos
BM <-filter(datos, Grupo == "BASE MONETARIA")
## * circulacion_monetaria ####
CIRC <-filter(datos, Grupo %in% c("CIRCULACION MONETARIA", "CIRCULACIÓN MONETARIA"))
CIRC$Monto <- as.numeric(CIRC$Monto)
## * oblig_organismos_internales ####
ORGINT <-filter(datos, Grupo == "OBLIGACIONES CON ORGANISMOS INTERNACIONALES")
## * titulos_emitidos_bcra ####
# Títulos emitidos por el BCRA
TIT <-filter(datos, Grupo == "TITULOS EMITIDOS POR EL BCRA")
## * letras_intransferibles ####
# Letras intransferibles del tesoro nacional. Se genera el siguiente criterio:
# - Se genera un filtro en el que se guardan todas las filas que contienen letras intransferibles.
# - El valor de la variable es la suma de todas las filas que corresponden a letras intransferibles.
# - Se excluyen los cálculos patrimoniales del BCRA con o sin letras.
LI <- datos %>%
filter(grepl("LETRA.*INTRANSFERIBLE", Grupo) & !grepl("PATRIMONIO NETO", Grupo)) %>%
group_by(fecha) %>%
summarise(Monto = sum(Monto)) %>%
mutate(Grupo = 0)
# Arreglo bases semanales ------------------------------------------------------
## Identificación de bases y variables ####
# A cada nombre de base (en bases), le corresponde un nombre de variable (en colum)
bases <- c("TdC", # Tipo de cambio
"TA", "RIP", "DIV", "CONV", "TPUBL", "AT", "C", # Activo BCRA
"TP", "BM", "CIRC", "ORGINT", "TIT", "LI")
colum <- c("tipo_cambio",
"activo_bcra",
"reservas_pesos",
"divisas_pesos",
"convenio_multilateral",
"titulos_publicos",
"adelantos_transitorios",
"credito_sist_financiero",
"pasivo_bcra",
"base_monetaria",
"circulacion_monetaria",
"oblig_organismos_internales",
"titulos_emitidos_bcra",
"letras_intransferibles")
tracker <- as.data.frame(cbind(bases,colum))
## Loop para variables ####
# Acá es donde aplica la función bcra
for (i in (1:nrow(tracker))) {
base_name <- tracker$bases[i]
col <- tracker$colum[i]
base <- get(base_name)
base <- bcra(base, col)
assign(base_name, base)
}
rm(base, tracker, base_name, col, i, j)
# Unión de bases semanales -----------------------------------------------------
## Base de inicio ####
# Se empieza con TdC, que tiene el tipo de cambio
# TdC es el primer dataframe del vector bases
# Se dejan ordenados cálculos de tiempo al inicio
semanal <- TdC %>%
mutate(dia = day(fecha),
mes = month(fecha),
anio = year(fecha)) %>%
select(fecha, dia, mes, anio, tipo_cambio)
## Loop de left-joins ####
for (nombre in bases[-1]) {
base_to_join <- get(nombre)
semanal <- left_join(semanal, base_to_join, by = "fecha")
}
rm(base_to_join)
## Limpieza ####
for (nombre in bases) {
if (exists(nombre, envir = .GlobalEnv)) {
rm(list = nombre, envir = .GlobalEnv)
}
}
rm(nombre)
## Condiciona numérico ####
for (col_name in colum) {
semanal[[col_name]] <- as.numeric(semanal[[col_name]])
}
# Imputación de valores faltantes ----------------------------------------------
## NOTA: Dentro de case_when() se imputan los valores de la circulación monetaria
## que, para las fechas detalladas, no están agregadas en la base de origen.
semanal <- semanal %>%
mutate(circulacion_monetaria = case_when(
fecha == "2010-11-23" ~ 113010501,
fecha == "2010-11-30" ~ 114167496,
fecha == "2010-12-07" ~ 116031432,
fecha == "2010-12-15" ~ 119473494,
fecha == "2010-12-23" ~ 123461690,
fecha == "2010-12-31" ~ 124534620,
TRUE ~ circulacion_monetaria)) # Mantener el valor existente si no se cumplen las condiciones anteriores
# Redondeo ---------------------------------------------------------------------
semanal <- semanal %>%
mutate_at(vars(names(semanal)[6:18]), ~ round(. / 1000, digits = 3)) %>%
mutate(tipo_cambio = round(tipo_cambio, digits = 3))
# Cálculo de variables adicionales ---------------------------------------------
## * reservas_dolares ####
# Reservas internacionales en dólares (u$s)
# Se calcula directamente como reservas en pesos/ tipo de cambio de la semana
semanal$reservas_dolares <- semanal$reservas_pesos/semanal$tipo_cambio
## * ratio_reservas_base ####
semanal$ratio_reservas_base <-semanal$reservas_pesos/semanal$base_monetaria
# Depurado y guardado ----------------------------------------------------------
## Depurado ####
semanal <- semanal[!is.na(semanal$fecha), ]
## Guardado ####
save(semanal, file = "historico22.RData")