Merge pull request #128 from DidierRLopes/get-main-data-from-quandl

Get main data from yahoo finance
This commit is contained in:
DidierRLopes
2021-03-07 18:50:37 +00:00
committed by GitHub
5 changed files with 86 additions and 62 deletions

View File

@@ -301,3 +301,12 @@ def lett_to_num(word: str) -> str:
for (a, b) in replacements:
word = word.replace(a, b)
return word
def check_sources(source: str) -> str:
available_historical_price_sources = ["yf", "av"]
if source in available_historical_price_sources:
return source
raise argparse.ArgumentTypeError(
"This source for historical data is not available."
)

View File

@@ -2,6 +2,7 @@ import argparse
from sys import stdout
import pandas as pd
from alpha_vantage.timeseries import TimeSeries
import yfinance as yf
from gamestonk_terminal.helper_funcs import (
valid_date,
@@ -9,6 +10,7 @@ from gamestonk_terminal.helper_funcs import (
parse_known_args_and_warn,
check_ohlc,
lett_to_num,
check_sources,
)
from gamestonk_terminal import config_terminal as cfg
@@ -82,7 +84,7 @@ def clear(l_args, s_ticker, s_start, s_interval, df_stock):
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"""
prog="load", description=""" Load a stock in order to perform analysis."""
)
parser.add_argument(
"-t",
@@ -109,6 +111,15 @@ def load(l_args, s_ticker, s_start, s_interval, df_stock):
choices=[1, 5, 15, 30, 60],
help="Intraday stock minutes",
)
parser.add_argument(
"--source",
action="store",
dest="source",
type=check_sources,
default="yf",
help="Source of historical data. Intraday: Only 'av' available."
"Daily: 'yf' and 'av' available.",
)
try:
# For the case where a user uses: 'load BB'
@@ -128,32 +139,65 @@ def load(l_args, s_ticker, s_start, s_interval, df_stock):
s_interval = str(ns_parser.n_interval) + "min"
try:
ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format="pandas")
# Daily
if s_interval == "1440min":
# pylint: disable=unbalanced-tuple-unpacking
df_stock, _ = ts.get_daily_adjusted(
symbol=ns_parser.s_ticker, outputsize="full"
)
if ns_parser.source == "av":
ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format="pandas")
# pylint: disable=unbalanced-tuple-unpacking
df_stock, _ = ts.get_daily_adjusted(
symbol=ns_parser.s_ticker, outputsize="full"
)
df_stock.sort_index(ascending=True, inplace=True)
# Slice dataframe from the starting date YYYY-MM-DD selected
df_stock = df_stock[ns_parser.s_start_date :]
elif ns_parser.source == "yf":
df_stock = yf.download(
ns_parser.s_ticker, start=ns_parser.s_start_date, progress=False
)
# Check that a stock was successfully retrieved
if df_stock.empty:
print("")
return [s_ticker, s_start, s_interval, df_stock]
df_stock = df_stock.rename(
columns={
"Open": "1. open",
"High": "2. high",
"Low": "3. low",
"Close": "4. close",
"Adj Close": "5. adjusted close",
"Volume": "6. volume",
}
)
# Intraday
else:
# pylint: disable=unbalanced-tuple-unpacking
df_stock, _ = ts.get_intraday(
symbol=ns_parser.s_ticker, outputsize="full", interval=s_interval
)
if ns_parser.source == "av":
ts = TimeSeries(key=cfg.API_KEY_ALPHAVANTAGE, output_format="pandas")
# pylint: disable=unbalanced-tuple-unpacking
df_stock, _ = ts.get_intraday(
symbol=ns_parser.s_ticker, outputsize="full", interval=s_interval
)
df_stock.sort_index(ascending=True, inplace=True)
df_stock.sort_index(ascending=True, inplace=True)
# Slice dataframe from the starting date YYYY-MM-DD selected
df_stock = df_stock[ns_parser.s_start_date :]
elif ns_parser.source == "yf":
print(
"Unfortunately, yahoo finance historical data doesn't contain intraday prices"
)
except Exception as e:
print(e)
print("Either the ticker or the API_KEY are invalids. Try again!")
print("Either the ticker or the API_KEY are invalids. Try again!\n")
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."
)
@@ -289,7 +333,7 @@ def view(l_args, s_ticker, s_start, s_interval, df_stock):
def export(l_args, df_stock):
parser = argparse.ArgumentParser(
prog="export",
description="Exports the historical data from this ticker to a file or stdout",
description="Exports the historical data from this ticker to a file or stdout.",
)
parser.add_argument(
"-f",

View File

@@ -2,10 +2,16 @@ import argparse
import webbrowser
# -----------------------------------------------------------------------------------------------------------------------
def print_research():
def print_research(s_ticker, s_start, s_interval):
""" Print help """
s_intraday = (f"Intraday {s_interval}", "Daily")[s_interval == "1440min"]
if s_start:
print(f"\n{s_intraday} Stock: {s_ticker} (from {s_start.strftime('%Y-%m-%d')})")
else:
print(f"\n{s_intraday} Stock: {s_ticker}")
print("\nResearch Mode:")
print(" help show this fundamental analysis menu again")
print(" q quit this menu, and shows back to main menu")
@@ -33,8 +39,7 @@ def print_research():
print("")
# ---------------------------------------------------- MENU ----------------------------------------------------
def res_menu(s_ticker):
def res_menu(s_ticker, s_start, s_interval):
# Add list of arguments that the research parser accepts
res_parser = argparse.ArgumentParser(prog="discovery", add_help=False)
res_parser.add_argument(
@@ -64,7 +69,7 @@ def res_menu(s_ticker):
],
)
print_research()
print_research(s_ticker, s_start, s_interval)
# Loop forever and ever
while True:
@@ -80,7 +85,7 @@ def res_menu(s_ticker):
try:
if ns_known_args.cmd == "help":
print_research()
print_research(s_ticker, s_start, s_interval)
elif ns_known_args.cmd == "q":
# Just leave the RES menu
@@ -90,116 +95,80 @@ def res_menu(s_ticker):
# Abandon the program
return True
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "macroaxis":
webbrowser.open(f"https://www.macroaxis.com/invest/market/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "yahoo":
webbrowser.open(f"https://finance.yahoo.com/quote/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "finviz":
webbrowser.open(f"https://finviz.com/quote.ashx?t={s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "marketwatch":
webbrowser.open(
f"https://www.marketwatch.com/investing/stock/{s_ticker}"
)
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "fool":
webbrowser.open(f"https://www.fool.com/quote/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "businessinsider":
webbrowser.open(
f"https://markets.businessinsider.com/stocks/{s_ticker}-stock/"
)
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "fmp":
webbrowser.open(
f"https://financialmodelingprep.com/financial-summary/{s_ticker}"
)
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "fidelity":
webbrowser.open(
f"https://eresearch.fidelity.com/eresearch/goto/evaluate/snapshot.jhtml?symbols={s_ticker}"
)
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "tradingview":
webbrowser.open(f"https://www.tradingview.com/symbols/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "marketchameleon":
webbrowser.open(f"https://marketchameleon.com/Overview/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "stockrow":
webbrowser.open(f"https://stockrow.com/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "barchart":
webbrowser.open(
f"https://www.barchart.com/stocks/quotes/{s_ticker}/overview"
)
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "grufity":
webbrowser.open(f"https://grufity.com/stock/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "fintel":
webbrowser.open(f"https://fintel.io/s/us/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "zacks":
webbrowser.open(f"https://www.zacks.com/stock/quote/{s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "macrotrends":
webbrowser.open(
f"https://www.macrotrends.net/stocks/charts/{s_ticker}/{s_ticker}/market-cap"
)
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "newsfilter":
webbrowser.open(f"https://newsfilter.io/search?query={s_ticker}")
print("")
# ------------------------------------------------------------------------------------------------------------
elif ns_known_args.cmd == "resources":
# webbrowser.open(f"https://www.tradinganalysisresources.com/2020/05/free-references-and-resources.html")
webbrowser.open(
"https://moongangcapital.com/free-stock-market-resources/"
)
print("")
# ------------------------------------------------------------------------------------------------------------
else:
print("Command not recognized!")
print("")
except SystemExit:
print("")
return False

View File

@@ -82,7 +82,7 @@ def ema(l_args, s_ticker, s_interval, df_stock):
plt.plot(df_ta.index, df_ta.values)
# Pandas series
if len(df_ta.shape) == 1:
l_legend = ["{ns_parser.n_length} EMA"]
l_legend = [f"{ns_parser.n_length} EMA"]
# Pandas dataframe
else:
l_legend = df_ta.columns.tolist()

View File

@@ -127,7 +127,7 @@ def main():
b_quit = sm.sen_menu(s_ticker, s_start)
elif ns_known_args.opt == "res":
b_quit = rm.res_menu(s_ticker)
b_quit = rm.res_menu(s_ticker, s_start, s_interval)
elif ns_known_args.opt == "fa":
b_quit = fam.fa_menu(s_ticker, s_start, s_interval)
@@ -163,7 +163,9 @@ def main():
if s_interval == "1440min":
b_quit = pm.pred_menu(df_stock, s_ticker, s_start, s_interval)
# If stock data is intradaily, we need to get data again as prediction
# techniques work on daily adjusted data
# techniques work on daily adjusted data. By default we load data from
# Alpha Vantage because the historical data loaded gives a larger
# dataset than the one provided by quandl
else:
try:
ts = TimeSeries(