Skip to content

Instantly share code, notes, and snippets.

@pdaian
Created February 13, 2017 19:12
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save pdaian/5c3a24732a37dda7d8132035aa889419 to your computer and use it in GitHub Desktop.
Save pdaian/5c3a24732a37dda7d8132035aa889419 to your computer and use it in GitHub Desktop.
Ethereum Fork Market Data Graphing Script
import datetime, requests
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import json, collections, os
UTC_OFFSET = -14400 # Local offset from UTC
START_DATE = "2016-01-01" # Day to start chat
TMP_DIR = "/tmp" # Writable temp directory, without trailing slash
def unix_to_date(unix_timestamp):
""" Convert a Unix timestamp (in UTC) to the corresponding Date object """
return datetime.datetime.utcfromtimestamp(unix_timestamp).strftime('%Y-%m-%d-%H')
def pnx_average(poloniex_price, day):
""" Take the Poloniex unweighted average price for a given day (6 data points)"""
total = 0.0
for hour in range(0, 24, 4):
formatted_date = day + "-" + format(hour, '02d')
if not formatted_date in poloniex_price:
return 0.0
total += poloniex_price[formatted_date]
return total/6.0
def zero_to_nan(values):
"""Replace every 0 with 'nan' and return a copy."""
return [float('nan') if x==0 else x for x in values]
start_unix_utc = int(datetime.datetime.strptime(START_DATE, '%Y-%m-%d').strftime("%s")) + UTC_OFFSET
# Download market data if not exists
if not os.path.exists(TMP_DIR + "/btc_eth"):
open(TMP_DIR + "/btc_eth", "w").write(requests.get("https://poloniex.com/public?command=returnChartData&currencyPair=BTC_ETH&start=" + str(start_unix_utc) + "&end=9999999999&period=14400").text)
btc_eth_raw = json.loads(open(TMP_DIR + "/btc_eth").read())
if not os.path.exists(TMP_DIR + "/btc_etc"):
open(TMP_DIR + "/btc_etc", "w").write(requests.get("https://poloniex.com/public?command=returnChartData&currencyPair=BTC_ETC&start=" + str(start_unix_utc) + "&end=9999999999&period=14400").text)
btc_etc_raw = json.loads(open(TMP_DIR + "/btc_etc").read())
if not os.path.exists(TMP_DIR + "/btc_usd"):
open(TMP_DIR + "/btc_usd", "w").write(requests.get("http://api.coindesk.com/v1/bpi/historical/close.json?start=" + START_DATE + "&end=2018-01-01").text)
btc_usd = json.loads(open(TMP_DIR + "/btc_usd").read(), object_pairs_hook=collections.OrderedDict)
btc_eth_all = dict([(unix_to_date(int(x['date'])), float(x['weightedAverage'])) for x in btc_eth_raw])
btc_etc_all = dict([(unix_to_date(int(x['date'])), float(x['weightedAverage'])) for x in btc_etc_raw])
dates = []
eth_prices = []
etc_prices = []
btc_prices = []
for day in btc_usd['bpi']:
# Bitcoin prices
dates += [datetime.datetime.strptime(day + "-12", '%Y-%m-%d-%H')]
eth_prices += [pnx_average(btc_eth_all, day)]
etc_prices += [pnx_average(btc_etc_all, day)]
btc_prices += [btc_usd['bpi'][day]]
ethc_prices = [0.0 if y == 0.0 else x + y for x, y in zip(eth_prices, etc_prices)]
def graph_all(eth_prices, etc_prices, ethc_prices, Y_MAX, y_label):
ethc_line, = plt.plot_date(dates, zero_to_nan(ethc_prices), label="ETH+ETC", fmt="b-")
eth_line, = plt.plot_date(dates, eth_prices, label="ETH", fmt="g-")
etc_line, = plt.plot_date(dates, zero_to_nan(etc_prices), label="ETC", fmt="r-")
line_date = datetime.datetime.strptime("2016-10-18-12", '%Y-%m-%d-%H')
plt.axvline(line_date, color='g')
plt.text(line_date + datetime.timedelta(days=-5),Y_MAX * .25,'DoS Fork 1',rotation=90)
line_date = datetime.datetime.strptime("2016-11-22-15", '%Y-%m-%d-%H')
plt.axvline(line_date, color='g')
plt.text(line_date + datetime.timedelta(days=2),Y_MAX * .25,'DoS Fork 2',rotation=90)
line_date = datetime.datetime.strptime("2016-10-25-04", '%Y-%m-%d-%H')
plt.axvline(line_date, color='r')
plt.text(line_date + datetime.timedelta(days=2),Y_MAX * .25,'ETC DoS Fork',rotation=90)
line_date = datetime.datetime.strptime("2016-06-17-03", '%Y-%m-%d-%H')
plt.axvline(line_date, color='b')
plt.text(line_date + datetime.timedelta(days=2),Y_MAX * .25,'DAO Attack',rotation=90)
line_date = datetime.datetime.strptime("2016-04-30-00", '%Y-%m-%d-%H')
plt.axvline(line_date, color='b')
plt.text(line_date + datetime.timedelta(days=2),Y_MAX * .25,'DAO Announced',rotation=90)
line_date = datetime.datetime.strptime("2016-07-20-15", '%Y-%m-%d-%H')
plt.axvline(line_date, color='b')
plt.text(line_date + datetime.timedelta(days=2),Y_MAX * .25,'DAO Fork',rotation=90)
line_date = datetime.datetime.strptime("2017-01-13-20", '%Y-%m-%d-%H')
plt.axvline(line_date, color='red')
plt.text(line_date + datetime.timedelta(days=2),Y_MAX * .25,'ETC DieHard Fork',rotation=90)
plt.title("Ethereum and Forks Market Response", fontsize=22)
plt.xlabel("Date", fontsize=18)
plt.ylabel(y_label, fontsize=18)
plt.legend(handles=[ethc_line, eth_line, etc_line])
#plt.gca().set_yscale('log') # Uncomment these two lines for log scale
#plt.ylim(0, Y_MAX)
plt.show()
eth_usd = [0.0 if y == 0.0 else x * y for x, y in zip(btc_prices, eth_prices)]
etc_usd = [0.0 if y == 0.0 else x * y for x, y in zip(btc_prices, etc_prices)]
ethc_usd = [0.0 if y == 0.0 else x * y for x, y in zip(btc_prices, ethc_prices)]
graph_all(eth_usd, etc_usd, ethc_usd, 25, "Price (USD)")
graph_all(eth_prices, etc_prices, ethc_prices, .035, "Price (BTC)")
eth_then_ethc_usd = [x if y == 0.0 else y for x, y in zip(eth_usd, ethc_usd)]
plt.plot_date(dates, zero_to_nan(eth_then_ethc_usd), fmt="b-")
plt.title("Forks as a Currency - Holder Perspective", fontsize=22)
plt.xlabel("Date", fontsize=18)
plt.ylabel("Price (USD)", fontsize=18)
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment