- made a class
git-svn-id: http://moon:8086/svn/projects/Stock@305 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
+111
-82
@@ -20,6 +20,40 @@ import os
|
|||||||
# https://ntguardian.wordpress.com/2016/09/19/introduction-stock-market-data-python-1
|
# https://ntguardian.wordpress.com/2016/09/19/introduction-stock-market-data-python-1
|
||||||
|
|
||||||
key = '0UO7Z2MVZ2YSQSVE'
|
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):
|
def ema(data, key, alpha=0.5, ic=None):
|
||||||
result = []
|
result = []
|
||||||
@@ -95,106 +129,101 @@ def bollinger(data, window_days, f=2):
|
|||||||
result['mid'] = mid
|
result['mid'] = mid
|
||||||
return result
|
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'
|
class Symbol(object):
|
||||||
show_range_days = 20
|
def __init__(self, name):
|
||||||
|
self.name = name
|
||||||
|
self.ax = None
|
||||||
|
self.fig = None
|
||||||
|
self.k_euro = 1/1.11
|
||||||
|
|
||||||
pd.DatetimeIndex
|
def fetch(self):
|
||||||
def fetch(title):
|
filename = self.name.replace('.','_') + '.h5'
|
||||||
filename = title + '.h5'
|
fetch = False
|
||||||
fetch = False
|
today = dt.date.today()
|
||||||
today = dt.date.today()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
hdf = pd.HDFStore(filename, 'r')
|
hdf = pd.HDFStore(filename, 'r')
|
||||||
hdf.close()
|
except:
|
||||||
except:
|
|
||||||
fetch = True
|
|
||||||
|
|
||||||
try:
|
|
||||||
lastmodified = dt.datetime.fromtimestamp(os.stat(filename).st_mtime).date()
|
|
||||||
if lastmodified != today:
|
|
||||||
fetch = True
|
fetch = True
|
||||||
except:
|
|
||||||
fetch = True
|
|
||||||
|
|
||||||
if fetch:
|
try:
|
||||||
print ("Fetching \"{}\"".format(title))
|
lastmodified = dt.datetime.fromtimestamp(os.stat(filename).st_mtime).date()
|
||||||
# Get stock price via data reader
|
if lastmodified != today:
|
||||||
start = dt.datetime(2019,1,1)
|
fetch = True
|
||||||
end = dt.date.today()
|
except:
|
||||||
data = web.DataReader(title, "av-daily", start, end, api_key=key)
|
fetch = True
|
||||||
hdf = pd.HDFStore(title + '.h5')
|
|
||||||
hdf[title] = data
|
|
||||||
else:
|
|
||||||
hdf = pd.HDFStore(filename, 'r')
|
|
||||||
data = hdf[title]
|
|
||||||
hdf.close()
|
|
||||||
|
|
||||||
def plot(ax, fig, data):
|
if fetch:
|
||||||
dates = data.index
|
print ("Fetching \"{}\"".format(self.name))
|
||||||
data.plot()
|
# Get stock price via data reader
|
||||||
def hover(event):
|
start = dt.datetime(2019,1,1)
|
||||||
if event.inaxes == ax:
|
end = dt.date.today()
|
||||||
x_idx = int(event.xdata)
|
data = web.DataReader(self.name, "av-daily", start, end, api_key=key)
|
||||||
ax.format_xdata = lambda x: dates[x_idx]
|
hdf = pd.HDFStore(filename)
|
||||||
ax.format_ydata = lambda y: '{:.2f}'.format(data[x_idx])
|
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')
|
_macd = self.data_full['macd'][len(self.data_full)-1]
|
||||||
data_full = hdf[title]*k_euro
|
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:]
|
def show(self, figNum=1):
|
||||||
boll = boll_full[len(boll_full)-1 - show_range_days:]
|
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)
|
self.fig = plt.figure(figNum)
|
||||||
ax = plt.subplot(311)
|
self.ax = plt.subplot(311)
|
||||||
plot(ax, fig, data['close'])
|
self.__plot(data['close'])
|
||||||
plot(ax, fig, data['ema'])
|
self.__plot(data['ema'])
|
||||||
plot(ax, fig, data['sma'])
|
self.__plot(data['sma'])
|
||||||
plt.title(title)
|
plt.title(self.name)
|
||||||
plt.legend()
|
plt.legend()
|
||||||
plt.grid()
|
plt.grid()
|
||||||
|
|
||||||
plt.subplot(312)
|
plt.subplot(312)
|
||||||
boll['upper'].plot()
|
boll['upper'].plot()
|
||||||
boll['mid'].plot()
|
boll['mid'].plot()
|
||||||
boll['lower'].plot()
|
boll['lower'].plot()
|
||||||
plt.legend()
|
plt.legend()
|
||||||
plt.grid()
|
plt.grid()
|
||||||
|
|
||||||
plt.subplot(313)
|
plt.subplot(313)
|
||||||
data['macd'].plot()
|
data['macd'].plot()
|
||||||
plt.legend()
|
plt.legend()
|
||||||
plt.grid()
|
plt.grid()
|
||||||
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
figNum = 1
|
||||||
for title in titles:
|
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)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user