经典股票价格图表包含一条垂直线,连接每个时间段的最高价和最低价,左侧为开盘价(第一个),右侧为收盘价(最后一个价).
Matplotlib可以绘制日文版,称为烛台,但我无法找到西方版本的解决方案,简称为“条形图”. Matplotlib可以绘制这样的图表吗?
解决方法
调整matplotlib财务包(
documentation,code)中的烛台功能:
- def westerncandlestick(ax,quotes,width=0.2,colorup='k',colordown='r',ochl=True,linewidth=0.5):
- """
- Plot the time,open,high,low,close as a vertical line ranging
- from low to high. Use a rectangular bar to represent the
- open-close span. If close >= open,use colorup to color the bar,otherwise use colordown
- Parameters
- ----------
- ax : `Axes`
- an Axes instance to plot to
- quotes : sequence of quote sequences
- data to plot. time must be in float date format - see date2num
- (time,close,...) vs
- (time,...)
- set by `ochl`
- width : float
- fraction of a day for the open and close lines
- colorup : color
- the color of the lines close >= open
- colordown : color
- the color of the lines where close < open
- ochl: bool
- argument to select between ochl and ohlc ordering of quotes
- linewidth: float
- linewidth of lines
- Returns
- -------
- ret : tuple
- returns (lines,openlines,closelines) where lines is a list of lines
- added
- """
- OFFSET = width / 2.0
- lines = []
- openlines = []
- closelines = []
- for q in quotes:
- if ochl:
- t,low = q[:5]
- else:
- t,close = q[:5]
- if close >= open:
- color = colorup
- else:
- color = colordown
- vline = Line2D( xdata=(t,t),ydata=(low,high),color=color,linewidth=linewidth,antialiased=True)
- lines.append(vline)
- openline = Line2D(xdata=(t - OFFSET,ydata=(open,open),antialiased=True)
- openlines.append(openline)
- closeline = Line2D(xdata=(t,t+OFFSET),ydata=(close,close),antialiased=True)
- closelines.append(closeline)
- ax.add_line(vline)
- ax.add_line(openline)
- ax.add_line(closeline)
- ax.autoscale_view()
- return lines,closelines
叫它,例如像这样:
- westerncandlestick(ax,width=0.6,linewidth=1.44,ochl=False)
当然,您可以使用colorup和colordown参数调整颜色.
完成上述情节的完整代码:
- import matplotlib.pyplot as plt
- from matplotlib.finance import quotes_historical_yahoo_ohlc
- from matplotlib.lines import Line2D
- def westerncandlestick(ax,linewidth=0.5):
- """
- Plot the time,close as a vertical line ranging
- from low to high. Use a rectangular bar to represent the
- open-close span. If close >= open,otherwise use colordown
- Parameters
- ----------
- ax : `Axes`
- an Axes instance to plot to
- quotes : sequence of quote sequences
- data to plot. time must be in float date format - see date2num
- (time,...) vs
- (time,...)
- set by `ochl`
- width : float
- fraction of a day for the open and close lines
- colorup : color
- the color of the lines close >= open
- colordown : color
- the color of the lines where close < open
- ochl: bool
- argument to select between ochl and ohlc ordering of quotes
- linewidth: float
- linewidth of lines
- Returns
- -------
- ret : tuple
- returns (lines,closelines) where lines is a list of lines
- added
- """
- OFFSET = width / 2.0
- lines = []
- openlines = []
- closelines = []
- for q in quotes:
- if ochl:
- t,low = q[:5]
- else:
- t,close = q[:5]
- if close >= open:
- color = colorup
- else:
- color = colordown
- vline = Line2D( xdata=(t,antialiased=True)
- lines.append(vline)
- openline = Line2D(xdata=(t - OFFSET,antialiased=True)
- openlines.append(openline)
- closeline = Line2D(xdata=(t,antialiased=True)
- closelines.append(closeline)
- ax.add_line(vline)
- ax.add_line(openline)
- ax.add_line(closeline)
- ax.autoscale_view()
- return lines,closelines
- from matplotlib.dates import DateFormatter,WeekdayLocator,\
- DayLocator,MONDAY
- # (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') # e.g.,Jan 12
- dayFormatter = DateFormatter('%d') # e.g.,12
- quotes = quotes_historical_yahoo_ohlc('INTC',date1,date2)
- if len(quotes) == 0:
- raise SystemExit
- fig,ax = plt.subplots()
- fig.subplots_adjust(bottom=0.2)
- ax.xaxis.set_major_locator(mondays)
- ax.xaxis.set_minor_locator(alldays)
- ax.xaxis.set_major_formatter(weekFormatter)
- westerncandlestick(ax,ochl=False)
- ax.xaxis_date()
- ax.autoscale_view()
- plt.setp(plt.gca().get_xticklabels(),rotation=45,horizontalalignment='right')
- plt.show()