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:
- Obtener un conjunto de datos OHLC en un dataframe de pandas
- Calcular los mínimos y máximos locales para esos datos de OHLC
- Obtener una matriz de mínimos y máximos locales
- 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é.