我有很多股票数据,我想从中建立一个与此类似的OHLC图表(开盘价,最高价,最低价,收盘价):
为此我使用matplotlib.finance中的烛台功能。我有分钟数据,所以为了制作日内图表我使用了this other stackoverflow thread,它均匀地隔开了所有烛台,以避免日子之间的差距(因为在下午5:30到9:00之间没有数据)上午)。这对于少量数据来说效果相当不错,但不幸的是我有很多数据(每天510分钟* 10年≈100万分钟)。根据这些数据,我想制作一个概述的图表,但也可以放大,以便我可以查看历史中特定日期的单独会议记录。
为了做到这一点,我想到了制作一个巨大的(非常宽的)图形,保存它,然后我可以简单地放大任何图像查看器。
我现在有一些代码,我从另一个线程复制并调整了一下。在代码中我首先创建一些随机样本数据(因为删除了另一个线程中的原始样本数据)。根据这些数据,我然后绘制一个具有固定烛台宽度的数字和一个数字宽度的数字宽度乘以单个烛台宽度(len(数据)* candlestickWidth)。代码和结果图像在下面,每天只有2天15分钟(所以总共30分钟)。
我现在的问题是:如何定位烛台以使它们之间没有空格,以便图像宽度取决于木棒的数量,以便在我添加更多分钟时它变宽?
欢迎所有提示!
import numpy as np
import matplotlib.pyplot as plt
import datetime
import random
from matplotlib.finance import candlestick
from matplotlib.dates import num2date, date2num
# Create sample data for 5 days. Five columns: time, opening, close, high, low
jaar = 2007
maand = 05
data = np.array([[1.0,1.0,1.0,1.0,1.0]])
quotes = [(5, 6, 7, 4), (6, 9, 9, 6), (9, 8, 10, 8), (8, 6, 9, 5), (8, 11, 13, 7)]
for dag in range(5, 7):
for uur in range(9, 10):
for minuut in range(15):
numdatumtijd = date2num(datetime.datetime(jaar, maand, dag, uur, minuut))
koersdata = quotes[random.randint(0,4)]
data = np.append(data, [[numdatumtijd, koersdata[0], koersdata[1], koersdata[2], koersdata[3], ]], axis=0)
data = np.delete(data, 0, 0)
print('Ready with building sample data')
# 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
candlestickWidth = 0.2
figWidth = len(data) * candlestickWidth
fig = plt.figure(figsize=(figWidth, 5))
ax = fig.add_axes([0.05, 0.1, 0.9, 0.9])
# 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]) ## (Also write the code to set a tick for every whole hour)
ax.set_xticklabels(xdays, rotation=45, horizontalalignment='right')
ax.set_ylabel('Quotes', size=20)
# Set limits to the high and low of the data set
ax.set_ylim([min(data[:,4]), max(data[:,3])])
# Create the candle sticks
candlestick(ax, data2, width=candlestickWidth, colorup='g', colordown='r')
plt.show()