3 votos

Detectar un patrón especificado en un conjunto de datos de destino con Python

Esta pregunta es una especie de continuación de este pero quería compartir los progresos que he hecho y pedir ayuda en la parte en la que estoy atascado.

La historia corta es que tengo un patrón almacenado en un simple array de datos, luego tengo un conjunto de datos y necesito comprobar las ocurrencias del patrón que especifiqué en el otro conjunto de datos.

Esto es lo que hice:

  1. Obtener un conjunto de datos OHLC en un dataframe de pandas
  2. Calcular los mínimos y máximos locales para esos datos de OHLC
  3. Obtener una matriz de mínimos y máximos locales
  4. Normalizar la matriz de mínimos y máximos convirtiéndola en una matriz de números, donde cada número es la variación desde el punto anterior de mínimos/máximos locales.

En términos de código, así es como se pueden encontrar mínimos y máximos locales en un rango:

df['min'] = df.iloc[argrelextrema(df.Open.values, np.less_equal, order=n)[0]]['Open']
df['max'] = df.iloc[argrelextrema(df.Open.values, np.greater_equal, order=n)[0]]['Open']

Marco de datos:

         Open       min       max                Date
Loc
0    0.000336  0.000000  0.000336 2020-07-06 12:00:00
6    0.000330  0.000000  0.000330 2020-07-06 18:00:00
12   0.000320  0.000320  0.000000 2020-07-07 00:00:00
15   0.000328  0.000000  0.000328 2020-07-07 03:00:00
18   0.000320  0.000320  0.000000 2020-07-07 06:00:00
27   0.000330  0.000330  0.000000 2020-07-07 15:00:00
32   0.000351  0.000000  0.000351 2020-07-07 20:00:00
34   0.000342  0.000342  0.000000 2020-07-07 22:00:00
42   0.000368  0.000000  0.000368 2020-07-08 06:00:00
48   0.000381  0.000000  0.000381 2020-07-08 12:00:00
54   0.000361  0.000361  0.000000 2020-07-08 18:00:00
55   0.000361  0.000361  0.000000 2020-07-08 19:00:00
61   0.000378  0.000000  0.000378 2020-07-09 01:00:00
65   0.000367  0.000367  0.000000 2020-07-09 05:00:00
69   0.000375  0.000000  0.000375 2020-07-09 09:00:00
72   0.000373  0.000373  0.000000 2020-07-09 12:00:00
75   0.000388  0.000000  0.000388 2020-07-09 15:00:00
78   0.000378  0.000378  0.000000 2020-07-09 18:00:00
86   0.000411  0.000000  0.000411 2020-07-10 02:00:00
90   0.000395  0.000395  0.000000 2020-07-10 06:00:00
92   0.000402  0.000000  0.000402 2020-07-10 08:00:00
96   0.000417  0.000000  0.000417 2020-07-10 12:00:00
99   0.000411  0.000411  0.000000 2020-07-10 15:00:00
105  0.000433  0.000000  0.000433 2020-07-10 21:00:00
108  0.000427  0.000427  0.000000 2020-07-11 00:00:00
116  0.000479  0.000000  0.000479 2020-07-11 08:00:00
118  0.000458  0.000458  0.000000 2020-07-11 10:00:00
123  0.000467  0.000000  0.000467 2020-07-11 15:00:00
133  0.000425  0.000425  0.000000 2020-07-12 01:00:00
137  0.000447  0.000000  0.000447 2020-07-12 05:00:00
141  0.000434  0.000434  0.000000 2020-07-12 09:00:00
145  0.000446  0.000000  0.000446 2020-07-12 13:00:00
149  0.000434  0.000434  0.000000 2020-07-12 17:00:00

A continuación, convierta este marco de datos en una simple lista de mínimos y máximos: [0.0003361, 0.0003296, 0.0003197, 0.0003278, 0.0003204, 0.0003301, 0.0003513, 0.000342, 0.000368, 0.0003809, 0.0003611, 0.0003781, 0.000367, 0.0003747, 0.0003727, 0.0003884, 0.0003783, 0.0004105, 0.000395, 0.0004022, 0.0004168, 0.0004107, 0.0004334, 0.000427, 0.0004793, 0.000458, 0.0004668, 0.0004245, 0.0004472, 0.0004344, 0.0004457, 0.0004335]

