Matrices, tensores y álgebra tropical: álgebra lineal para la detección de arbitraje
Parte 4 de la serie "Cadenas de arbitraje complejas entre futuros y spot"
Imagina un salón enorme donde cientos de traders intercambian divisas simultáneamente. Cada uno tiene sus propias tasas, comisiones y peculiaridades. Tú estás en el centro con un cuaderno, tratando de encontrar una ruta de cambio que genere beneficio: dólares a euros, euros a yenes, yenes de vuelta a dólares—y salir con más de lo que entraste. Es fácil perderse. Pero si anotas todas las tasas en una tabla—una matriz—de repente el caos adquiere estructura. Los autovalores de esta matriz te dirán si existe arbitraje. El álgebra tropical encontrará la ruta óptima. Y las descomposiciones tensoriales revelarán patrones invisibles a simple vista.
En este artículo recorreremos el camino desde una simple tabla de tipos de cambio hasta métodos avanzados de análisis multidimensional—y cada paso estará respaldado por una implementación en Rust.
Visualización de la matriz de tipos de cambio entre criptomonedas: las aristas del grafo representan pares de trading, y el ciclo resaltado representa una oportunidad de arbitraje detectada.

1. La matriz de tipos de cambio: los fundamentos
1.1 Del caos a la tabla
Supongamos que tenemos n activos: BTC, ETH, USDT, SOL, etc. Cada par puede intercambiarse a una tasa determinada. La Matriz de Tipos de Cambio R es una tabla n × n donde el elemento R[i][j] indica cuántas unidades del activo j obtenemos por una unidad del activo i.
Propiedades de una matriz bien formada:
- Diagonal:
R[i][i] = 1—cambiar un activo por sí mismo no cambia nada. - Positividad:
R[i][j] > 0para todos los pares. - Reciprocidad (en un mercado ideal):
R[i][j] * R[j][i] = 1.
En Rust, podemos representar esto usando nalgebra:
use nalgebra::DMatrix;
/// Builds an exchange rate matrix from a set of trading pairs
fn build_exchange_rate_matrix(
assets: &[&str],
rates: &[((usize, usize), f64)],
) -> DMatrix<f64> {
let n = assets.len();
let mut matrix = DMatrix::from_element(n, n, 0.0);
// Diagonal: exchange for self = 1
for i in 0..n {
matrix[(i, i)] = 1.0;
}
// Fill known rates
for &((i, j), rate) in rates {
matrix[(i, j)] = rate;
// Reciprocal rate (if there is no direct one)
if matrix[(j, i)] == 0.0 {
matrix[(j, i)] = 1.0 / rate;
}
}
matrix
}
1.2 La condición de no arbitraje
Este es el teorema clave sobre el que se construye todo lo demás.
Teorema. Un mercado está libre de arbitraje si y solo si, para cualquier ciclo de activos (i₁, i₂, ..., iₖ, i₁), el producto de los tipos de cambio a lo largo del ciclo es igual a uno:
R[i₁][i₂] * R[i₂][i₃] * ... * R[iₖ][i₁] = 1
Formulación equivalente: una matriz R está libre de arbitraje si y solo si su rango es 1 (en sentido multiplicativo). Esto significa que existe un vector de precios p = (p₁, p₂, ..., pₙ) tal que:
R[i][j] = pj / pi para todo i, j
La matriz R se descompone como un producto externo R = (1/p) * pᵀ—y esto es una matriz de rango 1. Si la matriz real se desvía del rango 1—hay una oportunidad de arbitraje escondida en algún lugar.
2. El método de autovalores: arbitraje en O(n³)
2.1 El teorema de Ming Ma
Uno de los enfoques más elegantes para la detección de arbitraje fue propuesto por Ming Ma en 2007. La idea es brillantemente simple.
Teorema (Ming Ma). Sea R una matriz de tipos de cambio n × n. Si el mercado está libre de arbitraje, entonces:
- El mayor autovalor
λ_max = n. - Todos los demás autovalores son iguales a cero.
- El autovector correspondiente
vrepresenta los precios de equilibrio.
¿Por qué funciona? Una matriz libre de arbitraje tiene rango 1, y su traza (la suma de los elementos diagonales) es igual a n (porque cada R[i][i] = 1). Para una matriz de rango 1, el único autovalor distinto de cero es igual a la traza. Por lo tanto, λ_max = n.
Criterio de arbitraje: existe arbitraje si y solo si λ_max > n. La desviación δ = λ_max - n estima cuantitativamente la magnitud de la oportunidad de arbitraje.

