2009-07-06 16 views
12

Was sind meine besten Optionen zum Erstellen eines finanziellen Open-High-Low-Close-Diagramms (OHLC) in einer höheren Programmiersprache wie Ruby oder Python? Während es viele Optionen für die grafische Darstellung zu geben scheint, habe ich keine Edelsteine ​​oder Eier mit dieser Art von Diagramm gesehen.Finanzdiagramme/Graphen in Ruby oder Python

http://en.wikipedia.org/wiki/Open-high-low-close_chart (aber ich weiß nicht brauchen, um die gleitenden Durchschnitt oder Bollinger Bands)

JFreeChart kann dies tun, in Java, aber ich mag meine Codebasis so klein und einfach wie möglich machen.

Danke!

Antwort

17

Sie können matplotlib und den optionalen bottom Parameter von matplotlib.pyplot.bar verwenden. Sie können dann plot verwenden Linie, die die Anfangs- und Endwerte, um anzuzeigen:

Zum Beispiel:

#!/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() 

schafft eine Handlung wie folgt aus:

enter image description here

Offensichtlich würden Sie wollen verpacken Sie dies in einer Funktion, die den Plot unter Verwendung von (open, close, min, max) Tupel gezeichnet hat (und Sie würden wahrscheinlich nicht zufällig Ihre Eröffnungs- und Schlusskurse zuweisen).

+0

Diese Art von Diagramm enthält nicht das Öffnen oder Schließen. –

+0

@Eric Ich habe Code hinzugefügt, um die Ticks für die Eröffnungs- und Schlusskurse zu zeichnen. Ich habe sie nicht gesehen, als ich das Diagramm auf der Wikipedia-Seite angeschaut habe (... und hatte keine Ahnung, dass sie dort sein sollten, weil ich kein Finanzmann bin :). –

+0

@Aaron - Nizza! Vielen Dank! –

4

Haben Sie in Betracht gezogen, R und das quantmod-Paket zu verwenden? Es bietet wahrscheinlich genau das, was Sie brauchen.

+0

Das sieht vielversprechend aus! Ich werde es so schnell wie möglich überprüfen. Vielen Dank! –

8

Sie können Pylab (matplotlib.finance) mit Python verwenden. Hier sind einige Beispiele: http://matplotlib.sourceforge.net/examples/pylab_examples/plotfile_demo.html. Es gibt einige gute Materialien speziell zu diesem Problem in Beginning Python Visualization.

Update: Ich denke, Sie können matplotlib.finance.candlestick für den japanischen Candlestick-Effekt verwenden.

+0

Leider ist keines davon die Art von Graph, die ich suche. –

+0

Sehen Sie, wenn das Update Sie näher bringt – unmounted

+0

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

1

Sie können JRuby anstelle von Ruby verwenden? Damit können Sie JFreeChart verwenden, und Ihr Code wäre immer noch in Ruby

+1

das gleiche gilt für jython, wenn Sie eher Python verwenden möchten. – Autoplectic

+0

Was ist der Vorteil von jython über Python in dieser Situation? –

+0

Eric: Das Gleiche wie Ruby - Jython würde ihm Zugriff auf Java-Klassen geben, so dass er JFreeChart verwenden könnte –

0

Open Flash Chart ist eine gute Wahl, wenn Sie das Aussehen von Beispielen mögen. Ich habe JavaScript/Canvas-Bibliothek wie Flot für HTML-eingebettete Diagramme bewegt, wie es mehr anpassbar ist und ich erwünschte Wirkung ohne viel Hacking (http://itprolife.worona.eu/2009/08/scatter-chart-library-moving-to-flot.html).

+0

die Frage bittet um ein Diagrammwerkzeug in ** Ruby ** oder ** Python ** ... die Lösungen, die du erwähntest, sind in entweder Flash oder Javascript ... – user1055604

0

Dies ist das Lager Chart ich vor wenigen Tagen ziehen Matplotlib mit, ich die Quelle auch geschrieben habe, für Ihre Referenz: StockChart_Matplotlib

4

einige Beispiele über finanzielle Plots (OHLC) matplotlib Verwendung finden Sie hier:

  • 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

Wenn die Codebeispiele kurz sind, fügen Sie sie bitte in Ihre Antwort ein, falls die Links nicht mehr funktionieren und die Leute sich nicht durchklicken müssen. – agf

+0

Hinzugefügt erstes Beispiel, der zweite ist zu lang IMHO. – karlacio