Невозможность отображения положительных дневных свечей с использованием matplotlib.finance.candlestick2_ochl

У меня есть фрейм данных python df, содержащий значения даты, открытия, максимума, минимума, закрытия и объема.

Я пытаюсь построить свечной график акции. По какой-то причине я не могу заставить matplotlib.finance.candlestick2_ochl() правильно отображать дни, когда цена закрытой акции self.df['closep'] была выше, чем цена открытой акции self.df['openp']. В эти положительные (зеленые) дни matplotlib либо отображает доджи, либо вообще ничего.

Не совсем уверен, почему у меня такое поведение. Я подозреваю, что это как-то связано с тем, как моя программа получает доступ к данным акций из моего Pandas DataFrame self.df.

Вот мой код:

# Visualize my stock data

import pandas as pd
import datetime
import time
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick2_ochl
import matplotlib.ticker as mticker
import matplotlib.dates as mdates


class MyStock:
    def __init__(self, stock):
        self.stock = stock
        self.pullData()


    def pullData(self):
        try:
            print('Currently pulling', self.stock)
            print(str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')))
            urlToVisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/' + self.stock + '/chartdata;type=quote;range=5d/csv'

            self.df = pd.read_csv(urlToVisit, header=None, names=['date', 'closep', 'highp', 'lowp', 'openp', 'volume'],
                             skiprows=22, dtype=float)

            print('Pulled', self.stock, '\n')

        except Exception as e:
            print('main loop', str(e))

        print('Constucting DataFrame\n')
        self.df['date'] = pd.to_datetime(self.df['date'], unit='s')

        self.df = self.df.set_index('date').tz_localize('UTC').tz_convert('US/Eastern').reset_index()
        self.df['date'] = self.df['date'].dt.strftime('%Y-%m-%d %H:%M:%S')

        print(self.df.tail())


    def CandleStick(self):


        self.fig = plt.figure()

        ax1 = plt.subplot2grid((6, 4), (1, 0), rowspan=4, colspan=4, axisbg='w')

        candlestick2_ochl(ax1, opens=self.df['openp'], closes=self.df['closep'], highs=self.df['highp'], lows=self.df['lowp'], width=.75, colorup='k', colordown='r', alpha=0.75)

        plt.ylabel('Stock Price')
        ax1.grid(True)
        for label in ax1.xaxis.get_ticklabels():
            label.set_rotation(90)

        plt.subplots_adjust(left=.10, bottom=.19, right=.93, top=.95, wspace=.20, hspace=0)

        plt.suptitle(self.stock + ' Stock Price')
        plt.show()


amd = MyStock('AMD')
amd.CandleStick()

и снимок экрана вывода вместе со связанным разделом DataFrame:

введите здесь описание изображения

На этой крышке экрана четко видно, что положительные дни (зеленый цвет) отображаются неправильно. Я уверен, что мне здесь не хватает чего-то очень очевидного.

Любая помощь приветствуется.


person Jack    schedule 19.06.2016    source источник
comment
stackoverflow.com/a/59670900/1639359   -  person Daniel Goldfarb    schedule 25.05.2020


Ответы (2)


Пожалуйста, посмотрите этот код, который создает подсвечники правильного цвета:

import pandas as pd
import datetime
import time
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick2_ochl
import matplotlib.ticker as mticker
import matplotlib.dates as mdates


class MyStock:
    def __init__(self, stock):
        self.stock = stock
        self.pullData()


    def pullData(self):
        try:
            print('Currently pulling', self.stock)
            print(str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')))
            urlToVisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/' + self.stock + '/chartdata;type=quote;range=2d/csv'

            self.df = pd.read_csv(urlToVisit, header=None, names=['date', 'closep', 'highp', 'lowp', 'openp', 'volume'],
                             skiprows=22, dtype=float)

            print('Pulled', self.stock, '\n')

        except Exception as e:
            print('main loop', str(e))

        print('Constucting DataFrame\n')
        self.df['date'] = pd.to_datetime(self.df['date'], unit='s')

        self.df = self.df.set_index('date').tz_localize('UTC').tz_convert('US/Eastern').reset_index()
        self.df['date'] = self.df['date'].dt.strftime('%Y-%m-%d %H:%M:%S')

        print(self.df.tail())


    def CandleStick(self):


        self.fig = plt.figure()
        ax1 = plt.subplot2grid((6, 4), (1, 0), rowspan=4, colspan=4, axisbg='w')
        candlestick2_ochl(ax1,
                          self.df['openp'], self.df['highp'], self.df['lowp'], self.df['closep'],
                          width=.75, colorup='g', colordown='r', alpha=0.75)

        plt.ylabel('Stock Price')
        ax1.grid(True)
        for label in ax1.xaxis.get_ticklabels():
            label.set_rotation(90)

        plt.subplots_adjust(left=.10, bottom=.19, right=.93, top=.95, wspace=.20, hspace=0)

        plt.suptitle(self.stock + ' Stock Price')
        plt.show()

amd = MyStock('AMD')
amd.CandleStick()

введите здесь описание изображения

person Sergey Bushmanov    schedule 31.07.2016

ошибка лежит здесь

Я использую Matplotlib 1.5.1, в каталоге matplotlib есть файл financial.py, строка 1059-1067. исходный код:

    candlestick2_ohlc(ax, opens, highs, closes, lows, width=width,
                 colorup=colorup, colordown=colordown,
                 alpha=alpha)


def candlestick2_ohlc(ax, opens, highs, lows, closes, width=4,
             colorup='k', colordown='r',
             alpha=0.75,
             ): 

должно быть :

(поменяйте местами закрытия и минимумы в параметрах)

    candlestick2_ohlc(ax, opens, highs, lows, closes, width=width,
                 colorup=colorup, colordown=colordown,
                 alpha=alpha)


def candlestick2_ohlc(ax, opens, highs, lows, closes, width=4,
             colorup='k', colordown='r',
             alpha=0.75,
             ):

отредактируйте этот файл и сохраните его. это должно решить вашу проблему.

Свечной график. извините за то, что здесь нет изображения. вам нужно щелкнуть URL-адрес выше, чтобы увидеть эффект.

решил эту проблему в течение 2 часов (сейчас 2 часа ночи) точно так же, как я предполагал 2 часа назад (но не в том же месте), так грустно, что люди проголосовали против.


Что-то я написал 2 часа назад.

Я нашел это предложение в официальном документе API Matplotlib, глава: "matplotlib.finance":

Сохраняет исходный порядок аргументов.

Это как-то связано с вашей проблемой?

на самом деле у меня такая же проблема, как и у вас.

fig = plt.figure()
ax1 = plt.subplot(1,1,1)

candlestick(ax1,
        opens=test_data.open,
        closes=test_data.close,
        highs=test_data.high,
        lows=test_data.low,
        width=1,
        colorup='k',
        colordown='r',
        alpha=0.75)

fig.savefig('index.png',dpi=300,bbox_inches='tight')

и я получил это: какой-то неправильный график, построенный мной

person Léon Xu    schedule 31.07.2016
comment
ссылка, эта ошибка и ее исправление были официально приняты Matplotlib. - person Léon Xu; 03.08.2016