Lab

M/05 · Variété des stratégies

Géométrie PCA + UMAP de la population de stratégies

Plonger 100 000 stratégies en fenêtre glissante d'un espace métrique 90-D vers 2-D, puis se demander si la robustesse est une région contiguë ou une constellation d'îlots isolés.

Les mathématiques

Chaque stratégie est un point x ∈ ℝᵈ dans un espace de features de haute dimension dont les composantes sont (Sharpe, PF, MaxDD) par fenêtre sur les 6 dernières fenêtres glissantes, évaluées sous la suite de perturbations propriétaire de Daru Finance. Avec N = 100 000 stratégies, nous avons une matrice N × d X. Nous demandons : dans cet espace, les stratégies robustes se regroupent-elles en cluster, et si oui le cluster forme-t-il une unique région connexe ou de nombreux îlots isolés ?

Projection en composantes principales

Centrez les colonnes de X et prenez la décomposition en valeurs singulières :

est la projection linéaire sur les deux directions principales dominantes. Sur le corpus de production, PC1 explique 16,6 % de la variance et PC2 explique 10,0 %, c'est-à-dire que le plongement est intrinsèquement de basse dimension ; deux coordonnées capturent déjà environ un quart du signal sur 90.

UMAP comme lentille non-linéaire

Le PCA préserve la géométrie globale mais ignore les voisinages. UMAP (McInnes & Healy 2018) ajuste un ensemble simplicial flou μ dans l'espace d'entrée (chaque arête k-NN pondérée par une métrique riemannienne locale) et un ensemble correspondant ν en 2-D, puis minimise leur entropie croisée

Sous des hypothèses de continuité sur une variété riemannienne uniforme, ceci préserve la topologie locale tout en déchirant la géométrie globale. Le résultat est une disposition qui fait ressortir les voisinages serrés que le PCA aplatit.

Connectivité et modularité

Construisez le graphe k-NN (k = 15) sur le plongement 2-D. Soit A sa matrice d'adjacence, k_i le degré du nœud i, m le nombre d'arêtes, et c_i un label dans {robuste, fragile}. La modularité de Newman

mesure à quel point la densité d'arêtes à l'intérieur de chaque label dépasse le modèle nul de configuration. Nous utilisons un proxy peu coûteux = fraction d'arêtes dont les extrémités partagent un label. La ligne de base aléatoire est r̄² + (1−r̄)² ; avec = 0,0687 cela donne 0,872. La valeur empirique sur le plongement de production est Q̃ ≈ 0,903, un gain réel mais faible par rapport au hasard, cohérent avec un clustering faible.

Exemple détaillé

  • 10 actifs au WFO le plus profond, sous-échantillonnage stratifié de 100 000 stratégies, feature de métriques sur 6 fenêtres.
  • Taux de robustesse = 6,87 % → 6 869 robustes vs 93 131 fragiles.
  • Proxy de modularité UMAP 0,903 (vs ligne de base 0,872) ; proxy PCA 0,911.
  • Nombre de composantes connexes dans le sous-graphe k-NN robustes-uniquement : 1 229 pour UMAP et 938 pour PCA. Moyenne ≈ 5,6 stratégies robustes par îlot.

La démo interactive ci-dessous recalcule la statistique de connectivité chaque fois que vous déplacez le curseur τ, descendez-le et l'ensemble robuste fusionne ; montez-le et il vole en éclats.

Demo: synthetic strategy manifold

N points sampled from one diffuse fragile cloud + K tight robust islands. Sweep the robustness threshold τ; watch how the robust subset partitions.

N (points)800
K (planted islands)40
τ (robustness threshold)0.70
seed=11
# above τ
80
rate above τ
10.00%
components
27
strats / island
3.0
modularity Q̃
0.847
chance baseline
0.820
embedding axis 1embedding axis 2

