使用MatPlotLib的日内蜡烛图 [英] Intraday candlestick charts using MatPlotLib

查看:1559
本文介绍了使用MatPlotLib的日内蜡烛图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在MatPlotLib的财务图表上遇到了一些困难。似乎他们的烛台图表最好与日常数据工作,我很难使他们工作在日内(每5分钟,在9:30和4pm之间)数据。



我在pastebin中粘贴了示例数据,顶部是我从数据库获取的,底部是日期,组合成一个顺序浮点数用于matplotlib。




http://i.imgur.com/EnrTW.jpg 数据点可以是从5分钟到30分钟的不同增量。






编辑: 也制作了一个Pandas数据帧的数据,不知道pandas是否有烛台功能。

解决方案

如果我理解,主要关注的是日常数据之间的差距。为了摆脱它们,一种方法是人为地均匀地空间你的数据(但当然你会松动任何时间指示在日内)。





注释的代码和结果图是这样的:

  import numpy as np 
import matplotlib.pyplot as plt
import datetime

来自matplotlib.finance import candlestick
来自matplotlib.dates import num2date

文本文件中的数据,5列:时间,开,关,高,低
#注意,我使用你形成一个序数浮动的时间
data = np.loadtxt('finance-data.txt',delimiter =',')

#天数并创建那些天的列表
ndays = np.unique(np.trunc(data [:,0]),return_index = True)
xdays = []
for n在np.arange(len(ndays [0])):
xdays.append(datetime.date.isoformat(num2date(data [ndays [1],0] [n])))

#通过用等间隔的值替换时间数组来创建新数据。
#这将允许在绘制数据时消除日期之间的差距
data2 = np.hstack([np.arange(data [:,0] .size)[:, np.newaxis ],数据[:,1:]])

#绘制数据
fig = plt.figure(figsize =(10,5))
ax = fig.add_axes ([0.1,0.2,0.85,0.7])
#轴的自定义
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)
#只在开始新的一天时设置x轴的标记
ax.set_xticks(data2 [ndays [1],0])
ax.set_xticklabels(xdays,rotation = 45,horizo​​ntalalignment ='right')

ax.set_ylabel('Quote($)',size = 20)
ax.set_ylim 196])

candlestick(ax,data2,width = 0.5,colorup ='g',colordown ='r')

plt.show()


I've been having some difficulty with MatPlotLib's finance charting. Seems like their candlestick charts work best with daily data and I am having a hard time making them work with intraday (every 5 minutes, between 9:30 and 4pm) data.

I have pasted sample data in pastebin, top is what I get from the database, bottom is tupled with the date formated into an ordinal float for use in matplotlib.

Link to sample data

When I draw my charts there are huge gaps in it, the axes suck, the zoom is equally horrible. http://imgur.com/y7O8A Can anyone guide me through making a nice readable graph out of this data? My ultimate goal is to get a chart that looks remotely like this: http://i.imgur.com/EnrTW.jpg The data points can be in various increments from 5minutes to 30 minutes.


Edit: I have also made a Pandas dataframe of the data, not sure if pandas has candlestick functionality.

解决方案

If I understand well, one of your major concern is the gaps between the daily data. To get rid of them, one method is to artificially 'evenly space' your data (but of course you will loose any temporal indication intra-day).

Anyways, doing this way, you will be able to obtain a chart that looks like the one you have proposed as an example.

The commented code and the resulting graph are below.

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()

这篇关于使用MatPlotLib的日内蜡烛图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