2009-07-06 29 views
12

¿Cuáles son mis mejores opciones para crear una tabla financiera de apertura-alto-bajo-cierre (OHLC) en un lenguaje de alto nivel como Ruby o Python? Si bien parece que hay muchas opciones para graficar, no he visto gemas ni huevos con este tipo de gráfico.Gráficos financieros/Gráficos en Ruby o Python

http://en.wikipedia.org/wiki/Open-high-low-close_chart (pero no necesito las bandas móviles o promedio de Bollinger)

JFreeChart puede hacer esto en Java, pero me gustaría hacer mi código base tan pequeño y simple como sea posible.

Gracias!

Respuesta

17

Puede usar matplotlib y el parámetro opcional bottom de matplotlib.pyplot.bar. A continuación, puede utilizar la línea de plot para indicar los precios de apertura y cierre:

Por ejemplo:

#!/usr/bin/env python 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import lines 

import random 


deltas = [4, 6, 13, 18, 15, 14, 10, 13, 9, 6, 15, 9, 6, 1, 1, 2, 4, 4, 4, 4, 10, 11, 16, 17, 12, 10, 12, 15, 17, 16, 11, 10, 9, 9, 7, 10, 7, 16, 8, 12, 10, 14, 10, 15, 15, 16, 12, 8, 15, 16] 
bases = [46, 49, 45, 45, 44, 49, 51, 52, 56, 58, 53, 57, 62, 63, 68, 66, 65, 66, 63, 63, 62, 61, 61, 57, 61, 64, 63, 58, 56, 56, 56, 60, 59, 54, 57, 54, 54, 50, 53, 51, 48, 43, 42, 38, 37, 39, 44, 49, 47, 43] 


def rand_pt(bases, deltas): 
    return [random.randint(base, base + delta) for base, delta in zip(bases, deltas)] 

# randomly assign opening and closing prices 
openings = rand_pt(bases, deltas) 
closings = rand_pt(bases, deltas) 

# First we draw the bars which show the high and low prices 
# bottom holds the low price while deltas holds the difference 
# between high and low. 
width = 0 
ax = plt.axes() 
rects1 = ax.bar(np.arange(50), deltas, width, color='r', bottom=bases) 

# Now draw the ticks indicating the opening and closing price 
for opening, closing, bar in zip(openings, closings, rects1): 
    x, w = bar.get_x(), 0.2 

    args = { 
    } 

    ax.plot((x - w, x), (opening, opening), **args) 
    ax.plot((x, x + w), (closing, closing), **args) 


plt.show() 

crea una trama de esta manera:

enter image description here

Obviamente, usted quiere empaquete esto en una función que dibujó la trama usando (open, close, min, max) tuplas (y probablemente no le gustaría asignar aleatoriamente sus precios de apertura y cierre).

+0

Este tipo de gráfico no incluye el de abrir o cerrar. –

+0

@Eric Agregué el código para dibujar las marcas de los precios de apertura y cierre. No los vi cuando miré la tabla en la página de wikipedia (... y no tenía idea de que se suponía que debían estar allí porque no soy un tipo financiero :). –

+0

@ Aaron - ¡Agradable! ¡Gracias! –

4

¿Ha considerado usar R y el paquete quantmod? Es probable que proporcione exactamente lo que necesita.

+0

Esto parece prometedor! Lo comprobaré lo antes posible. ¡Gracias! –

8

Puede usar Pylab (matplotlib.finance) con Python. Aquí hay algunos ejemplos: http://matplotlib.sourceforge.net/examples/pylab_examples/plotfile_demo.html. Hay algún buen material específicamente sobre este problema en Beginning Python Visualization.

Actualización: Creo que puede usar matplotlib.finance.candlestick para el efecto de vela japonesa.

+0

Desafortunadamente, ninguno de estos es el tipo de gráfico que estoy buscando. –

+0

Vea si la actualización lo acerca más – unmounted

+0

http://matplotlib.sourceforge.net/examples/pylab_examples/finance_demo.html – Piotr

1

¿Eres libre de utilizar JRuby en lugar de Ruby? Eso le permitiría usar JFreeChart, además su código aún estaría en Ruby

+1

Lo mismo se aplica a jython, si está más inclinado a usar python. – Autoplectic

+0

¿Cuál es la ventaja de usar jython sobre python en esta situación? –

+0

Eric: lo mismo que Ruby: usar Jython le daría acceso a las clases de Java, por lo que podría usar JFreeChart –

0

Open Flash Chart es una buena opción si le gusta el aspecto de ejemplos. Me he movido a la biblioteca JavaScript/Canvas como Flot para gráficos HTML integrados, ya que es más personalizable y obtengo el efecto deseado sin mucho hackeo (http://itprolife.worona.eu/2009/08/scatter-chart-library-moving-to-flot.html).

+0

la pregunta es pedir una herramienta de gráficos en ** ruby ​​** o ** python ** ... las soluciones que mencionó están en ya sea flash o javascript ... – user1055604

0

Esta es la tabla de valores que dibujo hace apenas unos días usando Matplotlib, he publicado la fuente también, para su referencia: StockChart_Matplotlib

4

Algunos ejemplos sobre parcelas financieros (OHLC) utilizando matplotlib se puede encontrar aquí:

  • finance demo

    #!/usr/bin/env python 
    from pylab import * 
    from matplotlib.dates import DateFormatter, WeekdayLocator, HourLocator, \ 
        DayLocator, MONDAY 
    from matplotlib.finance import quotes_historical_yahoo, candlestick,\ 
        plot_day_summary, candlestick2 
    
    # (Year, month, day) tuples suffice as args for quotes_historical_yahoo 
    date1 = (2004, 2, 1) 
    date2 = (2004, 4, 12) 
    
    
    mondays = WeekdayLocator(MONDAY)  # major ticks on the mondays 
    alldays = DayLocator()    # minor ticks on the days 
    weekFormatter = DateFormatter('%b %d') # Eg, Jan 12 
    dayFormatter = DateFormatter('%d')  # Eg, 12 
    
    quotes = quotes_historical_yahoo('INTC', date1, date2) 
    if len(quotes) == 0: 
        raise SystemExit 
    
    fig = figure() 
    fig.subplots_adjust(bottom=0.2) 
    ax = fig.add_subplot(111) 
    ax.xaxis.set_major_locator(mondays) 
    ax.xaxis.set_minor_locator(alldays) 
    ax.xaxis.set_major_formatter(weekFormatter) 
    #ax.xaxis.set_minor_formatter(dayFormatter) 
    
    #plot_day_summary(ax, quotes, ticksize=3) 
    candlestick(ax, quotes, width=0.6) 
    
    ax.xaxis_date() 
    ax.autoscale_view() 
    setp(gca().get_xticklabels(), rotation=45, horizontalalignment='right') 
    
    show() 
    

enter image description here

+0

Si los ejemplos del código son cortos, inclúyalos en su respuesta en caso de que los enlaces se agoten, para que la gente no tenga que hacer clic. – agf

+0

Se agregó el primer ejemplo, el segundo es demasiado largo en mi humilde opinión. – karlacio

Cuestiones relacionadas