Type/to search
2
Follow
484
Followers
Estrategia cuantitativa de filtrado de medias móviles: una práctica cuantitativa del pensamiento de Harness Engineer
Discussions
Created 2026-04-17 11:55:34  Updated 2026-04-21 09:00:18
 0
 374

img

Introducción: El pensamiento Harness Engineer

Recientemente, en la comunidad de ingeniería de IA/ML, se ha debatido cada vez más una forma de pensar: Harness Engineer.

Su idea central es simple:

En lugar de dar respuestas basadas en suposiciones propias, es mejor construir un marco que permita a los datos y experimentos encontrar las respuestas por sí mismos.

La forma tradicional del ingeniero es: creo que el parámetro A es bueno, entonces escribo código para implementar A. La forma del Harness Engineer es: no sé si A, B o C es mejor, entonces construyo un marco para que A, B y C se ejecuten simultáneamente, y los datos me dirán la respuesta.

El ingeniero define el espacio de búsqueda y los criterios de evaluación, y el sistema se encarga de optimizar automáticamente dentro de ese espacio. Esta idea corresponde en ML a la optimización walk-forward, AutoML; en el ámbito cuantitativo, también tiene escenarios de aplicación naturales.

img

Monedas anómalas: el campo de batalla con las tendencias más evidentes

En el mercado de contratos de criptomonedas, hay un tipo de monedas que merece especial atención: las llamadas "monedas anómalas" con un volumen de negociación masivo.

Estas monedas comparten varias características comunes:

  • Alta concentración de capital, con un comportamiento evidente de los grandes jugadores.
  • Continuidad de tendencia relativamente fuerte, una vez que se inicia, suele durar bastante tiempo.
  • Alta volatilidad: algunas monedas con alto volumen muestran una fuerte tendencia en períodos específicos, y las estrategias de medias móviles han tenido un rendimiento histórico relativamente bueno en estos activos.

Por ello, aplicar la clásica estrategia de cruce de medias móviles dobles en este tipo de monedas es un punto de partida simple y razonable. Cuando la media rápida cruza por encima de la lenta, la tendencia comienza, se sigue; cuando la rápida cruza por debajo de la lenta, la tendencia se revierte, se sale. La lógica es simple, pero en activos con tendencias claras, el rendimiento histórico no suele ser malo.

Solo hay un problema: ¿qué monedas son anómalas? ¿Qué conjunto de parámetros de medias móviles usar?

Estas dos preguntas, si se responden manualmente, son demasiado subjetivas; otra persona podría dar respuestas completamente diferentes. Además, el mercado es dinámico: la moneda anómala de hoy puede no serlo mañana, y el conjunto de parámetros efectivo hoy puede dejar de serlo mañana.

Aquí es donde entra en juego el pensamiento Harness Engineer.

En lugar de seleccionar monedas y ajustar parámetros manualmente, es mejor dejar que el marco resuelva ambos problemas: definir los criterios de evaluación y dejar que los datos históricos ejecuten las respuestas dentro del espacio de candidatos. La persona solo necesita decidir qué criterios usar para medir el rendimiento, y el sistema se encarga del resto.

Basado en esta idea, toda la estrategia se diseña como un marco de selección rodante, que opera en tres niveles.

img

Arquitectura de la estrategia: Mecanismo de dos niveles de competición

Primer nivel: Construcción del pool de activos

Del conjunto completo de contratos del mercado, se toman las 150 monedas con mayor volumen en dólares como pool candidato.

¿Por qué el volumen? Porque donde hay gran volumen, el capital está más concentrado, las tendencias se forman más fácilmente y las monedas anómalas son más densas. Este paso no implica juicios subjetivos; simplemente se deja que el capital del mercado vote: quien tenga mayor volumen de negociación entra al pool.

javascript
const filtered = tickers .filter(t => t.Symbol.endsWith('USDT.swap')) .map(t => ({ symbol: t.Symbol, quoteVolume: t.Last * t.Volume })) .sort((a, b) => b.quoteVolume - a.quoteVolume) .slice(0, topN) .map(t => t.symbol);

La lógica es muy directa: filtrar contratos USDT, calcular el volumen en dólares, ordenar descendente, tomar los primeros N. Sin juicios subjetivos: el capital del mercado vota por sí mismo.

Segundo nivel: Selección por dos niveles de competición

Esta es la parte más central de toda la estrategia y donde el pensamiento Harness se manifiesta más claramente.

El orden de ejecución correcto es el siguiente:

img

