Filtro de Kalman en trading: cómo funciona el indicador y cuándo te ayuda

En trading, un filtro de Kalman es un suavizador recursivo que estima el nivel real del precio combinando su propia predicción con cada nueva barra, ponderada por una ganancia que se calcula a partir del ruido de proceso Q y del ruido de medición R. La versión sencilla de un solo estado acaba comportándose como una EMA; solo consigues menos retraso si añades un estado de velocidad o ajustes de ruido adaptativos.
Los indicadores basados en el filtro de Kalman se venden como medias móviles "sin retraso". Si haces las cuentas, aparece otra imagen: la versión unidimensional habitual termina siendo una EMA corriente cuya longitud puedes calcular a partir de dos parámetros. Esta guía de Quantum Algo te muestra ese cálculo, resuelve cinco barras a mano, explica de dónde sale de verdad un retraso menor (un estado de velocidad, un ruido adaptativo) y cubre el uso en el que los filtros de Kalman tienen el mejor historial publicado: los hedge ratios variables en el tiempo para pairs trading. También incluye una calculadora para que pruebes tus propios precios.
Indicadores que se demuestran en público.
Un motor, cuatro herramientas de precisión: el Gold (XAU) Scalper, la Gravity Zone institucional, el Zeno momentum Oscillator y Zeno Stocks para acciones.
Por qué los traders ponen un filtro de Kalman en el gráfico de precios
Cada precio impreso mezcla dos cosas: dónde está "realmente" el mercado y el ruido que generan el libro de órdenes, los spreads y los traders impacientes. Una media móvil intenta separar ambas promediando una ventana fija. Un filtro de Kalman lo hace de otra manera. Mantiene una estimación continua del nivel real, guarda un número que indica cuán incierta es esa estimación y, cuando llega una barra nueva, decide cuánto creer a la barra frente a su propia estimación.
Esa decisión es todo el truco. Si el filtro no está seguro de sí mismo y los precios están limpios, sigue el precio de cerca. Si está seguro y los precios tienen mucho ruido, apenas se mueve. El peso que le da a cada barra nueva se llama ganancia de Kalman, y se recalcula en cada barra.
El método viene de la ingeniería, no de los mercados. Rudolf E. Kálmán publicó "A New Approach to Linear Filtering and Prediction Problems" en el Journal of Basic Engineering en 1960, y una de las primeras implementaciones, obra del equipo de Stanley Schmidt en el NASA Ames, acabó en el ordenador de navegación del Apolo. Los traders lo tomaron prestado para tres tareas:
- A smoothed trend line that you read like a moving average.
- A trend-plus-slope estimate that projects momentum forward to cut lag.
- A time-varying hedge ratio for pairs and spread trading, which is where it has the strongest track record in published quant work.
La mayoría de los artículos se quedan en "se adapta, así que es mejor". La verdad útil es más concreta, y empieza por las ecuaciones.
Las ecuaciones del filtro de Kalman, línea a línea

