Lab

M/05 · Variedade de Estratégias

Geometria PCA + UMAP da população de estratégias

Embeddar 100.000 estratégias walk-forward de um espaço métrico 90-D em 2-D, então perguntar se a robustez é uma região contígua ou uma constelação de ilhas isoladas.

A matemática

Cada estratégia é um ponto x ∈ ℝᵈ em um espaço de features de alta dimensão cujos componentes são (Sharpe, PF, MaxDD) por janela nas últimas 6 janelas walk-forward, avaliados sob a suíte de perturbações proprietária da Daru Finance. Com N = 100.000 estratégias temos uma matriz N × d X. Perguntamos: nesse espaço, estratégias robustas se agrupam em cluster, e se sim o cluster forma uma única região conexa ou muitas ilhas isoladas?

Projeção em componentes principais

Centralize as colunas de X e tome a decomposição em valores singulares:

é a projeção linear sobre as duas direções principais líderes. No corpus de produção PC1 explica 16,6% da variância e PC2 explica 10,0%, ou seja, o embedding é intrinsecamente de baixa dimensão; duas coordenadas já capturam cerca de um quarto do sinal em 90.

UMAP como lente não-linear

PCA preserva geometria global mas ignora vizinhanças. UMAP (McInnes & Healy 2018) ajusta um conjunto simplicial fuzzy μ no espaço de entrada (cada aresta k-NN ponderada por uma métrica Riemanniana local) e um conjunto correspondente ν em 2-D, então minimiza sua entropia cruzada

Sob hipóteses de continuidade em uma variedade Riemanniana uniforme isso preserva topologia local ao mesmo tempo em que rasga a geometria global. O resultado é um layout que expõe vizinhanças apertadas que o PCA achata.

Conectividade e modularidade

Construa o grafo k-NN (k = 15) no embedding 2-D. Seja A sua matriz de adjacência, k_i o grau do nó i, m a contagem de arestas, e c_i um rótulo em {robusto, frágil}. A modularidade de Newman

mede o quanto a densidade de arestas dentro de cada rótulo excede o nulo do modelo de configuração. Usamos um proxy barato = fração de arestas cujos endpoints compartilham um rótulo. A baseline de chance é r̄² + (1−r̄)²; com = 0,0687 isso dá 0,872. O valor empírico no embedding de produção é Q̃ ≈ 0,903, um lift real mas pequeno sobre a chance, consistente com clusterização fraca.

Exemplo trabalhado

  • 10 ativos com WFO mais profundo, subamostragem estratificada de 100.000 estratégias, feature de métricas de 6 janelas.
  • Taxa de robustez = 6,87% → 6.869 robustas vs 93.131 frágeis.
  • Proxy de modularidade UMAP 0,903 (vs baseline 0,872); proxy PCA 0,911.
  • Número de componentes conexos no subgrafo k-NN apenas-robustas: 1.229 para UMAP e 938 para PCA. Média ≈ 5,6 estratégias robustas por ilha.

O demo interativo abaixo recomputa a estatística de conectividade toda vez que você move o slider τ, arraste-o para baixo e o conjunto robusto se mescla; arraste-o para cima e ele se estilhaça.

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.

Figuras

Fig. 1:Embedding UMAP do corpus de 10 ativos e 100.000 estratégias. Estratégias robustas (azul) não se fundem em uma região, aparecem como pequenos bolsões densos distribuídos pela massa frágil.
Fig. 2:Mesma população no plano linear PC1–PC2. PC1 explica 16,6%, PC2 10,0%. O sinal robusto é mais difuso sob UMAP, é a estrutura local que carrega a informação de cluster.
Fig. 3:Histograma de tamanhos de componentes conexos robustos. Um componente grande (~2.400 estratégias, ~35% do conjunto robusto) coexiste com ~1.200 ilhas menores, a maioria de tamanho 1–10. A cauda longa é a manchete.
Fig. 4:Execução por ativo em ALGO 30m 6W (15.000 estratégias, 1.765 robustas): o mesmo padrão de fragmentação se reproduz, 213 componentes, ~8 estratégias robustas por ilha.
Fig. 5:Smoke test sintético de três blobs. Quando a robustez É um modo contíguo no espaço de features, por construção, a medida de conectividade corretamente retorna um número pequeno de componentes grandes. A fragmentação observada em estratégias reais não é um artefato do embedding.

Por que isso importa para estratégias sistemáticas

Muitos procedimentos de busca sobre o espaço de estratégias, subida de gradiente em um score suavizado, crossover evolutivo, otimização Bayesiana, assumem implicitamente que a região robusta é localmente convexa: que pequenas perturbações de uma estratégia robusta permanecem robustas. A análise de conectividade contradiz diretamente essa suposição. A população robusta não é uma única variedade conexa em qualquer escala que verificamos; é uma constelação de ilhas de ~5–8 estratégias separadas por gaps frágeis.

Operacionalmente, duas consequências. Primeiro, edge não pode ser confiavelmente alcançado perturbando uma estratégia conhecida como boa, os vizinhos de uma estratégia robusta são frágeis com alta probabilidade. Segundo, o subconjunto robusto deve ser enumerado combinatorialmente sobre a grade de indicador/transformação/confluência, não recuperado por busca local. O pipeline que os modelos a jusante consomem já respeita isso: candidatos são gerados combinatorialmente e só então filtrados, nunca otimizados em direção a.

Reprodutibilidade

DaruFinance / strategy-manifold

Python · implementação de referência open-source

Invocação mínima

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)

Referências

  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.