#!/usr/bin/env python # coding: utf-8 # # Visualizing Historical Bitcoin Prices # This notebook explores visualizing historical price data for Bitcoin. A colorized candlestick chart helps visualize daily price trends and larger time frame price trends together: https://en.wikipedia.org/wiki/Candlestick_chart # # ## Fetching Historical Price Data # # * Use GDAX Exchange API: https://docs.gdax.com/#get-historic-rates # * Parse data and coerse into Pandas DataFrame # # ## Candlestick Chart # # Use matplotlib and mpl finance library for candlestick support: https://github.com/matplotlib/mpl_finance # # Chart shows: # * Bitcoin prices organized by day (in UTC) # * X-axis is Date # * Y-axis is Price at Open, High, Low, and Close of the day # # ## Interpretation # * Color: # * Green candlesticks are "bullish" trend days (increased price) # * Red candlesticks are "bearish" trend days (decreased price) # * Body: Difference between open and close, day's trend strengh # * Shadows: Day's price range, high above open/close, low below open/close # # # # # # # Code # In[107]: import requests, json import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.patches as mpatches from mpl_finance import candlestick_ohlc from datetime import datetime URL = 'https://api.gdax.com/' COLS = ['Date', 'Low', 'High', 'Open', 'Close', 'Volume'] DAILY = 86400 def get_historical_prices(product): r = requests.get(URL + f'/products/{product}/candles?granularity={DAILY}') df = pd.DataFrame(r.json(), columns=COLS) del df['Volume'] df['Date'] = pd.to_datetime(df.Date, unit='s') df = df.set_index('Date') return df.sort_index() def plot_candlestick(df, ax=None, fmt="%Y-%m-%d", title=None): if ax is None: fig, ax = plt.subplots(label="Price") idx_name = df.index.name dat = df.reset_index()[[idx_name, "Open", "High", "Low", "Close"]] dat[df.index.name] = dat[df.index.name].map(mdates.date2num) ax.xaxis_date() ax.xaxis.set_major_formatter(mdates.DateFormatter(fmt)) plt.xticks(rotation=45) lines, patches = candlestick_ohlc(ax, dat.values, width=.65, colorup='g') ax.set_xlabel("Date") ax.set_ylabel("Price") ax.set_title(title) bullish = mpatches.Patch(color='green', label='Bullish day') bearish = mpatches.Patch(color='red', label='Bearish day') plt.legend(handles=[bullish, bearish]) return ax bars = get_historical_prices('BTC-USD')['2018-04':] bars.tail() # # Chart # In[108]: title = "Daily Bitcoin Price - Q2 '18 to Date" fig, ax = plt.subplots(figsize=(10, 6)) ax = plot_candlestick(bars, ax=ax, title=title) # ### Comparison # # Compare and contrast the above candlestick chart with the default line chart below. # # Which is easier to intrepret day by day? # In[113]: bars.plot(figsize=(10, 4)) # # References # # * Coursera Data Visualization: https://www.coursera.org/learn/datavisualization # * Bitcoin: https://bitcoin.org/en/ # * Candlesticks: https://en.wikipedia.org/wiki/Candlestick_chart # * Python: https://www.python.org/ # * Pandas: https://pandas.pydata.org/ # * GDAX Exchange API: https://docs.gdax.com/ # * Matplotlib: https://matplotlib.org/ # * MPL Finance: https://github.com/matplotlib/mpl_finance # * Legends: https://matplotlib.org/users/legend_guide.html # # Link to this notebook: http://bit.ly/2IvtWyq # In[ ]: