Skip to content

Instantly share code, notes, and snippets.

@sillasgonzaga
Created September 22, 2018 00:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sillasgonzaga/654972267f34afe23374c50d86eaca8a to your computer and use it in GitHub Desktop.
Save sillasgonzaga/654972267f34afe23374c50d86eaca8a to your computer and use it in GitHub Desktop.
# adaptacao da planilha de valuation da proseek
library(dplyr)
library(purrr)
library(magrittr)
#### párametros unicos
taxa_impostos_indiretos <- 14.65/100
margem_estimada <- 19.78/100
taxa_ir_base <- 8/100
taxa_cs_base <- 12/100
taxa_ir <- 15/100
taxa_adicional_ir <- 10/100
lim_adicional_ir <- 240
taxa_cs <- 9/100
taxa_media_depreciacao <- 10
#### parametros macroeconomicos
# pib <- c(2.9, 3, rep(2.7, 16))/100
ipca <- c(3.74, 4.18, 4.06, 3.99, rep(3.98, 14))/100
igpm <- c(4.21, 4.36, 4.21, 4.15, rep(4.18, 14))/100
cpi <- c(2.52267, 1.855, 1.87462, 1.96197, 2.00492, 2.00737, 2.00407, 2.03215, 2.02175, rep(2, 9))/100
# selic <- c(6.7, 7.8, 8.2, 8.1, rep(80.4, 14))/100
diferencial_inflacao <- ((1+ipca)/(1+cpi))-1
#### parametros wacc
params_wacc <- list(
beta_desalavan = 0.68,
tx_livre_risco = 2.41/100,
premio_risco_mercado = 5.08/100,
premio_risco_pais = 3.46/100,
dif_inflacao_med = mean(diferencial_inflacao),
custo_divida = 9.4/100,
divida_cpt_proprio = 23.6/100
)
### premissas da empresa
demanda_inicial <- 155
demanda_inicial <- demanda_inicial * 252
ticket_medio_inicial <- 52.50
capex_inicial <- 1130
demanda_anual <- c(demanda_inicial, rep(NA_real_, 16))
ticket_medio_anual <- c(ticket_medio_inicial, rep(NA_real_, 16))
crescimento_demanda <- c(0, rep(5, 4), rep(1, 7), rep(0, 5))/100
#demanda_anual <- c(demanda_inicial, rep(NA_real_, 16))
#demanda_inicial * (1 + crescimento_demanda)
for (i in 2:length(demanda_anual)){
demanda_anual[i] <- demanda_anual[i-1] * (1 + crescimento_demanda[i])
ticket_medio_anual[i] <- ticket_medio_anual[i-1] * (1 + ipca[i + 1])
}
demanda_anual <- c(0, demanda_anual)
ticket_medio_anual <- c(0, ticket_medio_anual)
## calculos
receita_op_bruta <- round(ticket_medio_anual * demanda_anual / 1000)
#receita_op_bruta <- dplyr::lag(receita_op_bruta, default = 0)
# deducoes
deducoes <- round(-1 * taxa_impostos_indiretos * receita_op_bruta)
# custos e despesas
custos <- round(- 1 * (receita_op_bruta + deducoes) * (1 - margem_estimada))
## IR/CS
# aliquota para calculo de base tributaria
aliq_ir <- taxa_ir_base * receita_op_bruta
aliq_cs <- taxa_cs_base * receita_op_bruta
ir_anual <- -1 * taxa_ir * aliq_ir
adicional_ir_anual <- ifelse(aliq_ir > lim_adicional_ir,
-1 * (aliq_ir - lim_adicional_ir) * taxa_adicional_ir,
0)
ir_anual <- ir_anual + adicional_ir_anual
cs_anual <- -1 * taxa_cs * aliq_cs
## capital de giro
contas_a_receber <- 35
contas_a_pagar <- 25
usos <- receita_op_bruta * contas_a_receber/360
fontes <- -1 * custos * contas_a_pagar/360
capital_de_giro <- fontes - usos
necessidade_de_cap_de_giro <- ifelse(seq_along(capital_de_giro) == 1,
capital_de_giro[1],
capital_de_giro - lag(capital_de_giro))
## depreciacao
mat_depreciacao <- matrix(0, ncol = 6, nrow = 18)
colnames(mat_depreciacao) <- c("inicial", "entrada", "saida",
"periodo", "saldo_imob", "reinvestimentos")
for (i in 2:nrow(mat_depreciacao)){
mat_depreciacao[i, "inicial"] <- mat_depreciacao[i - 1, "periodo"]
mat_depreciacao[i, "entrada"] <- (capex_anual[i - 1] + mat_depreciacao[i - 1, "reinvestimentos"])/taxa_media_depreciacao
mat_depreciacao[i, "saida"] <- ifelse(i - 1 < taxa_media_depreciacao,
0,
-1 * mat_depreciacao[i - taxa_media_depreciacao, "entrada"])
mat_depreciacao[i, "periodo"] <- mat_depreciacao[i, "inicial"] + mat_depreciacao[i, "entrada"] + mat_depreciacao[i, "saida"]
mat_depreciacao[i, "reinvestimentos"] <- mat_depreciacao[i, "periodo"]
mat_depreciacao[i, "saldo_imob"] <- mat_depreciacao[i - 1, "saldo_imob"] + capex_anual[i - 1] + mat_depreciacao[i, "reinvestimentos"] - mat_depreciacao[i, "periodo"]
}
mat_depreciacao[1, "saldo_imob"] <- mat_depreciacao[2, "saldo_imob"]
mat_depreciacao <- round(mat_depreciacao)
## capex
capex_anual <- c(capex_inicial, rep(0, 17))
reinvestimentos <- mat_depreciacao[, "reinvestimentos"]
## wacc
capm <- params_wacc %$%
{(1 + (tx_livre_risco + premio_risco_mercado * beta_desalavan + premio_risco_pais)) * (1 + dif_inflacao_med) - 1}
capm <- rep(capm, 18)
wacc <- params_wacc %$%
{divida_cpt_proprio * custo_divida + (1 - divida_cpt_proprio)*capm}
#### DRE ####
#receita_op_bruta_dre <- lag(receita_op_bruta, default = 0)
# fluxo de caixa
ebitda <- c(receita_op_bruta + deducoes + custos)
total_ir_cs <- round(c(ir_anual + cs_anual))
capital_giro_dre <- round(necessidade_de_cap_de_giro)
fluxo_caixa_op <- ebitda + total_ir_cs + capital_giro_dre
capex_dre <- -1 * capex_anual - reinvestimentos
FCFF <- round(fluxo_caixa_op + capex_dre)
# lucro liquido
depreciacao <- -1 * mat_depreciacao[, "periodo"]
lucro_liq <- round(ebitda + depreciacao + total_ir_cs)
# calculo de resultados
perpet <- ifelse(seq_along(FCFF) == length(FCFF),
FCFF * (1 + ipca)/(wacc - ipca),
0)
periodos_desconto <- seq_along(perpet)
fator_desconto <- (1 + wacc)^periodos_desconto
fator_desconto
vp_fluxo <- round(FCFF/fator_desconto)
vp_perpet <- round(perpet/fator_desconto)
vpl <- sum(vp_fluxo + vp_perpet)
vpl
### conferir se ta zerando
ativo_circ_caixa <- rep(0, 18)
for (i in 2:length(ativo_circ_caixa)){
ativo_circ_caixa[i] <- ativo_circ_caixa[i - 1] + FCFF[i]
}
ativo_circ_contas <- c(0, usos)
ativo_perm_imob <- mat_depreciacao[, "saldo_imob"]
pass_circ <- c(0, fontes)
pass_nao_circ <- rep(0.30 * capex_inicial, 18)
pl_capital_social <- rep(0, 18)
pl_capital_social[1] <- ifelse(FCFF[1] < 0, -1 * FCFF[1], 0) - pass_nao_circ[1]
for (i in 2:length(pl_capital_social)){
pl_capital_social[i] <- ifelse(FCFF[i] < 0, -1 * FCFF[i], 0) + pl_capital_social[i-1] - (pass_nao_circ[i] - pass_nao_circ[i-1])
}
pl_lucros_acum <- cumsum(lucro_liq)
pl <- pl_capital_social + pl_lucros_acum
check <- (ativo_circ_caixa + ativo_circ_contas + ativo_perm_imob) - (pass_circ + pass_nao_circ + pl)
check
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment