如何在Matplotlib烛台图表中删除周末?

时间:2017-02-10 09:33:28

标签: python matplotlib candlestick-chart

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)

周末间隙以绿色箭头显示。

enter image description here

4 个答案:

答案 0 :(得分:3)

不幸的是,据我所知,matplotlibpandas都没有内置的方式来绘制工作日数据。但是,正如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')

运行时会生成以下图表(没有周末间隙)。

enter image description here

*它需要一个元组列表 - 时间,开放,高,低和接近的值,这是相当独特的。

答案 1 :(得分:2)

新版的matplotlib finance将自动为您完成此操作。

请参见https://pypi.org/project/mplfinance/

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

enter image description here

免责声明:我是上述lib的作者。