Forwards
forward(bday1, bday2, rate1, rate2)
Calcula a taxa a termo (forward rate) entre dois prazos (dias úteis).
Utiliza a fórmula
f₁→₂ = ((1 + r₂)^(du₂/252) / (1 + r₁)^(du₁/252))^(252/(du₂ - du₁)) - 1
Onde
- r₁ é a taxa zero para o primeiro prazo (du₁).
- r₂ é a taxa zero para o segundo prazo (du₂).
- du₁ é o número de dias úteis até a primeira data.
- du₂ é o número de dias úteis até a segunda data.
- A constante 252 representa o número de dias úteis no ano.
Como du/252 = t (tempo em anos úteis), a fórmula pode ser simplificada para:
f₁→₂ = ((1 + r₂)^t₂ / (1 + r₁)^t₁)^(1/(t₂ - t₁)) - 1
Parameters:
Name | Type | Description | Default |
---|---|---|---|
bday1
|
int
|
Número de dias úteis do primeiro ponto (prazo menor). |
required |
bday2
|
int
|
Número de dias úteis do segundo ponto (prazo maior). |
required |
rate1
|
float
|
Taxa zero (spot rate) para o prazo |
required |
rate2
|
float
|
Taxa zero (spot rate) para o prazo |
required |
Returns:
Name | Type | Description |
---|---|---|
float |
float
|
A taxa a termo calculada entre |
Examples:
>>> # Exemplo válido: bday2 > bday1
>>> yd.forward(10, 20, 0.05, 0.06)
0.0700952380952371
>>> # Exemplo inválido: bday2 <= bday1
>>> yd.forward(20, 10, 0.06, 0.05)
nan
>>> yd.forward(10, 10, 0.05, 0.05)
nan
>>> # Exemplo com NaN na entrada
>>> yd.forward(10, 20, 0.05, pd.NA)
nan
Note
É fundamental que bday2
seja estritamente maior que bday1
para que
o cálculo da taxa a termo seja matematicamente válido.
A fórmula utilizada é derivada da relação entre taxas zero (spot rates) é: $$ f_{1 \rightarrow 2} = \left( \frac{(1 + r_2)^{t_2}}{(1 + r_1)^{t_1}} \right)^{\frac{1}{t_2 - t_1}} - 1 $$
Source code in pyield/fwd.py
forwards(bdays, rates, groupby_dates=None)
Calcula taxas a termo (forward rates) a partir de taxas zero (spot rates).
A taxa a termo no vértice 'n' é definida como: fwdₖ = fwdⱼ→ₖ (a taxa a termo de j para k)
A fórmula utilizada é
fwdₖ = ((1 + rₖ)^(duₖ/252) / (1 + rⱼ)^(duⱼ/252))^(252/(duₖ - duⱼ)) - 1
Como du/252 = t (tempo em anos úteis), a fórmula pode ser simplificada para:
fwdₖ = ((1 + rₖ)^tₖ / (1 + rⱼ)^tⱼ)^(1/(tₖ - tⱼ)) - 1
Em LaTeX, a fórmula é representada como: $$ fwd_k = \left( \frac{(1 + r_k)^{t_k}}{(1 + r_j)^{t_j}} \right)^{\frac{1}{t_k - t_j}} - 1 $$
Onde
- rⱼ é a taxa zero para o vértice anterior.
- rₖ é a taxa zero para o vértice atual.
- tⱼ é o prazo em anos para o vértice anterior (calculado como duⱼ/252).
- tₖ é o prazo em anos para o vértice atual (calculado como duₖ/252).
- A constante 252 representa o número de dias úteis no ano.
A primeira taxa a termo de cada grupo é definida como a taxa zero desse primeiro vértice (fwd₁ = r₁), dado que não existe um vértice anterior a r₁ para se calcular a taxa a termo no primeiro ponto.
Valores nulos nas taxas ou prazos de entrada resultarão em valores nulos
nas taxas a termo calculadas. A função também lida com agrupamentos
opcionais, permitindo calcular taxas a termo para diferentes grupos de
datas. O agrupamento é feito com base na coluna groupby_dates
, que
deve ser fornecida como uma série de pandas. Se groupby_dates
for None,
todos os dados serão tratados como um único grupo.
A função calcula as taxas a termo para todos os pontos, exceto o primeiro
de cada grupo, que é tratado separadamente.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
bdays
|
Series
|
Número de dias úteis para cada taxa zero. |
required |
rates
|
Series
|
Taxas zero correspondentes aos dias úteis. |
required |
groupby_dates
|
Series | None
|
Critério de agrupamento opcional para segmentar os cálculos (ex: por data de referência). Se None, todos os dados são tratados como um único grupo. Default None. |
None
|
Returns:
Type | Description |
---|---|
Series
|
pd.Series: Série contendo as taxas a termo calculadas (tipo Float64). A primeira taxa de cada grupo corresponde à taxa zero inicial. |
Raises:
Type | Description |
---|---|
ValueError
|
Se os índices de |
ValueError
|
Se |
Examples:
>>> bdays = pd.Series([10, 20, 30])
>>> rates = pd.Series([0.05, 0.06, 0.07])
>>> yd.forwards(bdays, rates)
0 0.05
1 0.070095
2 0.090284
dtype: Float64
>>> # Exemplo com agrupamento (a última está isolada em outro grupo)
>>> groupby_dates = pd.Series([1, 1, 2])
>>> yd.forwards(bdays, rates, groupby_dates)
0 0.05
1 0.070095
2 0.07
dtype: Float64
Note
- A função ordena os dados de entrada primeiro por
groupby_dates
, se for fornecido, e depois porbdays
para garantir a ordem cronológica correta no cálculo das taxas a termo. - Os resultados são retornados na mesma ordem dos dados de entrada.
Source code in pyield/fwd.py
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
|