diff --git a/command.py b/command.py deleted file mode 100644 index 91858a1844e..00000000000 --- a/command.py +++ /dev/null @@ -1,211 +0,0 @@ -import argparse -from alpha_vantage.sectorperformance import SectorPerformances -from alpha_vantage.timeseries import TimeSeries -import config_bot as cfg -import pandas as pd -from stock_market_helper_funcs import * - - -# ----------------------------------------------- PRINT_HELP ---------------------------------------------------------- -def print_help(s_ticker, s_start, s_interval, b_is_market_open): - """ Print help - """ - print("What do you want to do?") - print(" gainers show latest top gainers") - print(" sectors show sectors performance") - print(" view view and load a specific stock ticker for technical analysis") - print(" clear clear a specific stock ticker from analysis") - print(" load load a specific stock ticker for analysis") - print(" help help to see this menu again") - print(" quit to abandon the program") - - s_intraday = (f'Intraday {s_interval}', 'Daily')[s_interval == "1440min"] - if s_ticker and s_start: - print(f"\n{s_intraday} Stock: {s_ticker} (from {s_start.strftime('%Y-%m-%d')})") - elif s_ticker: - print(f"\n{s_intraday} Stock: {s_ticker}") - else: - print("\nStock: ?") - print(f"Market {('CLOSED', 'OPEN')[b_is_market_open]}.") - - if s_ticker: - print("\nMenus:") - print(" fa fundamental analysis") - print(" ta technical analysis") - print(" pred prediction techniques") - - ''' - print("\nPrediction:") - print(" ma") - print(" ema") - print(" lr") - print(" knn") - print(" arima") - print(" rnn") - print(" lstm") - print(" prophet") - ''' - -# ---------------------------------------------------- SECTORS ---------------------------------------------------- -def sectors(l_args): - parser = argparse.ArgumentParser(prog='sectors', description='Plot sectors performance') - - 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}") - - sp = SectorPerformances(key=cfg.API_KEY_ALPHAVANTAGE, output_format='pandas') - df_sectors, d_meta_data = sp.get_sector() - df_sectors['Rank A: Real-Time Performance'].plot(kind='bar') - plt.title('Real Time Performance (%) per Sector') - plt.tight_layout() - plt.grid() - plt.show() - print("") - - -# ---------------------------------------------------- GAINERS ---------------------------------------------------- -def gainers(l_args): - parser = argparse.ArgumentParser(prog='gainers', - description='Show top ticker gainers from Yahoo Finance') - parser.add_argument('-n', "--num", action="store", dest="n_gainers", type=int, default=5, choices=range(1, 25), - help='Number of the top gainers stocks to retrieve (default 5)') - - 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}") - - df_gainers = pd.read_html('https://finance.yahoo.com/screener/predefined/day_gainers')[0] - print(df_gainers.head(ns_parser.n_gainers).to_string(index=False)) - print("") - -# ----------------------------------------------------- LOAD ----------------------------------------------------- -def load(l_args, s_ticker, s_start, s_interval, df_stock): - parser = argparse.ArgumentParser(prog='load', description=""" Load a stock in order to perform analysis""") - parser.add_argument('-t', "--ticker", action="store", dest="s_ticker", required=True, help="Stock ticker") - parser.add_argument('-s', "--start", type=valid_date, dest="s_start_date", help="The starting date (format YYYY-MM-DD) of the stock") - parser.add_argument('-i', "--interval", action="store", dest="n_interval", type=int, default=1440, choices=[1,5,15,30,60], help="Intraday stock minutes") - - try: - (ns_parser, l_unknown_args) = parser.parse_known_args(l_args) - except SystemExit: - print("") - return [s_ticker, s_start, s_interval, df_stock] - - if l_unknown_args: - print(f"The following args couldn't be interpreted: {l_unknown_args}") - - # Update values: - s_ticker = ns_parser.s_ticker - s_start = ns_parser.s_start_date - s_interval = str(ns_parser.n_interval)+'min' - - try: - ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format='pandas') - # Daily - if s_interval == "1440min": - df_stock, d_stock_metadata = ts.get_daily_adjusted(symbol=ns_parser.s_ticker, outputsize='full') - # Intraday - else: - df_stock, d_stock_metadata = ts.get_intraday(symbol=ns_parser.s_ticker, outputsize='full', interval=s_interval) - - except: - print("Either the ticker or the API_KEY are invalids. Try again!") - return [s_ticker, s_start, s_interval, df_stock] - - s_intraday = (f'Intraday {s_interval}', 'Daily')[s_interval == "1440min"] - - if s_start: - # Slice dataframe from the starting date YYYY-MM-DD selected - df_stock = df_stock[ns_parser.s_start_date:] - print(f"Loading {s_intraday} {s_ticker} stock with starting period {s_start.strftime('%Y-%m-%d')} for analysis.\n") - else: - print(f"Loading {s_intraday} {s_ticker} stock for analysis.\n") - - return [s_ticker, s_start, s_interval, df_stock] - - -# ----------------------------------------------------- VIEW ----------------------------------------------------- -def view(l_args, s_ticker, s_start, s_interval, df_stock): - parser = argparse.ArgumentParser(prog='view', description='Visualise historical data of a stock. An alpha_vantage key is necessary.') - if s_ticker: - parser.add_argument('-t', "--ticker", action="store", dest="s_ticker", default=s_ticker, help='Stock ticker') - else: - parser.add_argument('-t', "--ticker", action="store", dest="s_ticker", required=True, help='Stock ticker') - parser.add_argument('-s', "--start", type=valid_date, dest="s_start_date", help="The starting date (format YYYY-MM-DD) of the stock") - parser.add_argument('-i', "--interval", action="store", dest="n_interval", type=int, default=0, choices=[1,5,15,30,60], help="Intraday stock minutes") - parser.add_argument("--type", action="store", dest="n_type", type=check_positive, default=5, # in case it's daily - help='1234 corresponds to types: 1. open; 2. high; 3.low; 4. close; while 14 corresponds to types: 1.open; 4. close') - - 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}") - - # Update values: - s_ticker = ns_parser.s_ticker - if ns_parser.s_start_date: - s_start = ns_parser.s_start_date - - # A new interval intraday period was given - if ns_parser.n_interval != 0: - s_interval = str(ns_parser.n_interval)+'min' - - try: - ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format='pandas') - # Daily - if s_interval == "1440min": - df_stock, d_stock_metadata = ts.get_daily_adjusted(symbol=s_ticker, outputsize='full') - # Intraday - else: - df_stock, d_stock_metadata = ts.get_intraday(symbol=s_ticker, outputsize='full', interval=s_interval) - - except: - print("Either the ticker or the API_KEY are invalids. Try again!") - return - - # Slice dataframe from the starting date YYYY-MM-DD selected - df_stock = df_stock[s_start:] - - # Daily - if s_interval == "1440min": - # The default doesn't exist for intradaily data - ln_col_idx = [int(x)-1 for x in list(str(ns_parser.n_type))] - if 4 not in ln_col_idx: - ln_col_idx.append(4) - # Check that the types given are not bigger than 4, as there are only 5 types (0-4) - if len([i for i in ln_col_idx if i > 4]) > 0: - print("An index bigger than 4 was given, which is wrong. Try again") - return - # Append last column of df to be filtered which corresponds to: 6. Volume - ln_col_idx.append(5) - # Intraday - else: - # The default doesn't exist for intradaily data - if ns_parser.n_type == 5: - ln_col_idx = [3] - else: - ln_col_idx = [int(x)-1 for x in list(str(ns_parser.n_type))] - # Check that the types given are not bigger than 3, as there are only 4 types (0-3) - if len([i for i in ln_col_idx if i > 3]) > 0: - print("An index bigger than 3 was given, which is wrong. Try again") - return - # Append last column of df to be filtered which corresponds to: 5. Volume - ln_col_idx.append(4) - - # Plot view of the stock - plot_view_stock(df_stock.iloc[:, ln_col_idx], ns_parser.s_ticker) diff --git a/fundamental_analysis/fa_menu.py b/fundamental_analysis/fa_menu.py index 7d5d084d00a..dec87d40103 100644 --- a/fundamental_analysis/fa_menu.py +++ b/fundamental_analysis/fa_menu.py @@ -39,7 +39,7 @@ def print_fundamental_analysis(s_ticker, s_start, s_interval): print(" insider insider trading of the company") print(" news latest news of the company") print(" analyst analyst prices and ratings of the company") - print("\nMarket Watch BS") + print("\nMarket Watch API") print(" incom income statement of the company") print(" assets assets of the company") print(" liabilities liabilities and shareholders equity of the company") @@ -80,6 +80,7 @@ def print_more_fundamental_analysis(): print(" ratios financial ratios of the company") print(" growth financial statement growth of the company") print("") + return # ---------------------------------------------------- INFO ---------------------------------------------------- @@ -112,9 +113,9 @@ def fa_menu(s_ticker, s_start, s_interval): # Add list of arguments that the fundamental analysis parser accepts fa_parser = argparse.ArgumentParser(prog='fundamental_analysis', add_help=False) - fa_parser.add_argument('fa', choices=['info', 'warnings', 'help', 'q', 'quit', 'more', - 'screener', 'insider', 'news', 'analyst', # Finviz - 'income', 'assets', 'liabilities', 'operating', 'investing', 'financing', 'sec']) # MW + fa_parser.add_argument('cmd', choices=['info', 'warnings', 'help', 'q', 'quit', 'more', + 'screener', 'insider', 'news', 'analyst', # Finviz + 'income', 'assets', 'liabilities', 'operating', 'investing', 'financing', 'sec']) # MW print_fundamental_analysis(s_ticker, s_start, s_interval) @@ -131,64 +132,64 @@ def fa_menu(s_ticker, s_start, s_interval): print("The command selected doesn't exist\n") continue - if ns_known_args.fa == 'info': + if ns_known_args.cmd == 'info': info(l_args, s_ticker) - elif ns_known_args.fa == 'help': + elif ns_known_args.cmd == 'help': print_fundamental_analysis(s_ticker, s_start, s_interval) - elif ns_known_args.fa == 'q': + elif ns_known_args.cmd == 'q': # Just leave the FA menu return False - elif ns_known_args.fa == 'quit': + elif ns_known_args.cmd == 'quit': # Abandon the program return True - elif ns_known_args.fa == 'warnings': + elif ns_known_args.cmd == 'warnings': mw_api.sean_seah_warnings(l_args, s_ticker) - # -------------------------------------------------- FINVIZ ----------------------------------------------- - elif ns_known_args.fa == 'screener': + # FINVIZ API + elif ns_known_args.cmd == 'screener': fvz_api.screener(l_args, s_ticker) - elif ns_known_args.fa == 'insider': + elif ns_known_args.cmd == 'insider': fvz_api.insider(l_args, s_ticker) - elif ns_known_args.fa == 'news': + elif ns_known_args.cmd == 'news': fvz_api.news(l_args, s_ticker) - elif ns_known_args.fa == 'analyst': + elif ns_known_args.cmd == 'analyst': fvz_api.analyst(l_args, s_ticker) - # ------------------------------------------------ MARKET WATCH --------------------------------------------- - elif ns_known_args.fa == 'income': + # MARKET WATCH API + elif ns_known_args.cmd == 'income': mw_api.income(l_args, s_ticker) - elif ns_known_args.fa == 'assets': + elif ns_known_args.cmd == 'assets': mw_api.assets(l_args, s_ticker) - elif ns_known_args.fa == 'liabilities': + elif ns_known_args.cmd == 'liabilities': mw_api.liabilities(l_args, s_ticker) - elif ns_known_args.fa == 'operating': + elif ns_known_args.cmd == 'operating': mw_api.operating(l_args, s_ticker) - elif ns_known_args.fa == 'investing': + elif ns_known_args.cmd == 'investing': mw_api.investing(l_args, s_ticker) - elif ns_known_args.fa == 'financing': + elif ns_known_args.cmd == 'financing': mw_api.financing(l_args, s_ticker) - elif ns_known_args.fa == 'sec': + elif ns_known_args.cmd == 'sec': mw_api.sec_fillings(l_args, s_ticker) - # --------------------------------------------- MORE FUNDAMENTAL ANALYSIS --------------------------------------------- - elif ns_known_args.fa == 'more': + # MORE FUNDAMENTAL ANALYSIS MENU + elif ns_known_args.cmd == 'more': # Add list of arguments that the more fundamental analysis parser accepts mfa_parser = argparse.ArgumentParser(prog='more_fundamental_analysis', add_help=False) - mfa_parser.add_argument('mfa', choices=['help', 'q', 'quit', + mfa_parser.add_argument('cmd', choices=['help', 'q', 'quit', 'overview', 'key', 'income', 'balance', 'cash', 'earnings', # AV 'profile', 'rating', 'quote', 'enterprise', 'dcf', # FMP 'inc', 'bal', 'cashf', 'metrics', 'ratios', 'growth']) # FMP @@ -208,75 +209,73 @@ def fa_menu(s_ticker, s_start, s_interval): print("The command selected doesn't exist\n") continue - if ns_known_args.mfa == 'help': + if ns_known_args.cmd == 'help': print_more_fundamental_analysis() - elif ns_known_args.mfa == 'q': + elif ns_known_args.cmd == 'q': # Just leave the more FA menu print_fundamental_analysis(s_ticker, s_start, s_interval) break - elif ns_known_args.mfa == 'quit': + elif ns_known_args.cmd == 'quit': # Abandon the program return True - # ----------------------------------------------- ALPHA VANTAGE ---------------------------------------------- - elif ns_known_args.mfa == 'overview': + # ALPHA VANTAGE API + elif ns_known_args.cmd == 'overview': av_api.overview(l_args, s_ticker) - elif ns_known_args.mfa == 'income': + elif ns_known_args.cmd == 'income': av_api.income_statement(l_args, s_ticker) - elif ns_known_args.mfa == 'balance': + elif ns_known_args.cmd == 'balance': av_api.balance_sheet(l_args, s_ticker) - elif ns_known_args.mfa == 'cash': + elif ns_known_args.cmd == 'cash': av_api.cash_flow(l_args, s_ticker) - elif ns_known_args.mfa == 'earnings': + elif ns_known_args.cmd == 'earnings': av_api.earnings(l_args, s_ticker) - # -------------------------------------------- FINANCIAL MODELING PREP ----------------------------------------- + # FINANCIAL MODELING PREP API # Details: - elif ns_known_args.mfa == 'profile': + elif ns_known_args.cmd == 'profile': fmp_api.profile(l_args, s_ticker) - elif ns_known_args.mfa == 'rating': + elif ns_known_args.cmd == 'rating': fmp_api.rating(l_args, s_ticker) - elif ns_known_args.mfa == 'quote': + elif ns_known_args.cmd == 'quote': fmp_api.quote(l_args, s_ticker) - elif ns_known_args.mfa == 'enterprise': + elif ns_known_args.cmd == 'enterprise': fmp_api.enterprise(l_args, s_ticker) - elif ns_known_args.mfa == 'dcf': + elif ns_known_args.cmd == 'dcf': fmp_api.discounted_cash_flow(l_args, s_ticker) # Financial statement: - elif ns_known_args.mfa == 'inc': + elif ns_known_args.cmd == 'inc': fmp_api.income_statement(l_args, s_ticker) - elif ns_known_args.mfa == 'bal': + elif ns_known_args.cmd == 'bal': fmp_api.balance_sheet(l_args, s_ticker) - elif ns_known_args.mfa == 'cashf': + elif ns_known_args.cmd == 'cashf': fmp_api.cash_flow(l_args, s_ticker) # Ratios: - elif ns_known_args.mfa == 'metrics': + elif ns_known_args.cmd == 'metrics': fmp_api.key_metrics(l_args, s_ticker) - elif ns_known_args.mfa == 'ratios': + elif ns_known_args.cmd == 'ratios': fmp_api.financial_ratios(l_args, s_ticker) - elif ns_known_args.mfa == 'growth': + elif ns_known_args.cmd == 'growth': fmp_api.financial_statement_growth(l_args, s_ticker) - # ------------------------------------------------------------------------------------------------------------ else: print("Command not recognized!") - # ------------------------------------------------------------------------------------------------------------ else: print("Command not recognized!") \ No newline at end of file diff --git a/stock_market_cli.py b/stock_market_cli.py index 128f32c10ca..842438159ad 100644 --- a/stock_market_cli.py +++ b/stock_market_cli.py @@ -38,19 +38,180 @@ - Sheet9 - Reddit popularity """ - import argparse import pandas as pd from stock_market_helper_funcs import * -import command as cmd from fundamental_analysis import fa_menu as fam from technical_analysis import ta_menu as tam +from discovery import disc_menu as dam # delete this important when automatic loading tesla #i.e. when program is done import config_bot as cfg from alpha_vantage.timeseries import TimeSeries +# ----------------------------------------------------- LOAD ----------------------------------------------------- +def load(l_args, s_ticker, s_start, s_interval, df_stock): + parser = argparse.ArgumentParser(prog='load', description=""" Load a stock in order to perform analysis""") + parser.add_argument('-t', "--ticker", action="store", dest="s_ticker", required=True, help="Stock ticker") + parser.add_argument('-s', "--start", type=valid_date, dest="s_start_date", help="The starting date (format YYYY-MM-DD) of the stock") + parser.add_argument('-i', "--interval", action="store", dest="n_interval", type=int, default=1440, choices=[1,5,15,30,60], help="Intraday stock minutes") + + try: + (ns_parser, l_unknown_args) = parser.parse_known_args(l_args) + except SystemExit: + print("") + return [s_ticker, s_start, s_interval, df_stock] + + if l_unknown_args: + print(f"The following args couldn't be interpreted: {l_unknown_args}") + + # Update values: + s_ticker = ns_parser.s_ticker + s_start = ns_parser.s_start_date + s_interval = str(ns_parser.n_interval)+'min' + + try: + ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format='pandas') + # Daily + if s_interval == "1440min": + df_stock, d_stock_metadata = ts.get_daily_adjusted(symbol=ns_parser.s_ticker, outputsize='full') + # Intraday + else: + df_stock, d_stock_metadata = ts.get_intraday(symbol=ns_parser.s_ticker, outputsize='full', interval=s_interval) + + except: + print("Either the ticker or the API_KEY are invalids. Try again!") + return [s_ticker, s_start, s_interval, df_stock] + + s_intraday = (f'Intraday {s_interval}', 'Daily')[s_interval == "1440min"] + + if s_start: + # Slice dataframe from the starting date YYYY-MM-DD selected + df_stock = df_stock[ns_parser.s_start_date:] + print(f"Loading {s_intraday} {s_ticker} stock with starting period {s_start.strftime('%Y-%m-%d')} for analysis.\n") + else: + print(f"Loading {s_intraday} {s_ticker} stock for analysis.\n") + + return [s_ticker, s_start, s_interval, df_stock] + + +# ----------------------------------------------------- VIEW ----------------------------------------------------- +def view(l_args, s_ticker, s_start, s_interval, df_stock): + parser = argparse.ArgumentParser(prog='view', description='Visualise historical data of a stock. An alpha_vantage key is necessary.') + if s_ticker: + parser.add_argument('-t', "--ticker", action="store", dest="s_ticker", default=s_ticker, help='Stock ticker') + else: + parser.add_argument('-t', "--ticker", action="store", dest="s_ticker", required=True, help='Stock ticker') + parser.add_argument('-s', "--start", type=valid_date, dest="s_start_date", help="The starting date (format YYYY-MM-DD) of the stock") + parser.add_argument('-i', "--interval", action="store", dest="n_interval", type=int, default=0, choices=[1,5,15,30,60], help="Intraday stock minutes") + parser.add_argument("--type", action="store", dest="n_type", type=check_positive, default=5, # in case it's daily + help='1234 corresponds to types: 1. open; 2. high; 3.low; 4. close; while 14 corresponds to types: 1.open; 4. close') + + 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}") + + # Update values: + s_ticker = ns_parser.s_ticker + if ns_parser.s_start_date: + s_start = ns_parser.s_start_date + + # A new interval intraday period was given + if ns_parser.n_interval != 0: + s_interval = str(ns_parser.n_interval)+'min' + + try: + ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format='pandas') + # Daily + if s_interval == "1440min": + df_stock, d_stock_metadata = ts.get_daily_adjusted(symbol=s_ticker, outputsize='full') + # Intraday + else: + df_stock, d_stock_metadata = ts.get_intraday(symbol=s_ticker, outputsize='full', interval=s_interval) + + except: + print("Either the ticker or the API_KEY are invalids. Try again!") + return + + # Slice dataframe from the starting date YYYY-MM-DD selected + df_stock = df_stock[s_start:] + + # Daily + if s_interval == "1440min": + # The default doesn't exist for intradaily data + ln_col_idx = [int(x)-1 for x in list(str(ns_parser.n_type))] + if 4 not in ln_col_idx: + ln_col_idx.append(4) + # Check that the types given are not bigger than 4, as there are only 5 types (0-4) + if len([i for i in ln_col_idx if i > 4]) > 0: + print("An index bigger than 4 was given, which is wrong. Try again") + return + # Append last column of df to be filtered which corresponds to: 6. Volume + ln_col_idx.append(5) + # Intraday + else: + # The default doesn't exist for intradaily data + if ns_parser.n_type == 5: + ln_col_idx = [3] + else: + ln_col_idx = [int(x)-1 for x in list(str(ns_parser.n_type))] + # Check that the types given are not bigger than 3, as there are only 4 types (0-3) + if len([i for i in ln_col_idx if i > 3]) > 0: + print("An index bigger than 3 was given, which is wrong. Try again") + return + # Append last column of df to be filtered which corresponds to: 5. Volume + ln_col_idx.append(4) + + # Plot view of the stock + plot_view_stock(df_stock.iloc[:, ln_col_idx], ns_parser.s_ticker) + + +# ----------------------------------------------------- HELP ------------------------------------------------------------------ +def print_help(s_ticker, s_start, s_interval, b_is_market_open): + """ Print help + """ + print("What do you want to do?") + print(" help help to see this menu again") + print(" quit to abandon the program") + print("") + print(" clear clear a specific stock ticker from analysis") + print(" load load a specific stock ticker for analysis") + print(" view view and load a specific stock ticker for technical analysis") + + s_intraday = (f'Intraday {s_interval}', 'Daily')[s_interval == "1440min"] + if s_ticker and s_start: + print(f"\n{s_intraday} Stock: {s_ticker} (from {s_start.strftime('%Y-%m-%d')})") + elif s_ticker: + print(f"\n{s_intraday} Stock: {s_ticker}") + else: + print("\nStock: ?") + print(f"Market {('CLOSED', 'OPEN')[b_is_market_open]}.") + + if s_ticker: + print("\nMenus:") + print(" disc discovery mode") + print(" fa fundamental analysis") + print(" ta technical analysis") + print(" pred prediction techniques") + + ''' + print("\nPrediction:") + print(" ma") + print(" ema") + print(" lr") + print(" knn") + print(" arima") + print(" rnn") + print(" lstm") + print(" prophet") + ''' + # ----------------------------------------------------------------------------------------------------------------------- def main(): @@ -73,19 +234,25 @@ def main(): # Add list of arguments that the main parser accepts menu_parser = argparse.ArgumentParser(prog='stock_market_bot', add_help=False) - menu_parser.add_argument('opt', choices=['gainers', 'sectors', 'view', 'clear', 'load', - 'fa', 'ta', 'help', 'quit']) + menu_parser.add_argument('opt', choices=['help', 'quit', + 'clear', 'load', 'view', + 'disc', 'fa', 'ta']) # Print first welcome message and help print("\nWelcome to Didier's Stock Market Bot\n") - cmd.print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) + print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) print("\n") # Loop forever and ever while True: # Get input command from user as_input = input('> ') + + # Is command empty + if not len(as_input): + print("") + continue # Parse main command of the list of possible commands try: @@ -95,38 +262,35 @@ def main(): print("The command selected doesn't exist\n") continue - # --------------------------------------------------- GAINERS -------------------------------------------------- - if ns_known_args.opt == 'gainers': - cmd.gainers(l_args) + if ns_known_args.opt == 'help': + print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) - # --------------------------------------------------- SECTORS -------------------------------------------------- - if ns_known_args.opt == 'sectors': - cmd.sectors(l_args) - - # --------------------------------------------------- CLEAR ---------------------------------------------------- + elif ns_known_args.opt == 'quit': + print("Hope you made money today. Good bye my lover, good bye my friend.\n") + return + elif ns_known_args.opt == 'clear': print("Clearing stock ticker to be used for analysis") s_ticker = "" s_start = "" - # ---------------------------------------------------- LOAD ---------------------------------------------------- elif ns_known_args.opt == 'load': - [s_ticker, s_start, s_interval, df_stock] = cmd.load(l_args, s_ticker, s_start, s_interval, df_stock) + [s_ticker, s_start, s_interval, df_stock] = load(l_args, s_ticker, s_start, s_interval, df_stock) - # ---------------------------------------------------- VIEW ---------------------------------------------------- elif ns_known_args.opt == 'view': - cmd.view(l_args, s_ticker, s_start, s_interval, df_stock) + view(l_args, s_ticker, s_start, s_interval, df_stock) - # ---------------------------------------------------- HELP ---------------------------------------------------- - elif ns_known_args.opt == 'help': - cmd.print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) + # DISCOVERY MENU + elif ns_known_args.opt == 'disc': + b_quit = dam.disc_menu() - # ----------------------------------------------------- QUIT ---------------------------------------------------- - elif ns_known_args.opt == 'quit': - print("Hope you made money today. Good bye my lover, good bye my friend.\n") - return - - # ------------------------------------------- FUNDAMENTAL ANALYSIS --------------------------------------------- + if b_quit: + print("Hope you made money today. Good bye my lover, good bye my friend.\n") + return + else: + print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) + + # FUNDAMENTAL ANALYSIS MENU elif ns_known_args.opt == 'fa': b_quit = fam.fa_menu(s_ticker, s_start, s_interval) @@ -134,9 +298,9 @@ def main(): print("Hope you made money today. Good bye my lover, good bye my friend.\n") return else: - cmd.print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) + print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) - # -------------------------------------------- TECHNICAL ANALYSIS ---------------------------------------------- + # TECHNICAL ANALYSIS MENU elif ns_known_args.opt == 'ta': b_quit = tam.ta_menu(df_stock, s_ticker, s_start, s_interval) @@ -144,12 +308,9 @@ def main(): print("Hope you made money today. Good bye my lover, good bye my friend.\n") return else: - cmd.print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) - - # ------------------------------------------------ PREDICTION -------------------------------------------------- + print_help(s_ticker, s_start, s_interval, b_is_stock_market_open()) - # -------------------------------------------------------------------------------------------------------------- else: print('Shouldnt see this command!') diff --git a/technical_analysis/ta_menu.py b/technical_analysis/ta_menu.py index 77f9b1abdf2..aeb1cfa75ad 100644 --- a/technical_analysis/ta_menu.py +++ b/technical_analysis/ta_menu.py @@ -57,12 +57,12 @@ def ta_menu(df_stock, s_ticker, s_start, s_interval): # Add list of arguments that the technical analysis parser accepts ta_parser = argparse.ArgumentParser(prog='technical_analysis', add_help=False) - ta_parser.add_argument('ta', choices=['help', 'q', 'quit', - 'ema', 'sma', 'vwap', # overlap - 'cci', 'macd', 'rsi', 'stoch', # momentum - 'adx', 'aroon', # trend - 'bbands', # volatility - 'ad', 'obv']) # volume + ta_parser.add_argument('cmd', choices=['help', 'q', 'quit', + 'ema', 'sma', 'vwap', # overlap + 'cci', 'macd', 'rsi', 'stoch', # momentum + 'adx', 'aroon', # trend + 'bbands', # volatility + 'ad', 'obv']) # volume print_technical_analysis(s_ticker, s_start, s_interval) @@ -79,56 +79,56 @@ def ta_menu(df_stock, s_ticker, s_start, s_interval): print("The command selected doesn't exist\n") continue - if ns_known_args.ta == 'help': + if ns_known_args.cmd == 'help': print_technical_analysis(s_ticker, s_start, s_interval) - elif ns_known_args.ta == 'q': + elif ns_known_args.cmd == 'q': # Just leave the FA menu return False - elif ns_known_args.ta == 'quit': + elif ns_known_args.cmd == 'quit': # Abandon the program return True # -------------------------------------------------- OVERLAP -------------------------------------------------- - elif ns_known_args.ta == 'ema': + elif ns_known_args.cmd == 'ema': ta_overlap.ema(l_args, s_ticker, s_interval, df_stock) - elif ns_known_args.ta == 'sma': + elif ns_known_args.cmd == 'sma': ta_overlap.sma(l_args, s_ticker, s_interval, df_stock) - elif ns_known_args.ta == 'vwap': + elif ns_known_args.cmd == 'vwap': ta_overlap.vwap(l_args, s_ticker, s_interval, df_stock) # --------------------------------------------------- MOMENTUM --------------------------------------------------- - elif ns_known_args.ta == 'cci': + elif ns_known_args.cmd == 'cci': ta_momentum.cci(l_args, s_ticker, s_interval, df_stock) - elif ns_known_args.ta == 'macd': + elif ns_known_args.cmd == 'macd': ta_momentum.macd(l_args, s_ticker, s_interval, df_stock) - elif ns_known_args.ta == 'rsi': + elif ns_known_args.cmd == 'rsi': ta_momentum.rsi(l_args, s_ticker, s_interval, df_stock) - elif ns_known_args.ta == 'stoch': + elif ns_known_args.cmd == 'stoch': ta_momentum.stoch(l_args, s_ticker, s_interval, df_stock) # ---------------------------------------------------- TREND ---------------------------------------------------- - elif ns_known_args.ta == 'adx': + elif ns_known_args.cmd == 'adx': ta_trend.adx(l_args, s_ticker, s_interval, df_stock) - elif ns_known_args.ta == 'aroon': + elif ns_known_args.cmd == 'aroon': ta_trend.aroon(l_args, s_ticker, s_interval, df_stock) # -------------------------------------------------- VOLATILITY -------------------------------------------------- - elif ns_known_args.ta == 'bbands': + elif ns_known_args.cmd == 'bbands': ta_volatility.bbands(l_args, s_ticker, s_interval, df_stock) # ---------------------------------------------------- VOLUME ---------------------------------------------------- - elif ns_known_args.ta == 'ad': + elif ns_known_args.cmd == 'ad': ta_volume.ad(l_args, s_ticker, s_interval, df_stock) - elif ns_known_args.ta == 'obv': + elif ns_known_args.cmd == 'obv': ta_volume.obv(l_args, s_ticker, s_interval, df_stock) # ------------------------------------------------------------------------------------------------------------