使用Matplotlib绘制日内OHLC图的问题

2024-10-01 09:38:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图绘制OHLC烛台图(1分钟)完成一天,并想显示'小时'作为主要定位器和分钟作为次要定位器。 小时定位器应显示为直到数据结束 主要定位器 09:00 10: 00 11: 00,以此类推。在

enter image description here

我不明白我在做什么错误,为什么时间从22:00开始,而OHLC蜡烛不可见。在

如果您还可以帮助在ohlc图表上覆盖体积,这将是一个很大的帮助。link to data file

from datetime import datetime, date, timedelta
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.gridspec as grd
from matplotlib.transforms import Bbox
from matplotlib.finance import candlestick_ohlc, volume_overlay3, volume_overlay
#from matplotlib.finance import candlestick
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY, HourLocator, MinuteLocator


import numpy as np
import pandas as pd


def plot_underlying_hft_data(filename):


    #Read the data and filtered out the required rows and columns
    print("Reading File.. ", filename)
    tempdata = pd.read_csv(filename, index_col = ['Date'])
    tempdata = tempdata.loc[(tempdata.index == '2016-09-16')]

    tempdata['Datetime'] =  pd.to_datetime(tempdata['Datetime'], format='%Y-%m-%d %H:%M:%S')
    print(tempdata)

    HourLocator

    hour = HourLocator()    
    minute = MinuteLocator()
    hourformatter = DateFormatter('%H:%M') 

    #tempdata['Datetime'] = tempdata['Datetime'].apply(lambda datetimevar : datetime)

    tempdata['DatetimeNum'] = mdates.date2num(tempdata['Datetime'].dt.to_pydatetime())

    quotes = [tuple(x) for x in tempdata[['DatetimeNum', 'Open', 'High', 'Low', 'Close', 'Volume']].to_records(index=False)]

    #print(quotes)    
    title_name_ohlc = 'OHLC Intraday Chart'
    #print(title_name_ohlc)
    plt.figure(figsize = (12,6))
    #plt.title(title_name_ohlc)
    ax1 = plt.subplot2grid((1,1), (0,0), axisbg='w')

    ax1.set_ylabel('Price', fontsize=12, fontweight = 'bold')
    ax1.set_title(title_name_ohlc, fontsize=14, fontweight = 'bold')
    ax1.set_ylabel('Price', fontsize=12, fontweight = 'bold')
    ax1.set_title(title_name_ohlc, fontsize=14, fontweight = 'bold')
    print(tempdata['DatetimeNum'].min(), tempdata['DatetimeNum'].max())
    ax1.set_ylim(bottom = tempdata['DatetimeNum'].min(), top = tempdata['DatetimeNum'].max())

    ax1.xaxis.set_major_locator(hour)
    ax1.xaxis.set_minor_locator(minute)
    ax1.xaxis.set_major_formatter(hourformatter)
    #ax1.grid(True)
    candlestick_ohlc(ax1, quotes, width=1, colorup='g', colordown='r', alpha = 1.0)
    plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
    plt.show()

plot_underlying_hft_data("data.csv")

        #print(tempdata.head(5))

Tags: namefromimportdatadatetimetitlematplotlibas
1条回答
网友
1楼 · 发布于 2024-10-01 09:38:42

在绘图时,我错误地定义了X极限和宽度。在阅读了文档和一些测试后,我修复了这个问题,并得到了所需的输出。enter image description here

def plot_underlying_hft_data(filename):


#Read the data and filtered out the required rows and columns
print("Reading File.. ", filename)
tempdata = pd.read_csv(filename, index_col = ['Date'])
tempdata = tempdata.loc[(tempdata.index == '2016-09-16')].tail(751)
print(tempdata.head(5))
tempdata.set_index(['Datetime'], inplace = True)
print(tempdata.head(5))

#tempdata['Datetime'] =  pd.to_datetime(tempdata['Datetime'], format='%Y-%m-%d %H:%M:%S')
#print(tempdata)