⚠️ Nota: Usar la puntuación del mejor parámetro para representar la capacidad de la moneda conlleva implícitamente cierto riesgo de sobreajuste: los parámetros que mejor funcionaron en el pasado pueden no ser igual de efectivos en el futuro. Esta limitación se discutirá más adelante en el artículo.

Proceso de backtesting

Para cada moneda en el pool candidato, se ejecutan simultáneamente múltiples combinaciones de parámetros de MA. Cada conjunto de parámetros opera de forma independiente sobre las velas históricas, simulando la lógica real de apertura y cierre por cruce:

javascript
// Recorre cada moneda × cada conjunto de parámetros for (const params of maParamsList) { const bt = backtest_MA(records, params.fast, params.slow); // Cada backtesting produce de forma independiente: tasa de acierto, ratio beneficio/pérdida, drawdown máximo, número de señales }

La lógica central de cada backtesting es el cruce estándar de medias dobles:

javascript
const crossUp = fastMA[i-1] <= slowMA[i-1] && fastMA[i] > slowMA[i]; const crossDown = fastMA[i-1] >= slowMA[i-1] && fastMA[i] < slowMA[i]; if (crossUp) position = { side: 'long', entryPrice: records[i].Close }; if (crossDown) position = { side: 'short', entryPrice: records[i].Close };

Puntuación compuesta

Una vez completado el backtesting, se realiza una puntuación compuesta de los resultados de cada conjunto de parámetros. La puntuación consta de dos partes:

Puntuación ponderada normalizada (coeficiente total 0.80):

javascript
const score = Math.min(bt.winRate * 100, 100) * 0.30 // Tasa de acierto, con tope máximo de 100 + Math.min(bt.profitFactor * 20, 60) * 0.30 // Ratio beneficio/pérdida, con tope máximo de 60 + Math.max(0, 1 - bt.maxDrawdown / maxMDD) * 100 * 0.20 // Control de drawdown máximo + volPct * volPctBonus // Bono por percentil de volatilidad

Bono por percentil de volatilidad: El último término volPct × volPctBonus (coeficiente predeterminado de 10) es un elemento de bonificación independiente del sistema de ponderación. Se utiliza para, en igualdad de condiciones de puntuación, preferir monedas cuya volatilidad actual se encuentre en un percentil histórico alto, ya que estas monedas suelen mostrar tendencias más activas.

Cabe señalar que estos pesos y coeficientes de bonificación son configuraciones empíricas, no derivadas de optimización. En la práctica, se pueden ajustar según el entorno del mercado.

Primer nivel de competencia: Competencia de parámetros

Múltiples conjuntos de parámetros de la misma moneda obtienen sus propias puntuaciones, y se toma el de mayor puntuación como la puntuación representativa y el mejor parámetro de esa moneda:

