Ruby 或 Python 中的财务图表/图形

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1089307/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 21:27:44  来源:igfitidea点击:

Financial Charts / Graphs in Ruby or Python

pythonrubychartsgraphfinancial

提问by Eric the Red

What are my best options for creating a financial open-high-low-close (OHLC) chart in a high level language like Ruby or Python? While there seem to be a lot of options for graphing, I haven't seen any gems or eggs with this kind of chart.

使用 Ruby 或 Python 等高级语言创建金融开盘-高-低-收盘 (OHLC) 图表的最佳选择是什么?虽然似乎有很多绘图选项,但我没有看到任何带有这种图表的宝石或鸡蛋。

http://en.wikipedia.org/wiki/Open-high-low-close_chart(but I don't need the moving average or Bollinger bands)

http://en.wikipedia.org/wiki/Open-high-low-close_chart(但我不需要移动平均线或布林带)

JFreeChart can do this in Java, but I'd like to make my codebase as small and simple as possible.

JFreeChart 可以在 Java 中做到这一点,但我想让我的代码库尽可能小和简单。

Thanks!

谢谢!

回答by Aaron Maenpaa

You can use matplotliband the the optional bottomparameter of matplotlib.pyplot.bar. You can then use line plotto indicate the opening and closing prices:

您可以使用matplotlib和可选bottom的参数matplotlib.pyplot.bar。然后您可以使用 lineplot来指示开盘价和收盘价:

For example:

例如:

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

creates a plot like this:

创建一个这样的情节:

enter image description here

在此处输入图片说明

Obviously, you'd want to package this up in a function that drew the plot using (open, close, min, max)tuples (and you probably wouldn't want to randomly assign your opening and closing prices).

显然,您希望将其打包到一个使用(open, close, min, max)元组绘制绘图的函数中(并且您可能不想随机分配开盘价和收盘价)。

回答by unmounted

You can use Pylab (matplotlib.finance) with Python. Here are some examples: http://matplotlib.sourceforge.net/examples/pylab_examples/plotfile_demo.html. There is some good material specifically on this problem in Beginning Python Visualization.

您可以将 Pylab ( matplotlib.finance) 与 Python 结合使用。以下是一些示例:http: //matplotlib.sourceforge.net/examples/pylab_examples/plotfile_demo.html。在Beginning Python Visualization 中有一些专门针对此问题的好材料。

Update: I think you can use matplotlib.finance.candlestickfor the Japanese candlestick effect.

更新:我认为您可以将matplotlib.finance.candlestick用于日本烛台效果。

回答by David Locke

Have you considered using R and the quantmodpackage? It likely provides exactly what you need.

您是否考虑过使用 R 和quantmod包?它可能正好提供您所需要的。

回答by karlacio

Some examples about financial plots (OHLC) using matplotlib can be found here:

可以在此处找到有关使用 matplotlib 的金融图 (OHLC) 的一些示例:

  • 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()
    
  • 金融演示

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

在此处输入图片说明

回答by karlacio

Are you free to use JRuby instead of Ruby? That'd let you use JFreeChart, plus your code would still be in Ruby

你可以自由地使用 JRuby 而不是 Ruby 吗?这会让您使用 JFreeChart,而且您的代码仍将使用 Ruby

回答by Aaron Watters

Please look at the Open Flash Chart embedding for WHIFF http://aaron.theitroadt.rutgers.edu/myapp/docs/W1100_1600.openFlashChartsAn example of a candle chart is right at the top. This would be especially good for embedding in web pages.

请查看 WHIFF 的 Open Flash Chart 嵌入 http://aaron.theitroadt.rutgers.edu/myapp/docs/W1100_1600.openFlashCharts蜡烛图的示例就在顶部。这对于嵌入网页尤其有用。

回答by Tomasz Worona

Open Flash Chart is nice choice if you like the look of examples. I've moved to JavaScript/Canvas library like Flotfor HTML embedded charts, as it is more customizable and I get desired effect without much hacking (http://itprolife.worona.eu/2009/08/scatter-chart-library-moving-to-flot.html).

如果您喜欢示例的外观,Open Flash Chart 是不错的选择。我已经转移到 JavaScript/Canvas 库,如用于 HTML 嵌入式图表的Flot,因为它更具可定制性,并且无需太多黑客攻击即可获得所需的效果(http://itprolife.worona.eu/2009/08/scatter-chart-library-移动到 flot.html)。

回答by Hymany Liu

This is the stock chart I draw just days ago using Matplotlib, I've posted the source too, for your reference: StockChart_Matplotlib

这是我几天前使用 Matplotlib 绘制的股票图表,我也发布了源代码,供您参考:StockChart_Matplotlib