1 votos

Detección de patrones en datos OHLC a partir de un patrón existente

Tengo el siguiente conjunto de datos OHLC:

[[datetime.datetime(2020, 7, 1, 6, 30), '0.00013449', '0.00013866', '0.00013440', '0.00013857', '430864.00000000', 1593579599999, '59.09906346', 1885, '208801.00000000', '28.63104974', '0', 3.0336828016952944], [datetime.datetime(2020, 7, 1, 7, 0), '0.00013854', '0.00013887', '0.00013767', '0.00013851', '162518.00000000', 1593581399999, '22.48036621', 809, '78014.00000000', '10.79595625', '0', -0.02165439584236435], [datetime.datetime(2020, 7, 1, 7, 30), '0.00013851', '0.00013890', '0.00013664', '0.00013780', '313823.00000000', 1593583199999, '43.21919087', 1077, '157083.00000000', '21.62390537', '0', -0.5125983683488642], [datetime.datetime(2020, 7, 1, 8, 0), '0.00013771', '0.00013818', '0.00013654', '0.00013707', '126925.00000000', 1593584999999, '17.44448931', 428, '56767.00000000', '7.79977280', '0', -0.46474475346744676], [datetime.datetime(2020, 7, 1, 8, 30), '0.00013712', '0.00013776', '0.00013656', '0.00013757', '62261.00000000', 1593586799999, '8.54915420', 330, '26921.00000000', '3.69342184', '0', 0.3281796966161107], [datetime.datetime(2020, 7, 1, 9, 0), '0.00013757', '0.00013804', '0.00013628', '0.00013640', '115154.00000000', 1593588599999, '15.80169390', 510, '52830.00000000', '7.24924784', '0', -0.8504761212473579], [datetime.datetime(2020, 7, 1, 9, 30), '0.00013640', '0.00013675', '0.00013598', '0.00013675', '66186.00000000', 1593590399999, '9.02070446', 311, '24798.00000000', '3.38107106', '0', 0.25659824046919455], [datetime.datetime(2020, 7, 1, 10, 0), '0.00013655', '0.00013662', '0.00013577', '0.00013625', '56656.00000000', 1593592199999, '7.71123423', 367, '27936.00000000', '3.80394497', '0', -0.2196997436836377], [datetime.datetime(2020, 7, 1, 10, 30), '0.00013625', '0.00013834', '0.00013625', '0.00013799', '114257.00000000', 1593593999999, '15.70194874', 679, '56070.00000000', '7.70405037', '0', 1.2770642201834814], [datetime.datetime(2020, 7, 1, 11, 0), '0.00013812', '0.00013822', '0.00013630', '0.00013805', '104746.00000000', 1593595799999, '14.39147417', 564, '46626.00000000', '6.39959586', '0', -0.05068056762237037], [datetime.datetime(2020, 7, 1, 11, 30), '0.00013805', '0.00013810', '0.00013720', '0.00013732', '37071.00000000', 1593597599999, '5.10447229', 231, '16349.00000000', '2.25258584', '0', -0.5287939152480996], [datetime.datetime(2020, 7, 1, 12, 0), '0.00013733', '0.00013741', '0.00013698', '0.00013724', '27004.00000000', 1593599399999, '3.70524540', 161, '15398.00000000', '2.11351192', '0', -0.06553557125171522], [datetime.datetime(2020, 7, 1, 12, 30), '0.00013724', '0.00013727', '0.00013687', '0.00013717', '27856.00000000', 1593601199999, '3.81864840', 140, '11883.00000000', '1.62931445', '0', -0.05100553774411102], [datetime.datetime(2020, 7, 1, 13, 0), '0.00013716', '0.00013801', '0.00013702', '0.00013741', '83867.00000000', 1593602999999, '11.54964001', 329, '42113.00000000', '5.80085155', '0', 0.18226888305628908], [datetime.datetime(2020, 7, 1, 13, 30), '0.00013741', '0.00013766', '0.00013690', '0.00013707', '50299.00000000', 1593604799999, '6.90474065', 249, '20871.00000000', '2.86749244', '0', -0.2474346845207872], [datetime.datetime(2020, 7, 1, 14, 0), '0.00013707', '0.00013736', '0.00013680', '0.00013704', '44745.00000000', 1593606599999, '6.13189248', 205, '14012.00000000', '1.92132206', '0', -0.02188662727072625], [datetime.datetime(2020, 7, 1, 14, 30), '0.00013704', '0.00014005', '0.00013703', '0.00013960', '203169.00000000', 1593608399999, '28.26967457', 904, '150857.00000000', '21.00600041', '0', 1.8680677174547595]]