Para suavizar el precio, los traders casi siempre usan la versión más sencilla: un único estado oculto (el nivel real del precio) que se supone que se mueve como un paseo aleatorio. Los estadísticos lo llaman modelo de nivel local. En cada barra se ejecutan dos fases: predicción y actualización.
Predict: x⁻ = x(t−1) P⁻ = P(t−1) + QGain: K = P⁻ ÷ (P⁻ + R)Update: x(t) = x⁻ + K × (price − x⁻) P(t) = (1 − K) × P⁻| Símbolo | Nombre | Qué significa en un gráfico |
|---|---|---|
| x | Estimación del estado | La línea del filtro que dibujas |
| P | Varianza de la estimación | Cuánta incertidumbre tiene el filtro sobre su propia línea |
| Q | Ruido de proceso | Cuánto crees que se mueve de verdad el nivel real en cada barra |
| R | Ruido de medición | Cuánto ruido crees que tiene cada precio impreso |
| K | Ganancia de Kalman (de 0 a 1) | La parte de la última sorpresa que se suma a la línea |
Lee despacio la línea de actualización: la nueva estimación es igual a la estimación anterior más K por la sorpresa. Es exactamente la forma de una media móvil exponencial, en la que la EMA suma α por la sorpresa. La única diferencia es que el α de la EMA lo fijas tú, mientras que K se calcula a partir de P, Q y R.
El filtro general utiliza matrices (una matriz de transición F, una matriz de observación H y matrices de covarianza para Q y R) para poder seguir varios valores ocultos a la vez. La versión unidimensional de arriba es el caso particular en el que todo es un único número.
Cómo Q y R cambian suavidad por capacidad de respuesta
Este es el dato que la mayoría de las páginas sobre indicadores Kalman esconden: en el modelo unidimensional, la ganancia se estabiliza en un valor fijo al cabo de unas pocas decenas de barras, y ese valor depende solo del cociente q = Q ÷ R. Si multiplicas ambos por diez, no cambia nada.
Steady-state gain: K∞ = ( −q + √(q² + 4q) ) ÷ 2, where q = Q ÷ REquivalent EMA length: N = 2 ÷ K∞ − 1Una vez que K se ha estabilizado, el filtro es matemáticamente idéntico a una EMA con α = K∞. El manual Forecasting: Principles and Practice muestra el mismo vínculo desde el otro lado: el suavizado exponencial simple puede escribirse como un modelo de espacio de estados de innovaciones cuya ecuación de estado es level(t) = level(t−1) + α × error.
| q = Q ÷ R | Ganancia estable K∞ | Se comporta como una EMA de | Carácter |
|---|---|---|---|
| 0.001 | 0.031 | ≈ 63 barras | Muy suave, lenta |
| 0.01 | 0.095 | ≈ 20 barras | Base de tendencia swing |
| 0.05 | 0.200 | 9 barras | Tendencia de corto plazo |
| 0.1 | 0.270 | ≈ 6.4 barras | Rápida |
| 0.5 | 0.500 | 3 barras | Pegada al precio |
| 1.0 | 0.618 | ≈ 2.2 barras | Casi el precio en bruto |
Esta tabla es lo más práctico de toda la guía. Un script de Kalman de código abierto muy usado en TradingView trae por defecto Q = 0.01 y R = 0.1, un cociente de 0.1. En estado estable, esa línea tiene la misma ponderación que, aproximadamente, una EMA de 6 periodos. Sabiendo esto, puedes dejar de adivinar qué hace un ajuste y equipararlo a una media que ya entiendes.
Un filtro de Kalman de cinco barras, calculado a mano
Vamos a aplicar el filtro a seis cierres: 100.00, 101.20, 100.60, 102.10, 103.00, 102.40. Ajustes: Q = 0.1, R = 1, estimación inicial x = 100.00 (el primer cierre) y varianza inicial P = 1.
| Barra | Cierre | P⁻ = P + Q | Ganancia K | Estimación x | Nueva P |
|---|---|---|---|---|---|
| 1 | 101.20 | 1.1000 | 0.5238 | 100.6286 | 0.5238 |
| 2 | 100.60 | 0.6238 | 0.3842 | 100.6176 | 0.3842 |
| 3 | 102.10 | 0.4842 | 0.3262 | 101.1012 | 0.3262 |
| 4 | 103.00 | 0.4262 | 0.2988 | 101.6686 | 0.2988 |
| 5 | 102.40 | 0.3988 | 0.2851 | 101.8772 | 0.2851 |
La barra 1, paso a paso
- Predicción: x⁻ = 100.00, P⁻ = 1 + 0.1 = 1.1.
- Ganancia: K = 1.1 ÷ (1.1 + 1) = 0.5238.
- Sorpresa: 101.20 − 100.00 = 1.20.
- Actualización: x = 100.00 + 0.5238 × 1.20 = 100.6286.
- Nueva varianza: P = (1 − 0.5238) × 1.1 = 0.5238.
Qué muestran los números
La ganancia baja en cada barra: 0.52, 0.38, 0.33, 0.30, 0.29. Se dirige hacia el valor estable de 0.270 de la tabla anterior. Mientras es alta, el filtro persigue el precio con más fuerza de lo que lo haría su EMA equivalente en estado estable. Una EMA con α fijo en 0.270 sobre los mismos datos termina la barra 5 en 101.697; la línea de Kalman termina en 101.877, más cerca del precio, únicamente por ese periodo de calentamiento.
Ahora viene la comparación incómoda. Una EMA simple de 5 periodos (α = 0.333) iniciada en 100 termina la barra 5 en 101.916, todavía más cerca del precio que la línea de Kalman. Así que la afirmación "Kalman es más rápido que una EMA" depende por completo de qué EMA y qué Q/R compares. Pega estos cierres en la calculadora de abajo para comprobar cada número.
Cómo elegir Q y R para tu mercado y tu timeframe
Esto sorprende a la mayoría de quienes leen código de Kalman por primera vez: en el filtro lineal clásico, la secuencia de ganancias nunca mira los precios. P, P⁻ y K dependen solo de Q, R y la P inicial. Podrías calcular todas las ganancias antes incluso de que cargue el gráfico. Los precios solo entran a través del término de sorpresa. Por eso es el cociente Q ÷ R, y no el instrumento, lo que decide el comportamiento, y por eso un script con Q y R fijos se comporta igual en Bitcoin que en EUR/USD.
La varianza inicial P sí importa durante las primeras decenas de barras. Una P grande en relación con R hace que la línea salte al precio al principio; una P diminuta hace que se arrastre. Fijar la estimación inicial en el primer cierre y P igual a R es una elección neutral.
Puntos de partida, no números mágicos
Estos son primeros ajustes razonables expresados como q = Q ÷ R, elegidos para igualar las longitudes de media móvil que los traders suelen usar en cada horizonte. Son un punto de partida para hacer pruebas, no valores optimizados.
| Uso | Timeframe típico | q inicial | Se comporta como |
|---|---|---|---|
| Base para scalping | De 1 a 5 minutos | De 0.05 a 0.1 | EMA de 6 a 9 |
| Tendencia intradía | De 15 minutos a 1 hora | 0.01 | EMA 20 |
| Sesgo swing | De 4 horas a diario | De 0.002 a 0.005 | EMA de 28 a 45 |
| Tendencia de posición | De diario a semanal | De 0.0005 a 0.001 | EMA de 63 a 89 |
Cómo estimar Q y R a partir de los datos
Si quieres algo con más fundamento que igualar una EMA, estima directamente los dos ruidos. R es la varianza de los precios alrededor de su nivel subyacente: toma una línea de referencia suave, calcula cierre menos línea en cada barra y usa la varianza de ese residuo. Q es la varianza de los cambios de barra a barra de la propia línea de referencia. En un futuro sobre índice líquido durante una semana tranquila, esto suele dar una q pequeña; en una semana marcada por las noticias, se dispara. Los estadísticos los ajustan por máxima verosimilitud, que es lo que hacen las herramientas de espacio de estados en Python y R, pero el método del residuo te deja en el orden de magnitud correcto.
Uses el método que uses, vuelve a comprobarlo después de un cambio de volatilidad. Un cociente estimado en un régimen tranquilo es, con diferencia, la razón más habitual por la que una línea de Kalman que parecía perfecta el mes pasado va muy retrasada este mes.
¿De verdad un filtro de Kalman tiene menos retraso que una EMA?