javascript
if (score > bestScore) { bestScore = score; bestResult = bt; bestParams = params; // Registra la combinación de parámetros con mejor rendimiento histórico actual }

Segundo nivel de competencia: Competencia entre monedas

Todas las monedas presentan su mejor puntuación, se ordenan y se toman las Top N para ingresar a la lista blanca:

javascript
results.sort((a, b) => b.score - a.score); const whitelist = results.slice(0, topCoins).map(r => r.coin);

El resultado final son los parámetros de medias móviles óptimos específicos para cada moneda en la lista blanca, no un único conjunto de parámetros para todas.

Tercer nivel: Ejecución en tiempo real y control de riesgos

Se utiliza la configuración seleccionada para operar en tiempo real, superponiendo múltiples capas de control de riesgos:

Activación de señales: Se detecta en tiempo real el estado de cruce de medias móviles de las monedas en la lista blanca; cruce dorado para largos, cruce mortal para cortos:

javascript
const crossUp = fastPrev <= slowPrev && fastCur > slowCur; const crossDown = fastPrev >= slowPrev && fastCur < slowCur; if (crossUp) longList.push(sym); if (crossDown && allowShort) shortList.push(sym);

Trailing stop dinámico: Se activa cuando la ganancia flotante alcanza el umbral de activación, y el umbral de retroceso se ajusta dinámicamente según la ganancia. Los tres niveles de umbral son configuraciones empíricas; la lógica central es que cuanto mayor es la ganancia flotante, menor es la tolerancia al retroceso, para asegurar las ganancias obtenidas:

javascript
function getDynamicTrailDrawdown(maxPnl) { if (maxPnl >= 7) return 3; // Alta ganancia, se endurece la tolerancia al retroceso if (maxPnl >= 4) return 2; return 1.5; // Baja ganancia, se da más espacio al movimiento }

Percepción del estado del mercado: Se detecta el percentil de volatilidad de BTC. En entornos de alta volatilidad, se reduce automáticamente el coeficiente de tamaño de posición; en condiciones extremas, se prohíben directamente las posiciones cortas:

javascript
if (marketState === 'volatile') positionScaleDown = 0.5; else if (marketState === 'high_vol') positionScaleDown = 0.8; else if (marketState === 'low_vol') positionScaleDown = 0.7;

Todo el proceso de selección se repite periódicamente de forma rodante, sin aferrarse a una configuración fija, actualizando dinámicamente la lista blanca y los parámetros según el mercado.


Supuesto subyacente: Continuidad de la tendencia

Para que este marco funcione, se necesita un supuesto central:

Las monedas y parámetros que han tenido un buen rendimiento en la historia reciente mantendrán cierta continuidad en el corto plazo siguiente.

Esto no es metafísica; detrás hay cierta lógica de mercado que lo respalda: la inercia de los fondos, la continuidad del sentimiento del mercado y la coherencia del comportamiento de los grandes actores hacen que la tendencia se mantenga válida dentro de una ventana temporal determinada.

Pero hay que ser honesto: esta hipótesis no ha sido verificada estadísticamente de forma rigurosa; es más un juicio empírico. Si el marco puede mantenerse efectivo en la operativa real, al final solo se puede comprobar con datos de trading reales.


¿Cuál es la diferencia con un verdadero Harness Engineer?

Hay que dejarlo claro.

Esta estrategia tiene la forma de un Harness, pero en comparación con el sistema real de Harness Engineer, todavía hay diferencias evidentes:

DimensiónVerdadero HarnessEsta estrategia
División de muestrasConjunto de entrenamiento + conjunto de validación + conjunto de prueba holdoutBacktesting con todos los datos históricos, sin validación fuera de muestra
Protección contra sobreajustePruebas explícitas de generalizaciónDependencia parcial de la diversidad de parámetros para cubrirse, incompleta
Aislamiento experimentalCada variante se ejecuta de forma independiente sin interferenciasComparten las mismas velas K, con acoplamiento implícito
Requisito de puesta en producciónDebe pasar validación antes de desplegarseLa de mayor puntuación se despliega directamente, sin capa de verificación secundaria
Acumulación de erroresEvaluación independiente en cada capaLas dos capas de competición se basan en el óptimo histórico, error acumulado

La diferencia clave: el verdadero Harness pregunta "¿este resultado sigue siendo válido fuera de la muestra?", mientras que esta estrategia selecciona el "óptimo" en ambas capas de competición, que en esencia son óptimos históricos — sobreajuste a nivel de parámetros, superpuesto con sobreajuste a nivel de monedas. Si esto se mantendrá en el futuro es una pregunta siempre abierta.


Conclusión: ¿buscar la espada marcando el barco, o vale la pena intentarlo?

En el mundo cuantitativo, predecir siempre ha sido algo extremadamente difícil.

Muchos dirán que usar datos históricos para seleccionar parámetros y luego operar en real es, en esencia, buscar la espada marcando el barco — la espada ya cayó al agua, y la marca que hiciste en el barco no te ayudará a encontrarla. El mercado cambia, los parámetros efectivos dejan de serlo, la moneda milagrosa de hoy puede volverse mediocre mañana, y la mejor media móvil de ayer puede ser solo ruido hoy.

Esta crítica no carece de fundamento.

Pero dicho esto, uno debe intentar lo que se debe intentar.

La esencia del quant no es encontrar una respuesta eternamente correcta, sino mejorar sistemáticamente la probabilidad de éxito en medio de la incertidumbre. Incluso si es buscar la espada marcando el barco, primero necesitas un barco y hacer la marca — posicionar la estrategia (el barco) ya es el inicio del quant.

Por supuesto, el marco no garantiza ganancias. Tener el marco es solo el punto de partida; el verdadero valor reside en la ejecución e iteración continua: la lista blanca se puede ajustar, los pesos de puntuación se pueden modificar, el espacio de parámetros se puede ampliar, el take profit y stop loss se pueden optimizar. Cada ajuste es un nuevo experimento, acercando este marco al verdadero Harness.

El camino se hace al andar, no al pensar.

Código fuente de la estrategia: Estrategia cuantitativa de selección de medias móviles Harness Engineer

Comment
All comments (0)
No data
No data
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)