Como calcular o CET de um empréstimo em Python ou planilha

Por BuildBase

18 de outubro de 2026

Duas propostas de empréstimo chegam no mesmo dia. Uma anuncia 1,8% ao mês, a outra 1,9%. A primeira parece mais barata, até você perceber que ela desconta uma tarifa na liberação e financia o IOF. Quem decide pela taxa do anúncio escolhe às cegas.

O número que resolve a dúvida é o Custo Efetivo Total. Os bancos são obrigados a informá-lo, mas calcular o seu próprio CET, em Python ou em planilha, serve para conferir a conta, simular cenários antes de pedir proposta e comparar ofertas que vêm em formatos diferentes.

Resposta rápida: O CET é a taxa anual que iguala o dinheiro que realmente cai na conta ao valor presente de todos os pagamentos, contando dias corridos na base de 365 dias. Para calcular, monte o fluxo de caixa com datas reais (valor líquido liberado e cada parcela) e resolva a taxa por busca numérica em Python ou com a função XTIR do Excel e do Google Planilhas.

 

A regra que define o cálculo

O CET é regulado pela Resolução CMN nº 4.881, publicada pelo Banco Central, que vale para pessoas físicas, empresários individuais, microempresas e empresas de pequeno porte. Três detalhes dela mudam o código que você vai escrever:

  1. O ponto de partida é o valor líquido liberado, ou seja, o crédito menos tarifas e despesas pagas na contratação.
  2. Entram no fluxo juros, amortizações, tarifas, tributos, seguros e qualquer outro encargo ligado à operação.
  3. O desconto usa dias corridos divididos por 365 e o resultado é expresso como taxa anual.

A fórmula, escrita como equação, é FC0 = soma de FCj / (1 + CET) elevado a (dj menos d0)/365. Não existe solução fechada para essa equação. Por isso o cálculo é sempre iterativo.

 

O código, em menos de 40 linhas

Tela de computador com linhas de código
Uma função de busca resolve a taxa sem depender de biblioteca externa. Foto: Chris Ried / Unsplash

 

Nada de pandas nem numpy aqui. A biblioteca padrão resolve, e o código fica fácil de auditar. Usei bisseção em vez de Newton-Raphson porque ela nunca diverge com fluxos comuns de empréstimo.

from datetime import date, timedelta

def price(pv, taxa_m, n):
    """Parcela fixa (tabela Price)."""
    return pv * taxa_m / (1 - (1 + taxa_m) ** -n)

def iof_pj(pv, taxa_m, n, prazos, aliq_dia=0.000082, aliq_fixa=0.0038):
    """IOF simplificado: parcela fixa sobre o valor + diária sobre cada amortização,
    limitada a 365 dias. Confira a alíquota vigente antes de usar."""
    parcela = price(pv, taxa_m, n)
    saldo, total = pv, pv * aliq_fixa
    for k in range(n):
        juros = saldo * taxa_m
        amort = parcela - juros
        saldo -= amort
        total += amort * aliq_dia * min(prazos[k], 365)
    return total

def cet_anual(fc0, fluxos, d0):
    """Taxa anual que iguala o valor liberado ao valor presente dos pagamentos,
    descontados por dias corridos na base 365."""
    def vp(i):
        return sum(v / (1 + i) ** ((d - d0).days / 365) for d, v in fluxos) - fc0
    lo, hi = 0.0, 10.0
    for _ in range(200):
        mid = (lo + hi) / 2
        if vp(mid) > 0:
            lo = mid
        else:
            hi = mid
    return mid

A função vp é decrescente: quanto maior a taxa, menor o valor presente. Se o resultado ainda é positivo, a taxa testada está baixa e o intervalo sobe. Duzentas iterações dão precisão muito além dos centavos.

 

Um caso real, com números

Um empréstimo de R$ 100 mil para pessoa jurídica, 24 parcelas mensais, juro de 1,8% ao mês e tarifa de R$ 1.500 descontada na liberação. O IOF também é descontado do valor liberado.

pv, taxa, n, tarifa = 100_000, 0.018, 24, 1_500
d0 = date(2026, 11, 2)
datas = [d0 + timedelta(days=30 * k) for k in range(1, n + 1)]
prazos = [(d - d0).days for d in datas]

parcela = price(pv, taxa, n)            # 5.168,08
iof = iof_pj(pv, taxa, n, prazos)       # 2.773,67
fc0 = pv - iof - tarifa                 # 95.726,33 liberados de fato
cet = cet_anual(fc0, [(d, parcela) for d in datas], d0)
print(f"CET: {cet:.2%} ao ano")         # cerca de 30,09%

A taxa nominal de 1,8% ao mês equivale a cerca de 23,87% ao ano. Com tarifa e IOF no fluxo, o custo efetivo sobe para algo perto de 30% ao ano. São seis pontos percentuais que o anúncio não mostra.

As alíquotas de IOF usadas no exemplo são as de pessoa jurídica fixadas após as mudanças de 2025 (0,38% fixo e 0,0082% ao dia). Optantes do Simples em operações de até R$ 30 mil têm alíquota diária menor. Confira sempre a regra vigente antes de usar o código para decidir.

 

A mesma conta em planilha, sem programar

