From f2f6e7e536b76475566da6494cbdb123d13432a4 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Fri, 13 Dec 2019 20:28:19 +0000 Subject: [PATCH] - made a class git-svn-id: http://moon:8086/svn/projects/Stock@305 fda53097-d464-4ada-af97-ba876c37ca34 --- pandas_eval.py | 193 ++++++++++++++++++++++++++++--------------------- 1 file changed, 111 insertions(+), 82 deletions(-) diff --git a/pandas_eval.py b/pandas_eval.py index 74cc0f3..01dd4ff 100644 --- a/pandas_eval.py +++ b/pandas_eval.py @@ -20,6 +20,40 @@ import os # https://ntguardian.wordpress.com/2016/09/19/introduction-stock-market-data-python-1 key = '0UO7Z2MVZ2YSQSVE' +thresh_macd = 0.5 +show_range_days = 20 + +titles = [ + 'AAPL', + 'XLNX', + 'QCOM', + 'DPW.DE', + 'CSCO', + 'AIR', + 'BA', + 'NVDA', + 'MSFT', + 'DIS', + 'NFLX', + 'OHB.DE', + 'ERCA.DE', + 'VAR1.DE', + 'HD', + 'AMZN', + 'GOOGL', + 'ZIL2.DE', + 'SIS.DE', + 'GFT.DE', + 'AMD.DE', + 'PANW', + 'RIB.DE', + 'WAF.DE', + 'EVT.DE', + 'VOW.DE', + 'AMS.SW', + 'I', + 'OQ3.F'] + def ema(data, key, alpha=0.5, ic=None): result = [] @@ -95,106 +129,101 @@ def bollinger(data, window_days, f=2): result['mid'] = mid return result -data = {} -titles = [] -titles.append('AAPL') -titles.append('XLNX') -titles.append('QCOM') -titles.append('DPW.DE') -titles.append('CSCO') -titles.append('AIR') -titles.append('NVDA') -show_title = 'XLNX' -show_range_days = 20 +class Symbol(object): + def __init__(self, name): + self.name = name + self.ax = None + self.fig = None + self.k_euro = 1/1.11 -pd.DatetimeIndex -def fetch(title): - filename = title + '.h5' - fetch = False - today = dt.date.today() + def fetch(self): + filename = self.name.replace('.','_') + '.h5' + fetch = False + today = dt.date.today() - try: - hdf = pd.HDFStore(filename, 'r') - hdf.close() - except: - fetch = True - - try: - lastmodified = dt.datetime.fromtimestamp(os.stat(filename).st_mtime).date() - if lastmodified != today: + try: + hdf = pd.HDFStore(filename, 'r') + except: fetch = True - except: - fetch = True - if fetch: - print ("Fetching \"{}\"".format(title)) - # Get stock price via data reader - start = dt.datetime(2019,1,1) - end = dt.date.today() - data = web.DataReader(title, "av-daily", start, end, api_key=key) - hdf = pd.HDFStore(title + '.h5') - hdf[title] = data - else: - hdf = pd.HDFStore(filename, 'r') - data = hdf[title] - hdf.close() + try: + lastmodified = dt.datetime.fromtimestamp(os.stat(filename).st_mtime).date() + if lastmodified != today: + fetch = True + except: + fetch = True -def plot(ax, fig, data): - dates = data.index - data.plot() - def hover(event): - if event.inaxes == ax: - x_idx = int(event.xdata) - ax.format_xdata = lambda x: dates[x_idx] - ax.format_ydata = lambda y: '{:.2f}'.format(data[x_idx]) + if fetch: + print ("Fetching \"{}\"".format(self.name)) + # Get stock price via data reader + start = dt.datetime(2019,1,1) + end = dt.date.today() + data = web.DataReader(self.name, "av-daily", start, end, api_key=key) + hdf = pd.HDFStore(filename) + hdf[self.name] = data - fig.canvas.mpl_connect("motion_notify_event", hover) + self.data_full = hdf[self.name]*self.k_euro + hdf.close() -def show(title): + def __plot(self, data): + dates = data.index + data.plot() + def hover(event): + if event.inaxes == self.ax: + x_idx = int(event.xdata) + self.ax.format_xdata = lambda x: dates[x_idx] + self.ax.format_ydata = lambda y: '€{:.2f}'.format(data[x_idx]) - k_euro = 1/1.11 + self.fig.canvas.mpl_connect("motion_notify_event", hover) - filename = title + '.h5' + def analyze(self): + self.data_full['ema'] = ema(self.data_full, key='close', alpha=0.75) + self.data_full['macd'] = macd(self.data_full, key='close') + self.data_full['sma'] = sma(self.data_full, key='close', window_days=30) + self.boll_full = bollinger(self.data_full, window_days=30) - hdf = pd.HDFStore(filename, 'r') - data_full = hdf[title]*k_euro + _macd = self.data_full['macd'][len(self.data_full)-1] + return {'macd' : _macd} - data_full['ema'] = ema(data_full, key='close', alpha=0.75) - data_full['macd'] = macd(data_full, key='close') - data_full['sma'] = sma(data_full, key='close', window_days=30) - boll_full = bollinger(data_full, window_days=30) - hdf.close() - data = data_full[len(data_full)-1 - show_range_days:] - boll = boll_full[len(boll_full)-1 - show_range_days:] + def show(self, figNum=1): + data = self.data_full[len(self.data_full)-1 - show_range_days:] + boll = self.boll_full[len(self.boll_full)-1 - show_range_days:] - fig = plt.figure(1) - ax = plt.subplot(311) - plot(ax, fig, data['close']) - plot(ax, fig, data['ema']) - plot(ax, fig, data['sma']) - plt.title(title) - plt.legend() - plt.grid() + self.fig = plt.figure(figNum) + self.ax = plt.subplot(311) + self.__plot(data['close']) + self.__plot(data['ema']) + self.__plot(data['sma']) + plt.title(self.name) + plt.legend() + plt.grid() - plt.subplot(312) - boll['upper'].plot() - boll['mid'].plot() - boll['lower'].plot() - plt.legend() - plt.grid() + plt.subplot(312) + boll['upper'].plot() + boll['mid'].plot() + boll['lower'].plot() + plt.legend() + plt.grid() - plt.subplot(313) - data['macd'].plot() - plt.legend() - plt.grid() - - plt.show() + plt.subplot(313) + data['macd'].plot() + plt.legend() + plt.grid() + +figNum = 1 for title in titles: - fetch(title) + sym = Symbol(title) + sym.fetch() + result = sym.analyze() + if result['macd'] > thresh_macd: + sym.show(figNum) + figNum += 1 + + +plt.show() -show(show_title)