#hour = HourLocator(interval = 1)    
minute = MinuteLocator(interval = 30)
hourformatter = DateFormatter('%H:%M') 

#tempdata['Datetime'] = tempdata['Datetime'].apply(lambda datetimevar : datetime)
tempdata["Datetime"] = pd.to_datetime(tempdata.index)
tempdata.Datetime = mdates.date2num(tempdata.Datetime.dt.to_pydatetime())
#print(tempdata.head(5))

quotes = [tuple(x) for x in tempdata[['Datetime', 'Open', 'High', 'Low', 'Close', 'Volume']].to_records(index=False)]

#print(quotes)    
title_name_ohlc = 'OHLC Intraday Chart'
#print(title_name_ohlc)
plt.figure(figsize = (18,10))
#plt.title(title_name_ohlc)
ax1 = plt.subplot2grid((1,1), (0,0), axisbg='w')

ax1.set_ylabel('Price', fontsize=12, fontweight = 'bold')
ax1.set_title(title_name_ohlc, fontsize=14, fontweight = 'bold')
ax1.set_ylabel('Price', fontsize=12, fontweight = 'bold')
ax1.set_xlabel('Time', fontsize=12, fontweight = 'bold')
ax1.set_title(title_name_ohlc, fontsize=14, fontweight = 'bold')
#print(tempdata['DatetimeNum'].min(), tempdata['DatetimeNum'].max())
ax1.set_xlim(tempdata['Datetime'].min(), tempdata['Datetime'].max())

ax1.xaxis.set_major_locator(minute)
#ax1.xaxis.set_minor_locator(minute)
ax1.xaxis.set_major_formatter(hourformatter)
ax1.axhline(y=262.32, linewidth=1.5, color='g', alpha = 0.7, linestyle = "dashed")
ax1.axhline(y=260.33, linewidth=2, color='g', alpha = 0.7, linestyle = "dashed")
ax1.axhline(y=258.17, linewidth=2.5, color='g', alpha = 0.7, linestyle = "dashed")
ax1.axhline(y=256.18, linewidth=3, color='b', alpha = 1, linestyle = "dashed")
ax1.axhline(y=254.02, linewidth=2.5, color='r', alpha = 0.7, linestyle = "dashed")
ax1.axhline(y=252.03, linewidth=2, color='r', alpha = 0.7, linestyle = "dashed")
ax1.axhline(y=249.87, linewidth=1.5, color='r', alpha = 0.7, linestyle = "dashed")

#['256.18', '254.02', '252.03', '249.87', '258.17', '260.33', '262.32']
ax1.grid(True)

#ax1.grid(True)
candlestick_ohlc(ax1, quotes, width = 1/(24*60*2.5), alpha = 1.0, colorup = 'g', colordown ='r')
plt.setp(plt.gca().get_xticklabels(), horizontalalignment='center')

pad = 0.25
yl = ax1.get_ylim()
print(yl)
ax1.set_ylim(yl[0]-(yl[1]-yl[0])*pad,yl[1]*1.005)

Datetime = [x[0] for x in quotes]
Datetime = np.asarray(Datetime)
Volume = [x[5] for x in quotes]
Volume = np.asarray(Volume)

ax2 = ax1.twinx()
ax2.set_position(matplotlib.transforms.Bbox([[0.125,0.125],[0.9,0.27]]))
width = 1/(24*60*4)
ax2.bar(Datetime, Volume, color='blue', width = width, alpha = 0.75)
ax2.set_ylim([0, ax2.get_ylim()[1] * 1])
ax2.set_ylabel('Volume', fontsize=12, fontweight = 'bold')
yticks = ax2.get_yticks()
ax2.set_yticks(yticks[::1])
#ax2.grid(True)
#report_pdf.savefig(pad_inches=0.5, bbox_inches= 'tight')
#plt.close()
plt.show()

相关问题 更多 >