added caching

This commit is contained in:
tomgwang 2024-09-26 13:10:19 -07:00
parent 456bfc38d2
commit 654ef5ea32

View File

@ -517,99 +517,7 @@ def modified_bollinger_strategy(stk):
return order_list return order_list
def intelligent_loop_plots(sym, tmp):
# def test_get_orders():
# sd = dt.datetime(2000,2,1)
# # ed = dt.datetime.today()
# ed = dt.datetime(2012,9,12)
# symbol = ['INTC', 'XOM', 'MSFT']
# dates = dates = pd.date_range(sd, ed)
# prices = get_data(symbol, dates, addSPY=False)
# stk = security(prices)
# # order_list = simple_bollinger_strategy(stk)
# order_list = modified_bollinger_strategy(stk)
# # print(order_list)
# port_val = compute_portvals(order_list,100000,9.95,0.005)
# if isinstance(port_val, pd.DataFrame):
# port_val = port_val[port_val.columns[0]].to_frame() # just get the first column
# else:
# print("warning, code did not return a DataFrame")
# price_SPY = plot_against_sym(port_val)
# rfr=0
# sf=252
# cr, adr, sddr, sr = compute_portfolio_stats(port_val, [1.0], rfr, sf)
# crSP,adrSP,sddrSP,srSP = compute_portfolio_stats(price_SPY, [1.0], rfr, sf)
# # Compare portfolio against $SPX
# print("\nDate Range: {} to {}".format(sd.date(), ed.date()))
# print()
# print("Sharpe Ratio: {}, {}".format(sr, srSP))
# print()
# print("Cumulative Return: {}, {}".format(cr, crSP))
# print()
# print("Standard Deviation: {}, {}".format(sddr, sddrSP))
# print()
# print("Average Daily Return: {}, {}".format(adr, adrSP))
# print()
# print("Final Portfolio Value: {:.2f}".format(port_val['Portfolio'].iloc[-1]))
def plot_basic(stk, axs):
data = stk.price.copy()
lower, upper = stk.bollinger(200)
data = data.join(lower, rsuffix = '_BOL200L')
data = data.join(upper, rsuffix = '_BOL200U')
data = data.join(stk.sma(200), rsuffix = '_SMA200')
data = data.join(stk.sma(50), rsuffix = '_SMA50')
data = data.join(stk.vwma(50), rsuffix = '_WVMA50')
plot_data(data, axs, ylabel='Price ($)')
def plot_rsi(rsi, axs):
poscol = 'green'
negcol = 'red'
axs.plot(rsi.index.values, rsi.iloc[:,0])
axs.axhline(70, color=negcol, ls='dotted')
axs.axhline(30, color=poscol, ls='dotted')
axs.fill_between(rsi.index.values, rsi.iloc[:,0], 70,
where=rsi.iloc[:,0]>=70, facecolor=negcol, edgecolor=negcol, alpha=0.5)
axs.fill_between(rsi.index.values, rsi.iloc[:,0], 30,
where=rsi.iloc[:,0]<=30, facecolor=poscol, edgecolor=poscol, alpha=0.5)
axs.set_yticks([30, 50, 70])
axs.set_ylabel('RSI')
axs.grid()
def plot_volume_rsi(rsi, axs):
poscol = 'green'
negcol = 'red'
axs.plot(rsi.index.values, rsi.iloc[:,0])
axs.axhline(70, color=negcol, ls='dotted')
axs.axhline(30, color=poscol, ls='dotted')
axs.fill_between(rsi.index.values, rsi.iloc[:,0], 70,
where=rsi.iloc[:,0]>=70, facecolor=negcol, edgecolor=negcol, alpha=0.5)
axs.fill_between(rsi.index.values, rsi.iloc[:,0], 30,
where=rsi.iloc[:,0]<=30, facecolor=poscol, edgecolor=poscol, alpha=0.5)
axs.set_yticks([30, 50, 70])
axs.set_ylabel('VoRSI')
axs.grid()
def plot_macd(macd, macd_sig, macd_hist, axs):
poscol = 'green'
negcol = 'red'
axs.plot(macd.index.values, macd.iloc[:, 0], label='MACD')
axs.legend()
axs.plot(macd.index.values, macd_sig.iloc[:, 0])
axs.plot(macd.index.values, macd_hist.iloc[:, 0])
axs.fill_between(macd.index.values, macd_hist.iloc[:, 0], 0,
where=macd_hist.iloc[:, 0]>0, facecolor=poscol, edgecolor=poscol, alpha=0.5)
axs.fill_between(macd.index.values, macd_hist.iloc[:, 0], 0,
where=macd_hist.iloc[:, 0]<0, facecolor=negcol, edgecolor=negcol, alpha=0.5)
axs.set_ylabel('MACD')
axs.grid()
def intelligent_loop_plots(sym):
# Only plot ones that are standing out meaning: # Only plot ones that are standing out meaning:
# 1. outside of bollinger bands or recently crossed over (within 9 days) # 1. outside of bollinger bands or recently crossed over (within 9 days)
# 2. RSI above 70 or below 30 # 2. RSI above 70 or below 30
@ -625,15 +533,6 @@ def intelligent_loop_plots(sym):
# matplotlib.rcParams.update({'figure.max_open_warning': 0}) # matplotlib.rcParams.update({'figure.max_open_warning': 0})
lb_year = 3 # years of stock data to retrieve
plt_year = 2 # number of years data to plot
lb_trigger = 5 # days to lookback for triggering events
ed = dt.datetime.today()
sd = ed - dt.timedelta(days = 365 * lb_year)
plot_sd = ed - dt.timedelta(days = 365 * plt_year)
plot_ed = ed
tmp = si.get_data(sym, start_date=sd)[["adjclose", "volume"]]
price = tmp["adjclose"] price = tmp["adjclose"]
vol = tmp["volume"] vol = tmp["volume"]
stk = security(sym, price, vol) stk = security(sym, price, vol)
@ -726,18 +625,6 @@ def intelligent_loop_plots(sym):
# plot_indicator =="[]" ): # plot_indicator =="[]" ):
# continue # skipping plotting to save memory and time # continue # skipping plotting to save memory and time
# Plotting
# fig, (axs0, axs1, axs2, axs3) = plt.subplots(4, sharex=True,
# gridspec_kw={'hspace': 0, 'height_ratios': [3, 1, 1, 1]},
# figsize=(16, 12))
# # fig.suptitle('{} - {} - {} - {}'.format(sym,\
# # watchlist.loc[sym, 'Segment'], watchlist.loc[sym, 'Sub Segment']))
# axs0.set_title('{} - {} - {} - {} - {}'.format(sym,\
# watchlist.loc[sym, 'Segment'], watchlist.loc[sym, 'Sub Segment'],\
# watchlist.loc[sym, 'Notes'], plot_indicator))
# axs0.set_xlim([plot_sd, plot_ed])
# plot basic price info # plot basic price info
data = price.copy().to_frame(sym) data = price.copy().to_frame(sym)
# to limit low bound when plotting in log scale # to limit low bound when plotting in log scale
@ -759,6 +646,15 @@ def intelligent_loop_plots(sym):
if __name__ == "__main__": if __name__ == "__main__":
lb_year = 3 # years of stock data to retrieve
plt_year = 2 # number of years data to plot
lb_trigger = 5 # days to lookback for triggering events
end_date = dt.datetime.today()
start_date = end_date - dt.timedelta(days = 365 * lb_year)
plot_sd = end_date - dt.timedelta(days = 365 * plt_year)
plot_ed = end_date
# test_sec_class() # test_sec_class()
# test_smooth() # test_smooth()
# test_bollinger_sell() # test_bollinger_sell()
@ -767,13 +663,17 @@ if __name__ == "__main__":
# Initialize the app # Initialize the app
app = Dash() app = Dash()
# CACHE_CONFIG = {'CACHE_TYPE': 'SimpleCache'}
# cache = Cache()
# cache.init_app(app.server, config=CACHE_CONFIG)
watchlist = get_watchlist() watchlist = get_watchlist()
symbols = watchlist.index.values.tolist() symbols = watchlist.index.values.tolist()
CACHE_CONFIG = {'CACHE_TYPE': 'SimpleCache'}
cache = Cache()
cache.init_app(app.server, config=CACHE_CONFIG)
@cache.memoize(timeout=14400) # cache timeout set to 4 hours
def fetch_stk_data(sym, sd):
return si.get_data(sym, start_date=sd)[["adjclose", "volume"]]
# App layout # App layout
app.layout = [ app.layout = [
# html.Button('Refresh Data', id='button', n_clicks=0), # html.Button('Refresh Data', id='button', n_clicks=0),
@ -843,71 +743,6 @@ if __name__ == "__main__":
else: else:
return no_update return no_update
# @cache.memoize(timeout=14400) # cache timeout set to 4 hours
# def global_store():
# j_obj = intelligent_loop_plots()
# return j_obj
# retrieve data button callbacks
# @callback(
# Output("button", "disabled", allow_duplicate=True),
# Input("button", "n_clicks"),
# prevent_initial_call=True,
# )
# def disable_btn(n):
# if n:
# return True
# return no_update
# @callback(
# Output(component_id='signal', component_property='data'),
# # Output(component_id='button', component_property='disabled'),
# Input(component_id='button', component_property='n_clicks'),
# prevent_initial_call=True,
# )
# def get_data_cb(clicks):
# # global all_plot_sym, all_plot_ind, all_data, all_vol, all_macd, all_rsi
# # if clicks == 0:
# # return # no update
# if not clicks or clicks == 0:
# raise PreventUpdate
# print("get data")
# global_store()
# print("data retrieved")
# # unpacking
# # json_data = json.loads(j_obj)
# # all_plot_sym = json_data["all_plot_sym"]
# # all_plot_ind = json_data["all_plot_ind"]
# # all_data = pd.read_json(io.StringIO(json_data['all_data']))
# # all_vol = pd.read_json(io.StringIO(json_data['all_vol']))
# # all_macd = pd.read_json(io.StringIO(json_data['all_macd']))
# # all_rsi = pd.read_json(io.StringIO(json_data['all_rsi']))
# return clicks
# Add controls to build the interaction
# callback when data retrieve finishes triggered by signal
# @callback(
# Output(component_id='symbols_dropdown_list', component_property='options'),
# Output(component_id='button', component_property='disabled'),
# Output(component_id='start-button', component_property='disabled'),
# Input(component_id='signal', component_property='data'),
# )
# def update_dropdown(in_data):
# if not in_data or in_data == 0:
# raise PreventUpdate
# # return no_update
# print(f"input: {in_data}")
# j_obj = global_store()
# # unpacking
# json_data = json.loads(j_obj)
# all_plot_sym = json_data["all_plot_sym"]
# print("dropdown menu options updated")
# # all_plot_sym = ["SPY", "AMZN"]
# return sorted(all_plot_sym), False, False
# dropdown callback # dropdown callback
@callback( @callback(
Output(component_id='controls-and-graph', component_property='figure'), Output(component_id='controls-and-graph', component_property='figure'),
@ -922,19 +757,11 @@ if __name__ == "__main__":
if not col_chosen: if not col_chosen:
raise PreventUpdate raise PreventUpdate
# return no_update # return no_update
# col_chosen = "SPY"
# j_obj = global_store()
# # unpacking
# json_data = json.loads(j_obj)
# # all_plot_sym = json_data["all_plot_sym"]
# all_plot_ind = json_data["all_plot_ind"]
# all_data = pd.read_json(io.StringIO(json_data['all_data']))
# all_vol = pd.read_json(io.StringIO(json_data['all_vol']))
# all_macd = pd.read_json(io.StringIO(json_data['all_macd']))
# all_rsi = pd.read_json(io.StringIO(json_data['all_rsi']))
# get data # get data
data, vol, macd, rsi, plot_ind = intelligent_loop_plots(col_chosen) # tmp = si.get_data(sym, start_date=sd)[["adjclose", "volume"]]
tmp = fetch_stk_data(col_chosen, start_date)
data, vol, macd, rsi, plot_ind = intelligent_loop_plots(col_chosen, tmp)
fig = make_subplots( fig = make_subplots(
rows=3, rows=3,