Calculadora preta e caneta sobre papel branco
Na planilha, a função XTIR faz o mesmo trabalho do código. Foto: Mediamodifier / Unsplash

 

Quem não programa tem um atalho elegante: a função XTIR (XIRR em inglês) usa exatamente a convenção da norma, dias corridos e base 365.

  1. Na coluna A, coloque as datas: a da liberação e a de cada parcela.
  2. Na coluna B, coloque os valores: o líquido liberado como positivo e cada parcela como negativo.
  3. Em uma célula livre, use =XTIR(B2:B26;A2:A26).
  4. Formate como porcentagem. O resultado é o CET anual.

Já a função TAXA devolve a taxa mensal de um fluxo com parcelas iguais e intervalos regulares. Ela serve para conferir o juro nominal, mas não respeita datas reais e ignora meses de 28 ou 31 dias.

FerramentaUsa datas reais?Bom para
Python com bisseçãoSimSimular dezenas de cenários e integrar a sistemas
XTIR na planilhaSimConferir uma proposta específica
TAXA na planilhaNãoAchar o juro mensal de parcelas iguais
Calculadora do bancoDependePonto de partida, nunca a palavra final

 

Antecipação de boletos também tem CET

O mesmo código serve para desconto de títulos. Imagine um boleto de R$ 20 mil com vencimento em 60 dias, desconto de 2% ao mês, tarifa de R$ 50 e IOF simplificado. O líquido fica em cerca de R$ 18.975,60. Rodando cet_anual com um único fluxo de R$ 20 mil no vencimento, o custo efetivo fica perto de 37,7% ao ano, bem acima do que “2% ao mês” sugere.

Esse número muda conforme a instituição. Antes de simular, vale comparar taxas de antecipação de boleto entre bancos e fintechs e entender a coobrigação na antecipação de recebíveis, porque operações sem coobrigação costumam custar mais, já que o comprador do título assume o risco de o cliente não pagar.

No código, contratos recorrentes viram vários fluxos futuros em vez de um só. Quem quer antecipar contratos com prazo definido pode montar a lista de datas e valores de cada mensalidade e rodar a mesma função. O tempo também importa para o caixa: saber quanto tempo leva a antecipação de recebíveis ajuda a definir a data zero do fluxo com mais precisão.

 

Erros que distorcem o resultado

  • Usar o valor contratado como FC0 quando parte dele nunca chegou à conta. Tarifa descontada na liberação aumenta o CET.
  • Ignorar seguros obrigatórios, comuns em operações com garantia. Eles entram no fluxo como pagamento.
  • Contar meses de 30 dias quando o contrato usa datas fixas. Pequenas diferenças somam em prazos longos.
  • Esquecer custos de garantia, como avaliação e registro. No custo do crédito com imóvel em garantia esses valores aparecem antes da liberação e pesam no começo do fluxo.
  • Comparar CET de prazos diferentes sem olhar o total pago. CET menor em 60 meses pode significar mais dinheiro desembolsado do que CET maior em 24.

Para entender o outro lado, o motor que decide se o crédito é aprovado, o texto sobre o que há por trás dos sistemas de crédito bancário complementa bem este cálculo.

 

Perguntas que aparecem ao rodar o script

 

Meu resultado deu diferente do CET do banco. Quem errou?

Provavelmente faltou algum custo ou as datas não batem. Peça o demonstrativo do CET, que a instituição deve fornecer, e compare linha a linha.

 

Dá para usar o script com taxa pós-fixada?

A norma diz que indexadores flutuantes não entram no CET, mas precisam aparecer no demonstrativo. No código, você pode projetar o índice e rodar cenários, desde que deixe claro que é simulação.

 

E crédito com garantia de veículo, muda algo?

O fluxo é o mesmo. Muda o que entra antes da liberação, como vistoria e registro do gravame. Conhecer as etapas do crédito com garantia de veículo ajuda a saber quais custos aparecem e quando.

 

Do script à decisão

Notebook sobre mesa de vidro exibindo gráficos e indicadores
Com o CET de cada proposta em mãos, a comparação fica objetiva. Foto: Carlos Muza / Unsplash

 

Calcular o CET deixa a comparação honesta, mas não cota o mercado por você. Profissionais que comparam o custo efetivo entre diferentes instituições financeiras, como o Christian Roos, especialista em crédito estruturado que analisa soluções em mais de 50 instituições, fazem esse trabalho em escala.

O Christian Roos analisa CET, prazo e garantia antes de recomendar crédito e mapeia mais de 150 alternativas para empresas e pessoas. Seu script passa a ser a ferramenta para conferir o que chega.

Quem prefere não programar pode pedir que o profissional mostre o demonstrativo de CET de cada proposta. Na conversa inicial com o Christian Roos, que é gratuita, essa comparação costuma ser o primeiro assunto.

  • Se você recebeu duas propostas, rode as duas no script ou na XTIR com os custos completos e escolha pelo menor CET para o mesmo prazo.
  • Se os prazos são diferentes, compare também o total pago e a parcela que o caixa aguenta.
  • Se o projeto é um sistema interno, use a função como base de testes e confira o resultado com a XTIR de uma planilha. Para integrações maiores, o texto sobre APIs que integram análise de risco em financiamentos mostra o caminho.

Leia também: