mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-28 13:01:38 +00:00
Improve menus
This commit is contained in:
211
command.py
211
command.py
@@ -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)
|
||||
@@ -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!")
|
||||
@@ -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!')
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user