Skip to content

Commit

Permalink
Release candidate 1.
Browse files Browse the repository at this point in the history
  • Loading branch information
flimao committed Feb 15, 2022
1 parent 5d232f0 commit e48998a
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 16 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,11 @@ Models for predicting price of several financial products:
* Brazilian sovereign debt

... and others to come.

## Installation

```bash
$ pip install git+ssh://git@github.com/flimao/financial-product-models
(...)
Successfully installed finance-models-1.0.0
```
23 changes: 11 additions & 12 deletions finance_models/br_sovereign_debt_securities.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,11 @@ def constroi_fluxo(self,
elif isinstance(dt_fim, str):
dt_fim = tools.str2dt(dt_fim)

# dt_base default
if dt_base is None:
dt_base = self.dt_compra
elif isinstance(dt_base, str):
dt_base = tools.str2dt(dt_fim)
dt_base = tools.str2dt(dt_base)

# a data inicio deve ser ou 01/07/(ANO DA DATA BASE) ou 01/01/(ANO SEGUINTE AO ANO DA DATA BASE), o que ocorrer primeiro
dt_inicio = dt.date(
Expand Down Expand Up @@ -183,7 +184,7 @@ def calcula_pu(self,
taxa_anual: float or None = None,
):
"""
calcula o PU de um prefixado sem cupom dado o valor futuro (valor de face), o prazo anualizado e a taxa % a.a.
calcula o PU de um fluxo dado o valor futuro, o prazo anualizado e a taxa % a.a.
vf: float -> valor de face ou valor futuro. Se None, default para o valor de face padrão (R$ 1000)
prazo_anual: float -> prazo anualizado (segundo convencao). Se None, default para prazo entre compra e vencimento
Expand All @@ -207,16 +208,17 @@ def calcula_pu(self,
return pu

def calcula_taxa_anual(self,
pu: float,
pu: float,
valor_base: float = 100,
prazo_anual: float or None = None,
valor_base: float or None = None

):
"""
calcula a taxa anual % a.a. de um título prefixado sem cupom dados o PU, o prazo anualizado e o valor base ou valor de face
calcula a taxa anual % a.a. associada a um fluxo dados o PU (valor presente), o prazo anualizado e o valor base (valor futuro)
valor_base: float -> valor de face ou valor futuro. Se None, default para o valor de face padrão (R$ 1000)
valor_base: float -> valor de face ou valor futuro. Se None, default para R$ 100 (base percentual)
prazo_anual: float -> prazo anualizado (segundo convencao). Se None, default para prazo entre compra e vencimento
pu: float -> PU correspondente ao prazo anualizado
pu: float -> PU correspondente ao prazo anualizado (valor presente)
"""

# prazo_anual default
Expand All @@ -226,15 +228,12 @@ def calcula_taxa_anual(self,
dt_fim = self.vencimento
)

# valor base default
if valor_base is None:
valor_base = self.valor_face

# valor_base = pu * (1 + taxa_anual) ** prazo_anual
# pu = valor_base * (1 + taxa_anual) ** prazo_anual
taxa_anual = np.exp((np.log(valor_base) - np.log(pu)) / prazo_anual) - 1

return taxa_anual


def calcula_pu_ntnf(self,
dt_base: str or dt.datetime or dt.date or None = None,
tir: float or None = None,
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name = 'finance_models',
version = '0.9.2',
version = '1.0.0-rc1',

description = 'Models for predicting prices of several financial products',
url = 'https://github.com/flimao/financial-product-models',
Expand Down
10 changes: 7 additions & 3 deletions test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import numpy as np
from finance_models import br_sovereign_debt_securities as brdebt, tools
import unittest

import warnings
warnings.filterwarnings('ignore')

class TestTools(unittest.TestCase):
def setUp(self):
self.holidays = tools.get_holidays_anbima()
Expand Down Expand Up @@ -134,12 +138,12 @@ def test_taxa_anual_ltn(self):
taxa_cupom = False,
)

pu = 658.91
taxa = ltn26.calcula_taxa_anual(pu = pu)
pu = tools.Money(658.91)
taxa = ltn26.calcula_taxa_anual(pu = pu, valor_base = 1000)
taxa_esperada = 0.1136
self.assertAlmostEqual(
taxa, taxa_esperada, 4,
f"Taxa de {ltn26} errado. Com PU = {tools.Money(pu)}, a taxa deveria ser '{taxa_esperada:.2%}' a.a., mas o cálculo deu '{taxa:.2%}' a.a."
f"Taxa de {ltn26} errado. Com PU = {pu}, a taxa deveria ser '{taxa_esperada:.2%}' a.a., mas o cálculo deu '{taxa:.2%}' a.a."
)

def test_constroi_fluxo(self):
Expand Down

0 comments on commit e48998a

Please sign in to comment.