mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-27 12:40:35 +00:00
Add top gainers command
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
""" Example or something
|
||||
|
||||
Is this not informative enough?
|
||||
|
||||
Finviz for data
|
||||
|
||||
"""
|
||||
from alpha_vantage.timeseries import TimeSeries
|
||||
import argparse
|
||||
@@ -13,15 +16,18 @@ from pandas.plotting import register_matplotlib_converters
|
||||
register_matplotlib_converters()
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------
|
||||
def print_help():
|
||||
""" Print help
|
||||
"""
|
||||
print("What do you want to do?")
|
||||
print("gainers show latest top gainers")
|
||||
print("view view a specific stock tick")
|
||||
print("help help to see this menu again")
|
||||
print("quit to abandon the program")
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------
|
||||
def check_positive(value):
|
||||
ivalue = int(value)
|
||||
if ivalue <= 0:
|
||||
@@ -29,6 +35,7 @@ def check_positive(value):
|
||||
return ivalue
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------
|
||||
def valid_date(s):
|
||||
try:
|
||||
return datetime.strptime(s, "%Y-%m-%d")
|
||||
@@ -36,6 +43,7 @@ def valid_date(s):
|
||||
raise argparse.ArgumentTypeError("Not a valid date: {s}")
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------
|
||||
def plot_dataframe(df, symbol):
|
||||
pfig, axVolume = plt.subplots()
|
||||
plt.bar(df.index, df['5. volume'].values, color='k')
|
||||
@@ -53,6 +61,7 @@ def plot_dataframe(df, symbol):
|
||||
plt.show()
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------
|
||||
def main():
|
||||
""" Main function of the program
|
||||
"""
|
||||
@@ -67,8 +76,7 @@ def main():
|
||||
add_help=False)
|
||||
|
||||
# Add list of arguments that the main parser accepts
|
||||
main_parser.add_argument('cmd',
|
||||
choices=['quit', 'help', 'view'])
|
||||
main_parser.add_argument('cmd', choices=['quit', 'help', 'gainers' ,'view'])
|
||||
|
||||
# Print first welcome message and help
|
||||
print("\nWelcome to Didier's Stock Market Bot\n")
|
||||
@@ -86,53 +94,73 @@ def main():
|
||||
except SystemExit:
|
||||
print("The command selected doesn't exist\n")
|
||||
continue
|
||||
|
||||
|
||||
# ---------------------------------------------------- GAINERS ----------------------------------------------------
|
||||
if ns_known_args.cmd == 'gainers':
|
||||
parser = argparse.ArgumentParser(prog='gainers',
|
||||
description='Show top ticker gainers from Yahoo Finance')
|
||||
parser.add_argument('-n', 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("")
|
||||
continue
|
||||
|
||||
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))
|
||||
|
||||
# ---------------------------------------------------- VIEW ----------------------------------------------------
|
||||
if ns_known_args.cmd == 'view':
|
||||
elif ns_known_args.cmd == 'view':
|
||||
parser = argparse.ArgumentParser(prog='view',
|
||||
description='Given a stock market ticker, allows to see historical data of \
|
||||
the corresponding stock. Note that the alpha_vantage key is necessary \
|
||||
for this to work!')
|
||||
parser.add_argument('-t', action="store", dest="ticker", required=True, help='Stock ticker')
|
||||
parser.add_argument('--type', action="store", dest="type", type=check_positive, default=4,
|
||||
parser.add_argument('-t', action="store", dest="s_ticker", required=True, help='Stock ticker')
|
||||
parser.add_argument('--type', action="store", dest="n_type", type=check_positive, default=4,
|
||||
help='1234 corresponds to types: 1. open; 2. high; 3.low; 4. close \
|
||||
while 14 corresponds to types: 1.open; 4. close')
|
||||
parser.add_argument("-s", "--start", type=valid_date, dest="start_date",
|
||||
parser.add_argument("-s", "--start", type=s_start_date, dest="start_date",
|
||||
help="The starting date (format YYYY-MM-DD) of the stock")
|
||||
|
||||
try:
|
||||
(ns_parser, l_unknown_args) = parser.parse_known_args(l_args)
|
||||
except SystemExit:
|
||||
print("")
|
||||
continue
|
||||
|
||||
if l_unknown_args:
|
||||
print(f"The following args couldn't be interpreted: {l_unknown_args}")
|
||||
|
||||
# Currently only supports daily stocks
|
||||
# TODO: Intra-daily
|
||||
# TODO: Intra-daily perhaps
|
||||
ts = TimeSeries(key=cfg.API_KEY,
|
||||
output_format='pandas')
|
||||
try:
|
||||
df, meta_data = ts.get_daily(symbol=ns_parser.ticker,
|
||||
df, meta_data = ts.get_daily(symbol=ns_parser.s_ticker,
|
||||
outputsize='full')
|
||||
except:
|
||||
print("Either the ticker or the API_KEY are invalids. Try again!")
|
||||
continue
|
||||
|
||||
# Add function to plot data
|
||||
ln_col_idx = [int(x)-1 for x in list(str(ns_parser.type))]
|
||||
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")
|
||||
continue
|
||||
|
||||
# Slice dataframe from the starting date YYYY-MM-DD selected
|
||||
if ns_parser.start_date:
|
||||
df = df[ns_parser.start_date:]
|
||||
if ns_parser.s_start_date:
|
||||
df = df[ns_parser.s_start_date:]
|
||||
|
||||
ln_col_idx.append(4) # Append last column of df to be filtered which corresponds to: 5. Volume
|
||||
|
||||
plot_dataframe(df.iloc[:, ln_col_idx], ns_parser.ticker)
|
||||
plot_dataframe(df.iloc[:, ln_col_idx], ns_parser.s_ticker)
|
||||
|
||||
|
||||
# ---------------------------------------------------- HELP ----------------------------------------------------
|
||||
@@ -150,4 +178,5 @@ def main():
|
||||
print("\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user