2012-03-12 17 views
15

Ho avuto qualche difficoltà con il diagramma finanziario di Matplotlib. Sembra che i loro grafici a candele funzionino al meglio con i dati giornalieri e sto avendo difficoltà a farli funzionare con i dati intraday (ogni 5 minuti, tra 9:30 e 4   pm).Grafici candlestick intraday con Matplotlib

Ho incollato i dati di esempio in pastebin. La parte superiore è ciò che ottengo dal database e la parte inferiore è tupla con la data formattata in un float ordinale da utilizzare in Matplotlib.

Link to sample data

Quando disegno le mie classifiche ci sono enormi lacune in essa, gli assi succhiare, e lo zoom è altrettanto orribile. http://imgur.com/y7O8A

Enter image description here

Come faccio a fare un bel grafico leggibile da questi dati? Il mio obiettivo finale è quello di ottenere un grafico che assomiglia lontanamente simile a questo:

Enter image description here

http://i.imgur.com/EnrTW.jpg

I punti dati possono essere in vari incrementi da 5 minuti a 30 minuti.


ho anche fatto un dataframe Pandas dei dati, ma non sono sicuro se i panda ha funzionalità candelabro.

+1

Dal dati da Lei forniti, sembra che i dati sono stati raccolti ogni giorno ogni 30 minuti 9:30-04:00. Il divario potrebbe riflettere l'intervallo tra le 4:00 PM e le 9:30 AM tra i giorni in cui non sono stati acquisiti dati. A proposito, usando la librairy [panda] (http://pandas.pydata.org/) puoi gestire e analizzare direttamente i tuoi dati grezzi e tracciarli. – gcalmettes

+0

Pandas non sembra in grado di tracciare dati ohlc/candlestick ... – NoviceCoding

+1

collegamento pastebin non è più disponibile – alexandroid

risposta

41

Se ho capito bene, uno dei tuoi maggiori interessi è il divario tra i dati giornalieri. Per sbarazzarsi di loro, un metodo è quello di "spazializzare" in modo artificioso i dati (ma ovviamente perderai ogni indicazione temporale durante il giorno).

Ad ogni modo, in questo modo, sarete in grado di ottenere un grafico che assomiglia a quello che avete proposto come esempio.

Il codice commentato e il grafico risultante sono di seguito.

import numpy as np 
import matplotlib.pyplot as plt 
import datetime 

from matplotlib.finance import candlestick 
from matplotlib.dates import num2date 

# data in a text file, 5 columns: time, opening, close, high, low 
# note that I'm using the time you formated into an ordinal float 
data = np.loadtxt('finance-data.txt', delimiter=',') 

# determine number of days and create a list of those days 
ndays = np.unique(np.trunc(data[:,0]), return_index=True) 
xdays = [] 
for n in np.arange(len(ndays[0])): 
    xdays.append(datetime.date.isoformat(num2date(data[ndays[1],0][n]))) 

# creation of new data by replacing the time array with equally spaced values. 
# this will allow to remove the gap between the days, when plotting the data 
data2 = np.hstack([np.arange(data[:,0].size)[:, np.newaxis], data[:,1:]]) 

# plot the data 
fig = plt.figure(figsize=(10, 5)) 
ax = fig.add_axes([0.1, 0.2, 0.85, 0.7]) 
    # customization of the axis 
ax.spines['right'].set_color('none') 
ax.spines['top'].set_color('none') 
ax.xaxis.set_ticks_position('bottom') 
ax.yaxis.set_ticks_position('left') 
ax.tick_params(axis='both', direction='out', width=2, length=8, 
       labelsize=12, pad=8) 
ax.spines['left'].set_linewidth(2) 
ax.spines['bottom'].set_linewidth(2) 
    # set the ticks of the x axis only when starting a new day 
ax.set_xticks(data2[ndays[1],0]) 
ax.set_xticklabels(xdays, rotation=45, horizontalalignment='right') 

ax.set_ylabel('Quote ($)', size=20) 
ax.set_ylim([177, 196]) 

candlestick(ax, data2, width=0.5, colorup='g', colordown='r') 

plt.show() 

graph

+1

Grazie mille per questo signore, sono stato lontano dalla programmazione della scorsa settimana o ti avrei dato la taglia in precedenza. Grazie ancora. – NoviceCoding

Problemi correlati