3. Álgebra tropical (max-plus): el método más elegante
3.1 Cuando la suma se convierte en máximo
Este es quizás el hallazgo más hermoso de nuestro estudio. El álgebra tropical es un sistema algebraico donde las operaciones familiares se redefinen:
- "Suma":
a ⊕ b = max(a, b) - "Multiplicación":
a ⊗ b = a + b
La multiplicación de matrices en esta álgebra busca automáticamente el camino con la suma máxima de pesos. Esto es exactamente lo que se necesita para encontrar el ciclo de arbitraje más rentable.
3.2 Autovalor tropical y arbitraje
Tomemos la matriz logarítmica de tasas L[i][j] = ln(R[i][j]). Calculemos el autovalor tropical λ de la matriz L.
Teorema. λ > 0 si y solo si existe arbitraje. Además, exp(λ) es el multiplicador de beneficio del mejor ciclo.
/// Tropical (max-plus) matrix multiplication
fn tropical_matmul(a: &DMatrix<f64>, b: &DMatrix<f64>) -> DMatrix<f64> {
let n = a.nrows();
let m = b.ncols();
let k = a.ncols();
let mut result = DMatrix::from_element(n, m, f64::NEG_INFINITY);
for i in 0..n {
for j in 0..m {
for l in 0..k {
// Tropical multiplication: max instead of sum, + instead of *
let val = a[(i, l)] + b[(l, j)];
if val > result[(i, j)] {
result[(i, j)] = val;
}
}
}
}
result
}
4. PCA y modelos factoriales: arbitraje estadístico
Pasamos del arbitraje determinista (discrepancias directas de precios) al arbitraje estadístico—la búsqueda de desviaciones sistemáticas respecto a un modelo factorial.
El Análisis de Componentes Principales (PCA) descompone los rendimientos de los activos en factores sistemáticos y residuos idiosincráticos:
ri(t) = αi + Σk βik * Fk(t) + εi(t)
donde Fk(t) es el k-ésimo factor, βik es la carga (loading) y εi(t) es el residuo—la señal de arbitraje.
4.1 Teoría de matrices aleatorias (RMT)
Pregunta clave: ¿cuántos factores conservar? La distribución de Marchenko-Pastur describe el espectro de autovalores para una matriz de covarianza aleatoria. Los autovalores por encima del límite superior contienen señales reales, mientras que los que están dentro del límite son ruido.

5. Métodos tensoriales: la tercera dimensión del arbitraje
El arbitraje de criptomonedas involucra múltiples dimensiones simultáneamente. La matriz de tasas es solo un corte 2D. La imagen real es un Tensor:
T(a, e, i) = precio/tasa para el activo a en el exchange e para el instrumento i
Dimensiones:
- Modo 1 (Activos): BTC, ETH, SOL, ...
- Modo 2 (Exchanges): Binance, Kraken, Coinbase, ...
- Modo 3 (Instrumentos): Spot, Perpetual, Futures, ...
La descomposición CP (CANDECOMP/PARAFAC) factoriza el tensor en una suma de tensores de rango 1. Los residuos T - T_approx revelan anomalías donde combinaciones específicas de activo/exchange/instrumento tienen un precio incorrecto respecto a la estructura factorial general del mercado.
Conclusión
De simples tablas a tensores multidimensionales, el álgebra lineal proporciona un lenguaje formal para el mercado de criptomonedas. Rust nos permite ejecutar estos modelos complejos con la velocidad requerida para el HFT.
En la próxima parte exploraremos GNN, Transformers y RL para arbitraje, viendo cómo las redes neuronales aprenden a operar.
¿Procesando señales de alta dimensionalidad? Consulta nuestro motor de trading basado en tensores en GitHub.
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.