diff --git a/stock_market_cli.py b/stock_market_cli.py index 19309142f3d..e708d899401 100644 --- a/stock_market_cli.py +++ b/stock_market_cli.py @@ -54,6 +54,7 @@ def print_help(s_ticker, s_start, b_is_market_open): print("\nTechnical Analysis:") print(" sma simple moving average") print(" ema exponential moving average") + print(" macd moving average convergence/divergence") print("\nPrediction:") print(" ma") @@ -83,10 +84,18 @@ def main(): s_start = "" df_stock = pd.DataFrame() + # Set stock by default to speed up testing + s_ticker = "TSLA" + s_start = datetime.strptime("2020-06-04", "%Y-%m-%d") + ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format='pandas') + df_stock, d_stock_metadata = ts.get_daily(symbol=s_ticker, outputsize='full') + df_stock = df_stock[s_start:] + # Delete above in the future + main_parser = argparse.ArgumentParser(prog='stock_market_bot', add_help=False) # Add list of arguments that the main parser accepts - main_parser.add_argument('cmd', choices=['quit', 'help', 'gainers' ,'view', 'load', 'clear', 'sma', 'ema', 'ratings']) + main_parser.add_argument('cmd', choices=['quit', 'help', 'gainers' ,'view', 'load', 'clear', 'sma', 'ema', 'macd', 'ratings']) # Print first welcome message and help print("\nWelcome to Didier's Stock Market Bot\n") @@ -161,6 +170,11 @@ def main(): elif ns_known_args.cmd == 'ema': smta.ema(l_args, s_ticker, df_stock) continue + + # ---------------------------------------------------- MACD ---------------------------------------------------- + elif ns_known_args.cmd == 'macd': + smta.macd(l_args, s_ticker, df_stock) + continue # -------------------------------------------------------------------------------------------------------------- # ------------------------------------------------ PREDICTION -------------------------------------------------- diff --git a/stock_market_helper_funcs.py b/stock_market_helper_funcs.py index a1032c3d782..768f0966bba 100644 --- a/stock_market_helper_funcs.py +++ b/stock_market_helper_funcs.py @@ -41,14 +41,29 @@ def plot_view_stock(df, symbol): # ----------------------------------------------------------------------------------------------------------------------- -def plot_stock_ta(df_stock, s_stock, df_ta, s_ta): +def plot_stock_ta(df_stock, s_ticker, df_ta, s_ta): plt.plot(df_stock.index, df_stock.values) plt.plot(df_ta.index, df_ta.values) - plt.title(f"{s_ta} on {s_stock}") + plt.title(f"{s_ta} on {s_ticker}") plt.xlim(df_stock.index[0], df_stock.index[-1]) plt.xlabel('Time') plt.ylabel('Share Price ($)') - plt.legend([s_stock, s_ta]) + plt.legend([s_ticker, s_ta]) + plt.grid(b=True, which='major', color='#666666', linestyle='-') + plt.minorticks_on() + plt.grid(b=True, which='minor', color='#999999', linestyle='-', alpha=0.2) + plt.show() + print("") + + +# ----------------------------------------------------------------------------------------------------------------------- +def plot_ta(s_ticker, df_ta, s_ta): + plt.plot(df_ta.index, df_ta.values) + plt.title(f"{s_ta} on {s_ticker}") + plt.xlim(df_ta.index[0], df_ta.index[-1]) + plt.xlabel('Time') + plt.ylabel('Share Price ($)') + plt.legend(df_ta.columns) plt.grid(b=True, which='major', color='#666666', linestyle='-') plt.minorticks_on() plt.grid(b=True, which='minor', color='#999999', linestyle='-', alpha=0.2) diff --git a/stock_market_technical_analysis.py b/stock_market_technical_analysis.py index 6109841b992..97dac97888e 100644 --- a/stock_market_technical_analysis.py +++ b/stock_market_technical_analysis.py @@ -63,3 +63,47 @@ def ema(l_args, s_ticker, df_stock): except: print("") return + + +# ----------------------------------------------------- MACD ----------------------------------------------------- +def macd(l_args, s_ticker, df_stock): + parser = argparse.ArgumentParser(prog='macd', + description=""" The Moving Average Convergence Divergence (MACD) is the difference + between two Exponential Moving Averages. The Signal line is an Exponential Moving + Average of the MACD. \n \n The MACD signals trend changes and indicates the start + of new trend direction. High values indicate overbought conditions, low values + indicate oversold conditions. Divergence with the price indicates an end to the + current trend, especially if the MACD is at extreme high or low values. When the MACD + line crosses above the signal line a buy signal is generated. When the MACD crosses + below the signal line a sell signal is generated. To confirm the signal, the MACD + should be above zero for a buy, and below zero for a sell. """) + + parser.add_argument('-f', "--fast", action="store", dest="n_fast", type=check_positive, default=12, + help='The short period.') + parser.add_argument('-s', "--slow", action="store", dest="n_slow", type=check_positive, default=26, + help='The long period.') + parser.add_argument("--signal", action="store", dest="n_signal", type=check_positive, default=9, + help='The signal period.') + parser.add_argument('-o', "--offset", action="store", dest="n_offset", type=check_positive, default=9, + help='How many periods to offset the result.') + + try: + (ns_parser, l_unknown_args) = parser.parse_known_args(l_args) + except SystemExit: + print("") + return + + if l_unknown_args: + print(f"The following args couldn't be interpreted: {l_unknown_args}") + + try: + df_ta = ta.macd(df_stock['4. close'], + fast=ns_parser.n_fast, + slow=ns_parser.n_slow, + signal=ns_parser.n_signal, + offset=ns_parser.n_offset).dropna() + + plot_ta(s_ticker, df_ta, f"{ns_parser.n_fast}-{ns_parser.n_slow}-{ns_parser.n_signal}-{ns_parser.n_offset} MACD") + except: + print("") + return