Spectrum

How λ₁ is computed, why it is the right thing to buy, and what the weights mean.

The fee matrix

Let F be the epochs-by-pools matrix whose entry F[t, i] is the fee, in ETH, that accrued to pool i's right during epoch t. For a Pons stream that is 0.35% of the pool's volume; for an LP right it is the pool's fee tier. Today that matrix is 153 rows by 5 columns.

λ₁ in four lines

  1. Build F from the last 153 epochs of fees.
  2. Standardise each column so a large pool does not masquerade as a correlated one: Z = (F − μ) / σ.
  3. Take Σ = ZᵀZ / (n − 1) and its top eigenpair by power iteration with deflation. λ₁ is the eigenvalue, v₁ the eigenvector.
  4. Weights w = max(v₁, 0) normalised to sum to one. Negative loadings get zero, never a short.

Right now λ₁ = 1.30 and explains 25.8% of the variance across the 5 eligible streams. λ₂ explains 23.0%, λ₃ 19.2%. A high first number is the point: it means one factor moves the whole market, and that factor is purchasable.

The implementation is about a hundred lines of dependency-free TypeScript in lib/pca.ts, and it runs identically in the browser and on the server. Nothing here needs a matrix library.

Reading the weights

A loading is not a prediction about a token. It says how much of that pool's fee flow moves with the market rather than on its own. A pool that earns well but only when its own community is awake gets a low weight even if its absolute fees are large, because the vault is not buying that idiosyncratic risk.

Weights are recomputed off chain each epoch and posted on chain by the keeper role. They decide where newly harvested ETH goes when the vault buys more rights, not what it already owns.

The current basket

NVDA / USDG 0.05%
39.46%
AI / NVDA
32.59%
CLAN / WETH
16.76%
microduck / NVDA
11.19%
STONKBROKER / WETH 1%
0.00%
Top λ₁ loadings, from live volume.

The live version, with depth, age and thirty-day sparklines, is on the app page. The raw vectors are at /api/eigen.