Amber: r ≥ τ (robust). Grey: r < τ (fragile). Connectivity is computed on an 8-NN graph over the amber subset using union-find. Lift over baseline = +0.027. With the production corpus (N=100,000, real metrics) the analogous numbers are 6,869 robust points, ~1,229 components, Q̃ ≈ 0.903.

Figures

Fig. 1:Plongement UMAP du corpus de 10 actifs et 100 000 stratégies. Les stratégies robustes (bleu) ne se fondent pas en une seule région, elles apparaissent comme de petites poches denses réparties dans la masse fragile.
Fig. 2:Même population dans le plan linéaire PC1–PC2. PC1 explique 16,6 %, PC2 10,0 %. Le signal robuste est plus diffus que sous UMAP, c'est la structure locale qui porte l'information de cluster.
Fig. 3:Histogramme des tailles de composantes connexes robustes. Une grande composante (~2 400 stratégies, ~35 % de l'ensemble robuste) coexiste avec ~1 200 îlots plus petits, la plupart de taille 1–10. La longue queue est l'essentiel.
Fig. 4:Exécution par actif sur ALGO 30m 6W (15 000 stratégies, 1 765 robustes) : le même motif de fragmentation se reproduit, 213 composantes, ~8 stratégies robustes par îlot.
Fig. 5:Test à blanc synthétique de trois blobs. Quand la robustesse EST un mode contigu dans l'espace des features, par construction, la mesure de connectivité retourne correctement un petit nombre de grandes composantes. La fragmentation observée sur les stratégies réelles n'est pas un artefact du plongement.

Pourquoi cela compte pour les stratégies systématiques

De nombreuses procédures de recherche sur l'espace des stratégies, montée de gradient sur un score lissé, croisement évolutionnaire, optimisation bayésienne, supposent implicitement que la région robuste est localement convexe : que de petites perturbations d'une stratégie robuste restent robustes. L'analyse de connectivité contredit directement cette hypothèse. La population robuste n'est pas une unique variété connexe à toute échelle que nous avons vérifiée ; c'est une constellation d'îlots de ~5–8 stratégies séparés par des brèches fragiles.

Opérationnellement, deux conséquences. Premièrement, l'edge ne peut pas être atteint de manière fiable en perturbant une stratégie connue comme bonne, les voisins d'une stratégie robuste sont fragiles avec une forte probabilité. Deuxièmement, le sous-ensemble robuste doit être énuméré combinatoirement sur la grille indicateur/transformation/confluence, et non récupéré par recherche locale. Le pipeline que les modèles en aval consomment respecte déjà ceci : les candidats sont générés combinatoirement puis seulement filtrés, jamais optimisés vers une cible.

Reproductibilité

DaruFinance / strategy-manifold

Python · implémentation de référence open-source

Invocation minimale

import numpy as np
from sklearn.decomposition import PCA
from sklearn.neighbors import kneighbors_graph
import umap

# X: N x d feature matrix (rows = strategies, cols = per-window metrics).
# r: length-N {0,1} vector, 1 = passed the proprietary robustness funnel.
N, d = X.shape

# 1) Linear baseline.
pca = PCA(n_components=2).fit(X)
T_pca = pca.transform(X)
print("PC1 var:", pca.explained_variance_ratio_[0])

# 2) Non-linear embedding.
emb = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=0).fit_transform(X)

# 3) Connectivity of the robust subset under the 15-NN graph.
A = kneighbors_graph(emb, n_neighbors=15, mode="connectivity")
A_robust = A[r == 1][:, r == 1]
from scipy.sparse.csgraph import connected_components
n_components, _ = connected_components(A_robust, directed=False)
print("robust components:", n_components)

Références

  1. [1]Pearson, K. (1901). On Lines and Planes of Closest Fit to Systems of Points in Space. Philosophical Magazine 2(11), 559–572.
  2. [2]McInnes, L., Healy, J., & Melville, J. (2018). UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction. arXiv:1802.03426.
  3. [3]Newman, M. E. J. (2006). Modularity and community structure in networks. PNAS 103(23), 8577–8582.