我有很多股票数据,我想从中构建一个类似于此的 OHLC 图表(开盘价、最高价、最低价、收盘价):
为此,我使用了matplotlib.finance中的烛台函数。我有分钟数据,所以为了也制作日内图表,我使用了另一个 stackoverflow 线程,它均匀地间隔所有烛台以避免天之间的差距(因为在下午 5:30 和上午 9:00 之间没有数据)。这适用于少量数据,但不幸的是我有很多数据(每天 510 分钟 * 10 年 ≈ 100 万分钟)。从这些数据中,我想制作一个图表,给出一个概述,但也可以放大,以便我可以看到历史上特定日期的各个分钟。
为了做到这一点,我想简单地制作一个巨大的(非常宽的)图形,保存它,然后我可以简单地用任何图像查看器放大。
我现在有一些我从另一个线程复制的代码并进行了一些调整。在代码中我首先创建了一些随机样本数据(因为删除了另一个线程中的原始样本数据)。然后,我根据这些数据绘制一个具有固定烛台宽度的图形,图形宽度为分钟数乘以单个烛台宽度 (len(data)*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()