mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-29 05:21:48 +00:00
* fix gov tests * refactor insider * new virtual path extraction * removed some symbol default params as they're considered critical * little adjustments * portfolio refactor * merge API factory * add helpers, stocks, crypto, forex * minor forex changes * include forex api paths * add 2 missing forex funcs * portfolio brokers refactor * display help on api func call * add econometrics virtual paths to api * add api unit test * fixed report for the new api * minor portfolio refactorings * added gdapps * anchor_yield path * some more crypto path fixes * small change * fixed wrong param * minor fixes * wip - inital commit for forex report * add bw as a model, we'll get better solution afterwards * added ema with dummy model as it adds great functionality to the report * minor fixes * wip - added functions to forex report * add feedparser news path * add new virtual paths to api * adding commands to equity report * revert to old paths, new ones were breaking * Add in very basic ETF report * Add candle chart to ETF report * add etf load * allow use of candle without data * add raw to candle * added forex report * ongoing equity report * equity report change * fix some portfolio bugs and add docstrings * include portfolio paths and coin class * add crypto paths * change event dates to str * starting economy report * window for limit * equity report and refactor newsapi * add helper to api * update on economy report * equity report * update economy report * refactor some docstrings * change maturities helper * refactor newsapi * refactor futures command * add some sauce to ycrv plot * black * update report * refactor alphavantage * refactor wsj * update economy report * ycrv tenor * map avaiable_indices * map economy helpers * fix econdb docstring * add plots on economy report * minor fixes * wip - crypto report * update economy report * added same default args as view * added view to explicity use chart=True when suing the api * adjustments - removed rich tables to use only df * final version economy report * change report name * equity report for review * linting * add etf symbols endpoint * incorporate feedback economy report * fix reports launch by adding tag to economy report * fix equity bug * remove analyst name * fix * fix news * make links hyperlinks for equity * click links * fixed arg name * improved news * small improves * Fix light terminal stylesheet that would prevent using it in notebooks (#2473) * improved report * run reports in installer * fix #2209 * minor ycrv refactoring * refactor portfolio/holdv virtual path * refactor benchmark trades * fix events args * adapt economy report to changes * fix portfolio controller bug * holdv refactor * refactor perf command * start portfolio report * remove perf view * refactor holp * add textwrap3 to poetry (doesn't solve the error) * fix equity after merge * add some rolling commands * fix equity after save button * improved crypto report, plus minor fixes * minor fixes on the reports * add maxdd and distr * refactor qa * var command * refactor qa expected shortfall * add es command * add es command * fix qa percentile bug * fix economy rendering * refactor qa omega * add om command * add summary command * add dret command * add mret command * add yret command * add metrics * add allocs to report * remove bro and po commands, add later * fixed some tests * adjustments to crypto report * Fix docstring for VSCode Added a note about installing Jupyter PowerToys extension for optimal API usage in Jupyter VSCode, in the API_README.md. * minor adjustment * remove nft calendar model virtual paths * Add in Portfolio report * fix external axes portfolio view * Update portfolio report with rolling plots * Details for ETF and Portfolio * fix economy report * change analyst to openbb * floppy * fixed unmatched axis in reports * Speed up tests * fix file and load on po * get_news output * add some po paths * Add integration tests for Reports menu * refactor maxsharpe * open maxsharpe * open minrisk * open maxutil * open maxret * Added fixes * black * remove useless views * Fixed small issue * refactor ef * open ef api * portfolio optimization report * Added fixes * unblock api loading * add more endpoints * update po report * unblock api loading * update po report * expose herc * expose property endpoint * Added fixes * More api fixes * flake8 * Fixed some mypy * news api model * flake8 * mypy fix * mypy * black * pylint * fix tests * markdown * markdown * Added fixes * fix economy report * merge * fix economy report * remove empty notebook * expose nco * remove jupyter notebook * expose plot endpoint * remove po report, just used for tests * api v paths plot * remove api_old * change loading msg Co-authored-by: montezdesousa <montezdesousa@gmail.com> Co-authored-by: hjoaquim <h.joaquim@campus.fct.unl.pt> Co-authored-by: montezdesousa <79287829+montezdesousa@users.noreply.github.com> Co-authored-by: Om Gupta <guptagom@gmail.com> Co-authored-by: minhhoang1023 <40023817+minhhoang1023@users.noreply.github.com> Co-authored-by: JerBouma <jer.bouma@gmail.com> Co-authored-by: Theodore Aptekarev <aptekarev@gmail.com> Co-authored-by: Om Gupta <85685255+soggyomelette@users.noreply.github.com> Co-authored-by: Diogo Sousa <diogosousa@Diogos-MBP.lan> Co-authored-by: Colin Delahunty <72827203+colin99d@users.noreply.github.com> Co-authored-by: northern-64bit <75195383+northern-64bit@users.noreply.github.com> Co-authored-by: colin99d <colin99delahunty@gmail.com> Co-authored-by: Minh Hoang <nminh.hoang1023@gmail.com>
180 lines
5.1 KiB
Python
180 lines
5.1 KiB
Python
"""Excel Model"""
|
|
__docformat__ = "numpy"
|
|
|
|
# pylint: disable=abstract-class-instantiated
|
|
|
|
import logging
|
|
|
|
import pandas as pd
|
|
|
|
from openbb_terminal.decorators import log_start_end
|
|
from openbb_terminal.rich_config import console
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def load_configuration(excel_file: str = ""):
|
|
"""
|
|
Load in the Excel file to determine the configuration that needs to be set.
|
|
|
|
Parameters
|
|
----------
|
|
excel_file: str
|
|
The location of the Excel file that needs to be loaded.
|
|
|
|
Returns
|
|
-------
|
|
configuration: dictionary
|
|
Returns a dictionary with the configurations set.
|
|
"""
|
|
# Read in the Optimization template
|
|
df = pd.read_excel(
|
|
excel_file,
|
|
sheet_name="Optimization",
|
|
skiprows=2,
|
|
usecols="B:D",
|
|
names=["Parameter", "Value", "Description"],
|
|
index_col="Parameter",
|
|
)
|
|
|
|
# Remove completely empty NaN rows
|
|
cleaned_df = df.dropna(axis="rows", thresh=2)
|
|
|
|
# Filter out any general columns
|
|
filtered_df = cleaned_df[cleaned_df["Description"] != "Description"]
|
|
|
|
# Convert to Dictionary
|
|
configuration = filtered_df.to_dict()
|
|
|
|
return configuration["Value"], configuration["Description"]
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def load_allocation(excel_file: str = ""):
|
|
"""
|
|
Load in the Excel file to determine the allocation that needs to be set.
|
|
|
|
Parameters
|
|
----------
|
|
excel_file: str
|
|
The location of the Excel file that needs to be loaded.
|
|
|
|
Returns
|
|
-------
|
|
tickers: list
|
|
Returns a list with ticker symbols
|
|
categories: dictionary
|
|
Returns a dictionary that specifies each category
|
|
"""
|
|
if str(excel_file).endswith(".xlsx"):
|
|
categories = pd.read_excel(excel_file, sheet_name="Allocation", usecols="A:G")
|
|
categories = categories.dropna(axis="rows")
|
|
elif str(excel_file).endswith(".csv"):
|
|
categories = pd.read_excel(excel_file)
|
|
categories = categories.dropna(axis="rows")
|
|
else:
|
|
console.print("Only Excel (.xlsx and .csv) files are accepted.\n")
|
|
return [], {}
|
|
|
|
categories.columns = [
|
|
col.upper().strip().replace(" ", "_") for col in categories.columns
|
|
]
|
|
categories = categories.apply(lambda x: x.astype(str).str.upper())
|
|
categories = categories[~categories.index.duplicated(keep="first")]
|
|
|
|
try:
|
|
categories.set_index("TICKER", inplace=True)
|
|
categories.sort_index(inplace=True)
|
|
except KeyError:
|
|
console.print("Allocation table needs a TICKER column\n")
|
|
return [], {}
|
|
|
|
tickers = list(categories.index)
|
|
tickers.sort()
|
|
categories = categories.to_dict()
|
|
|
|
return tickers, categories
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def load_bl_views(excel_file: str = ""):
|
|
"""
|
|
Load a Excel file with views for Black Litterman model.
|
|
|
|
Parameters
|
|
----------
|
|
excel_file: str
|
|
The location of the Excel file that needs to be loaded.
|
|
|
|
Returns
|
|
-------
|
|
p_views: list
|
|
Returns a list with p_views matrix
|
|
q_views: list
|
|
Returns a list with q_views matrix
|
|
"""
|
|
if str(excel_file).endswith(".xlsx"):
|
|
try:
|
|
p_views = pd.read_excel(excel_file, sheet_name="p_views", index_col=0)
|
|
p_views = p_views.fillna(0)
|
|
p_views = p_views.dropna(axis="rows")
|
|
except KeyError:
|
|
console.print("Excel file needs a p_views sheet\n")
|
|
return {}, {}
|
|
try:
|
|
q_views = pd.read_excel(excel_file, sheet_name="q_views", index_col=0)
|
|
q_views = q_views.dropna(axis="rows")
|
|
except KeyError:
|
|
console.print("Excel file needs a p_views sheet\n")
|
|
return {}, {}
|
|
else:
|
|
console.print("Only Excel (.xlsx) files are accepted.\n")
|
|
return {}, {}
|
|
|
|
p_views = p_views.T.sort_index()
|
|
p_views = p_views.T.to_csv(index=False, header=0).replace("\n", ";")
|
|
p_views = p_views[:-1]
|
|
p_views = [[float(item) for item in row.split(",")] for row in p_views.split(";")]
|
|
q_views = q_views.to_csv(index=False, header=0).replace("\n", ",")
|
|
q_views = q_views[:-1]
|
|
q_views = [float(item) for item in q_views.split(",")]
|
|
|
|
return p_views, q_views
|
|
|
|
|
|
@log_start_end(log=logger)
|
|
def excel_bl_views(file: str, stocks: str, n: int = 3):
|
|
"""
|
|
Create an Excel file with required format to build n views for Black Litterman cmd.
|
|
|
|
Parameters
|
|
----------
|
|
stocks: str
|
|
List of stocks used to build the Black Litterman model views.
|
|
n: int
|
|
The number of views that will be created.
|
|
|
|
Returns
|
|
-------
|
|
file: excel
|
|
Returns a list with ticker symbols
|
|
"""
|
|
if len(stocks) < 2:
|
|
console.print("Please have at least 2 loaded tickers to create views.\n")
|
|
|
|
p_views = [[""] * len(stocks) for i in range(n)]
|
|
p_views_df = pd.DataFrame(p_views, columns=stocks)
|
|
|
|
q_views = [[""] for i in range(n)]
|
|
q_views_df = pd.DataFrame(q_views, columns=["Returns"])
|
|
|
|
if file.endswith(".xlsx"):
|
|
pass
|
|
else:
|
|
file += ".xlsx"
|
|
|
|
with pd.ExcelWriter(file) as writer:
|
|
p_views_df.to_excel(writer, sheet_name="p_views")
|
|
q_views_df.to_excel(writer, sheet_name="q_views")
|