Respuesta corta: el filtro de nivel unidimensional no, una vez que ha terminado su calentamiento. Se retrasa exactamente igual que la EMA hacia la que converge. Las afirmaciones de menor retraso vienen de otros tres sitios, y cada uno tiene un precio.
- Warm-up and resets. A high starting P makes the early gain large, so the line snaps to price at the start of the chart. Some scripts inflate P after big moves to get the same effect mid-chart. That reduces lag right after shocks and increases noise right after shocks.
- Adaptive Q and R. Scripts that scale R or Q with ATR or standard deviation change the gain with volatility. That is closer in spirit to Kaufman's adaptive moving average than to a classic Kalman filter, and it adds parameters you have to tune.
- A velocity state. This is the real one. If the model tracks level and slope, the prediction step projects the trend forward, so the line keeps up in a steady trend. It also overshoots at turns, the same trade-off you see with the Hull moving average.
Nada de esto sale gratis. Un menor retraso en tendencia siempre se paga con más sobrepasamiento y más whipsaw en otro momento. Lo que te aporta el marco de Kalman es una forma fundamentada de ajustar ese equilibrio, además de una banda de incertidumbre (a partir de P) que una media móvil no te da.
La versión de dos estados: nivel más velocidad
El modelo de velocidad constante añade un segundo valor oculto: la pendiente por barra. El paso de predicción pasa a ser "siguiente nivel = nivel + pendiente; siguiente pendiente = pendiente". Solo se observa el nivel, así que el filtro deduce la pendiente a partir de cómo los precios lo siguen sorprendiendo.
State: [level, slope] F = [[1, 1], [0, 1]] H = [1, 0]Predict: level⁻ = level + slope, slope⁻ = slope, P⁻ = F·P·Fᵀ + QEn la práctica se comporta como una proyección lineal suavizada, parecida en sensación a una línea de regresión lineal móvil, pero actualizada de forma recursiva. El estado de pendiente es útil por sí solo: dibújalo como oscilador y se convierte en una tasa de cambio suavizada que cruza el cero cuando la tendencia se da la vuelta.
El artículo de Eric Benhamou de 2016, "Trend Without Hiccups: A Kalman Filter Approach", comparó varios de estos modelos con la DEMA y la TEMA usando un año de datos diarios del E-mini S&P 500. Los modelos se ajustaron sobre ese mismo año sin ninguna prueba fuera de muestra, así que toma los beneficios publicados como una demostración, no como prueba de una ventaja real.
Hedge ratios con Kalman en pairs trading
Aquí es donde el filtro de Kalman se gana su reputación. En una operación de pares mantienes un activo frente a otro en una proporción β para que el spread revierta a la media. Una β fija obtenida de una sola regresión se queda obsoleta; una regresión móvil te obliga a elegir un periodo de lookback. El enfoque de Kalman trata β (y una constante) como estados ocultos que derivan como un paseo aleatorio, y los actualiza en cada barra.
Observation: priceY(t) = β₀(t) + β₁(t) × priceX(t) + noiseState: β(t) = β(t−1) + small random changeErnest Chan popularizó el método entre los quants minoristas en Algorithmic Trading: Winning Strategies and Their Rationale (Wiley, 2013), con los ETF de países EWA y EWC. El filtro te da además dos subproductos: el error de previsión e(t), que es el spread, y su varianza, cuya raíz cuadrada funciona como una desviación típica móvil. Opéralo como unas Bandas de Bollinger sobre el spread: ponte long en el spread cuando e(t) cae por debajo de −k × √varianza, y short cuando sube por encima de +k × √varianza.
Los artículos de QuantStart aplican el método a los ETF de bonos del Tesoro TLT e IEI. En su backtest con QSTrader (barras diarias, de agosto de 2009 a agosto de 2016, umbral de una desviación típica), el artículo informa de una CAGR del 8.73%, un ratio de Sharpe de 0.75 y un drawdown máximo del 15.79%, expresamente antes de costes de transacción, con un drawdown que duró 777 días. Ese último número es el honesto: incluso un filtro de pares de manual puede pasar dos años sin un nuevo máximo de capital. Para la lógica general de ir en contra de spreads estirados, consulta nuestra guía de trading de reversión a la media.
Cómo configurar un indicador de filtro de Kalman en TradingView
TradingView no tiene un filtro de Kalman integrado, así que tendrás que usar un script de la comunidad. Busca "Kalman" en el cuadro de diálogo de Indicadores y encontrarás docenas: filtros de nivel simples, versiones adaptativas que se ajustan con el ATR, RSI suavizados con Kalman y variantes de osciladores. Antes de añadir uno, comprueba cuatro cosas en la descripción o en el código fuente:
- Which model. One state (level) or two (level and velocity)? A one-state script will behave like an EMA once warmed up.
- Which inputs. Separate Q and R, or a single "smoothness" input? If separate, compute q = Q ÷ R and look it up in the table above.
- Adaptive scaling. If Q or R is multiplied by ATR or standard deviation, the line will change character between quiet and volatile sessions. Our ATR guide explains what that volatility input measures.
- Repainting. A forward filter that only uses past bars does not repaint. A Kalman smoother (which runs backward over the data) does, and it will look magical on historical charts. Our guide to non-repainting indicators shows how to test this with bar replay.
Una rutina práctica de ajuste
- Elige la longitud de EMA en la que ya confías para ese mercado y ese timeframe, por ejemplo 20 en un gráfico de 1 hora.
- Conviértela: α = 2 ÷ 21 = 0.095. Eso corresponde a q ≈ 0.01, así que empieza con Q = 0.01 y R = 1.
- Superpón ambas líneas. Tras el calentamiento deberían coincidir casi por completo. Si es así, el script es un filtro de nivel y ya conoces su referencia.
- Solo entonces experimenta: escalado adaptativo, un estado de velocidad o una q distinta. Cambia una sola cosa cada vez y juzga el resultado sobre barras fuera de muestra.
Si los scripts y los parámetros son nuevos para ti, nuestra guía de la plataforma TradingView explica cómo añadir, guardar y crear plantillas de indicadores.
Filtro de Kalman frente a EMA, ALMA y McGinley Dynamic
Todos intentan responder a la misma pregunta: ¿cuánto debería moverse la línea en esta barra? Y cada uno la responde con un mecanismo distinto.
| Suavizador | Cómo fija su velocidad | Retraso en una tendencia estable | Principal riesgo |
|---|---|---|---|
| EMA | α fijo = 2 ÷ (N + 1) | Moderado, constante | Demasiado lenta o demasiado ruidosa, nunca acierta en ambas cosas |
| Kalman (nivel) | Ganancia a partir de Q, R y P; se estabiliza en un valor fijo | Igual que su EMA equivalente tras el calentamiento | Confundir la rapidez del calentamiento con una ventaja |
| Kalman (nivel + velocidad) | Ganancia más proyección de la pendiente | Bajo | Sobrepasamiento en los puntos de giro |
| ALMA | Pesos gaussianos desplazados hacia las barras recientes (offset, sigma) | De bajo a moderado | Con un offset demasiado alto se vuelve nerviosa |
| McGinley Dynamic | La velocidad se ajusta según la relación entre el precio y la línea | Moderado; se pone al día más rápido en las caídas fuertes | Puede quedarse atrás en subidas bruscas |
| KAMA | Ratio de eficiencia entre dirección y ruido | Bajo en tendencias limpias, plana en mercados laterales | Tarda en reactivarse después de un rango |
Si quieres un filtro que además te diga lo ancha que es la banda de ruido, Kalman gana: P te da una estimación de la incertidumbre gratis. Si solo quieres una línea, una ALMA o una EMA bien elegida es más fácil de entender. Para una alternativa tipo canal basada en otra familia de suavizado, consulta la guía del Gaussian Channel.
Dónde fallan los filtros de Kalman en el trading real
- Regime changes. Q and R are guesses about how much the market moves and how noisy it is. A Q tuned on a quiet month will lag badly in a news-driven trend; one tuned on a trending month will whipsaw in a range. Checking whether the market is trending or mean-reverting first, for example with the Hurst exponent, tells you which regime you are tuning for.
- Overfitting. With adaptive multipliers, velocity noise, initial P and a signal threshold, a "simple" Kalman system easily has five or six free parameters. Optimize them on one sample and the backtest will look clean. Hold back at least a third of your data and test once.
- Fat tails. The filter assumes Gaussian noise. One gap or flash spike creates a huge surprise, and the line jumps by K times that surprise. Clip extreme surprises or filter on a steadier input such as the bar's median price.
- Broken pairs. In pairs trading, the filter will keep updating β even when the relationship has truly ended. It adapts to a broken spread instead of warning you. Pair it with a periodic cointegration check.
- The smoother trap. Backward-looking Kalman smoothers use future bars. Any backtest built on them is invalid.
- Crossover systems. Price crossing a Kalman line whipsaws exactly as much as price crossing the equivalent EMA. Changing the name of the average does not fix crossover noise; filters like a Supertrend band or a volatility buffer do.
Tres formas sensatas de usar una línea de Kalman

