【问题标题】:How to Remove Weekends in Matplotlib Candlestick Chart?如何在 Matplotlib 烛台图中删除周末?
【发布时间】:2017-02-10 09:33:28
【问题描述】:

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)

周末间隔用绿色箭头表示。

【问题讨论】:

    标签: python matplotlib candlestick-chart mplfinance


    【解决方案1】:

    不幸的是,据我所知,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')
    

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

    *它需要一个元组列表——时间、开、高、低和收盘值,这是相当独特的。

    【讨论】:

      【解决方案2】:

      新版本的 matplotlib Finance 会自动为您完成这项工作。

      https://pypi.org/project/mplfinance/

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          将此添加到您的情节中

          show_nontrading=False
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-31
          • 1970-01-01
          相关资源
          最近更新 更多