Quand des voisins partagent une étiquette
Supposons que l'étiquette du jour t soit le rendement de la clôture du jour t à celle du jour t+h, avec h=5. Alors les étiquettes du jour t et du jour t+1 partagent quatre de leurs cinq rendements quotidiens : ce sont presque le même nombre. Un K-fold qui met le jour t dans l'entraînement et le jour t+1 dans le test laisse le modèle voir la réponse sur laquelle on le teste. Un modèle flexible, comme les plus proches voisins, paraît alors compétent en se contentant de se souvenir. La fuite a une forme précise : l'étiquette de la ligne i n'est connue qu'à la ligne i+h, donc la ligne i chevauche un bloc de test [t₀,t₁] quand i+h≥t₀ et i≤t₁.
La purge retire toute ligne d'entraînement qui chevauche le bloc de test. L'embargo retire encore quelques lignes juste après le bloc, car des variables lentes comme un rendement sur 20 jours continuent de transporter de l'information vers l'avant. Un découpeur pour scikit-learn est tout objet avec split(X), qui produit des tableaux d'indices (train, test), et get_n_splits() ; on peut alors le passer en cv= à cross_val_score ou GridSearchCV. Sur 5 340 jours de SPY avec quatre variables lentes et une étiquette à cinq jours, un modèle de plus proches voisins a un R carré de 0,039 avec des plis mélangés et de -0,36 avec des plis purgés. Le modèle n'a aucune compétence, et le chiffre mélangé est la fuite qui parle. Un K-fold simple non mélangé est bien meilleur, mais compte encore 120 paires chevauchantes aux quatre frontières ; le découpeur purgé n'en a aucune.
- Des étiquettes qui se chevauchent mettent des quasi-copies des deux côtés du découpage ; le K-fold mélangé récompense alors la mémoire.
- Purgez les lignes avec i+h≥t₀ et i≤t₁ ; embargo sur quelques lignes après t₁.
- Un découpeur n'est que
splitetget_n_splits: tout objet qui a les deux fonctionne encv=.
Lab : ce qui est noté
- Purge et embargo25 pts
- Le découpeur25 pts
- L'évaluateur10 pts
- Compter les chevauchements15 pts
- L'étude de la fuite25 pts