Esta documentação detalha a discussão realizada em junho de 2022 a respeito de métricas para estimação de perdas por inadimplência de uma carteira imobiliária. Na ocasião, analistas da XP investimentos desejavam avaliar o risco da carteira de Pró - Soluto da Direcional cedida em março de 2022 por métricas diferentes daquelas reportadas no relatório elaborado pré-operação.
2 Perda Líquida por Safra
Avalia o montante de perda em relação ao total de crédito originado em uma determinada safra (S):
onde \(0 < t < T\) e \(T\) é o número máximo de parcelas da safra \(S\) e \(\sum_{n=t}^{T} VlrParcelaEmAberto(S_c)_n\) envolvem parcelas vencidas não pagas e vincendas (devido ao efeito vagão) em valor nominal, \(c\) é um critério específico de avaliação/seleção do conjunto \(S\) e \(\sum_{n=1}^{T} VlrParcela(S)_n\) signfica o valor nominal das parcelas originadas na data de referência da safra em questão. Caso o denominador não seja fixo no valor de originação da safra, a perda líquida tenderá a 1 quando \(t\) se aproxima de \(T\).
Os critérios \(c\) podem ser:
Over 30: clientes que estão inadimplentes a mais de 30 dias na data \(t\);
Over 60: clientes que estão inadimplentes a mais de 60 dias na data \(t\);
Over 90: clientes que estão inadimplentes a mais de 90 dias na data \(t\);
Ever 90: clientes que até a data \(t\) já ficaram pelo menos uma vez inadimplentes por 90 dias ou mais;
Ever 180: clientes que até a data \(t\) já ficaram pelo menos uma vez inadimplentes por 180 dias ou mais;
Nos conceitos “Ever”, uma vez que o devedor entrou na lista, ele não é mais retirado, mesmo que tenha voltado a ficar adimplente.
Como mencionado, esses conceitos foram pensados para avaliar a carteria de março de 2022. Para cálculo do indicador, portanto, usamos a carteira enviada pela cia. antes da operação para calcularmos o valor de originação de cada safra presente na carteira.
Error:
! IOError: Failed to open local file '../../dat/etl1/carteira-direcional-21-mar-2022-completa.parquet'. Detail: [errno 2] No such file or directory
O vetor acima contém o último dia de cada mês em que a carteira cedida tem parcelas a vencer. Mais tarde, usaremos este vetor para montarmos a série temporal que forma o denominador do indicador mencionado acima.
Abaixo, construimos um objeto do tipo lista, em que cada elemento corresponde a uma safra e contém uma tabela com o valor de originação de cada contrato daquela safra:
# Para facilitar a leitura, mostraremos apenas a estrutura de 3 elementos da listastr(originacao[1:3])
Error:
! object 'originacao' not found
Mais tarde, realizaremos transformações nesse objeto a fim de criar a estrutura de dados que precisamos, mas por enquanto, vamos criar um objeto temporário para conferir se o comportamento da série de originação é aquele que esperávamos
# Carrega função gráfica da Hence e cria função que cria paleta de coreslibrary(hence.plots)library(plotly)colors <-c("#300030","#e28743")color_function <-colorRampPalette(colors)hence_line_chart(p_dados = plot_originacao,p_x = data_referencia,p_y = vlr_parcelas,p_group = safra,p_color = ano,p_colors_values =color_function(length(plot_originacao$ano %>% unique)),p_xlab ="Mês",p_ylab ="Valor acumulado de originação",p_title ="Originação por safra") %>%ggplotly()
Error:
! object 'plot_originacao' not found
Cada linha representa uma safra, que foi agregada por trimestre, e cada cor representa um ano. Como esperávamos, o valor acumulado de originação é crescente ao longo dos meses que compõem o trimestre e a partir de então, o valor fica travado no valor total de originação da safra.
Agora vamos nos preocupar com o numerador, isto é, com o saldo em aberto de cada safra em cada data de referência segundo cada critério especificado acima. Nesse caso, não usaremos o mesmo arquivo para cálculo do numerador, e sim uma lista de arquivos em que cada arquivo corresponde a um mês e contém todas as parcelas em aberto ao final daquele mês. A opção pelo uso desse arquivo se deu pelo fato de que distorções podem aparecer quando usamos uma base que retrata a situação atual do contas a receber da companhia para estimar a o saldo em aberto em cada mês anterior àquele de extração da base. A existência de renegociações tende a subestimar o saldo em aberto quanto mais distante está a data de referência da data de extração da base. Sendo assim, distorções aparecem tanto no valor absoluto do indicador quanto na sua variação. Recebemos, portanto, 41 arquivos com as parcelas em aberto em cada mês de janeiro de 2019 a maio de 2022.
Error in `map()`:
ℹ In index: 1.
Caused by error:
! IOError: Failed to open local file '../../dat/etl1/parquet/'. Detail: [errno 2] No such file or directory
str(carts[1:3])
chr [1:3] NA NA NA
Abaixo criamos outro vetor de datas de referência, que contém o último dia de cada mês entre janeiro de 2019 e maio de 2022, período contemplado pela lista de arquivos.
library(tools)datas_ref2 <-list.files(glue("../.{dir_etl1}/parquet/")) %>%map_chr(function(x) x %>%str_remove(file_ext(x))) %>%str_remove("\\.") %>%map_chr(function(x) paste0(substr(x,1,4),"-",substr(x,5,6),"-01")) %>%map(as.Date) %>%map(ceiling_date,"month") %>%map(function(x) x -1) %>% unlist %>% as.Dateprint(datas_ref2)
Date of length 0
Agora, criamos uma lista em que cada elemento é uma tabela com o número de dias em atraso de cada devedor no final do mês em questão e o saldo em aberto de seus contratos.
De posse dessa lista, criaremos agora uma lista em que cada elemento é uma tabela referente a um id_venda. Nessa tabela, temos todos os meses em que aquele id_venda esteve ativo na base. Cada coluna representa uma dummy indicando se aquele id_venda se encaixa ou não no critério a qual ela se refere em cada mês. Esse objeto foi criado pela natureza dos critérios do tipo “ever”: mesmo que o contrato tenha sido recuperado, seu saldo devedor continua a ser contabilizado para provisão.
Error in `group_by()`:
! Must group by variables found in `.data`.
✖ Column `id_venda` is not found.
print(serie_temporal_id_venda %>%pluck(1))
Error:
! object 'serie_temporal_id_venda' not found
print(serie_temporal_id_venda[1:3] %>%str())
Error:
! object 'serie_temporal_id_venda' not found
Construídas as variáveis dummy, voltaremos com nossa estrutura em cada elemento da lista é uma tabela correspondente a um mês. Além disso, filtramos as bases de originacao e de saldo em aberto para que elas tenham apenas os mesmos contratos.
onde \(0 < t < T\) e \(T\) é o número máximo de parcelas da safra \(S\) e \(\sum_{n=t}^{T} VlrParcelaEmAberto(S_c,t)_n\) é o valor de todas as parcelas em aberto no período \(p\), em que \(p\) é o tempo em que o contrato se encaixou no critério \(c\) pela primeira vez. Isto é, o valor das parcelas eventualmente recuperadas após o enquadramento de um contrato em um determinado critério seguem sendo contabilizadas no numerodor. Desta forma a \(PerdaBruta_{S,c,t} \geq PerdaLiquida_{S,c,t}\). \(c\) é um critério específico de avaliação/seleção do conjunto \(S\) e \(\sum_{n=1}^{T} VlrParcela(S)_n\) signfica o valor nominal das parcelas originadas na data de referência da safra em questão. Caso o denominador não seja fixo no valor de originação da safra, a perda bruta tenderá a 1 quando \(t\) se aproxima de \(T\).
Para cálculo da perda bruta, a mesma estrutura de dados será utilizada:
Seja \(X_{i,p,t}\) uma variável aleatória que assume valor 1, caso o cliente i esteja inadimplente por um perı́odo p num determinado tempo t e 0, caso contrário.
sendo \(\widehat{S(180)}\) o estimador de Kaplan Meier da função de sobrevivência \(S(p) = P (T_i ≥ p)\), onde \(T_i\) é o tempo máximo de atraso de uma parcela do contrato i.
A elucidação teórica das probabilidades condicionais se encontram no relatório de análise de sobrevivência. Os cálculos, por sua vez, se encontram abaixo.