Eso parece, cuando se traza:

Intento hacer lo siguiente: detectar en otros conjuntos de datos OHLC un patrón parecido al anterior. No tiene que ser el mismo, sólo tiene que ser similar a esa, el número de velas no tiene por qué ser el mismo. Lo que tiene que ser similar es sólo su forma.

Lo que probé: Hasta ahora, sólo he conseguido recortar manualmente los datos OHLC que no necesito, para tener sólo los patrones que quiero. A continuación, he trazado utilizando un marco de datos pandas:

import mplfinance as mpf
import numpy as np
import pandas as pd

df = pd.DataFrame([x[:6] for x in OHLC], 
                          columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume'])

format = '%Y-%m-%d %H:%M:%S'
df['Date'] = pd.to_datetime(df['Date'], format=format)
df = df.set_index(pd.DatetimeIndex(df['Date']))
df["Open"] = pd.to_numeric(df["Open"],errors='coerce')
df["High"] = pd.to_numeric(df["High"],errors='coerce')
df["Low"] = pd.to_numeric(df["Low"],errors='coerce')
df["Close"] = pd.to_numeric(df["Close"],errors='coerce')
df["Volume"] = pd.to_numeric(df["Volume"],errors='coerce')

mpf.plot(df, type='candle', figscale=2, figratio=(50, 50))

Lo que pensaba: Una posible solución a este problema es el uso de redes neuronales, por lo que tendría que alimentar imágenes de los patrones que quiero a un NN y dejar que el bucle NN a través de otros gráficos y ver si puede encontrar los patrones que he especificado. Antes de ir por este camino, yo estaba buscando soluciones más simples, ya que no sé mucho acerca de las redes neuronales y no sé qué tipo de NN que tendría que hacer y qué herramientas se supone que debo usar.

Otra solución en la que estaba pensando era la siguiente: necesitaría, de alguna manera, convertir el patrón que quiero encontrar en otros conjuntos de datos en una serie de valores. Así, por ejemplo, los datos OHLC que he publicado anteriormente se cuantificarían de alguna manera, y en otro conjunto de datos OHLC sólo tendría que encontrar los valores que se acercan al patrón que quiero. Este enfoque es muy empírico por ahora y no sé cómo ponerlo en código. Creo que este proceso se llama normalización.

Una herramienta que me sugirieron utilizar: Stumpy

Lo que necesito: No necesito el código exacto, sólo necesito un ejemplo, un artículo, una biblioteca o cualquier tipo de fuente que me pueda indicar cómo trabajar cuando quiero detectar un cierto patrón especificado por mí en un conjunto de datos OHLC. Espero haber sido lo suficientemente específico; cualquier tipo de consejo es apreciado.

2voto

Ant Puntos 121

Una posible solución a este problema es utilizar redes neuronales ...

Recientemente se han publicado algunos trabajos académicos sobre la "Visión Financiera" que parecen responder a sus necesidades, pero implican redes neuronales profundas, lo que podría suponer una curva de aprendizaje muy pronunciada para usted.

El enlace al github es https://github.com/pecu/FinancialVision desde la que podrá acceder a los propios documentos, así como al código Python, cajas de herramientas, etc.

Si esto es demasiado

otra solución que estaba pensando ...

de es utilizar un marco basado en la Base_de_datos_MNIST . La base de datos MNIST es una base de datos de reconocimiento de dígitos que ha sido rastreada durante muchos años por los investigadores y hay literalmente muchas docenas de algoritmos/técnicas de aprendizaje automático que han sido entrenados en este conjunto de datos y que están fácilmente disponibles en línea en, por ejemplo, github. Todo lo que necesitas hacer es tomar uno de estos algoritmos y sustituir tus patrones de velas en lugar de los dígitos de la base de datos.

Para convertir las velas al formato "píxel" requerido, similar al de los dígitos, basta con crear una cuadrícula sin relleno de, por ejemplo, 10 filas y 10 columnas; la primera fila es el máximo del patrón de velas y la décima fila el mínimo, y cada columna representa una vela completa. Coloque el valor ohlc de cada vela por separado en el nivel de fila redondeado más cercano para cada columna de vela, representado por el valor 1, y luego "desenrolle" esta cuadrícula en un vector de 1 por 100 de 40 valores 1 y 60 ceros, que refleja exactamente el formato de la base de datos MNIST, pero con 100 píxeles teóricos. Asigne una etiqueta a cada patrón, por ejemplo, 1 al patrón nº 1, 2 al patrón nº 2, etc., y ya podrá utilizar cualquier marco disponible que se haya entrenado originalmente con la base de datos MNIST.

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