matplotlib.finance.candlestick_ohlc traza intradía datos de barras de 1 minuto con intervalos de tiempo y tags xtic adecuadas a cada hora

El problema es:

Quiero trazar las barras OHLC intradía de 1 minuto de una acción. La hora de negociación diaria se compone de varios segmentos de períodos de negociación. Que se enumeran a continuación:

Fecha de contratación: 2017/09/14

Hora comercial incluida: 2017/09/13 21:00 – 23:00, 2017/09/14 9:00 – 10:15, 10:30 – 11:30, 13:30 – 15:00.

Como puede ver, si solo uso candlestick_ohlc directamente, habrá huecos.

Ahora si consigo 1 minuto de datos como un dataframe. ¿Cómo puedo trazar un gráfico de velas, sin espacios entre las barras (por ejemplo, sin espacios entre las 10:15 y 10:30), y tener las tags xtick que solo muestran las marcas principales a cada hora, como las 22:00, 23? 00, 10:00 y garrapatas menores cada 15 minutos, como 21:15, 21:30, 21:45, etc.

Aquí hay una imagen de cómo se ve mi dataframe para 1 día de negociación: introduzca la descripción de la imagen aquí

Puedes generar algunos pseudodatos con forma similar aquí:

 def generate_pseudo_data(): # datetime index data idx = pd.date_range('2017-09-13 21:01:00', '2017-09-13 23:00:00', freq='1min') idx = idx.append(pd.date_range('2017-09-14 09:01:00', '2017-09-14 10:15:00', freq='1min')) idx = idx.append(pd.date_range('2017-09-14 10:31:00', '2017-09-14 11:30:00', freq='1min')) idx = idx.append(pd.date_range('2017-09-14 13:31:00', '2017-09-14 15:00:00', freq='1min')) # OHLC inc = np.random.randint(-2, 3, size=idx.shape).cumsum() opens = 3500 + inc closes = opens + np.random.randint(-3, 3, idx.shape) range_max = np.max(np.concatenate([opens.reshape(-1, 1), closes.reshape(-1, 1)], axis=1), axis=1) highs = range_max + np.random.randint(0, 5, size=idx.shape) range_min = np.min(np.concatenate([opens.reshape(-1, 1), closes.reshape(-1, 1)], axis=1), axis=1) lows = range_min - np.random.randint(0, 5, size=idx.shape) bar_df = pd.DataFrame({'open': opens, 'high': highs, 'low': lows, 'close': closes}, index=idx) return bar_df 

Vi en el módulo matplotlib.finance, hay candlestic2_ohlc , y candlestick_ohlc . Mi primera prueba fue usar candlestick2_ohlc ya que no requiere un argumento de datetime y datetime numérico que desordene las barras con muchos huecos. No tengo brechas, pero no puedo hacer las tags xticklab como lo que quiero porque no sé cómo pasar la información datetimeIndex a las tags xticklabels ahora.

Esto es lo que he intentado primero: Básicamente aprendí de este post: ¿cómo trazar el candelero ohlc con datetime en matplotlib?

 from datetime import datetime, time import pandas as pd import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.finance import candlestick2_ohlc, candlestick_ohlc import matplotlib.dates as mdates from matplotlib import ticker bar_df = generate_pseudo_data() fig, ax = plt.subplots() figManager = plt.get_current_fig_manager() figManager.window.showMaximized() candlestick2_ohlc(ax, bar_df.open, bar_df.high, bar_df.low, bar_df.close, width=0.6, colorup='r', colordown='c', alpha=1) xdate = bar_df.index def mydate(x, pos): try: return xdate[int(x)] except IndexError: return '' ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate)) # Everything works fine up to now. # However the xticklabels are not exactly at 22:00, 23:00, etc. # And no minor tick labels set up at 21:15, 21:30, 21:45, etc. # I tried either one of the command below, but both failed with no xticklabels # showed up. ax.xaxis.set_major_locator(mdates.HourLocator()) ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0, 15, 30, 45], interval=1)) # This one works because it only tells xticklabels to have at most # 8 tick labels, but no info about where the xticklabels should be. ax.xaxis.set_major_locator(ticker.MaxNLocator(8)) 

El resultado de candlestick_ohlc

Por favor ayuda.

Actualmente estás trazando los datos contra su índice. Sin embargo, si desea utilizar los localizadores y formateadores matplotlib.dates deberá trazar las fechas en los ejes. Esto no es posible utilizando candlestick2_ohlc . En su lugar, necesitarías usar la función candlestick_ohlc . En realidad, esto también se dice en esta respuesta a la pregunta a la que te vinculas. Sin embargo, el uso de las fechas reales no permite fusionar los sements, salvo la posibilidad de trazar en diferentes subplots, consulte el ejemplo de ax ejes rotos .

Por lo tanto, una solución aquí podría consistir en trazar el índice y establecer las marcas en las ubicaciones que correspondan a las tags de marca deseadas.

 xdate = bar_df.index def mydate(x, pos): try: return xdate[int(x)] except IndexError: return '' # create date ranges of possible dates to show as major and minor ticklabels major_dr = pd.date_range('2017-09-13 21:00:00','2017-09-14 15:00:00', freq='60min') minor_dr = pd.date_range('2017-09-13 21:00:00','2017-09-14 15:00:00', freq='15min') # calculate positions of the above dates inside the dataframe index major_ticks = np.isin(xdate, major_dr).nonzero()[0] minor_ticks = np.isin(xdate, minor_dr).nonzero()[0] # use those positions to put ticks at ax.xaxis.set_major_locator(ticker.FixedLocator(major_ticks)) ax.xaxis.set_minor_locator(ticker.FixedLocator(minor_ticks)) ax.minorticks_on() ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate)) fig.autofmt_xdate() 

El resultado se vería como

introduzca la descripción de la imagen aquí

Esto es una lectura muy confusa, pero a mi entender, esto es lo que pregunta la pregunta.