# Définition des librairies
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import warnings
from tqdm import tqdm
from scipy.stats import bootstrap
warnings.filterwarnings("ignore")TP1:Méthodes traditionnelles de calcul de la VaR et Expected Shortfall (ES)
Ce TP est fait dans le but de modéliser la Value at Risk qui est une mesure de risque financier. La Value at Risk (VaR) est une mesure essentielle du risque de marché qui estime la perte potentielle maximale d’un portefeuille sur un horizon h donné, avec un certain niveau de confiance \(\alpha\). La VaR est utilisée par les institutions financières et les gestionnaires de risques pour évaluer l’exposition aux pertes extrêmes et ajuster leurs stratégies d’investissement. Elle est définie comme suit :
\[VaR_{\alpha}(h) = inf \{ l \in \mathbb{R} | P(PnL \geq -l) \geq 1 - \alpha \}\]
Le PnL représente le profit and loss, c’est-à-dire la variation de la valeur du portefeuille. Dans notre cas, nous utilserons les rendements logarithmiques des actifs financiers, qui est stationnaire, pour calculer la VaR. Les rendements logarithmiques sont calculés comme suit :
\[r_t = log(\frac{P_t}{P_{t-1}}) \approx \frac{P_t - P_{t-1}}{P_{t-1}}.\]
Cette mesure est préférée aux rendements simples car sa décomposition en termes additifs permet de mieux modéliser les variations de prix des actifs financiers. De plus, en supposant la distribution identique et indépendante des rendements, on peut facilement déterminer sa loi de probabilité et calculer la VaR.
Dans ce projet, nous explorerons plusieurs méthodes pour calculer la VaR, en tenant compte de la nature des rendements financiers et des hypothèses sous-jacentes :
- Méthodes non paramétriques : VaR historique et VaR bootstrap.
- Méthodes paramétriques: VaR gaussienne et VaR basée sur une distribution Skew Student.
- Méthodes avancées : VaR avec pondération exponentielle EWMA et VaR calculée par diffusion d’actifs. En complément, nous calculerons également l’Expected Shortfall (ES), qui mesure la perte moyenne au-delà du seuil de la VaR. Cette mesure est plus robuste, car elle intègre les queues de distribution et est particulièrement utile pour évaluer les risques extrêmes.
# Import des données du CAC 40
data = yf.download("^FCHI",start="2008-01-01")
# Calcul des rendements logarithmiques
data['log_return'] = np.log(data['Close'] / data['Close'].shift(1))
# Retirer la première ligne
data = data.dropna()
data.columns = data.columns.get_level_values(0)[*********************100%***********************] 1 of 1 completed
data.head()| Price | Close | High | Low | Open | Volume | log_return |
|---|---|---|---|---|---|---|
| Date | ||||||
| 2008-01-03 | 5546.080078 | 5559.049805 | 5515.609863 | 5538.200195 | 117504500 | -0.000771 |
| 2008-01-04 | 5446.790039 | 5567.089844 | 5417.529785 | 5543.689941 | 162947200 | -0.018065 |
| 2008-01-07 | 5452.830078 | 5475.250000 | 5429.319824 | 5432.000000 | 181161800 | 0.001108 |
| 2008-01-08 | 5495.669922 | 5533.930176 | 5471.140137 | 5476.509766 | 174857100 | 0.007826 |
| 2008-01-09 | 5435.419922 | 5463.069824 | 5420.060059 | 5459.399902 | 198041500 | -0.011024 |
I. Data wrangling
Le jeu de données est constitué de 6 variables, à savoir, le prix de clôture (Close), le volume des transactions (Volume), le prix d’ouverture (Open), le prix le plus bas (Low), le prix le plus élevé (High) et les rendements logarithmiques (log-return). Pour calculer les rendements sur lesquels nous nous sommes baser pour mesurer le risque du portefeuille, nous avons utilisé le prix de clôture. Il aurait été idéal de disposer des prix de clôture ajustés, i.e. les prix de clôture qui tiennent compte des dividendes et des éventuels splits. Cependant, en raison de l’indispobilité de ces données, nous avons utilisé les prix de clôture bruts.
Sur tout l’historique du CAC 40, nous n’observons aucune donnée manquante et aucune valeur aberrante (i.e. Prix de clôture négatif). Nous avons donc pu calculer les rendements logarithmiques sans problème.
data.info()<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4630 entries, 2008-01-03 to 2026-02-10
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Close 4630 non-null float64
1 High 4630 non-null float64
2 Low 4630 non-null float64
3 Open 4630 non-null float64
4 Volume 4630 non-null int64
5 log_return 4630 non-null float64
dtypes: float64(5), int64(1)
memory usage: 253.2 KB
data.describe()| Price | Close | High | Low | Open | Volume | log_return |
|---|---|---|---|---|---|---|
| count | 4630.000000 | 4630.000000 | 4630.000000 | 4630.000000 | 4.630000e+03 | 4630.000000 |
| mean | 5159.397158 | 5191.392396 | 5122.058257 | 5158.404029 | 1.059394e+08 | 0.000088 |
| std | 1461.767094 | 1464.656510 | 1461.496378 | 1462.353717 | 5.310210e+07 | 0.013605 |
| min | 2519.290039 | 0.000000 | 0.000000 | 0.000000 | 0.000000e+00 | -0.130983 |
| 25% | 3994.122559 | 4019.992432 | 3965.000000 | 3995.302490 | 6.965910e+07 | -0.005908 |
| 50% | 4917.965088 | 4952.119873 | 4880.074951 | 4923.284912 | 9.485980e+07 | 0.000465 |
| 75% | 6231.207642 | 6266.062378 | 6175.047607 | 6217.902588 | 1.333100e+08 | 0.006684 |
| max | 8362.089844 | 8396.719727 | 8327.219727 | 8368.990234 | 5.312476e+08 | 0.105946 |
# check na
print("="*80)
print(data.isna().sum())
print("="*80)================================================================================
Price
Close 0
High 0
Low 0
Open 0
Volume 0
log_return 0
dtype: int64
================================================================================
Sur tout l’historique du CAC40, i.e. entre 1990 jusqu’à récemment, nous avons enregistré 5 périodes de crise financière. Ces périodes sont les suivantes :
- 1994 : Crise obligataire
- 2000 : Bulle Internet
- 2008 : Crise des subprimes
- 2011 : Crise de la dette souveraine
- 2020 : Crise du Covid-19
Cela peut se réperer par les clusters de rendements observables sur le graphique ci-dessous. Comme on peut l’observer, ces clusters de volatilité sont généralement associés à des périodes où le rendement journalier chute brutalemment. Pour mesurer le risque de marché, il peut être utile de modéliser ces clusters de volatilité et de prendre en compte les queues de distribution à travers des modèles GARCH par exemple.
Pour modéliser la VaR comme mesure de risque, il serait utile également de prendre les événements extrêmes en considération. En effet, en observant la densité des rendements, on peut voir que la distribution des rendements est leptokurtique, c’est-à-dire que les queues de distribution sont plus épaisses que celles d’une distribution normale (kurtosis > 3). Cela signifie que les événements extrêmes sont plus fréquents que ce que la distribution normale ne le suggère. De plus, le coefficient d’asytmmétrie est négatif, ce qui signifie que la distribution des rendements est asymétrique. Cela peut être problématique pour les méthodes paramétriques qui supposent, parfois, une distribution symétrique des rendements.
fig, ax1 = plt.subplots(figsize=(12, 6))
ax1.plot(data['log_return'], label='Rendements logarithmiques', color='red')
ax1.set_xlabel('Date')
ax1.set_ylabel('Rendements logarithmiques', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax2 = ax1.twinx()
ax2.plot(data['Close'], label='Prix historiques', color='blue')
ax2.set_ylabel('Prix historiques', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
fig.legend(loc='upper left', bbox_to_anchor=(0.12,0.89))
plt.title("Evolution des prix de clôture, rendements logarithmiques du CAC 40")
plt.show()
# Densité des rendements logarithmiques
plt.figure(figsize=(8, 6))
data['log_return'].plot(kind='kde', color='red')
plt.title("Densité des rendements logarithmiques du CAC 40")
plt.show()
# Skewness
skewness = data['log_return'].skew()
print(f"Skewness: {skewness:.2f}")
# Kurtosis
kurtosis = data['log_return'].kurtosis()
print(f"Kurtosis: {kurtosis:.2f}")Skewness: -0.28
Kurtosis: 8.48
# Autocorrélation et pacf
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
plot_acf(data['log_return'], lags=10, ax=ax1)
plot_pacf(data['log_return'], lags=10, ax=ax2)
plt.suptitle("Autocorrélation et PACF des rendements logarithmiques du CAC 40")
plt.show()
# check for stationarity
from statsmodels.tsa.stattools import adfuller
import pandas as pd
def adf_test(series, title=''):
"""
Pass in a time series and an optional title, returns an Adataset report
"""
print('Augmented Dickey-Fuller Test: {}\n'.format(title))
# .dropna() handles differenced data
result = adfuller(series.dropna(),autolag='AIC')
labels = ['Adataset test statistic','p-value','# lags used','# observations']
out = pd.Series(result[0:4],index=labels)
for key,val in result[4].items():
out['critical value ({})'.format(key)]=val
# .to_string() removes the line "dtype: float64"
print(f'{out.to_string()}\n')
if result[1] <= 0.05:
print("Strong evidence against the null hypothesis")
print("Reject the null hypothesis")
print("Data has no unit root and is stationary")
else:
print("Weak evidence against the null hypothesis")
print("Fail to reject the null hypothesis")
print("Data has a unit root and is non-stationary")
print("="*80)
adf_test(data["Close"], title='Prix de clôture')
print("="*80)
adf_test(data["log_return"], title='Log-rendements')
print("="*80)================================================================================
Augmented Dickey-Fuller Test: Prix de clôture
Adataset test statistic -0.664665
p-value 0.855691
# lags used 0.000000
# observations 4629.000000
critical value (1%) -3.431763
critical value (5%) -2.862165
critical value (10%) -2.567102
Weak evidence against the null hypothesis
Fail to reject the null hypothesis
Data has a unit root and is non-stationary
================================================================================
Augmented Dickey-Fuller Test: Log-rendements
Adataset test statistic -1.238290e+01
p-value 4.982874e-23
# lags used 2.900000e+01
# observations 4.600000e+03
critical value (1%) -3.431772e+00
critical value (5%) -2.862169e+00
critical value (10%) -2.567105e+00
Strong evidence against the null hypothesis
Reject the null hypothesis
Data has no unit root and is stationary
================================================================================
II. Implémentation de la VaR
On va prendre comme période d’apprentissage où la BCE fait baisser ses taux directeurs et comme période de (back-)test où la BCE fait augmenter ses taux directeurs. De ce fait, nous avons le découpage suivant : - Train : 15 octobre 2008 - 26 juillet 2022 - Test : 28 juillet 2022 - 11 juin 2024
On va implémenter les différentes méthodes de calcul de la VaR et de l’ES sur le jeu de données du CAC 40. On va comparer les performances de ces méthodes en utilisant la période de test. On s’attend à ce que les méthodes paramétriques soient moins performantes que les méthodes non paramétriques, car elles supposent une distribution des rendements qui n’est pas toujours vérifiée. De plus, les méthodes avancées, comme l’EWMA et la diffusion d’actifs, devraient être plus performantes que les méthodes non paramétriques, car elles prennent en compte la dynamique des rendements et les corrélations entre les actifs. En général, le backtest devrait être vérifié puisque la période de test ne comporte aucune crise financière.
train = data[['log_return',"Close"]]['15-10-2008':'26-07-2022']
data_train = train['log_return']
test = data[['log_return',"Close"]]['27-07-2022':'11-06-2024']
data_test = test['log_return']II.1. Statistiques descriptives
Nous constatons que dans la période d’entrainement est plus volatile (std=1.39%). Cela s’explique par le fait que la période d’entrainement prend en compte deux crises majeures : la crise des subprimes et la crise du Covid-19. Cela peut également se voir à travers les clusters de volatilité observables à la suite de ces crises. Dans la période de test, aucun évènement majeur n’est observé, avec une plus faible volatilité observée (std=0.08%).
On s’attend à ce que la VaR entrainée sur la période d’entrainement performe très bien sur la période de test, mais on s’attend également à ce que la VaR entrainée sur la période de test performe moins bien sur la période d’entrainement.
plt.figure(figsize=(10, 4))
plt.plot(data_train, label='Train', color='grey')
plt.plot(data_test, label='Test', color='red')
plt.legend(loc='upper left')
plt.title("Données d'entrainement et de test")
plt.show()
data_train.describe()count 3523.000000
mean 0.000153
std 0.013953
min -0.130983
25% -0.006099
50% 0.000580
75% 0.006855
max 0.096169
Name: log_return, dtype: float64
data_test.describe()count 586.000000
mean 0.000292
std 0.008947
min -0.036484
25% -0.004763
50% 0.000642
75% 0.005612
max 0.041504
Name: log_return, dtype: float64
II.2. VaR non paramétrique
La VaR est une mesure de risque qui donne une estimation de la perte maximale que l’on peut subir avec un certain niveau de confiance \(\alpha\) sur un horizon de temps donné. Par exemple, une VaR à 5% sur 1 jour de 1000 euros signifie que 95% du temps, on ne perdra pas plus de 1000 euros sur un jour.
\[P(\text{Loss} < \text{VaR}) = \alpha.\]
On peut également raisonner en terme de gain, i.e. Profit and Loss (PnL).
\[P(\text{PnL} > - \text{VaR}) = \alpha.\]
La VaR peut se calculer suivant trois approches : 1. Approche historique : On se base sur les rendements passés selon l’horizon fixé pour estimer la VaR, à l’aide d’un quantile empirique d’ordre \(\alpha\). Autrement, on peut se baser sur les rendements journaliers et utiliser la méthode de scaling. 2. Approche bootstrap : On tire aléatoirement des échantillons de rendements passés avec remise, puis on prend le quantile empirique d’ordre \(\alpha\) pour calculer la VaR de chaque échantillon. La VaR finale est la moyenne des VaR obtenues.
II.2.1. Historique
# Objectif : implémenter une fonction calculant la VaR historique
def historical_var(data, alpha=0.99):
"""
Calcul de la VaR historique
data : les rendements logarithmiques
alpha : le niveau de confiance
"""
return -np.percentile(data, 100*(1- alpha))# Calcul de la VaR historique sur l'échantillon d'entrainement pour h=1j et alpha=0.99
alpha = 0.99
var_hist_train = historical_var(data_train, alpha=alpha)
print(f"La VaR historique pour h=1j et alpha=0.99 est : {var_hist_train:.4%}")La VaR historique pour h=1j et alpha=0.99 est : 4.0850%
On constate que la VaR historique pour une horizon de 1 jour et un niveau de confiance de 99% est de -4,09%. De ce fait, la perte maximale que l’on peut subir avec un niveau de confiance de 99% sur un jour est de 4,09%. Autrement dit, il y a 1 chance sur 100 que la perte soit supérieure à 4,09%. Cette perte peut se produire 2 à 3 ans fois en une année (252 jours de trading).
II.2.2. Bootstrap
Pour l’implémentation de la VaR bootstrap, nous faisons le choix de faire un tirage de taille n=la taille de la série des rendements, avec remise. Ce choix est fait pour des raisons de simplicité. En ce qui concerne le choix du nombre d’échantillons, nous allons observer l’évolution de de l’estimation de la VaR en fonction du nombre d’échantillons. Nous limiterons à des échantillons compris entre 1000 et 10000, pour des raisons de temps computationnels, en ayant conscience que plus le nombre d’échantillons est grand, plus l’estimation de la VaR sera précise.
# Objectif : implémenter une fonction calculant la VaR bootstrap et un IC
def bootstrap_var(data, alpha=0.99, M=1000, seuil=0.05):
"""
Calcul de la VaR bootstrap
data : les rendements logarithmiques
alpha : le niveau de confiance de la VaR
n : le nombre de simulations
seuil : le seuil de l'intervalle de confiance
"""
# set seed
np.random.seed(42)
# Initialisation du vecteur des VaR
var = np.zeros(M)
# Calcul de la VaR bootstrap
for i in range(M):
sample = np.random.choice(data, size=len(data), replace=True)
var[i] = -np.percentile(sample, 100*(1- alpha))
# Calcul de l'intervalle de confiance
lower = np.percentile(var, 100*(1-seuil)/2)
upper = np.percentile(var, 100*(seuil + (1-seuil)/2))
return np.mean(var), lower, upper# Observer la variation de la VaR en fonction de M
M_values = np.arange(1000, 10000, 10)
var_bs_values = []
for M in tqdm(M_values):
var_bs_train, _, _ = bootstrap_var(data_train, alpha=alpha, M=M)
var_bs_values.append(var_bs_train) 0%| | 0/900 [00:00<?, ?it/s] 0%| | 2/900 [00:00<00:57, 15.54it/s] 0%| | 4/900 [00:00<00:58, 15.20it/s] 1%| | 6/900 [00:00<00:58, 15.25it/s] 1%| | 8/900 [00:00<00:58, 15.17it/s] 1%| | 10/900 [00:00<00:59, 15.02it/s] 1%|▏ | 12/900 [00:00<01:00, 14.72it/s] 2%|▏ | 14/900 [00:00<01:01, 14.52it/s] 2%|▏ | 16/900 [00:01<01:01, 14.34it/s] 2%|▏ | 18/900 [00:01<01:02, 14.16it/s] 2%|▏ | 20/900 [00:01<01:03, 13.92it/s] 2%|▏ | 22/900 [00:01<01:03, 13.73it/s] 3%|▎ | 24/900 [00:01<01:05, 13.47it/s] 3%|▎ | 26/900 [00:01<01:05, 13.29it/s] 3%|▎ | 28/900 [00:01<01:06, 13.10it/s] 3%|▎ | 30/900 [00:02<01:07, 12.88it/s] 4%|▎ | 32/900 [00:02<01:08, 12.70it/s] 4%|▍ | 34/900 [00:02<01:09, 12.52it/s] 4%|▍ | 36/900 [00:02<01:10, 12.26it/s] 4%|▍ | 38/900 [00:02<01:11, 12.07it/s] 4%|▍ | 40/900 [00:03<01:12, 11.91it/s] 5%|▍ | 42/900 [00:03<01:13, 11.72it/s] 5%|▍ | 44/900 [00:03<01:14, 11.57it/s] 5%|▌ | 46/900 [00:03<01:15, 11.38it/s] 5%|▌ | 48/900 [00:03<01:15, 11.22it/s] 6%|▌ | 50/900 [00:03<01:16, 11.05it/s] 6%|▌ | 52/900 [00:04<01:17, 10.90it/s] 6%|▌ | 54/900 [00:04<01:18, 10.75it/s] 6%|▌ | 56/900 [00:04<01:19, 10.62it/s] 6%|▋ | 58/900 [00:04<01:20, 10.47it/s] 7%|▋ | 60/900 [00:04<01:21, 10.32it/s] 7%|▋ | 62/900 [00:05<01:22, 10.18it/s] 7%|▋ | 64/900 [00:05<01:23, 10.04it/s] 7%|▋ | 66/900 [00:05<01:24, 9.92it/s] 7%|▋ | 67/900 [00:05<01:24, 9.87it/s] 8%|▊ | 68/900 [00:05<01:25, 9.78it/s] 8%|▊ | 69/900 [00:05<01:25, 9.72it/s] 8%|▊ | 70/900 [00:05<01:26, 9.63it/s] 8%|▊ | 71/900 [00:06<01:26, 9.56it/s] 8%|▊ | 72/900 [00:06<01:27, 9.50it/s] 8%|▊ | 73/900 [00:06<01:27, 9.41it/s] 8%|▊ | 74/900 [00:06<01:28, 9.36it/s] 8%|▊ | 75/900 [00:06<01:28, 9.31it/s] 8%|▊ | 76/900 [00:06<01:29, 9.24it/s] 9%|▊ | 77/900 [00:06<01:29, 9.17it/s] 9%|▊ | 78/900 [00:06<01:30, 9.12it/s] 9%|▉ | 79/900 [00:06<01:30, 9.08it/s] 9%|▉ | 80/900 [00:07<01:30, 9.01it/s] 9%|▉ | 81/900 [00:07<01:31, 8.98it/s] 9%|▉ | 82/900 [00:07<01:31, 8.90it/s] 9%|▉ | 83/900 [00:07<01:32, 8.87it/s] 9%|▉ | 84/900 [00:07<01:32, 8.82it/s] 9%|▉ | 85/900 [00:07<01:32, 8.77it/s] 10%|▉ | 86/900 [00:07<01:33, 8.70it/s] 10%|▉ | 87/900 [00:07<01:34, 8.64it/s] 10%|▉ | 88/900 [00:07<01:34, 8.59it/s] 10%|▉ | 89/900 [00:08<01:34, 8.54it/s] 10%|█ | 90/900 [00:08<01:35, 8.49it/s] 10%|█ | 91/900 [00:08<01:35, 8.47it/s] 10%|█ | 92/900 [00:08<01:35, 8.45it/s] 10%|█ | 93/900 [00:08<01:35, 8.41it/s] 10%|█ | 94/900 [00:08<01:36, 8.37it/s] 11%|█ | 95/900 [00:08<01:36, 8.32it/s] 11%|█ | 96/900 [00:08<01:37, 8.25it/s] 11%|█ | 97/900 [00:09<01:37, 8.20it/s] 11%|█ | 98/900 [00:09<01:38, 8.17it/s] 11%|█ | 99/900 [00:09<01:38, 8.10it/s] 11%|█ | 100/900 [00:09<01:38, 8.08it/s] 11%|█ | 101/900 [00:09<01:39, 8.03it/s] 11%|█▏ | 102/900 [00:09<01:39, 8.01it/s] 11%|█▏ | 103/900 [00:09<01:39, 7.98it/s] 12%|█▏ | 104/900 [00:09<01:40, 7.95it/s] 12%|█▏ | 105/900 [00:10<01:40, 7.90it/s] 12%|█▏ | 106/900 [00:10<01:40, 7.87it/s] 12%|█▏ | 107/900 [00:10<01:41, 7.81it/s] 12%|█▏ | 108/900 [00:10<01:42, 7.70it/s] 12%|█▏ | 109/900 [00:10<01:43, 7.66it/s] 12%|█▏ | 110/900 [00:10<01:43, 7.63it/s] 12%|█▏ | 111/900 [00:10<01:44, 7.58it/s] 12%|█▏ | 112/900 [00:10<01:44, 7.56it/s] 13%|█▎ | 113/900 [00:11<01:45, 7.48it/s] 13%|█▎ | 114/900 [00:11<01:45, 7.43it/s] 13%|█▎ | 115/900 [00:11<01:49, 7.18it/s] 13%|█▎ | 116/900 [00:11<01:48, 7.23it/s] 13%|█▎ | 117/900 [00:11<01:47, 7.28it/s] 13%|█▎ | 118/900 [00:11<01:48, 7.19it/s] 13%|█▎ | 119/900 [00:11<01:48, 7.22it/s] 13%|█▎ | 120/900 [00:12<01:48, 7.18it/s] 13%|█▎ | 121/900 [00:12<01:48, 7.20it/s] 14%|█▎ | 122/900 [00:12<01:48, 7.16it/s] 14%|█▎ | 123/900 [00:12<01:49, 7.09it/s] 14%|█▍ | 124/900 [00:12<01:49, 7.11it/s] 14%|█▍ | 125/900 [00:12<01:50, 6.98it/s] 14%|█▍ | 126/900 [00:12<01:50, 7.01it/s] 14%|█▍ | 127/900 [00:13<01:51, 6.95it/s] 14%|█▍ | 128/900 [00:13<01:51, 6.92it/s] 14%|█▍ | 129/900 [00:13<01:53, 6.82it/s] 14%|█▍ | 130/900 [00:13<01:53, 6.81it/s] 15%|█▍ | 131/900 [00:13<01:52, 6.81it/s] 15%|█▍ | 132/900 [00:13<01:53, 6.79it/s] 15%|█▍ | 133/900 [00:13<01:52, 6.81it/s] 15%|█▍ | 134/900 [00:14<01:53, 6.75it/s] 15%|█▌ | 135/900 [00:14<01:53, 6.72it/s] 15%|█▌ | 136/900 [00:14<01:54, 6.66it/s] 15%|█▌ | 137/900 [00:14<01:56, 6.56it/s] 15%|█▌ | 138/900 [00:14<01:55, 6.61it/s] 15%|█▌ | 139/900 [00:14<01:56, 6.53it/s] 16%|█▌ | 140/900 [00:15<01:56, 6.53it/s] 16%|█▌ | 141/900 [00:15<01:55, 6.56it/s] 16%|█▌ | 142/900 [00:15<01:56, 6.48it/s] 16%|█▌ | 143/900 [00:15<01:56, 6.49it/s] 16%|█▌ | 144/900 [00:15<01:57, 6.44it/s] 16%|█▌ | 145/900 [00:15<01:57, 6.43it/s] 16%|█▌ | 146/900 [00:15<01:57, 6.44it/s] 16%|█▋ | 147/900 [00:16<01:58, 6.37it/s] 16%|█▋ | 148/900 [00:16<01:58, 6.33it/s] 17%|█▋ | 149/900 [00:16<02:02, 6.11it/s] 17%|█▋ | 150/900 [00:16<02:03, 6.09it/s] 17%|█▋ | 151/900 [00:16<02:01, 6.15it/s] 17%|█▋ | 152/900 [00:16<02:00, 6.21it/s] 17%|█▋ | 153/900 [00:17<02:01, 6.12it/s] 17%|█▋ | 154/900 [00:17<02:01, 6.14it/s] 17%|█▋ | 155/900 [00:17<02:00, 6.19it/s] 17%|█▋ | 156/900 [00:17<02:00, 6.20it/s] 17%|█▋ | 157/900 [00:17<02:01, 6.13it/s] 18%|█▊ | 158/900 [00:17<02:00, 6.14it/s] 18%|█▊ | 159/900 [00:18<02:00, 6.16it/s] 18%|█▊ | 160/900 [00:18<02:03, 5.99it/s] 18%|█▊ | 161/900 [00:18<02:03, 5.97it/s] 18%|█▊ | 162/900 [00:18<02:03, 5.98it/s] 18%|█▊ | 163/900 [00:18<02:02, 6.02it/s] 18%|█▊ | 164/900 [00:18<02:01, 6.05it/s] 18%|█▊ | 165/900 [00:19<02:02, 6.02it/s] 18%|█▊ | 166/900 [00:19<02:02, 5.99it/s] 19%|█▊ | 167/900 [00:19<02:02, 6.00it/s] 19%|█▊ | 168/900 [00:19<02:02, 6.00it/s] 19%|█▉ | 169/900 [00:19<02:02, 5.99it/s] 19%|█▉ | 170/900 [00:19<02:02, 5.98it/s] 19%|█▉ | 171/900 [00:20<02:02, 5.97it/s] 19%|█▉ | 172/900 [00:20<02:03, 5.92it/s] 19%|█▉ | 173/900 [00:20<02:03, 5.89it/s] 19%|█▉ | 174/900 [00:20<02:04, 5.85it/s] 19%|█▉ | 175/900 [00:20<02:03, 5.85it/s] 20%|█▉ | 176/900 [00:21<02:13, 5.42it/s] 20%|█▉ | 177/900 [00:21<02:11, 5.49it/s] 20%|█▉ | 178/900 [00:21<02:09, 5.56it/s] 20%|█▉ | 179/900 [00:21<02:08, 5.60it/s] 20%|██ | 180/900 [00:21<02:10, 5.53it/s] 20%|██ | 181/900 [00:21<02:16, 5.27it/s] 20%|██ | 182/900 [00:22<02:13, 5.38it/s] 20%|██ | 183/900 [00:22<02:11, 5.46it/s] 20%|██ | 184/900 [00:22<02:09, 5.52it/s] 21%|██ | 185/900 [00:22<02:09, 5.51it/s] 21%|██ | 186/900 [00:22<02:09, 5.51it/s] 21%|██ | 187/900 [00:23<02:09, 5.51it/s] 21%|██ | 188/900 [00:23<02:08, 5.53it/s] 21%|██ | 189/900 [00:23<02:08, 5.53it/s] 21%|██ | 190/900 [00:23<02:08, 5.53it/s] 21%|██ | 191/900 [00:23<02:08, 5.53it/s] 21%|██▏ | 192/900 [00:23<02:08, 5.49it/s] 21%|██▏ | 193/900 [00:24<02:08, 5.48it/s] 22%|██▏ | 194/900 [00:24<02:08, 5.48it/s] 22%|██▏ | 195/900 [00:24<02:08, 5.47it/s] 22%|██▏ | 196/900 [00:24<02:11, 5.35it/s] 22%|██▏ | 197/900 [00:24<02:11, 5.35it/s] 22%|██▏ | 198/900 [00:25<02:11, 5.35it/s] 22%|██▏ | 199/900 [00:25<02:11, 5.35it/s] 22%|██▏ | 200/900 [00:25<02:10, 5.36it/s] 22%|██▏ | 201/900 [00:25<02:10, 5.36it/s] 22%|██▏ | 202/900 [00:25<02:10, 5.35it/s] 23%|██▎ | 203/900 [00:25<02:10, 5.34it/s] 23%|██▎ | 204/900 [00:26<02:10, 5.33it/s] 23%|██▎ | 205/900 [00:26<02:14, 5.16it/s] 23%|██▎ | 206/900 [00:26<02:17, 5.05it/s] 23%|██▎ | 207/900 [00:26<02:16, 5.07it/s] 23%|██▎ | 208/900 [00:26<02:15, 5.11it/s] 23%|██▎ | 209/900 [00:27<02:15, 5.12it/s] 23%|██▎ | 210/900 [00:27<02:14, 5.11it/s] 23%|██▎ | 211/900 [00:27<02:14, 5.13it/s] 24%|██▎ | 212/900 [00:27<02:22, 4.83it/s] 24%|██▎ | 213/900 [00:27<02:22, 4.84it/s] 24%|██▍ | 214/900 [00:28<02:19, 4.91it/s] 24%|██▍ | 215/900 [00:28<02:23, 4.77it/s] 24%|██▍ | 216/900 [00:28<02:25, 4.69it/s] 24%|██▍ | 217/900 [00:28<02:23, 4.75it/s] 24%|██▍ | 218/900 [00:29<02:24, 4.72it/s] 24%|██▍ | 219/900 [00:29<02:25, 4.67it/s] 24%|██▍ | 220/900 [00:29<02:23, 4.74it/s] 25%|██▍ | 221/900 [00:29<02:20, 4.82it/s] 25%|██▍ | 222/900 [00:29<02:31, 4.47it/s] 25%|██▍ | 223/900 [00:30<02:28, 4.55it/s] 25%|██▍ | 224/900 [00:30<02:25, 4.63it/s] 25%|██▌ | 225/900 [00:30<02:33, 4.41it/s] 25%|██▌ | 226/900 [00:30<02:31, 4.44it/s] 25%|██▌ | 227/900 [00:31<02:27, 4.55it/s] 25%|██▌ | 228/900 [00:31<02:25, 4.63it/s] 25%|██▌ | 229/900 [00:31<02:23, 4.69it/s] 26%|██▌ | 230/900 [00:31<02:29, 4.48it/s] 26%|██▌ | 231/900 [00:31<02:28, 4.51it/s] 26%|██▌ | 232/900 [00:32<02:25, 4.59it/s] 26%|██▌ | 233/900 [00:32<02:23, 4.65it/s] 26%|██▌ | 234/900 [00:32<02:21, 4.70it/s] 26%|██▌ | 235/900 [00:32<02:20, 4.73it/s] 26%|██▌ | 236/900 [00:32<02:19, 4.75it/s] 26%|██▋ | 237/900 [00:33<02:20, 4.72it/s] 26%|██▋ | 238/900 [00:33<02:28, 4.45it/s] 27%|██▋ | 239/900 [00:33<02:27, 4.48it/s] 27%|██▋ | 240/900 [00:33<02:25, 4.55it/s] 27%|██▋ | 241/900 [00:34<02:30, 4.36it/s] 27%|██▋ | 242/900 [00:34<02:30, 4.38it/s] 27%|██▋ | 243/900 [00:34<02:27, 4.44it/s] 27%|██▋ | 244/900 [00:34<02:25, 4.51it/s] 27%|██▋ | 245/900 [00:34<02:24, 4.53it/s] 27%|██▋ | 246/900 [00:35<02:24, 4.54it/s] 27%|██▋ | 247/900 [00:35<02:22, 4.57it/s] 28%|██▊ | 248/900 [00:35<02:22, 4.59it/s] 28%|██▊ | 249/900 [00:35<02:21, 4.59it/s] 28%|██▊ | 250/900 [00:36<02:21, 4.59it/s] 28%|██▊ | 251/900 [00:36<02:25, 4.47it/s] 28%|██▊ | 252/900 [00:36<02:33, 4.21it/s] 28%|██▊ | 253/900 [00:36<02:32, 4.23it/s] 28%|██▊ | 254/900 [00:37<02:29, 4.32it/s] 28%|██▊ | 255/900 [00:37<02:28, 4.36it/s] 28%|██▊ | 256/900 [00:37<02:27, 4.38it/s] 29%|██▊ | 257/900 [00:37<02:26, 4.39it/s] 29%|██▊ | 258/900 [00:37<02:32, 4.22it/s] 29%|██▉ | 259/900 [00:38<02:37, 4.07it/s] 29%|██▉ | 260/900 [00:38<02:34, 4.15it/s] 29%|██▉ | 261/900 [00:38<02:30, 4.24it/s] 29%|██▉ | 262/900 [00:38<02:35, 4.10it/s] 29%|██▉ | 263/900 [00:39<02:37, 4.05it/s] 29%|██▉ | 264/900 [00:39<02:34, 4.11it/s] 29%|██▉ | 265/900 [00:39<02:37, 4.03it/s] 30%|██▉ | 266/900 [00:39<02:36, 4.06it/s] 30%|██▉ | 267/900 [00:40<02:32, 4.14it/s] 30%|██▉ | 268/900 [00:40<02:34, 4.09it/s] 30%|██▉ | 269/900 [00:40<02:39, 3.97it/s] 30%|███ | 270/900 [00:40<02:36, 4.02it/s] 30%|███ | 271/900 [00:41<02:38, 3.96it/s] 30%|███ | 272/900 [00:41<02:40, 3.92it/s] 30%|███ | 273/900 [00:41<02:35, 4.02it/s] 30%|███ | 274/900 [00:41<02:33, 4.07it/s] 31%|███ | 275/900 [00:42<02:31, 4.13it/s] 31%|███ | 276/900 [00:42<02:30, 4.16it/s] 31%|███ | 277/900 [00:42<02:39, 3.90it/s] 31%|███ | 278/900 [00:42<02:37, 3.94it/s] 31%|███ | 279/900 [00:43<02:34, 4.01it/s] 31%|███ | 280/900 [00:43<02:32, 4.06it/s] 31%|███ | 281/900 [00:43<02:30, 4.10it/s] 31%|███▏ | 282/900 [00:43<02:29, 4.13it/s] 31%|███▏ | 283/900 [00:44<02:37, 3.91it/s] 32%|███▏ | 284/900 [00:44<02:36, 3.95it/s] 32%|███▏ | 285/900 [00:44<02:33, 4.01it/s] 32%|███▏ | 286/900 [00:44<02:31, 4.04it/s] 32%|███▏ | 287/900 [00:45<02:33, 3.99it/s] 32%|███▏ | 288/900 [00:45<02:36, 3.90it/s] 32%|███▏ | 289/900 [00:45<02:34, 3.94it/s] 32%|███▏ | 290/900 [00:45<02:32, 3.99it/s] 32%|███▏ | 291/900 [00:46<02:45, 3.67it/s] 32%|███▏ | 292/900 [00:46<02:41, 3.76it/s] 33%|███▎ | 293/900 [00:46<02:38, 3.83it/s] 33%|███▎ | 294/900 [00:47<02:39, 3.80it/s] 33%|███▎ | 295/900 [00:47<02:41, 3.75it/s] 33%|███▎ | 296/900 [00:47<02:38, 3.82it/s] 33%|███▎ | 297/900 [00:47<02:35, 3.87it/s] 33%|███▎ | 298/900 [00:48<02:33, 3.92it/s] 33%|███▎ | 299/900 [00:48<02:41, 3.73it/s] 33%|███▎ | 300/900 [00:48<02:39, 3.75it/s] 33%|███▎ | 301/900 [00:48<02:36, 3.83it/s] 34%|███▎ | 302/900 [00:49<02:44, 3.65it/s] 34%|███▎ | 303/900 [00:49<02:43, 3.65it/s] 34%|███▍ | 304/900 [00:49<02:39, 3.73it/s] 34%|███▍ | 305/900 [00:49<02:40, 3.70it/s] 34%|███▍ | 306/900 [00:50<02:37, 3.76it/s] 34%|███▍ | 307/900 [00:50<02:39, 3.72it/s] 34%|███▍ | 308/900 [00:50<02:43, 3.62it/s] 34%|███▍ | 309/900 [00:51<02:40, 3.69it/s] 34%|███▍ | 310/900 [00:51<02:37, 3.75it/s] 35%|███▍ | 311/900 [00:51<02:38, 3.73it/s] 35%|███▍ | 312/900 [00:51<02:36, 3.76it/s] 35%|███▍ | 313/900 [00:52<02:35, 3.78it/s] 35%|███▍ | 314/900 [00:52<02:40, 3.65it/s] 35%|███▌ | 315/900 [00:52<02:42, 3.60it/s] 35%|███▌ | 316/900 [00:52<02:39, 3.66it/s] 35%|███▌ | 317/900 [00:53<02:42, 3.59it/s] 35%|███▌ | 318/900 [00:53<02:41, 3.60it/s] 35%|███▌ | 319/900 [00:53<02:38, 3.67it/s] 36%|███▌ | 320/900 [00:54<02:37, 3.68it/s] 36%|███▌ | 321/900 [00:54<02:35, 3.72it/s] 36%|███▌ | 322/900 [00:54<02:34, 3.75it/s] 36%|███▌ | 323/900 [00:54<02:39, 3.62it/s] 36%|███▌ | 324/900 [00:55<02:40, 3.59it/s] 36%|███▌ | 325/900 [00:55<02:38, 3.64it/s] 36%|███▌ | 326/900 [00:55<02:36, 3.66it/s] 36%|███▋ | 327/900 [00:55<02:35, 3.67it/s] 36%|███▋ | 328/900 [00:56<02:34, 3.69it/s] 37%|███▋ | 329/900 [00:56<02:34, 3.70it/s] 37%|███▋ | 330/900 [00:56<02:33, 3.71it/s] 37%|███▋ | 331/900 [00:57<02:35, 3.67it/s] 37%|███▋ | 332/900 [00:57<02:34, 3.68it/s] 37%|███▋ | 333/900 [00:57<02:34, 3.67it/s] 37%|███▋ | 334/900 [00:57<02:41, 3.50it/s] 37%|███▋ | 335/900 [00:58<02:39, 3.53it/s] 37%|███▋ | 336/900 [00:58<02:38, 3.56it/s] 37%|███▋ | 337/900 [00:58<02:37, 3.58it/s] 38%|███▊ | 338/900 [00:58<02:37, 3.57it/s] 38%|███▊ | 339/900 [00:59<02:41, 3.48it/s] 38%|███▊ | 340/900 [00:59<02:39, 3.52it/s] 38%|███▊ | 341/900 [00:59<02:44, 3.41it/s] 38%|███▊ | 342/900 [01:00<02:41, 3.45it/s] 38%|███▊ | 343/900 [01:00<02:46, 3.35it/s] 38%|███▊ | 344/900 [01:00<02:46, 3.34it/s] 38%|███▊ | 345/900 [01:01<02:42, 3.41it/s] 38%|███▊ | 346/900 [01:01<02:50, 3.25it/s] 39%|███▊ | 347/900 [01:01<02:48, 3.28it/s] 39%|███▊ | 348/900 [01:01<02:44, 3.36it/s] 39%|███▉ | 349/900 [01:02<02:49, 3.24it/s] 39%|███▉ | 350/900 [01:02<02:46, 3.31it/s] 39%|███▉ | 351/900 [01:02<02:42, 3.38it/s] 39%|███▉ | 352/900 [01:03<02:40, 3.42it/s] 39%|███▉ | 353/900 [01:03<02:38, 3.45it/s] 39%|███▉ | 354/900 [01:03<02:37, 3.48it/s] 39%|███▉ | 355/900 [01:04<02:36, 3.48it/s] 40%|███▉ | 356/900 [01:04<02:35, 3.49it/s] 40%|███▉ | 357/900 [01:04<02:38, 3.43it/s] 40%|███▉ | 358/900 [01:04<02:37, 3.43it/s] 40%|███▉ | 359/900 [01:05<02:43, 3.31it/s] 40%|████ | 360/900 [01:05<02:44, 3.28it/s] 40%|████ | 361/900 [01:05<02:41, 3.34it/s] 40%|████ | 362/900 [01:06<02:39, 3.37it/s] 40%|████ | 363/900 [01:06<02:45, 3.24it/s] 40%|████ | 364/900 [01:06<02:47, 3.21it/s] 41%|████ | 365/900 [01:07<02:43, 3.27it/s] 41%|████ | 366/900 [01:07<02:41, 3.31it/s] 41%|████ | 367/900 [01:07<02:39, 3.35it/s] 41%|████ | 368/900 [01:08<02:47, 3.18it/s] 41%|████ | 369/900 [01:08<02:43, 3.24it/s] 41%|████ | 370/900 [01:08<02:49, 3.13it/s] 41%|████ | 371/900 [01:08<02:44, 3.21it/s] 41%|████▏ | 372/900 [01:09<02:42, 3.25it/s] 41%|████▏ | 373/900 [01:09<02:49, 3.11it/s] 42%|████▏ | 374/900 [01:09<02:47, 3.15it/s] 42%|████▏ | 375/900 [01:10<02:43, 3.21it/s] 42%|████▏ | 376/900 [01:10<02:41, 3.24it/s] 42%|████▏ | 377/900 [01:10<02:39, 3.28it/s] 42%|████▏ | 378/900 [01:11<02:38, 3.30it/s] 42%|████▏ | 379/900 [01:11<02:36, 3.32it/s] 42%|████▏ | 380/900 [01:11<02:38, 3.28it/s] 42%|████▏ | 381/900 [01:12<02:37, 3.30it/s] 42%|████▏ | 382/900 [01:12<02:36, 3.31it/s] 43%|████▎ | 383/900 [01:12<02:36, 3.31it/s] 43%|████▎ | 384/900 [01:12<02:35, 3.31it/s] 43%|████▎ | 385/900 [01:13<02:36, 3.30it/s] 43%|████▎ | 386/900 [01:13<02:35, 3.30it/s] 43%|████▎ | 387/900 [01:13<02:35, 3.30it/s] 43%|████▎ | 388/900 [01:14<02:35, 3.30it/s] 43%|████▎ | 389/900 [01:14<02:35, 3.29it/s] 43%|████▎ | 390/900 [01:14<02:34, 3.29it/s] 43%|████▎ | 391/900 [01:15<02:41, 3.15it/s] 44%|████▎ | 392/900 [01:15<02:40, 3.16it/s] 44%|████▎ | 393/900 [01:15<02:39, 3.18it/s] 44%|████▍ | 394/900 [01:16<02:38, 3.19it/s] 44%|████▍ | 395/900 [01:16<02:38, 3.19it/s] 44%|████▍ | 396/900 [01:16<02:44, 3.06it/s] 44%|████▍ | 397/900 [01:17<02:44, 3.07it/s] 44%|████▍ | 398/900 [01:17<02:41, 3.11it/s] 44%|████▍ | 399/900 [01:17<02:49, 2.96it/s] 44%|████▍ | 400/900 [01:18<02:46, 3.00it/s] 45%|████▍ | 401/900 [01:18<02:49, 2.95it/s] 45%|████▍ | 402/900 [01:18<02:46, 3.00it/s] 45%|████▍ | 403/900 [01:19<02:43, 3.04it/s] 45%|████▍ | 404/900 [01:19<02:50, 2.91it/s] 45%|████▌ | 405/900 [01:19<02:46, 2.97it/s] 45%|████▌ | 406/900 [01:20<02:43, 3.02it/s] 45%|████▌ | 407/900 [01:20<02:41, 3.05it/s] 45%|████▌ | 408/900 [01:20<02:40, 3.07it/s] 45%|████▌ | 409/900 [01:20<02:38, 3.10it/s] 46%|████▌ | 410/900 [01:21<02:39, 3.07it/s] 46%|████▌ | 411/900 [01:21<02:38, 3.09it/s] 46%|████▌ | 412/900 [01:21<02:37, 3.10it/s] 46%|████▌ | 413/900 [01:22<02:37, 3.10it/s] 46%|████▌ | 414/900 [01:22<02:36, 3.11it/s] 46%|████▌ | 415/900 [01:22<02:35, 3.11it/s] 46%|████▌ | 416/900 [01:23<02:35, 3.10it/s] 46%|████▋ | 417/900 [01:23<02:35, 3.11it/s] 46%|████▋ | 418/900 [01:23<02:35, 3.10it/s] 47%|████▋ | 419/900 [01:24<02:35, 3.09it/s] 47%|████▋ | 420/900 [01:24<02:35, 3.08it/s] 47%|████▋ | 421/900 [01:24<02:35, 3.08it/s] 47%|████▋ | 422/900 [01:25<02:34, 3.08it/s] 47%|████▋ | 423/900 [01:25<02:35, 3.07it/s] 47%|████▋ | 424/900 [01:25<02:35, 3.06it/s] 47%|████▋ | 425/900 [01:26<02:36, 3.04it/s] 47%|████▋ | 426/900 [01:26<02:36, 3.03it/s] 47%|████▋ | 427/900 [01:26<02:36, 3.03it/s] 48%|████▊ | 428/900 [01:27<02:36, 3.02it/s] 48%|████▊ | 429/900 [01:27<02:37, 3.00it/s] 48%|████▊ | 430/900 [01:27<02:36, 3.00it/s] 48%|████▊ | 431/900 [01:28<02:36, 3.00it/s] 48%|████▊ | 432/900 [01:28<02:36, 3.00it/s] 48%|████▊ | 433/900 [01:28<02:35, 3.00it/s] 48%|████▊ | 434/900 [01:29<02:35, 2.99it/s] 48%|████▊ | 435/900 [01:29<02:35, 2.99it/s] 48%|████▊ | 436/900 [01:29<02:35, 2.98it/s] 49%|████▊ | 437/900 [01:30<02:34, 2.99it/s] 49%|████▊ | 438/900 [01:30<02:35, 2.97it/s] 49%|████▉ | 439/900 [01:30<02:35, 2.96it/s] 49%|████▉ | 440/900 [01:31<02:35, 2.96it/s] 49%|████▉ | 441/900 [01:31<02:35, 2.95it/s] 49%|████▉ | 442/900 [01:31<02:35, 2.95it/s] 49%|████▉ | 443/900 [01:32<02:35, 2.94it/s] 49%|████▉ | 444/900 [01:32<02:35, 2.93it/s] 49%|████▉ | 445/900 [01:32<02:35, 2.94it/s] 50%|████▉ | 446/900 [01:33<02:34, 2.93it/s] 50%|████▉ | 447/900 [01:33<02:35, 2.92it/s] 50%|████▉ | 448/900 [01:33<02:36, 2.89it/s] 50%|████▉ | 449/900 [01:34<02:38, 2.85it/s] 50%|█████ | 450/900 [01:34<02:39, 2.83it/s] 50%|█████ | 451/900 [01:35<02:39, 2.82it/s] 50%|█████ | 452/900 [01:35<02:37, 2.84it/s] 50%|█████ | 453/900 [01:35<02:36, 2.85it/s] 50%|█████ | 454/900 [01:36<02:36, 2.86it/s] 51%|█████ | 455/900 [01:36<02:35, 2.87it/s] 51%|█████ | 456/900 [01:36<02:36, 2.84it/s] 51%|█████ | 457/900 [01:37<02:35, 2.85it/s] 51%|█████ | 458/900 [01:37<02:35, 2.85it/s] 51%|█████ | 459/900 [01:37<02:34, 2.85it/s] 51%|█████ | 460/900 [01:38<02:34, 2.85it/s] 51%|█████ | 461/900 [01:38<02:34, 2.85it/s] 51%|█████▏ | 462/900 [01:38<02:33, 2.85it/s] 51%|█████▏ | 463/900 [01:39<02:33, 2.86it/s] 52%|█████▏ | 464/900 [01:39<02:32, 2.86it/s] 52%|█████▏ | 465/900 [01:39<02:33, 2.84it/s] 52%|█████▏ | 466/900 [01:40<02:35, 2.78it/s] 52%|█████▏ | 467/900 [01:40<02:35, 2.78it/s] 52%|█████▏ | 468/900 [01:41<02:34, 2.79it/s] 52%|█████▏ | 469/900 [01:41<02:43, 2.63it/s] 52%|█████▏ | 470/900 [01:41<02:42, 2.65it/s] 52%|█████▏ | 471/900 [01:42<02:39, 2.69it/s] 52%|█████▏ | 472/900 [01:42<02:41, 2.65it/s] 53%|█████▎ | 473/900 [01:42<02:40, 2.66it/s] 53%|█████▎ | 474/900 [01:43<02:43, 2.61it/s] 53%|█████▎ | 475/900 [01:43<02:40, 2.64it/s] 53%|█████▎ | 476/900 [01:44<02:44, 2.58it/s] 53%|█████▎ | 477/900 [01:44<02:41, 2.62it/s] 53%|█████▎ | 478/900 [01:44<02:43, 2.59it/s] 53%|█████▎ | 479/900 [01:45<02:44, 2.56it/s] 53%|█████▎ | 480/900 [01:45<02:41, 2.60it/s] 53%|█████▎ | 481/900 [01:46<02:46, 2.52it/s] 54%|█████▎ | 482/900 [01:46<02:47, 2.50it/s] 54%|█████▎ | 483/900 [01:46<02:42, 2.56it/s] 54%|█████▍ | 484/900 [01:47<02:44, 2.52it/s] 54%|█████▍ | 485/900 [01:47<02:42, 2.56it/s] 54%|█████▍ | 486/900 [01:48<02:39, 2.60it/s] 54%|█████▍ | 487/900 [01:48<02:36, 2.63it/s] 54%|█████▍ | 488/900 [01:48<02:37, 2.61it/s] 54%|█████▍ | 489/900 [01:49<02:35, 2.64it/s] 54%|█████▍ | 490/900 [01:49<02:34, 2.66it/s] 55%|█████▍ | 491/900 [01:49<02:33, 2.67it/s] 55%|█████▍ | 492/900 [01:50<02:32, 2.68it/s] 55%|█████▍ | 493/900 [01:50<02:35, 2.61it/s] 55%|█████▍ | 494/900 [01:51<02:34, 2.63it/s] 55%|█████▌ | 495/900 [01:51<02:33, 2.64it/s] 55%|█████▌ | 496/900 [01:51<02:32, 2.65it/s] 55%|█████▌ | 497/900 [01:52<02:31, 2.66it/s] 55%|█████▌ | 498/900 [01:52<02:30, 2.67it/s] 55%|█████▌ | 499/900 [01:52<02:30, 2.67it/s] 56%|█████▌ | 500/900 [01:53<02:30, 2.66it/s] 56%|█████▌ | 501/900 [01:53<02:29, 2.66it/s] 56%|█████▌ | 502/900 [01:54<02:29, 2.65it/s] 56%|█████▌ | 503/900 [01:54<02:29, 2.65it/s] 56%|█████▌ | 504/900 [01:54<02:29, 2.65it/s] 56%|█████▌ | 505/900 [01:55<02:28, 2.65it/s] 56%|█████▌ | 506/900 [01:55<02:28, 2.65it/s] 56%|█████▋ | 507/900 [01:55<02:28, 2.65it/s] 56%|█████▋ | 508/900 [01:56<02:28, 2.64it/s] 57%|█████▋ | 509/900 [01:56<02:28, 2.64it/s] 57%|█████▋ | 510/900 [01:57<02:27, 2.64it/s] 57%|█████▋ | 511/900 [01:57<02:28, 2.63it/s] 57%|█████▋ | 512/900 [01:57<02:27, 2.63it/s] 57%|█████▋ | 513/900 [01:58<02:27, 2.62it/s] 57%|█████▋ | 514/900 [01:58<02:27, 2.62it/s] 57%|█████▋ | 515/900 [01:58<02:27, 2.62it/s] 57%|█████▋ | 516/900 [01:59<02:27, 2.60it/s] 57%|█████▋ | 517/900 [01:59<02:27, 2.60it/s] 58%|█████▊ | 518/900 [02:00<02:27, 2.59it/s] 58%|█████▊ | 519/900 [02:00<02:27, 2.58it/s] 58%|█████▊ | 520/900 [02:00<02:27, 2.58it/s] 58%|█████▊ | 521/900 [02:01<02:26, 2.58it/s] 58%|█████▊ | 522/900 [02:01<02:26, 2.58it/s] 58%|█████▊ | 523/900 [02:02<02:26, 2.57it/s] 58%|█████▊ | 524/900 [02:02<02:26, 2.57it/s] 58%|█████▊ | 525/900 [02:02<02:26, 2.56it/s] 58%|█████▊ | 526/900 [02:03<02:26, 2.56it/s] 59%|█████▊ | 527/900 [02:03<02:25, 2.56it/s] 59%|█████▊ | 528/900 [02:04<02:26, 2.55it/s] 59%|█████▉ | 529/900 [02:04<02:25, 2.54it/s] 59%|█████▉ | 530/900 [02:04<02:25, 2.54it/s] 59%|█████▉ | 531/900 [02:05<02:25, 2.53it/s] 59%|█████▉ | 532/900 [02:05<02:25, 2.54it/s] 59%|█████▉ | 533/900 [02:06<02:25, 2.53it/s] 59%|█████▉ | 534/900 [02:06<02:24, 2.52it/s] 59%|█████▉ | 535/900 [02:06<02:24, 2.52it/s] 60%|█████▉ | 536/900 [02:07<02:24, 2.52it/s] 60%|█████▉ | 537/900 [02:07<02:24, 2.52it/s] 60%|█████▉ | 538/900 [02:08<02:23, 2.52it/s] 60%|█████▉ | 539/900 [02:08<02:23, 2.52it/s] 60%|██████ | 540/900 [02:08<02:23, 2.51it/s] 60%|██████ | 541/900 [02:09<02:22, 2.51it/s] 60%|██████ | 542/900 [02:09<02:22, 2.51it/s] 60%|██████ | 543/900 [02:10<02:22, 2.51it/s] 60%|██████ | 544/900 [02:10<02:22, 2.49it/s] 61%|██████ | 545/900 [02:10<02:23, 2.48it/s] 61%|██████ | 546/900 [02:11<02:23, 2.47it/s] 61%|██████ | 547/900 [02:11<02:25, 2.43it/s] 61%|██████ | 548/900 [02:12<02:29, 2.36it/s] 61%|██████ | 549/900 [02:12<02:27, 2.38it/s] 61%|██████ | 550/900 [02:12<02:25, 2.40it/s] 61%|██████ | 551/900 [02:13<02:25, 2.41it/s] 61%|██████▏ | 552/900 [02:13<02:24, 2.41it/s] 61%|██████▏ | 553/900 [02:14<02:23, 2.41it/s] 62%|██████▏ | 554/900 [02:14<02:23, 2.41it/s] 62%|██████▏ | 555/900 [02:15<02:22, 2.41it/s] 62%|██████▏ | 556/900 [02:15<02:22, 2.41it/s] 62%|██████▏ | 557/900 [02:15<02:22, 2.41it/s] 62%|██████▏ | 558/900 [02:16<02:22, 2.40it/s] 62%|██████▏ | 559/900 [02:16<02:22, 2.40it/s] 62%|██████▏ | 560/900 [02:17<02:22, 2.39it/s] 62%|██████▏ | 561/900 [02:17<02:21, 2.39it/s] 62%|██████▏ | 562/900 [02:17<02:21, 2.39it/s] 63%|██████▎ | 563/900 [02:18<02:21, 2.39it/s] 63%|██████▎ | 564/900 [02:18<02:20, 2.39it/s] 63%|██████▎ | 565/900 [02:19<02:20, 2.39it/s] 63%|██████▎ | 566/900 [02:19<02:19, 2.39it/s] 63%|██████▎ | 567/900 [02:20<02:19, 2.39it/s] 63%|██████▎ | 568/900 [02:20<02:19, 2.37it/s] 63%|██████▎ | 569/900 [02:20<02:19, 2.37it/s] 63%|██████▎ | 570/900 [02:21<02:19, 2.37it/s] 63%|██████▎ | 571/900 [02:21<02:19, 2.36it/s] 64%|██████▎ | 572/900 [02:22<02:19, 2.36it/s] 64%|██████▎ | 573/900 [02:22<02:19, 2.35it/s] 64%|██████▍ | 574/900 [02:23<02:22, 2.29it/s] 64%|██████▍ | 575/900 [02:23<02:21, 2.29it/s] 64%|██████▍ | 576/900 [02:23<02:20, 2.31it/s] 64%|██████▍ | 577/900 [02:24<02:18, 2.33it/s] 64%|██████▍ | 578/900 [02:24<02:18, 2.33it/s] 64%|██████▍ | 579/900 [02:25<02:18, 2.31it/s] 64%|██████▍ | 580/900 [02:25<02:18, 2.31it/s] 65%|██████▍ | 581/900 [02:26<02:17, 2.31it/s] 65%|██████▍ | 582/900 [02:26<02:17, 2.32it/s] 65%|██████▍ | 583/900 [02:26<02:16, 2.32it/s] 65%|██████▍ | 584/900 [02:27<02:16, 2.31it/s] 65%|██████▌ | 585/900 [02:27<02:16, 2.31it/s] 65%|██████▌ | 586/900 [02:28<02:17, 2.29it/s] 65%|██████▌ | 587/900 [02:28<02:16, 2.29it/s] 65%|██████▌ | 588/900 [02:29<02:15, 2.30it/s] 65%|██████▌ | 589/900 [02:29<02:15, 2.30it/s] 66%|██████▌ | 590/900 [02:29<02:15, 2.29it/s] 66%|██████▌ | 591/900 [02:30<02:14, 2.29it/s] 66%|██████▌ | 592/900 [02:30<02:14, 2.29it/s] 66%|██████▌ | 593/900 [02:31<02:15, 2.26it/s] 66%|██████▌ | 594/900 [02:31<02:14, 2.27it/s] 66%|██████▌ | 595/900 [02:32<02:14, 2.27it/s] 66%|██████▌ | 596/900 [02:32<02:14, 2.27it/s] 66%|██████▋ | 597/900 [02:33<02:15, 2.23it/s] 66%|██████▋ | 598/900 [02:33<02:14, 2.24it/s] 67%|██████▋ | 599/900 [02:33<02:13, 2.25it/s] 67%|██████▋ | 600/900 [02:34<02:15, 2.22it/s] 67%|██████▋ | 601/900 [02:34<02:13, 2.24it/s] 67%|██████▋ | 602/900 [02:35<02:12, 2.24it/s] 67%|██████▋ | 603/900 [02:35<02:16, 2.18it/s] 67%|██████▋ | 604/900 [02:36<02:14, 2.20it/s] 67%|██████▋ | 605/900 [02:36<02:15, 2.18it/s] 67%|██████▋ | 606/900 [02:37<02:17, 2.14it/s] 67%|██████▋ | 607/900 [02:37<02:16, 2.15it/s] 68%|██████▊ | 608/900 [02:38<02:13, 2.18it/s] 68%|██████▊ | 609/900 [02:38<02:11, 2.21it/s] 68%|██████▊ | 610/900 [02:39<02:12, 2.19it/s] 68%|██████▊ | 611/900 [02:39<02:11, 2.20it/s] 68%|██████▊ | 612/900 [02:40<02:18, 2.07it/s] 68%|██████▊ | 613/900 [02:40<02:18, 2.07it/s] 68%|██████▊ | 614/900 [02:40<02:18, 2.07it/s] 68%|██████▊ | 615/900 [02:41<02:14, 2.11it/s] 68%|██████▊ | 616/900 [02:41<02:14, 2.12it/s] 69%|██████▊ | 617/900 [02:42<02:12, 2.14it/s] 69%|██████▊ | 618/900 [02:42<02:10, 2.16it/s] 69%|██████▉ | 619/900 [02:43<02:09, 2.17it/s] 69%|██████▉ | 620/900 [02:43<02:09, 2.17it/s] 69%|██████▉ | 621/900 [02:44<02:08, 2.18it/s] 69%|██████▉ | 622/900 [02:44<02:07, 2.18it/s] 69%|██████▉ | 623/900 [02:45<02:07, 2.17it/s] 69%|██████▉ | 624/900 [02:45<02:06, 2.18it/s] 69%|██████▉ | 625/900 [02:46<02:05, 2.19it/s] 70%|██████▉ | 626/900 [02:46<02:05, 2.18it/s] 70%|██████▉ | 627/900 [02:46<02:04, 2.18it/s] 70%|██████▉ | 628/900 [02:47<02:04, 2.19it/s] 70%|██████▉ | 629/900 [02:47<02:03, 2.19it/s] 70%|███████ | 630/900 [02:48<02:04, 2.17it/s] 70%|███████ | 631/900 [02:48<02:03, 2.18it/s] 70%|███████ | 632/900 [02:49<02:03, 2.18it/s] 70%|███████ | 633/900 [02:49<02:02, 2.18it/s] 70%|███████ | 634/900 [02:50<02:01, 2.18it/s] 71%|███████ | 635/900 [02:50<02:01, 2.18it/s] 71%|███████ | 636/900 [02:51<02:01, 2.17it/s] 71%|███████ | 637/900 [02:51<02:01, 2.17it/s] 71%|███████ | 638/900 [02:52<02:00, 2.17it/s] 71%|███████ | 639/900 [02:52<02:00, 2.17it/s] 71%|███████ | 640/900 [02:52<02:00, 2.16it/s] 71%|███████ | 641/900 [02:53<02:00, 2.16it/s] 71%|███████▏ | 642/900 [02:53<02:00, 2.15it/s] 71%|███████▏ | 643/900 [02:54<02:00, 2.14it/s] 72%|███████▏ | 644/900 [02:54<01:59, 2.14it/s] 72%|███████▏ | 645/900 [02:55<01:59, 2.14it/s] 72%|███████▏ | 646/900 [02:55<01:58, 2.14it/s] 72%|███████▏ | 647/900 [02:56<01:58, 2.14it/s] 72%|███████▏ | 648/900 [02:56<01:58, 2.13it/s] 72%|███████▏ | 649/900 [02:57<01:57, 2.14it/s] 72%|███████▏ | 650/900 [02:57<01:57, 2.13it/s] 72%|███████▏ | 651/900 [02:58<01:56, 2.13it/s] 72%|███████▏ | 652/900 [02:58<01:56, 2.13it/s] 73%|███████▎ | 653/900 [02:59<01:56, 2.13it/s] 73%|███████▎ | 654/900 [02:59<01:56, 2.12it/s] 73%|███████▎ | 655/900 [02:59<01:55, 2.12it/s] 73%|███████▎ | 656/900 [03:00<01:55, 2.11it/s] 73%|███████▎ | 657/900 [03:00<01:54, 2.11it/s] 73%|███████▎ | 658/900 [03:01<01:54, 2.11it/s] 73%|███████▎ | 659/900 [03:01<01:54, 2.11it/s] 73%|███████▎ | 660/900 [03:02<01:53, 2.11it/s] 73%|███████▎ | 661/900 [03:02<01:53, 2.11it/s] 74%|███████▎ | 662/900 [03:03<01:53, 2.10it/s] 74%|███████▎ | 663/900 [03:03<01:52, 2.10it/s] 74%|███████▍ | 664/900 [03:04<01:52, 2.10it/s] 74%|███████▍ | 665/900 [03:04<01:52, 2.10it/s] 74%|███████▍ | 666/900 [03:05<01:52, 2.09it/s] 74%|███████▍ | 667/900 [03:05<01:51, 2.08it/s] 74%|███████▍ | 668/900 [03:06<01:51, 2.08it/s] 74%|███████▍ | 669/900 [03:06<01:51, 2.07it/s] 74%|███████▍ | 670/900 [03:07<01:51, 2.07it/s] 75%|███████▍ | 671/900 [03:07<01:50, 2.07it/s] 75%|███████▍ | 672/900 [03:08<01:50, 2.07it/s] 75%|███████▍ | 673/900 [03:08<01:49, 2.07it/s] 75%|███████▍ | 674/900 [03:09<01:49, 2.06it/s] 75%|███████▌ | 675/900 [03:09<01:49, 2.06it/s] 75%|███████▌ | 676/900 [03:10<01:49, 2.05it/s] 75%|███████▌ | 677/900 [03:10<01:48, 2.05it/s] 75%|███████▌ | 678/900 [03:11<01:48, 2.05it/s] 75%|███████▌ | 679/900 [03:11<01:47, 2.05it/s] 76%|███████▌ | 680/900 [03:12<01:47, 2.05it/s] 76%|███████▌ | 681/900 [03:12<01:46, 2.05it/s] 76%|███████▌ | 682/900 [03:13<01:46, 2.04it/s] 76%|███████▌ | 683/900 [03:13<01:46, 2.04it/s] 76%|███████▌ | 684/900 [03:13<01:45, 2.04it/s] 76%|███████▌ | 685/900 [03:14<01:45, 2.04it/s] 76%|███████▌ | 686/900 [03:14<01:45, 2.03it/s] 76%|███████▋ | 687/900 [03:15<01:44, 2.04it/s] 76%|███████▋ | 688/900 [03:15<01:44, 2.04it/s] 77%|███████▋ | 689/900 [03:16<01:44, 2.03it/s] 77%|███████▋ | 690/900 [03:16<01:43, 2.03it/s] 77%|███████▋ | 691/900 [03:17<01:43, 2.03it/s] 77%|███████▋ | 692/900 [03:17<01:43, 2.02it/s] 77%|███████▋ | 693/900 [03:18<01:43, 2.01it/s] 77%|███████▋ | 694/900 [03:18<01:42, 2.01it/s] 77%|███████▋ | 695/900 [03:19<01:42, 2.00it/s] 77%|███████▋ | 696/900 [03:19<01:41, 2.00it/s] 77%|███████▋ | 697/900 [03:20<01:41, 2.00it/s] 78%|███████▊ | 698/900 [03:20<01:41, 2.00it/s] 78%|███████▊ | 699/900 [03:21<01:40, 2.00it/s] 78%|███████▊ | 700/900 [03:21<01:40, 2.00it/s] 78%|███████▊ | 701/900 [03:22<01:39, 1.99it/s] 78%|███████▊ | 702/900 [03:22<01:39, 1.99it/s] 78%|███████▊ | 703/900 [03:23<01:38, 1.99it/s] 78%|███████▊ | 704/900 [03:23<01:38, 1.99it/s] 78%|███████▊ | 705/900 [03:24<01:38, 1.99it/s] 78%|███████▊ | 706/900 [03:24<01:38, 1.98it/s] 79%|███████▊ | 707/900 [03:25<01:37, 1.98it/s] 79%|███████▊ | 708/900 [03:25<01:37, 1.97it/s] 79%|███████▉ | 709/900 [03:26<01:36, 1.97it/s] 79%|███████▉ | 710/900 [03:27<01:36, 1.97it/s] 79%|███████▉ | 711/900 [03:27<01:35, 1.97it/s] 79%|███████▉ | 712/900 [03:28<01:35, 1.97it/s] 79%|███████▉ | 713/900 [03:28<01:34, 1.97it/s] 79%|███████▉ | 714/900 [03:29<01:34, 1.97it/s] 79%|███████▉ | 715/900 [03:29<01:34, 1.96it/s] 80%|███████▉ | 716/900 [03:30<01:33, 1.96it/s] 80%|███████▉ | 717/900 [03:30<01:33, 1.96it/s] 80%|███████▉ | 718/900 [03:31<01:33, 1.95it/s] 80%|███████▉ | 719/900 [03:31<01:32, 1.95it/s] 80%|████████ | 720/900 [03:32<01:32, 1.94it/s] 80%|████████ | 721/900 [03:32<01:32, 1.94it/s] 80%|████████ | 722/900 [03:33<01:31, 1.95it/s] 80%|████████ | 723/900 [03:33<01:30, 1.95it/s] 80%|████████ | 724/900 [03:34<01:30, 1.94it/s] 81%|████████ | 725/900 [03:34<01:30, 1.93it/s] 81%|████████ | 726/900 [03:35<01:29, 1.93it/s] 81%|████████ | 727/900 [03:35<01:29, 1.94it/s] 81%|████████ | 728/900 [03:36<01:28, 1.94it/s] 81%|████████ | 729/900 [03:36<01:28, 1.93it/s] 81%|████████ | 730/900 [03:37<01:28, 1.93it/s] 81%|████████ | 731/900 [03:37<01:27, 1.92it/s] 81%|████████▏ | 732/900 [03:38<01:27, 1.92it/s] 81%|████████▏ | 733/900 [03:38<01:27, 1.91it/s] 82%|████████▏ | 734/900 [03:39<01:27, 1.90it/s] 82%|████████▏ | 735/900 [03:39<01:26, 1.90it/s] 82%|████████▏ | 736/900 [03:40<01:26, 1.90it/s] 82%|████████▏ | 737/900 [03:40<01:25, 1.91it/s] 82%|████████▏ | 738/900 [03:41<01:25, 1.90it/s] 82%|████████▏ | 739/900 [03:42<01:24, 1.90it/s] 82%|████████▏ | 740/900 [03:42<01:24, 1.90it/s] 82%|████████▏ | 741/900 [03:43<01:23, 1.90it/s] 82%|████████▏ | 742/900 [03:43<01:23, 1.90it/s] 83%|████████▎ | 743/900 [03:44<01:22, 1.90it/s] 83%|████████▎ | 744/900 [03:44<01:22, 1.90it/s] 83%|████████▎ | 745/900 [03:45<01:21, 1.90it/s] 83%|████████▎ | 746/900 [03:45<01:21, 1.89it/s] 83%|████████▎ | 747/900 [03:46<01:21, 1.89it/s] 83%|████████▎ | 748/900 [03:46<01:21, 1.87it/s] 83%|████████▎ | 749/900 [03:47<01:20, 1.87it/s] 83%|████████▎ | 750/900 [03:47<01:20, 1.87it/s] 83%|████████▎ | 751/900 [03:48<01:19, 1.87it/s] 84%|████████▎ | 752/900 [03:48<01:19, 1.87it/s] 84%|████████▎ | 753/900 [03:49<01:18, 1.87it/s] 84%|████████▍ | 754/900 [03:50<01:18, 1.87it/s] 84%|████████▍ | 755/900 [03:50<01:17, 1.86it/s] 84%|████████▍ | 756/900 [03:51<01:17, 1.86it/s] 84%|████████▍ | 757/900 [03:51<01:16, 1.86it/s] 84%|████████▍ | 758/900 [03:52<01:16, 1.86it/s] 84%|████████▍ | 759/900 [03:52<01:15, 1.86it/s] 84%|████████▍ | 760/900 [03:53<01:15, 1.86it/s] 85%|████████▍ | 761/900 [03:53<01:14, 1.86it/s] 85%|████████▍ | 762/900 [03:54<01:14, 1.85it/s] 85%|████████▍ | 763/900 [03:54<01:13, 1.85it/s] 85%|████████▍ | 764/900 [03:55<01:13, 1.85it/s] 85%|████████▌ | 765/900 [03:55<01:13, 1.83it/s] 85%|████████▌ | 766/900 [03:56<01:12, 1.84it/s] 85%|████████▌ | 767/900 [03:57<01:12, 1.84it/s] 85%|████████▌ | 768/900 [03:57<01:11, 1.84it/s] 85%|████████▌ | 769/900 [03:58<01:12, 1.81it/s] 86%|████████▌ | 770/900 [03:58<01:11, 1.82it/s] 86%|████████▌ | 771/900 [03:59<01:11, 1.81it/s] 86%|████████▌ | 772/900 [03:59<01:10, 1.81it/s] 86%|████████▌ | 773/900 [04:00<01:10, 1.81it/s] 86%|████████▌ | 774/900 [04:00<01:09, 1.81it/s] 86%|████████▌ | 775/900 [04:01<01:08, 1.81it/s] 86%|████████▌ | 776/900 [04:02<01:08, 1.81it/s] 86%|████████▋ | 777/900 [04:02<01:07, 1.81it/s] 86%|████████▋ | 778/900 [04:03<01:07, 1.81it/s] 87%|████████▋ | 779/900 [04:03<01:06, 1.81it/s] 87%|████████▋ | 780/900 [04:04<01:06, 1.80it/s] 87%|████████▋ | 781/900 [04:04<01:05, 1.81it/s] 87%|████████▋ | 782/900 [04:05<01:05, 1.80it/s] 87%|████████▋ | 783/900 [04:05<01:04, 1.80it/s] 87%|████████▋ | 784/900 [04:06<01:04, 1.80it/s] 87%|████████▋ | 785/900 [04:07<01:03, 1.81it/s] 87%|████████▋ | 786/900 [04:07<01:03, 1.80it/s] 87%|████████▋ | 787/900 [04:08<01:02, 1.81it/s] 88%|████████▊ | 788/900 [04:08<01:02, 1.80it/s] 88%|████████▊ | 789/900 [04:09<01:01, 1.80it/s] 88%|████████▊ | 790/900 [04:09<01:01, 1.80it/s] 88%|████████▊ | 791/900 [04:10<01:00, 1.79it/s] 88%|████████▊ | 792/900 [04:10<01:00, 1.79it/s] 88%|████████▊ | 793/900 [04:11<00:59, 1.79it/s] 88%|████████▊ | 794/900 [04:12<00:59, 1.79it/s] 88%|████████▊ | 795/900 [04:12<00:58, 1.79it/s] 88%|████████▊ | 796/900 [04:13<00:58, 1.79it/s] 89%|████████▊ | 797/900 [04:13<00:57, 1.79it/s] 89%|████████▊ | 798/900 [04:14<00:57, 1.79it/s] 89%|████████▉ | 799/900 [04:14<00:56, 1.79it/s] 89%|████████▉ | 800/900 [04:15<00:56, 1.78it/s] 89%|████████▉ | 801/900 [04:15<00:55, 1.77it/s] 89%|████████▉ | 802/900 [04:16<00:55, 1.77it/s] 89%|████████▉ | 803/900 [04:17<00:54, 1.76it/s] 89%|████████▉ | 804/900 [04:17<00:54, 1.76it/s] 89%|████████▉ | 805/900 [04:18<00:53, 1.76it/s] 90%|████████▉ | 806/900 [04:18<00:53, 1.76it/s] 90%|████████▉ | 807/900 [04:19<00:52, 1.76it/s] 90%|████████▉ | 808/900 [04:19<00:52, 1.76it/s] 90%|████████▉ | 809/900 [04:20<00:51, 1.75it/s] 90%|█████████ | 810/900 [04:21<00:51, 1.75it/s] 90%|█████████ | 811/900 [04:21<00:50, 1.75it/s] 90%|█████████ | 812/900 [04:22<00:50, 1.76it/s] 90%|█████████ | 813/900 [04:22<00:49, 1.75it/s] 90%|█████████ | 814/900 [04:23<00:49, 1.75it/s] 91%|█████████ | 815/900 [04:23<00:48, 1.75it/s] 91%|█████████ | 816/900 [04:24<00:48, 1.75it/s] 91%|█████████ | 817/900 [04:25<00:47, 1.74it/s] 91%|█████████ | 818/900 [04:25<00:46, 1.74it/s] 91%|█████████ | 819/900 [04:26<00:46, 1.74it/s] 91%|█████████ | 820/900 [04:26<00:45, 1.74it/s] 91%|█████████ | 821/900 [04:27<00:45, 1.73it/s] 91%|█████████▏| 822/900 [04:27<00:45, 1.73it/s] 91%|█████████▏| 823/900 [04:28<00:44, 1.73it/s] 92%|█████████▏| 824/900 [04:29<00:43, 1.73it/s] 92%|█████████▏| 825/900 [04:29<00:43, 1.73it/s] 92%|█████████▏| 826/900 [04:30<00:42, 1.73it/s] 92%|█████████▏| 827/900 [04:30<00:42, 1.72it/s] 92%|█████████▏| 828/900 [04:31<00:41, 1.72it/s] 92%|█████████▏| 829/900 [04:32<00:41, 1.72it/s] 92%|█████████▏| 830/900 [04:32<00:40, 1.72it/s] 92%|█████████▏| 831/900 [04:33<00:40, 1.72it/s] 92%|█████████▏| 832/900 [04:33<00:39, 1.72it/s] 93%|█████████▎| 833/900 [04:34<00:39, 1.72it/s] 93%|█████████▎| 834/900 [04:34<00:38, 1.71it/s] 93%|█████████▎| 835/900 [04:35<00:37, 1.71it/s] 93%|█████████▎| 836/900 [04:36<00:37, 1.71it/s] 93%|█████████▎| 837/900 [04:36<00:36, 1.71it/s] 93%|█████████▎| 838/900 [04:37<00:36, 1.71it/s] 93%|█████████▎| 839/900 [04:37<00:35, 1.70it/s] 93%|█████████▎| 840/900 [04:38<00:35, 1.71it/s] 93%|█████████▎| 841/900 [04:39<00:34, 1.71it/s] 94%|█████████▎| 842/900 [04:39<00:33, 1.71it/s] 94%|█████████▎| 843/900 [04:40<00:33, 1.71it/s] 94%|█████████▍| 844/900 [04:40<00:32, 1.70it/s] 94%|█████████▍| 845/900 [04:41<00:32, 1.70it/s] 94%|█████████▍| 846/900 [04:41<00:31, 1.70it/s] 94%|█████████▍| 847/900 [04:42<00:31, 1.70it/s] 94%|█████████▍| 848/900 [04:43<00:30, 1.70it/s] 94%|█████████▍| 849/900 [04:43<00:30, 1.70it/s] 94%|█████████▍| 850/900 [04:44<00:29, 1.69it/s] 95%|█████████▍| 851/900 [04:44<00:29, 1.69it/s] 95%|█████████▍| 852/900 [04:45<00:28, 1.68it/s] 95%|█████████▍| 853/900 [04:46<00:28, 1.67it/s] 95%|█████████▍| 854/900 [04:46<00:27, 1.66it/s] 95%|█████████▌| 855/900 [04:47<00:27, 1.67it/s] 95%|█████████▌| 856/900 [04:47<00:26, 1.66it/s] 95%|█████████▌| 857/900 [04:48<00:25, 1.67it/s] 95%|█████████▌| 858/900 [04:49<00:25, 1.67it/s] 95%|█████████▌| 859/900 [04:49<00:24, 1.67it/s] 96%|█████████▌| 860/900 [04:50<00:23, 1.67it/s] 96%|█████████▌| 861/900 [04:50<00:23, 1.67it/s] 96%|█████████▌| 862/900 [04:51<00:22, 1.67it/s] 96%|█████████▌| 863/900 [04:52<00:22, 1.67it/s] 96%|█████████▌| 864/900 [04:52<00:21, 1.66it/s] 96%|█████████▌| 865/900 [04:53<00:21, 1.66it/s] 96%|█████████▌| 866/900 [04:53<00:20, 1.65it/s] 96%|█████████▋| 867/900 [04:54<00:19, 1.66it/s] 96%|█████████▋| 868/900 [04:55<00:19, 1.65it/s] 97%|█████████▋| 869/900 [04:55<00:18, 1.65it/s] 97%|█████████▋| 870/900 [04:56<00:18, 1.65it/s] 97%|█████████▋| 871/900 [04:57<00:17, 1.64it/s] 97%|█████████▋| 872/900 [04:57<00:17, 1.65it/s] 97%|█████████▋| 873/900 [04:58<00:16, 1.64it/s] 97%|█████████▋| 874/900 [04:58<00:15, 1.64it/s] 97%|█████████▋| 875/900 [04:59<00:15, 1.63it/s] 97%|█████████▋| 876/900 [05:00<00:14, 1.64it/s] 97%|█████████▋| 877/900 [05:00<00:14, 1.63it/s] 98%|█████████▊| 878/900 [05:01<00:13, 1.63it/s] 98%|█████████▊| 879/900 [05:01<00:12, 1.63it/s] 98%|█████████▊| 880/900 [05:02<00:12, 1.63it/s] 98%|█████████▊| 881/900 [05:03<00:11, 1.63it/s] 98%|█████████▊| 882/900 [05:03<00:11, 1.62it/s] 98%|█████████▊| 883/900 [05:04<00:10, 1.62it/s] 98%|█████████▊| 884/900 [05:05<00:09, 1.62it/s] 98%|█████████▊| 885/900 [05:05<00:09, 1.62it/s] 98%|█████████▊| 886/900 [05:06<00:08, 1.62it/s] 99%|█████████▊| 887/900 [05:06<00:08, 1.62it/s] 99%|█████████▊| 888/900 [05:07<00:07, 1.62it/s] 99%|█████████▉| 889/900 [05:08<00:06, 1.62it/s] 99%|█████████▉| 890/900 [05:08<00:06, 1.62it/s] 99%|█████████▉| 891/900 [05:09<00:05, 1.61it/s] 99%|█████████▉| 892/900 [05:09<00:04, 1.61it/s] 99%|█████████▉| 893/900 [05:10<00:04, 1.61it/s] 99%|█████████▉| 894/900 [05:11<00:03, 1.61it/s] 99%|█████████▉| 895/900 [05:11<00:03, 1.60it/s]100%|█████████▉| 896/900 [05:12<00:02, 1.61it/s]100%|█████████▉| 897/900 [05:13<00:01, 1.60it/s]100%|█████████▉| 898/900 [05:13<00:01, 1.60it/s]100%|█████████▉| 899/900 [05:14<00:00, 1.60it/s]100%|██████████| 900/900 [05:14<00:00, 1.59it/s]100%|██████████| 900/900 [05:14<00:00, 2.86it/s]
plt.figure(figsize=(10, 4))
plt.plot(M_values, var_bs_values, marker='o', color='red')
plt.xlabel('Nombre de simulations')
plt.ylabel('VaR bootstrap')
plt.title("Variation de la VaR bootstrap en fonction du nombre de simulations")Text(0.5, 1.0, 'Variation de la VaR bootstrap en fonction du nombre de simulations')

Pour la taille de l’echantillon bootstrap, nous allons prendre M=8000 étant donné que la courbe semble se stabiliser à partir de cette valeur. Avec ce choix, la VaR estimé est de 4.11%% avec un intervalle de confiance à 5% de [4.05%, 4.09%]. De plus, en ce qui concerne la VaR historique, nous constatons que l’estimation est contenu dans l’intervalle de confiance.
M=8000
var_bs_train, lower_ic,upper_ic = bootstrap_var(data_train, alpha=alpha, M=M)
print(f"La VaR bootstrap pour h=1j et alpha=0.99 est : {var_bs_train:.4%}")
print(f"L'intervalle de confiance est : [{lower_ic:.4%}, {upper_ic:.4%}]")La VaR bootstrap pour h=1j et alpha=0.99 est : 4.1065%
L'intervalle de confiance est : [4.0536%, 4.0939%]
II.2.3. Backtest
Pour l’exercice de backtest, il s’agit de : 1. Déterminer si la proportion \(p\) de violations de la VaR est cohérente avec le niveau de confiance, i.e. égale à \(1-\alpha\). Cela permet de vérifier si la mesure de risque est bien calibrée. Pour cela, nous pouvons avoir recours à un test de proportion ou un test de ratio de vraisemblance.
**Unconditional coverage test** :
Soit I la variable indicatrice de violation de la VaR, i.e. $I=1$ si la perte est supérieure à la VaR, et $I=0$ sinon. La proportion de violations de la VaR est donnée par :
$$p = \frac{1}{n} \sum_{i=1}^{n} I_i = \frac{Z}{n}$$
Sous H0, i.e. p=1-$\alpha$, Z $\sim$ Binomiale(n, 1-$\alpha$). En supposant que n est suffisamment grand, on peut approximer Z par une loi normale. Ainsi donc :
$$\frac{Z - n (1-\alpha)}{\sqrt{\alpha (1-\alpha) n}} \sim \mathcal{N}(n(1-\alpha), n\alpha(1-\alpha))$$
Sous cette hypothèse asymptotique, on peut calculer la statistique du ratio de vraisemblance suivant :
$$LR = -2 ln \left( \frac{L(H1)}{L(H0)} \right) =-2 ln \left( 1- (1-\alpha))^{n-e}(1-\alpha)^e \right) + 2 ln \left( (1-\frac{e}{n})^{n-e} (\frac{e}{n})^e \right) \sim \chi^2(1)$$
où e est le nombre de violations de la VaR. On rejette H0 si LR > $\chi^2(1-\alpha)$.
**Test de proportion** :
$$
H_0 : p = p_0 = 1-\alpha \\ H_1 : p > 1-\alpha
$$
On peut également utiliser un test binomial pour tester si la proportion de violations de la VaR est égale à $1-\alpha$. On peut calculer la statistique du test suivant :
$$Z = \frac{p - p_0}{\sqrt{p_0 (1-p_0) / n}} \sim \mathcal{N}(0,1)$$
On rejette H0 si Z > $p_0+ \phi^{-1}(1-\alpha) \sqrt{p_0 (1-p_0)/n}$, où $\phi$ est la quantile de la loi normale standard.
Déterminer si, lorsqu’il y en a, les violations de VaR à deux différents jours sont indépendantes. Cela permet si la mesure de risque est capable de réagir aux chocs de marché affectant la volatilité des rendements. Pour cela, nous utilisons un conditional coverage test.
Conditional coverage test : y revenir
import scipy.stats as stats
# Objectif : implémenter une fonction calculant le nombre d'exception sur l'échantillon test
def exceptions(data, var):
"""
Calcul du nombre d'exception
data : les rendements logarithmiques
var : la VaR
"""
return np.sum(data < -var)
# Objectif : test de proportion binomiale
def binomial_test(n, p, p0 = 0.01, alpha=0.05):
"""
Test de proportion binomiale
H0 : p = p0
H1 : p > p0
n : le nombre d'essais
p : la proportion
alpha : le niveau de confiance
"""
z = (p - p0) / np.sqrt(p0 * (1 - p0) / n)
#reject_zone = p0 + stats.norm.ppf(1 - alpha) * np.sqrt(p0 * (1 - p0) / n)
p_value = 1 - stats.norm.cdf(z)
reject = p_value < alpha
# Calcul des IC
lower = p - stats.norm.ppf(1 - alpha) * np.sqrt(p * (1 - p) / n)
upper = p + stats.norm.ppf(1 - alpha) * np.sqrt(p * (1 - p) / n)
return p_value, reject, lower, upper
# Unconditionnal coverage test ==> to do.# Backtest de la VaR historique
exceptions_test = exceptions(data_test, var_hist_train)
print(f"Le nombre d'exceptions sur l'échantillon de test est : {exceptions_test}")
print("="*80)
n = len(data_test)
p = exceptions_test / n
p_value, reject, lower,upper = binomial_test(n, p)
print(f"H0 : le nombre d'exceptions est inférieur ou égale à {1-alpha:.2%}")
print(f"IC : [{lower:.2%},{upper:.2%}]")
print(f"La p-value du test de proportion binomiale est : {p_value:.4f}")
print(f"Rejet de l'hypothèse nulle : {reject}")
print("="*80)Le nombre d'exceptions sur l'échantillon de test est : 0
================================================================================
H0 : le nombre d'exceptions est inférieur ou égale à 1.00%
IC : [0.00%,0.00%]
La p-value du test de proportion binomiale est : 0.9925
Rejet de l'hypothèse nulle : False
================================================================================
II.3. VaR paramétrique
II.3.1. Validation ex-ante
Visuellement, les données ne semblent pas suivre une loi normale. En effet, les quantiles théoriques d’une loi normale ne collent pas avec les quantiles empiriques des rendements. Cela peut être dû à la présence de queues épaisses observables sur l’estimation de la densité des rendements sur l’échantillon d’apprentissage, de pics, de clusters de volatilité que nous avons observées plus haut. De plus, le skewness est négatif ce qui indique une asymétrie négative des rendements. Enfin, le kurtosis est supérieur à 3, ce qui indique une distribution leptokurtique des rendements.
Nous allons tout de même implémenter une VaR gaussienne pour voir comment elle se comporte dans le backtest.
# Test visuel d'adéquation de la loi normale
# Créer un Q-Q plot
fig, ax = plt.subplots(figsize=(10, 6))
stats.probplot(data_train, dist="norm", plot=ax)
# Personnalisation du graphique
ax.set_title("Q-Q Plot (Normal Distribution)")
ax.set_xlabel("Theoretical Quantiles")
ax.set_ylabel("Sample Quantiles")
# Afficher le graphique
plt.show()
# Densité de l'echantillon train et l'échantillon de test
plt.figure(figsize=(10, 4))
data_train.plot(kind='kde', label='Train', color='red')
plt.legend(loc='upper left')
plt.title("Densité de l'échantillon d'entrainement")
plt.show()
# Skewness et kurtosis
print("="*80)
print("Skewness de l'échantillon d'entrainement : ", data_train.skew())
print("Kurtosis de l'échantillon d'entrainement : ", data_train.kurt())
print("="*80)================================================================================
Skewness de l'échantillon d'entrainement : -0.2981820421484688
Kurtosis de l'échantillon d'entrainement : 7.353960005618779
================================================================================
from scipy.stats import kstest
# Test de Kolmogorov-Smirnov
ks_stat, ks_p_value = kstest(data_train, 'norm')
print("="*80)
print("H0 : Les données suivent une loi normale")
print(f"Statistique de test : {ks_stat:.4f}")
print(f"P-value : {ks_p_value:.4f}")
print("="*80)================================================================================
H0 : Les données suivent une loi normale
Statistique de test : 0.4775
P-value : 0.0000
================================================================================
II.3.2. Implémentation de la VaR
a. Méthode scaling
# Objectif : écrire une fonction qui calcule la VaR gaussienne
def gaussian_var(data, alpha):
"""
Calcul de la VaR gaussienne
data : les rendements logarithmiques
alpha : le niveau de confiance
"""
from scipy.stats import norm
mu = np.mean(data)
sigma = np.std(data)
return -(mu + sigma * norm.ppf(1 - alpha))var_gauss_train = gaussian_var(data_train, alpha=alpha)
print(f"La VaR gaussienne pour h=1j et alpha={alpha} est : {var_gauss_train:.4%}")
print(f"La VaR historique pour h=10j et alpha={alpha} est : {np.sqrt(10)*var_gauss_train:.4%}")La VaR gaussienne pour h=1j et alpha=0.99 est : 3.2302%
La VaR historique pour h=10j et alpha=0.99 est : 10.2148%
b. Méthode de diffusion d’un actif
Pour calculer la VaR gaussienne à 10 jours par méthode de diffusion d’un actif, nous allons suivre les étapes suivantes :
L’évolution du prix d’un actif suit un processus de type mouvement brownien géométrique : \[ dS_t = \mu S_t dt + \sigma S_t dW_t <=> S_t = S_{t-1} e^{(\mu - \frac{1}{2} \sigma^2) + \sigma W_t} \] où $ S_t$ est le prix de l’actif à l’instant$ t$, $ $ est le rendement moyen estimé (drift), $ $ est la volatilité du rendement, $ dW_t$ est un mouvement brownien standard.
On peut de ce fait calculer plusieurs trajectoires de rendements de \(S_0\) et \(S_{10}\), puis calculer la VaR à partir de la série des rendements $ r_{10j} = (S_{10} / S_{0}) $ obtenus avec ces trajectoires.
En utilisant la méthode de scaling et la méthode de diffusion, nous obtenons sensiblement la même VaR.
import numpy as np
mu = np.mean(data_train)
sigma = np.std(data_train)
return_sim = []
T = 10
M = 1000
S0 = train['Close'].iloc[-1]
for i in range(M):
S = np.zeros(T+1)
S[0] = S0
for t in range(1,T+1):
Wt = np.random.normal()
S[t] = S[t-1] * np.exp((mu - 0.5 * sigma**2) + sigma * Wt)
return_sim.append(np.log(S[T]/S0))
var_gauss_diffusion = gaussian_var(return_sim, alpha=alpha)
print(f"La VaR gaussienne pour h=10j et alpha={alpha} est : {var_gauss_diffusion:.4%}")La VaR gaussienne pour h=10j et alpha=0.99 est : 10.0053%
c. Méthode EWMA
La VaR EWMA est une méthode qui permet de calculer la VaR en surpondérant les rendements les plus récents. Cela permet de donner plus de poids aux rendements les plus récents, et donc de mieux capturer les changements de volatilité. La VaR EWMA est donnée par la formule suivante :
\[ VaR_{t+1} = \mu + \sigma \times z_{\alpha} \]
# VaR la méthode EWMA (Exponential Weighting Moving Average)
def gaussian_var_ewma(data, alpha, lambda_=0.94):
"""
Calcul de la VaR gaussienne EWMA
data : les rendements logarithmiques
alpha : le niveau de confiance
lambda_ : le paramètre de lissage
"""
weights = np.array([(1-lambda_)*(lambda_**i) for i in range(len(data))])
weights = weights / np.sum(weights)
mu = np.sum(data[::-1] * weights)
sigma = np.sqrt(np.sum(weights * (data[::-1] - mu)**2))
return -(mu + sigma * stats.norm.ppf(1 - alpha)), mu, sigma
# y revenirlambdas = [0.9, 0.95, 0.99]
alpha = 0.99
import scipy.stats as stats
for l in lambdas:
print("="*80)
print("Lambda : ", l)
print("-"*15)
var_gauss_emwa, mu, sigma = gaussian_var_ewma(data_train, alpha=alpha, lambda_=l)
print(f"La VaR gaussienne EWMA pour h=1j et alpha={alpha} est : {var_gauss_emwa:.4%}")
print(f"La moyenne est : {mu:.4%}")
print(f"L'écart-type est : {sigma:.4%}")
n_exceptions = exceptions(data_test, var_gauss_emwa)
print(f"Le nombre d'exceptions sur l'échantillon de test est : {n_exceptions}")================================================================================
Lambda : 0.9
---------------
La VaR gaussienne EWMA pour h=1j et alpha=0.99 est : 2.3751%
La moyenne est : 0.1898%
L'écart-type est : 1.1025%
Le nombre d'exceptions sur l'échantillon de test est : 5
================================================================================
Lambda : 0.95
---------------
La VaR gaussienne EWMA pour h=1j et alpha=0.99 est : 2.8969%
La moyenne est : 0.0735%
L'écart-type est : 1.2768%
Le nombre d'exceptions sur l'échantillon de test est : 4
================================================================================
Lambda : 0.99
---------------
La VaR gaussienne EWMA pour h=1j et alpha=0.99 est : 3.3511%
La moyenne est : -0.0321%
L'écart-type est : 1.4267%
Le nombre d'exceptions sur l'échantillon de test est : 1
Avec la méthode EWMA, nous observons une que la VaR diminue plus \(\lambda\) augmente. Cela est dû au fait que plus \(\lambda\) est grand, plus les rendements les plus récents sont surpondérés, et donc la volatilité est plus faible, en raison de la fin de la période d’apprentissage.
II.4. VaR skew-student
II.4.1. Validation ex-ante
# Ecrire une fonction permettant d’estimer les paramètres d’une loi de Skew Student par maximum de vraisemblance.
from scipy.optimize import minimize
from scipy.stats import t
def skew_student_pdf(x, mu, sigma, gamma, nu ):
"""
Compute the Skew Student-t probability density function (PDF).
"""
t_x = ((x - mu) * gamma / sigma) * np.sqrt((nu + 1) / (nu + ((x - mu) / sigma) ** 2))
# PDF of the standard Student-t distribution
pdf_t = t.pdf(x , df=nu, loc=mu, scale=sigma)
# CDF of the transformed Student-t distribution
cdf_t = t.cdf(t_x, df=nu + 1,loc=0, scale=1)
# Skew Student density function
density = 2 * pdf_t * cdf_t
return density
def skew_student_log_likelihood(params, data):
"""
Calcul de la log-vraisemblance de la loi de Skew Student
params [mu, sigma, gamma, nu]: les paramètres de la loi
data : les rendements logarithmiques
"""
mu, sigma, gamma, nu = params
density = skew_student_pdf(data , mu, sigma, gamma, nu)
# log-vraisemblance
loglik = np.sum(np.log(density))
return - loglik
# Optimisation des paramètres avec contraintes de positivité sur sigma et nu
def skew_student_fit(data):
"""
Estimation des paramètres de la loi de Skew Student
"""
# initial guess
x0 = np.array([np.mean(data), np.std(data), 1, 4])
# contraintes
bounds = [(None, None), (0, None), (None, None), (None, None)]
# optimisation
res = minimize(skew_student_log_likelihood, x0, args=(data), bounds=bounds)
return res.x
params = skew_student_fit(data_train)
print("="*80)
print("Les paramètres estimés de la loi de Skew Student sont : ")
print("-"*15)
print("Mu : ", params[0])
print("Sigma : ", params[1])
print("Gamma : ", params[2])
print("Nu : ", params[3])
print("="*80)
params_sstd = {
"mu" : params[0],
"sigma" : params[1],
"gamma" : params[2],
"nu" : params[3]
}================================================================================
Les paramètres estimés de la loi de Skew Student sont :
---------------
Mu : 0.0023247899830732325
Sigma : 0.008823850410822238
Gamma : -0.23183614178494735
Nu : 2.9618421112435653
================================================================================
# Superposition de la densité théorique et des données
x_values = np.linspace(min(data_train), max(data_train), 1000)
theoretical_density = skew_student_pdf(x_values, **params_sstd)
plt.figure(figsize = (10,4))
plt.hist(data_train, bins=30, density=True, alpha=0.5, label='Données empiriques')
plt.plot(x_values, theoretical_density, label='Densité Skew Student', color='red')
# Densité normale
plt.plot(x_values, stats.norm.pdf(x_values, np.mean(data_train), np.std(data_train)), label='Densité normale', color='blue')
plt.xlabel('Rendements logarithmiques')
plt.ylabel('Densité')
plt.title("Comparaison entre les données et la densité théorique d'une loi de Skew Student")
plt.legend()
plt.show()
Le graphique ci-dessus est satisfaisant. La densité théorique de la skew-student semble bien s’ajuster aux données. La loi skew-student de paramètres (\(\mu = 0.002, \sigma = 0.009, \gamma = -0.23, \nu = 2.96\)). Le \(\mu\) est le rendement moyen, \(\sigma\) est l’écart-type, \(\gamma\) est le coefficient d’asymétrie et \(\nu\) est le degré de liberté. Le skewness est négatif, ce qui indique une asymétrie négative des rendements, comme ce qu’on a observé plus haut.
Nous allons appuyer cette validation en utilisant le QQ-plot. La fonction quantile d’une loi skew-student n’est pas analytique. Pour ce faire, nous allons construire la fonction de repartition de la skew-student ainsi que la fonction quantile qui est l’inverse de cette fonction de repartition. Nous allons ensuite comparer les quantiles théoriques de la skew-student avec les quantiles empiriques des rendements.
En observant le QQ-plot, on constate que les quantiles théoriques de la skew-student collent bien avec les quantiles empiriques des rendements. Cela confirme que la skew-student est une bonne approximation de la distribution des rendements. Pour une validation plus rigoureuse, on peut utiliser un test de Kolmogorov-Smirnov pour tester si les rendements suivent une loi skew-student.
## Intégration de la fonction de densité
from scipy import integrate
from scipy.optimize import minimize_scalar
def integrale_SkewStudent(x,params):
borne_inf = -np.inf
resultat_integration, erreur = integrate.quad(lambda x: skew_student_pdf(x, **params), borne_inf, x)
return resultat_integration
def fonc_minimize(x, alpha,params):
value = integrale_SkewStudent(x,params)-alpha
return abs(value)
def skew_student_quantile(alpha,mu, sigma, gamma, nu ):
params = {
"mu" : mu ,
"sigma" : sigma,
"gamma" : gamma,
"nu" : nu
}
if alpha <0 or alpha >1:
raise Exception("Veuillez entrer un niveau alpha entre 0 et 1")
else:
resultat_minimisation = minimize_scalar(lambda x: fonc_minimize(x, alpha,params))
return resultat_minimisation.xniveaux_quantiles = np.arange(0.001, 1, 0.001)
quantiles_empiriques = np.quantile(data_train, niveaux_quantiles)
quantiles_theoriques = [skew_student_quantile(alpha,**params_sstd) for alpha in tqdm(niveaux_quantiles)] 0%| | 0/999 [00:00<?, ?it/s] 0%| | 1/999 [00:00<04:09, 3.99it/s] 0%| | 2/999 [00:00<04:01, 4.13it/s] 0%| | 3/999 [00:00<04:07, 4.02it/s] 0%| | 4/999 [00:01<04:47, 3.47it/s] 1%| | 5/999 [00:01<05:03, 3.28it/s] 1%| | 6/999 [00:01<05:04, 3.26it/s] 1%| | 7/999 [00:02<05:03, 3.26it/s] 1%| | 8/999 [00:02<05:09, 3.21it/s] 1%| | 9/999 [00:02<05:07, 3.22it/s] 1%| | 10/999 [00:03<05:12, 3.16it/s] 1%| | 11/999 [00:03<05:03, 3.25it/s] 1%| | 12/999 [00:03<05:08, 3.19it/s] 1%|▏ | 13/999 [00:03<05:15, 3.13it/s] 1%|▏ | 14/999 [00:04<05:22, 3.05it/s] 2%|▏ | 15/999 [00:04<05:07, 3.20it/s] 2%|▏ | 16/999 [00:04<05:09, 3.18it/s] 2%|▏ | 17/999 [00:05<05:10, 3.17it/s] 2%|▏ | 18/999 [00:05<05:13, 3.13it/s] 2%|▏ | 19/999 [00:05<05:18, 3.08it/s] 2%|▏ | 20/999 [00:06<05:10, 3.15it/s] 2%|▏ | 21/999 [00:06<05:10, 3.15it/s] 2%|▏ | 22/999 [00:06<05:17, 3.08it/s] 2%|▏ | 23/999 [00:07<05:10, 3.14it/s] 2%|▏ | 24/999 [00:07<05:07, 3.17it/s] 3%|▎ | 25/999 [00:07<05:08, 3.15it/s] 3%|▎ | 26/999 [00:08<05:14, 3.09it/s] 3%|▎ | 27/999 [00:08<05:12, 3.11it/s] 3%|▎ | 28/999 [00:08<05:12, 3.11it/s] 3%|▎ | 29/999 [00:09<05:19, 3.04it/s] 3%|▎ | 30/999 [00:09<05:15, 3.07it/s] 3%|▎ | 31/999 [00:09<05:23, 2.99it/s] 3%|▎ | 32/999 [00:10<05:31, 2.91it/s] 3%|▎ | 33/999 [00:10<05:36, 2.87it/s] 3%|▎ | 34/999 [00:10<05:40, 2.83it/s] 4%|▎ | 35/999 [00:11<05:44, 2.80it/s] 4%|▎ | 36/999 [00:11<05:56, 2.70it/s] 4%|▎ | 37/999 [00:12<06:03, 2.65it/s] 4%|▍ | 38/999 [00:12<06:13, 2.58it/s] 4%|▍ | 39/999 [00:12<06:19, 2.53it/s] 4%|▍ | 40/999 [00:13<06:07, 2.61it/s] 4%|▍ | 41/999 [00:13<06:08, 2.60it/s] 4%|▍ | 42/999 [00:13<06:12, 2.57it/s] 4%|▍ | 43/999 [00:14<06:13, 2.56it/s] 4%|▍ | 44/999 [00:14<06:09, 2.59it/s] 5%|▍ | 45/999 [00:15<06:03, 2.63it/s] 5%|▍ | 46/999 [00:15<05:58, 2.66it/s] 5%|▍ | 47/999 [00:15<05:45, 2.75it/s] 5%|▍ | 48/999 [00:16<05:49, 2.72it/s] 5%|▍ | 49/999 [00:16<06:01, 2.62it/s] 5%|▌ | 50/999 [00:16<05:54, 2.68it/s] 5%|▌ | 51/999 [00:17<05:52, 2.69it/s] 5%|▌ | 52/999 [00:17<05:54, 2.67it/s] 5%|▌ | 53/999 [00:18<05:54, 2.67it/s] 5%|▌ | 54/999 [00:18<05:42, 2.76it/s] 6%|▌ | 55/999 [00:18<05:40, 2.78it/s] 6%|▌ | 56/999 [00:19<05:44, 2.73it/s] 6%|▌ | 57/999 [00:19<05:54, 2.66it/s] 6%|▌ | 58/999 [00:19<05:51, 2.68it/s] 6%|▌ | 59/999 [00:20<05:42, 2.75it/s] 6%|▌ | 60/999 [00:20<05:45, 2.71it/s] 6%|▌ | 61/999 [00:21<05:42, 2.74it/s] 6%|▌ | 62/999 [00:21<05:49, 2.68it/s] 6%|▋ | 63/999 [00:21<05:50, 2.67it/s] 6%|▋ | 64/999 [00:22<05:54, 2.64it/s] 7%|▋ | 65/999 [00:22<05:47, 2.69it/s] 7%|▋ | 66/999 [00:22<05:45, 2.70it/s] 7%|▋ | 67/999 [00:23<05:49, 2.66it/s] 7%|▋ | 68/999 [00:23<05:48, 2.67it/s] 7%|▋ | 69/999 [00:24<05:58, 2.59it/s] 7%|▋ | 70/999 [00:24<05:54, 2.62it/s] 7%|▋ | 71/999 [00:24<06:05, 2.54it/s] 7%|▋ | 72/999 [00:25<05:56, 2.60it/s] 7%|▋ | 73/999 [00:25<05:58, 2.59it/s] 7%|▋ | 74/999 [00:25<05:55, 2.60it/s] 8%|▊ | 75/999 [00:26<05:56, 2.59it/s] 8%|▊ | 76/999 [00:26<06:00, 2.56it/s] 8%|▊ | 77/999 [00:27<05:56, 2.59it/s] 8%|▊ | 78/999 [00:27<05:59, 2.56it/s] 8%|▊ | 79/999 [00:27<06:04, 2.53it/s] 8%|▊ | 80/999 [00:28<06:01, 2.54it/s] 8%|▊ | 81/999 [00:28<05:58, 2.56it/s] 8%|▊ | 82/999 [00:29<05:57, 2.56it/s] 8%|▊ | 83/999 [00:29<05:51, 2.61it/s] 8%|▊ | 84/999 [00:29<05:48, 2.63it/s] 9%|▊ | 85/999 [00:30<05:41, 2.67it/s] 9%|▊ | 86/999 [00:30<05:41, 2.67it/s] 9%|▊ | 87/999 [00:30<05:47, 2.63it/s] 9%|▉ | 88/999 [00:31<05:48, 2.62it/s] 9%|▉ | 89/999 [00:31<05:43, 2.65it/s] 9%|▉ | 90/999 [00:32<05:34, 2.72it/s] 9%|▉ | 91/999 [00:32<05:35, 2.70it/s] 9%|▉ | 92/999 [00:32<05:31, 2.73it/s] 9%|▉ | 93/999 [00:33<05:22, 2.81it/s] 9%|▉ | 94/999 [00:33<05:24, 2.79it/s] 10%|▉ | 95/999 [00:33<05:35, 2.70it/s] 10%|▉ | 96/999 [00:34<05:36, 2.69it/s] 10%|▉ | 97/999 [00:34<05:44, 2.62it/s] 10%|▉ | 98/999 [00:35<05:42, 2.63it/s] 10%|▉ | 99/999 [00:35<05:38, 2.66it/s] 10%|█ | 100/999 [00:35<05:27, 2.74it/s] 10%|█ | 101/999 [00:36<05:27, 2.74it/s] 10%|█ | 102/999 [00:36<05:24, 2.77it/s] 10%|█ | 103/999 [00:36<05:26, 2.74it/s] 10%|█ | 104/999 [00:37<05:23, 2.77it/s] 11%|█ | 105/999 [00:37<05:20, 2.79it/s] 11%|█ | 106/999 [00:37<05:28, 2.72it/s] 11%|█ | 107/999 [00:38<05:30, 2.70it/s] 11%|█ | 108/999 [00:38<05:37, 2.64it/s] 11%|█ | 109/999 [00:39<05:36, 2.64it/s] 11%|█ | 110/999 [00:39<05:40, 2.61it/s] 11%|█ | 111/999 [00:39<05:45, 2.57it/s] 11%|█ | 112/999 [00:40<05:50, 2.53it/s] 11%|█▏ | 113/999 [00:40<05:56, 2.49it/s] 11%|█▏ | 114/999 [00:41<05:52, 2.51it/s] 12%|█▏ | 115/999 [00:41<05:52, 2.51it/s] 12%|█▏ | 116/999 [00:41<05:49, 2.52it/s] 12%|█▏ | 117/999 [00:42<05:52, 2.50it/s] 12%|█▏ | 118/999 [00:42<05:49, 2.52it/s] 12%|█▏ | 119/999 [00:43<05:52, 2.49it/s] 12%|█▏ | 120/999 [00:43<05:48, 2.52it/s] 12%|█▏ | 121/999 [00:43<05:50, 2.50it/s] 12%|█▏ | 122/999 [00:44<06:05, 2.40it/s] 12%|█▏ | 123/999 [00:44<05:59, 2.44it/s] 12%|█▏ | 124/999 [00:45<05:57, 2.45it/s] 13%|█▎ | 125/999 [00:45<05:58, 2.44it/s] 13%|█▎ | 126/999 [00:46<05:58, 2.44it/s] 13%|█▎ | 127/999 [00:46<05:57, 2.44it/s] 13%|█▎ | 128/999 [00:46<05:54, 2.45it/s] 13%|█▎ | 129/999 [00:47<05:55, 2.44it/s] 13%|█▎ | 130/999 [00:47<05:53, 2.46it/s] 13%|█▎ | 131/999 [00:48<05:48, 2.49it/s] 13%|█▎ | 132/999 [00:48<05:40, 2.55it/s] 13%|█▎ | 133/999 [00:48<05:36, 2.58it/s] 13%|█▎ | 134/999 [00:49<05:29, 2.63it/s] 14%|█▎ | 135/999 [00:49<05:30, 2.61it/s] 14%|█▎ | 136/999 [00:49<05:32, 2.59it/s] 14%|█▎ | 137/999 [00:50<05:36, 2.56it/s] 14%|█▍ | 138/999 [00:50<05:34, 2.57it/s] 14%|█▍ | 139/999 [00:51<05:45, 2.49it/s] 14%|█▍ | 140/999 [00:51<05:50, 2.45it/s] 14%|█▍ | 141/999 [00:51<05:40, 2.52it/s] 14%|█▍ | 142/999 [00:52<05:34, 2.56it/s] 14%|█▍ | 143/999 [00:52<05:40, 2.51it/s] 14%|█▍ | 144/999 [00:53<05:31, 2.58it/s] 15%|█▍ | 145/999 [00:53<05:25, 2.62it/s] 15%|█▍ | 146/999 [00:53<05:19, 2.67it/s] 15%|█▍ | 147/999 [00:54<05:25, 2.62it/s] 15%|█▍ | 148/999 [00:54<05:46, 2.46it/s] 15%|█▍ | 149/999 [00:55<05:50, 2.43it/s] 15%|█▌ | 150/999 [00:55<05:54, 2.40it/s] 15%|█▌ | 151/999 [00:55<05:46, 2.45it/s] 15%|█▌ | 152/999 [00:56<05:38, 2.50it/s] 15%|█▌ | 153/999 [00:56<05:42, 2.47it/s] 15%|█▌ | 154/999 [00:57<05:47, 2.43it/s] 16%|█▌ | 155/999 [00:57<05:50, 2.41it/s] 16%|█▌ | 156/999 [00:57<05:53, 2.39it/s] 16%|█▌ | 157/999 [00:58<05:53, 2.38it/s] 16%|█▌ | 158/999 [00:58<05:47, 2.42it/s] 16%|█▌ | 159/999 [00:59<05:57, 2.35it/s] 16%|█▌ | 160/999 [00:59<06:03, 2.31it/s] 16%|█▌ | 161/999 [01:00<05:58, 2.34it/s] 16%|█▌ | 162/999 [01:00<06:08, 2.27it/s] 16%|█▋ | 163/999 [01:01<06:10, 2.25it/s] 16%|█▋ | 164/999 [01:01<06:17, 2.21it/s] 17%|█▋ | 165/999 [01:01<06:13, 2.23it/s] 17%|█▋ | 166/999 [01:02<06:08, 2.26it/s] 17%|█▋ | 167/999 [01:02<06:04, 2.28it/s] 17%|█▋ | 168/999 [01:03<06:09, 2.25it/s] 17%|█▋ | 169/999 [01:03<06:07, 2.26it/s] 17%|█▋ | 170/999 [01:04<06:06, 2.26it/s] 17%|█▋ | 171/999 [01:04<05:58, 2.31it/s] 17%|█▋ | 172/999 [01:05<06:04, 2.27it/s] 17%|█▋ | 173/999 [01:05<06:04, 2.27it/s] 17%|█▋ | 174/999 [01:05<05:58, 2.30it/s] 18%|█▊ | 175/999 [01:06<05:55, 2.32it/s] 18%|█▊ | 176/999 [01:06<06:04, 2.26it/s] 18%|█▊ | 177/999 [01:07<06:04, 2.25it/s] 18%|█▊ | 178/999 [01:07<05:53, 2.32it/s] 18%|█▊ | 179/999 [01:08<05:45, 2.37it/s] 18%|█▊ | 180/999 [01:08<05:50, 2.34it/s] 18%|█▊ | 181/999 [01:08<05:52, 2.32it/s] 18%|█▊ | 182/999 [01:09<06:00, 2.26it/s] 18%|█▊ | 183/999 [01:09<06:10, 2.20it/s] 18%|█▊ | 184/999 [01:10<06:03, 2.24it/s] 19%|█▊ | 185/999 [01:10<06:11, 2.19it/s] 19%|█▊ | 186/999 [01:11<06:19, 2.14it/s] 19%|█▊ | 187/999 [01:11<06:18, 2.14it/s] 19%|█▉ | 188/999 [01:12<06:17, 2.15it/s] 19%|█▉ | 189/999 [01:12<06:02, 2.23it/s] 19%|█▉ | 190/999 [01:13<06:02, 2.23it/s] 19%|█▉ | 191/999 [01:13<05:41, 2.37it/s] 19%|█▉ | 192/999 [01:13<05:49, 2.31it/s] 19%|█▉ | 193/999 [01:14<05:46, 2.32it/s] 19%|█▉ | 194/999 [01:14<05:45, 2.33it/s] 20%|█▉ | 195/999 [01:15<05:42, 2.35it/s] 20%|█▉ | 196/999 [01:15<05:42, 2.35it/s] 20%|█▉ | 197/999 [01:15<05:45, 2.32it/s] 20%|█▉ | 198/999 [01:16<05:42, 2.34it/s] 20%|█▉ | 199/999 [01:16<05:47, 2.30it/s] 20%|██ | 200/999 [01:17<05:49, 2.28it/s] 20%|██ | 201/999 [01:17<05:45, 2.31it/s] 20%|██ | 202/999 [01:18<05:50, 2.27it/s] 20%|██ | 203/999 [01:18<05:47, 2.29it/s] 20%|██ | 204/999 [01:19<05:39, 2.34it/s] 21%|██ | 205/999 [01:19<05:35, 2.37it/s] 21%|██ | 206/999 [01:19<05:29, 2.41it/s] 21%|██ | 207/999 [01:20<05:36, 2.35it/s] 21%|██ | 208/999 [01:20<05:40, 2.32it/s] 21%|██ | 209/999 [01:21<05:47, 2.28it/s] 21%|██ | 210/999 [01:21<05:45, 2.28it/s] 21%|██ | 211/999 [01:22<05:58, 2.20it/s] 21%|██ | 212/999 [01:22<05:53, 2.23it/s] 21%|██▏ | 213/999 [01:22<05:43, 2.29it/s] 21%|██▏ | 214/999 [01:23<05:46, 2.26it/s] 22%|██▏ | 215/999 [01:23<05:49, 2.24it/s] 22%|██▏ | 216/999 [01:24<05:43, 2.28it/s] 22%|██▏ | 217/999 [01:24<05:43, 2.28it/s] 22%|██▏ | 218/999 [01:25<05:43, 2.28it/s] 22%|██▏ | 219/999 [01:25<05:25, 2.39it/s] 22%|██▏ | 220/999 [01:25<05:27, 2.38it/s] 22%|██▏ | 221/999 [01:26<05:31, 2.35it/s] 22%|██▏ | 222/999 [01:26<05:40, 2.28it/s] 22%|██▏ | 223/999 [01:27<05:46, 2.24it/s] 22%|██▏ | 224/999 [01:27<05:44, 2.25it/s] 23%|██▎ | 225/999 [01:28<05:50, 2.21it/s] 23%|██▎ | 226/999 [01:28<05:42, 2.25it/s] 23%|██▎ | 227/999 [01:29<05:42, 2.26it/s] 23%|██▎ | 228/999 [01:29<05:44, 2.24it/s] 23%|██▎ | 229/999 [01:30<05:55, 2.17it/s] 23%|██▎ | 230/999 [01:30<06:04, 2.11it/s] 23%|██▎ | 231/999 [01:31<06:10, 2.07it/s] 23%|██▎ | 232/999 [01:31<06:01, 2.12it/s] 23%|██▎ | 233/999 [01:31<05:50, 2.19it/s] 23%|██▎ | 234/999 [01:32<05:43, 2.22it/s] 24%|██▎ | 235/999 [01:32<05:39, 2.25it/s] 24%|██▎ | 236/999 [01:33<05:49, 2.18it/s] 24%|██▎ | 237/999 [01:33<05:58, 2.13it/s] 24%|██▍ | 238/999 [01:34<06:08, 2.06it/s] 24%|██▍ | 239/999 [01:34<06:19, 2.00it/s] 24%|██▍ | 240/999 [01:35<06:23, 1.98it/s] 24%|██▍ | 241/999 [01:35<06:23, 1.98it/s] 24%|██▍ | 242/999 [01:36<06:25, 1.96it/s] 24%|██▍ | 243/999 [01:36<06:32, 1.92it/s] 24%|██▍ | 244/999 [01:37<06:36, 1.90it/s] 25%|██▍ | 245/999 [01:37<06:31, 1.92it/s] 25%|██▍ | 246/999 [01:38<06:34, 1.91it/s] 25%|██▍ | 247/999 [01:39<06:32, 1.92it/s] 25%|██▍ | 248/999 [01:39<06:45, 1.85it/s] 25%|██▍ | 249/999 [01:40<06:53, 1.81it/s] 25%|██▌ | 250/999 [01:40<06:50, 1.82it/s] 25%|██▌ | 251/999 [01:41<06:54, 1.81it/s] 25%|██▌ | 252/999 [01:41<06:45, 1.84it/s] 25%|██▌ | 253/999 [01:42<06:51, 1.81it/s] 25%|██▌ | 254/999 [01:42<06:58, 1.78it/s] 26%|██▌ | 255/999 [01:43<06:59, 1.77it/s] 26%|██▌ | 256/999 [01:44<06:55, 1.79it/s] 26%|██▌ | 257/999 [01:44<06:35, 1.87it/s] 26%|██▌ | 258/999 [01:45<06:27, 1.91it/s] 26%|██▌ | 259/999 [01:45<06:28, 1.90it/s] 26%|██▌ | 260/999 [01:46<06:20, 1.94it/s] 26%|██▌ | 261/999 [01:46<06:12, 1.98it/s] 26%|██▌ | 262/999 [01:47<05:59, 2.05it/s] 26%|██▋ | 263/999 [01:47<05:55, 2.07it/s] 26%|██▋ | 264/999 [01:47<05:50, 2.10it/s] 27%|██▋ | 265/999 [01:48<05:47, 2.11it/s] 27%|██▋ | 266/999 [01:48<05:46, 2.12it/s] 27%|██▋ | 267/999 [01:49<05:42, 2.13it/s] 27%|██▋ | 268/999 [01:49<05:49, 2.09it/s] 27%|██▋ | 269/999 [01:50<05:48, 2.10it/s] 27%|██▋ | 270/999 [01:50<05:52, 2.07it/s] 27%|██▋ | 271/999 [01:51<05:49, 2.08it/s] 27%|██▋ | 272/999 [01:51<05:58, 2.03it/s] 27%|██▋ | 273/999 [01:52<05:59, 2.02it/s] 27%|██▋ | 274/999 [01:52<05:55, 2.04it/s] 28%|██▊ | 275/999 [01:53<05:55, 2.03it/s] 28%|██▊ | 276/999 [01:53<06:01, 2.00it/s] 28%|██▊ | 277/999 [01:54<05:53, 2.04it/s] 28%|██▊ | 278/999 [01:54<05:59, 2.01it/s] 28%|██▊ | 279/999 [01:55<06:01, 1.99it/s] 28%|██▊ | 280/999 [01:55<06:07, 1.96it/s] 28%|██▊ | 281/999 [01:56<06:07, 1.95it/s] 28%|██▊ | 282/999 [01:56<06:14, 1.91it/s] 28%|██▊ | 283/999 [01:57<06:15, 1.91it/s] 28%|██▊ | 284/999 [01:58<06:32, 1.82it/s] 29%|██▊ | 285/999 [01:58<06:44, 1.76it/s] 29%|██▊ | 286/999 [01:59<06:34, 1.81it/s] 29%|██▊ | 287/999 [01:59<06:41, 1.78it/s] 29%|██▉ | 288/999 [02:00<06:31, 1.81it/s] 29%|██▉ | 289/999 [02:00<06:35, 1.80it/s] 29%|██▉ | 290/999 [02:01<06:26, 1.83it/s] 29%|██▉ | 291/999 [02:01<06:34, 1.79it/s] 29%|██▉ | 292/999 [02:02<06:23, 1.84it/s] 29%|██▉ | 293/999 [02:02<06:15, 1.88it/s] 29%|██▉ | 294/999 [02:03<06:25, 1.83it/s] 30%|██▉ | 295/999 [02:04<06:16, 1.87it/s] 30%|██▉ | 296/999 [02:04<06:26, 1.82it/s] 30%|██▉ | 297/999 [02:05<06:19, 1.85it/s] 30%|██▉ | 298/999 [02:05<06:23, 1.83it/s] 30%|██▉ | 299/999 [02:06<06:19, 1.85it/s] 30%|███ | 300/999 [02:06<06:27, 1.80it/s] 30%|███ | 301/999 [02:07<06:31, 1.78it/s] 30%|███ | 302/999 [02:07<06:30, 1.78it/s] 30%|███ | 303/999 [02:08<06:39, 1.74it/s] 30%|███ | 304/999 [02:09<06:29, 1.79it/s] 31%|███ | 305/999 [02:09<06:18, 1.83it/s] 31%|███ | 306/999 [02:10<06:08, 1.88it/s] 31%|███ | 307/999 [02:10<06:05, 1.89it/s] 31%|███ | 308/999 [02:11<05:53, 1.95it/s] 31%|███ | 309/999 [02:11<05:59, 1.92it/s] 31%|███ | 310/999 [02:12<06:05, 1.89it/s] 31%|███ | 311/999 [02:12<06:11, 1.85it/s] 31%|███ | 312/999 [02:13<06:12, 1.84it/s] 31%|███▏ | 313/999 [02:13<06:14, 1.83it/s] 31%|███▏ | 314/999 [02:14<06:08, 1.86it/s] 32%|███▏ | 315/999 [02:14<05:59, 1.90it/s] 32%|███▏ | 316/999 [02:15<05:59, 1.90it/s] 32%|███▏ | 317/999 [02:15<05:59, 1.90it/s] 32%|███▏ | 318/999 [02:16<05:55, 1.92it/s] 32%|███▏ | 319/999 [02:16<06:00, 1.89it/s] 32%|███▏ | 320/999 [02:17<06:01, 1.88it/s] 32%|███▏ | 321/999 [02:18<06:20, 1.78it/s] 32%|███▏ | 322/999 [02:18<06:07, 1.84it/s] 32%|███▏ | 323/999 [02:19<06:21, 1.77it/s] 32%|███▏ | 324/999 [02:19<06:19, 1.78it/s] 33%|███▎ | 325/999 [02:20<06:11, 1.81it/s] 33%|███▎ | 326/999 [02:20<06:06, 1.84it/s] 33%|███▎ | 327/999 [02:21<06:21, 1.76it/s] 33%|███▎ | 328/999 [02:22<06:11, 1.81it/s] 33%|███▎ | 329/999 [02:22<06:22, 1.75it/s] 33%|███▎ | 330/999 [02:23<06:13, 1.79it/s] 33%|███▎ | 331/999 [02:23<06:11, 1.80it/s] 33%|███▎ | 332/999 [02:24<06:11, 1.79it/s] 33%|███▎ | 333/999 [02:24<06:11, 1.79it/s] 33%|███▎ | 334/999 [02:25<06:02, 1.84it/s] 34%|███▎ | 335/999 [02:25<06:01, 1.83it/s] 34%|███▎ | 336/999 [02:26<06:03, 1.82it/s] 34%|███▎ | 337/999 [02:26<06:02, 1.83it/s] 34%|███▍ | 338/999 [02:27<06:04, 1.81it/s] 34%|███▍ | 339/999 [02:28<05:54, 1.86it/s] 34%|███▍ | 340/999 [02:28<05:47, 1.90it/s] 34%|███▍ | 341/999 [02:29<05:49, 1.88it/s] 34%|███▍ | 342/999 [02:29<05:48, 1.88it/s] 34%|███▍ | 343/999 [02:30<05:48, 1.88it/s] 34%|███▍ | 344/999 [02:30<05:50, 1.87it/s] 35%|███▍ | 345/999 [02:31<05:45, 1.89it/s] 35%|███▍ | 346/999 [02:31<05:45, 1.89it/s] 35%|███▍ | 347/999 [02:32<05:47, 1.88it/s] 35%|███▍ | 348/999 [02:32<05:46, 1.88it/s] 35%|███▍ | 349/999 [02:33<05:40, 1.91it/s] 35%|███▌ | 350/999 [02:33<05:38, 1.92it/s] 35%|███▌ | 351/999 [02:34<05:44, 1.88it/s] 35%|███▌ | 352/999 [02:34<05:46, 1.87it/s] 35%|███▌ | 353/999 [02:35<05:47, 1.86it/s] 35%|███▌ | 354/999 [02:36<05:43, 1.88it/s] 36%|███▌ | 355/999 [02:36<05:40, 1.89it/s] 36%|███▌ | 356/999 [02:37<05:40, 1.89it/s] 36%|███▌ | 357/999 [02:37<05:37, 1.90it/s] 36%|███▌ | 358/999 [02:38<05:43, 1.86it/s] 36%|███▌ | 359/999 [02:38<05:47, 1.84it/s] 36%|███▌ | 360/999 [02:39<05:40, 1.87it/s] 36%|███▌ | 361/999 [02:39<05:40, 1.87it/s] 36%|███▌ | 362/999 [02:40<05:36, 1.89it/s] 36%|███▋ | 363/999 [02:40<05:29, 1.93it/s] 36%|███▋ | 364/999 [02:41<05:23, 1.97it/s] 37%|███▋ | 365/999 [02:41<05:30, 1.92it/s] 37%|███▋ | 366/999 [02:42<05:29, 1.92it/s] 37%|███▋ | 367/999 [02:42<05:26, 1.93it/s] 37%|███▋ | 368/999 [02:43<05:23, 1.95it/s] 37%|███▋ | 369/999 [02:43<05:18, 1.98it/s] 37%|███▋ | 370/999 [02:44<05:17, 1.98it/s] 37%|███▋ | 371/999 [02:44<05:14, 2.00it/s] 37%|███▋ | 372/999 [02:45<05:17, 1.98it/s] 37%|███▋ | 373/999 [02:45<05:17, 1.97it/s] 37%|███▋ | 374/999 [02:46<05:16, 1.98it/s] 38%|███▊ | 375/999 [02:46<05:07, 2.03it/s] 38%|███▊ | 376/999 [02:47<05:04, 2.05it/s] 38%|███▊ | 377/999 [02:47<05:09, 2.01it/s] 38%|███▊ | 378/999 [02:48<05:05, 2.03it/s] 38%|███▊ | 379/999 [02:48<05:08, 2.01it/s] 38%|███▊ | 380/999 [02:49<05:14, 1.97it/s] 38%|███▊ | 381/999 [02:49<05:13, 1.97it/s] 38%|███▊ | 382/999 [02:50<05:07, 2.01it/s] 38%|███▊ | 383/999 [02:50<05:02, 2.04it/s] 38%|███▊ | 384/999 [02:51<05:07, 2.00it/s] 39%|███▊ | 385/999 [02:51<05:08, 1.99it/s] 39%|███▊ | 386/999 [02:52<05:11, 1.97it/s] 39%|███▊ | 387/999 [02:52<04:56, 2.06it/s] 39%|███▉ | 388/999 [02:53<05:05, 2.00it/s] 39%|███▉ | 389/999 [02:53<05:03, 2.01it/s] 39%|███▉ | 390/999 [02:54<05:04, 2.00it/s] 39%|███▉ | 391/999 [02:54<05:11, 1.95it/s] 39%|███▉ | 392/999 [02:55<05:14, 1.93it/s] 39%|███▉ | 393/999 [02:55<05:16, 1.91it/s] 39%|███▉ | 394/999 [02:56<05:13, 1.93it/s] 40%|███▉ | 395/999 [02:56<05:09, 1.95it/s] 40%|███▉ | 396/999 [02:57<05:13, 1.92it/s] 40%|███▉ | 397/999 [02:57<05:14, 1.91it/s] 40%|███▉ | 398/999 [02:58<05:12, 1.92it/s] 40%|███▉ | 399/999 [02:59<05:21, 1.87it/s] 40%|████ | 400/999 [02:59<05:18, 1.88it/s] 40%|████ | 401/999 [03:00<05:18, 1.88it/s] 40%|████ | 402/999 [03:00<05:15, 1.89it/s] 40%|████ | 403/999 [03:01<05:14, 1.90it/s] 40%|████ | 404/999 [03:01<05:10, 1.92it/s] 41%|████ | 405/999 [03:02<05:04, 1.95it/s] 41%|████ | 406/999 [03:02<05:02, 1.96it/s] 41%|████ | 407/999 [03:03<05:02, 1.96it/s] 41%|████ | 408/999 [03:03<04:57, 1.98it/s] 41%|████ | 409/999 [03:04<04:57, 1.98it/s] 41%|████ | 410/999 [03:04<05:00, 1.96it/s] 41%|████ | 411/999 [03:05<05:04, 1.93it/s] 41%|████ | 412/999 [03:05<04:59, 1.96it/s] 41%|████▏ | 413/999 [03:06<04:59, 1.96it/s] 41%|████▏ | 414/999 [03:06<04:56, 1.97it/s] 42%|████▏ | 415/999 [03:07<05:01, 1.93it/s] 42%|████▏ | 416/999 [03:07<05:05, 1.91it/s] 42%|████▏ | 417/999 [03:08<05:09, 1.88it/s] 42%|████▏ | 418/999 [03:08<05:03, 1.92it/s] 42%|████▏ | 419/999 [03:09<05:07, 1.89it/s] 42%|████▏ | 420/999 [03:09<05:08, 1.88it/s] 42%|████▏ | 421/999 [03:10<05:14, 1.84it/s] 42%|████▏ | 422/999 [03:11<05:17, 1.82it/s] 42%|████▏ | 423/999 [03:11<05:19, 1.80it/s] 42%|████▏ | 424/999 [03:12<05:13, 1.84it/s] 43%|████▎ | 425/999 [03:12<05:13, 1.83it/s] 43%|████▎ | 426/999 [03:13<05:11, 1.84it/s] 43%|████▎ | 427/999 [03:13<05:13, 1.82it/s] 43%|████▎ | 428/999 [03:14<05:11, 1.83it/s] 43%|████▎ | 429/999 [03:14<05:23, 1.76it/s] 43%|████▎ | 430/999 [03:15<05:17, 1.79it/s] 43%|████▎ | 431/999 [03:16<05:08, 1.84it/s] 43%|████▎ | 432/999 [03:16<05:06, 1.85it/s] 43%|████▎ | 433/999 [03:17<05:00, 1.88it/s] 43%|████▎ | 434/999 [03:17<04:56, 1.91it/s] 44%|████▎ | 435/999 [03:18<05:06, 1.84it/s] 44%|████▎ | 436/999 [03:18<05:14, 1.79it/s] 44%|████▎ | 437/999 [03:19<05:20, 1.75it/s] 44%|████▍ | 438/999 [03:19<05:18, 1.76it/s] 44%|████▍ | 439/999 [03:20<05:10, 1.80it/s] 44%|████▍ | 440/999 [03:20<05:10, 1.80it/s] 44%|████▍ | 441/999 [03:21<05:00, 1.86it/s] 44%|████▍ | 442/999 [03:22<04:57, 1.87it/s] 44%|████▍ | 443/999 [03:22<04:58, 1.86it/s] 44%|████▍ | 444/999 [03:23<04:53, 1.89it/s] 45%|████▍ | 445/999 [03:23<04:54, 1.88it/s] 45%|████▍ | 446/999 [03:24<04:49, 1.91it/s] 45%|████▍ | 447/999 [03:24<04:54, 1.87it/s] 45%|████▍ | 448/999 [03:25<04:52, 1.89it/s] 45%|████▍ | 449/999 [03:25<04:52, 1.88it/s] 45%|████▌ | 450/999 [03:26<04:57, 1.84it/s] 45%|████▌ | 451/999 [03:26<05:00, 1.82it/s] 45%|████▌ | 452/999 [03:27<05:03, 1.80it/s] 45%|████▌ | 453/999 [03:27<05:04, 1.79it/s] 45%|████▌ | 454/999 [03:28<05:02, 1.80it/s] 46%|████▌ | 455/999 [03:29<05:00, 1.81it/s] 46%|████▌ | 456/999 [03:29<04:54, 1.84it/s] 46%|████▌ | 457/999 [03:30<04:53, 1.85it/s] 46%|████▌ | 458/999 [03:30<04:52, 1.85it/s] 46%|████▌ | 459/999 [03:31<05:03, 1.78it/s] 46%|████▌ | 460/999 [03:31<05:03, 1.77it/s] 46%|████▌ | 461/999 [03:32<05:02, 1.78it/s] 46%|████▌ | 462/999 [03:32<05:00, 1.79it/s] 46%|████▋ | 463/999 [03:33<05:00, 1.78it/s] 46%|████▋ | 464/999 [03:34<05:04, 1.76it/s] 47%|████▋ | 465/999 [03:34<04:55, 1.81it/s] 47%|████▋ | 466/999 [03:35<04:57, 1.79it/s] 47%|████▋ | 467/999 [03:35<04:48, 1.84it/s] 47%|████▋ | 468/999 [03:36<04:43, 1.87it/s] 47%|████▋ | 469/999 [03:36<04:45, 1.86it/s] 47%|████▋ | 470/999 [03:37<04:46, 1.85it/s] 47%|████▋ | 471/999 [03:37<04:48, 1.83it/s] 47%|████▋ | 472/999 [03:38<04:55, 1.78it/s] 47%|████▋ | 473/999 [03:39<04:57, 1.77it/s] 47%|████▋ | 474/999 [03:39<04:44, 1.84it/s] 48%|████▊ | 475/999 [03:40<04:42, 1.85it/s] 48%|████▊ | 476/999 [03:40<04:39, 1.87it/s] 48%|████▊ | 477/999 [03:41<04:42, 1.84it/s] 48%|████▊ | 478/999 [03:41<04:47, 1.81it/s] 48%|████▊ | 479/999 [03:42<04:51, 1.79it/s] 48%|████▊ | 480/999 [03:42<04:41, 1.84it/s] 48%|████▊ | 481/999 [03:43<04:43, 1.83it/s] 48%|████▊ | 482/999 [03:43<04:39, 1.85it/s] 48%|████▊ | 483/999 [03:44<04:46, 1.80it/s] 48%|████▊ | 484/999 [03:45<04:39, 1.84it/s] 49%|████▊ | 485/999 [03:45<04:35, 1.87it/s] 49%|████▊ | 486/999 [03:46<04:31, 1.89it/s] 49%|████▊ | 487/999 [03:46<04:30, 1.90it/s] 49%|████▉ | 488/999 [03:47<04:26, 1.91it/s] 49%|████▉ | 489/999 [03:47<04:22, 1.94it/s] 49%|████▉ | 490/999 [03:48<04:21, 1.95it/s] 49%|████▉ | 491/999 [03:48<04:15, 1.99it/s] 49%|████▉ | 492/999 [03:49<04:15, 1.99it/s] 49%|████▉ | 493/999 [03:49<04:19, 1.95it/s] 49%|████▉ | 494/999 [03:50<04:22, 1.92it/s] 50%|████▉ | 495/999 [03:50<04:22, 1.92it/s] 50%|████▉ | 496/999 [03:51<04:20, 1.93it/s] 50%|████▉ | 497/999 [03:51<04:24, 1.90it/s] 50%|████▉ | 498/999 [03:52<04:24, 1.89it/s] 50%|████▉ | 499/999 [03:52<04:14, 1.97it/s] 50%|█████ | 500/999 [03:53<04:14, 1.96it/s] 50%|█████ | 501/999 [03:53<04:05, 2.03it/s] 50%|█████ | 502/999 [03:54<04:13, 1.96it/s] 50%|█████ | 503/999 [03:54<04:11, 1.97it/s] 50%|█████ | 504/999 [03:55<04:09, 1.98it/s] 51%|█████ | 505/999 [03:55<04:10, 1.97it/s] 51%|█████ | 506/999 [03:56<04:15, 1.93it/s] 51%|█████ | 507/999 [03:56<04:12, 1.95it/s] 51%|█████ | 508/999 [03:57<03:59, 2.05it/s] 51%|█████ | 509/999 [03:57<03:57, 2.06it/s] 51%|█████ | 510/999 [03:58<04:00, 2.03it/s] 51%|█████ | 511/999 [03:58<03:56, 2.06it/s] 51%|█████▏ | 512/999 [03:59<03:52, 2.09it/s] 51%|█████▏ | 513/999 [03:59<03:52, 2.09it/s] 51%|█████▏ | 514/999 [04:00<03:54, 2.07it/s] 52%|█████▏ | 515/999 [04:00<04:03, 1.99it/s] 52%|█████▏ | 516/999 [04:01<04:00, 2.01it/s] 52%|█████▏ | 517/999 [04:01<04:01, 2.00it/s] 52%|█████▏ | 518/999 [04:02<04:03, 1.98it/s] 52%|█████▏ | 519/999 [04:02<04:00, 1.99it/s] 52%|█████▏ | 520/999 [04:03<04:00, 1.99it/s] 52%|█████▏ | 521/999 [04:03<03:58, 2.00it/s] 52%|█████▏ | 522/999 [04:04<03:56, 2.02it/s] 52%|█████▏ | 523/999 [04:04<04:01, 1.97it/s] 52%|█████▏ | 524/999 [04:05<04:03, 1.95it/s] 53%|█████▎ | 525/999 [04:05<04:09, 1.90it/s] 53%|█████▎ | 526/999 [04:06<04:08, 1.90it/s] 53%|█████▎ | 527/999 [04:06<04:01, 1.95it/s] 53%|█████▎ | 528/999 [04:07<04:06, 1.91it/s] 53%|█████▎ | 529/999 [04:07<03:55, 2.00it/s] 53%|█████▎ | 530/999 [04:08<04:03, 1.93it/s] 53%|█████▎ | 531/999 [04:08<04:03, 1.92it/s] 53%|█████▎ | 532/999 [04:09<04:05, 1.90it/s] 53%|█████▎ | 533/999 [04:09<04:04, 1.91it/s] 53%|█████▎ | 534/999 [04:10<04:00, 1.93it/s] 54%|█████▎ | 535/999 [04:10<03:57, 1.95it/s] 54%|█████▎ | 536/999 [04:11<03:58, 1.94it/s] 54%|█████▍ | 537/999 [04:11<03:55, 1.96it/s] 54%|█████▍ | 538/999 [04:12<03:54, 1.97it/s] 54%|█████▍ | 539/999 [04:12<03:56, 1.95it/s] 54%|█████▍ | 540/999 [04:13<03:54, 1.96it/s] 54%|█████▍ | 541/999 [04:13<03:53, 1.96it/s] 54%|█████▍ | 542/999 [04:14<03:53, 1.96it/s] 54%|█████▍ | 543/999 [04:14<03:52, 1.96it/s] 54%|█████▍ | 544/999 [04:15<03:57, 1.91it/s] 55%|█████▍ | 545/999 [04:16<04:00, 1.89it/s] 55%|█████▍ | 546/999 [04:16<03:57, 1.90it/s] 55%|█████▍ | 547/999 [04:17<03:56, 1.91it/s] 55%|█████▍ | 548/999 [04:17<03:58, 1.89it/s] 55%|█████▍ | 549/999 [04:18<03:54, 1.92it/s] 55%|█████▌ | 550/999 [04:18<03:50, 1.95it/s] 55%|█████▌ | 551/999 [04:19<03:55, 1.90it/s] 55%|█████▌ | 552/999 [04:19<03:51, 1.93it/s] 55%|█████▌ | 553/999 [04:20<03:53, 1.91it/s] 55%|█████▌ | 554/999 [04:20<03:51, 1.92it/s] 56%|█████▌ | 555/999 [04:21<03:52, 1.91it/s] 56%|█████▌ | 556/999 [04:21<03:52, 1.91it/s] 56%|█████▌ | 557/999 [04:22<03:50, 1.92it/s] 56%|█████▌ | 558/999 [04:22<03:49, 1.92it/s] 56%|█████▌ | 559/999 [04:23<03:47, 1.93it/s] 56%|█████▌ | 560/999 [04:23<03:48, 1.92it/s] 56%|█████▌ | 561/999 [04:24<03:46, 1.93it/s] 56%|█████▋ | 562/999 [04:24<03:43, 1.96it/s] 56%|█████▋ | 563/999 [04:25<03:52, 1.88it/s] 56%|█████▋ | 564/999 [04:26<03:55, 1.85it/s] 57%|█████▋ | 565/999 [04:26<04:02, 1.79it/s] 57%|█████▋ | 566/999 [04:27<03:58, 1.82it/s] 57%|█████▋ | 567/999 [04:27<03:52, 1.86it/s] 57%|█████▋ | 568/999 [04:28<03:59, 1.80it/s] 57%|█████▋ | 569/999 [04:28<04:08, 1.73it/s] 57%|█████▋ | 570/999 [04:29<04:03, 1.77it/s] 57%|█████▋ | 571/999 [04:29<03:56, 1.81it/s] 57%|█████▋ | 572/999 [04:30<03:53, 1.83it/s] 57%|█████▋ | 573/999 [04:31<03:54, 1.82it/s] 57%|█████▋ | 574/999 [04:31<03:54, 1.81it/s] 58%|█████▊ | 575/999 [04:32<03:47, 1.86it/s] 58%|█████▊ | 576/999 [04:32<03:42, 1.90it/s] 58%|█████▊ | 577/999 [04:33<03:44, 1.88it/s] 58%|█████▊ | 578/999 [04:33<03:42, 1.89it/s] 58%|█████▊ | 579/999 [04:34<03:35, 1.94it/s] 58%|█████▊ | 580/999 [04:34<03:37, 1.93it/s] 58%|█████▊ | 581/999 [04:35<03:43, 1.87it/s] 58%|█████▊ | 582/999 [04:35<03:35, 1.93it/s] 58%|█████▊ | 583/999 [04:36<03:35, 1.93it/s] 58%|█████▊ | 584/999 [04:36<03:35, 1.92it/s] 59%|█████▊ | 585/999 [04:37<03:36, 1.91it/s] 59%|█████▊ | 586/999 [04:37<03:40, 1.87it/s] 59%|█████▉ | 587/999 [04:38<03:41, 1.86it/s] 59%|█████▉ | 588/999 [04:38<03:40, 1.87it/s] 59%|█████▉ | 589/999 [04:39<03:34, 1.91it/s] 59%|█████▉ | 590/999 [04:39<03:35, 1.90it/s] 59%|█████▉ | 591/999 [04:40<03:40, 1.85it/s] 59%|█████▉ | 592/999 [04:41<03:33, 1.91it/s] 59%|█████▉ | 593/999 [04:41<03:36, 1.88it/s] 59%|█████▉ | 594/999 [04:42<03:39, 1.84it/s] 60%|█████▉ | 595/999 [04:42<03:42, 1.82it/s] 60%|█████▉ | 596/999 [04:43<03:43, 1.80it/s] 60%|█████▉ | 597/999 [04:43<03:47, 1.77it/s] 60%|█████▉ | 598/999 [04:44<03:44, 1.79it/s] 60%|█████▉ | 599/999 [04:45<03:44, 1.78it/s] 60%|██████ | 600/999 [04:45<03:42, 1.80it/s] 60%|██████ | 601/999 [04:46<03:37, 1.83it/s] 60%|██████ | 602/999 [04:46<03:34, 1.85it/s] 60%|██████ | 603/999 [04:47<03:33, 1.86it/s] 60%|██████ | 604/999 [04:47<03:31, 1.87it/s] 61%|██████ | 605/999 [04:48<03:30, 1.87it/s] 61%|██████ | 606/999 [04:48<03:36, 1.82it/s] 61%|██████ | 607/999 [04:49<03:31, 1.86it/s] 61%|██████ | 608/999 [04:49<03:26, 1.89it/s] 61%|██████ | 609/999 [04:50<03:23, 1.92it/s] 61%|██████ | 610/999 [04:50<03:20, 1.94it/s] 61%|██████ | 611/999 [04:51<03:18, 1.96it/s] 61%|██████▏ | 612/999 [04:51<03:21, 1.92it/s] 61%|██████▏ | 613/999 [04:52<03:17, 1.96it/s] 61%|██████▏ | 614/999 [04:52<03:20, 1.92it/s] 62%|██████▏ | 615/999 [04:53<03:11, 2.00it/s] 62%|██████▏ | 616/999 [04:53<03:18, 1.93it/s] 62%|██████▏ | 617/999 [04:54<03:17, 1.93it/s] 62%|██████▏ | 618/999 [04:54<03:18, 1.92it/s] 62%|██████▏ | 619/999 [04:55<03:13, 1.96it/s] 62%|██████▏ | 620/999 [04:55<03:16, 1.93it/s] 62%|██████▏ | 621/999 [04:56<03:13, 1.96it/s] 62%|██████▏ | 622/999 [04:56<03:11, 1.97it/s] 62%|██████▏ | 623/999 [04:57<03:12, 1.96it/s] 62%|██████▏ | 624/999 [04:57<03:10, 1.97it/s] 63%|██████▎ | 625/999 [04:58<03:12, 1.94it/s] 63%|██████▎ | 626/999 [04:59<03:12, 1.94it/s] 63%|██████▎ | 627/999 [04:59<03:10, 1.96it/s] 63%|██████▎ | 628/999 [05:00<03:11, 1.93it/s] 63%|██████▎ | 629/999 [05:00<03:12, 1.92it/s] 63%|██████▎ | 630/999 [05:01<03:12, 1.91it/s] 63%|██████▎ | 631/999 [05:01<03:10, 1.94it/s] 63%|██████▎ | 632/999 [05:02<03:02, 2.01it/s] 63%|██████▎ | 633/999 [05:02<03:02, 2.00it/s] 63%|██████▎ | 634/999 [05:03<03:02, 2.00it/s] 64%|██████▎ | 635/999 [05:03<03:01, 2.00it/s] 64%|██████▎ | 636/999 [05:04<03:03, 1.97it/s] 64%|██████▍ | 637/999 [05:04<02:59, 2.01it/s] 64%|██████▍ | 638/999 [05:05<03:02, 1.98it/s] 64%|██████▍ | 639/999 [05:05<03:02, 1.97it/s] 64%|██████▍ | 640/999 [05:06<03:02, 1.96it/s] 64%|██████▍ | 641/999 [05:06<03:07, 1.91it/s] 64%|██████▍ | 642/999 [05:07<03:08, 1.90it/s] 64%|██████▍ | 643/999 [05:07<03:06, 1.91it/s] 64%|██████▍ | 644/999 [05:08<03:05, 1.92it/s] 65%|██████▍ | 645/999 [05:08<03:01, 1.95it/s] 65%|██████▍ | 646/999 [05:09<03:04, 1.91it/s] 65%|██████▍ | 647/999 [05:09<03:03, 1.92it/s] 65%|██████▍ | 648/999 [05:10<02:56, 1.98it/s] 65%|██████▍ | 649/999 [05:10<02:53, 2.01it/s] 65%|██████▌ | 650/999 [05:11<02:48, 2.07it/s] 65%|██████▌ | 651/999 [05:11<02:50, 2.04it/s] 65%|██████▌ | 652/999 [05:12<02:50, 2.03it/s] 65%|██████▌ | 653/999 [05:12<02:53, 1.99it/s] 65%|██████▌ | 654/999 [05:13<02:48, 2.05it/s] 66%|██████▌ | 655/999 [05:13<02:44, 2.10it/s] 66%|██████▌ | 656/999 [05:14<02:48, 2.03it/s] 66%|██████▌ | 657/999 [05:14<02:49, 2.01it/s] 66%|██████▌ | 658/999 [05:15<02:46, 2.05it/s] 66%|██████▌ | 659/999 [05:15<02:44, 2.07it/s] 66%|██████▌ | 660/999 [05:16<02:46, 2.04it/s] 66%|██████▌ | 661/999 [05:16<02:44, 2.05it/s] 66%|██████▋ | 662/999 [05:17<02:45, 2.04it/s] 66%|██████▋ | 663/999 [05:17<02:47, 2.00it/s] 66%|██████▋ | 664/999 [05:18<02:49, 1.97it/s] 67%|██████▋ | 665/999 [05:18<02:47, 2.00it/s] 67%|██████▋ | 666/999 [05:19<02:46, 1.99it/s] 67%|██████▋ | 667/999 [05:19<02:43, 2.03it/s] 67%|██████▋ | 668/999 [05:20<02:43, 2.02it/s] 67%|██████▋ | 669/999 [05:20<02:46, 1.98it/s] 67%|██████▋ | 670/999 [05:21<02:46, 1.97it/s] 67%|██████▋ | 671/999 [05:21<02:43, 2.01it/s] 67%|██████▋ | 672/999 [05:22<02:38, 2.07it/s] 67%|██████▋ | 673/999 [05:22<02:36, 2.08it/s] 67%|██████▋ | 674/999 [05:23<02:35, 2.09it/s] 68%|██████▊ | 675/999 [05:23<02:34, 2.09it/s] 68%|██████▊ | 676/999 [05:23<02:35, 2.08it/s] 68%|██████▊ | 677/999 [05:24<02:36, 2.05it/s] 68%|██████▊ | 678/999 [05:24<02:37, 2.04it/s] 68%|██████▊ | 679/999 [05:25<02:36, 2.05it/s] 68%|██████▊ | 680/999 [05:25<02:38, 2.02it/s] 68%|██████▊ | 681/999 [05:26<02:35, 2.04it/s] 68%|██████▊ | 682/999 [05:26<02:32, 2.08it/s] 68%|██████▊ | 683/999 [05:27<02:35, 2.04it/s] 68%|██████▊ | 684/999 [05:27<02:35, 2.02it/s] 69%|██████▊ | 685/999 [05:28<02:34, 2.04it/s] 69%|██████▊ | 686/999 [05:28<02:34, 2.02it/s] 69%|██████▉ | 687/999 [05:29<02:38, 1.97it/s] 69%|██████▉ | 688/999 [05:29<02:39, 1.94it/s] 69%|██████▉ | 689/999 [05:30<02:37, 1.96it/s] 69%|██████▉ | 690/999 [05:30<02:38, 1.95it/s] 69%|██████▉ | 691/999 [05:31<02:37, 1.95it/s] 69%|██████▉ | 692/999 [05:32<02:36, 1.96it/s] 69%|██████▉ | 693/999 [05:32<02:36, 1.96it/s] 69%|██████▉ | 694/999 [05:32<02:32, 1.99it/s] 70%|██████▉ | 695/999 [05:33<02:35, 1.96it/s] 70%|██████▉ | 696/999 [05:34<02:38, 1.91it/s] 70%|██████▉ | 697/999 [05:34<02:39, 1.90it/s] 70%|██████▉ | 698/999 [05:35<02:38, 1.90it/s] 70%|██████▉ | 699/999 [05:35<02:39, 1.88it/s] 70%|███████ | 700/999 [05:36<02:37, 1.90it/s] 70%|███████ | 701/999 [05:36<02:36, 1.91it/s] 70%|███████ | 702/999 [05:37<02:40, 1.85it/s] 70%|███████ | 703/999 [05:37<02:39, 1.85it/s] 70%|███████ | 704/999 [05:38<02:37, 1.87it/s] 71%|███████ | 705/999 [05:38<02:45, 1.77it/s] 71%|███████ | 706/999 [05:39<02:39, 1.84it/s] 71%|███████ | 707/999 [05:40<02:37, 1.85it/s] 71%|███████ | 708/999 [05:40<02:33, 1.89it/s] 71%|███████ | 709/999 [05:41<02:34, 1.87it/s] 71%|███████ | 710/999 [05:41<02:37, 1.83it/s] 71%|███████ | 711/999 [05:42<02:37, 1.83it/s] 71%|███████▏ | 712/999 [05:42<02:35, 1.85it/s] 71%|███████▏ | 713/999 [05:43<02:30, 1.90it/s] 71%|███████▏ | 714/999 [05:43<02:32, 1.87it/s] 72%|███████▏ | 715/999 [05:44<02:31, 1.87it/s] 72%|███████▏ | 716/999 [05:44<02:33, 1.84it/s] 72%|███████▏ | 717/999 [05:45<02:38, 1.78it/s] 72%|███████▏ | 718/999 [05:46<02:37, 1.79it/s] 72%|███████▏ | 719/999 [05:46<02:39, 1.75it/s] 72%|███████▏ | 720/999 [05:47<02:43, 1.70it/s] 72%|███████▏ | 721/999 [05:47<02:47, 1.66it/s] 72%|███████▏ | 722/999 [05:48<02:50, 1.62it/s] 72%|███████▏ | 723/999 [05:49<02:50, 1.62it/s] 72%|███████▏ | 724/999 [05:49<02:48, 1.63it/s] 73%|███████▎ | 725/999 [05:50<02:46, 1.65it/s] 73%|███████▎ | 726/999 [05:50<02:40, 1.70it/s] 73%|███████▎ | 727/999 [05:51<02:41, 1.68it/s] 73%|███████▎ | 728/999 [05:52<02:41, 1.67it/s] 73%|███████▎ | 729/999 [05:52<02:41, 1.67it/s] 73%|███████▎ | 730/999 [05:53<02:43, 1.64it/s] 73%|███████▎ | 731/999 [05:53<02:41, 1.66it/s] 73%|███████▎ | 732/999 [05:54<02:43, 1.64it/s] 73%|███████▎ | 733/999 [05:55<02:41, 1.65it/s] 73%|███████▎ | 734/999 [05:55<02:37, 1.69it/s] 74%|███████▎ | 735/999 [05:56<02:34, 1.71it/s] 74%|███████▎ | 736/999 [05:56<02:40, 1.64it/s] 74%|███████▍ | 737/999 [05:57<02:40, 1.63it/s] 74%|███████▍ | 738/999 [05:58<02:54, 1.49it/s] 74%|███████▍ | 739/999 [05:59<02:56, 1.47it/s] 74%|███████▍ | 740/999 [05:59<02:56, 1.47it/s] 74%|███████▍ | 741/999 [06:00<02:56, 1.46it/s] 74%|███████▍ | 742/999 [06:01<02:53, 1.48it/s] 74%|███████▍ | 743/999 [06:01<02:48, 1.52it/s] 74%|███████▍ | 744/999 [06:02<02:49, 1.51it/s] 75%|███████▍ | 745/999 [06:03<02:44, 1.54it/s] 75%|███████▍ | 746/999 [06:03<02:41, 1.57it/s] 75%|███████▍ | 747/999 [06:04<02:40, 1.57it/s] 75%|███████▍ | 748/999 [06:04<02:44, 1.53it/s] 75%|███████▍ | 749/999 [06:05<02:41, 1.55it/s] 75%|███████▌ | 750/999 [06:06<02:43, 1.52it/s] 75%|███████▌ | 751/999 [06:06<02:43, 1.52it/s] 75%|███████▌ | 752/999 [06:07<02:39, 1.54it/s] 75%|███████▌ | 753/999 [06:08<02:40, 1.53it/s] 75%|███████▌ | 754/999 [06:08<02:41, 1.52it/s] 76%|███████▌ | 755/999 [06:09<02:40, 1.52it/s] 76%|███████▌ | 756/999 [06:10<02:37, 1.55it/s] 76%|███████▌ | 757/999 [06:10<02:42, 1.49it/s] 76%|███████▌ | 758/999 [06:11<02:42, 1.48it/s] 76%|███████▌ | 759/999 [06:12<02:38, 1.51it/s] 76%|███████▌ | 760/999 [06:12<02:40, 1.49it/s] 76%|███████▌ | 761/999 [06:13<02:43, 1.46it/s] 76%|███████▋ | 762/999 [06:14<02:43, 1.45it/s] 76%|███████▋ | 763/999 [06:15<02:46, 1.42it/s] 76%|███████▋ | 764/999 [06:15<02:49, 1.38it/s] 77%|███████▋ | 765/999 [06:16<02:45, 1.41it/s] 77%|███████▋ | 766/999 [06:17<02:43, 1.43it/s] 77%|███████▋ | 767/999 [06:17<02:43, 1.42it/s] 77%|███████▋ | 768/999 [06:18<02:42, 1.42it/s] 77%|███████▋ | 769/999 [06:19<02:41, 1.43it/s] 77%|███████▋ | 770/999 [06:20<02:41, 1.42it/s] 77%|███████▋ | 771/999 [06:20<02:35, 1.46it/s] 77%|███████▋ | 772/999 [06:21<02:32, 1.49it/s] 77%|███████▋ | 773/999 [06:21<02:31, 1.50it/s] 77%|███████▋ | 774/999 [06:22<02:32, 1.48it/s] 78%|███████▊ | 775/999 [06:23<02:30, 1.49it/s] 78%|███████▊ | 776/999 [06:23<02:31, 1.47it/s] 78%|███████▊ | 777/999 [06:24<02:31, 1.47it/s] 78%|███████▊ | 778/999 [06:25<02:33, 1.44it/s] 78%|███████▊ | 779/999 [06:26<02:29, 1.47it/s] 78%|███████▊ | 780/999 [06:26<02:27, 1.48it/s] 78%|███████▊ | 781/999 [06:27<02:30, 1.44it/s] 78%|███████▊ | 782/999 [06:28<02:29, 1.46it/s] 78%|███████▊ | 783/999 [06:28<02:29, 1.45it/s] 78%|███████▊ | 784/999 [06:29<02:28, 1.45it/s] 79%|███████▊ | 785/999 [06:30<02:32, 1.41it/s] 79%|███████▊ | 786/999 [06:31<02:35, 1.37it/s] 79%|███████▉ | 787/999 [06:31<02:32, 1.39it/s] 79%|███████▉ | 788/999 [06:32<02:31, 1.39it/s] 79%|███████▉ | 789/999 [06:33<02:30, 1.39it/s] 79%|███████▉ | 790/999 [06:33<02:29, 1.39it/s] 79%|███████▉ | 791/999 [06:34<02:25, 1.43it/s] 79%|███████▉ | 792/999 [06:35<02:22, 1.45it/s] 79%|███████▉ | 793/999 [06:35<02:20, 1.47it/s] 79%|███████▉ | 794/999 [06:36<02:21, 1.45it/s] 80%|███████▉ | 795/999 [06:37<02:17, 1.48it/s] 80%|███████▉ | 796/999 [06:37<02:17, 1.48it/s] 80%|███████▉ | 797/999 [06:38<02:17, 1.47it/s] 80%|███████▉ | 798/999 [06:39<02:20, 1.43it/s] 80%|███████▉ | 799/999 [06:40<02:24, 1.38it/s] 80%|████████ | 800/999 [06:40<02:26, 1.36it/s] 80%|████████ | 801/999 [06:41<02:24, 1.37it/s] 80%|████████ | 802/999 [06:42<02:23, 1.37it/s] 80%|████████ | 803/999 [06:43<02:24, 1.36it/s] 80%|████████ | 804/999 [06:43<02:25, 1.34it/s] 81%|████████ | 805/999 [06:44<02:24, 1.34it/s] 81%|████████ | 806/999 [06:45<02:23, 1.34it/s] 81%|████████ | 807/999 [06:46<02:20, 1.37it/s] 81%|████████ | 808/999 [06:46<02:17, 1.38it/s] 81%|████████ | 809/999 [06:47<02:15, 1.40it/s] 81%|████████ | 810/999 [06:48<02:11, 1.44it/s] 81%|████████ | 811/999 [06:48<02:11, 1.43it/s] 81%|████████▏ | 812/999 [06:49<02:10, 1.43it/s] 81%|████████▏ | 813/999 [06:50<02:10, 1.42it/s] 81%|████████▏ | 814/999 [06:50<02:13, 1.39it/s] 82%|████████▏ | 815/999 [06:51<02:15, 1.36it/s] 82%|████████▏ | 816/999 [06:52<02:16, 1.34it/s] 82%|████████▏ | 817/999 [06:53<02:16, 1.33it/s] 82%|████████▏ | 818/999 [06:54<02:14, 1.35it/s] 82%|████████▏ | 819/999 [06:54<02:17, 1.31it/s] 82%|████████▏ | 820/999 [06:55<02:15, 1.32it/s] 82%|████████▏ | 821/999 [06:56<02:13, 1.33it/s] 82%|████████▏ | 822/999 [06:57<02:10, 1.35it/s] 82%|████████▏ | 823/999 [06:57<02:09, 1.35it/s] 82%|████████▏ | 824/999 [06:58<02:09, 1.35it/s] 83%|████████▎ | 825/999 [06:59<02:10, 1.33it/s] 83%|████████▎ | 826/999 [06:59<02:06, 1.37it/s] 83%|████████▎ | 827/999 [07:00<02:01, 1.42it/s] 83%|████████▎ | 828/999 [07:01<02:00, 1.41it/s] 83%|████████▎ | 829/999 [07:02<02:01, 1.39it/s] 83%|████████▎ | 830/999 [07:02<01:59, 1.42it/s] 83%|████████▎ | 831/999 [07:03<01:56, 1.44it/s] 83%|████████▎ | 832/999 [07:04<01:56, 1.43it/s] 83%|████████▎ | 833/999 [07:04<01:51, 1.48it/s] 83%|████████▎ | 834/999 [07:05<01:49, 1.51it/s] 84%|████████▎ | 835/999 [07:06<01:50, 1.48it/s] 84%|████████▎ | 836/999 [07:06<01:50, 1.48it/s] 84%|████████▍ | 837/999 [07:07<01:51, 1.45it/s] 84%|████████▍ | 838/999 [07:08<01:51, 1.44it/s] 84%|████████▍ | 839/999 [07:08<01:51, 1.43it/s] 84%|████████▍ | 840/999 [07:09<01:50, 1.44it/s] 84%|████████▍ | 841/999 [07:10<01:48, 1.46it/s] 84%|████████▍ | 842/999 [07:10<01:47, 1.46it/s] 84%|████████▍ | 843/999 [07:11<01:45, 1.48it/s] 84%|████████▍ | 844/999 [07:12<01:43, 1.50it/s] 85%|████████▍ | 845/999 [07:12<01:40, 1.53it/s] 85%|████████▍ | 846/999 [07:13<01:43, 1.48it/s] 85%|████████▍ | 847/999 [07:14<01:42, 1.49it/s] 85%|████████▍ | 848/999 [07:14<01:41, 1.48it/s] 85%|████████▍ | 849/999 [07:15<01:42, 1.46it/s] 85%|████████▌ | 850/999 [07:16<01:40, 1.48it/s] 85%|████████▌ | 851/999 [07:16<01:41, 1.46it/s] 85%|████████▌ | 852/999 [07:17<01:40, 1.46it/s] 85%|████████▌ | 853/999 [07:18<01:38, 1.49it/s] 85%|████████▌ | 854/999 [07:18<01:34, 1.53it/s] 86%|████████▌ | 855/999 [07:19<01:34, 1.52it/s] 86%|████████▌ | 856/999 [07:20<01:32, 1.55it/s] 86%|████████▌ | 857/999 [07:20<01:29, 1.58it/s] 86%|████████▌ | 858/999 [07:21<01:29, 1.57it/s] 86%|████████▌ | 859/999 [07:22<01:29, 1.57it/s] 86%|████████▌ | 860/999 [07:22<01:31, 1.52it/s] 86%|████████▌ | 861/999 [07:23<01:32, 1.50it/s] 86%|████████▋ | 862/999 [07:24<01:29, 1.54it/s] 86%|████████▋ | 863/999 [07:24<01:29, 1.52it/s] 86%|████████▋ | 864/999 [07:25<01:30, 1.48it/s] 87%|████████▋ | 865/999 [07:26<01:31, 1.47it/s] 87%|████████▋ | 866/999 [07:26<01:30, 1.48it/s] 87%|████████▋ | 867/999 [07:27<01:30, 1.46it/s] 87%|████████▋ | 868/999 [07:28<01:27, 1.50it/s] 87%|████████▋ | 869/999 [07:28<01:26, 1.51it/s] 87%|████████▋ | 870/999 [07:29<01:24, 1.53it/s] 87%|████████▋ | 871/999 [07:30<01:24, 1.51it/s] 87%|████████▋ | 872/999 [07:30<01:24, 1.50it/s] 87%|████████▋ | 873/999 [07:31<01:24, 1.48it/s] 87%|████████▋ | 874/999 [07:32<01:23, 1.50it/s] 88%|████████▊ | 875/999 [07:32<01:23, 1.49it/s] 88%|████████▊ | 876/999 [07:33<01:22, 1.48it/s] 88%|████████▊ | 877/999 [07:34<01:23, 1.47it/s] 88%|████████▊ | 878/999 [07:34<01:22, 1.47it/s] 88%|████████▊ | 879/999 [07:35<01:21, 1.47it/s] 88%|████████▊ | 880/999 [07:36<01:20, 1.47it/s] 88%|████████▊ | 881/999 [07:36<01:20, 1.47it/s] 88%|████████▊ | 882/999 [07:37<01:20, 1.46it/s] 88%|████████▊ | 883/999 [07:38<01:18, 1.47it/s] 88%|████████▊ | 884/999 [07:38<01:17, 1.48it/s] 89%|████████▊ | 885/999 [07:39<01:15, 1.52it/s] 89%|████████▊ | 886/999 [07:40<01:14, 1.51it/s] 89%|████████▉ | 887/999 [07:40<01:14, 1.51it/s] 89%|████████▉ | 888/999 [07:41<01:16, 1.46it/s] 89%|████████▉ | 889/999 [07:42<01:14, 1.48it/s] 89%|████████▉ | 890/999 [07:42<01:12, 1.50it/s] 89%|████████▉ | 891/999 [07:43<01:10, 1.54it/s] 89%|████████▉ | 892/999 [07:44<01:08, 1.56it/s] 89%|████████▉ | 893/999 [07:44<01:07, 1.57it/s] 89%|████████▉ | 894/999 [07:45<01:07, 1.56it/s] 90%|████████▉ | 895/999 [07:46<01:06, 1.56it/s] 90%|████████▉ | 896/999 [07:46<01:05, 1.57it/s] 90%|████████▉ | 897/999 [07:47<01:05, 1.57it/s] 90%|████████▉ | 898/999 [07:48<01:04, 1.56it/s] 90%|████████▉ | 899/999 [07:48<01:03, 1.57it/s] 90%|█████████ | 900/999 [07:49<01:02, 1.57it/s] 90%|█████████ | 901/999 [07:49<01:02, 1.56it/s] 90%|█████████ | 902/999 [07:50<01:02, 1.56it/s] 90%|█████████ | 903/999 [07:51<01:00, 1.58it/s] 90%|█████████ | 904/999 [07:51<01:00, 1.58it/s] 91%|█████████ | 905/999 [07:52<01:00, 1.55it/s] 91%|█████████ | 906/999 [07:53<00:59, 1.56it/s] 91%|█████████ | 907/999 [07:53<00:58, 1.56it/s] 91%|█████████ | 908/999 [07:54<00:57, 1.57it/s] 91%|█████████ | 909/999 [07:55<00:58, 1.54it/s] 91%|█████████ | 910/999 [07:55<00:59, 1.51it/s] 91%|█████████ | 911/999 [07:56<00:58, 1.51it/s] 91%|█████████▏| 912/999 [07:57<00:58, 1.50it/s] 91%|█████████▏| 913/999 [07:57<00:57, 1.49it/s] 91%|█████████▏| 914/999 [07:58<00:56, 1.52it/s] 92%|█████████▏| 915/999 [07:59<00:55, 1.51it/s] 92%|█████████▏| 916/999 [07:59<00:55, 1.51it/s] 92%|█████████▏| 917/999 [08:00<00:54, 1.49it/s] 92%|█████████▏| 918/999 [08:01<00:54, 1.49it/s] 92%|█████████▏| 919/999 [08:01<00:53, 1.48it/s] 92%|█████████▏| 920/999 [08:02<00:52, 1.51it/s] 92%|█████████▏| 921/999 [08:03<00:50, 1.55it/s] 92%|█████████▏| 922/999 [08:03<00:49, 1.56it/s] 92%|█████████▏| 923/999 [08:04<00:48, 1.56it/s] 92%|█████████▏| 924/999 [08:04<00:47, 1.57it/s] 93%|█████████▎| 925/999 [08:05<00:47, 1.56it/s] 93%|█████████▎| 926/999 [08:06<00:47, 1.55it/s] 93%|█████████▎| 927/999 [08:06<00:46, 1.54it/s] 93%|█████████▎| 928/999 [08:07<00:46, 1.54it/s] 93%|█████████▎| 929/999 [08:08<00:45, 1.53it/s] 93%|█████████▎| 930/999 [08:08<00:45, 1.53it/s] 93%|█████████▎| 931/999 [08:09<00:44, 1.53it/s] 93%|█████████▎| 932/999 [08:10<00:43, 1.54it/s] 93%|█████████▎| 933/999 [08:10<00:43, 1.52it/s] 93%|█████████▎| 934/999 [08:11<00:42, 1.53it/s] 94%|█████████▎| 935/999 [08:12<00:41, 1.55it/s] 94%|█████████▎| 936/999 [08:12<00:40, 1.54it/s] 94%|█████████▍| 937/999 [08:13<00:39, 1.56it/s] 94%|█████████▍| 938/999 [08:13<00:37, 1.61it/s] 94%|█████████▍| 939/999 [08:14<00:37, 1.58it/s] 94%|█████████▍| 940/999 [08:15<00:36, 1.60it/s] 94%|█████████▍| 941/999 [08:15<00:35, 1.62it/s] 94%|█████████▍| 942/999 [08:16<00:35, 1.60it/s] 94%|█████████▍| 943/999 [08:17<00:35, 1.59it/s] 94%|█████████▍| 944/999 [08:17<00:34, 1.58it/s] 95%|█████████▍| 945/999 [08:18<00:34, 1.58it/s] 95%|█████████▍| 946/999 [08:19<00:33, 1.59it/s] 95%|█████████▍| 947/999 [08:19<00:30, 1.68it/s] 95%|█████████▍| 948/999 [08:20<00:30, 1.65it/s] 95%|█████████▍| 949/999 [08:20<00:30, 1.65it/s] 95%|█████████▌| 950/999 [08:21<00:30, 1.62it/s] 95%|█████████▌| 951/999 [08:22<00:30, 1.56it/s] 95%|█████████▌| 952/999 [08:22<00:30, 1.52it/s] 95%|█████████▌| 953/999 [08:23<00:30, 1.51it/s] 95%|█████████▌| 954/999 [08:24<00:30, 1.46it/s] 96%|█████████▌| 955/999 [08:24<00:30, 1.45it/s] 96%|█████████▌| 956/999 [08:25<00:29, 1.45it/s] 96%|█████████▌| 957/999 [08:26<00:29, 1.43it/s] 96%|█████████▌| 958/999 [08:27<00:28, 1.43it/s] 96%|█████████▌| 959/999 [08:27<00:28, 1.42it/s] 96%|█████████▌| 960/999 [08:28<00:26, 1.45it/s] 96%|█████████▌| 961/999 [08:29<00:26, 1.44it/s] 96%|█████████▋| 962/999 [08:29<00:25, 1.44it/s] 96%|█████████▋| 963/999 [08:30<00:25, 1.41it/s] 96%|█████████▋| 964/999 [08:31<00:25, 1.37it/s] 97%|█████████▋| 965/999 [08:32<00:24, 1.39it/s] 97%|█████████▋| 966/999 [08:32<00:23, 1.41it/s] 97%|█████████▋| 967/999 [08:33<00:22, 1.44it/s] 97%|█████████▋| 968/999 [08:34<00:21, 1.45it/s] 97%|█████████▋| 969/999 [08:34<00:21, 1.41it/s] 97%|█████████▋| 970/999 [08:35<00:20, 1.44it/s] 97%|█████████▋| 971/999 [08:36<00:19, 1.44it/s] 97%|█████████▋| 972/999 [08:36<00:18, 1.42it/s] 97%|█████████▋| 973/999 [08:37<00:18, 1.42it/s] 97%|█████████▋| 974/999 [08:38<00:18, 1.35it/s] 98%|█████████▊| 975/999 [08:39<00:17, 1.36it/s] 98%|█████████▊| 976/999 [08:39<00:16, 1.41it/s] 98%|█████████▊| 977/999 [08:40<00:16, 1.36it/s] 98%|█████████▊| 978/999 [08:41<00:15, 1.34it/s] 98%|█████████▊| 979/999 [08:42<00:14, 1.37it/s] 98%|█████████▊| 980/999 [08:42<00:13, 1.40it/s] 98%|█████████▊| 981/999 [08:43<00:13, 1.38it/s] 98%|█████████▊| 982/999 [08:44<00:12, 1.38it/s] 98%|█████████▊| 983/999 [08:44<00:11, 1.41it/s] 98%|█████████▊| 984/999 [08:45<00:10, 1.40it/s] 99%|█████████▊| 985/999 [08:46<00:10, 1.39it/s] 99%|█████████▊| 986/999 [08:46<00:09, 1.43it/s] 99%|█████████▉| 987/999 [08:47<00:08, 1.42it/s] 99%|█████████▉| 988/999 [08:48<00:07, 1.40it/s] 99%|█████████▉| 989/999 [08:49<00:07, 1.42it/s] 99%|█████████▉| 990/999 [08:49<00:06, 1.43it/s] 99%|█████████▉| 991/999 [08:50<00:05, 1.41it/s] 99%|█████████▉| 992/999 [08:51<00:04, 1.42it/s] 99%|█████████▉| 993/999 [08:51<00:04, 1.38it/s] 99%|█████████▉| 994/999 [08:52<00:03, 1.39it/s]100%|█████████▉| 995/999 [08:53<00:02, 1.42it/s]100%|█████████▉| 996/999 [08:54<00:02, 1.41it/s]100%|█████████▉| 997/999 [08:54<00:01, 1.39it/s]100%|█████████▉| 998/999 [08:55<00:00, 1.34it/s]100%|██████████| 999/999 [08:56<00:00, 1.39it/s]100%|██████████| 999/999 [08:56<00:00, 1.86it/s]
plt.figure(figsize=(10, 6))
plt.scatter(quantiles_theoriques, quantiles_empiriques)
plt.plot(quantiles_theoriques, quantiles_theoriques, color='red', label='Première bissectrice')
plt.title('QQ Plot - Quantiles empiriques vs Quantiles théoriques')
plt.xlabel('Quantiles théoriques (distribution Skew Student)')
plt.ylabel('Quantiles empiriques')
plt.grid(True)
plt.show()
# # kstest y revenir
# ks_stat, ks_p_value = kstest(data_train, skew_student_pdf, args=(**params_sstd,))
# print("="*80)
# print("H0 : Les données suivent une loi de Skew Student")
# print(f"Statistique de test : {ks_stat:.4f}")
# print(f"P-value : {ks_p_value:.4f}")
# print("="*80)
# A revoirII.4.2. Calcul de la VaR Skew Student
# Objectif : écrire une fonction qui calcule la VaR skew-student
def sstd_var_fct(alpha, params):
"""
Calcul de la VaR skew student
data : les rendements logarithmiques
alpha : le niveau de confiance
"""
return -skew_student_quantile(1-alpha, **params)sstd_var = sstd_var_fct(alpha, params_sstd)
print(f"La VaR skew student pour h=1j et alpha={alpha} est : {sstd_var:.4%}")La VaR skew student pour h=1j et alpha=0.99 est : 4.2575%
III. Implémentation de l’ES
L’expected shortfall (ES) est une mesure de risque qui donne une estimation de la perte moyenne au-delà du seuil de la VaR. Par exemple, un ES à 5% sur 1 jour de 1000 euros signifie que si la perte dépasse 1000 euros, alors la perte moyenne sera de 1500 euros. L’ES est une mesure plus robuste que la VaR, car elle prend en compte les queues de distribution et est particulièrement utile pour évaluer les risques extrêmes. Elle est définie comme suit :
\[ES_{\alpha}(h) = E(PnL | PnL \leq -VaR_{\alpha}(h))\]
/! La ES du cours est différente de celle ci. Elle est définie comme suit : \[ES_{\alpha}(h) = E(PnL - VaR | PnL \leq -VaR_{\alpha}(h)) = CTE - VaR\]
Voir ce qui est fait dans le cadre réglementaire.
# Expected Shortfall pour la VaR historique, bootstrap et gaussienne, et skew-student
def expected_shortfall(data, var):
"""
Calcul de l'Expected Shortfall
data : les rendements logarithmiques
var : la VaR
"""
return -data[data < -var].mean()
es_hist_train = expected_shortfall(data_train, var_hist_train)
es_bs_train = expected_shortfall(data_train, var_bs_train)
es_gauss_train = expected_shortfall(data_train, var_gauss_train)
es_sstd_train = expected_shortfall(data_train, sstd_var)
# in a df
es = pd.DataFrame({
'Historique': [es_hist_train],
'Bootstrap': [es_bs_train],
'Gaussienne': [es_gauss_train],
'Skew Student': [es_sstd_train]
})
print("="*80)
print("Expected Shortfall empirique (en %) pour h=1j")
print(round(100*es,2))
print("="*80)================================================================================
Expected Shortfall empirique (en %) pour h=1j
Historique Bootstrap Gaussienne Skew Student
0 5.47 5.51 4.47 5.68
================================================================================
import scipy.stats as stats
import scipy.integrate as integrate
def expected_shortfall_theoretical(alpha, quantile_function, density_function,params):
"""
Computes the Expected Shortfall (Conditional VaR) for a given distribution.
Parameters:
- alpha (float): Confidence level (e.g., 0.99 for 99%)
- quantile_function (callable): Function to compute quantiles (e.g., skew_student_quantile)
- params (dict): Parameters of the distribution
Returns:
- float: Expected Shortfall value
"""
# Compute the Value at Risk (VaR) at level alpha
var_alpha = quantile_function(1-alpha, **params)
# Expected Shortfall integral
integral_value, _ = integrate.quad(lambda x: x * density_function(x, **params), -float("inf"), var_alpha)
# Compute Expected Shortfall
es_alpha = -integral_value / (1 - alpha)
return es_alpha
# Compute Expected Shortfall using the corrected function
alpha = 0.99
es_sstd_theoretical = expected_shortfall_theoretical(alpha,skew_student_quantile,skew_student_pdf, params_sstd)
params_norm = {
"loc" : np.mean(data_train),
"scale" : np.std(data_train)
}
es_gauss_theoretical = expected_shortfall_theoretical(alpha,stats.norm.ppf,stats.norm.pdf, params_norm)
es_theoretical = pd.DataFrame({
'Gaussienne': [es_gauss_theoretical],
'Skew Student': [es_sstd_theoretical]
})
print("="*80)
print("Expected Shortfall théorique (en %) pour h=1j")
print(round(100*es_theoretical,2))
print("="*80)================================================================================
Expected Shortfall théorique (en %) pour h=1j
Gaussienne Skew Student
0 3.7 6.71
================================================================================
IV.Protocole de Backtesting
L’exercice de backtesting consiste à vérifier la capacité d’adaptation du modèle et sa viabilité en dehors de son cadre d’entraînement. Il permet d’évaluer la performance des modèles dans le temps. Idéalement, il faudrait le realiser quotidiennement afin d’évaluer s’il est utile ou non de recalibrer le modèle.
Dans le cadre de TP, nous n’avons pas observé d’exceptions avec l’utilisation de la VaR historique. Cela est probablement du à la période d’apprentissage trop stricte. Notre modèle était donc trop restrictif/conservateur ce qui peut témoigner de son incapacité d’adaptation. Pour ce faire, il aurait été necessaire de le recalibrer.
Sachant que les modèles sont évalués quotidiennement, à quel moment doit-on considérer qu’il est nécessaire de recalibrer le modèle ? Quels indicateurs pourrait-on mettre en place pour déterminer si tout est sous contrôle (VaR trop haute, trop basse) ou si un recalibrage est requis, sachant que le modèle est backtesté chaque jour ?
Pour repondre à ces questions, nous proposons le protocole de backtest ci-dessous :
Dans la réglementation baloise, il est demandé de tester les performances de la VaR sur les 250 jours suivants la date de réalisation du modèle. Dans ces 250 jours, on est censé observé 2 à 3 exceptions, soit 1%. Lorsqu’il n’y a aucune exception sur cette période de temps, nous jugerons que le modèle est mal calibré.
Lorsqu’il y a des exceptions, nous pouvons comparer ces exceptions théoriques aux exceptions observées à l’aide d’un test de Kupiec/Unconditionnal coverage [1], une variante du test binomiale qui permet de tester sous l’hypothèse nulle que le taux d’exception(p) est égal au niveau de confiance de la VaR (1-\(\alpha\)). La statistique de test suit une loi de khi-deux à 1 degré de liberté. Lorsque cette hypothèse est rejetée, cela signifie que le modèle est mal calibré. En effet, si une banque a trop d’exceptions, i.e. \(p \geq 1 - \alpha\), cela signifie que son modèle sous-estime le risque, ce qui peut conduire à une exigence de recalibrage ou une augmentation du capital réglementaire. Si une banque a trop peu d’exceptions (voire 0), i.e. \(p \leq 1 - \alpha\), cela peut indiquer que son modèle est trop conservateur, ce qui immobilise trop de capital inutilement.
Puisqu’un seul test de backtesting n’est pas suffisant[2] pour juger la qualité d’un modèle de VaR, il serait préférable de combiner différentes méthodes. Pour ce faire, un autre test a été utilisé pour juger de la necessité de recalibrage du modèle. Il s’agit du test de Christoffersen’s Interval Forecast/Independance test [3]. Ce test permet de vérifier si les exceptions sont indépendantes et donc bien réparties dans le temps. En effet, si les exceptions sont concentrées dans un intervalle de temps, cela peut indiquer que le modèle est mal calibré. Sous l’hypothèse nulle, la statistique de test suit asymptotiquement une loi de khi-deux à 1 degré de liberté.
En couplant le test de Kupiec au test de Christoffersen [3], nous avons le test de conditional coverage mixte[3] qui suit une loi de khi-deux à 2 degrés de liberté.
Pour la mise en place de ces tests statistiques, nous avons besoin d’une échantillon de taille suffisamment grande, i.e \(N=30\). Pour ce faire, nous ne pourrons mettre en place ce protocole qu’à partir du 30ème jour de backtesting. Pour le backtest, nous avons fait le choix d’utiliser un expanding window, i.e. une fenêtre d’apprentissage qui s’agrandit à chaque période de recalibrage. Il aurait été plus pertinent de privilégier un rolling window, i.e. une fenêtre d’apprentissage qui se déplace à chaque période de recalibrage, pour éviter de bruiter les données.
PROBLÈME : au bout de 30j, s’il n’y a pas d’exceptions, on ne recalibre pas le modèle mais si au 31e jour il y a une exception, le test de kupiec echoue=> recalibrage. References: - [1] Kupiec, P. “Techniques for Verifying the Accuracy of Risk Management Models.” Journal of Derivatives. Vol. 3, 1995, pp. 73–84. - [2] Haas, M. “New Methods in Backtesting.” Financial Engineering, Research Center Caesar, Bonn, 2001. - [3] Christoffersen, P. “Evaluating Interval Forecasts.” International Economic Review. Vol. 39, 1998, pp. 841–862.
import numpy as np
import pandas as pd
from scipy.stats import chi2
class Backtest:
def __init__(self, actual, forecast, alpha, alpha_test):
self.index = actual.index
self.actual = actual.values
self.forecast = forecast
self.alpha = alpha
self.alpha_test = alpha_test
def hit_series(self):
""" Returns a series of 1s (VaR breaches) and 0s (no breach) """
return (self.actual < - self.forecast).astype(int)
def lr_bt(self):
""" Back-test protocol """
hits = self.hit_series() # Série des violations de la VaR (1 si violation, 0 sinon)
transitions = hits[1:] - hits[:-1] # Différences entre valeurs successives (1 si passage de 0 à 1, -1 si passage de 1 à 0)
# Transition counts
n01 = np.sum(transitions == 1) # 0 -> 1
n10 = np.sum(transitions == -1) # 1 -> 0
n11 = np.sum((transitions == 0) & (hits[1:] == 1)) # 1 -> 1
n00 = np.sum((transitions == 0) & (hits[1:] == 0)) # 0 -> 0
# Number of observations in each state
n0, n1 = n01 + n00, n10 + n11
total_n = n0 + n1
# Probability estimates
p01 = n01 / (n00 + n01) if (n00 + n01) > 0 else 0
p11 = n11 / (n11 + n10) if (n11 + n10) > 0 else 0
p = n1 / total_n if total_n > 0 else 0
if n1 > 0:
#
# Unconditional Coverage Test/Kupiec
uc_h0 = n0 * np.log(1 - self.alpha) + n1 * np.log(self.alpha)
uc_h1 = n0 * np.log(1 - p) + n1 * np.log(p)
uc_stat = -2 * (uc_h0 - uc_h1)
# uc_critical_val = chi2.ppf(self.alpha_test, 1)
uc_pval = 1 - chi2.cdf(uc_stat, 1)
# Independence Test/Christoffersen
ind_h0 = (n00 + n01) * np.log(1 - p) + (n01 + n11) * np.log(p)
ind_h1 = 0
if p01 > 0: ind_h1 += n01 * np.log(p01)
if (1 - p01) > 0: ind_h1 += n00 * np.log(1 - p01)
if p11 > 0: ind_h1 += n11 * np.log(p11)
if (1 - p11) > 0: ind_h1 += n10 * np.log(1 - p11)
ind_stat = -2 * (ind_h0 - ind_h1)
# ind_critical_val = chi2.ppf(self.alpha_test, 1)
ind_pval = 1 - chi2.cdf(ind_stat, 1)
# Conditional Coverage Test/ Christoffersen & Kupiec mixture
cc_stat = uc_stat + ind_stat
# cc_critical_val = chi2.ppf(self.alpha_test, 2)
cc_pval = 1 - chi2.cdf(cc_stat, 2)
# Store results in a DataFrame
df = pd.DataFrame({
"Statistic": [uc_stat, cc_stat, ind_stat],
# "Critical Value": [uc_critical_val, ind_critical_val, cc_critical_val],
"p-value": [uc_pval, cc_pval, ind_pval]
}, index=["Unconditional", "Conditional","Independence"])
binomial_test = stats.binomtest(n1, total_n, 1-self.alpha, alternative='two-sided')
df.loc["Binomial"] = [binomial_test.statistic, binomial_test.pvalue]
else:
df = pd.DataFrame(np.nan, index=["Unconditional", "Conditional", "Independence"], columns=["Statistic", "p-value"])
binomial_test = stats.binomtest(n1, total_n, 1-self.alpha, alternative='two-sided')
df.loc["Binomial"] = [binomial_test.statistic, binomial_test.pvalue]
return dfdef daily_backtest(actual, forecast, alpha=0.99, alpha_test = 0.95,min_days=30, max_days=250):
""" Runs a growing backtest daily, starting at min_days up to max_days """
recalibration_needed = False
end_test = min(max_days,len(actual))
for end in range(min_days, end_test +1):
data_to_test = actual[:end]
var_to_test = forecast
if len(data_to_test) < 30:
continue
bt = Backtest(actual=data_to_test, forecast=var_to_test, alpha=alpha, alpha_test=alpha_test)
result = bt.lr_bt()
nb_exceptions = bt.hit_series().sum()
# res=bootstrap((data_to_test,), statistic=lambda x: exceptions(x, var_to_test)/len(x), method='percentile', n_resamples=1000)
# ci_lower, ci_upper = res.confidence_interval
# if ci_lower <= 1-alpha <= ci_upper:
# print(f"Recalibration needed at {end} days: The conditional test failed.")
# recalibration_needed = True
# return recalibration_needed, end
# if "conditional" in result.index and result.loc["Independence", "p-value"] < 0.05:
# print(f"Recalibration needed at {end} days: The Independence test failed.")
# recalibration_needed = True
# return recalibration_needed, end
# failed_tests = result.iloc[2:][result.iloc[2:]["p-value"] < 0.05].index.tolist()
failed_tests = result[result["p-value"] < 0.05].index.tolist()
if failed_tests:
print(f"Recalibration needed at {end} days: The following tests failed: {', '.join(failed_tests)}")
recalibration_needed = True
return recalibration_needed, end
if end == max_days and nb_exceptions == 0:
print(f"Recalibration needed at {end} days: No exceptions observed in the test window.")
recalibration_needed = True
return recalibration_needed, end
if not recalibration_needed:
print("No recalibration needed in the tested period.")def iterative_backtest(data_train, data_test, var_model, alpha):
""" Runs an iterative backtest with recalibration """
data_train = data_train.copy()
data_test = data_test.copy()
var_result = var_model(data_train, alpha=alpha)
var_to_test = var_result[0] if isinstance(var_result, (list, tuple)) else var_result
recalibration_points = [0]
vars_stored = [var_to_test]
while len(data_test) > 0 and len(data_test) >= 250:
print("="*80)
print(f"Old VaR to test: {var_to_test:.4%}")
# Run daily backtest correctly
res_backtest, index = daily_backtest(data_test, var_to_test, alpha=alpha, alpha_test=0.95, min_days=30, max_days=250)
# Find the index of recalibration
if res_backtest:
print(len(data_test))
recalibration_points.append(index)
# Expand training data and shrink test data
data_train = pd.concat([data_train, data_test.iloc[:index,]])
data_test = data_test.iloc[index:,]
var_result = var_model(data_train, alpha=alpha)
var_to_test = var_result[0] if isinstance(var_result, (list, tuple)) else var_result
vars_stored.append(var_to_test)
print(f"New VaR to test: {var_to_test:.4%}")
else:
print("No recalibration needed.")
break
return recalibration_points, vars_stored
# Execute iterative backtest
recalibration_points, vars_stored = iterative_backtest(data_train, data_test, gaussian_var_ewma, alpha=alpha)================================================================================
Old VaR to test: 2.7763%
Recalibration needed at 103 days: The following tests failed: Unconditional, Conditional
586
New VaR to test: 2.5925%
================================================================================
Old VaR to test: 2.5925%
Recalibration needed at 61 days: The following tests failed: Unconditional, Conditional
483
New VaR to test: 2.6675%
================================================================================
Old VaR to test: 2.6675%
Recalibration needed at 30 days: The following tests failed: Unconditional, Conditional
422
New VaR to test: 1.8885%
================================================================================
Old VaR to test: 1.8885%
Recalibration needed at 50 days: The following tests failed: Unconditional, Conditional
392
New VaR to test: 2.5369%
================================================================================
Old VaR to test: 2.5369%
Recalibration needed at 240 days: The following tests failed: Unconditional, Conditional
342
New VaR to test: 2.7075%
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(12, 6))
data_test.reset_index(drop=True, inplace=True)
plt.plot(data_test, label="Returns", color='blue')
recab = np.cumsum(np.array(recalibration_points))
vars_stored_neg = -np.array(vars_stored)
plt.scatter(recab, vars_stored_neg, color='black', label="Recalibration points", zorder=3)
if len(recab) > 0:
plt.step(recab, vars_stored_neg, where='post', color='red', linestyle='solid', label="VaR Adjusted")
plt.hlines(vars_stored_neg[-1], xmin=recab[-1], xmax=len(data_test), color='red', linestyle='solid')
plt.xlabel("Time")
plt.ylabel("VaR / Returns")
plt.title("Backtesting VaR with Recalibration Points")
plt.legend()
plt.grid(True)
plt.show()