我在Matplotlib的财务图表方面遇到了一些困难。看起来他们的烛台图表对日常数据效果最好,而且我很难让他们在盘中(每5分钟,9:30到4点之间)数据工作。
我在pastebin中粘贴了样本数据。顶部是我从数据库中获得的,底部是格式化为日期浮点数的日期,以便在Matplotlib中使用。
当我绘制我的图表时,它有很大的间隙,轴吮吸,变焦同样可怕。 http://imgur.com/y7O8A
如何从这些数据中制作出可读的图表?我的最终目标是获得一个看起来像这样的图表:
数据点可以以5分钟到30分钟的各种增量进行。
我还制作了数据的Pandas数据帧,但我不确定pandas是否具有烛台功能。
答案 0 :(得分:47)
如果我理解得很清楚,您主要担心的是每日数据之间的差距。 要摆脱它们,一种方法是人为地“均匀地间隔”你的数据(但当然你会在日内丢失任何时间指示)。
无论如何,通过这种方式,您将能够获得一个与您提议的图表相似的图表。
评论代码和结果图如下所示。
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()
答案 1 :(得分:3)
我对matplotlib(和plotly)的不良性能以及缺少您要求的此类功能感到厌倦,因此实施了one of my own。这是这样的:
import finplot as fplt
import yfinance
df = yfinance.download('AAPL')
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])
fplt.show()
不仅关闭了自动关闭交易所的日子,而且具有更好的性能和更好的api。对于更像您最终寻找的东西:
import finplot as fplt
import yfinance
symbol = 'AAPL'
df = yfinance.download(symbol)
ax = fplt.create_plot(symbol)
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']], ax=ax)
fplt.plot(df['Close'].rolling(200).mean(), ax=ax, legend='SMA 200')
fplt.plot(df['Close'].rolling(50).mean(), ax=ax, legend='SMA 50')
fplt.plot(df['Close'].rolling(20).mean(), ax=ax, legend='SMA 20')
fplt.volume_ocv(df[['Open', 'Close', 'Volume']], ax=ax.overlay())
fplt.show()