0
votes

I am running code from the following website :

https://ntguardian.wordpress.com/2018/07/17/stock-data-analysis-python-v2/

which generates a candle chart. I have run similar code in Spyder and the only amendments I have made to the code are

import numpy as np
from matplotlib.dates import DateFormatter, WeekdayLocator,DayLocator,MONDAY
from mpl_finance import candlestick_ohlc
from matplotlib.dates import date2num

Their chart looks like this on the webpage: Their chart looks like this on the webpage

This is my chart when I run it in Spyder This is my chart when I run it in Spyder

I can't seem to understand why when I haven't altered the code why I would see such a stark difference.

Is there some quirk in Spyder that creates this proble or do I need to have a few more lines of code?

Please help me with this as I am new to matplotlib.

Thanks a lot and really appreciate your help with this.

My overall code

 import pandas as pd
 import numpy as np

 pd.set_option('display.max_rows', 500)
 pd.set_option('display.max_columns', 500)
 pd.set_option('display.width', 1000)



 import quandl
 import datetime

 # We will look at stock prices over the past year, starting at January 

 start = datetime.datetime(2016,1,1)
 end =datetime.date.today()

 #Fist define the security for which you are extracting the Series
 s = "AAPL"
 apple = quandl.get("WIKI/" + s, start_date=start, end_date=end)

 print (type(apple))

 print (apple.head())

 #print (apple.tail())

 import matplotlib
 import matplotlib.pyplot as plt
 import pylab

 #Lines of Code for Jupyter
 # This line is necessary for the plot to appear in a Jupyter notebook
 #%matplotlib inline
 # Control the default size of figures in this Jupyter notebook
 #%pylab inline


 pylab.rcParams['figure.figsize'] = (15, 9)  # Change the size of plots

 print (apple["Adj. Close"].plot(grid = True))

 from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, 
 MONDAY
 from mpl_finance import candlestick_ohlc
 from matplotlib.dates import date2num


 def pandas_candlestick_ohlc(dat, stick = "day", adj = False, otherseries = 
     None):
"""
:param dat: pandas DataFrame object with datetime64 index, and float columns 
"Open", "High", "Low", and "Close", likely created via DataReader from 
"yahoo"
:param stick: A string or number indicating the period of time covered by a 
single candlestick. Valid string inputs include "day", "week", "month", and 
"year", ("day" default), and any numeric input indicates the number of 
 trading days included in a period
:param adj: A boolean indicating whether to use adjusted prices
:param otherseries: An iterable that will be coerced into a list, containing 
the columns of dat that hold other series to be plotted as lines

This will show a Japanese candlestick plot for stock data stored in dat, 
also plotting other series if passed.
"""
mondays = WeekdayLocator(MONDAY)        # major ticks on the mondays
alldays = DayLocator()              # minor ticks on the days
dayFormatter = DateFormatter('%d')      # e.g., 12

# Create a new DataFrame which includes OHLC data for each period specified 
by stick input
fields = ["Open", "High", "Low", "Close"]
if adj:
    fields = ["Adj. " + s for s in fields]
transdat = dat.loc[:,fields]
transdat.columns = pd.Index(["Open", "High", "Low", "Close"])
if (type(stick) == str):
    if stick == "day":
        plotdat = transdat
        stick = 1 # Used for plotting
    elif stick in ["week", "month", "year"]:
        if stick == "week":
            transdat["week"] = pd.to_datetime(transdat.index).map(lambda x: 
    x.isocalendar()[1]) # Identify weeks
        elif stick == "month":
            transdat["month"] = pd.to_datetime(transdat.index).map(lambda x: 
    x.month) # Identify months
        transdat["year"] = pd.to_datetime(transdat.index).map(lambda x: 
    x.isocalendar()[0]) # Identify years
        grouped = transdat.groupby(list(set(["year",stick]))) # Group by 
    year and other appropriate variable
        plotdat = pd.DataFrame({"Open": [], "High": [], "Low": [], "Close": 
    []}) # Create empty data frame containing what will be plotted
        for name, group in grouped:
            plotdat = plotdat.append(pd.DataFrame({"Open": group.iloc[0,0],
                                        "High": max(group.High),
                                        "Low": min(group.Low),
                                        "Close": group.iloc[-1,3]},
                                       index = [group.index[0]]))
        if stick == "week": stick = 5
        elif stick == "month": stick = 30
        elif stick == "year": stick = 365

  elif (type(stick) == int and stick >= 1):
    transdat["stick"] = [np.floor(i / stick) for i in 
  range(len(transdat.index))]
    grouped = transdat.groupby("stick")
    plotdat = pd.DataFrame({"Open": [], "High": [], "Low": [], "Close": []}) 
# Create empty data frame containing what will be plotted
    for name, group in grouped:
        plotdat = plotdat.append(pd.DataFrame({"Open": group.iloc[0,0],
                                    "High": max(group.High),
                                    "Low": min(group.Low),
                                    "Close": group.iloc[-1,3]},
                                   index = [group.index[0]]))

else:
    raise ValueError('Valid inputs to argument "stick" include the strings "day", "week", "month", "year", or a positive integer')


# Set plot parameters, including the axis object ax used for plotting
fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
if plotdat.index[-1] - plotdat.index[0] < pd.Timedelta('730 days'):
    weekFormatter = DateFormatter('%b %d')  # e.g., Jan 12
    ax.xaxis.set_major_locator(mondays)
    ax.xaxis.set_minor_locator(alldays)
else:
    weekFormatter = DateFormatter('%b %d, %Y')
ax.xaxis.set_major_formatter(weekFormatter)

ax.grid(True)

# Create the candelstick chart
candlestick_ohlc(ax, list(zip(list(date2num(plotdat.index.tolist())), 
plotdat["Open"].tolist(), plotdat["High"].tolist(),
                  plotdat["Low"].tolist(), plotdat["Close"].tolist())),
                  colorup = "black", colordown = "red", width = stick * .4)

# Plot other series (such as moving averages) as lines
if otherseries != None:
    if type(otherseries) != list:
        otherseries = [otherseries]
    dat.loc[:,otherseries].plot(ax = ax, lw = 1.3, grid = True)

ax.xaxis_date()
ax.autoscale_view()
plt.setp(plt.gca().get_xticklabels(), rotation=45, 
horizontalalignment='right')

plt.show()

pandas_candlestick_ohlc(apple, adj=True, stick="month")
1
If you run the exact same code they are do you get the same result that the article does? If not then you might be using different versions of the various libraries.. - DavidG
I use the exact same code that generates the candlestick chart - AnalysisNerd
I can't seem to understand why the x-axis is so crammed for me. Thank you @DavidG for trying to help me. - AnalysisNerd
Can you edit your question with a minimal reproducible example i.e. a piece of code we can run to reproduce the problem? - DavidG
Hello @DavidG. I have put what I could . I know it does not appear minimal but I didn't know how to shorted it further because I am clueless about what is causing the problem and have put my code. I apologize if this is not brief. - AnalysisNerd

1 Answers

0
votes

I can't seem to understand this but after re-copying the code and shutting down Spyder and re-starting, it appears to work now. Thank you to @ImportanceOfBeingEarnest and @DavidG for helping me with this.