Y luego convertirlo de nuevo en una simple matriz de porcentajes:

[-1.9339482296935422, -3.00364077669902, 2.533625273694082, -2.2574740695546116, 3.027465667915112, 6.4222962738564, -2.647309991460278, 7.602339181286544, 3.5054347826086927, -5.198214754528746, 4.7078371642204315, -2.9357312880190425, 2.098092643051778, -0.5337603416066172, 4.212503353903944, -2.600411946446969, 8.511763150938416, -3.775883069427527, 1.8227848101265856, 3.6300348085529524, -1.4635316698656395, 5.527148770392016, -1.476695892939546, 12.248243559718961, -4.443980805341117, 1.9213973799126631, -9.061696658097686, 5.347467608951697, -2.8622540250447197, 2.6012891344383067, -2.737267220103202]

Del conjunto de datos anterior, he extraído un patrón, que es el siguiente

Pattern = [7.602339181286544, 3.5054347826086927, -5.198214754528746, 4.7078371642204315, -2.9357312880190425, 2.098092643051778, -0.5337603416066172]

Cuando se grafica, se ve así:

Hasta ahora, todo funciona. Ahora necesito encontrar el patrón de esa figura en otros conjuntos de datos. Ese patrón está formado por los siguientes valores: Pattern = [7.602339181286544, 3.5054347826086927, -5.198214754528746, 4.7078371642204315, -2.9357312880190425, 2.098092643051778, -0.5337603416066172]

Así que necesitaré una forma de detectar el patrón anterior en otro conjunto de datos. Por ejemplo, si el otro conjunto de datos de destino será ese:

[-1.9339482296935422, -3.00364077669902, 2.533625273694082, -2.2574740695546116, 3.027465667915112, 6.4222962738564, -2.647309991460278, 7.602339181286544, 3.5054347826086927, -5.198214754528746, 4.7078371642204315, -2.9357312880190425, 2.098092643051778, -0.5337603416066172, 4.212503353903944, -2.600411946446969, 8.511763150938416, -3.775883069427527, 1.8227848101265856, 3.6300348085529524, -1.4635316698656395, 5.527148770392016, -1.476695892939546, 12.248243559718961, -4.443980805341117, 1.9213973799126631, -9.061696658097686, 5.347467608951697, -2.8622540250447197, 2.6012891344383067, -2.737267220103202]

¿Cómo puedo encontrar las partes de este conjunto de datos que serán más similares al patrón que he definido yo mismo?

Posibles soluciones que no sé cómo utilizar : Me han sugerido que utilice rechoncho o Python-DTW (Dynamic Time Warping). Pero para ambos no hay ejemplos sobre este tema en particular, así que si alguien puede ayudarme en esto, sería muy apreciado. Cualquier tipo de consejo, biblioteca, ejemplo, artículo sobre cómo resolver este problema es apreciado. He estado tratando durante mucho tiempo este problema y siento que sólo me falta la parte final para resolverlo finalmente

TL;DR Estoy tratando de encontrar patrones especificados por mí en conjuntos de datos OHLC. Para ello, he convertido los datos OHLC en un conjunto de mínimos y máximos locales. Ahora necesito entender cómo comparar un patrón específico con un conjunto de datos objetivo y detectar dónde el conjunto de datos es más similar al patrón que especifiqué.

2voto

Michael Butler Puntos 115

Su problema es reconocimiento de patrones . considerando que ya ha identificado el patrón de salida deseado (puntos de entrada/salida), puede utilizar supervisado métodos de aprendizaje automático para entrenar.

hay muchos disponibles, una máquina de vectores de apoyo, por ejemplo, le recomendamos que compruebe el scikit learn módulo, tiene implementaciones prácticas y rápidas.

tendría que dividir su muestra entre el entrenamiento y la prueba, posiblemente aumentando su eficacia con métodos de validación cruzada, por ejemplo k-fold

También es posible que desee tener en cuenta que el orden=n en la función argrelextrema, introduce un parámetro que hace que el proceso de aprendizaje sea vulnerable a sobreajuste .

para evitar esto, y teniendo en cuenta que la volatilidad de su serie temporal podría ser variable (el n óptimo podría variar), podría considerar el uso de modelos ocultos de markov para la identificación de los cambios de régimen.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X