- Trend bias. Use a slow setting (q around 0.001 to 0.01) as a bias line. Above and rising, look for longs; below and falling, look for shorts. Same job as a 50-period average, with a P-based band to show how far price can stray before the bias is in doubt.
- Slope oscillator. With the two-state model, plot the velocity state. Zero crosses mark trend flips with less noise than a raw momentum oscillator, similar in spirit to the MACD histogram.
- Spread z-score. For pairs or for price vs its own Kalman line, divide the surprise by √P⁻ (or by the forecast-error standard deviation). That gives a self-scaling z-score for mean-reversion entries.
Los filtros de Kalman también aparecen como preprocesamiento dentro de modelos más complejos. Si te interesa ese camino, nuestra guía de indicadores de trading con machine learning explica cómo las entradas suavizadas alimentan a los clasificadores.
El filtro de Kalman y Quantum Algo
Una línea de Kalman es una buena respuesta a "¿hacia dónde va la tendencia y cuánto ruido tiene?". No es un sistema de entradas. Esa división encaja perfectamente con cómo construimos herramientas en Quantum Algo. Usa un ajuste de Kalman lento como filtro direccional y deja que una herramienta de timing se encargue de las entradas y del riesgo. Las señales de Zeno vienen con stop y objetivos incorporados, así que el sesgo de Kalman decide qué lado puedes operar, y Zeno decide cuándo y dónde queda definido el riesgo. En el oro, Zeno Gold funciona en todos los timeframes; en CFD sobre índices, Zeno Stocks cubre NAS100 y SPX500.
Si prefieres quedarte con herramientas gratuitas y de código abierto, Adaptive Trend Sentinel es una línea de tendencia adaptativa que puedes comparar lado a lado con un script de Kalman, y Supertrend Engine añade un colchón de volatilidad para reducir el whipsaw de los cruces. Todos los scripts gratuitos de QuantumAlgo están en la página de indicadores gratuitos, y la Academy explica los filtros de tendencia desde los fundamentos.
◆ Comprobación interactiva
¿Cuánto sabes de los filtros de Kalman?
Preguntas que hacen los traders sobre los filtros de Kalman
Es un estimador recursivo que sigue un valor oculto, normalmente el nivel real del precio o un hedge ratio, a partir de precios con ruido. En cada barra predice, mide la sorpresa y corrige con una ganancia que depende del ruido de proceso Q y del ruido de medición R.
No automáticamente. El filtro de Kalman de un solo estado converge hacia una EMA, así que, tras el calentamiento, tiene el mismo retraso. Sus ventajas son una estimación de la incertidumbre y la opción de añadir un estado de velocidad o parámetros que varían en el tiempo. Compáralo con nuestra guía de medias móviles.
En el modelo simple solo importa el cociente Q ÷ R. Un cociente cercano a 0.01 se comporta como una EMA de 20 periodos, 0.05 como una EMA de 9 periodos y 0.5 como una EMA de 3 periodos. Parte de una longitud de EMA que ya uses y conviértela.
Un filtro de Kalman hacia delante que solo usa barras pasadas no repinta. Un suavizador de Kalman, que recorre los datos hacia atrás, sí lo hace. Revisa el código fuente del script antes de fiarte de un backtest.
No hay un indicador de Kalman integrado, pero muchos scripts de la comunidad lo implementan, incluidas versiones adaptativas y osciladores suavizados con Kalman. Comprueba si el script usa uno o dos estados y cómo fija Q y R.
Estima un hedge ratio variable en el tiempo entre dos activos. El error de previsión es el spread, y su varianza fija las bandas de entrada, de modo que operas el spread cuando se estira más allá de un múltiplo de su desviación típica.
Rudolf E. Kálmán, que lo publicó en 1960 en el Journal of Basic Engineering. Una de sus primeras implementaciones se usó en el ordenador de navegación del Apolo.
Es la parte de la última sorpresa que se suma a la estimación, entre 0 y 1. Es igual a P⁻ ÷ (P⁻ + R), así que es alta cuando el filtro no está seguro y los precios están limpios, y baja cuando el filtro está seguro y los precios tienen mucho ruido.
Solo predice un paso por delante según su propio modelo, que en la versión de nivel es simplemente la última estimación. Suaviza y estima; no anticipa puntos de giro.
Referencias y guías relacionadas
Lee a continuación
- Medias móviles
- Hull Moving Average
- Kaufman Adaptive Moving Average (KAMA)
- Reversión a la media en trading
- Canal de regresión lineal
- Indicadores sin repintado
- Indicadores gratuitos de TradingView
- Zeno — el motor premium
Fuentes primarias
- Wikipedia — Kalman filter
- UNC Chapel Hill (Welch & Bishop) — An Introduction to the Kalman Filter
- QuantStart — Dynamic Hedge Ratio Between ETF Pairs Using the Kalman Filter
- QuantStart — Kalman Filter-Based Pairs Trading Strategy in QSTrader
- Hudson & Thames ArbitrageLab — Kalman Filter
- Hyndman & Athanasopoulos — Forecasting: Principles and Practice, Simple exponential smoothing
- MathWorks — Algorithmic Trading: Winning Strategies and Their Rationale (Ernest P. Chan)