在matplotlib
中绘制烛台图时,情节会在周末留下难看的间隙。这是因为市场在周末关闭导致数据中断。如何消除周末的差距?
下面是一个简单的例子,说明情节中存在间隙。
import matplotlib.pyplot as plt
from matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlc
date1, date2 = [(2006, 6, 1), (2006, 8, 1)]
quotes_mpl = quotes_historical_yahoo_ohlc('INTC', date1, date2)
fig, ax = plt.subplots()
candlestick_ohlc(ax, quotes_mpl)
ax.xaxis_date()
plt.xticks(rotation=45)
周末间隙以绿色箭头显示。
答案 0 :(得分:3)
不幸的是,据我所知,matplotlib
和pandas
都没有内置的方式来绘制工作日数据。但是,正如this matplotlib example中所示,可以通过自定义刻度格式来人为地以某种hacky方式跳过周末。
主要思想是按顺序重新索引数据(以便没有间隙),然后根据您应知道的日期范围手动设置xticks。 matplotlib烛台图表有点特殊*因此它不能简单地被抛入链接到上面的示例中。因此,我编写了下面的帮助函数,以便跳过丢失的数据更易于管理。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlc
def weekday_candlestick(ohlc_data, ax, fmt='%b %d', freq=7, **kwargs):
""" Wrapper function for matplotlib.finance.candlestick_ohlc
that artificially spaces data to avoid gaps from weekends """
# Convert data to numpy array
ohlc_data_arr = np.array(ohlc_data)
ohlc_data_arr2 = np.hstack(
[np.arange(ohlc_data_arr[:,0].size)[:,np.newaxis], ohlc_data_arr[:,1:]])
ndays = ohlc_data_arr2[:,0] # array([0, 1, 2, ... n-2, n-1, n])
# Convert matplotlib date numbers to strings based on `fmt`
dates = mdates.num2date(ohlc_data_arr[:,0])
date_strings = []
for date in dates:
date_strings.append(date.strftime(fmt))
# Plot candlestick chart
candlestick_ohlc(ax, ohlc_data_arr2, **kwargs)
# Format x axis
ax.set_xticks(ndays[::freq])
ax.set_xticklabels(date_strings[::freq], rotation=45, ha='right')
ax.set_xlim(ndays.min(), ndays.max())
plt.show()
以下是上述功能的几个用例。
# Get data using quotes_historical_yahoo_ohlc
date1, date2 = [(2006, 6, 1), (2006, 8, 1)]
date3, date4 = [(2006, 5, 15), (2008, 4, 1)]
data_1 = quotes_historical_yahoo_ohlc('INTC', date1, date2)
data_2 = quotes_historical_yahoo_ohlc('INTC', date3, date4)
# Create figure with 2 axes
fig, axes = plt.subplots(ncols=2, figsize=(14, 6))
weekday_candlestick(data_1, ax=axes[0], fmt='%b %d', freq=3, width=0.5)
weekday_candlestick(data_2, ax=axes[1], fmt='%b %d %Y', freq=30)
# Set the plot titles
axes[0].set_title('Shorter Range Stock Prices')
axes[1].set_title('Longer Range Stock Prices')
运行时会生成以下图表(没有周末间隙)。
*它需要一个元组列表 - 时间,开放,高,低和接近的值,这是相当独特的。
答案 1 :(得分:2)
新版的matplotlib finance将自动为您完成此操作。
答案 2 :(得分:0)
将此添加到您的情节中
.pyd
答案 3 :(得分:0)
finplot自动跳过索引中遗漏的日期。它还具有放大图和绘图的其他优点。
import finplot as fplt
import yfinance as yf
df = yf.download('INTC', '2020-06-01')
fplt.candlestick_ochl(df[['Open','Close','High','Low']])
fplt.show()
免责声明:我是上述lib的作者。