QuantLib on Python, baby!

Uma recente oportunidade de negócios me fez colocar as mãos novamente na QuantLib, biblioteca de finanças quantitativas com licença de código aberto, muitos anos após minha última contribuição.

Apanhei um pouco para compilar os módulos que queria, por incompatibilidades entre as configurações escolhidas eas diversas ferramentas usadas, e hoje compilei a extensão para Python.

A extensão para Python, linguagem que adotei para meus estudos, funcionou de primeira e já consegui escrever um pequeno código que calcula o preço de uma NTN-F.

Ainda preciso investigar uma divergência de valores encontrada e pensar em uma extensão específica para nosso mercado. Estou bem animado em brincar com ela, até para testar o apreçamento dessas operações que as corretoras (XP e Ágora, principalmente) tentam empurrar para os clientes.

Segue o código:

import QuantLib as ql

# Evaluation date is a global setting
today = ql.Date(8,11,2019)
ql.Settings.instance().evaluationDate = today

# Defining the NTN-F 01/01/2029
issueDate = ql.Date(1,1,2007)
settlementDays = 1;
faceAmount = 1000.0;
redemption = 100.0;
maturityDate = ql.Date(1,1,2029);
couponRate = ql.InterestRate(0.1, ql.Thirty360(), ql.Compounded,ql.Annual);
# FixedRateBond class requires a vector of coupons in order to support
# a generic schedule of payments
couponRates = [couponRate]

schedule = ql.Schedule(issueDate
,maturityDate
,ql.Period(ql.Semiannual)
,ql.Brazil(ql.Brazil.Settlement)
,ql.Unadjusted
,ql.Unadjusted
,ql.DateGeneration.Backward
,False
)

# Defining NTN-F bond object
ntnf = ql.FixedRateBond(
settlementDays
,faceAmount
,schedule
,couponRates
,ql.Following
,redemption
,issueDate
)

# Yield to maturity found on Tesouro Direto
yieldToMaturity = ql.InterestRate(0.0664,ql.Business252(ql.Brazil(ql.Brazil.Settlement)), ql.Compounded,ql.Annual)

price = faceAmount * (ql.BondFunctions_cleanPrice(
ntnf
,yieldToMaturity.rate()
,yieldToMaturity.dayCounter()
,yieldToMaturity.compounding()
,yieldToMaturity.frequency()
,today
) + ntnf.accruedAmount(today)) / 100

# Expected price is close to 1256,74 but as of today I see 1256,42
# Initial investigation found 1 business of difference
# More to follow
print(price)

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.