mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-05 08:51:20 +00:00
Merge pull request #128 from DidierRLopes/get-main-data-from-quandl
Get main data from yahoo finance
This commit is contained in:
@@ -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."
|
||||
)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user