- added some new indicators
git-svn-id: http://moon:8086/svn/projects/Stock@297 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
+37
-28
@@ -1,35 +1,44 @@
|
|||||||
'''
|
import pandas as pd
|
||||||
On your terminal run:
|
import numpy as np
|
||||||
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 matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
# Your key here
|
def ema(data, key, alpha=0.5, ic=None):
|
||||||
key = '0UO7Z2MVZ2YSQSVE'
|
result = []
|
||||||
# Chose your output format, or default to JSON (python dict)
|
if ic is None:
|
||||||
ts = TimeSeries(key, output_format='pandas')
|
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
|
return np.array(result)
|
||||||
# aapl_data is a pandas dataframe, aapl_meta_data is a dict
|
|
||||||
aapl_data, aapl_meta_data = ts.get_daily(symbol='AAPL')
|
|
||||||
|
|
||||||
|
def colsum(data, keys):
|
||||||
|
result = np.zeros(data.shape[0])
|
||||||
|
for key in keys:
|
||||||
|
result += data[key]
|
||||||
|
|
||||||
# Visualization
|
return result
|
||||||
figure(num=None, figsize=(15, 6), dpi=80, facecolor='w', edgecolor='k')
|
|
||||||
aapl_data['4. close'].plot()
|
store = pd.HDFStore('test.h5')
|
||||||
dataArray = aapl_data['4. close'].to_numpy()
|
if 1:
|
||||||
plt.tight_layout()
|
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.grid()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
|
store.close()
|
||||||
+96
-54
@@ -20,82 +20,124 @@ import datetime
|
|||||||
|
|
||||||
key = '0UO7Z2MVZ2YSQSVE'
|
key = '0UO7Z2MVZ2YSQSVE'
|
||||||
|
|
||||||
|
def ema(data, key, alpha=0.5, ic=None):
|
||||||
def sin(f, a, N):
|
result = []
|
||||||
result = np.empty(0)
|
if ic is None:
|
||||||
for n in range(0, N):
|
r = data[key][0]
|
||||||
v = a*math.sin(2*math.pi*f*n/N)
|
else:
|
||||||
result = np.append(result, v)
|
r = ic
|
||||||
|
for v in data[key]:
|
||||||
return result
|
|
||||||
|
|
||||||
def ema(data, alpha=0.75):
|
|
||||||
result = np.empty(0)
|
|
||||||
r = data[0]
|
|
||||||
|
|
||||||
for v in data:
|
|
||||||
r = alpha*r + (1-alpha)*v
|
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
|
return result
|
||||||
|
|
||||||
def macd(data):
|
def sd(data, key, window_days, ic=None):
|
||||||
ema_short = ema(data, alpha=0.85)
|
mem = [0] * window_days
|
||||||
ema_long = ema(data, alpha=0.925)
|
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
|
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 = {}
|
data = {}
|
||||||
|
title = 'AAPL'
|
||||||
|
|
||||||
if 0:
|
if 0:
|
||||||
# Get stock price via data reader
|
# Get stock price via data reader
|
||||||
start = datetime.datetime(2016,1,1)
|
start = datetime.datetime(2016,1,1)
|
||||||
end = datetime.date.today()
|
end = datetime.date.today()
|
||||||
data = web.DataReader("AAPL", "av-monthly", start, end, api_key=key)
|
data = web.DataReader(title, "av-daily", start, end, api_key=key)
|
||||||
# data = web.DataReader("AAPL", "stooq", start, end)
|
# data = web.DataReader(title, "stooq", start, end)
|
||||||
|
|
||||||
type(data)
|
print(data)
|
||||||
hdf = pd.HDFStore('aapl.h5')
|
hdf = pd.HDFStore(title + '.h5')
|
||||||
hdf['open'] = data['open']
|
hdf[title] = data
|
||||||
hdf['close'] = data['close']
|
|
||||||
hdf['high'] = data['high']
|
|
||||||
hdf['low'] = data['low']
|
|
||||||
hdf.close()
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
hdf = pd.HDFStore('aapl.h5', 'r')
|
hdf = pd.HDFStore(title + '.h5', 'r')
|
||||||
data['open'] = hdf['open']
|
data = hdf[title]
|
||||||
data['close'] = hdf['close']
|
|
||||||
data['high'] = hdf['high']
|
|
||||||
data['low'] = hdf['low']
|
|
||||||
hdf.close()
|
|
||||||
|
|
||||||
df = pd.DataFrame({"A": ["a", "b", "c", "a"]})
|
data['ema'] = ema(data, key='close', alpha=0.75)
|
||||||
print(df)
|
data['macd'] = macd(data, key='close')
|
||||||
|
data['sma'] = sma(data, key='close', window_days=30)
|
||||||
v = data.values()
|
boll = bollinger(data, window_days=30)
|
||||||
i = data.items()
|
data['boll(up)'] = boll['upper']
|
||||||
print(data)
|
data['boll(mid)'] = boll['mid']
|
||||||
|
data['boll(low)'] = boll['lower']
|
||||||
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())
|
|
||||||
|
|
||||||
plt.subplot(211)
|
plt.subplot(211)
|
||||||
plt.plot(np_data, label='Price')
|
data['close'].plot()
|
||||||
plt.plot(ema(np_data), label='EMA')
|
#data['ema'].plot()
|
||||||
|
#data['sma'].plot()
|
||||||
|
data['boll(up)'].plot()
|
||||||
|
data['boll(mid)'].plot()
|
||||||
|
data['boll(low)'].plot()
|
||||||
plt.legend()
|
plt.legend()
|
||||||
plt.grid()
|
plt.grid()
|
||||||
|
|
||||||
plt.subplot(212)
|
plt.subplot(212)
|
||||||
plt.plot(macd(np_data), label='MACD')
|
data['macd'].plot()
|
||||||
plt.legend()
|
plt.legend()
|
||||||
plt.grid()
|
plt.grid()
|
||||||
|
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
|
hdf.close()
|
||||||
|
|||||||
Reference in New Issue
Block a user