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:
- O ponto de partida é o valor líquido liberado, ou seja, o crédito menos tarifas e despesas pagas na contratação.
- Entram no fluxo juros, amortizações, tarifas, tributos, seguros e qualquer outro encargo ligado à operação.
- 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

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 midA 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

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.
- Na coluna A, coloque as datas: a da liberação e a de cada parcela.
- Na coluna B, coloque os valores: o líquido liberado como positivo e cada parcela como negativo.
- Em uma célula livre, use =XTIR(B2:B26;A2:A26).
- 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.
| Ferramenta | Usa datas reais? | Bom para |
|---|---|---|
| Python com bisseção | Sim | Simular dezenas de cenários e integrar a sistemas |
| XTIR na planilha | Sim | Conferir uma proposta específica |
| TAXA na planilha | Não | Achar o juro mensal de parcelas iguais |
| Calculadora do banco | Depende | Ponto 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

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.











