diff --git a/my_test.py b/my_test.py index 34e6a0f..ae6a0c8 100644 --- a/my_test.py +++ b/my_test.py @@ -1,35 +1,44 @@ -''' -On your terminal run: -pip install alpha_vantage - -This also uses the pandas dataframe, and matplotlib, commonly used python packages -pip install pandas -pip install matplotlib - -For the develop version run: -pip install git+https://github.com/RomelTorres/alpha_vantage.git@develop -''' - -from alpha_vantage.timeseries import TimeSeries -from alpha_vantage.techindicators import TechIndicators - -from matplotlib.pyplot import figure +import pandas as pd +import numpy as np import matplotlib.pyplot as plt -# Your key here -key = '0UO7Z2MVZ2YSQSVE' -# Chose your output format, or default to JSON (python dict) -ts = TimeSeries(key, output_format='pandas') +def ema(data, key, alpha=0.5, ic=None): + result = [] + if ic is None: + r = data[key][0] + else: + r = ic + for v in data[key]: + r = alpha*r + (1-alpha)*v + result.append(r) -# Get the data, returns a tuple -# aapl_data is a pandas dataframe, aapl_meta_data is a dict -aapl_data, aapl_meta_data = ts.get_daily(symbol='AAPL') + return np.array(result) +def colsum(data, keys): + result = np.zeros(data.shape[0]) + for key in keys: + result += data[key] -# Visualization -figure(num=None, figsize=(15, 6), dpi=80, facecolor='w', edgecolor='k') -aapl_data['4. close'].plot() -dataArray = aapl_data['4. close'].to_numpy() -plt.tight_layout() + return result + +store = pd.HDFStore('test.h5') +if 1: + df = pd.DataFrame(np.array([[1, 2, 3, 101], [4, 5, 6, 102], [7, 8, 9, 103], [10, 11, 12, 104]]),columns=['high', 'low', 'open', 'close']) + store['df'] = df +else: + df = store['df'] + +df['ema(close)'] = ema(df, 'close') +df['colsum'] = colsum(df, ['high', 'low', 'open', 'close']) +df['ema(colsum)'] = ema(df, 'colsum') + +# Print table +print(df) + +# Plot graph +df.plot() +plt.legend() plt.grid() plt.show() + +store.close() \ No newline at end of file diff --git a/pandas_eval.py b/pandas_eval.py index 6f2e55e..f6d1bcb 100644 --- a/pandas_eval.py +++ b/pandas_eval.py @@ -20,82 +20,124 @@ import datetime key = '0UO7Z2MVZ2YSQSVE' - -def sin(f, a, N): - result = np.empty(0) - for n in range(0, N): - v = a*math.sin(2*math.pi*f*n/N) - result = np.append(result, v) - - return result - -def ema(data, alpha=0.75): - result = np.empty(0) - r = data[0] - - for v in data: +def ema(data, key, alpha=0.5, ic=None): + result = [] + if ic is None: + r = data[key][0] + else: + r = ic + for v in data[key]: r = alpha*r + (1-alpha)*v - result = np.append(result, r) + result.append(r) + + return np.array(result) + +def sma(data, key, window_days, ic=None): + mem = [0] * window_days + result = [] + k=0 + cumsum = 0 + for v in data[key]: + cumsum += (v - mem[k]) + mem[k] = v + k += 1 + if k >= window_days: + k=0 + + result.append(cumsum/window_days) return result -def macd(data): - ema_short = ema(data, alpha=0.85) - ema_long = ema(data, alpha=0.925) +def sd(data, key, window_days, ic=None): + mem = [0] * window_days + result = [] + k=0 + cumsum = 0 + data_mean = data[key] - sma(data, key, window_days, ic) + for v in data_mean: + v2 = v * v + cumsum += (v2 - mem[k]) + mem[k] = v2 + k += 1 + if k >= window_days: + k=0 + + var = max(0, cumsum) / window_days + result.append(math.sqrt(var)) + + return result + + +def colsum(data, keys): + result = np.zeros(data.shape[0]) + for key in keys: + result += data[key] + + return result + +def macd(data, key): + ema_short = ema(data, key, alpha=0.85) + ema_long = ema(data, key, alpha=0.925) return ema_short - ema_long +def bollinger(data, window_days, f=2): + tp_ser = colsum(data, keys=['high', 'low', 'close']) / 3 + tp_df = tp_ser.to_frame(name='tp') + stddev = np.array(sd(tp_df, 'tp', window_days)) + + mid = np.array(sma(tp_df, key='tp', window_days=window_days)) + upper = mid + f * stddev + lower = mid - f * stddev + print (mid) + print (upper) + print (lower) + result = pd.DataFrame(upper, index=data.index, columns=['upper']) + result['lower'] = lower + result['mid'] = mid + return result + data = {} +title = 'AAPL' + if 0: # Get stock price via data reader start = datetime.datetime(2016,1,1) end = datetime.date.today() - data = web.DataReader("AAPL", "av-monthly", start, end, api_key=key) -# data = web.DataReader("AAPL", "stooq", start, end) + data = web.DataReader(title, "av-daily", start, end, api_key=key) +# data = web.DataReader(title, "stooq", start, end) - type(data) - hdf = pd.HDFStore('aapl.h5') - hdf['open'] = data['open'] - hdf['close'] = data['close'] - hdf['high'] = data['high'] - hdf['low'] = data['low'] - hdf.close() + print(data) + hdf = pd.HDFStore(title + '.h5') + hdf[title] = data else: - hdf = pd.HDFStore('aapl.h5', 'r') - data['open'] = hdf['open'] - data['close'] = hdf['close'] - data['high'] = hdf['high'] - data['low'] = hdf['low'] - hdf.close() + hdf = pd.HDFStore(title + '.h5', 'r') + data = hdf[title] -df = pd.DataFrame({"A": ["a", "b", "c", "a"]}) -print(df) - -v = data.values() -i = data.items() -print(data) - -data['ema'] = ema(data['close'], alpha=0.75) - -data['open'].plot() -data['close'].plot() -data['high'].plot() -data['low'].plot() -plt.legend() -plt.grid() -plt.show() - -np_data = np.flip(data['close'].to_numpy()) +data['ema'] = ema(data, key='close', alpha=0.75) +data['macd'] = macd(data, key='close') +data['sma'] = sma(data, key='close', window_days=30) +boll = bollinger(data, window_days=30) +data['boll(up)'] = boll['upper'] +data['boll(mid)'] = boll['mid'] +data['boll(low)'] = boll['lower'] plt.subplot(211) -plt.plot(np_data, label='Price') -plt.plot(ema(np_data), label='EMA') +data['close'].plot() +#data['ema'].plot() +#data['sma'].plot() +data['boll(up)'].plot() +data['boll(mid)'].plot() +data['boll(low)'].plot() plt.legend() plt.grid() plt.subplot(212) -plt.plot(macd(np_data), label='MACD') +data['macd'].plot() plt.legend() plt.grid() + plt.show() + +hdf.close()