#!/usr/bin/python3
# -*- coding: utf8 -*-
import csv
import datetime
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
class Stock:
def __init__(self, name):
self.data = self.get_csv(name)
self.convert_types()
self.filter_date(datetime.datetime(2020, 1, 1), datetime.datetime(2020, 12, 31))
def get_csv(self, name):
try:
with open(name, 'r' ) as f:
reader = csv.DictReader(f)
return [line for line in reader]
except FileNotFoundError as ex:
print(ex)
print('get data from', 'https://finance.yahoo.com/quote/DAX/history?p=DAX')
exit()
def convert_types(self):
for il, l in enumerate(self.data):
for k in l.keys():
try:
if k == 'Date':
l[k] = datetime.datetime.strptime(l[k], '%Y-%m-%d')
else:
l[k] = float(l[k])
except Exception:
del self.data[il]
def filter_date(self, date, date2=None):
self.data = [i for i in self.data if i['Date'] >= date]
if date2 is not None:
self.data = [i for i in self.data if i['Date'] <= date2]
def get_dates(self):
return [l['Date'] for l in self.data]
def get_values(self):
return np.array([float(l['Close']) for l in self.data])
def get_values_norm(self):
v = self.get_values()
#vmean = np.mean([v for i, v in enumerate(v) if self.data[i]['Date'].month == 1])
#return v / vmean
# v / max(v)
return v / max([v for i, v in enumerate(v) if self.data[i]['Date'].month < 4])
# data is found on finance.yahoo.com
data_spx = Stock('^GSPC.csv')
data_DJI = Stock('^DJI.csv')
data_stoxx50e = Stock('^STOXX50E.csv')
data_DAX = Stock('^GDAXI.csv')
plt.figure(figsize=[5.6, 4.2])
ax = plt.gca()
ax.set_prop_cycle(color=['#0072bd', '#d95319', '#edb120', '#7e2f8e'])
plt.plot(data_spx.get_dates(), 100*data_spx.get_values_norm(), 'o-', ms=3, label='S&P 500')
plt.plot(data_DJI.get_dates(), 100*data_DJI.get_values_norm(), 'o-', ms=3, label='Dow Jones')
plt.plot(data_stoxx50e.get_dates(), 100*data_stoxx50e.get_values_norm(), 'o-', ms=3, label='EURO STOXX 50')
plt.plot(data_DAX.get_dates(), 100*data_DAX.get_values_norm(), 'o-', ms=3, label='DAX')
plt.xlim(datetime.datetime.strptime('2019-12-24', '%Y-%m-%d'),
datetime.datetime.strptime('2021-01-08', '%Y-%m-%d'))
ax.tick_params(axis='x', which='minor', pad=6)
ax.xaxis.set_major_locator(mpl.dates.MonthLocator())
ax.xaxis.set_major_formatter(mpl.ticker.NullFormatter())
ax.xaxis.set_minor_formatter(mpl.dates.DateFormatter("%m"))
ax.xaxis.set_minor_locator(mpl.dates.MonthLocator(bymonthday=16))
ax.yaxis.set_major_formatter(mpl.ticker.FormatStrFormatter('%.0f%%'))
for tick in ax.xaxis.get_minor_ticks():
tick.tick1line.set_markersize(0)
tick.tick2line.set_markersize(0)
tick.label1.set_horizontalalignment('center')
plt.xlabel('date (month 2020)')
plt.ylabel('value relative to 2020 pre-crash maximum')
plt.grid(True)
plt.legend(loc='lower right', framealpha=1, edgecolor='k', borderpad=0.7, borderaxespad=0.6)
plt.tight_layout()
plt.savefig('stock-indices-2020crash+recovery.svg')