Análisis de espectro singular (SSA) en MQL5
¿Qué es la SSA?
Las últimas versiones de MetaTrader 5 han introducido una integración inicial de métodos de OpenBLAS en sus tipos de datos básicos de vectores y matrices. Resulta especialmente interesante un conjunto de métodos relacionados con el análisis de espectro singular (SSA). En este artículo, analizamos las nuevas herramientas disponibles en MQL5 relacionadas con el SSA y explicamos cómo se pueden utilizar en el análisis y la previsión. Esta guía tiene como objetivo proporcionar un recurso para los traders que buscan aprovechar todo el potencial de SSA. Examinaremos la metodología básica del SSA, aclarando su proceso de descomposición y reconstrucción en dos etapas. Y lo que es más importante, analizaremos qué hace cada uno de los nuevos métodos vectoriales SSA y demostraremos cómo interpretar y combinar de forma óptima sus resultados para obtener información útil.
El análisis de espectro singular (SSA) es una técnica no paramétrica diseñada para el análisis y la previsión de datos de series temporales. Su objetivo es descomponer una serie temporal en unos pocos componentes aditivos, que normalmente incluyen una tendencia de variación lenta, varios ciclos y ruido residual. Una característica distintiva del SSA es su mínima dependencia de supuestos predeterminados con respecto al proceso subyacente de generación de datos. La base conceptual del SSA integra elementos de la estadística y el procesamiento de señales. En esencia, el SSA se basa en la descomposición espectral, lo que le permite revelar las características de frecuencia de una serie temporal mediante el análisis de sus componentes principales en un espacio de incrustación reconstruida. Puede conceptualizarse eficazmente como una forma de análisis de componentes principales (PCA) específicamente adaptada a datos de series temporales, que aprovecha los principios de reducción de dimensionalidad para descubrir estructuras y patrones ocultos que podrían estar oscurecidos por el ruido o las interacciones complejas.
SSA en MQL5
En MQL5, los cálculos SSA se implementan de forma nativa como métodos del tipo de datos vectorial y también en la biblioteca matemática Alglib. La principal ventaja de la implementación de SSA en Alglib reside en el procesamiento en tiempo real, mientras que la nueva funcionalidad de SSA, directamente accesible desde vectores, es más adecuada para el análisis exploratorio. Cabe señalar que, si bien este texto se centra principalmente en operaciones con números reales, también existen métodos equivalentes para números complejos que funcionan de manera similar, aunque su interpretación está adaptada al ámbito de los números complejos.
En cada uno de los nuevos métodos SSA vectoriales, el primer parámetro requerido es la especificación de la longitud de la ventana. Este parámetro determina cómo se transforma la serie temporal en una estructura de dimensiones superiores conocida como matriz de trayectoria. Uno podría preguntarse: "¿Por qué la necesidad de esta estructura de dimensiones superiores?" La clave reside en la relación de SSA con PCA. Recuerda que el análisis de componentes principales (PCA) es una técnica de reducción de dimensionalidad que se emplea en conjuntos de datos multivariados. El SSA reconstruye una serie temporal univariada en una estructura que se asemeja a un conjunto de datos multivariados. Esto se consigue organizando las secciones de la serie en filas de igual tamaño. Aquí, el tamaño de una fila viene definido por el parámetro de longitud de la ventana.
Consideremos una serie temporal Y=[y1,y2,y3,y4,y5,y6] de longitud N=6. Si se elige una longitud de ventana de L=3, se obtiene una matriz de trayectoria equivalente a la que se muestra a continuación.
El número de filas, R, en la matriz se calcula como R=N−L+1. En este ejemplo, R=6−3+1=4. Esta matriz, de dimensión R×L (en nuestro ejemplo, 4×3), es la matriz de trayectoria. Los patrones observados en las antidiagonales de esta matriz son característicos de una matriz de Hankel. La construcción de la matriz de trayectoria es el primer paso del método SSA. Por lo tanto, no sorprende que la longitud de la ventana sea un parámetro determinante del método SSA, ya que determina directamente las dimensiones de la matriz de trayectoria, lo que a su vez afecta significativamente la resolución y la separabilidad de la descomposición espectral.
Para dilucidar los conceptos de la metodología SSA, demostraremos su aplicación a una serie determinista, que se muestra a continuación.
Esta serie se construyó a partir de componentes aditivos predeterminados que consisten en una tendencia, un par de componentes periódicos y ruido aleatorio. Cuando se suman estos componentes, el resultado es una serie algo irregular. El objetivo del SSA es descubrir estos componentes subyacentes. Esto se consigue descomponiendo la matriz de trayectoria o la matriz de covarianza de la matriz de trayectoria, dando lugar a los modos propios, que, al igual que en el PCA, revelan los componentes principales de la serie.
Contribuciones relativas y acumulativas de los componentes
El método vectorial de MQL5, SingularSpectrumAnalysisSpectrum(), devuelve un vector que representa las contribuciones relativas de los componentes de una serie. Este vector contiene números reales cuya suma es igual a uno, lo que indica el peso relativo de cada componente, ordenados de forma descendente. Estas contribuciones corresponden a las magnitudes relativas de los valores propios calculados mediante la descomposición de una matriz.
//--- vector relative_contributions; if(!full_process.SingularSpectrumAnalysisSpectrum(WindowLen,relative_contributions)) { Print(" error ", GetLastError()); return; } //--- relative_contributions*=100.0; vector cumulative_contributions = relative_contributions.CumSum();
Cuando se calcula la suma acumulativa de las contribuciones relativas, obtenemos las contribuciones acumulativas. Estos valores nos permiten determinar rápidamente el menor número de componentes necesarios para lograr una aproximación relativamente cercana a la serie original. Un gráfico de las contribuciones relativas suele mostrar mesetas aproximadas bien definidas, lo que sugiere que algunas contribuciones de los componentes tienen un valor similar. Esta similitud suele indicar que estos componentes pueden representar un único elemento periódico.
A continuación se muestran los gráficos de contribución relativa y acumulativa para nuestra serie de ejemplo.
Estos resultados muestran que los dos primeros componentes contribuyen aproximadamente con el 68% y el 12% de la varianza total de la serie.
Los cinco primeros componentes por sí solos representan más del 98%. El gráfico de las contribuciones relativas dibuja una forma única que pone de manifiesto el predominio de los primeros 5 componentes. El punto que separa los componentes dominantes del resto se suele denominar "punto de codo", y los componentes por debajo de este nivel se conocen como "nivel de ruido". Proporciona una estimación aproximada de la separación entre la señal y el ruido. Otro aspecto destacable del gráfico de contribuciones relativas es cómo los componentes número dos y tres se agrupan separados de los componentes cuarto y quinto. Esto indica que estos grupos emparejados están relacionados y pueden representar características únicas de la serie.
Extracción de componentes de la serie
Tras analizar nuestra serie de ejemplo, ahora comprendemos los componentes principales que definen la mayor parte de su comportamiento. Para evaluar su regularidad, puede resultar beneficioso visualizar estos componentes. Aquí es donde resulta útil el método vectorial SingularSpectrumAnalysisReconstructComponents(). El resultado de particular interés es la matriz de series de componentes. Sin embargo, tenga en cuenta que, si bien la documentación de MQL5 sugiere que las columnas representan las series de componentes estimadas, el método en realidad almacena cada serie de componentes como una fila en la matriz. Además, el vector de salida del método contiene los valores propios originales de la descomposición de la matriz representativa de la serie.
//--- matrix components; vector eigvalues; if(!full_process.SingularSpectrumAnalysisReconstructComponents(WindowLen,components,eigvalues)) { Print(" error ", GetLastError()); return; } //---
Las filas de la matriz de series de componentes están ordenadas en orden decreciente de magnitud de contribución relativa. En consecuencia, la primera fila contiene el componente correspondiente al mayor valor propio, que también representa el componente con la mayor contribución relativa. A continuación se muestra un gráfico con todos los componentes de nuestra serie de ejemplo.
Si lo comparas con un gráfico de los componentes originales, es posible que observes algunas discrepancias. Esto pone de relieve el hecho de que la descomposición SSA no es exacta. Este método nunca podrá descifrar los componentes periódicos exactos de una serie. Lo único que puede hacer es encontrar aproximaciones o estimaciones óptimas de estos componentes. Sin embargo, la suma de las series de componentes individuales dará como resultado la serie original.
Filtración
Con el conjunto de series de componentes en mano, podemos utilizar la información del análisis SSA para inferir qué componentes describen la señal subyacente y cuáles representan ruido no determinista. Si nuestra principal preocupación son los ciclos dominantes, podemos descartar los componentes con contribuciones relativas más bajas para producir una serie filtrada. Al hacerlo, asumimos que estos componentes menores representan ruido que enmascara la señal principal.
Los usuarios pueden aplicar este filtrado directamente a una serie mediante el método SingularSpectrumAnalysisReconstructSeries(). El usuario especifica el número de componentes dominantes que se incluirán en la serie filtrada.
//--- vector filtered; if(!full_process.SingularSpectrumAnalysisReconstructSeries(WindowLen,FilterComponents,filtered)) { Print(" error ", GetLastError()); return; }
El método SSA suele ser eficaz para aislar el ruido, pero su efectividad depende de la naturaleza del ruido presente en el proceso. Es posible que descartar simplemente los componentes con contribuciones relativas más bajas no sea suficiente para aislar definitivamente el ruido. En consecuencia, esto también tiene un impacto en la extracción de señales, tendencias o componentes periódicos específicos. La interpretación de estos componentes a menudo necesita ser validada mediante pruebas estadísticas de significación. Otro aspecto que puede afectar al aislamiento de componentes específicos surge de la presencia de tendencias fuertes, cuyo predominio puede enmascarar otras oscilaciones de baja frecuencia en los datos.
Pronóstico
Uno de los aspectos más interesantes de la metodología SSA es su aplicación a la predicción. Esta funcionalidad la proporciona el método SingularSpectrumAnalysisForecast(). Una vez que la serie temporal se ha descompuesto y reconstruido, el paso de pronóstico generalmente utiliza un algoritmo recursivo de predicción. Este algoritmo aprovecha la relación recurrente lineal (RRL) inherente que suelen satisfacer los componentes reconstruidos. Se supone que estos componentes reconstruidos siguen un patrón predecible. A partir de los vectores singulares y la serie reconstruida, se determina un conjunto de coeficientes. Estos coeficientes representan la relación lineal entre los valores pasados y futuros dentro de la señal reconstruida. Para predecir un nuevo dato, el algoritmo aplica una combinación lineal de los valores anteriores de "longitud de ventana" de la serie reconstruida, ponderados por los coeficientes determinados. Este proceso se repite de forma iterativa para generar múltiples pronósticos.
//--- vector forecast; if(!full_process.SingularSpectrumAnalysisForecast(WindowLen,FilterComponents,ForecastLen,forecast)) { Print(" error ", GetLastError()); return; } //---
Resulta obvio que tales pronósticos parten de la base de que los patrones anteriores se manifestarán en el futuro exactamente como lo hicieron en el pasado. Por supuesto, es poco probable que esto sea cierto en el caso de las series temporales del mundo real. A pesar de ello, el SSA puede resultar útil para hacer que los procesos complejos sean más predecibles al centrarse en ciertos componentes con formas de onda regulares.
Selección de parámetros y preprocesamiento
Ya se ha demostrado que la descomposición de series con SSA nunca podrá extraer los componentes periódicos exactos de una serie temporal. Lo único que puede hacer es extraer estimaciones de los componentes. Esta es una limitación evidente del método, que se ve agravada aún más por la sensibilidad del método a la longitud de la ventana seleccionada. La elección de la longitud de ventana adecuada puede guiarse por los objetivos de la descomposición. Si el interés principal reside en aislar la tendencia, entonces cuanto mayor sea la longitud de la ventana, mejor. Sin embargo, si los componentes oscilatorios son de mayor importancia, los profesionales deben tener en cuenta los períodos de oscilación; por ejemplo, si se busca un componente periódico que oscile con un período de 20, entonces se debe establecer la longitud de la ventana en 20.
La evidencia empírica presentada en la literatura académica parece sugerir que la longitud de la ventana corresponde a la resolución de oscilaciones con períodos en el rango L/5 a L, donde L es la longitud de la ventana. El problema es que el período del componente de interés puede no conocerse de antemano, por lo que es necesario recurrir a muchos métodos de ensayo y error. La regla general es establecer la longitud de la ventana entre dos y la mitad de la longitud de la serie que se está estudiando. Una ventana de mayor longitud amplifica los componentes que varían más lentamente, mientras que las ventanas de menor longitud capturan detalles más finos.
Además de la sensibilidad del SSA a la longitud de la ventana, los profesionales también deben saber cómo las tendencias fuertes presentes en las series temporales pueden afectar los resultados de la descomposición. Las tendencias marcadas pueden enmascarar otros componentes de baja frecuencia en la serie. Este problema se puede solucionar principalmente eliminando la tendencia de la serie original antes de aplicar el SSA. Entre los tipos de preprocesamiento que se pueden aplicar se incluyen el centrado o la eliminación de la tendencia lineal, como se muestra en el fragmento de código a continuación.
//--- if(m_detrend) { vector reg = m_buffer.LinearRegression(); m_buffer -= reg; } //---
A la hora de decidir cuántos componentes seleccionar al filtrar o realizar pronósticos, los gráficos de contribuciones relativas y acumulativas pueden ser de gran ayuda. La característica que se debe identificar en un gráfico de contribuciones relativas es el punto de "codo", que distingue la señal del ruido. Los puntos en el gráfico asociados a una señal aparecerán por encima de una clara ruptura con respecto a los puntos cuyos valores disminuyen lentamente hacia cero. Lo mismo debería ser visible al examinar la disminución de los valores propios originales del proceso de descomposición. Otra opción viable es especificar un objetivo para el porcentaje total de varianza que se desea capturar, generalmente entre el 85 % y el 95 %, y luego obtener el número de componentes a los que corresponde ese valor dentro de la serie de contribuciones acumulativas.
Agrupación de componentes
Sabemos que la descomposición SSA no reproducirá mágicamente los componentes subyacentes exactos de una serie; lo hemos visto con un ejemplo sencillo. Lo que obtenemos es un conjunto de componentes que se aproximan a los componentes reales subyacentes. Solo tenemos que averiguar cómo combinar nuestras estimaciones para obtener una imagen más precisa de los elementos reales que definen el proceso. Esto se puede lograr construyendo la matriz de correlación ponderada de la serie de componentes. La matriz de correlación ponderada mide en qué medida un par de series de componentes difieren de la ortogonalidad perfecta. Si un par de componentes de una serie son perfectamente ortogonales, entonces es probable que sean componentes distintas.
Una correlación más alta indica que un par debe combinarse. El fragmento de código que se muestra a continuación describe una rutina que calcula la matriz de correlación ponderada a partir de una matriz de series de componentes y el parámetro de longitud de ventana de la descomposición SSA. La función está declarada en ssa.mqh, que se adjunta al artículo.
//+------------------------------------------------------------------+ //| component correlations | //+------------------------------------------------------------------+ matrix component_corr(ulong windowlen,matrix &components) { double w[]; ulong fsize = components.Cols(); ulong r = fsize - windowlen + 1; for(ulong i = 0; i<fsize; i++) { if(i>=0 && i<=windowlen-1) w.Push(i+1); else if(i>=windowlen && i<=r-1) w.Push(windowlen); else if(i>=r && i<=fsize-1) w.Push(fsize-i); } vector weights; weights.Assign(w); ulong d = windowlen; vector norms(d); matrix out = matrix::Identity(d,d); for(ulong i = 0; i<d; i++) { norms[i] = weights.Dot(pow(components.Row(i),2.0)); norms[i] = pow(norms[i],-0.5); } for(ulong i = 0; i<d; i++) { for(ulong j = i+1; j<d; j++) { out[i][j] = MathAbs(weights.Dot(components.Row(i)*components.Row(j))*norms[i]*norms[j]); out[j][i] = out[i][j]; } } return out; }
A continuación se muestra una sección de las correlaciones de componentes que conforman los seis componentes principales de nuestra serie de ejemplo.
El gráfico muestra la alta correlación entre los componentes en el índice (1:2), lo que corresponde a que los componentes 2 y 3 estén relacionados, mientras que los componentes referenciados en el índice (3:4) se refieren a la relación entre los componentes 4 y 5. Este análisis parece coincidir con la inspección visual del gráfico de contribuciones relativas que se vio anteriormente. A partir de aquí, podríamos plantear la hipótesis de que los dos grupos de componentes pueden corresponder a los componentes periódicos de nuestra serie de ejemplo. El componente superior, por sí solo, es claramente distinto y probablemente corresponde a la tendencia. Como ya vimos en las contribuciones acumuladas, estos 5 componentes representan el 98% de las contribuciones; por lo tanto, es probable que el resto sea ruido.
Visualización de descomposiciones de series de precios
En esta sección, presentamos una aplicación implementada como un Asesor Experto que puede utilizarse para visualizar los componentes de una muestra arbitraria de precios. La aplicación cuenta con una interfaz gráfica de usuario que permite a los usuarios configurar el símbolo, la fecha y la longitud de la serie de precios que se mostrará y descompondrá. Existe la opción de eliminar la tendencia de la serie antes de la descomposición. También se pueden visualizar, de forma opcional, los gráficos de contribución relativa y acumulativa. A continuación se muestra una captura de pantalla de la aplicación con una muestra de los precios de cierre del par EURUSD, con un componente descompuesto mostrado en el gráfico inferior.

Conclusión
Este artículo exploró las nuevas herramientas MQL5 para el análisis de espectro singular (SSA), destacando las adiciones de OpenBLAS al tipo de datos vectoriales. Ofrecimos una descripción concisa del método SSA, evitando intencionadamente explicaciones matemáticas detalladas. En resumen, el SSA es una herramienta valiosa para cualquier profesional, pero requiere una cuidadosa selección de parámetros y una comprensión de sus matices operativos para ser totalmente eficaz. Todo el código al que se hace referencia se incluye y se adjunta a continuación.
| Nombre del archivo | Descripción del archivo |
|---|---|
| MQL5/include/ssa.mqh | Este archivo de cabecera contiene la definición de la función que implementa el cálculo de las correlaciones de componentes descritas en la sección titulada Agrupación de componentes. |
| MQL5/scripts/SSA_Filtered_Demo.mq5 | Este es el script utilizado para demostrar el filtrado con SSA. |
| MQL5/scripts/SSA_Decomposition_Demo.mq5 | Este es el script utilizado para demostrar la descomposición de una serie con SSA. |
| MQL5/scripts/SSA_ComponentContributions_Demo.mq5 | Este es el script utilizado para demostrar la visualización de las contribuciones relativas de los componentes. |
| MQL5/scripts/SeriesPlot.mq5 | Este script se utilizó para graficar los diferentes componentes de la serie de ejemplo a la que se hace referencia en el artículo. |
| MQL5/experts/SSA_PriceDecomposition.ex5 | Este EA es un programa que se puede utilizar para mostrar la descomposición de una serie de precios arbitraria. |
| MQL5/experts/SSA_PriceDecomposition.mq5 | Este es el código fuente del EA mencionado anteriormente. |
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/18777
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Redes neuronales en el trading: Previsión probabilística de series temporales (Codificador)
Del básico al intermedio: Acceso aleatorio (II)
Red neuronal cuántica en MQL5 (Parte I): Creamos un archivo de inclusión
Simulación de mercado: Position View (V)
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Es extraño ver artículos tan parecidos sobre el mismo tema (aunque uno de ellos se escribiera originalmente en ruso) en muy poco tiempo.
Artículos
Análisis de espectros singulares unidimensionales
Evgeny Chernish, 23/04/2025 11:23
El artículo examina los aspectos teóricos y prácticos del método de análisis de espectro singular (ASS), que es un método eficaz para analizar series temporales que permite representar la estructura compleja de una serie como una descomposición en componentes simples, como la tendencia, las fluctuaciones estacionales (periódicas) y el ruido.