Vous êtes sur la page 1sur 2

import pandas as pd

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# Importer les données des taux d'intérêt


data = pd.DataFrame({
'Maturity': [13/52, 13/12, 26/52, 2, 5, 10, 15, 20, 30],
'Yield': [0.0138, 0.0086, 0.0139, 0.0184, 0.0294, 0.0472, 0.0527, 0.0554,
0.0543]
})

# Définir la fonction de Nelson-Siegel


def nelson_siegel(m, beta0, beta1, beta2, tau):
y = beta0 + beta1 * ((1 - np.exp(-m / tau)) / (m / tau)) + beta2 * (((1 -
np.exp(-m / tau)) / (m / tau)) - np.exp(-m / tau))
return y

# Ajuster la courbe des taux de Nelson-Siegel aux données


popt, pcov = curve_fit(nelson_siegel, data['Maturity'], data['Yield'])
beta0, beta1, beta2, tau = popt

# Afficher les paramètres ajustés


print('Paramètres ajustés :')
print('beta0 =', beta0)
print('beta1 =', beta1)
print('beta2 =', beta2)
print('tau =', tau)

# Calcul des taux prédits


predicted_rates = [NelsonSiegel(maturity, *params) for maturity in maturities]

# Calcul des statistiques du modèle


y = np.array([NelsonSiegel(maturity, *params) for maturity in maturities])
sse = np.sum((y - rates) ** 2)
sst = np.sum((rates - np.mean(rates)) ** 2)
r2 = 1 - sse/sst
print("R² = {:.4f}".format(r2))

# Affichage des taux prédits


for maturity, predicted_rate in zip(maturities, predicted_rates):
print("Taux prédit pour maturité {:.2f} ans : {:.4f}".format(maturity,
predicted_rate))

# Tracé de la courbe des taux avec le modèle de Nelson-Siegel


fig, ax = plt.subplots(figsize=(12, 6))

, rates, 'o', label='Taux observés')

# Tracé des taux prédits


ax.plot(maturities, predicted_rates, label='Taux prédits')
# Personnalisation du graphique
ax.legend()
ax.set_xlabel('Maturité')
ax.set_ylabel('Taux')
ax.set_title('Modèle de Nelson-Siegel')

# Ajout de la courbe de la pente


t = np.linspace(0, max(maturities), 100)
y = params[0] + params[1] * ((1 - np.exp(-t/params[3])) / (t/params[3])) +
params[2] * ((1 - np.exp(-t/params[3])) / (t/params[3]) - np.exp(-t/params[3]))
ax.plot(t, y, 'r--', label='Courbe de la pente')

# Calcul des statistiques des modèles


mse = np.mean((np.array(rates) - np.array(predicted_rates)) ** 2)
mae = np.mean(np.abs(np.array(rates) - np.array(predicted_rates)))
rmse = np.sqrt(mse)

# Tableau de résultats qualité d'ajustement


results_table = np.array([rates, predicted_rates, np.abs(np.array(rates) -
np.array(predicted_rates))]).T
results_table = np.vstack((results_table, ['', '', '']))
results_table = np.vstack((results_table, ['MSE', mse, '']))
results_table = np.vstack((results_table, ['MAE', mae, '']))
results_table = np.vstack((results_table, ['RMSE', rmse, '']))
print("Tableau de résultats qualité d'ajustement : ")
print(results_table)

# Tracer la courbe des taux ajustée et les taux observés


fig, ax = plt.subplots()
ax.plot(data['Maturity'], data['Yield'], '.', label='Taux observés')
ax.plot(np.linspace(0, 30, 1000), nelson_siegel(np.linspace(0, 30, 1000), beta0,
beta1, beta2, tau), label='Courbe des taux de Nelson-Siegel')
ax.set_title('Courbe des taux de Nelson-Siegel')
ax.set_xlabel('Maturité')
ax.set_ylabel('Taux')
ax.legend()
plt.show()

Vous aimerez peut-être aussi