From 49641bd9e80067767662253ead032b7bf8e8829f Mon Sep 17 00:00:00 2001 From: Jeroen Bouma Date: Mon, 30 Jan 2023 19:22:32 +0100 Subject: [PATCH] Update the routine, portfolio and screener files and adjust the documentation (#4021) * Remove undesired example files * Update the documentation for routines * Add in video * Add some additional text * Add in a routines example that can be activated with --example * Remove default old examples * Add portfolio example holdings file * Add portfolio optimization example allocation file * Add example files for the portfolio menus * Remove code that unintentionaly prints the home menu on every routine * Add home instead of / * Remove requirement to add file if you have an example * Ensure portfolio/po/params also talks about docs correctly * Move all routine, portfolio and screener presets to the correct folder * Remove presets since they are moved * Remove presets since they are moved * Same implementation as for file in po * Adjust code so it works with new folder * Adjust code so it works with new folder * Adjust code a little since I changed folder * Update screener documentation to include how to create a screener * Remove old readme * Update documentation to better reflect where to find the files * Also update SDK notes * Update exe with auto complete and more info * Add images * Update images and the last script * Update text to make it more apparent that it has an example attached * Add section for routine scripts on home menu * Make call_about more robust and add record and stop * Update the routine markdown with info about record/stop including video * Update scripts * Update portfolio report * Update tests and report * fix small load bug * rewrite help test * last fix was buggy * example by default * fix po integration test * keep example on arg * adapt integration test * fix portfolio integration test * fix more portfolio integration tests * pa is not an option anymore * portfolio report choices only holdings * update integration test for portfolio report * Small formatting improvements * Remove sleep and fix inconsistent return * Some spelling * oops * Fix tests --------- Co-authored-by: Jeroen Bouma Co-authored-by: James Maslek Co-authored-by: Diogo Sousa --- openbb_terminal/helper_funcs.py | 2 - openbb_terminal/miscellaneous/i18n/en.yml | 19 +- .../portfolio/test_po_show_plot_rpf.openbb | 4 +- .../portfolio/test_portfolio.openbb | 2 +- .../test_portfolio_boolean_args.openbb | 4 +- .../portfolio/test_portfolio_po.openbb | 6 +- .../reports/test_reports_portfolio.openbb | 4 +- .../allocation_example.xlsx} | Bin .../holdings_example.xlsx} | Bin .../portfolio_examples/allocation/.gitkeep | 0 .../allocation/60_40_Portfolio.xlsx | Bin 17533 -> 0 bytes .../allocation/Fixed_Income_Portfolio.xlsx | Bin 16638 -> 0 bytes .../OpenBB_Portfolio_Template_v1.0.0.xlsx | Bin 26592 -> 0 bytes .../allocation/Public_Equity_Portfolio.xlsx | Bin 17305 -> 0 bytes .../allocation/SP_500_Portfolio.xlsx | Bin 44809 -> 0 bytes ...ic_Equity_Orderbook_No_Categorization.xlsx | Bin 28830 -> 0 bytes .../portfolio_examples/holdings/bitcoin.csv | 3 - .../portfolio_examples/holdings/example.csv | 5 - .../portfolio_examples/holdings/market.csv | 3 - .../portfolio_examples/optimization/.gitkeep | 0 .../OpenBB_Parameters_Template_v1.0.0.xlsx | Bin 33733 -> 0 bytes .../portfolio_examples/optimization/dany.ini | 7 - .../portfolio_examples/optimization/dd.ini | 6 - .../optimization/defaults.ini | 8 - .../optimization/example.ini | 7 - .../portfolio_examples/optimization/james.ini | 7 - .../miscellaneous/routines/.gitkeep | 0 .../miscellaneous/routines/README.md | 15 - .../routines/comparison_demo.openbb | 29 -- .../routines/darkpool_demo.openbb | 40 -- .../miscellaneous/routines/dd_demo.openbb | 38 -- .../routines/discovery_demo.openbb | 29 -- .../routines/due_diligence_stock.openbb | 83 ---- .../routines/econometrics_demo.openbb | 19 - .../miscellaneous/routines/example.openbb | 27 -- .../routines/example_with_inputs.openbb | 26 -- .../routines/example_with_inputs_saved.openbb | 80 ---- .../miscellaneous/routines/fa_demo.openbb | 47 --- .../miscellaneous/routines/gov_demo.openbb | 43 -- .../routines/insider_demo.openbb | 34 -- .../routines/options_demo.openbb | 58 --- .../portfolio_optimization_demo.openbb | 26 -- .../routines/routine_example.openbb | 23 ++ .../routines/stock_screener_demo.openbb | 47 --- .../miscellaneous/routines/stocks_demo.openbb | 36 -- .../miscellaneous/routines/ta_demo.openbb | 37 -- .../miscellaneous/routines/template.openbb | 17 - .../stocks/insider}/Agriculture.ini | 0 .../stocks/insider}/Agro-Chemicals.ini | 0 .../stocks/insider}/Air-Transportation.ini | 0 .../stocks/insider}/Apparel.ini | 0 .../stocks/insider}/Banks.ini | 0 .../stocks/insider}/Brokers.ini | 0 .../stocks/insider}/Building-Materials.ini | 0 .../stocks/insider}/Business-Services.ini | 0 .../stocks/insider}/Closed-End-Funds.ini | 0 .../stocks/insider}/Construction.ini | 0 .../stocks/insider}/Credit-Industry.ini | 0 .../stocks/insider}/Durable-Goods.ini | 0 .../stocks/insider}/Electronics.ini | 0 .../stocks/insider}/Furniture.ini | 0 .../stocks/insider}/Gold-Silver.ini | 0 .../stocks/insider}/Grocery.ini | 0 .../stocks/insider}/Ground-Freight.ini | 0 .../stocks/insider}/Guided-Missiles.ini | 0 .../stocks/insider}/Health.ini | 0 .../stocks/insider}/Hotels.ini | 0 .../stocks/insider}/Insurance-Agents.ini | 0 .../stocks/insider}/Insurance-Carriers.ini | 0 .../stocks/insider}/Investment-Offices.ini | 0 .../stocks/insider}/Legal.ini | 0 .../stocks/insider}/Lumber.ini | 0 .../stocks/insider}/Manufacturing.ini | 0 .../stocks/insider}/Mining.ini | 0 .../stocks/insider}/Mortgages.ini | 0 .../stocks/insider}/Nondurable-Goods.ini | 0 .../stocks/insider}/Personal-Credit.ini | 0 .../stocks/insider}/Pharmaceuticals.ini | 0 .../stocks/insider}/Professional-Services.ini | 0 .../stocks/insider}/Railroads.ini | 0 .../stocks/insider}/Real-Estate.ini | 0 .../stocks/insider}/Restaurants.ini | 0 .../stocks/insider}/Retail-Stores.ini | 0 .../stocks/insider}/Retail-Trade.ini | 0 .../stocks/insider}/Tobacco.ini | 0 .../insider}/Utility-Communications.ini | 0 .../stocks/insider}/Utility-Gas.ini | 0 .../stocks/insider}/Wholesale-Trade.ini | 0 .../stocks/insider}/template.ini | 0 .../stocks/insider}/whales.ini | 0 .../stocks/screener}/5pct_above_low.ini | 0 .../stocks/screener}/analyst_strong_buy.ini | 0 .../stocks/screener}/break_out_stocks.ini | 0 .../stocks/screener}/buffett_like.ini | 0 .../stocks/screener}/bull_runs_over_10pct.ini | 0 ...annel_up_and_low_debt_and_sma_50and200.ini | 0 .../screener}/cheap_bottom_dividend.ini | 0 .../stocks/screener}/cheap_dividend.ini | 0 .../stocks/screener}/cheap_oversold.ini | 0 .../screener}/continued_momentum_scan.ini | 0 .../stocks/screener}/death_cross.ini | 0 .../stocks/screener}/golden_cross.ini | 0 .../stocks/screener}/golden_cross_penny.ini | 0 .../stocks/screener}/growth_stocks.ini | 0 .../stocks/screener}/heavy_inst_ins.ini | 0 .../screener}/high_vol_and_low_debt.ini | 0 .../stocks/screener}/modified_dreman.ini | 0 .../stocks/screener}/modified_neff.ini | 0 .../stocks/screener}/news_scanner.ini | 0 .../stocks/screener}/oversold.ini | 0 .../stocks/screener}/oversold_under_3dol.ini | 0 .../stocks/screener}/oversold_under_5dol.ini | 0 .../stocks/screener}/potential_reversals.ini | 0 .../screener}/recent_growth_and_support.ini | 0 .../stocks/screener}/rosenwald.ini | 0 .../stocks/screener}/rosenwald_gtfo.ini | 0 .../stocks/screener}/sexy_year.ini | 0 .../stocks/screener}/short_squeeze_scan.ini | 0 ...simplistic_momentum_scanner_under_7dol.ini | 0 .../stocks_strong_support_levels.ini | 0 .../stocks/screener}/top_performers_all.ini | 0 .../screener}/top_performers_healthcare.ini | 0 .../stocks/screener}/top_performers_tech.ini | 0 .../stocks/screener}/under_15dol_stocks.ini | 0 .../stocks/screener}/undervalue.ini | 0 .../stocks/screener}/unusual_volume.ini | 0 .../stocks/screener}/value_stocks.ini | 0 .../weak_support_and_top_performers.ini | 0 openbb_terminal/parent_classes.py | 2 +- .../portfolio/portfolio_controller.py | 35 +- .../parameters/params_controller.py | 23 +- .../portfolio_optimization/po_controller.py | 122 +++--- openbb_terminal/reports/reports_model.py | 8 +- .../reports/templates/portfolio.ipynb | 10 +- .../stocks/insider/openinsider_model.py | 8 +- .../stocks/insider/presets/__init__.py | 0 .../stocks/screener/finviz_model.py | 8 +- .../stocks/screener/presets/README.md | 183 --------- .../stocks/screener/presets/template.ini | 212 ---------- .../stocks/screener/screener_controller.py | 8 +- .../stocks/screener/screener_view.py | 8 +- .../stocks/screener/yahoofinance_model.py | 8 +- openbb_terminal/terminal_controller.py | 68 ++- openbb_terminal/terminal_helper.py | 16 +- .../test_po_controller/test_print_help.txt | 2 +- .../test_print_help.txt | 2 +- .../reports/test_reports_controller.py | 4 +- .../sdk/guides/intros/portfolio/index.md | 39 +- .../content/sdk/guides/intros/portfolio/po.md | 44 +- .../guides/intros/stocks/stocks-screener.md | 25 +- .../guides/advanced/scripts-and-routines.md | 101 ++--- .../terminal/guides/intros/common/ta.md | 5 +- .../terminal/guides/intros/portfolio/index.md | 101 +++-- .../terminal/guides/intros/portfolio/po.md | 387 ++++++++++-------- .../guides/intros/stocks/comparison.md | 4 +- .../terminal/guides/intros/stocks/gov.md | 2 - .../terminal/guides/intros/stocks/ins.md | 2 - .../terminal/guides/intros/stocks/screener.md | 16 +- .../old_content/terminal/stocks/scr/_index.md | 6 +- 159 files changed, 669 insertions(+), 1631 deletions(-) rename openbb_terminal/miscellaneous/{portfolio_examples/allocation/50_30_10_10_Portfolio.xlsx => portfolio/allocation_example.xlsx} (100%) rename openbb_terminal/miscellaneous/{portfolio_examples/holdings/Public_Equity_Orderbook.xlsx => portfolio/holdings_example.xlsx} (100%) delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/allocation/.gitkeep delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/allocation/60_40_Portfolio.xlsx delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/allocation/Fixed_Income_Portfolio.xlsx delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/allocation/OpenBB_Portfolio_Template_v1.0.0.xlsx delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/allocation/Public_Equity_Portfolio.xlsx delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/allocation/SP_500_Portfolio.xlsx delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/holdings/Public_Equity_Orderbook_No_Categorization.xlsx delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/holdings/bitcoin.csv delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/holdings/example.csv delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/holdings/market.csv delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/optimization/.gitkeep delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/optimization/OpenBB_Parameters_Template_v1.0.0.xlsx delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/optimization/dany.ini delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/optimization/dd.ini delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/optimization/defaults.ini delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/optimization/example.ini delete mode 100644 openbb_terminal/miscellaneous/portfolio_examples/optimization/james.ini delete mode 100644 openbb_terminal/miscellaneous/routines/.gitkeep delete mode 100644 openbb_terminal/miscellaneous/routines/README.md delete mode 100644 openbb_terminal/miscellaneous/routines/comparison_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/darkpool_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/dd_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/discovery_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/due_diligence_stock.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/econometrics_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/example.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/example_with_inputs.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/example_with_inputs_saved.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/fa_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/gov_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/insider_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/options_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/portfolio_optimization_demo.openbb create mode 100644 openbb_terminal/miscellaneous/routines/routine_example.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/stock_screener_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/stocks_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/ta_demo.openbb delete mode 100644 openbb_terminal/miscellaneous/routines/template.openbb rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Agriculture.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Agro-Chemicals.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Air-Transportation.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Apparel.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Banks.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Brokers.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Building-Materials.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Business-Services.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Closed-End-Funds.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Construction.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Credit-Industry.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Durable-Goods.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Electronics.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Furniture.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Gold-Silver.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Grocery.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Ground-Freight.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Guided-Missiles.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Health.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Hotels.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Insurance-Agents.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Insurance-Carriers.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Investment-Offices.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Legal.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Lumber.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Manufacturing.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Mining.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Mortgages.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Nondurable-Goods.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Personal-Credit.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Pharmaceuticals.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Professional-Services.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Railroads.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Real-Estate.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Restaurants.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Retail-Stores.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Retail-Trade.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Tobacco.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Utility-Communications.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Utility-Gas.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/Wholesale-Trade.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/template.ini (100%) rename openbb_terminal/{stocks/insider/presets => miscellaneous/stocks/insider}/whales.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/5pct_above_low.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/analyst_strong_buy.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/break_out_stocks.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/buffett_like.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/bull_runs_over_10pct.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/channel_up_and_low_debt_and_sma_50and200.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/cheap_bottom_dividend.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/cheap_dividend.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/cheap_oversold.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/continued_momentum_scan.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/death_cross.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/golden_cross.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/golden_cross_penny.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/growth_stocks.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/heavy_inst_ins.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/high_vol_and_low_debt.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/modified_dreman.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/modified_neff.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/news_scanner.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/oversold.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/oversold_under_3dol.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/oversold_under_5dol.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/potential_reversals.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/recent_growth_and_support.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/rosenwald.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/rosenwald_gtfo.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/sexy_year.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/short_squeeze_scan.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/simplistic_momentum_scanner_under_7dol.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/stocks_strong_support_levels.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/top_performers_all.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/top_performers_healthcare.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/top_performers_tech.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/under_15dol_stocks.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/undervalue.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/unusual_volume.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/value_stocks.ini (100%) rename openbb_terminal/{stocks/screener/presets => miscellaneous/stocks/screener}/weak_support_and_top_performers.ini (100%) delete mode 100644 openbb_terminal/stocks/insider/presets/__init__.py delete mode 100644 openbb_terminal/stocks/screener/presets/README.md delete mode 100644 openbb_terminal/stocks/screener/presets/template.ini diff --git a/openbb_terminal/helper_funcs.py b/openbb_terminal/helper_funcs.py index 264a159aee1..aac76938bb6 100644 --- a/openbb_terminal/helper_funcs.py +++ b/openbb_terminal/helper_funcs.py @@ -151,8 +151,6 @@ def parse_and_split_input(an_input: str, custom_filters: List) -> List[str]: if an_input: if an_input == "/": an_input = "home" - elif an_input[0] == "/": - an_input = "home" + an_input # everything from ` -f ` to the next known extension file_flag = r"(\ -f |\ --file )" diff --git a/openbb_terminal/miscellaneous/i18n/en.yml b/openbb_terminal/miscellaneous/i18n/en.yml index ee231f93bc1..c98a58258a0 100644 --- a/openbb_terminal/miscellaneous/i18n/en.yml +++ b/openbb_terminal/miscellaneous/i18n/en.yml @@ -1,19 +1,20 @@ en: _home_: Information, guides and support for the OpenBB Terminal + intro: introduction on the OpenBB Terminal about: discover the capabilities of the OpenBB Terminal (https://openbb.co/docs) support: pre-populate a support ticket for our team to evaluate survey: fill in our 2-minute survey so we better understand how we can improve the terminal update: attempt to update the terminal automatically (GitHub version) - exe: execute automated routine script + wiki: search for an expression in Wikipedia (https://www.wikipedia.org/) news: display news articles based on term and data sources - settings: tune settings (export folder, timezone, language, plot size) + keys: set API keys and check their validity featflags: enable and disable feature flags sources: select your preferred data sources - keys: set API keys and check their validity - wiki: search for an expression in Wikipedia (https://www.wikipedia.org/) - record: record session to be converted into a .openbb routine - stop: stop session recording - intro: introduction on the OpenBB Terminal + settings: tune settings (export folder, timezone, language, plot size) + _scripts_: Record and execute your own .openbb routine scripts + record: start recording current session + stop: stop session recording and convert to .openbb routine + exe: execute .openbb routine scripts (use exe --example for an example) _configure_: Configure your own terminal _main_menu_: Main menu keys/_keys_: This menu allows you to set your own API keys. Type 'about' for more information @@ -907,7 +908,7 @@ en: econometrics/coint: co-integration test on a multitude of columns portfolio/bro: brokers holdings, supports robinhood, ally, degiro, coinbase portfolio/po: portfolio optimization, optimize your portfolio weights efficiently - portfolio/load: load transactions into the portfolio + portfolio/load: load transactions into the portfolio (use load --example for an example) portfolio/_loaded: Loaded transactions portfolio/_riskfreerate: Risk Free Rate portfolio/show: show existing transactions @@ -966,7 +967,7 @@ en: portfolio/bro/cb/deposits: show all your deposits or internal transfers portfolio/bro/cb/orders: show all your orders portfolio/po/file: file that contains portfolio risk parameters - portfolio/po/load: load tickers and categories from .xlsx or .csv file + portfolio/po/load: load tickers and categories from .xlsx or .csv file (use load --example for an example) portfolio/po/_loaded: Portfolio loaded portfolio/po/_tickers: Tickers portfolio/po/_categories: Categories diff --git a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_po_show_plot_rpf.openbb b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_po_show_plot_rpf.openbb index 4277466898d..8a0cb7b9022 100644 --- a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_po_show_plot_rpf.openbb +++ b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_po_show_plot_rpf.openbb @@ -9,7 +9,7 @@ plot plot -pf a,b plot -ct a,b plot -pf a,b -ct c,d -load --file 50_30_10_10_Portfolio.xlsx +load --example show -pf a,b -ct c,d show -pf a show -ct c @@ -39,7 +39,7 @@ plot -pf name_0,maxsharpe_1 -ct c,sector,current_invested_amount -dd plot -pf name_0,maxsharpe_1 -ct c,sector,current_invested_amount -rc plot -pf name_0,maxsharpe_1 -ct c,sector,current_invested_amount -he .. -load --file market.csv +load --example po equal show -pf name_0 diff --git a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio.openbb b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio.openbb index 6fc6c3e2be8..231ff561866 100644 --- a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio.openbb +++ b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio.openbb @@ -1,5 +1,5 @@ portfolio -load -f Public_Equity_Orderbook.xlsx +load --example show bench QQQ alloc assets -t -l 4 diff --git a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_boolean_args.openbb b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_boolean_args.openbb index 97abd141325..86200467502 100644 --- a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_boolean_args.openbb +++ b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_boolean_args.openbb @@ -1,8 +1,8 @@ portfolio -load --file Public_Equity_Orderbook.xlsx +load --example po params -load OpenBB_Parameters_Template_v1.0.0.xlsx +load set ef arg tangency False arg log_returns True diff --git a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_po.openbb b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_po.openbb index b015297f6e7..7a8a62c261d 100644 --- a/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_po.openbb +++ b/openbb_terminal/miscellaneous/integration_tests_scripts/portfolio/test_portfolio_po.openbb @@ -1,7 +1,7 @@ portfolio po -load 60_40_Portfolio.xlsx -file --file example.ini +load --example +file maxsharpe -s 2022-10-20 minrisk -r 0.05 maxutil -a 0.1 -ra 2 -tk 0.4 -tr 8 @@ -23,7 +23,7 @@ plot -pf MAXSHARPE_0 -rc plot -pf MAXSHARPE_0 -he rpf NAME_6 .. -load --file market.csv +load --example po equal maxsharpe -s 1995-05-07 diff --git a/openbb_terminal/miscellaneous/integration_tests_scripts/reports/test_reports_portfolio.openbb b/openbb_terminal/miscellaneous/integration_tests_scripts/reports/test_reports_portfolio.openbb index 24cf93a6264..87790de1c66 100644 --- a/openbb_terminal/miscellaneous/integration_tests_scripts/reports/test_reports_portfolio.openbb +++ b/openbb_terminal/miscellaneous/integration_tests_scripts/reports/test_reports_portfolio.openbb @@ -1,8 +1,8 @@ reports -portfolio Public_Equity_Orderbook.xlsx +portfolio --transactions holdings_example.xlsx # Test with invalid path -portfolio Public_Equity_Orderbook_test.xlsx +portfolio --transactions holdings_test.xlsx exit diff --git a/openbb_terminal/miscellaneous/portfolio_examples/allocation/50_30_10_10_Portfolio.xlsx b/openbb_terminal/miscellaneous/portfolio/allocation_example.xlsx similarity index 100% rename from openbb_terminal/miscellaneous/portfolio_examples/allocation/50_30_10_10_Portfolio.xlsx rename to openbb_terminal/miscellaneous/portfolio/allocation_example.xlsx diff --git a/openbb_terminal/miscellaneous/portfolio_examples/holdings/Public_Equity_Orderbook.xlsx b/openbb_terminal/miscellaneous/portfolio/holdings_example.xlsx similarity index 100% rename from openbb_terminal/miscellaneous/portfolio_examples/holdings/Public_Equity_Orderbook.xlsx rename to openbb_terminal/miscellaneous/portfolio/holdings_example.xlsx diff --git a/openbb_terminal/miscellaneous/portfolio_examples/allocation/.gitkeep b/openbb_terminal/miscellaneous/portfolio_examples/allocation/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_terminal/miscellaneous/portfolio_examples/allocation/60_40_Portfolio.xlsx b/openbb_terminal/miscellaneous/portfolio_examples/allocation/60_40_Portfolio.xlsx deleted file mode 100644 index bc503fbb0f8f29d87e84e787ceb00b10035369e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17533 zcmeHvWpEtn&aNqDW@ct~%*>9NnVA{Kl$a@IW=PD;5VK=uW@cu*-raNV?&j=Qx9;!n z^i)mPRQIFmQA@AXkEE8D1_eU}0tbQw0s}KI!UP8bLIHvV(Gs?^bvChe z)>HPdH*wOTcek-7%mo9X%mxB^KmWhm|6&c4#($CqWkL)(3wSg5snYx%UnE}(0f4I_ z-)SXNxH9hjHO2DjEaOvI$TaT#9yCYso56UStkZ(T%z?qBAS|FwVuL zH%BufS}e3!6J|D&m4E{qFJCH81&V&}1TfA7a)C6JLc==RER*1Rg2u2e(%Wv6j1pn^F;N0d_>tppuc`D8lv?`?s{9%T{{cw3F zunaP%!&~Qb>mi+92zsv(4&B+qh!#Q&B%lbmk@$Sxt{@~wD zK0jZ4LO;1CjQesnTXh6=`9!CGYK--o_1UK6FjxG*SL8GR!VIsO&+5mq{?O!HQP#Wd zy}f|~$^XrP>r@y?uHTQyy!$82y94VvnpitA(Es-RU&sAl?5%(K>!q=ur^q}>E1T8NYZev-=wb&+|bI4d0#xQNQwfuQ2PZGh*&r4^pY!vUh(P1e$I zWK?dFdbhHmq(=uA2x@Z2L@|fbjUFV|nVXs06mcmJO4qh%>XOE9InqDZNW`WtM5++S z=+&^HPzrE^(0Nn*HTynktQy{z1J4L4oszVX$p zWxW{6@aW-y>Mj{L{}~WY@NM-ymi?!b*b<(`P`)2g1p@-Y27&~3w`TamPu%Prtqkq# ztbU7g|MnT+_h9#a?*H!Xx5d7P@%P1^XxnzGyqUiG03X$$qB&qLMwWk`ohn76?rl|m zAA|NLR$70R=Zxlw5mnsxMeLYX(Cy&s zThllAI$~d_p<>Zp9at${XhWqF!pFz8P|NcQ@U|a(c9wn(jl11eFdFVgT9O(BV!iNJgfBK?9HS-1X#-kT|F)Jjh&R!9ELH>i* zgWsbpv*tCLQStY$kyXLigIZ4Eh=WFqA{v+JWW)s6v&D2F#%wAA9To0#a^{}^u-d{q zTjLr{=3IV_du(cBB;PDpJ=|Z%p(W3(AiadOjYu~3I{7;p=cm%v_t#b6#tQaDzsmw) z+ei}h$T1Rc>p-&ybAE*XDHzM^pwrDubKnz`(9nOW+X?wYGKyWB`pStqeiE;m9i1_INL7#YVh7gnLd+TY5#lLS-y` zou+>bg}eQA>krpD3P_S-v^Y8yYbwnTT+6*TEvYzFNeMt-aORG){H4JoKRgDg8{~UP zoITMLQyazHbcw8aLgK%SN>@r(B2fB}g|Jo^pMCKi0Mo zC7|0Mqk>iU{B&&c3ZdKiRtKWAq624i_NB!8dUk&KvL5k>DR+u<6_U0m^tEzg+co|p_J*oo~A+~X(GRqp%wnu;lTh{lr=ftq>m&R*FnSX zy&&Hm*cYqla(#9-_~z8klMSb0asbgh3DXhwGV`35&$R) zE&&P9rElT7kt~pLpjMmf1O5I+8_v6$qdb*mO)NEK1#$D=kBTI*TblJBhmc+g?)K&h zHm)TnduXUAXDBP%BYXe};%8!a)1>ch~(2 z4Fm-DhwC~ydsv$|{T3QpRab16*iqXFD%}Xs;!KuAHsON9lb ze?D^%z8Mm(|0qq!%&LgNliWg<97qEnj~4e14_(j|c?=6Z(D^B!|i(g+|q zncQfCTPL7w0@!O#tpI-91Er^4Q%*Evn;CigTA__YPy8<5MI_}5Wp-d&?W}@Zf@L4s`XMF^cCUln*!_A zYpeD%V^ia>kuNTNAHY#e(KnW!{+U&So}T_v5;J({F7U4V&7F6C58hcRUd9UC4t9oX zDYoO(B!y%CVnZY&%3D0eRUd{B_6lFUmS@;mE9K`YzMLTmB zVc4=)Z;V_~s$#zL z4IE93m7En-+a*R=AA(9>L|AJ%s|>X6O6k}x2YR^F+P-wy{Z-bKx-Xis zG!qtAcX?^Bc*FY9T&;MQG1$6%X`07BAWn`cAKm#vz|?o3ZH5$TSBA&hMToO&zm#Tt zQK$_@)QMVa#|rWbFtouGMKipjiwZ3MF<^g+U1{9pwknZd#IQB)9wYhUKv?-LDNPBE+agxlE>b==y+#%j0*)xR*BR4E%m$9R3m3*pE zeI54KO7lu1dMk8~3+2ulq1!Wc z_0Y<3AYBNk5}FfE6@wy^chU*BR-Gh0mA6RZ@qmgin3uA3g{X~?Z<^>tHNH3hiF^*3ENu-MTXk9Tp7Xq z&aB_ST<6t9VTXgS`A+zEup-3+83p*kj*m;&9IS6)ksCo-C8-|D>O6O4x-j_tk?)Yx zZTRb0%G7jULm*ICs|9x>G2IMdP-5J@Q*Z1qeLvWBh;21G0NVJ>6oMpunT`8sWon

=)Q*9<$}FZR3U|(2rp;E zG_rvnNo`2RpGUfAX1sV8Mq)DXg)n9IXkfe8CN{`9M!XHI*^9W__sr+x?06(@Te!9` z>B?p6w_+BFa#Qha!+BY2A{z2QU7h-(9=D)f0~|*Aqnkgy&doaP&;5~}{GOx4YueZ? zu_M0H_)j3<#Vl;5NkE7CbJoKsQOWDiBS21~t|Zw?gjqk`ZKVyjETL!x^27bV5 zMJk(~%~@vm;@Y#}o8Ibk$6CX)?Nxi*5|5cRL>0IZ0wN0Ll5j*FCJ!N^k$4DIgik;+ zj}gw<)q+ENk3+}(@kgT`CrGJ7E-*L;yp!V4BScaI&LB60=@0mt6ZiZ*zUDIQe1Z}4 zoFPz`&AcFVfK4M$vZ}@VbUy=h>8@jpB*rPQKz%e*W69Pe&q)>ct7F3hdUAsHbo6mtK}e#kHD4nF-^13U z=}8jI0;64F{@!OxwPNYoYU5lz3Q_wUClR9VxmfJ6ND^f1r{hvfa9HLC#7dfq z3%U;M>P<@N;#s!K>8`Q9Y)-OTv6o<43!;;n7;&4l;trB@2_I2H7jc=Aehb@w(XFy43@uRAb^TX5B z(a_w?$k9;4QvyqdQO?xMLGKZ@+g$MJ#;x)CPu{|`$67lc>|!6UsT(b9HJ=ZAuzz6(MJ9rAk6AjYg0yyAHeHpf2EZ zl(l&DANjk3X~H=$a;db7jxN!s!#F8*q6mAo4@QudQ`BNlWo&Jv?uaI2u@ou{ zv@fka>M#`7o$Kp~pg4}$tz03hb=2u?Cc_6rKH1ZuS(ko0x9ValO43=j%9Y=&JM^*I zDuW%Hd$i_A)p9tzZNFg_XCG9b(VS(Uwd7@bG#2&O-9nfQRIcl7+kL@G8@yhy9VMtk z7n96G;}9C0wK|fN90|8?>B_5YhUDN<2=N;6VrB2zuUSbKKWUzrg*IiI>timQt`!&E z(cVJBj#pafi(AIDVdvaaPbWrkeAgV&0qiuWOgt#i*itxYV;|8xFQ>(F)R^pq)O^M~0b05J+GgOs9f59zMK@#GsXa=Sn zdmup>C!(&}Np_+a@^%fh6#GbF^G0|gV))*UztE(N9nL5&Qk(YB%i!j^jP&%2E!ncG zY~@4hh-x4Ou7^;Gi_$BG{~tNc@1bT{dC0a)0QNZ{fj=9#i^Y&LJ63vH`XPYq9frkP4Db%x*BT%?vUk(LrI?*`S)2MQ%;qYaqG!uNb4 zrJ~^3wv|yToRml?`xEB}6@(b#X)*V{4KXJKUw_OY~|b;#aXy&g&U#u^7s*d)S&oV?Ou z4ad@+u9-@TxA;nLlH#nIO57!!b|RWdc{6J-x)xc|iU^+>fP~p-=vWfX<&enZAm{8( zs+iXgbOc;Lu{yi5w z)))!L;Xv)cc;tt5a(iamiY8lKAG3~IAvMm3$E~YBR#0VOj%~$30U_hOQKZZ-ND{K+ zjh_?%g=@Qxh9a#!Aef*SnI|dRAx*QE(sYFj7k_OlD!R)AcwRYQOtvL^iYLQ##U|>t z%U|-QN6aUaP9^$UeWYadmXnB&Kr(@{eSo2TmR`yNI3n5ngzTROeGswENhFZuT%tzr zg$(-I_`~$0{~CEjzeE>F7J5G}Uf^mnI!%FM874{Wy>5V^yq6C%5y>%Jf|Re<_g1+L zrmsS95tM6c#Z_cERa@QFLLp!F6;JVq7B3AlnYi&cy(aG{k&yxB4`eTU7!3^Q6RPAQ zJK!3^w%KpYO)~o4>Jv_v2c4Fagph%nUIluf-?aO0j$Sl7>L-hU%~=By3hU>&juLER z4B+G+XL4H9&QylbSI6~qYMSthqrc2$EBjUk5x_RDi^5b0Qt@eb2WOZTnH|k#qv~mO z&q<%?$~RnF$%{xjHU`musk3xzT0}GM+K)n6g$)#Ji=`Su%WdQ>OlzCVPg1kRg-T>-GHLD!7B!_j>=KTd%sQj#}Clf=o&2bS7Hw?d1hy zRj=dq{P2R~V4C8htEc1nVJNBN?Skv3a&sAtq21^5@*oal&F5xME*fuf2^TNDEurIItxoBsN`db7ShCeN6&E5aO?KhJ zkV6YUc1|jFR0&7mm9z+l?9A~pZ^~4LUY{aX1cpqJ2|MbODbm*p8-@&ZnGk+nyc}7z zsp$S@HN)#|Ok(hU9gKjG?>l`%=JX23iku=$Y&mouNw(v;pV#f zp0L=0spK5dhw0V8=cGPvz%sPgG@(YUpMZBPRZ253s&bRA4{Q=!Y&A>em;^~G+5G)j{_5&s&fI|5oOPxH*>ANH}O zPO}~=PP#MqZ%@UhQ@VT=CZkpN^8DXrfAgXCwI`Y8FGi2UY6_dI{74Uzxlwj!AJ5o4Fs&HSE_iVLn`UtSE?52?fPPs6J zX&_^Yqu_$6pa(C6s%!RHcOgZ6!dZPn{xB&=Q_Nupn$ZRg&3)%~U9@c{Sa4A=$P_nz z&j_ukHl;P99C|cG%rlPVdkV0;Ap;9xw6oGevxA4Fi$!spXg(cDgmXwy_-QI7DjcjNIaKzoa`Vt)7NCL_#QevI^P61)(PBP8yYn~L_W=} zQ~?@-GzUay?g4k^P7;ft6-e%;@&m9Qql$7t~P?m=r&NUJr1ONb#(?B zh^SD%@Ic4I5hnk%O0={n?KgXVLsVUwKkQ6ya9@~*kb#+hAgq2S|HZKSzJMwL>@Z1t~mS zMsFCSZsT#YU3&y~svT%Pkb z5;*w98C&@y4(K|^1}#WSG7~_a#y5xrDei9#I4{{RgfvF_J5)Z#?Lc>yE%pD*$1wf4 zfZlr#yIk*V4JHsJkdcd%vz?8)jWvUXvx$woqn*9e?=hG#mlTLH`#nbgKQ`lNUaRi+ zGU%PqTVRt;V(EMoRK0M3=D>JCZH&r*BWRP5Gs7A;noTFF~w>@P4>qQP;mqCm|P>8NxZoP(PGAl!FV1&6)fNd(BQ_PQ>IOA#;f|e$7r=~BV?W*E;Rrv5ReZmn(J-1OwPG3uR-p^< zV#9UxYM-0W6T$o6|Ibngu`pmr`(1%9?<^_Od$ruy&ggf|F&No7n*6IH?7v0wchyD2 z>PdGqqV}$R=nx*Lv3V3PjIR%*@HgY-hJe1eQanbJiQKU3OqB?w(}z} zx<_m^mK98^OZf<7l{HN4;y8CahLsJe%c~`Oe!+2|tskiZD+x00&a}cLXrL?UCP{1! z(!!|>3(!ZBaX+vf+R*OgXLmeIi#J-#_)sP22D=xT{zfHsGYAJ~UkxVgmU5UD=a7x7 z{%xC^d*%pi$eFV+V0x!fW>Y^do58vj1rpXxKh*#%8<&%DB^?-W&XoJd4EE{f1U+9m zKZe^Kp)=ApAp`?iKzMsU<75t!{kE`a@K@PED^E8)I)@YyNo0{ZL2o6|8d}L3R=}B8 z*34ZF0>WkTIzf-IYOlj=maz~I@F3CMgE&>kKk}>)Wi3o!-;WTySLhJ`YLW)__W!lW zKNqp|*pc_b1>)zk50CI5XG}Z!kkEmKh##pO&E-K|C$ADUHAE<5*KNUC5=62m!8hJka#|8@q;VJb%x6W4AeGT2jow^>-yo##!5DH-? z&T`LJy(z9_|L9D&{$&5U=Ew;R&~&@+1Z9%`LfyS2m`9xQTFV5mTx5I937ie)x^X*s z^a<$=mR3JDxCnA^>_1DjBTR#KA+CX26PJ1F-k5*P4>&%_xq#m3k+|sP9tbvgTz>{<&sbrS4S7s<&*&L zHftP?%q-nK@2p*Fbod4hkKCIMLj}f;O3IomyVB*0*%ALguB<^~g+rt7X1w^mvLe5q z@!lU|WM^w@V&rULXZw5QDI#{s66d!<0gO+u;Ae1XuWGBgqLuM^E6N^Ho5|bUYoU^i zx-V*zVw2761!t=od-6%k*J8trlN@i)c?-R|GnK+e`4d#qUCF?f22$VWsGb}fV8vk5 z_nNosCX%Z`xm>@t0oYK)tWYyEISGSYsg~T=WO4^W;iylArm_pAOiDL16kr5JIDjq;}C0yg=lP%IX7e z*@fo?r*rUU@Qvr|Th3(yEJXq<{>T;dK5Jp{*Kzq^V9@Xc(aVnK$67~C_s(8dn@=Ut zTgEljja3;D{V#>beW@9=6NM#a-Kxtri{!244ho-tI(PC0YfWkTA1pNV_nA%6keG{- zz9{dqu6a$9B?>HqmnH2_a@>_&Oa;d&IK8(K6&$m74DPv|qbFunsGYx{UImIS&_2>! zW%Zc&{^Q-}z4}>4`hNFMe_zD@xcdgyM#AO>7Ph}FV%BkTa-SIyd(X%L!KSCS785se zlwOP%l}+dLp z8OG$)+(=Qu9`hU$_*!_ky|=2Re4 z%;yKn3T=)$ zPMNJB04gNg&xtE6dfLg!w|5Ww?@vo#Wi;$Xbr2HkFp%0$`xRK4&Pw)D!ibI|iiRXj z-*=Ds&rHRcpVPDJUDv<$_Tj&Wg+J51Kid0#OZtA#_x{`4_pYUXZ=c6H!$6o|!Pi^X zx#O2JM%@v=9=L0uw}v*Z*Eut@^javTQa;|I%hAvtGeJGP=CAN~m7XRqD6x(!vr$Gw zc@l_&^6#C^preLIwq;P|`cp6;x9sHdZde!4UTmY3-{dc3#W4Zas)QT`+8|NqMOk5kQ@a(^QA z@8xN)XeG#re3*ME7l{&rBtks%6Ad7v^phZXJznbw7MGwrKJ}P0X(^{%_aJx9Jk88} z*dyp@UR#-rTp4)T-Ywt5U!I0rE=z0lZOqb{f7ujzeiIq%aj|$4IqO+bKg&yNvby6C z!(-fayGwhTDbP-vt*5!lXm0m%b{oFMB(H_E%tB&Wd^^2;knvxFc%3(W?t1e}gs}hg zpv!WJ(amFetTpZne)e;UVkAAjjZAxHW*J0klD_6Z?$WorVH=x%Q}c9^Ec?a3h^4{M z6lgEmkaH9+oMs06_6aSxIROG6J&fdx7#N- z884Wo;|Vo4jMHhd6i&YYE>zgBrm>tBo?P+@PHF=@VEMF|MFS-L4Zx>PY68SAfVkGX zC;k{|7Ys$}+aF(P2JdlGq)Ly(sA5p$&1 zyAx|*VfdI2emr(5KEP;_V&=Bc)Rq!EQLD)EJyuv$J^t+31vaWvKwV~@^c$AF>G-J7 zibznnouYW=N%C_Lr--R{E4<8uDXrA!C=f`Lz|YD= z)<>YFg4w0CHygnwI3%DF$s5Vi+f6F&`23P3UL4pxZMN55VH-44!5k69PckB!J> zuj(HFnyEC*D;%h!MPO#n&!WX;d<<7PdY>P8g+uB9tixjL5VZ<_A34Ro{T9M8;_VlR zHg*>wy%d(2EQcfT=647Fe6xRcASGP66BK9&hPOt-3qI+$olg2p|WdQqb;V`ycvvrV^<$s-M7pMfj1gm;yv#U87-rw)%2kq(gYLGr>a%oaK24;Za5vT2 zoPcED0it%8{Mp+#7+F~(qQpX|^rrbot1lF3eb_2xgJQC=bpQM5ENt&n!|fliT~ zXc{0{KZm^iFdVfuxo=ohI$~dKdy99kW)Pia=%-OAbWai63`^QUIDSS7@z~PUot%p4 ziPBwqc)Bhaj=q0&BDJ^XvLX(p;{9|^(@srJ8D%o@6F1a1s9pRu@aCS)QN`L9EKt={ zK(048#JA-hx(U59^>d`OUmLW}BO5%{euU% z3^lR4@xI+zLQI&89417r%zfKz|SyK!KHflKJ7KNb@gI>OxElH z-U*x$IV?SmxX!o&(VIH)ca%n?4Q!r?d}tUH*A;Z52~{hs&(vm+X=GwQe60Y?up&El zB;6Rj4L2$Lg}yz@oh{eOzJ$CU+i1cJ)#0$tRAW|HI-JLO9aSizbL2h-?sqh=gPX6Q z)oRAE2)bH;?{{Qlbgll5v1h<)*A^L(WwQdOo!dsYUsvF>}VRPgH>Jz^7t}^1J;|do6AAKc)i9BzpdUb?a(E zX>?0d5OBsT0%Fy7!e3UzbDJNs#O8al(I?Zf${$}f#Df^G);ke-o{96y3JKZhh5WKA zJqL3W$Gy)(xeGmShV88M`k6_C*2g5d2Zf9W6)lQEh_x_+Ra;Q+4YSvUr-m+5ozeZT znF+o_ccUY37ArOvvsGt5=<7Y2gPp3Xg7sg_c^_^_e82O^@~tc--70Cdwm2WR4~^j) zrLB&FaIYmSv7egrTA1a#VDIMLlzMBoRNKV~hq+wcwu@ZfyU@N>G}6A&^X-f|nLA+U zxd^|VxFwY&&8e>PYWa@sq}?S$Zn8nRTC}ANCOK18&v?7h?mT8`cNjlzkC1jn?bwqA2+Xd9*OX?(8n=0E1en z40^jNVY6Y~gDGtMm1<+r*O~$#0XWBUhr8k?cGc3oU%B3jiQFGd)qk#@S-!lfH);Qf zc2zFk|JFXfSZen34R@r$nwMJF`as89ylwhZrY1tzQjXbe4v)+&@uPCM0?*CGUVKqm z#=V1{m7Pksp3!|QzM6W@tC1I$FUG+;hi+gkP@5T)(e*xT^5t3wk99Oy-`+?d&lD~S5jupx)MGyw@T#j z(+!O|}ejDS29?t>WI(2Vj0^hFy{^DHgzLEIX6@Zx)Wdntv;ziAfH`taa-+p{z^{Q=>2mUpJ za=vpI$zuhL!rOqrBJb^?+pIdDj7!G~j5E8g^SYbpMYRqB0_8ee!K&wJCO~PI+U?F( z-fh}oMS`$Z7N40mw6)Swi%G;7Wg~*#2F7TTy_)$RS$Z};`T$LkZ7qd2yxL7Azga_= zSk5Q>+?P4=%R84QM%2fbm|Li|pt*ifz5eqj_!F;Mezo@e;`U<$>x;=DH9%R%Leh}k z)6IkH@<(qnjE;)6!>66*<(Z`87rKWd+&?N5 z#KrgEI!b)WOun&O7u(*V_7j8zj`qSD|4-jF8>}E&o~1G`pZLz&m$nPerdnXmPPpR6 z?h-I8-l%!05fqm%-DeZkhWHZX@U@mvdNnb^`USn04@IB6W-2`G%4vGHaC!A~_1@sF zcj@G8U&qF^*gYvK_Gc_)LV320I`+0opL1`4TW*y)8K7Tny+#g`E*S2&DjJ@2I$o1j zXz*Xm<__K(R)Ra$i&Q#1YJK`AxL>)fpVDkrbGf8ep7-iy-P<+9i75E+*`L4DO$p~h0bZ1-QDT+t)J!k6a=c-s>51545SNh?d`L^T~6FR`2 zY)={jn*9!)Q;M$OGW_H3!}=>Ydp!Y~jygaab(1(wOjqNiu@A|7Gp0)h%MYJWm*E_vX%;IwlN%&l z?JBh*7HUwEiZdJ|Qi^IOX>Z(Djud*Q4!Jd-xra2)4m^x&ZGpel4KJgg*Gk*wA$3Z!=+Ow?fs2hh z`{g^|iBdQ?tm|ZV2-i5MaKeAhkZrY$hy?o70C4u?F=a?FoP~=gEhSd0<()-pk$Lz* zZRCuwf&PuoeB!}n&V7or)tU)x8AL8X#VB!B!)74tHaJDzkR`~B8_Z@)StMp? zV)bWNH4dPmPmqxBww+oi|fZ}SDmf zhFYLk0S4}RAa)_Tc@c9ub)bCW^<8Mu%4=Vro$0f~G^5;B7)ykX0?Rs#`i4M{L36t1 zk=3sTMA$O8F13U@N;N3xT+EY6$R5J5YN_5dfX?#n^IHs{CaB$`BoosJ=4%=Fbca8RWx;ZZbnRFYX?&FwHUV9;;mlb2sSh$6tsCQ^c}JrVoM(f zN|(?}W{ut#i~n$z4zn)^Lq*Y&0PF@{||2|keB|ufWOa0{~P$*zVn@a`-2|(ofY~O z`1e`SzXEsP-;wY?Pmca7=hs=lKPAb&H;n%>8Tc#s*J-3b!BFqRN$=o4XOn(~{yN|A zC-f5W59qJc4!=tHwW94Z>&awSfRuAJ}W&K~qRbKkT UySw~028#eR@$PYn0>AzGKaFj3l>h($ diff --git a/openbb_terminal/miscellaneous/portfolio_examples/allocation/Fixed_Income_Portfolio.xlsx b/openbb_terminal/miscellaneous/portfolio_examples/allocation/Fixed_Income_Portfolio.xlsx deleted file mode 100644 index 234c22aeb67c6a58ab17dcc5b7ee0f52232f5da0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16638 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 Z!=j~jh7gB;6{e|)cnK=Zso=lv{tJC3HtYZZ diff --git a/openbb_terminal/miscellaneous/portfolio_examples/allocation/Public_Equity_Portfolio.xlsx b/openbb_terminal/miscellaneous/portfolio_examples/allocation/Public_Equity_Portfolio.xlsx deleted file mode 100644 index f336b405f8a53f2f46c7e65ef776aa6749f35343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17305 zcmeIaQ|(luJPZFJeT-DTUhZFbqVZ5v&#E_B(hF5AYbwf48qTD$l9pYxpS|I3S+ z7nviTIp2(UBXY!uDJKaGf&u^r00961KnPGi`a%^72mpWq1^|Ez00E>aWNYJOY~!S> zo;ZAFj|0z{q*0Q7nP{~rGruRvv@v?MSCLhwbvhyD-c_A)%-LQQxd9A&v) zOR3`ZDX+LRi8j8<+L}jMTNecOvEz|`DfvqISj|n(M`NZ@#!NV?LM~mz^D6}g(y3dU5j(N|7zwoAp13$(=9MVgeODc9Qh_2EUy!b9Dzgyiph`>B_g zD=%ngw*(2_E*9!eAg^C&^v;bi-*bYjD~|KUj(mmB1Hesj+j%X&pX!axESBVa`rgL} zFo4{D1aOlwJ<;vw6{*kog#HX*T?b<;M>^U+KL0mx|1XZ#zy0*ecxl;wdYIsgudg8^ z5A*A>2!fKX0$)1_m3;if*WjC?3W%}Sd&qDQl&}JU#eBPbUPo8gxucFp2=8~8Dp!p&ZMD^I2xEP zS9^_E5#BvvDJzGej}XGgZ$=2Ba=Cz@P!%ak#SONm?ZbkSEG^n zYAnlrfDN+0V&w8iKm>m2#%C`3?;x=uIFBX&yrKdE0DuJm0qAB$_pdl{wRNyGu(h@P zBhURiW&l5v-RHgkcOQRj_5<{PZuW$`HnY|3wDm`LDEc++0gJIRd`qkpY3fZM8*+!} z)OYccdK-inFW;r=`CeIBUcf?tT`~zN63SMvVmpC%LvHU) zKH!?Z_(G1Ai|lK|Na!FnO$z4H=E-9$qeWiqF0h1q9YIY~daHnjO5@mm%kaE(+Wrxp zwtJqs?&xx?k@MQqGI1l(UooEo2BRH@u!05LK78Liipn29IWRKoV2`^?K|TWdgH@N; zdLZ;m9=Ng+h;+SZ1Ejc+j~0F0ZPDSRaxgJ*e~hy!HK5rJ1__F{DXIy!6Lsc=wrk10Qg;;OZnPJ%SRPQnqlduxWl%Ytsv_@pBwv zE-Qb#U}Gh;W-C!{_C&0^a&vPt*~fHzHea1vKu*9#KU*UuTWVIzhzMwbcYIl;bS!S3 zr&vL2M5D=Aovdu&%X)hnJ`x=n_9Vok0Wj-m)23*OMmW9>XKCa@v|Q+up)e9crQQQR zUWlL0ufR~0jv~bXFU{+00uTC%7f3i7e?X1uzFDgROAtS=1o&3Hb7CWGd2P6bMT!5? zln`M8i}297f4uCsqLLtX0ACe*+x;2S11-%+)d24x{q&fdAe!Jc7H+g6WD?FmQ)UF- z2z7!I#PH(x1J1Ayl}48WD!q7AZlFYuEz=NR$IM6qcD)fMHXSpTOiM^= zmL~|bBdQm3%nPWLS5>6Bny6b12G`*9DOgXl1ny4?4_Ho-P66qhnp19)8lhBXx>cwU zt|8!~1?V##SCE4c7sG!fQ#K=10pXtSJZn#2o{Et0Z!fUClpMqh82Wb;s9>1mO~0In zmyaGB^R!I2zy*l;GEt~`(me;~*D-M3fq5#s;13 zcX=UA;!lh=T!cC${Xafm$-t<|{5S6I}`%Facv}G0AmCh6-;vPR-T!KP> z>v@rqahSf{@9A#ra91#tjZWUf89zyX&N-6(?2{yuDK#pk4Q8=*B?-0Kon$ zbRC`Ct&AQ2NDZAT>o%*bDBbwAt^|oT==~^f!q--d4k}!Ta=BDM#K2&cLj016LWz8| zBF6W@8@KNFN}ln!@$n=jlIzC&wpQ1%2V9#^sHO*+Kc{%)S(3io zgCVyr3Q0S~idBYTt!z3V!B^jJo@Ycu5gdhx7lrT-{s}Qb` z*B40;#~mALh5{;)sM@~F`YdEk9?j=79+^A@8bZ@;$z{mORsLwkX1bsycBp_S7!Ofo z5{IQ+7w?8uzYL(2)#;{(=rtXx&WIhSTm-ein`Mb|q#<$D0MY>&<{SnEbBK)m6Rw+@ zJun|t1xvHGr^-S%8c-9`kSx)TQbLlTI!h)8pE9^nPfgfkh~Si~4W%~q0HU**?Kapg zeDXFQJB{fA4G3FSE7Rj4gAQDbLs#e%w;tc#Lk&AdrB(%n1i@8#?DQpEgtXh!9_AQ5 z3?1}SflS4bZQmHC6_sJ&ceiv6=gt=L(=oNYDRKT18i{Ys{Ad56-vl{H~FO)4g z985IP%eBC#OxAvq$yY+y#bQ#U1mb}U>}HYPqH%u9N$z8!6p!^6dT=Y90Mp7sX~lg$ zD5py&9+k@O)?Nl#Kz5kqOV{3Jzrx9t_y=7n5%T@RGtfM7^>l1rOq%^xyxOcYF1!I7 zNXqQ`ZztaAZ=UaD3kzYvCC{p;Jm{Lfjdc3FjgDuU8FdnCzLf{Z!GDy>GvB;-YQ568 zwT>J5;?NHHIEX6v#?#WiGON?l(q4;Wgp54|KJL+KXEA0C+M?~)O5-wziw%uUXccVm!5j4{iCug#KmGxiaLuXzr} z%9f-%^pzeu%p04LeQelY!vK!{ad7KBhAbx(%7B)pA~dSU2feTFlSR4HACZafX! z8OR?3G;Oluf{ARRJk7Pza{4unP>F%@ty7vMA-pOo&|<6APMPp5GC2&|b!p?fdVx)* z?VF0kE$uCu_=MC{kdR31SZiln+besrJavx_bfud3hQ*utc*i?Ez7VwPgTL{`H$&nn zE0@w_HEg-bUY85}G_GrHrx*SV%<$|ok}2)XpVspbq&RFQUz1P6_yxMk4LF9 z$j<{8oLuXhYDn9npZ2QCwFeIc{DHG?i*8^n%RFe?OJS0Hq8wq_Bsie-b^9JrB5bE? z*u4NYL!#0%r5TfqD^NB#=hX=Lz9utqOH`A`5i$Ok(9gxa6nji2A5!f_Uu072VKCM{ zw#$IgjTD6yj)r<@YG1NS_WoDrv<;0p;Ae%X2yuB-^^@-7;;QRB9`mF@a&wX=v+FVp zW#f{Y%MiGirtfes<)Qw|ej6oSC6$F&wfJC%A%0cfO{CG%IRZegexwv6JxwZ;nc|N- zWO6$?0S#v*F6DPKWB6Bk0ivuUoru3=tn^@zVpK5&PiwZ$7R_*SvUF=?)s^&Ta$wRJ zp$%z#!&hiJX-HVcmo(aIJYFydyteIHzGGhz%~w1i*W#FBCWJBC_BRQWc84K7<_w6E zH$&Td3hykSR8|C$$@eWTm^)u{eStIRd?XlhLoqd$Yt zq>qn8^;H`pHkh}h?@J*lU#;WXBaPSrkC$k<8=$G>Zh-@=&|Vs8SbLk_UL?{nBMOJ2 z$z;P~$P>6x;ESwudb&D0&$2hN@mTrZpAYtj-+<8AYJB;;eWQA+dTDIlL2qt5->)~% z_wJtdURK`(Y3#3R-DNC&BO-p0)m&ZVz_+Tuc`a3DgIh^54AzN-n@69KgGC2=f;pV> zGmO=3QkcjrQ4V=Q;T(YAq2~aBBg84nL0`rN=mhwSPERYkv>xUc=*tdZoc!^` zFd1dSKzG`TBf0oRbqBvU=v>={n~ca<`o_acpU@zz#mI>e5y8Gr3B~ z+l+4jX!1nl$QwshLSh_8VrNG%jJ-n>N+nTFE^#K>fc$VpQI0X*3m~c?_5>VnoCI$uDIT0FB&4O)u%rOdgu=caM@NOne~r z1t$2}OwLeX;9vuz!UXZ|z=I(?A_C*bXrW#bBGl+;AqIrqWVZs!6d?zn3GtS&xq_v7 z`nc|ftLA-GJq43c@A<(-5$EJYCin1Q(RI+24TaiXS^&9)%P@c4S++mp^p6*YX_e*n z+tMZ}=D{G8#(YGX*-oLnoV23&@oKCch}xUX2szKq>M! z9GRURg_j+(Pn-6A)FfmmAQXw?3WayEo%kHR6h(y#@yPd04#Y>U)nBg?QAU_zYfnAK z{88!D!kj?la;=Dm)GH+77*zUjRCady!oO}N2cS}+B;tk{D2o~BQizNH)J2iBpb>A| zQdqUsvPZ%ovk}bh*l^e)hLCAg6lJSs!0H4)k$}P^%iWKSSIJSERv=@i3~`Mfo$Zrf z?!%y*X9}^)CpG_;xs}$o8|+`-(A>X|%9BgZ7nOxU3qI?QFIS($0l3pE2~-}AZB0d|7DEFuQ4j+XC=&tGL1?aJG=f|JsppCw zClW{`K@0PW`6fBAC<~Z#!^fSJZXn0vrjSlnJ)+nWw>{o0*`Cr5bq_V!;3E^ zS%w5wVny)L)GhhBCpsS(2lH)jl~VZBTUFhCx#i^#{d?5JdNKx`i|T5i5BK?Yp|t;?XDx8p~$G^F^ih)3FCLa2iEp7xB&o|=m6_UYi+ zIJ2J!f6Y}eRB5L4wMysQ{mI)pVw%qospcked#{U8Df$$~6g{jOc0fb5K*e!?%FQDd>9mFPfQ`f8pE!F$h$OHD0M<7U&$Wn>+&N**nq&ZmGAz_t6lZdaf_Na%7Prdd46}yZ zswp|vc$qzoI6{(BlXj>8nllV-tnmVlw};9t$C%gg6u#kw(5Hd8{b$r8>l((;d0@~N zc(KLh__bh~BWC>jm&=Eh!jD130!lBr=9zUBX0`gDUTvtp<8t1dG^xoUf`tL8GtBu? zRx_S({zPFfFj|(*b0~MyAbDC=mFL4RWox|GxbX;onrvc;sA`Wm!%9NK1vWzLy{n|;A=}5}#_4LNE7e0R6}m4zS+`s6 znkO@IDV2CO+1HYtoY_nEYhom#F{I5CH1(_GYL1TsqV*4m;U(ZFVXM4kd~uFdO0+?U z;JDWBChY#3q>;m4`-pPThH-EMH&W54iWI6ah~gi00u1Cly%`CKPGOTId_BuLWw#mP z1Ysk|H&x5)Nb>4__16oAemhh+$0c03*3V|(!rSqjc_2qZ@-cfNc{@OFp+lQiAr;;O zQx~$y{a|d9((_WAcDz37wU{A*2-NT_(giNn8ooPu)97iQDFHNN4oE6)UgA7SvWeA) zm3yAg>rlN=9z)xh($#Kg!!3{bwwSBrTN{iI)4nAFT_ZrjtJNQpWl~~#vY3matJ%LO zd8Q-Ra%(9kEbh=6O#7|L!nJJ$)u`_<8hHaIP@pTGVp2X9w&GMlQA+I#+nz?`IU_HC zACLmE_|A_(7}+U^`ql_?j;(=Jl355O+h8P8y;da(SPA9F8eaeRVxsV7dd9*eZM`rx zY=wI_gMlAX&979s^K1lk**u=_mq#}tJv_d*hfn>w^=(a*k~ZKZii+p+F}fdbZ|EDk zJ@1#tS8PXfWLJFyJ+Dt=DLo%ooOiW5Yp8VH-q+Vh3Fw>NcL%aDxGSqTxT%+fVRe_) z+lCjU5&HgcFIRwkSp)Qf1M&Qbhc2b(VBdLZN$$Jd8V1wPCmC2sMGBvm`ix*ftF7>2C0xb%S7fSzr>}x7<%4$Xf<*>jy(X!Jw}PgrdG{31?MkSe++kEM>65 z1EYwlbRj3~Mh#Ae)swxtj^eojI)Z`5XkNV}a%PYl9|-$5KtAA8TY8vfuYI?RuXJ2+ zS9a8yfBbkUH<{Jptug*-nRcTwba#IzV3F48E;Zk=>ZcL=PhJ_){ zRH!*qRWC9(ZZT1_GNx^n?dfIEpz%*`6k1V2DH6qp8ax*pRdXjkhf1#MDPZKwvl#kP zCfM@M81lMsf+#wsK|0H6YST_?({jftc^abjdrLIYi3f(L zC5>sFk=0N?(?mTIn99-s{IG$ke&!|O>+k0}|(Hk{e>zp?MclGD?u=8avQ8<(nv`rx*f1be}No3WFSW8fkg4pcjAfx&4p|Ap9msp}n#M19U zPzqGYLu{`2=7OOz_ExKP>`V#2r57i!1vh*045+0)CE{XUGrUN9{%enB;u~T_gp}?$ zdeipvPPf*wm;D7ILDoytXs)`oi^VsSCLVH-E}4R<(*@3NI#rq%upaBR(>UChT|}^O zEAuvTCu~qn4lSAx79_?#1?r{XNfKP8E!c0lZv<3^dV3V!M%@4p79GtW|JW8~_s`c2o#+Q!amZmUW>kW4(9dS8+c4sB6} zr^#vLs#H3@au~8GTh_OzatZb9J-zwN8@3M9tQ=49p<5;n`x%a-YEUX>AH1U*x60#CfQbZX&?=~AZbS) z+gQ+v`zz^zhGgIhm3)6^Yf7LpN_jk_Ks!G9O12p!p5#X?`K1*76=X#G*npha zvlUhzemfvo@~MqDW|?a4S$4*MrAEA$5k`fp7j z4C_gX4JxN#JVT&QG{KnOMQ;QMf|35%B_v8!A6yO*kfIV{GmR zUubXN1#yvH15=~Qjf8IirNK=Hh;mOIb$t@AvH!^@!K*qL;y!&6|FfZm@OPiox3l|S zm;7rN%Z#6}S*1q^x&VEK1G-??D};awG(cdda4?etcA2?J)=(EFkKeKZ>5$cx5X5Oa zDrK~KsI-Kg?)E+gh4xDLQhF>M_FW5gwgmJPwY}&Yc;1VZiAH&Q=k*58yU{N*G=|=p?3H ztn`Fh$Jfl;$yl9I5hDdg=;Cd)pG`L_KGS3Ju@R2jdi4IggB&|Q>xG`Dtq898LQ@=f z;`Dd2>};~26>IS^hAj_f->-E;Xao562g{yq-k^B~wOfIQTE0$(SgZ>6arX34T+j0J z>@p`{OD)hm@+{b<$3$#Xam#*a)77BwDW`3^uqs}^nV#_dQoJ~{z=*McZHS?{)-#3LE&tdekgSj7MDUz(`BB4-e?RMg60|cwAOgdzlx~qT+(4wP+WI3e zndR4I$4jtRuL+M%6)5R60{VHqLE2N#(_VPhLoO*deG-oyZkCt18hfHUwh|ENY z-<0;5H$CS_lKI!bs!|ST*dD5`W9Y0k!MW?JiqX({+XvsM>s+VslH-RF{)X!8m zIRnPN|M>KA%j;ATKc9ZUpPSgfp1!`7p^%xrxy>J&m{o$b%m6*iw}-E5gxA^P$f?_6 z)~5ag2A#NY2u=DLWzyxvf_9!j0dS9XVRNdh7Y)A>Us~+tYJ6n8VNlbg1x7rQItSdH zB;PY-Ii(w1t&cl(hXhvhmyQ_FbK9-vw5EHl#P2Wz<}Tfjl{dXlO!v?d$DfisquWx# zCnnya>Xs$R(Go37VbuMAnE?y|hQ3;|&V&-~130lw0Ypv$)qv_zg+1Ymm@p`rP_3&2 z)m!=Nv%=7CQETovXZWxNz~*9%2lRn~6V^o2H0o_L`d*~#=*qr*F4BM3B~E-C9(|t+ z`-kog?=uJdRowkc`u0bO_h)tYzq+^2Rr>c4G}#*t!~g@f)v?8uxR&+P4I%ExO&zT> ztaYo&iIHj0Trr*e`5sM{iu#lR^69;Bov*L*Jat)-c}j_eJTlq?UksS<;9?#PB_gUT ziz45jjPbN%FP~@Is)+h(7r7!|n3X=PFl*tI6egKU0%Oc57pF3jF@{s!wTbB1S=-j> z-J1VFzg);`hyiV(DhN|9F2YyA8}<}ja;kGYdo=agf)g7tW(deCB1wN zy4~__*mwOOWi88kLniK@QnXRZKNz;(OZ@*|)%|I@sbl^R#NmSit#!>LSz*w{r)uG7 zK?p*G3qO$n5^}$<`0uBiJt1OW$xqMS7mYir$+z4|owCofv!4#|d)hbGXQI|e-gft^ z5AfFJVArZLT76q{w3ps?1YbXdCkLF(KZGv^*3~WwGTJO3*hF#Z_gx<{UgnFmG8USt zZnE0DJ)K;~?=eUlAuMtbnN~i|@1LanSHa(xOkVpw{F1@#q@Q${uF?CsO-?nZe8Db$ z%#uxHCU%i%&Cjm^NzBkT9LZk$_P6X}(e7xR&yeK4`Ij)Y7?=PYq`JRzY+uXDQY`AL ztdU#u&#ujDqb=p+arb?Iu(LcHMp^>M@`<1vo+^wsW~kyGnUNx1CO_x}u-Yk)(0> z1#qIk#F@l%n0s)_$vdi!aDx<5W0Z^#4YvTEJF4=3arQ~*d`Mk%kr(9_6j)SVBXs1w zst6H*lH7nLCdGh1Yi^OX$}B*isR!-0#b72L3X}pOBu=jgu33uQBKSE% z`olU8<7iqZAtnS>;3gyFZLZt)f*l)wxv||{taV%*gPYovim*?9k+de(W6Jk4 z`Ukj5Z4I(5c2@Nb07HSvMEgZ<)b3Fq36mOQV%@;N?>=}r*+_cu)D+PBXM9b))(iEEv~WkxNn#wktOFTfrN>7b+i;fgsN}jV^J0OPymJ7nV1i`p?JBf;Zm} zznn=n^pMb_Pmxv`#R@?mI^Vd66R^?TH`WD7W*1UL*$VYjTrBd72Oc44h086DR0mXZ zeaA2W*X~c#p9|t}yhQ@4@7##hHRl|Uq_D{6>eI_@(Rj?`yCbok z6{qEwFbW>&OR8>4Qu1iy=^r>@zQNsM?}2xZEDp+6z94}rCj7F4`JuiYk5FxBwdp}o zl73xK+SjxBk_;!vNL;}ycur(iG~X~kMm*8pWRApdsAMZni5?%hMXvO(=CXyVH!2?G z`;M-Pw>}W5_;!f6l+cRqGW^io>w%sjc7`$2mFAM~vh|LhV6#+3AEt%|>$IY%`12lH z8EZ0)PI=F+5$9pG_8g@((E(qfXG1D=AHBO98k?F$hZw9_1H6(rBJ-FAT5+6k_+xgo z6CcP8iCb7al6g_l$!=?CekRqeGrv-rLS&GLe)qNXVT2LhvnA?BA8ffx<16+ZSnKV$ zRq`d^ao6l1=yuih1v1Om28jRTOZ+BMf9YbjDXz z!hK&Dy2|2vwml@(v%!~GH^z;Ss5&?ub(xL*&fsX2f_$6L&a|b98N+zTGscpvH_Q2B zseOIo;^dNv(c2_f+ehO5V2=}2=d9+=k2~N_j_E0qx<+nIg_e!6jqTC6_DMeLNm-L@6nrxrf5QgYYuogF`K6`LMEmDqTy~Q0*u&3>5A${FtA)CY z@3hVC?IDhJbs>6hW;{=KM80L*GQ8`nDffz+ogGf6-D8t@h8Y__fw(r4R$0%@c+5=; zow4={?kc^sI_hl`guVeVGPov>0_>B%clt z>;mpK1y0i&enhrU(GYU&*PT5|MIL9A}q*1>KTIVIin-{{9u2DlsZZ$Gx4z-+jA<&QT!mu zG^WU+`|FL;@3Bcg7&)5_bcIydHx5NN^y0*7b!#)GM)S^S5GAMc>}JV(&W z(Dj+^gDq7A-Ac`qckIsiZpagdE}3Gsuel4_Bl_~Dr-u?=xkuXZH}}_oUG1iiN&d1M zAAd2c#f~fhAtM zWA`~t-dWcUHRu<%eV0vlF)OM)`1ndqHUf38a|}L}eX93+zY6X%Mr)FUEOU5GwVP9gt+^;-QUD1=}=|dBLgP)$*CPgp1}$RVmSjH&um^(?21*}mL8xva5!k)Zd~Y#zVt zwXe;moW9XKo!}HgdS`!Bt*ea7j(#C&N%5HT(Nz{wj&`{_I{SK67ScqHC!WnadGBm9 zSkiq4pTyQ(+~6-=rqN;v-tj7tef`3F(Y?A`bTQijeR0N_F!_*#ZvH{ZLkX|2cI~#1 ztUAV;yGXAVOvc#_zQamp3ly3O)iS^fmW*N6`b+K~ANb2fG@B16hK^yNw&$$Sl#V{}LyRPS% z8xQ4F<K~Vjmp_&g6`qUjq2y5YmzLYGMU|zu5P%pXMetnyO*G(dCb7i%*cE5 z>zD+8K2K+%Bay89XQ9V@Gwos>6U-5VAnW=toD=UaS%st?kQbY?mVkD@W2dx|8`v!W z#K-XA8je8^9}R~A7+qA_1kmsl9*yeSrTi?|-8_EJaYc=a*Alb4UvMLS&hc&mXA5V# zB`T5?jOdTBTP)@itL~EFn~i6{?U7u@?~rwx2W%yFmB^T9gc2^i_TaFbJqVxlN|d!O zwwT9CjwD>Xs<$KU6q(8h9-3&xG36+FBi-GB)+l!Ki;DQ-VjD1fIhh1pyRp4rl!$*# z)=xt9ZwoppY-c7L36faHB)(a56{FS1FDPrU4lz_KHNB}VUtMf#H6xcBkW=%mm zE~j+Rt}F((9X4Ydrq1G6P~(HYtn3P-Om7!)5*UM>5oJp5T-~mi@%E_+ir6Re;|D&F={bgsAT#&PZh7Xu%Vvp0ujk-YkfKP z+#u&Neu!Dy7!WQ;S|-W6Vku%aKamY`Q}Jril?AL@BKUIHY)<54d5FNF`p5^EQ>dK# zFy-)w$i$0{Q}xV&B8Gt(SP#j)?^ZLjViNh<&&z!Hu9CdWVU{ZR1NbAK(>$J67z=oJ zR`gg=W6>q!OMfKQmRPDLVE(!8$h|=^$2?DUuDa(Ls9U%l4vV!#O5VCWj+M9*yMHu} z0-a#ksZ_zs_ySG25Wz{bzYXD6BBDZtfj-Xf=Y35!Zr`Tm(R_ApNBdFT7dFViyF5uB zAl#g6O+ogXmzRO*ofXJ!yP4Z6pj=@=Im47mY@lfB-ysYYMuaef&mrLa>2g|x<2l=C z`t&DW-Bzt+4?KxPwE@M{vwP}L1F5oZe{_uUiryYpFE*`bnHgvT-vsEp=>pk?>J&sS zYBvG%iZ%D4#wcyZy*kn6hHFH-uG3cto&;9)7!HjAp91IgEg`Ahj0m%2ab9Z*_Ef5q z(Kwr>5|KQGV>VKJr~_OSJQjB7Lz0gOY6sT5Em5}!UmM`);k>E`kkl?xtm#{S!ud)?rA{y8 zLRiz*=dlwxhou!rHq>FzWrMqMg)Pw14qw#exjb~tYJeqq8Yo#oE1vW7v8aH{Z2mbL z+h_e|`PXbqXn6)yJE6Ua+{`$QdXW08%VYy(62p1)JJdqUx!?Q#JLtc89Y7$OPp$et z&+Px3x%l__A13(aB>&UEf6fg58~De$_mgY;+XV6N!2g`1{5x>}^Zx_>&r_AZ+xdM? z?k`I+pStVcrsjSJ|30bn7Z~zWWb_ICYi{Rv=KzpJ2rH}IdG+rQud0B=M9|HnS=?^gb^b@_KIf+PR{ z|JBI+9sZwProY1%$o>ZZpPtk2=-QJ9 z|H+R2h5c+c(ENP?|A{O8-PV6{Y=5`4MfZ1G|1aYzCkgr)E`N-O!UIfyMqK?L?GJ$e E2UR@x8UO$Q diff --git a/openbb_terminal/miscellaneous/portfolio_examples/allocation/SP_500_Portfolio.xlsx b/openbb_terminal/miscellaneous/portfolio_examples/allocation/SP_500_Portfolio.xlsx deleted file mode 100644 index 7ba0a3d4e3510587ff78559302e88354430b7e90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44809 zcmeEtWmBACvnKBD65QP-xVr`hcXtB8-CYxcLy$mVaQEPDgS!TIciBnavsJsb=O3Kq z!$8#xUEO_O(tSUmrU(s#0|5tt0099(0RbF&W{QG@fFOW_fWU@8fYO(Ac5<_Hax>QS z{%rZhkk!l4fxG|)iarkl3jF#1|Mfq(1LY~oiqISw5$7TAro({NQc|g(`se{40BYU# zO2um+zvK+N=kpxpil|xE=?;fQ>T3~a+HV;K742o~6ov8mn7?jyG%?(`dB=z^ul)F0 zF>t>k$+QsUVcLti@Cb`!3RPj7^iM$&Phk})GN?Cg;?8r3Z+_PuGs1k|Yf(~QoBgn} z|vnPSqQu}Nvnu`*NMsK^un(nVC=oW zLqn+jUj%Lduv6WD-%$ed6B$fkV^>RuFKn!TU;jUG{|B@6|0uoutFme@J4(d4+)L!p z{oGm-hJ>Q0xLg~BWnb! zL8?a2iior)7k79@TGvz=m-4MXOpm$Sxw{Nm1#fzfjzq??=8}BH;SDO8nM4-t668Nqr3%DU@j50#K}5*nu!5!Fq6c}L$SvjP`Viw{vnqdqE~OlRN@eKE6M zs`MLjptyY`0%+KLw5>MFbrqoWHnwo+x|Yi7#D4W-QOO?qM9Gcyz&R;9NRxLPs8`Q@ zIhy0$$A{QkHgqu@5=&OH4)(JDmn2T)XG!$nceG$2Ac!CkAiW&e{=*YbXIFbOXJ`Ar zKKH*l0|_=e@Mr&LfBhBvKK6fNPqE`PQ`yQ|dq|37TGbk|kfb8I$jgwS+wi`wc7V@( z`&H3oo#OntOQ}}$g_q|UF7i9iS331ELITIS5uC4qx$9>h*%S=lN|%X}+M#zMZ|I6%8apybpJTZQUNK=gdTCh>dADqLpd@tO#h7&S& z&eGSucpT~dcYb@f} z7e$#5572~Bu9c}nl$Q)JU{Ag&I+z4RP*e9Nx?3|t+H4ch;P_kPS`oVm0q5C@fMX7d zaJG(&i4+vonrOA?u5T>cFttewCZr)fYTD1gM4g!KZZX*KI>n#h|2v%FR{2NALPJ0d zf`=<~Fo3`~`#%v@4sdiX)=}Q4T;cklg(P(rvL3 z2x{Kv(VnC#vE}x5djlcKpW7q&N*b6`ZC!1uvZLJH&@Kvi0eZhM_^1Q1gJkrl;V-e{ z5WLeu#!b-@Bwdp%R1FqBPb&D3S?r$Hv}?161QN#w)yq^!CAFg$wD>wTdVAXm$~hh%PhNbnf8j&6>F@{QCttc1}{`ARztUgmW(E}r|EU%BlRl8hOmYB zeT;0{ma)Sy7h;A}85=Pwph(WPpA5(27h@HIdgATxCc9`t2cZ1L%h{)e3hrNV0pB@> ze4GlLg<%rktUguW8KIy`Ynb00Am12&C17y;p-%UcQFxRm3mI!r zi)gt9*Gk0%mcK7m^(5sX__S#FN)U#sgC5^aZB7M~$j3=Q?JcxIu{Fa3Apy>)ecG$L z?MKl*S%mF*8=B4!f4=OBXYJF2qMDXnM~ZoKsY&Ovg~G>Fd|+l)T~{~8<@_D~A9UQ$ z4bi{iK_r#@t(@H8=r5+AdL{KXN~#H)Dg0RRL}y{`s;w zg`0P2D>Db-SRv?RAnP;cG2c zuM-sNVXI@X!YW_p&Oi9Q?c&$zoqz0TEz+b4!f=mqZdh0G@0@V9l|IsFDT2yP`2>*a z)pC6CDWhkwGuLzxMG8qa#-y#5OxJq+6{IQE;oNA%TE;TvFwQ^Y8yl|vUDen*Ow(dK z_=q)5KEY#4PTJ;|0Nve9@Q;{Xh56dqUqQ#CwH6=!8fgk&yZjqXYeVt79zt5w9v`>sq^JHQFLva zL`Co_CX&y=u=Xs6d!fA9u&8Er*KqkIeG@59=iQg8EOV9Wmk*dJ+@8`&WNfs)IlLc~L`1M#Mqe<2oQz z{yt<9x_o;ZfNY9n<1D+d?z?>_lk87G0}Z_)kUcs7371`^6^k3It?)5!=2NIcjHAZYgZkm#IdIyn|T{74x6uUxYoq#Q~BLRUo-cX6PCMdJf$qA>)uy| zUh>;jPJ$;mb}l-P<2-g}LPT?m=Rc$n&^!BHMkxpiiS*V6Q6=wz7vL#q+F|WkktmkjAh}l5f^Pbwnr{mHo$PqqyEW66dXD&IeIGK z@wPYH&Vd{fWUr?2+!&+*&_^9^*-q#ZWfrMYyi(X;$Uj+9CUfBy1*IneZj9t3GBRPoUdzl3)&^#u@^y4^i6)r5^@ zgWjTApnk!K2+bylEWt*aT*F72Lt~U0Hf4vy#`=|+@Uv>}qb0_J>A`Oflt&AouJlK2 z!^&0^R8en>#7gp?m_gB7m;{T4~mNKiIdSGsU6@-Am`7eswn7Ue8Xt=rBI$8f? zdR*3$(;qFYh;#UKPjZwo0~#03P{fdoGqmQI`eq(^mNUUdsTC>3pFRE2*EbrnW%^`? z6Ge&W=&FF%+l8L#Hskk2r~3T@+tF5^!0Q=w(RCZ?2H=9_?ZcZ@>c@?D*TM!vql#-~ zL)>#`qnNwB1@yr8mA1xHZtq6BjSV69wX@EqrqiR+#l2JX+scw1QFQmZalywr?{-H| z<>acBUj+w^Su26B4}T_`R@%#*>H%xoYtLDM?>D2J&h@_;1CNoft8cCY16m(1Dp^F^ zk3|j~_1!XChF9*^9PhW*D)dBN>^s}MTZ|?~=F$pUjFe*m+U9d7Suz#_gps!@*TDUP z)0l>0=efB`boYwm?|nBe%7M|Ns~g5_(i+b`3_~bFHm$M84VDFexML#^8CX*@r*1Q? zVHOl4(3AImRPv1jKb10^UR4I=TQS^NXiHxsH2BW7I=2;%@j(x)JHb+ywPV-Y*-iN&h~~<>qpZISxFG;MmuL&~@hu%Pb3xrPr-ByVab_ z$~*$qwM63UVDy!jHE!U=Pro@yF1e3Fd~g$n`=BzYW7%ehRJ5PHUW7hmt&xnz{wD=s zR1u+6COJSLfC8f(+6?+7z;dkW@)O;78ry~j)7-xCvyrU%Gq#TUz5j=;$e<*Lw%-%f zF|?tvn-E?lq<-7dP+Y-%cR^E^Dr<0PH#BMOhzaQQ`yqDdUa6*6%tkx}YMv+4#0TW2 z3j7gELC+fT9Qh@Kv$}a2cl=cNVZ8Ti>fcBgQxYxvg1>)S!<&1JR-HIR{t|{^jwDAY zpkz&etkVU;yg-Rngfl+es?2cgIf&R7hX`eL788aWvsaQ_?A7^9Y}g~mpbimz^9Vyp zIBOrGT%1J?%F-GlctiY^!BKB6gSKcCY4i(HiW7dCP{m7Vx0adTLC$U;Tx^#nN80(CAOW8+F&KLd3UdH2l*Qq zP5U52jRG#k;9SU`Fjh#~oY1U??G7-C%R`9MD1EjAh(Y|9(ZvoE`ce!W*)*$sCbX`> zgrM{5gZi= z6mu~qicHWE6@(=ll%qQBy;vz`@M`%vF2m%bi*5)j(AtYhgK*n^WG?+^CZvKEJ{B66 z9x%^~XjQi^n?SNhm0~?!H5+S&GgbS=>o9!i%@asu7ITO$quP+_wB|R?0ych9vHhTS zk{pArB<~Ma!U^yh9}?Yve}jld`n~~K%L*|ZE=%yl+l$%r?wb2@&f|$8^KYgmxyX2#iW=tykm=nZQA83PyY1cyttjy z(N-mEtVA&!9T2$`%J=pqLXlLLiWQAC^tus z&?!b#7dEIplKi_^*4K$%lSj%48u*3%;9ODlW3C&bw1~lZ?WEmgv1SUk-`=u@1u3$h#y_x z2^7dBg&BNtS&CcR>bgqKgTD-+MI=Op3a~c$PWaR0k(?$lEETOU0{R}6B%crgoeoiPC-@O#p@2Mf_ zxpG11?>}iA)F|P!0#4=;*6m|N4tZ?T(9>F#L=_?=U~)-D!|z!Au-$Ay#O)3fP!Y4^ zz^+^@ra7#vL9R;JM;Iad_EA8eOnE*Gn%P;t$tpUkEBx^QaV9u1XqBy;PP5^@v9w z-e3emeesO&pro3|l%>sB=3C74S{gq}{n~KittZw_t5yefSf%#5FjRTCJm$QfGm~ov zlZO!Yp+)6!tW^GtQ2OsIi_fEH;@5;+sk$*g{jItwxkN*yt(5q!SNjsVxp<|mq)y@- zFLV(;{iu=Txi?Mv_?=6&1W7k^avYxDPvv!#c+*&HQfOy99fbvpz@k>H#Q0#bVH185 zHde6F4)4XSsXDkCHr#0OgS$>Osg90N9PSL1LCt1UGHi~i%cOyWJgeR`;n`B+lf?xx zhz`2sd8bC>jsY4X;aZvP;5vIhmz!|Udv%s`oQqq|@@7{ie&5zbqv{#3P*CWRp*4N7 z@#NaX!ry==y33i{#Q3B#P|9z+Yk7p_*m*dc^_Jo6`94!{CO?iJuVm=`9c6!~tkRE_ zTl=hX$u9pJLudZNaiVg|*O_OT2*&}KDbKcX@5Qo!g8;Jh&e|(hZTO)NI?qQy|Al$~ zx=%AURQGewmFx4*$F$)FU${&XC1?p33WQiH1M#QO?^AS#3nkF5?e*q&>~-4%*4fBn z{>a>$V5;IQ54~XT#q4b6931U7uZ^u3!A%%hTz%dN9*xW99oARzJ&ji%9@~+B`ZH{F z3)!o8D`;ey3l zc5v`I=lLCCX1FJtJaCdV_v3mFSPX#uuD}Jaq;E;ZHXqXdNZIQIb!*Dp*Rm)Zdp(!- zqV7RqsHs=lA2{d5u!Ek0?=Q-@=tjtn-0CU zP_R-2^YLx0)y`ZRpEB*YAhV3gZC0F93tktqy7e;)iRPn;bq*O}8C}o9KM9f8_Jmh{ z?%NH&(R<1p3XM_6EprWJxia-+f+@^2of0xJ(5FvCJ+kx;w8qUylU%52bejX7Ewwbh zTw7J>910S)r3{j(qLGbeZ>uc22ITB9^`n7fgvbc#xk;jWG*1j+pYd{PoRk{?);lhp)0H z14#y2uA16n_~luW;S;(~XtGkE3A*q3Tx7H>qStd0N)p4bgYTZC?Cy}Bf)d=%dC8Ru z8M178EM>>z!#Og4bf#ucRVW{$r(z-t?7ArkN;EF90wh*NZuiFr`%)YyV=I2&&J1;>in zRwS+?d(tQu{f9IrNOsET!b3F5agn?Ok}=k+hC=pjE%PJiG>n8}Xw3vRKjD7t*0+cbo-MUA4R?FKA7|ujfVqo@Q$;=2`&%XGM zB0%^NW^teTSQTK*r8!0G{Rw}ssG!b=enE>WS165U`ydT0dHO89fU7H+)WC>seZ-gal`@>?>l!St zV{ba+_!pvWrs@wSr*g`lFEOOno^&~zzMMVFc!)Ce^-5iePtkYkGA(>44#aKW8I*A@ zO09BT>%Q6Np_bur9()N8VwX!Eg;hnIDq1JhXbrpdNGz#|pUYc zR~1Ry_WXK!gZ@cZeqe%|)<5|Nt)sqjw|9vM=W$LK4x0Z{#$Z`g*i#XG(G&gKr;Lx; z_hpQrm9xyJ$0RSb{rO7Dn?h8ypCSdx4Pl3snt=6NfH6%xz9oYZF$)^b2D)_dLjE>E z9nt;-|5F=0en5i9r}b$i#`l->2 zez~aOBq^b%!;+~yC%*r|7pZ9QE~|&?da@^|Y+R}$!J;70(R==WKx3F*(zo+e12XGm zKaGJJ57V(m9LqvQ%~2u%CN)Lt%3j< zw9(1@ub<`{&YxZh7rna)Yq!Wk-^?*w%lrZJ`MYUzpNb4}o4;?&20V!Vx7RJvO$IpV z)({YvAy5zm|JlX~AYhM1P++GTo9eZ`8>y)*?hfSSynN(kaspbw5X*5kg0 ze0{61b7!bY;Nkh!8VtD>TIAV#fBvNJnCbz!iGW2Un1{Tt)xqEB2N|;@SC!XoY_&|k zcTtux=wTT&C;rnSn?@d!iI&KR{AP>=MK}u)4SRe6iO4gEAZg6>&4WVgPDHH=A#{y0ov=(>BYcmg~XdVOW*d^nFAg(W!op3!mbn$c~?3 z0AU)(AM0uNS3c8e4+j$}KWMg+6Gw)k94@A|t}DKt7_Kqnw8IK%;k?c=7Y+s>r9F7@ zs|SeG(^b?G&{R;9DU09~0#DpX-$16Fc#EdSxE$=npy&Gg(r<1yLMM@kPZTEh#^urG zGjvH^U^uCjqA=-hkd4PJ_OehJsysO@o{9?HyIrW6zdTF#a|jQ2U(DVXoN*3( zD}LQm?R>wV416aEe45^7dtX5leZShRdcVIrKJR>ax(|GL%-WmwzrKw$?x}l+5_sG7 ze0fc*T0`G>zr2k+5BzAekUr0T%EnP)y{xZ9tiRRXKb!h7kXog9&3yUdr+;E%K!CUQ z^{&^$?d~@}AEoRFfJm;+?Xmgx;t2kF6hP|Q{NYtRP@GV)jrEwGliZ2$=~p^EmGg@* z7y9$WEDg)*Z<%JV2O0zKH6Gg5&(VNzV(dXJ+LL%4K=ampAc7~+iZ@2iMznso{>%7^ z`AIeK?e2Et?bSH&>2l>b?buWFcH{M7cQEj6>$&r^%-$fg<$P~pbxnKoIkaiRyXoyY zaQO{U_2fg5v0K<0C((Bwp`aul2mM)Ythl_)>GM^bhI&9-TKkB#rzRKQU zPBQ@WCQCMFKe6UV%!9}AWZ(NHf1jwI#EW_S!{vp>OUKKiy^`DI;H*kN893kKS#Z8D z;C!Px_1lW^5yAOJt%SBc?>+xX@(O&BBzp_CI@F}16?(z?)_z5VZK%XC*N21cpNdr$ z!|?Kk&Vf2U%gs4>-d9nVA`<1f65lC%Z&qw|x83re<_P~WFF;Pyac4`2HfNHZV=4Av zT)lV}4HINb4|AQstQ$#qg3yh0a0s)K)j z2PHsA3ttWMt8XFET=A|M>R=Z*CL*^lrnvTm?kW4s)Y zp622d@jD)kRgcRwOjX~>>!C<%39^!7YK}-l(9}N`oKWNrxcZ8%d(qRhqGO-6rD*+I z1*xTr#z9c=LL_6&{mW&8^Fk$=KnBJ+x{QXti9>Jk?Vxtauj60tj>V<@m}?2w$Gbms z8)SsR!AW&LfRE;gLQB0%UnvZ?7kM8~!*MQrCvdB9#*W{gu(sBQZbrD1(l< zOuga<{GVu_2$!4)7rkXmy-2IEl3$K?H`uuW406hv1+5Y3OD{jX4mcd3YxLcztTd+I za8<8ubTf?_`d)yv#WBrI<~LspmQDLrcn$;v_!TpW*seMGSmKV|bM_i@o>ty{bNK30 zLX7pceh&QJFl&t|MKnw)yA$GKsh~G?Mfct1w+=RUZ5rR@g|G zifzrDcj{`z3Ow6nKD29%yO2$_&DmyTQ6HVcM6m zFxIa567Rh%+xBvXx|Xrw26(d7-|S!46Zz5FXsbUn7kYgXWT#b9nlWEQNPH4%i{DXk zHPt&a*&d(>)!x#6N}Kk zO^{^SmThK4nUI1T{3_Q15PcKJK%{VJiWp7X{P0#_ZO?TIvJg{FnkTMYDh7@FK>^FglYz9f61)J47s6g@cM{rJ<*~4^+MAYLr6{!YrLkU88+nROe^wfSiIC*ACyco!%2t_P1(=Oe*F>#*Gdtc>OA| zsLUj8-+jNNj!RI^HnWt6d}Ni^dZ?1Q=&?Wfb=J?vUx?nwW2KUJkW!wfX^tofWNLB` zafwX5O>E8^ud@wq){7MyO+)z?0dYCO1sr$JgNt4;ofhzgp$x5sQ=^u_(lxvn!D;T0 zwDFGb4SBjVfZRY?zKx?o44!=3)@7|p;|Q&kh@r~E#cSuS;FSuWN4*>o#q;c@i?eK= z2IFt9m+oD;jR%uHq6FWb-vV;(1{dx)`9_7t)@C78i8FbfA3Ok+fnHDE5@m(HG)B1L z0D?+KN=bFviRoM1kbME6T(iOO4O z15Tcs#@Xp9J*@*~aQ)MaZk>W3Es#&zY>E7knIGQR43%|MdgF-6VPeVksKJ!q=%gZB z+U|THT8HX7xH5KD^R|hvY6fS7`~0RMx|K4|Qcd99#kTOg!jh!wHV0`spjCVf+PANH~?6alZ zsjR)G`eNvl(MHls$A+8m$4-ea}?N%km6Ms6&c=rk|VVQ$sfa}gF=Q(guODR;ft)hMRa zKdto0QjLUpFyxpfe5NoPR!L9Vh2lY^XPQkMf7%*@3E5{0RXPQ(uC!~Th|fu%{Kp{@ z9ctwlcVuQ5rVsiio{$Gi-B@9`&6Um4BfUTTaZNCD1N4HwwN5GVlw=MO-9O39swejm zCo5||Yqzf+*n&usmfUqO+uUzX2|DVbiz{6>(0|uY>3Phwf2l~LU4IER@Gdcr7;lb!lR9ba+aa~My*8)&*!1% zQUKvp?1|FG^9ZzjJ#PSj0?+?sS=9%6Lep3?jHtw3daN+l5-cP@dM#5J%|d!Gxqt-G zQ;OkTepb-i3f*UG8-F30Ix6I;cHKU~B2;cVM2zQ;YXL6HF(`(WW6m8A#vJ9%{g63S zSw>JBw0nGkb)8j-5TpKVvJ$Roq_u`6#-hj+b%j(Lz`nWr+jh@tfW~Vf1+9#6sNk0u z%*XaBC3izy3S=`<)LQb|V}$}-9NiACw$d0X8tz6`_8-hlQu91`P~I2cJ;lb#en%q5 zH}60mV6|_qngYUgZfdMW8JejzZ$qLT_%@|r+bbh+rHOTFRpN9|3?qYJIUsGluFD^G zeN>xaucCp=9%5s`KHc!<^4h(YV%#oV@f2!hITxMnl|YQxTy{ih=Jca7AP&}r%vcma z+Yocxq?NL-;Mj$tqLq;n@5Oa3ph-+bG7Y0O{=kG|0eyh8Yn>H&TS2DJ-t-w-?z?-% z6JsBx(5pZNGi2q53b8Q(&y6Snps>5S)eIm`r|U!-BIqav1APSwk#%Zx+!6oNV|_?T z4KKIRu?cfqH%mxtC?djvnJxs|t~&r$_r|TFDhXD@-%!0gw4kw12(2KVIQg|ch9cI* zaevCM>|yseJeEcNLZQCb;}R*tj(ek2dT7nhvcqZS&!r|hW4$0s5M?K<*55^ug2IY7OeX>OqWoxklWe;2`GF z9eF3M47Qb|H;o)Q4BBI~q*Z`mRNn+z5n+YQ46tQ|N|jxv1Uga+*A4q+-1Qn;70;Y#yDU}kKvu0MkX;I#@o4drxhT0r9!PmNz@q%?LwUlELQ?HI` zQ_+?+P<3-U8KG6}z}5zF0r}991$T({+(_mK#v$y?B(#QXGiSYjDLW>JQLs5R|i3n@!qf}k~Pton_) z1kOhfLN#j*i8%y}?*4l)y4%bhd{!f(+`(N=br1i_5VRYkF8?H;g?NV6d zuiKvoyBZiKc~r|7g2&wonfx~p7dxaF*f=bsNW$w)RLPei7AV&^Hzgh{Yt<2+b^fC9 z2Tib*PrIw$$!D#+s)9qZKGfeqDw;#HRhhRWO207f-kcgx?Se zHtkwm1f^2R`tC(4uR2?3y!3A70miX^M`wm7rF_6>#T%QGE-P*4B;{e)?}A6~$bE?I zxyNUyo*kY^^Eb0tk|q$Ttp|Iq2_E#FNC^?aUf5``U-fCO>D8g0^wwcoorE?= zoo;ZS!{PqF*>4Q0WYyvk?(ggek_aA>jhU3k@NF|e*BCWRbE5UV#wA#zioxXTp{Qi1 zcHLV5;M#Ev{C+RUWd}Ela#JkSG1_~!{o7xX;MfE&*+w`1jWi^+KZTcmji_(_ZmA!_ zln_=CjMXT^cok(QDyFgHboWZIlDeLY0(X>lpI9SH?GW#aDJP{Gh?CGxE(KkRHWVRl z$!SoA!)+Mu9mm0&M>q1l1W_5kmpf_+D6$rHl9|Afh?y~*`Zn=WY}+G*Gq4KvWn!I- zl%`v+Z&qik=suLAB{TtjU@Jr@y$F60ash>p5qevcE11X}cMohjr+Ge)s{c4HddlA> zi5ft(;*JY%x7lXh_5vPW0GOYbJSZ$ZK$6-BXoPg}If0@Cimeiq7RVnk0g6NxA(2uK zU?8(6a>$_J=y&{w4Ha@oe?Tv{{~VqJz3W%}F)+#-bO6`v5bRf5>0vJ?>HTjo+e4Oc zZ%aZK?%h29)l&UmQMkvh{>=$Q62*7K98?+VECD^tv&m>(L+-GAV+5JUbwf5}RDwYh1I5GL z6qYUwmpk;kl3oouOJwAQo#Dxa{YxmDTK%syABQL^81MAwxiu|wWA51}u>)by5cvRMg z@v-Ud1V_@PEaK@z&GM_1U1G(2r>r9o70kOe->L^n zuoN%0Ef9QV`pdA{9=HBvBBC-GbMT%v3)S5kMT;Ms1J3BibsTF6>N?soIYeO{{r5ER zh;;}kc|qS(>x(nn_2c>%0M~}2f8sT-dhz=Zq9JAzi8jm!9dQ&e)TK*cfeJcBK49&b z8g*9(kLgm{?5LlYZKmhDy|xX<5hlf61bM|Bg8kp_0>SC@%uEVns6PpLS4pYRmk|Id z%wze%&Tpw+0!LdiAiI&VkQ}53FXRZ#xC!SJRhqO8p&P}jarM|GuEmP0$p*1H+ zk^m6S*(ahBWF6lC{PGYM+7K3Q{HVW&)f`Tu6ZXMI;y!)=tccb9ae1yx?L#k(l?S^= zD~`dBD2;LtZs+jE@&I~n=t(4sx$2cEJ=kQmrRVojqy_}l&J!`zvcF3V4vQ&}apd==)BRzrEAWw`Za)~uzR|IkE2!bFY02h}2N z&LCXxFMy`2i3(aPqZ}LyqmDizkCp$0_8bnSU%Nx_Sk-8ZaV3NBzwsl#G%aA}xm#O? zMW((>{E5ykw(y8LsT;g^sKtJ~JJXLZY{UAPUqaV%i`Vz)95*kOG6tMo7o+ab>rjt7%|sv$L_n=2x)8zWh=c(TYlLJhffNxHNC25*9MB9N zJ;GOIP*F%^?-B&{(=89@$xg^Bo~N@fXG(DQ^E z?H->crYlEjXoKP*iY3x!D#P(*n*tLuJ@!%R<{2qPvSA|i;mhls0jy!zFDgq0YPp@T zTKY{1WpT4RH8sk%TC)Snune6myz8u5gjP^U_zG(gwllxf`f~q8w+`=0?_En+5)aN7 zq&ckXJ84`ujzLn99-^DEm|;XqOcC-cpTe3cTE!;um~?i1_6XJ_#LcD$?)D$Lal5JeBX0#zS zh%}>9CZ+*aliSJptM8AFmQ$lV0xrm7bR!b>#MDSDybmVKRLzT!HTYd;vSu_ur(I~z zeZ~_?Ari+>BqNNE`Q?;e;$ucG!9$hh1npu*)Ql6rG-)<)le{>Py;q9dYEkb>1pZjh zdyl~inOO{U`3-ikzj23u{~nE*T?YEs>u|QHf4vqD={qTck3JcR31!9TskT$v1B-`l zSk9QDM` zAvg?m+}OlphQ~iG^~c{C2ygF3uD>THQ=M8FfA5bqjpx*3ca#A(b+?3WHT72fzBsT5 z=^hM}(NCDtlys>y{SN82pTbC;{%$)1!t-c+xWz!TF}V1I;w$D$M=;<3EUh#sK2+CW zE7s)6Yln;35?7RCmxYs(;~8ctV_Y?-Sd~;>WlF{#iD_Xm&q(iJ=LAEAjxXr$_N4RHZYUGnt z@(`jWZZB`tk~rgEsaP$9w%Z z$xry%IwL%AfpLfG@5zA6YpacNXflzyt@fhKss+=4{W%oG-50UsZhG0)kTT*Cms|go z7#^PP!QF%bAn_}5pQB9Vfmz;amN2B(JREWkvBy2b%uUcN@}f+}2FA1)0^)?DxShEh z%fPLIQghx?1CP!HX-wB(HEpk~PQ?!+FR3N%Ec;o07Gi~5!i>&@ohEP7nxmRvP?iKf zz@N-Ke+3mU+^8g0W~^(jFNYQ^%`zftdN9S`$#2J;M<{nBM{yk5QbtB34o}uwSwHyE z7~bNCeN|~z7v~mbWw~dnj&rZk5-0n+8)%wo|3&gaxKS`BSM4%DTl&EKJakURoSON<?&hiax{}@z1)Mh;1Ja9a#I}><@_fUl(=>p9azJ1oQC|^KmSBXowyGrPhMM# z!;Xqwv`|95VXBh&5l980@dxBNB{^KJv%BUI~UuC5dszRghcrC1~MzKOW25 z8jw1`kY`eyLI$%H+^`J%I3t@WL!uRJtvDm{=IJwjurV^l8dX+KH!2?X4Tdm8j(r4Z zftz(`o_`O4be#XvgJfQ<_Sv-pimhiRx$*`p?(c}^l`n_QVa^2#2Me5sMgJ!3G;eto zUHsW`Of_=+H!vM@Ae8BqLgur9K#8$|e8y~@AZ%!Ep>dKcYUGBH`G4AWs89pW$_>!R z8s%MYHZOJOj%$w3Nz8@%MGt3DLbDET+g0n&A^0xTG$*LLlB;-F^AQ>QBIu(1vY zR}81v>Y2dSn5{RjpUnNN>1WGktvnuPwfAv29)<>qiI40ElCW}2j+9g-6FcxW0*iN- z5!1tSg^SM?cF&v4y#zW&TVoQkN0_JU$R2RhSVuQ9Vi5zMjqbN{eUuO5^H79;r>{A) zXE-6BUUH~zBG%2@Sq~vp^7U|W(~~2ETUe4s2q&M8Vieag+BG59*T6 z_h*;S5StQZPQ!Hc-=wS~%&DnnEY&Ox=?>h4t(%!ZmqZyZZCJuA5Q`IM4j^|3ud6lU zJnN#5+=F*(^m!@_@SkL>3!!s3`DXQ`0c3enf*}@4<2O-HlVBRa@xXO{$1(G0&MR)D z?7MtOPuzv0S`zmT2+g3lg67slwe#)5m2Sw-NAM-!nP46wQqmC|O$0^}*M4t_iS2x8yg2%s3rJ5%#kL~Khh2~{ZqY7w z30p5VIFU6-q>_iIyFsSY_>XU1!ys`?8EUj|qq<3&-{)L{Z`JZisDe~PCSsYEB2LgQ zV(xZS50YGSc}=bda5HljUgn%yv4<51!9pT?wkd8*Pr)m8g_s7;H_tpmWIn!mgft!b zpq%g+NymM5gd|^_bUl+)C1|@|%8~kNd95vSM@g|LIAcji4&jDX`cw%Fg_8J91k~bY z4&joh@R+rzd&^ z)HLuNcW(D~L+ehO^TqEG$}#2e@QBT_>L6TJG=r(0|FA{2X;a4@GIaFQhfzF@IRPf} z_(HT-w-P9@G~>i8&s$)>JV9KSHREI6dY=3|DCB~L6FBSbo`&hra(TXhBNLVZ=kk53 z0=9zoMo9|c5d2VpH$~G(9fpIS6}w;^NmgGU{#)1}RRdwW^k29IFabl>XwU#W{9g|d z8~Vk`s3g99pv~uN-WcfYoLV`2h0iWQ#S}P@&68bW-B+r=zYg$m4hjvqj(V4N`7V)! z)|#$G;`P zJn<3!&oJ#r6jX^}j0&!?k{vBQM|XPpQTk}OlX@xD3f_>9C@It)ZMi+Px-#-mkKXVx z_B_%bt7Y-1#CP`juDn6ZALT+A7n<#A`aMWdrVZ6b=`8FiVd3)05!Q$GzdDl0V37v0 z@QN;}kYkxOjVVh>_v!!S$u;vatLVo-q_r9amchEVFhvxYkF2Qb-_V0PhgVMe)z`vfcX~#r`^7Ts;48!!0*&ynjKx6h2JWWao6)%DssaQNeNYc*NIV`5b)hi5%H+;Yq`d70|jp zf2MfL9t)m7OTXu%)PgQZ`G$MxCI$#Bf=NUL`DL8tn*A@&do6!0al1>dhmgg$voqt-Vrjha`pJhnyb{TD82=zl6h0JfgJad?@9~~) zO*jiG)b4$Igl}CxfGts}@)2B5f*C~XI7OE3r6+S`Evx7xkFu1YWEV>X^%T|1dbrao zf{!Z8G*e3T!C&g$@avEbLH@mn)ctN_;8^5x^n9+gehFql)f=eWG0IidKhn} z>(_!g76SMCxAHVG)@Zy5UPD=46V%vMKA)RaH*A6)GrYCD^B>q<6ZKp8U6ka2)j|d* zac6gaMOpq>kDfM4V8;nKWX-zS9Sni;N%Sq=ALiqrGKChb_G@&dgZO~XRNs(wB(c$a zKI)&4Y1|FCL8-q0A@=AvF)|R`jC}>9dgAu~iDu>rT1Es(xOI}yxo&%8FZnn0iy@nZ z_{O({&X0&8zX#;tgY+P6KGsJdt%)@&*~4be++LnWYvKff(Tz_vs|BGa!YiMGbB9q7T2n8JHk2uG zE+&WCO<$6MTZ!R{>1$}ntl;(H-WbohQM0U)gjYa!Cnup-&$$;LsakRhX z#ZOfJ9*eR`i}>odW}4q1K|c~Xp9CHLK~3Kg_UEpSy?UL0X)0k~&TO?yctpDmj*X!%wG88KM&RHRuCsBaj;TTPfs1zOy*S`lE~D&^Jm zk#TX<&?ltb+NiQ-oAp5ZmUq+IuokpDVfyuL+9Q8aNa7CT>$u~cQ3A7C3DSr=Y0IhW#GgkHe#=jvFG%31t$b7pQRMR)Ym@~$#=$)2 z)&zXTKFHy7j*0r--26g5_15M76x_LlHt`fT9^#aL!{r5Vo|yGZ!NT*@|KjQ^s{t=vkKIj?d!8=NhtNdj=ok^Cm?_XUaN^7=%Y2zrW{RGm{d`EygbTqzw2z%%u5(K~Xt7ZufT z!+!w=$JqE~d!66Jnz-)sX{}m~3;~=0ngWSg9Z$169D@y^gGom17F*E9g?C8lCi7by zeox%vEIiRUhE4+A%PD;c@-MyGNQcaK=kElxKVi6pf5vRLdd#+wTP>%GK(gzQH6&rv zIM{LZeWJ@*j^lc89-Gqdh)Aj^GCO(zG}GRG;JnDaTW_m zaH5u{fDr20)oy&qF-?x8LQA;r%lg+3KS|0&2TxtL)G{n(*+N1^&9Lvlb9XGEcx90_ zdF7R?TEssuMS>aw1}U5D4eS-KW{Fuo)il|~FO4(Z`$Jne6m_KP{b1(ftzSNft~#ma z3{7p_rF@=fKqv|0Yva(BoFM(daLA0vtogkoyrpVUI`1P=^O&?_6*T1fIE}O6Ql#6Z zl{o6ZVE7o6yjJa)t0TGpGzH_t0=G!&*9a{uCqsBy?$DBo=`j7$NCrrOUXhF;vB8D} zcM56<3hOE3CXt{K%bXu^z2|*nM_5Kpmz`=w0`qfIdyM4I)rpN>M9FzZyez|xmDwOx z`ktnbDjO1g!jX77*Y1v=6;yk^B_j!#nePK9sRj8guJ4i2V`gA)3XTu-f1cPSAc)WT z$*%uUv3Ymod(`l#9@QO%^K)OlG&FI<@s&g4+|+Tw4Z=v7{;G$aM1YaB+lWWhL>>g_ zh)^Dz=EUxkpH8=tQ>K3glV{$BS6E}10uuUShoPJYO||Q8x%=;av(ZAtud}<{z+ZRH z8`7N$gILr*4Oz$qwsK`vbKK+PD)Na4aT8UNJtbZ93*cFX1{lileC-1lT?Ym3Q0ALv z$q#4b!h1)z=$}&Ag$Wr7ynmwqO}>x?rH1k1*A09_k~ z=z1WS=n_)%^7i~&b2DG_aR3_gg!-^EHRkJrAOe7I{9^q6^i%cR+Adx1LDLyk__XN5?ug3$!%E-ul|gX-J||~ z6=J8Tt-8H|B^9C{{0QAuv=l)+G?6NfZ5v0Af&c!?YcbcLsH5O>MJ$^FFV^~-E_ouI z#1`Rn^;`5a_o9hy>fvpj@7NHr6S1fx#N%YwXa@-RhAvnNZ%3i8K73-D_7qZjCZ=3B zEUZfZZ&Xf_`dChi`qFotPu(@XvsXV$<10FsQ=oYdUy+PNzmoMJW?~f-Us!y> zoVof)=YX=pSk}zJX!t#*Mb&J^1}J0W;~8dY-}$T!?F>0I-1$2J(WedaOh<=^NsgbX zi+X}KEviKm4;Y3Y%v+Qu;jJ-Tf7QG!k$c>i({jt=BhOj;FfL_so??GOhQGa1)3ey| zy`(sNoQKKBqKX6+3X6*CF>4EnI)VT}hWj%wsC8}Y6sOhSI_9}iMeAS3$lSo|(}lmj zHy2l?0e>Vg5U%ujU#aYxdDui}t`>IHYUvKg=d$Oq@P7`l5wm_htHZ|tb?jre5)Z{KR;Y(s4hDKZ)l6_ zxdp&`%5T3f7D`d7zZVx=9V=k-vA8Bd9a6Bc9{~D4qb_i?UJ!*4CHiuL(;DwpRcG5f z!l*co>~=6EiS# z!8l{Rp2X_;`vN|2Z@f=zUXJ4)-!{nQnPF6^s+~sye}gJ?%D9mk+=iWX;s556$my}_ zhCcC;=OCCaz)wK^`H3Tz&;63h@x3_G*72G|suoySc#qZLD>ntWD;?CqcjS&|663+v zMd`T9y^EIC**;2eNze6EQnp>vxSvQs!huhCb?ZX&&NcAHUR&;sS7jqkJ_6e+9M~^! zZNHtACg6UtX}dY?BL_782^l@rqWOJPJa|=h4 zaIThVA_Vh9DdvFizhJZf_{237Gj5DKfD5CV6vYctQ7U9 z(K%#zCz+|*2hr{P-krGNOvuu!kuphHuZtH;_4o>fdP~8(;0%)P(Xa!9Y9rQa(Tu)J zZl{H*>+vTeB_znAksLy874rTcPe`QLU~rk*$$_m|X(MIZD`)Sv(9e{cFXgV$>x6(| z#?&m0QMLsoVGts5CND0JF#o1F1eO~`J)@O*vDlbA%Qo+{N|CuV!e4Q!7&AU2!btB|r(YP4DuB$H%%vSe?W zTtYHZa&ed}A|PUVPD`{jm=!nxqb>Y1TH9au z<@h}YcUg~SR8-b3t{i|S7NK5>7uLi}8>DrkB_nypOAJp#({@WUFlfJ-=!W>Ti}!v3S&l-zxVTOEXy(=V=(d2&24tAyD@|@V78@_GyUD$OE1ka{1^b zs8A6OLK>KuJc85TkQqb%I!clL({`2W;sBqCmy5;QVx2U$ zxpaukA+(qr!C8uiSWbEoF4Y^#qsvF{l}5|o+HDE7w}%2xRCk!vQYEM-AbJdd6JQx# z&jz2_p*MhG`l{7h#*X%i{|!Q1g3!F4Rw^kE;S~+!9nuKeHZDros4wMF20Q`;1(`Z& zK1wC9s4>h$&oKB!fUFjWW2zhw7+O}1r@B1V?^`E4-2LHkJ8pJ}(|yO{gSAsUZU!9( ztt*OupcvZ377MADs~)0}AywCWCltOUjI}q=OMBGx!Bqb)2yGmXZV2G+7mphp9f%F@ zpekE^Y4YcNip;)x)>s*^!zI~(5ezml;im_@=vGP)>xm``7sTjFpClNYjvvL_6J`u5 zVkS>`r!&Z&WO`;5o?(M6_%AHQmIb@)M5L#n%{t47AHyBsY=hFJV0KtumMf*X1&Dq%Ll}b%#~{J`y)%0x}PtBcnWZj zsL28xpQq%K53={79YvbnBA9C7=nYY(x!n3Ml!tJ`f7j;rIIR#HcmF`T zO1Q7tW~_aoa2l+#8HH-TS`-8J;|`l4xy0oBGBUZ(SWX{G@n z_!L8(sb-r`+tN#&53$)D+pe0WP-<%czt;}AWgZPScN~eX8zX-(e|RRLTSj2`*1{3% zP>uW`VK;h?oVLQ2Bahv!757s5H@>L8j+&-3_BHkvI{*qAJaFvMX=Uy2b+Kbo1>+;% zsb=QQLL#*f>II}F-dS3Pw^)ZAXaW#Z`p~_kY#_}I4I$XA>?I(fzPYRk#-cko;NxPX z=jNV@TuaIYzr^CXAZDm2_k1_an6VeVt?&^02hGM$fRAPwy=Ap6G>ic@1$ZHE`?A~T zIwHf(0zoEKJ4x2wWD=nhLy9eN?P(p;rjXXg`_C{4H+SQB(hwaj0>d5Pm9~e5@duk5 z18#u1^^;!Q0W$AqOJSvqNt+c14ZZ9wk^ak4eEt{2{xa|y|MT^^YTHKv%=N(Ik z{~ZPvPqXJ-@h+f`0eqG0HL>XIMXKnPEk7#toUv+ayhkZsMZIdhbhhT zTA!VVf7Jai5I9Rb_vW$r=v18b6kW-;z?SinJR>vM&Qk=ZC=LM;(s@DsxYGLLzbF7U z&Pi_cZ$Dj=Wb*dLDQ#}$`;)l-9jzo%-Zh$NrPsmAx3ZcE2_F zEu_gN@yUn8#?aMG#D>_VSR|ZIZM%SbQR%eX z49PdUlLjF#LzH7hp6{a9X_Sn>w}~P?89QZpm>oprJc}QOKhGN2wnhK(<=NF|R!bfA zDoju{{STM-;?Nekyi5P?f?tYD_kUwECfL61^z&x`4K%bDccF+OJ!Rj8L%vkdrt~X= zA!;wpZCbX*GQdcBMHb=g2S)`Bed=6urAx$*LHsz~Aaxs!q&d%?q-Z-{C?kM_*$23% zP|6#3eomiU-bp=Dr*q=}#8y9NzR3s|wkiFC0&*4j%Lh2}Vgfd;*ID#~iVSmqyH0)r z&bd)P8dIa13C<09bCvTZSK7ZtG>gh4QpdtlzQ~~%eGJ~Q zkFUUwUIehRE}!P#TTwhBn_+mx zStBu$t14$i2zUdHW13%68la7vWKF`}`2b_7ntdo?FUgo`yYxihgx4q_UTLCNo;uT88_oeJl7kay^ZLb&){IhLnLLQJpv`%eKjM6Or zBp#cDar&jTdA{X-tT!1g2c%Vs%%Sskwx>U%dBV|b-zet8GkQ=1bvF*Fa--QzPh+uw zv$l;sV!mGC)SQGK)LVz98HPW%eRtfdooh!qe~4<7b}ZH@;loD)>B0Se;;3u@cv>fcro$c`78O*dqv)wZX6 z>0ogI5bw{+XHNnf(6DdO>&qjNVc85rD^~U*pudG0`h&(jV;wu4?>=%o zAUYrFJ|iB&2ekF}6QlW(I*?C~%9FNg2Ac(=3R>c0qmk8nr;CI5 zMrr>`mqea@$Wr!GT+6n`w{PmM-I9j?mK->w8NW*AzE!n0N(p=-wdhHABX*R>;vw5H;DQe|k5_x)tn9-^ES|{fUN3PEkjs z)Kc1e1vXqfHA!At%?{a#cx!$Y{|sNscM2;~tr@Jk$b*T?)h(@MOBkva)oVe-3K4KQvAZkO5 zZ1(_xxT#b-d%rp61(809XheD4()#T7FHwLr_i&%}a}sG$n>!pgf~~^59Y^4#dOk8* z4YtlG-iHKy2v2oR8I8WQuhh=$ar{UrN;PG;b4J2r^P;P7{M}`5Kt?Jc%#@aW7%Y#? zVl?qOi@(RIMzok1kIJG9I`bwg_Ya)7WS2&CZ53_-EI$rdKIa5-=Ql1W?vQo{8yDHq zGz|V06MD+)JMBX$f^1l(03D=Rgr%Ck(yEQMx?h;HC}O$-S@CO6p(h<1`CE2zkUeKO z*CK2$llRkU^r9fO<(^~V>0n$9Vr9n3QhD*p_%gWwx^I#q(~r~cpJ#AJYp&?}nKnjCw0Ue9o4?yEYTZ3FPW^j7w1=P^7fG(XNO-B77tU}Qs{|}z`X+hA)N`%y zC7q@~j}ur~|N4T|*3?UA6BoqYAeySJ3}0xEe{8J68ZyaUO8s9L4s% z^%krQ-+Dd*)`1OJaCZ`7tD{zl8-v!ZT`b3QYV&xG>)1i*7Xh_+=fJqMN*FY0{VDA2 zp5rb>!_`tK!QqTLbRe$g7+6?q8Q$~@Y2V#}C0HJ&rG0dTZvWB;0-ojN9PndvT^hT> zIOk^^9recTsA}X!P5+y+u*+VQdLPV?7!QLSAEeD>E(+;d0h2W3Fs`^{Aqu_4@JWS^A%q9MSyz$7qG~{|lsuLwbk2$^l2Ks(Y6N5i%BT~m9)Iws>E^-D07Sas3fzw37WHwEiKTF5^?7GNF5 zWsN(O0-}B=*oy%7rfal|m2bbd`XLa~Z;8e0Swm|Z`=+j;KD5!IP0ef>aRM^M&->C7 zDP|ErWb2N@pa1_4ylH8>&A(EcvMpgUZ>C_axNUQb*{%dk>u{_g z_|e&fS3Dxje{K8t+?&IZUc1NcA_LOE=rG?=fN3>q_MeBuC!xvh8<|@w>+f}z#dY9w zk-oeGmaq54@Qh1Pu;QecH5^7R2N(^-ie7)D5l>6!aKv0Rf%ws6F?X8*Eyg&E{FqA3 z(OA&no3QoYND0jGKQ>bWtQC@f7S-k}!CfCDF>z-ioqE9A3o5G77gjP2?RiD0V&d_H z!$K6sArQ2b1|#E~2nAw#xpL<=7}QRwwC?Jsl)evb#ZW_LUXgeGji;^iv+XlpUvX>7 z6xMmKaNzWZt!yta^^cK#+P?9ylMH?&EhzjkQdP|2ECTw&h$siiK%o0w)B|y$_C%pP zbn>Sf#dSlojW%kPY74P)6kFK2LH^n;&y|c%AQ@`ID~4b=8YT<@g3N&-d3vOdqf{G>BrU8@tv> zrI&0I$`c!xSdlg0Q=7%oGZc0T`{q5d6bv74R+aRgS#?o2mM{M^T~7a-BRd-k}$d-f%;12RKnT)sQyB&YnyDySeX5;Klpf-xU1IA5Rdf2&yR z9h>P(1MbCe6ks&izp%Rs08dQpE^RAZe4MY}UWoLF{ad{StIa7wT_(R>J+PQUte_u$ zH%>sp_NAO?hrvR^4H_||dI82_Y{jQC#mllMH}_-fR*HrnT=YiX=4@cA zbo;>5$iyqsW;Y+;lq}3b`{*^pk5cSDX-RyE9G~+V%dHmud%>PQdiawwcJO;67oKx7 z8OLrIr{9C!UAU&QzGU*L4RHPdb4o-qoQxrz|4o*I*=H}%QEv5DEvxcSk9%aNjpnHp z3UH~S`TAF>lt%MB=K$NOPllW{_7&C@YgfK9!auDENgFrPdaQ>?+fgB%VPREUq1z(& zNj3h@Zlx6D*X#iCtV&}qNfu`b`w#dub&Tc=nZ8n32qS7kXJdO4{VPUL0exF>qQ^<; z+M%nz68G9l-&to&W%|&y`3#mHnxhQ~tHBJa>|d{H5PdQUCmGnuBn4n63QZm^S=Yae z1)vhJ$t`XYsyO@=b`Pz42K;Sl96~@$OO0M0QS2I&bJ|=HmdyI-&8eF>k@)P2vlYGh z`qMDZiZk3-5EAi)9>epcc65Ez2PrM-+^83_91ZQ1J)hjY`V z(J1=y&7))uorrHnL4(k$2D?9t0mX}RcYvg zAGS>aTlXr_R-X!~ZKNLY2=1h`wU^t|5X@ZL%zk&!wE+`XD8JA*i8dXECe;+>HSVYY zkIL5s6!2asMY&^mvK-Z!kD>p-V?(nZn5fPRfs(v?Ee$pdYV$~#K|56Ie<){qMDf)5 znRQk^&se>b!p#!H`Mt8zSu{KYVNy0k2+ld?unS;@2s)VEn!CTP{%osuEvSUA1+VJw z9)xbifT1xW{kSvMQx_?Avsy@6fp9qQ40tQ7A6nt;bu56HRb%b%lrxsQ8K!1$m1bqu z6i0Lhux39+Q}bLTycYf_9U7t1({)_8Q2e^8Cw34n*pF)j$pS>D<-%Z1c0;o=-jQm} zo`Mz}&_nD8H@tz_1?^U0B!VSlE6B#eXXe`rgQ`Cr?r_=T4m)4NviQF_hwV^7N7`>a zM~qjrK#gGxKIPgmgI0~%Okf|=#VVviEB(EJHIb4>%$$?zqIwIg1#eIW)L%oy z5upCE1@#)%gZ5(RXu;nK&|P{=%A1}$D&>$hfHfDQHfOBxAI{X95fYr8uZ)~o3 zZG&-ViZbn2zTOf_oy)7^kv9d+G*TC)T&6+coAF{#EP6Vc?Bj5`v}NRDx^NFxDei(% zbWl9<;@;cPGw&hQjFmUj1q3~ibl_br zjY)&o45)sM<~2$V#wEwoSJ}4E{7U{C#FkpX_I-3H+wjvMm*Db^YH(h>eWnH8d5r`n z7+GTHrCF@$+S5>GL&azYNW*t&tIDy&0>&q@f|)m9M{5JePY@W>js z=}6!q$+Z^c5$SK6zu?xhAOX9c2T<(9e%bK0zr5!K1X_I~bt^RXeE9rviS5#gc4N}% z_RRM)-awg@>h#DMFYaQ^B3pbTdvRLai8PdJp78HJc9KGAU&M;i9W}XLPS=g%Fh#bi zNUo;!{jgPbM7^?5YMHbv9`fd(bUdDq(PG3eZ&nyPhU4meaGKs0ST1ujY%hya&uVl# z*QIB1by6moeCK=aKo*c^2>3d+p`q+ROA3626ixHzs?6UsP!fy{GA_LhxojDyOns!aKw3Q8=+xna_s0Wrehh?56eURVGS|V$XSJ^ls3Jl{Z$?MG4 zW8&c6d9`-13VfF-{gcJ_J(k?U+A3{`4;8$!-=#RF+gN8Uo(ko59PT z#gB{^maE_RD(pLeYv|HbHF+bPc6k8#N3j8zv)ycclko<2h<=2?&}8MN13YeI@vW&^$~U6e)gD1*M2$koWoMTIh&jN z^=W<;6!H&Rg4FS8<&taZdm|Y>NDeA$!5Q_a-S5GEkYfAL?*drio=-9i%A`toYUo4j z|C?mSIyfzhzdGOA9eTYUw&&G1pf&?wUx@Vxm_v+z$R5aO0U95qaQQ;>>P7thX0Ih6 zed!;H<73jK&MnmOD4K%m*^VNg=YH@dT3nU(A9@^H7$wSh9DFbG#9F$JYKN{w|B1$_ zkov~H>P5zfmIJ|5mjkMD!@+Cg5?JA>C5%_YIP45EtXmYeoBvoptFr&!cD3Y)MEn;1 znxFBI?LUPKfRSiYfZl=o+#L!5E{FHp{&y&UP*;!9+rrtHM&?yB=QxT&TjQNXx%)#& zw;HB+)o_q60RePGRwY}C&KB%L3c6dH--R5Zqvb^~!^K>Q*3^&lLmIBrr~bthj=}ch zi4^l+K8|5WmJ0)qGYskJ*fAr(gRWOoRQ3#xnvrj_4>}pXD=ehoku%5gez_|Z4d&*I zDoVx(@25qlfDXh^<<)$DN!gh;mWvh+ID-eCs!6PziH0*Mn+&N^f}x|2V*s$UhM=tZ zzJfd(YjEIwI-P_fk&Yi z;J*cpJ5~1`1?%*sjj?l#?JEuD-Ip0mhucn`m1)GoO6eT&D2gwzK>aa9TCzZbI|p`P zsAv8t{fz~A%BzyH$2aJ3b8TL!*V%hq&mfx93!GRo5ef-^awEaMQ zn{yxu6A3_Kh&3l-^F_KYu!&w-d^I~Gx-akd9+3Z)u`i6H6C~!8F^ORy1`i#8OrRYm_mrTjbW+#d? zk`88xcNKZs%xQ?El`iEwn(ln(rBs>~B9pfd(~R-L#B+$(KVw81X$7-fETPNUZ-ei( z=IwA!VTpm|w5Jht|Rw}pC4PJCC9D6avsc(~omi8(MAyZVHtbst{ zh&UVpIErF>5We^9bVi*BNFMkzS;E0J^PK&Q*$tvpR!yR*@({SO;wT`_fqYjZGqg7E z;y)aj2${1kg3^G$u^1u=_Z8}MOMwan#n944?c*)s|I$;k3+sc43k*tt7YNBHZ8D`D zfNBCzMlNX1c8Z6ArEY@XJxyO?Jiq+q-86}tNc-scdY53W5BKe9a+kCNmb(U zpCjnOU@82x1)9n1Auy0&e-=mte^#yGie2)zESxRrar!OWRD?ZwY#fW6QviXX-|VviG24D7@QLmtuXhGdrq5|9bc z1A1#5ZLX1~7$UIK2L|rduK-WH>#>>SmooZzY&w+kD_{bqy&D0e;M9~W40x;Hg3;~> zNE9W_r=lrNtno_+4>=D!{YB;(E)ld~Mz8tX5Q6D>y8|uEj1$#h)Jwcf--(ZTeD46m zkc5-l4&L;_vOKVlMnS zP!HeO6h7E4a*l2J^<@<1<6Lh_!i3i(^}6Tr&< zpvATGp_+M@C0_d=?38!#ytU725~yEy0V+uZAinim18rIJhGp-7k1rq4%3uRrFn!Bm z?h}Ks1-d;H#l8v9dh81ad>_&Rk?EE12P+7wVk5|Pn{2( z0ELeZSSed20kaD@)2u&1^*b*C4OIKfPbxob%ITeX*p6%KJU`F|q&iDB^>KLAe!_c> zfc^rjFXCyY-&v2IsClKqtKWa4Z|@dO`{r8vki)zH^2{ttdzViN2!xS^A8R2s&1iVD zHP|quLplT?o;hv~b5U#hLn0)gvkQTG8k3Pd-I`&d_H=!i$F-`tt7BnU?Ts?5a_-4!Z?Fc+RPhlpmsoIBZuo-HX^R~^6nI~ZHE1S z2abW+_m%|M;!w^f1gn`|j9}p8KWV3r&NP25<}kO9Ap`iBdq`QRsFM^LbbX5X*hY8e zQx-iG5L|9_Q}b`FG6CT$;SZGZsH^8}i+}TdyCplwiDqRRO90p001D{3B1P>47m(0< zOB8Glm{uBp>-OAJa@Yz-El1R@58z}#CsLtg#q@+C#ZQp!4bXH;hVK(wg#uaiM=8&n zfdjGOiOmxL7DksMc{^giV_jce^f~~rP}@i|`r_}l)#ZzZrx z4PnUQ7DL(;0CauG7^8R^8;9Ks-T-}>)4>DXj#_*Xn}1Suq99i3Px~97O*U!|)e2@1 zP6N6dFkz;G(R1!GBM>khH??{5!V@b03i51=u*!dZoLVN@XYrSMs&YPaz1-&x9V-ez zdn+3gbkK&PmCh*3elF1C@lBcDCO%Wyx0l^2E<+m)H1<^bfWhV~&hnA^gkhF7u~c#j zFkO&GC6?Bw&TR^lL=vHStFXsgQ9unTq}Pm-yzy-5zS0X>GGJ;t_?X6M>>_UB7qwfL zBo9(Q_!lW3RGmjmC zBGNqZQ~LlVEDH_ZD6UgnP=#dWh!yfYII9uA{a^llaPSf{DS{ZFeiijHXdHhfQ|Vr)8~Uf=)Kz6CLwz8nzfZyfzV{wZ>s13;7W+`n*lrO@o5E~4(<9``*S7+15bZ%Uq$@7h{WtM0x?MA%#5 ziY{#Dh4z-_9T-?CGb9Y$Fds8N^cLV~o@FCVW>)U1Uw|Sl*Y-~Do>9@gw!T7zGx&hm zFma)_;ZO(npBQ8VmnJeAs`|GvNl=|ivvQyn)V%PGK^yjeg*@3NJy1zy4It8Z59*v5 z<$GT5d^p+GDy2L$z8YF&3%W&b7b~V<)6Ay?^&g2o%Lkz2JA85FO4JM}r_a+yW!qd} z{jW?j1{hmV{VCoPO3i<++oLB796Xg+QCe2z z9=h6(V5-N+_eR+kBl=TmK-17)F(8J6K+L*qo#|g3Lrk9W4%Yxp1G;hv%$Rw5rQu(v za7c-*r&Nqr%C{6rC0uCD7>6OS3riW`C}Pr*c!?VtEl`_!!OH(lnFx(p-jgtg!fJ$- z?wizIZiLy&z5op2+kX8C5fN}APB{V6YiUxi1>?2&IqX1LpkzY9!({XuuW`@4z!rD! zbgy^E+zaUSK^wx~dpWRHS3m2f{3mkBiV=oWf?s=-o@5e8Yud z#)d$l5yp=>s;T+V+Fn>)f6tKus=61Gmj*OueiwHF9I3+fYXCH_2qdyTGv5_fKTdW8 z&ot6Jagh27^hgDB$3dk=pdzY1pdcNimrlv|NFrhEzWlmv`*m;H(o$3GYZw^s<;)}$ zyAP-!zIVgJ!{SCzZ7p@l{qnBnTnVAZgZe%*gC(`0DZ>#$xy<-zC3ilK;dYwE71IjV3J_?V9f9=JC z)!`P_BkYZvPw#55M%3;NZt4eg>F>g@Mp}0AI!3Ed9tZ^A^NfNpuwHRi2vA|2QFrd` zFL63v3k{3AzFLRh-!YIXZJbUPA}X3uIV(6 zcvwFt+y$rzpjjK@G2piY^iP z9FRE-{)ba}m;)Lva1Pt(>r=9G0XBzl?^r7lF>7vHIb5i2SD1Pn_~5?dlgG9_%3;2b z%NFOghL1mf2=dm%Vm z4(EXI9ST+lpkoTuojQzeYjm=tNE@s?yjA7gyX)-#Yrg)H8J*?9!=!@>s-g@ z=DCfik@7q?E=B=GFbXap@;;H3PK+!@2=gR->My8-;Vm^>i@mepT@tNG$iE zJ_=@s=cIr+$}bkD>)FGAZdI2rqQfeeG1;$W zm;oRQWd3x$(|nq8Y%OL_(&GXCMYZry%$idwlO+uIm%f;_kUaHaxYWGcukR+E0l*gUq8v;!jaM#ks1_a(&aPnm8~a)dqkqq6TPd#{jrzHd7+-Yd2qsKm%%RclDfT+oW|{$>Tep;V}08sygi zMk$EVeq7F=y3dJ633K?`h4rN~)FwDN3U`PS93Bf*o{Q)wzHQbRv%S<9lXuUR@cdKZ zR`2=-)NoAnLDNp}Ax1ANrytU&7sKLNz(v>*AxOp75b!3 z_jQh~7hfSg{3L%;#{zQ|j2Nz68&tMKH+x>96^zvV|Pnn4UQm}l}#&_m}jjB*z!LAw#cP#$~o=NtAf6TjbR;%Pon`^ zzfB2h%LcHw?NE+kUt`z^oCHa<7RL9+tbDyNER@D(b96%O;(7C!qhg}8zhJ8%j9Hv3 zYev`yA&h=_&t-pYoiG>3`>54yErQ3HXeJql9*uR*nM|n=h|f#cBrIwu^KIpb5VB0J z{xcl<104-?42lO>4}g!0KVW|F^$|&z7Vs7F0j38J$btU>zBTS)Ywc+L-@pI9pL1X^ z9!o1q(f#PR41xQ*Tj6hsY^&>&4j)jgR@pGR#-;;ZJt4uA4q9?FHn9r`M`2OAyt5Q+ zS{9wK^E?rkwPBBOihX<$RJqNX>7Z`tMHs7c*I80>l@s7|=5aFJ3HMQfKf>ct2Qhu3)Sm^lr3o?Ta2vgMqeM>vEHw2R9 z3FA1{UX|6d<=1}et&@)m--R5}Gb2yUa|9$9HhrhBILOEXY_Hk=e1Fu;M>VDQL~$F- zK*1^RuVAaDnVXc+o zsPlU+zx~zm%TcOTgsE|TD}7mF_(I-`z?uj~g0^)f{AxL{^y}WpY@3od`wMv#rbfLB z8iyu2&FA(yifV2x5xn7zcJEq|lvX{v3FNB;p>mxm;7Q#i!tw(MR8yZtblWiQNKpDg z5E_J4ZF9JvKpTNm*AmMiw%)hQHiJXv96|QPtmOrmQ2phvYU$v+Vo*#IzhGgiv01b} zE#&gOMc=Sy(=AutoG24tj+F1+&%LwAZmGcY-RoY{y4FTc4JT|iDD-G9(e&@1KaW;T zyYGJfI1$~OWk2cZ>%P4nP4E7DB7RY`xkAa;<$rp*_u{+JMAHeL8?6zNOV?1eP zO~|NLuEkujjPs&?C%#_xarEa;mmE#hhqKn`_Gm=1{SmKv#e=KwLV2$?AxrT!);okT zWYNXXzD`5CYZcfX=xb5ed*Aah_H`~gv=+XJJvyt)SvF+~Ak`mR{3EkU=yuPRTf_*fNvV!&s=ExE%q zcElquXym%_2)+^BFc|lVq-eP9PPfKV3nfc=Eyn9ex+67HhWY}Y5HTwyzYA4+pBaA)jxAg>lZAV;2C*vcJkeXO)q-4`#<9M`?g!ox$ zDzcp#>Jc|U?b|Hvu8%Mm8vWin^@_zTmHt4zf@^5v`+2ZiIu4ih)d|e8 z=8dy!$a^Y|XwtR9YZ^tAy79B^tQS7n2}IA=h0(Sdw_<0&3z)n7Dec{A`|&siZ_<6J zj{J;WxB{H(2hB`Zr4G9=9{brnX1Z*?94FDW50NyFz`-MUgbInGynC&fU2f=b1j}5^ z6d^{ZP}b`t|F9L`KN(%ee*12O;oU=bEX+islN*?LCWrNR#o&6}D@Ja6AKRRjFD@w+ z?(^O+-A(3x{k~EKU z=a11b6^G6Ld0DrOz18mF1k10F!f@^t7>MVa>k}DvL1ZF=z)-;&^(8At^Ww#Op(lBk zg^`|Il(~q?8?CeViSaX9Z(1wbK9=HRrd+=Vzm8W(S1;Z*lsaCmoZS!Deeup99gAaW zhT2@yhE~^;TGy0Fp2Fl!n8{Lx{*;IQl+KUzd_!f|Z9INQO3L@!m+MNM+mUiexdLA&)k= zCC1Zk3LL|k;;%nwjbI5R!+l|WJf=K>sf16b=n5RUUImdz z8-DvJ%f*=KO5!0g^j`2Q=xqdwS~o|FF?a)7<#JcnzeZodx z$mYD&J2qzhW6{6z^W=^RJ~!yl>W!(d*IjN9;>ID+o)!7!=&Afn>ZFQYW(fFcP)}Lz zef8{LzeiR&=4`Ov1xxz41U@T)?CQunr-L|tPty*;M9gAWJ{ZK~taXU7^ZX3}|4)10 z9o1CxwHvC4(o{MEO7Bg;(4|TfkS1NE7YQYF=_-PN5~(7ggY+U8I!N!mcaRRDCzJrW z(f9lA>&x%G>#qCv{bsL~vrf)D`%Gr`nK}E}leHbM&8kfB#L$>Gkm`gyO(XlB|Hgw# zulu6Jc+;JeWZ`+VmND`0))|(u`GA6lU2*$3@6OK^p58ZP@87GL^-xwUo-NfIPrh>5 zC1XrRRdl5qy!5btV_hN1j$8L6V_$O-F@vku2i_{B7E{o?Y9DbJdfMffb?`W)l%O@_-xKFr-S$4%RSE&H( z01J0FFzDs8myUdPV5^s!t{`W(-)k^qIx~Ph6|+YFUy9`iNrz^B(znO5=#VOtxPpnO z>)+*q4Lb(1%0KFMxN?_(6(Oo=M-BSf+EW`|JC(;7lKxXb)PNKf`0gEGh?@AD5EmHn z+&okn$Kc%%k*i{kxHCcf<$l`TCi9P4Z{L}krGGatOnAVT9#ZUQ0?%8@WoF^CccoZ? zexd!*vC%?kD*Q!Xe4ogm%tM(K%->o`$4+EFr1zGN5ZT3o2I>fXGTJ(?`az0I>q|SE7nt~mDm}~R&Lor}} zJ{o=X9mdVf>bo(f1KqI!05SjpmLHsQruoYn!Bvw74Dxyy}&nyT=zREWe&J$Nr{3~=^t(cD*G}oNj?o{Dl@6d zzV`T0Di#r|m#nsme=XJ*WPsFq?Cl&q^XaxHsLC8i4v(e5y8TUCUE2j^O#zV z6jM}QnBZ&??m}Kn@bzmF&-8mQ!o{tkaUbY58GyC|p<9O6**n9Er|p{k650^sgv(w= zk#LnmuA_vwWf+ysQLIOZOga?=&UrTmwsdJO@<|9dKj)d| zN$Hcaz|iuFKO<%^g4~m>1t)dWEhQjkllI?C@>*eyKs3hQ7;pdp(mzeo+}ZhmEb{NC z@C&5ZX_}w(^)B8SG4`&&N+tne$P3bk9Im#SI37cXafSx+?2rW~+!_rt6lFx;iUhpg-HH~H%Zi=z23C03pwx*v}GI(RZ z!0a6w7sVLTXq{iH)RTH7PWcaZYkhq0w)mVsXt@=*)K?~VHt5K>Fa0jwZ7JG( zDcRX6`G$50168}j+VJIpStxI?^lEGFnbXA$$ySp}oHp3w{!sgA*(R}uCXRz)8Oh}b zpJ>&_cupk8K%YOnU*wX|K%4LtQ?BSH&U=VxA6(dMNn^(3KWEmrirL+L7&D&2%&fOC zH89?x1<1+C$^vW$a&r4+$Ptifds+cZa@8Atp^skU6Z)1pjOWY_OgON&Fuxo^rXR`X zCs(}DA5t8u7RlP3Gg#A%pE*+O;U5x3pJz|zE3I#I0_28KHnpaEj2qWU$ksVIWRLVf>1-*W`QpH(Fmgpf-SAk1S}LvP z1kYI6JW?o@;2<42OVQ>ihkrSs8H$DTK33rXlm4^Z)zIrltH(?A z{0~1Zzm-*%CP%biWN){9PUarW&bMjSn|V3KT3h6z^|}-MLo(E8*f3~g64u^kGt9+g ztH6Arv-)7(cZ4NQW(L17etk&vxNv_s^plob)_Q-|wn#(Qn&%!xTuQP2-o>565QRzZ zGp@sw7OQ}N9eusP;2A~C1oq|5uSx8$(KmOrkh3+nbNV&*juX93OuD3R7bR~UKSw}a z^wFZ>LN}NxMksh2T|X-`qvgK~)9gTTf^p9}Ss~rzD8$C_+C?6NRDk$hQM33h_=@YC z?tX5ONcX9;w+}F2QWujS^N>WlqH6YdE$3q2)zo8@p}X+x{N%!uB=ll`Z}{+XrIsVb zxgMUkhPpts!;v0drcY4QIo(^Xyu0U^^h(I%gM%|GU*9@jRL=Ba*^EZ}OYQMyq>fao z&#Q-yMKzo8>s|46cf#%6&bM}v7m=$eqH`+hc4sw+x)&O%8cJC?f|}I1=QqwS;fK{Z zJgTPwO%$tFg?RO!0wdc0-gmc0@~UjjG)px8i!@36r~HukPidC;51|tt(2~0=JfYQm zS9n27j$U|OtC?PSPfL|yDD>!_-{U_Hkw;SkG#j-4kWtI^PR*D!4msVoMK`Uervyi= z*1I(m(gfrl;lJ&XDab0Hdy`dOKgFTXQ8->7Gp7GFW^B9^bF7IO^G%N#6VHhmL*>V0 zuG!m^u&F5fAoVvO&^p8FOq=<5-i@kIm3W8#i-aF0Mk+;;Y%&|JaG?6HuR3+AjeVa~ z9dUEBj6>Zjz*WdEgIV1bYqfkPMUp%0CIyl-Dmt<2+*+pTt@6oXrnm9fK0nccu1kgC zDmy+-SGXk&c?W4pVBTbQVGmPNE>KC=zts;Rh;ON7CS-LH2#ZnPR!g_LW%lV^Qp*A} zC!32{*o-o_M!N5<-A`nU)VCp8_o+o8(ah9FkU>`J00i@F^W%|pEf8RVlT z(SGz|a3q0H+bn&5B(CeJex8bYE;}Og^9V%csZ!o!qFhEqhR;Y8L&tuGyhS58!bqCM zW#*aZt2^Tx0y~5j6T(|G?&O&s`X8!iZJ5sqK*=OcZ@gvFKI4yUY)*fg-(bo@G%WZ| zN-!)nG`OOW#{2sk|N6{Yt<3|pq* zT{7GmVoALS$`OLSum-FpcwYh+4>UA5#?AF+*k8&F&y1Q-Or)eqG@)@H3ZGd-H~=&x zm7enjyAi}xi+iejs`=ii+8)&Rq}&-{NdyK4i`}^yZ4Ck1`G{$1x#@RE;AV1D<#aH$ z!?1ST^kwe5`+urEP8j#lQk0N=G_E^y&rNE-2$VEQ(!()??0^LwF*Vjd(qnNR|0s{k zz4kamxtqYAH)5RmXmxNNH=Lg8G*AMR=!b>*&#|o&A*cQ0m8iK}nk^3094$d2saY@e zh5=1BKD>+etzYQx5I!ZlPWMCMu5G;L__ZC<&&RWpf?bKVoO`#gSx^&jh0F_HKT7pl z9CH?x$+L1se0&)lE#UQRKu_L3Jxkq)<|Mum&VNi?U}DI&@KD5H4q)-9KgMNTg1o-V zU&XrEirFkAq|u)~1$yf_2{*@$Rd#2aj*K8Rlx7Jw3h#kvDjTjO(Huh}llbRBx7G;U zTZ!p!THAP6*Wol9Sszsp+icyr#26D2nS4_{V0}p`@ zEU7&4Bgy=~X;R>5VB;(;WF%&}O;pl%k{NkO%j|+>B4p_j zHAj3BIV`e_eka=dDlmk+|2RT*IvkpyK`Vm}JjOpqtnVIrgpVXi6xwkmk;|uTf3nNz z@V(vj;dI+vplk})RXhl?`3ZWsu27vUQ2d5<)7cG|$a6vZ`Im9u@Z(0_mau?6ey%;X zd&2>A7oySSm77iNEHT0Sh)CTQ`g>o(V^1}7uwM#uGwK-e4acg1r{*d4=xbW zss!_a=<}N2(U*HfH%-)b19u$`#mvt(zsnvruHT2NersUiryO7{wEQS{W8MAGLzz*O z2U%YFS{0hf6$z4S=GYyVQ4ZN4H4fJt?am}PT(R}1J(Cz3Jc3JJ*M>9LI zo(Rqh)k-M9jR>ae(^ejnD&C)fEy0~CgG7eqP(wai;tH#SDC|ah`>hgK;H_p8>g4PP zB;9N^l>)QOKcsMmS>T4|WRB|MRWNlT1^}K*$ZegF6kvEaUF^*L{cDycNz8> z!BRW*XPuEa1oZjFDN(Y%;_*ORYpHQ0mrUA8rC{+F%WWz60of>#@rs+e5hd37jp5J& zvlGAiZ{-!=725+wFlHSYYa(rd)Z-P1c9jHx!+Zhd| zw-v@&{mi|Nxh}hwE^*5AEg>YPM*g|SEd4ySL9UQpEd3+9D*sK6vaV9df`G0qC{XG#TW&qn>r zg1Vq>4qWKHb3AIKhZVa8k}E5CS5h9^p$#rwm?MGAd^ar|0AFlVYnYRcDeaaZjnQu% zjNF6LUJAHb#@{|le<-w|PyImR zyjrxmoJ7HztWEmXqoJ_@-N${sXuH{$`(vfMjlAEzt3%yNOGBSu*h-!vm;!Poo=DA3 z$0N0kYHPsT_1*pS7D;n`*y8iC(;_>zl6E$k?lh|zh=NzfHD#bra^dcW$a?vs6L)TO zaV0mJS8Ao-&DMp|%v}x*_l(bvAJ?0cGz#cnNjuS#p+8XKIut+XPOout(eia^B{{W& z`w06JlFS9L(|b2?NZ%3+5Natl7Boevp01HP2P5VmO+iA=VGA8-od8m(#lm-3U&~lANZF8z!%m>PFO|h9u$BX*S3-2{q*X zGoANZ5{Uh^n4H4o6BjcFknVdkOnNqY{by;H7S`AB-Z$SqV)18s9?(y3xi3N1Csl6M@+gb+M$l#EiSIgbVlnTG(1J`28T~O0r1>(b$eggx8PKDE> z((@4k|AHoc;zmsEO+4z9OO zIj=5;?Px^PynN2BXL3oPDe z#NSL;PB+Q}u>pU)pBq}iPOl7=>PNaewdT~rNn%Cov%dwY=NiHsuGO5YKo3w-yY}&G&40r6CJJcXgFQ=4;YE~uobV5+Np&}EL$|J{VX_7M`G0=wSVvtUOM^qZpQEP zo%}3@p-dVs<7c_(FKos)(6HIihJ_s62Jdpe_CfJWF-KI=%eizhmD%&P?@zqy4V3b< zBQU!e{g8)ZtxkUHz9a8V$HQLvA?nVC4t;bJbho$o^DH6?<_d-<8SC2%=8Dc@4_K0! za-S@3)zuT{o&`zoB2cemN2xkn)AyINr%t?5AF|gIg-_W(?rWrZ!C%o`@NyDO&iS%Tm z74qDldp+2 z>j$o>;vWgH#~z>(qln3Gx8w7YT_X~6z726Byk@tw{9Fjsb5_IF;vTW4DaB-_WrBR) z5I-!Y5;8Y!w`XLb%}~qkqe>y4ZM(z>kAyW}?29p?80Lce zPs=68$ZFJ18#yh&B#RVZd29zy-N(I#fwhhTxHH%q!MYZ4eS*Wz3F%hzUwIER4K1&q z9DB$P$$YDpbj5~M3z5F@QO^GnLETWjF=SKVm2?OU#4(V;I?-K+VyQ!`a7?N@$>fNu zwbN^}BO?T#S1AyRp}6*DuPNOMXHNW>T)oLUEUY5}FHnMMTlWmXA>pIfK#M?m^sUD% zmN1*K0-?vFT#)Bua|Ur91Q8-2Op3O%Z<-!G>(nLX!Qq;$xvElA4hpuTy-?i4{B!%d zWE`^`S=9P>J0`HhIw?^9L>en4Q#bW^!1aVoNQ#!O@C6h-%xPd02@Ed$jv#*-(2piP+-8u<8GV4#Bv%=UCx0v0PJR*WY(BpXYY_T2`N4w zyS}F=qA!x~HjvjU7|^e9EJV_1wtCy5j|F65D;Xl9dkhv;tv7i}+`L#F(SEM<&?gYtPFA6(K9Hm|Lo!9&tcfRyd=WvdoI?RLp?kOuMLJh`oD3; z3hYE(5{|)k0xwrD@&4PR$HL|T{JqmEuM5TX4#VnD;s3SM>M!Qvzdw!SKu%yQC$O20 zx3iU-$uD|UQ}v$;Ds=gojxhDrFl0Q2HTa|az>u_m(L=vkp{qbA#+{G9_#{1C0D$HX z7yz(}X$ywa{|oC0a&>qC0y+G;_rK~PFZK(2kGWMlX6qP+ocN~Y!eGXCNNfOr{a|cNnElV@K^AG(Ua8dLZiKNkBJ{?7=*RrEjE(Z8_(fJ)+@9r$lt=~Z3-vQjFptYG(Eff^&N? zdJJZD$y4=I&9!E)R*(h(MFoHZAOQdX5dcLSw=o(B0LTFc08jvsz}mugw$7%u&iX1I z_NGp{^zJsF3G+aKDRTh8@1OsFum8mv=u?%I24O;Mhj|SlQ$HyBg80pr@7_U05Ui3Z z)m8XP)U4#B(~Z5JSV>z7qwVv;*r=x+c`ZYJX^`6-k4YU9>sB3pIJAHC&tOXuy{t2E zj65NwZb}RgRwF3Nik}1G`M*tp%Q$%qNVM{tsmKn|+j_XkA=_BO7HPJA@g_#{j zb(;G^KSny1MZ z6z>dtdjkO|{I@o)S7ju*ewWC+cPY$!8|yooes*G@|9Jm@?fbvDXa5WIvN&1!UPjp9 zGl}Pr!MnNDSVSRdH$jP3A{B36$rXh9sC-hK)lLdrL>24+5OJS&@8{v=RoL899& z*0Km>R34HBxANfRM+X-OYI4UUF^96vJ|x$7jKJv6%~z zYQzb8b!;e#=;MIuEgd``@{b@WUVGos{)ic`+@w--X#Lx;N7ooSa zDbygv+LRoX-r!vOKNB6#`i8kNY1BkpxNqT_LTDLSK`?rMua<+kEVOirKkLMSSbwmyTV|E&iAaQi3#PBzxb!u-`F`5|!=6rIXqvTH2Wg-8 zW-wB}s5wefn4b)iRC(yT%ePG;E8@K5iA)7@`@#G=R1qYUt>qRzR{$!Z9P*{*cMboc zH!QP@FKSGNRVeU>ZjRpgOa(0Q$#Kmw(89)N18=O{oO9AAXLa>7l@?g%31bJGC^5& zKVN#KR_*%5TjO1SWiPPN#UfeN6Q52d51Ur*-5Lxs@`iz!>{Jgk&X<}pnxinueo>Z& zA*cqr`JKFtvEGGO{)voS8!Fj!f3-YA zw3@ODvDSRoxX@slRmw0#f!2^kuGCLwT_TKaz+3{yEi_SFh(Tz-|L@P#mlbAFdVUgW zig4GeL)!I%rB}imR@4No^FyMmzE!W ze_`gTsYSK%!f7isUfLM-m158koUmQtUrKzLPd#qM^4e+wGHS#BU?cDh_;_ za-NNkMH6drQ0Kr}iT#?@5`$#=L z?DfJe;R8Vf{k~(Zu>I_Xk@z-Rr9iYt2M)WZKxA*x)vEn%nd>ldXDcb=?;J7M#_E@F@%RHkNEpjdkun9Ydo@c& z?C6jf7P(;xIRC{LIg1#TbyGi`x4N_r=8hqMNn;SaRn|@Z=>{?qr>G3HKF$UoLZBc4 z$RX8ry*oL;90ZZ;TE>r;11((Q5KN-Zh4H8o1ScQ?bGJ?n1pPzwiRqD zS(qiACLk2jWE7D?T|BCX3VDATAN67w3Gr!a#V&*)R>_yo;`2?N zoHd&Wiau$ItAZ@7U#qgk%|_=-m;3vz4C(4QWNBN{(wZve-_keP-1VzLqH5DY;NmMW zt|CBeCT1R1ZRV5brF$6>0q1VrXNZ@!l~;lyOYlYT*z-D4j)^DBo;jf) z-2<)C-gnPt%+f)@(;tL#pmygi-lWRZ68zxT~9v7oh{R#c{Oq$yl0 zWA*ApQtN2(gpVQs`lC>*RV>NphhrT@rWid_rtqdvR_1T;cGiPW=w)h;wA0;QhSOd= z=EvWbEiwJ`zwabT(E8N*Di-pB@l%H{#(PzZn%@fk+*N2s-3+=Ur$aKt!PFE*u!@Q3%f7A%T8K2*BUN`6}B!{^T`n9vL50;TK`;lKnsCi#L4F_W6Bq&cgu!?|&bI z)5+Q6v#HZZdfL>r?Uvb5y$L4YJ~6K12UE8!INJPjR2x9j%Ao@$1p%)U{v@3s97wDi zK70)SbjDLaDlK=!DKWE0v~}Y3+xue2B-6=RTD7|%w94n$P(+kinLG*U^@`aw7!xfm zG{K(AB9No5i(HS|@(JSAi|-G7@lJzWkz+&?$Z z+==tbQnm{#uKl6WVPRG^Pa{CtCAj&y3H2R z5OX81GC|oPW}s%dWfMaU0}gL?&A_VZb7<9>tk?0}+f_`qAq+#h>S4df2dPli`4u^* z@Rmjwp~$ho0p%}TE_v1KbiW17VoU8h$1&F=_}j-1!ily6T#$z!f-KQ|Otp{k4JvEp za{Y>oBW+6JHT{WiYI;i9eLIC&t-_w$MMBHeyo{|vf+}2n*H6vV&RpNpY6}M~lQ(oE zWl?N+3U1!`H$5SC?iKc6N{p6~vX$@~t#^m_@SL93@{gnD7X^FI?$l)AvJTw4=6CV7 z=f?J9&(3mAmM$0(mVe?8f~eFWukSi=JaaSQ9J_fM_db5lgpIAo)Au>wx#U_47si$`hMpDRb^=wwwFVb%6VlaMO?#+D{;011DTp}(blBP zVc)JSZ`L;TwUJ^`a{Sud9%?$C^hfidF47nTi+(cpq%QkLl^j@#r1^?M}mB32fomeCb=b|cs9f9?aTy5QslEc zj!5eS29BNcLpBV}m`EL(A@0xwh8=VJ{mn@B+clLe3yf3#^;JLrNc7vwJ=4wICE;}T zR(|C9E|VNQajy?~Ys>-DH>32^!cq9mfzG$*t4@A=5ky@L?+o$9-x2z+7ZWfvG5+gL ziwxqg4`=%H9bQra4B0gd{R)@22gbL%GvaJ2aK9yi^(?(mz*1MVY{{8ZT`6o|8v-_c{ZCl~# zR$}s51qS;LJ0FOm5nYpy7x`Lw_L}9~EEqdZ;8$%zt>|*0J&5xnQ*b^ltfF=7<-jtx zib46Rxw?WqY2D%uE=$xsZ(M|1)T;IbJu4P%5 zKm&9TM}st_9Bye|SEl~0Y!|*mWjl)0mH=3B?A>QK!f3O{it5%@x zbBZR2&L)b}DsihHGu3w435`T8Vc;ZN!-82aYt$X|mdxW5CHyv?#}7T^h;oK1G8(NX z9FgAcykv;n@S&z&*k>!+s@(mBoAWzf&O_9yAIy z=YrEBg4&;V>wYl##e(43VVr9y3sa8k(=zxHo!BK|5)D#by6FI1_k@lfChU=(0bNWG z+I@RPAX1^ibTRcMgDAsLzBtTS$==NiN)#iSZ_8cBdl1MSO`)9t8*Y7W$UgdTLoRQd zmQTb=q_0`_GO_5f(@hEw4*@Q81~-f8-zuOAn&u9zV3VgEL*}uD>W1We0~}_l0)>xW z+AlSBq?W90HhTPJj3Wa`)lc)_?GzyQ&oqqq=9TDd{HP?lT2zx4vlw(+i#!wf+b}@& zg);mJZcnUid+B}fftwO6+I9M+V`VawS1BkQ&labV>+bSWWW!QNp5vSrd-dks5r4C0#B^B5XQL!%ICs7Zp z7iH-LK%q`r%wE%1>>GUt>@vYbZ}2w>_%TJfq#!zfrv_=*Dzi8dO&>OKs_IXGI}(W>Y7^b!PAElzG4h?oor`n4EM{oz#0;@Igw zxt&>t<0%2Nk*)_2)~Id3uk6K;RqU{YP_odp@CaSopz$>A^|>SyTIwnuct=l^MMZsR zCQt^= zHJ0+Ah5J0zUYI9oB+vTBk9 z+q=1H$RX3iVqS^oEhZJ$i`*JX;LGlAz|(C5FsRhX{bxI2p5HKMGry= z{v$vMsVP;;yv09lKpWKh@~4wXWls;ZOW=$!z@T~TsuyHB>XO}7W#tE~P5`dd62iRO zke*Y9ePsV2KQ*Pbhr`Oke(Jr7n3VFv_vfYQ{#tK{W|9oQ-MlKt+0arMx(PpV2trsk zh9gu=nrbX2UB3KKPLfR=#4ob!u}k4jR}ZkorItCQ=StAQY&X2Z(Rvdp5h0jKI$Z&W zyhQ~i=VkK}ygA4k#ct{-cwPDijK_K=RcX|b0gkJ3ni5di5;N&%ds@d(h`*S~kp|kO zpsXWKYU*Pbr87`}c>MT%7Vi+SpyiV z-sjypRx=6S;uU1MD%!GAEd`44BN4q(!TNOsfVsEHPpNx(1^Ga>%scANj*&2x`Fw{` z8o!j)ov6bz@|C(r{3<=@=Kck7l+@`;H$VL#`M+M;B+|fIstxA4}1FctP_0r?#w|cag+dALv zlD6n%LbarHmW?{hMaFpj7}CuYaRM(pk`p8vf8Vm?WWgB!P;216nH)-P?I&J zGC!>@rGHH-<$KvZjb6Tnq$eGSF)JzYs_G_Oc-?(FJszvv1FqOQC(^-24;1&qpaxYG zVsg}6bDou)wA}iu`jr9tw|fo^K(ny#BNfsv0tIa7wF=CJt~0d*cd^z9zsiz|dj|Uc zKK+Rl0bV`1haX)&lVd~Y+UULD^Gk)gUR``n;ykWis)wb^+>aLX&&6%a01i3?rb!$9 zU)fG~%qph&y^11fQe{wIS_DIxS*o=g#ptE`euU^mCD5zl z?qQYG7>-k=SNDsmwSL@AtMJ+}7lfu$1r=>B5s!<2^Ouw+`Vbr$)21^58RjXrPYO&h z$}YPudCJ=^NvfboBdC<@#Wxmf>8!G$SCjd&^A$DaM%QCBSQd=3p4gA)9vTVOhp%Gl z1z!%ClFzOKIZE)pdXGtTghHIMt`M#avYe5GCyu?Or2{HCRPG*iio61$Wdd2Ns zSAm5X9%liCQpBCTV~dbG7$TRNV^D_NNvA!8L$t(CIR5NZS?U+(9I3pa8yssb6t}=J z$gM|!k`tloL@Jk9Phc7wEZQ5BrkMriU?fpXkERAM>Cd-Yv|qa;2#MwUIK1^|L41W= zjddZQ4!!1C!A4D1R>hUUC)g~<_-_s2AGb~jN3Bng_y&Oy1>9YD9k_TcTt$=hG^_(z zwf0U@cAODj>^{Xy=*Cd%U$r`cGjnh3Lck5|#~Vcqaym45@=P1^lTx_Xeu|6|xi28K zMrMpu`%11&e|XOu{{5?`bw+-G7*CX(D6YCB{R1?ha^F5a&@iz}(8%e!>#AEWJW}^g9;uobMoS$J=_d*w- z36yjR;xo&F3Rh9pFzlT-cU>|WDYzxl03pf;gx1m~mvSyLpU8Nj$a`kuWV91$c+GrG zjW|vfWkfK*wMZjW0PmaT9lUkdFHKGClxhm(%{>xA(%V_hH&obycE=MB+>&)-!kmx* z!{dbsZZraM+o8!~ohh=QvJ!W5KNyI>C?{dfVm->aDAnG_Y0LW}D~HnwwX4+93)9v% z>CS>03#3$U+juingVcK-8JmG~C^yenf``qf2g-938FL>RkI{WrXm|yYC;Ed4qokp* zO_ubbRc60N-Tqt@CoomFpPOI3n0SW=d|&_K)~}!`$z5y$-xjYo{zCJYN68eu`p$A! z4N7h^JVs11Yg-fG0Qk(0>jGih{GyMi6*Cz-dWCa<1?Wk!o~wmJ**o138ww?EzcKv z9b}1*%MU_``CcVuCydqXiaq99jY~XVJ)+C8h{+#8xLtjEgq_9^FXr@RTH^K@PAx2k zP=0;QTe1jt-@1t0bjpl301A#MRbzs~M8-4LL6~IL)?Pb$lnj{&+vYppG6<2qT z$;YA-IK7yRt+VGP^2C+*AU=9=7reyw)Nd_|J`0^2iVQ*T`(+|qlU>yc58h2DZT|<|_vYajC@+KI* z&TOKtg9ydNLp<3bdYPhQ1<2tHUQ+Kgg?7vosRb5zmFxjGxqRLfbX!lE((P=2dd0Iw z%T9>+n%voP4eer=%cLG3gd+xSQ9J(bhBq#G;B=~$f}EW_Hy7?r%iT%5!noI3*9o#| z4@B2)P=2L}G)y~P<+MTGyzK-w4wn>%Tt=%2~f5&0k1x8crsY15k;}3`YO;{rj8$JlEZ*D0GT~2LQGt z0RYVZIM@AiqRaGgWSNnmYq!LR8hl1^BB0Shv0eZNTml?5ulsqXCB}L?0}+O2{Ihb- z%rC4u8l%KIPjLh0C!F5W(k)(-&mfaMj zPzm@dtZWvPjMiEi4Kt2m^^n#shKg`H?Unp-Y+Md_NuNSe7-lA(N6p(PboYGF$Ys1h zCi3{Y)K#uKVtWiH!u1Riv+UE+m=xspzj8jN_048Sw*o(s8CXv|_EqnqNNm7Qk{0ZUTHo}g z1~S-yN#Vj&H7u9tTD9Bm#xya0B3T~NBKeu=9?T`7^ZEb|^CoW|rCWF7xqkIZ72H;O zWfx4F8q}QBDY{uQpAZKu)$r}~Gvjp+E7Y{bg1q;yWqCriL}AJB^f|TV;su5-M_Q-I znTRFKrX-6{`8-hXil*}LlNMLc>t17Rf0t$p$%OML7p+WxE@Jqt9m=1)p4AuwiijaL z26mJe$&-slo+@JISnWik(L$f)lfsg-8n%@7-5y>cK1lWF1Ux}!`F*y-za)zB!6Vj_ zJzzU?R8_bpwm&hhPfBnPc9>us5Vl_3k?2d2BTyx;$_JcFu)D~Fg{X|p4BXw_=~voy zuIXiYzy9_?5XhFly*|HKZzLet?BrkGx<2DR@IM^2FPWJGTSf4Q=3G-GoBeQ?D{8*o8)&uN{wYjG(Ce6KPCRq>A&JB1f zoR>_O=!Q?z;ozqF43~|JowoGgF1O^H08kfGvHNo=p5+ z2wAKPaZIf4z;DPIw&pyhpgIE5fd)I^SjqW}=b_P>M5M)V&z-glk8`&+;jd?Q0_&Yw z_}(2pp8PkjPTA(&XFee(Ti2I|Z~M>RrBl8Z(F|bVq9S~wgA!~o3pAk-=$VJqTP%@^ z%wCjR^pAO?Me;AlF$pIyKPP$*G#P^({g&P;V6|G`CbBX$@7(Xr`=ap2re(kuEHVj^ z#Asw}U*L@Cn<9(9y3rwa!>wzBve9|MH%P%zIOc2<@_@0@d{@XCnELK5{U309$LiYQ zDda5YSn%NtgAwl#C$J3rZ`JTOO+hQ$Sh<>hjk^vJX<+umTNHkdU$w%`FiylW-~-vmhW?n)4KbdvU$zXAe9T zeruT3{Z@hJ)O0p@^z(aul8lOOi-I|@P|ag8p)`?bK_DXM^R8Fsww#*+0KnNi!*GE+B#TW9$eDA@j0|yJL0-hJd3tXP!ht z$V8KgoZAOP@+PdghyI9OB*MyPkKk1x$vQ2i^Jq~|z3^yw-Bhe>3a*oo@JHt%_jyv? z3Dpa`NS%yj@ns5-yu2R#jnWTkMQpZ1&L9JVaL5Vh-#(!$f)sXLP$&q&RDNC!_PyqUA;!6y1<&5F{JT z?afxC@u0#+&LBCv(a2>%4;{WERY=KAdP}GL#E!wU1e}8!*0h*=x6L}TsI-~&6G&o8 zjB8_9tf%FsF9jCI{M-h-- zdogK0Mn2`zvdq^e@_1;_o34H0fvez*4&}a~jFCzYkU*eVu|jmQ z%{rqvlLDMI!vwIB5Z425s(mKM6iYfkgTKy=%Oq#4l~~ zV;f~-vd=&YN(%hch(l2E8}&cHC{TSRFUa_fhVdDd*b98*#mH~I>SDWR3SLRt*N~la zQOHb&fI79V_Mol?5g9EaTY(p#My^3^ph8bed$ zNyAE45=wQ~!^}Xp^&T@3i5v6gb$&1lGk%GTB_)uGKVnp)y8zM<_>G=OW}_9_?O|RL zD*{;GPeQ0zNKv$R?5xxe5tg^F z$*-=w&s>^KS?L^siho+m-LlS1sLL}iGa#i>sahtVed?c*N74uki6F9UQ@)#nJ)9VkbFx zsDT`^xPV6B*!Q@DeKU7^LX2l8iTxLTovH&{>8A??jz#Zv)^LVZU4%dbp`=wQZPiDD zRcS&hFcNR*k-jQ8LdioxWFDifYB90W80 z4bt&50_6la2iI_e5>XOq?$(rCt5r8cWO*?~Q779_O>pw16wu%Z4s-gRU_w*3yLAF; zc$s}R`!sOtF&N)C;) z9NGZN4ayXi4crnacQus3^2ux%U&lZ;ATVN(5M2mJfzYn?1!o6zQ6s$+MX_-;MPFFi zTM++wq(%T+rO3{41@yhJsvi^{2?atF>+51YjBky<>btV0VV=N*tgIb!*i1-X_4Svq ziJ5S2b+i8LaYSRKliA`Ph%rII$x|GlSA{SGp-NB>+V6ERzPq6AB%it^f-Qh@U|~I~ z8>=e>&~3L^oYmNEVXsXrm?$p~$bLWE3}4$G|>?byNERe`~8M z^1*Usqb=^&+*5{fV&ld)J{bPlGyOh{Bhh(WXR6N19?0Amzp``@P(#XC^h7j4H38UR zfT6{Zdr{kAGTqzU(alqpSdkcUR^MoF!e3a8WYn@p>__BrP$z%sk!$4!7{=G7IXSx56-=qRQK@7VHWRr~QJLS}=&d`Grslhw9!mn4F19 z3my%Ow-rA&+1)MoosHx7XSv!($_n~?_={aiH=h^=Ui?4UA>-3+O`h} zYZ4sNb6Axs!shA#Kj#OBp<4NN4L>n#7~VBjt8BJ5Pu#++A9Jq_M-ZM2k()dep3)Wd zYLCK~$>?*?D@JuqqAVGK4xnuTda#bIzzn3uOoa}>nhAuV#JIhYRe(Iq5Y$?>Tp({3 ziqZtzkl=h&lirydG1f5``Y)yh?XOfe?Q>oeI91p3Ero9v%m*Gl1tV*C&sj&A&ZyXm zT#&WtnC@Dqhj(_Rk5o9oXM&ogOLxWSUNqO3U|ppNHD`W4WvxiA`|VkGLUuc~+rqxz z>rgW@t13TL*3Ic~*VT^*&@@i&v^%5u-Dz9Uj3^&Vg$KOY9soW{8^^qY-SWT-#A+yl z-z>$>zK?2Vzm)P7#XLGCzal(DFpW}0KvGjiPV)L2M#H3_vIcTOE5>g6lRLN)1snA# z=!9>M8#c9~_V!(ley#}8#lao;f%V)z9TTrUBk<=&kbH}D8?2@%6CcAKTB!3!bOO`wtxSAm*xHC z%K2itJ>`pd3QSL2l75H6C0|D5LJH|jl8-efC99XbL_#EzDU|I44DGY@a<;c4lFbn0 zzyipF$miT70!glAYV>}{;BQS`W}JTOa#Uom}G|Xb+!Qb+nzN17& z_O^H+d-;vg$bdejMlP}ot|@Gr^TymPW8kGR<#c(_Z8c2@8KC7^s1H)CGjMbCqSe_j z{T;}H)jzSQVS)Q7(Kgl)PT_Gbw^jX2bp(BFQeU^W8LuQJ=vR)4PgO7hY|DlyOr;Wlk?wC`GcIx+~Xr%ia+<5G3f zvy7|p6ReH5(|WOm;G&r{I<-=)8f?Wl(iPK1peM*}h? z`Z{5w(2*Wf!oa1=u{E2@-eT)HJ}(mz!}mBCy+eQO{v5HOS3FkY5@BM)>xeMfVRrQC z7ALP@AQkx%PIdKYOdBY@#~pHmE!YVSyAA(@uiM8SC+)aD-5i0*@{P}RAxeSQX-Ot- zu+N(uo=EhYTYw~nSIi=h2%j*nLJiYOBUD4riy3hf*p5|N0!8Sf={R0>TV!fG0fw`G zRfOphZ^J_USQrZr_tlTYrB+O3=g6O!o{juY8k2@BBfp!c)QJre@s6d+Xa>hsZ!!#k zOyf$d=cyc%A!$tSE)s02%{40q+v*M9fhA z0^4VdYweUgih|TMPyT{_>ZNN><84K}^ssw0wFs`dFaA$=j89RUPYOsyRyekZDbBCLku*=-o#4af-`EJpj{DS2Hi>#F{`?xZvc@I@5y}A3hrxLRnJ^o75aqHA8t)DlyH-c8FZC-xEJ)SD|C7$I+Dv*K^0}Ek{v+`n#gNK!iWl6he z0Ub%Cb8QskG^0PpCN0lc(v#-Tmei10X8C5LW*kSB!zctKYf)l~CO>j=<;gxC+lP89 z$VO@sR_h0peazlp?%>TNv)UMW%1y3Vl3BL*ZiY!%7&Rdx3EVpIa>L+E-%>mi`snoO zd=lYUr*QLZXw-cX`L(vwKG6`QJ0Lpq47xLSlUN3?Vk&0I5%_H?SJ=On^snQUkuKu) zv=c-jYXnF)BVG0=v#e&DTyJ=7t>SVW3oRt9{4D#ujf)s3 z-$ez5z+mR6mdhvFBdN^$$KjQ>IWq`1Ki)6)KAhi`_7#Nel1V5Zr*Q@o*bO39;x(fn z*W0)#=-#}kK0~ZZEzl)k8+Ib91SsVqHIxRqVycb2ROuYLP$O&@d{fkcpE-I2(lMMA zb+xP<_(gxZy-PP1gcK1Wqd$sKzxlY;p|j}aaE3&f`BXogqiN%66=YV=M+w?4mp^$t z&mE*!u6+jgWwmMwm-oD#1P*>_&Q{@w1G?U^Q5({V%+xzyvlt>#il?{{=OyQbkjB_x zm+GrY2jI@Cwc&q$gbl~9E~gkB060qe|2;we^Gxu^33B@16J)}52u8#-5y_Gwn>wr3 zl%lUXJbSSk-6@N5@m5Pd>(wBV1rlfxptvCX6P_IgUwmR!&!LwfRVN_fjFCT$sS+LD zL_Xhl;6_Rq(3Zle{lGTcfrD+%_IYMprD8Su+r)_-4J`4)UQdvc zHoH)(B$=@=2y%;4P3UvLmn64xB$aU{2&R_q-juw^3|zt|!lpK3@~%aSIy|8P zY&Gjj{ES$QoLFUtF9keA!EmHy*-*lG1~P_;0FNC5I#CyYF;SUNu%U&ex`a41#k6;H zJut;-^eoac-iZ-x_AOX_6Wd*ktT9L=ghI_RxR9gg5@j?|TK=7o-vl(V5wbC^J!1L4 z_jb<^kAO#H>;;H=CDRTduxjr`beizffx0f3qFGRy@A%2_QyhefT>Z$-$p*gNGs4rD z^YWYK7gF6k#f4am+L!uKzWnGv&7=gU(zRLz3Oh!F+b9qn%(>Uu9;=-%;jGlG;}$M0 zFt6`YWdx3|dLxbM8nBK~g04`bYs!E>9lNKQK~X%_@mzG9{i%!tUDvTJ3a3Ky;ubV` zTgAA*aLZ_;L`bj=T&bxNB_s~7ZME^s0aiP(adHomWS84d>P4`*ylBMZ(vTb*A}Bbf znyk|W$+PGN7x|D)O4+T1mgg@@HA(&rBPJ`$Sf*Z(77Q8dl2|myc#{qA+l*)2(=1!9 zNq!BcCcmdU^P@WDE2D1TSo+i4&FdODGF)#QBj8c=uaCJO2NBl(xd{B{$T{;UdbI^E zNPm|QVKS2TL^~FAKQdoyUm5f}(0FBog}>ff$K|#2s2$bp+H>+Ka-r-pak6Ci>-|fk z-MV*~zK_?-^96y=(=Ud%`)m64r`@OZ&et2yw_hQ%Z&zn39j}j@3~!p9U*B$)-#`21 z?mA?5^><9?sqtGA!s~TK+f(7&i|5;sfB?hp_LGnI>;3Dm^$^}Slfgt`y`Mx6VZ!s- zqmJ9L4BN3YWDYVfLsGwB2A&VzjMv^Oy4j(JDy^>y*Y9YaTs@KpcTWP=>5mU+hk3P~ zxw3cjv{)ndp{FABBxyZ0cd(7NN>@f~xSh5~9e3YkTw?TtU{Xjhsu0*Q6j(hPig_Ct z&_{@ywCtOQXU@SQ^lEhYWxNulJ7vvnGc>*DvhQfF4pxUsytuq^=#AE^W9%GT+vUxt zZWr?~zCzNa>`Ij};;4IwbQ;V>tYn3U*WUrkfR48;t#^@92T-EMBe4ZlZ zIO+G-tka=u(h(5iWW%#psnj-3+L-8C4^ zw`eHqJD0XIsW|4Y^iyn(VUGq*VLOfd@A-)^{aS5-K82R2zAA;-J_NQ>R0Ailc(24u z(Ksl&AAr!{@@@T5Mg?~J-8-)cjY#Dss%q$($)XMQGVK@U23!mxzMvFy0-G$bsa=ok zQ5`ZS9|qrAUTT`4L_#&BB$)cKLY$5GJCWm2o=?3`7EVmpsS6Y=7{a=U8_bM$kTmP1 zh~pfK8aT;n2jKT6O~~1ike1$Z1vy5wdH@WvpQvhI)PR1c$E`OzgB-6vLiT=@Gl(3H zf0yl6qpD%6zRMivK4jK7xp@;%qjFK}FdKPZ@jX&u)Ir$^%Htp2bFsbRNa`-R{0iZA zuj zh0;QxeEEcfNL0xDqymAUbfycGOi{?}bO64v$}u8nia!YsR815Nk(IyJd`g4Iacdbm zBU`w9boP85ZPzSUY{CUO0>VucTo`DQeRv{ne$$O+@1Z2boNVj+vg(8w2T>7J+M!IDhB#8#%x`G(szpMC-BZ*ZZ@SjF81LtUFntFQvIAQ`;V3(~8(dH78< z2QHQ)S0mI^K$OY;ej|2U&xP6jUX<+0A31CRNX74AkK{!fyyI*o3iV?2hp4NTdnt=F z$UZaxJtU>ssG^mmYDa4-lTK>zRSkA#48;MiCTn#XN#7FEP z#{!lRB<`PZMj%9eK9oeI75=bhJv{)4Hz&#zG_72l#gXd2c&cFEH2}SEwUpj(&eSB>k^g>#PnP^{CkM1Dnnt zY)CQ4o4`*Sjir@|;xvDa{!0lGgR(dZYgoSvY?e-*J)SSLrrt}?6$ z%|h)?0|=vBe0gsguIjBowCPjznjVVeUqf2>4IjkSPk%Qwzigdn0hTt$_YQTW?hjM} zOC)-Qvc_K`lhCZC?;%Absr+S64_NrkZQ6mRpP5Sxn*G$_cboSzWRE7A{Ll`B$)LrU z9G?2?noecu!?mZK91?vMg7+1N)?o8H7w~B|^4LU|KRSx*nyLrvwmXC!8{?e}AMPUp z{gi=+cE&%WDz#b{@x^CX%IJo zDMrBR3he&^k+%Og5c?XPPo-~aIhw1+U^;buX6b+UhD86dK63xB^}s*tuN`6be(}4& zTH%dgMS*BSp{sOJ)I>f*nzn*28gYn?xytx-0C&EF$JxBVN@-*qiN zrw?rFr&04Q<$pm$jeLN3@%*cjWb@xu*59kdsZIa>bECi2qZmW_Xr{L{k*2OiM<6;e z?SIO_Wf}d4Ik=CwAIvdchy5-aOQLY6L8K$s8y5G&IiOA(!6n+>@9TMP)I8EZ2py+! zyFUxOaG?iV4lS94R`iE}{9SPKkAR>7 zlA=jNF18NY1}tMv{+*#P|5UeVsS-)){SqWtOA~0L%=>+QXl>Sfbd=kf4oTVj94*eT zx1jke+4>{7+ugu61bZ^bkKTg;nBT;|cMo>*NB2CrQS?Ap7=Zl~7R9^w?*ok=vmwpj zIuPwRU~F~j5U5M@<$b``4V(U9FE^5!Js8d8mpU|iHG%ixPUp1vfjk}1ET+-Tzp#QA zg#s8q{4nK0|A(fl`)obXx7}iRaHxL;cy|9Z$mf4d#r?}vx$_@Wc8kPi8_;SwWXu0T zarhVC3h_I>&-m=7V7|4FL+>qE{)fG*?M@L@{_n(!Rx2$3E2;iR5^{q65AYh`zc7~m zz^I^V68#9bIKTQ|f|dV^4}@m2=RGL=rF9^Bt+PMQea=KQy5Y(`(aflIdF+coG+97Y z|H+`|dj@UaGnn>XKVfsuF45($f993X!aE9ZwVZlOnhoAM3lN>Uoj(pvpT_Av^6?XO z|A+A3nD+iiURT4a{Bbn=)V`PdUQIs1+E3;EDN^gN(JgTO|h5y@RqlJ z+IL7%iKqQ-Ik;8PFmso5T`C&=VEjC{omM5aHMUj01pF`0U8uoX*_E~JRGD)gu7zb@ zSlpg#-_E2oJ(4Z&e7{Igod@ND{XY6E_9IvSv||ZJFIX)7kG{7NC2>J6#OB34TxN`~ zxl6%|oaO`b^-og%LAS!P=N&oGVqt`S;UBr(Natmzbu^~CBa>rs_k`<-HJ9-`Xhev7 zgb0PfVq#tO`Jja(lV9VSB;10Im%NX%ze5J?6M0awUNZw{C6ZmYn!IaD|JC%~F8>bs zP2$PIcswLYtm|qLKmO8mA5PLM_DpK==Btw}wg`V0`J_2h6d(R#zk`KasxOAk&MXd& zzihGB*=GrM2j0ie-^{T2`14Q~`V|z>%EGZ?VkBcp+HBA(cqFSp{ zZ^S(%_wiGLTbQ=`odx1V%NyG|Dcg1x))E(XCK7@M^XAi6^-kgVs@8{%LI{4EODGjXG z(cR|D$1aUl9}} zbE+ZdVdsQ#en$Rq+-C?{O2@pnN@Hvrr)e25LV-Fo7jdTyEH+Oj=mm7Stp+TvT3s5? zmothF%uL3uyLO~PT=0_4i*9@Znxv~%rO6D%WGO<~UPw<|x2jQ|9A6;}TS_@p_o`I~ z-=CP3gm{bea9duxh=Vq&n)K^1S6)>0+Fafu4B#&IEp}j(CaN0Wt)43+;QAx?!}wNs zCO$NMm`%L;2yvRY+@Ej~%$QMbdAsWhtRZ|WC=(lvZ!oWm?LmBP83 z4oGO&H%V~8+?yQY*BlRHa6)t|6z|@*yj>YSu?GN}5X2o*egEJ|4!PCr4E?2!j?dfu z!X{>K|4TjMe%d*%5%ZBhRtDjLw+=$0QO3;QzrP|7PLP#3x^4Ao_?R0HR3`9CJt7=6 zf3~1u{Y%XlH@ssLeIadO%%Z%ce&tb0O4Vi(zSBEI#I6mLlg9oumbk0H;hoHg@yWTN zBt}HDbA^z+#_ui?Zt-}9(d;Iagi&4(;VzNk0Hoa9|&30zZ%WW7F zNE?QSQHEdjzH?sp&PmXPG`h-LJ+7-Ba}aTH)Dnm1cekI2_E~e-vsg*Oj|FTXS^H2% zRYeZ_0!vAM(&Q1nH?1nI&{ZVV_^JDls(fNfin>CHzAbip7W5F;2v%N|k3{KJEy?Tz0SPv( z$HSdp$W*VRen3WCGWd{6HGv}}=9BI~`NFaJ63!j?EoVaA-ouyk2uC>_dpUR;76XJS-9>S3h?cNRuyJ9Hp8_ucr`(&Yu+vH6wh7q} zl&Ui+8Ah3(TWi`eapuf1KeN{KVB$2t77$nHehW*pSE{QzzXkJa0a2L_A((6W2u$A* zb`K|dPbk`ThxxZa_FKUGEu6Uhs9oVcl{_niPS<0Yo=gxUK=QD0R4_j74q1f~o-Q0Y9MDphi@fX9ou9 z{Z*kF{m{*-u4C-w=`NIZLPxhezp zCeug+d#)2gLR<@E&*k~+8jwAAPvu(cjHri@5L#PAy-nZvhRcg-FhFvwRIdJrpsi!{jC0_wBw!W@QG!tnS2HyC1Xt?ENUG+3MGKRA2R*LtE_kWOm?2)6GU zHfFf3BB%C{J~>$=+oMRB9!J^!PW=%*Otz6eB2kR1njnCP=dLcUqpqAZdY2AhV>urN zk$A@bfz_^;E0&5pNyC?*A7glfUsTj*nw_5H=ZE@|oXi4blJ}DQV>Lv?owF|lZIF_D zuUmI>aar6GzGH|uy6uXf$H7AoE|~+&)SUnh&YWfdCyT3%(Fks`|M4s#T=ypKitU52 zbsile)A8li`)9fDN&=aIxFG=);edzLvjHlaaXt3)a}{v2kbt+H!Y8xN9Lx;*+S#0+ zRmsKM_*A)2dZS`I`P;f%*=kxlUgx40Mg?=v`8UV!?PV>f^hE`c*ph!X3Xt*7G3-m_ zHUiEsy%B1_Xf>du6bVf%3qNtFU>)MR=zJzML`Q~)4#Hd^Tldp&rddSQ+#x8RoT#~V zTQvg%eM(f?Owp%~s>sP#VlB~MO95glohLK%P=BZ1!wHZkMmGI5YP#qx-k#Q;gs4FB|+8<5AISwwQ z@8h2-)rGCi1~3TsqPR$jp>#>WPUM*(|4JHgP_|41Mraxk{35u2ACsmI4*wgHh_U$V z^+8KTZH5cCUT4EM)XORj{Y^ol*;DpnA;RabB%V|sI@_jNqQzt?x=TyrLvc-lM&?$2 ztoQDxmetIRYY)A6@Y9fC<;zpLwaEVBY0E{Q{r#oXC!vkY>aRmmgdT(`ogYT%q0gI` zL?k@Ml22huNexOcS1j_kEZcmMx08txZ8M>0OgOfXD5%CS@-END^Pyw^np2P3`&jk6 zkrD4MllWk{!}2((G6d+hhxIlrwthcY52N@S<2i+@kmaIfr)Wi$>Ad7)}Vmp zK-I(#xi4R3G+9t)-uZMp(Tn|)?VG*^q6sOz$~x=8&p4QqtJVwEPpJGq6TAx}4nS|$ zFu6q$Cs9Jam~nahIU7G#q4PFrxVKQNsu{3E4JdV20{xx=SltYCh5>H%CF7Qq$Ql-^ zkhp5 z@yG27cJEm~(UvyS^KyH6SZ|wgt1c&num01Y_$Vv8Pue0#?`(*0h(5jFSq`o1Gv=bE znEfbmcV45P({f#xTn(V9wRiYq9fIh#|2&|={cRU(6`>J940uu`CL}XgXBWV$=dbKI zZCor~UC+hWTYMg5(IGKqJowf1|NYJUt+*|Ml_(e{eHmD7_^xOo8uP16fL_PI$BG#3 z4kxzHE^={7nFkP^T&<~fkF6?Lwz$ufFnmCQ)a5>*aGN0FP(^&K_4g@JJwsUjQBt3 zi0)$Rmb)o1xNx;rQ8Hn_9C{W^NwPWQ_!wZJyapg_A7o-zFMd}0MA(d9+qN96BPs(~ zJ~{UpHLGf8pW5h^B(Y6s_cQAu(qqv~B_YdoMV6ZE9nGHDj0$&nh-^k+$tRHv(@9yRXCT`*7ZGN#SxzaX!d#WM9gr zGwrDr44*ddSIE3f5R`l}wH@6U5!h{^s-dLks##?{EYx2Aj(WS){jFxg%SCIiaMf;3 zohAFK`t{=7BMTm9!dKF4da9Ki{fb1Q)h1mm>>OVc`x655H~F`@l(A;zbnEEKzvhUA871U_!h>8`3L%^b+}a19Awo@GzA8jXII`I$4w ztkjf@{L)l0f1DZa1imYG_rq$0FRg$GLIks`Rj zA-B#_G3ulCA9FOMbo-7m2lI!4gNsgtcRBWr#MIh$dBS{oCujtyUslt`9vC^xHs%p; zBBMMoOG`pBafb2z?BGavhMG*1+Ey}ZmblGM2IFEtJp>sw zB2jh^a&}tbr03Dt>h?;d@a+%tFXdHbX_4*cxzM)vX>5bJg;veaW?oG()Rj1Dyyt)Gml7%%t^s;Kr_d=n~h3RV`Gy@bI?UXuW4TJt9_PWrK2K zo?PV2N;Va3B~NPc4Ls#%ij4N8mPeIb-5w<-jEJgFW6tttMXNiBe`^dJtL{OOZ zSb!@mCv6PMaQ7XnB5AjI24ztK&sz~)_e$CgS3`iy#VaY8X@Lyj0re@y$VrOg-lYI` zp!>1x7BN>BHQvCNZO|JS1i`rgVps}rw%HQQiTKT+*5`uIu7<7nyI4{^8sWCQ4#{GL!>K<6PL z@=utcTd&70YD<_FUNg9Wwm_hhRcc7h{OnNFY{xm`C-f@S%n0^OacY%sRl4EC`J(jM z<>USqSDVYn+by%tx3g2LZDE3P_qkTwVX5%Zj|Qn@Us?ClY8rqp?mb7O3>CLursMHW zU2YwnDEm*}x|py$Yr6D%cgsQL#E5r~q*=@osz2b1vE4b$*!v-&p59<|bOuFnh~vw; z+MaJSc!`{2QEzLAKI7a!j~D#H5@|L0^@Z^FJvBAvanolrOs}MdXGRT)C(<*;nl90V z_)pCuZIRT(VMsa$?et#7!1wBH&Y zJ)?IRk9my7w)!Mnq5Jkrj>vJkgO$N~v~ViY6F)IPiZ?Qmf}FKI7R$>g%h7ZA>Mgcp z%q{)`86RIg8%Aof^5ppbvh@QMA(kc{CS{}Sed{Fk@mpKC?_smzJY6YuEIS0Z%*bxD z2F~+f9%OiYA9E0tDzI=kjCmCs%kA-e;MrrJtdA=C27dFQN(bSa;IJ{@Sz&Up>d5w2hO2)@fur*YW-y|OW6x2i z(2BkvbZ(7A!%xWyYHj0KS=%IE{}|KKQPp5Jhnse|VA@j(rERJsEtbilkc%d9(3Oz} zd(oQI`0WexnUlI>MB({-Q71;#LLWL0UcHGJ%Hr)K(6Xy!s;MQ0&ir$2n2^ z6m*WrhP>vE(R25XqlN{RE<*)-z5D`+`eBhu)8U|GH43RqKN!Z@;oA1TTlh$-Sg{Rj zD$(OiXuM5c2aura?FrPByL<}GNz^}XBObKBCR>xnT^hu&;oyvh?YqzbAz>4g0nrjF zmT?@Z(+P95&{sf>hg;=v^UaAme3trQ^J$xA`(Cm5N(ZQrUVeMgXJ>H?p3?d$Fjs$>;8D&gJI2}0 zs*&rFBDWZxw2T8i!wY@=!^mi8IHo1qX!-Dt+mV`id8D}xQeIrgE>@Ua}RG6+hEyQ zMV|!u?9OmVk@2y2!E*up+WPR^eY^~yZ6;|2AErp=`nJq8)*d|deIWjNiAaXCJmRhk zbH6Q_p)fQXQbr&<&fsn80b{-BTD(9l*D;U7G1B+Rhtc=5*ZDieZ6oU(*rY`b_(PZD z2b0j%+Ln?Yx!wOlV1ZB2RzjLBSc%D8#QmGjMNz#!lo<{5@C=>o$jySu?1=Saz_$2f6x+5<$>Kb*qnyxbe&5aSZOV{2 z$%L|QG28^5*1@P95XA+zvw0H1L6#8jf)3eRo)&L>U_Y*~xjSmn5quVfzXLvR#%|v0ZXVEcZKGJCYc?%3N-`Clw}*KbsTR_w8TKJborcwI|QIFS^&A zRcr640d#D|IkDOF-4`p(33(5pn$4vtjJpc z%9UDUMJ@{-dYo83@0{Cyd4Bo4+Thz;x2FYbpBe_HimW;>DSN?o;w(mX>xN$P^&=`E zJ)H3AOsk_zG36tg)29&{Vu!n{33ZCAU1Ar!zNBeheQ<1T)37pH3PsHm-uXQdVwY;mbky?xz3bLeNV6S-CWJ4 zkUYjS4tJS4KhqT>+m}I)U&R#$Hq61SY^~!iJ^dtF6-I^Mz}xmV0Wbh-1m{%giFeFm z&r-;VurZ?+$k)b=_?TpJ9_aa$s=za4Bk1*6z>;C*WxrJZzK_4W$bxSa)j_Gx=lNJKF7Vee=m~en=$~l>$hj|H#$8HLqb4CsD8=_lv(uz8={2 zR_&Q0Xb-7vlMaeKJ-&i1BAd_OFa#O9JkoCQa7X3t~noldtzq8gR{3_+_NNqGAs zubB;5IB>Mo6Hvn1`h!y3*vR-2`(TA#&Hkc)KwrR1c?Y-B4BN0a9VP4*c^`}Gop4!RU(4SldW|2j6MZ=R1 z8rqBIN=_5^=+kKPRhNF&H{8oV^_Sc}guh7~B@0A68720AY|vAWW*UvvCNLKC<#>*M zK4I1XjzP(Q|6KYfQuu zj~<>Ru2=GTA}bAhDN_pAqor4PmS=tV<6eiKYn(^G=Gdlj-ZP~_9+G411q2z?^lPQ? z`HD@{nn+QL3(PY8Rlz)mA_B6_hl*|zj<>KyAh`BvccNYyQ^@ll zTYdM4AyYmfCo=~C47w*&O3G_$)c*1TJw>*1ZXann(R{N^w08lElVMTrEkL`qU^`oy z@Yr)noSmZjFqZc9w#H7`1FbwlQ71%722WwgO z3~k1RkKO`&7k+$+|AgKgY&BNI`(%_g&SY#(_nq7ANCCjBo$k{w>TW%2WS=Vn!qpk_ zl_aKYWvxehL1_DhXD{p1P>u7X;cH)QXkBdAaD{b_C6Uu}v@>7>PRDq>5)_ohr^18? z`i;PHOtBS@(xEBK$g^e%zO{>I?H{pg|2{pT&c&W}??)bBwp@fef(Q9xebYw3V-ulc-#- znoNKOzUo3OcWiW#Fl~B!EcWt?+h&>_GGxJ9x9|CLrh^~HiBz*Unf9J}Oxvlg0%_$8 zk>zzkkTRk`*0h7p+AayXgSC?J%GosQ7y79C0j3_tD1cC-?8tG$N>mB?uT4Yxn$fPmR2`;E=G=!8w4`8 z)xM~=zdyH2@d#Xl^RXT{*|s6@f?Nq2s8q@`b4@ z{S)Ayxru%oUcI*?0*QaiRCLqupZQw;ZU{wWEBo)+TW;dq%){{q$pDd=<3?7Fo5nY} z`~MhQAkJa`GQOsI`Y%lWHvw;w+y4PfL{Lc~0RK?k-!#2Rc>Tw;4iRy^GQCNEeG}m( zW7Qu7aoU@A^M}9cCd$o2!+%hac&<@y9wEL7aP!#H9{^wBe{II~A*h=u|6E@FgMox( zsE&m6AB)X5&HuR)_;>SN&A*xdS{J-&{m-S9zgy2~BmLKfmYXOy*B1WZ(CS<};vXvw zH?41m-2YfBKL5-5p8@!r_Wump{;@_vdZPFDd-%5y?oF(JhW`GJrE2hZtp67XR#!qt Ue2cF(2H+uCBQi2Qu)8Y#ANS+sdjJ3c diff --git a/openbb_terminal/miscellaneous/portfolio_examples/holdings/bitcoin.csv b/openbb_terminal/miscellaneous/portfolio_examples/holdings/bitcoin.csv deleted file mode 100644 index beb660ed0dc..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/holdings/bitcoin.csv +++ /dev/null @@ -1,3 +0,0 @@ -Date,Ticker,Type,Sector,Industry,Country,Price,Quantity,Fees,Premium,Investment,Side,Currency -7/20/2021,btc,CRYPTO,Digital Currency,Large,United States,29790,1,0,0,29790,Buy,USD -7/25/2021,eth,CRYPTO,Digital Asset,Mid,United States,29799,1,0,0,29799,Buy,USD diff --git a/openbb_terminal/miscellaneous/portfolio_examples/holdings/example.csv b/openbb_terminal/miscellaneous/portfolio_examples/holdings/example.csv deleted file mode 100644 index 55a8cf7f1a4..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/holdings/example.csv +++ /dev/null @@ -1,5 +0,0 @@ -Date,Ticker,Type,Sector,Industry,Country,Price,Quantity,Fees,Premium,Investment,Side,Currency -3/24/2021,aapl,stock,Technology,Communication Services,United States,120.7,300,0,0,0,Buy,USD -3/26/2021,msft,stock,Technology,Communication Services,United States,232.8,200,0,0,0,Buy,USD -5/21/2021,btc,crypto,Digital Assets,Digital Assets,United States,37430,1,0,0,0,Buy,USD -7/2/2021,aapl,stock,Technology,Communication Services,United States,139.8,300,0,0,0,Buy,USD diff --git a/openbb_terminal/miscellaneous/portfolio_examples/holdings/market.csv b/openbb_terminal/miscellaneous/portfolio_examples/holdings/market.csv deleted file mode 100644 index ae9346301cb..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/holdings/market.csv +++ /dev/null @@ -1,3 +0,0 @@ -Date,Ticker,Type,Sector,Industry,Country,Price,Quantity,Fees,Premium,Investment,Side,Currency -10/12/2018,QQQ,ETF,American Technology,Large,United States,174.32,30,0,0,0,Buy,USD -6/5/2020,SPY,ETF,American Market,Large,United States,319.34,10,0,0,0,Buy,USD diff --git a/openbb_terminal/miscellaneous/portfolio_examples/optimization/.gitkeep b/openbb_terminal/miscellaneous/portfolio_examples/optimization/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_terminal/miscellaneous/portfolio_examples/optimization/OpenBB_Parameters_Template_v1.0.0.xlsx b/openbb_terminal/miscellaneous/portfolio_examples/optimization/OpenBB_Parameters_Template_v1.0.0.xlsx deleted file mode 100644 index 56ffb4d5e05832a9a1c53688891a779eefe2a5e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33733 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 diff --git a/openbb_terminal/miscellaneous/portfolio_examples/optimization/dany.ini b/openbb_terminal/miscellaneous/portfolio_examples/optimization/dany.ini deleted file mode 100644 index f83b9c989f0..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/optimization/dany.ini +++ /dev/null @@ -1,7 +0,0 @@ -[OPENBB] -freq = d -maxnan = 0.1923912931924 -method = time -risk_measure = MV -alpha = 3 - diff --git a/openbb_terminal/miscellaneous/portfolio_examples/optimization/dd.ini b/openbb_terminal/miscellaneous/portfolio_examples/optimization/dd.ini deleted file mode 100644 index dd7f6eaec74..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/optimization/dd.ini +++ /dev/null @@ -1,6 +0,0 @@ -[OPENBB] -freq = d -maxnan = 0.05 -method = time -risk_measure = MV - diff --git a/openbb_terminal/miscellaneous/portfolio_examples/optimization/defaults.ini b/openbb_terminal/miscellaneous/portfolio_examples/optimization/defaults.ini deleted file mode 100644 index 07a62ace099..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/optimization/defaults.ini +++ /dev/null @@ -1,8 +0,0 @@ -[OPENBB] -historic_period=3y -log_returns=0 -return_frequency=d -max_nan=0.05 -threshold_value=0.3 -nan_fill_method=time -significance_level=0.05 \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/portfolio_examples/optimization/example.ini b/openbb_terminal/miscellaneous/portfolio_examples/optimization/example.ini deleted file mode 100644 index 2d90c95cef0..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/optimization/example.ini +++ /dev/null @@ -1,7 +0,0 @@ -[OPENBB] -interval=3y -log_returns=0 -freq=d -maxnan=0.05 -threshold=0.3 -alpha=0.05 diff --git a/openbb_terminal/miscellaneous/portfolio_examples/optimization/james.ini b/openbb_terminal/miscellaneous/portfolio_examples/optimization/james.ini deleted file mode 100644 index d53c47b6845..00000000000 --- a/openbb_terminal/miscellaneous/portfolio_examples/optimization/james.ini +++ /dev/null @@ -1,7 +0,0 @@ -[OPENBB] -freq = d -maxnan = 1.69 -method = time -risk_measure = MV -alpha = 3 - diff --git a/openbb_terminal/miscellaneous/routines/.gitkeep b/openbb_terminal/miscellaneous/routines/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_terminal/miscellaneous/routines/README.md b/openbb_terminal/miscellaneous/routines/README.md deleted file mode 100644 index 72dbe67a594..00000000000 --- a/openbb_terminal/miscellaneous/routines/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# ROUTINES - -This folder introduces the concept of routines, which are meant for the user to develop and run at once. The notebook reports is a better approach to this idea, but currently the development of this is not trivial. On the other hand, the development of this is trivial as long as the user is familiar with our terminal interface. - -Try out with: - -```bash -python terminal.py routines/example.openbb -``` - -Or within the Terminal, use: - -```bash -exe routines/example.openbb -``` diff --git a/openbb_terminal/miscellaneous/routines/comparison_demo.openbb b/openbb_terminal/miscellaneous/routines/comparison_demo.openbb deleted file mode 100644 index 421be297e85..00000000000 --- a/openbb_terminal/miscellaneous/routines/comparison_demo.openbb +++ /dev/null @@ -1,29 +0,0 @@ -# Go into the stocks context -stocks - -# Load a ticker that's given as a first argument of the routine -load USB - -# Go into the Comparison Analysis Menu -ca - -# Get similar companies -set C,USB,WFC,JPM,TD,GS,PNC,TFC,BAC,COF - -# Show the historical prices -historical -n - -# Show a correlation matrix -hcorr - -# Compare valuations -valuation - -# Compare performance -performance - -# Show cashflows -cashflow - -# Return to home -/ \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/darkpool_demo.openbb b/openbb_terminal/miscellaneous/routines/darkpool_demo.openbb deleted file mode 100644 index ae6fd33616a..00000000000 --- a/openbb_terminal/miscellaneous/routines/darkpool_demo.openbb +++ /dev/null @@ -1,40 +0,0 @@ -# Select location folder to export data to (if doesn't exist, will be created by default) -# export didier_analysis_on_$ARGV[0] - -# Go into the stocks context -stocks - -# Navigate to Dark Pools and Short Data Menu -dps - -# Show the most shorted stocks on Yahoo Finance -shorted - -# Show the stocks with the highest short interest on https://highshortinterest.com -hsi - -# Show the top 25 largest Dark Pool positions from https://stockgrid.io -pos -l 25 -pos -l 25 -a - -# Get the Cost-to-Borrow List -ctb - -# Get the days-to-cover list and sort -sidtc -s si -sidtc - -# Load Apple as a ticker -load AAPL - -# Short Volume vs Position -spos - -# Price vs. Short Interest -psi - -# Export the Cost-to-Borrow list as a spreadsheet to examine. -ctb - -# Return to home -/ \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/dd_demo.openbb b/openbb_terminal/miscellaneous/routines/dd_demo.openbb deleted file mode 100644 index 873b8e0d745..00000000000 --- a/openbb_terminal/miscellaneous/routines/dd_demo.openbb +++ /dev/null @@ -1,38 +0,0 @@ -# Select location folder to export data to (if doesn't exist, will be created by default) -# export didier_analysis_on_$ARGV[0] - -# Go into the stocks context -stocks - -# Load a ticker that's given as a first argument of the routine -load CF - -# Enter the Due Diligence submenu -dd - -# Print last twenty SEC filings -sec -l 20 - -# Print a chart and raw table of historical price targets -pt -pt -l 20 --raw - -# See a list of public companies that are customers of, or suppliers to, CF Industries -customer -supplier - -# Change tickers to $TSLA -load tsla - -# Display table of the last twenty $TSLA trades across all ARK funds -arktrades -l 20 - -# Export a spreadsheet of historic ARK fund trades of $HOOD -load hood -arktrades --export xlsx - -# Show future earnings estimates for $HOOD -est - -# Show recent analyst upgrades/downgrades -analyst diff --git a/openbb_terminal/miscellaneous/routines/discovery_demo.openbb b/openbb_terminal/miscellaneous/routines/discovery_demo.openbb deleted file mode 100644 index d4a61701214..00000000000 --- a/openbb_terminal/miscellaneous/routines/discovery_demo.openbb +++ /dev/null @@ -1,29 +0,0 @@ -# Enter the discovery menu -stocks/disc - -# Show a dividend calendar -divcal -l 25 - -# Show upcoming earnings -upcoming - -# Show Ark trades -arkord - -# See news from Alpha Vantage -cnews -t issuance -cnews -t m-a - -# Gainers and Losers from Yahoo -gainers -losers -active - -# Fidelity Order Flow -ford -l 25 - -# Next IPOs scheduled -fipo - -# Hot Penny Stocks -hotpenny -l 25 diff --git a/openbb_terminal/miscellaneous/routines/due_diligence_stock.openbb b/openbb_terminal/miscellaneous/routines/due_diligence_stock.openbb deleted file mode 100644 index 26a6404cdd6..00000000000 --- a/openbb_terminal/miscellaneous/routines/due_diligence_stock.openbb +++ /dev/null @@ -1,83 +0,0 @@ -# This script requires you to use a ticker as an argument. This can be done with the following: -# exe due_diligence_stock.openbb -i AMT - -# Go to the stocks menu -stocks - -# Load a ticker, given the argument used. E.g. -i AMT -load $ARGV[0] - -# Display stock price over time -candle - -# Check market cap -fa/mktcap - -# Check company management -mgmt - -# Check fundamentals -income/balance/cash - -# Look into sustainability -sust - -# Look into historical dividends -divs - -# Display most important notes of SEC filings based on a NLP model -analysis - -# Create discounted cash flow spreadsheet -dcf - -# show latest insider activity -../ins/stats - -# check price vs short interest volume -../dps/psi - -# check historical quarterly government contracts -../gov/histcont - -# check rating from analysts -../dd/rating - -# check price targets over time along share price -pt - -# check annual earnings estimates -est - -# check simple moving average 20,50 window -../ta/sma - -# check recommendation and summary based on main technical analysis indicators -recom/summary - -# check Twitter's sentiment on the ticker -../ba/sentiment - -# go into sector and industry analysis menu -../sia - -# check total cash metrics across similar tickers -metric tc - -# check free cash flow metrics across similar tickers -metric fcf - -# check operating income over time -vis oi - -# go into comparison analysis menu -ca - -# share price over time -historical - -# correlation heatmap -hcorr - -# compare fundamentals across these companies -cashflow/balance/income diff --git a/openbb_terminal/miscellaneous/routines/econometrics_demo.openbb b/openbb_terminal/miscellaneous/routines/econometrics_demo.openbb deleted file mode 100644 index ce9c33b90ee..00000000000 --- a/openbb_terminal/miscellaneous/routines/econometrics_demo.openbb +++ /dev/null @@ -1,19 +0,0 @@ -# Go into the econometrics context -econometrics - -# Load the wage_panel dataset and include an alias -load wage_panel -a wp - -# Set the MultiIndex, allowing for Panel regressions to be performed -index wp -i nr,year - -# Change the type of the year column so it can be included as time effects within the regressions -type wp.year -f category - -# Perform a Pooled OLS, Random Effects and Fixed Effects estimation -panel -d wp.lwage -i wp.black,wp.hisp,wp.exper,wp.expersq,wp.married,wp.educ,wp.union,wp.year -panel -d wp.lwage -i wp.black,wp.hisp,wp.exper,wp.expersq,wp.married,wp.educ,wp.union,wp.year -r re -panel -d wp.lwage -i wp.expersq,wp.union,wp.married,wp.year -r fe - -# Compare the results obtained from these regressions -compare \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/example.openbb b/openbb_terminal/miscellaneous/routines/example.openbb deleted file mode 100644 index 69e4cb4b4a4..00000000000 --- a/openbb_terminal/miscellaneous/routines/example.openbb +++ /dev/null @@ -1,27 +0,0 @@ -# Go to the stocks menu -stocks - -# Load Palantir Technologies (PLTR) -load pltr - -# Enter the Due Diligence (dd) menu -dd - -# Show price targets, both the chart and the table -pt -pt --raw - -# Enter the Insider menu -../ins - -# Show open insider filtered data for Palantir Technologies -stats - -# Enter the Technical Analysis (ta) menu -../ta - -# Show the fibonacci retracement levels -fib - -# Return to home -/ diff --git a/openbb_terminal/miscellaneous/routines/example_with_inputs.openbb b/openbb_terminal/miscellaneous/routines/example_with_inputs.openbb deleted file mode 100644 index 20a6397a37f..00000000000 --- a/openbb_terminal/miscellaneous/routines/example_with_inputs.openbb +++ /dev/null @@ -1,26 +0,0 @@ -# This script requires you to use arguments. This can be done with the following: -# exe example_with_inputs.openbb -i TSLA,AAPL,MSFT - -# Go to the stocks menu -stocks - -# Load a ticker, given the argument used. E.g. -i TSLA -load $ARGV[0] - -# Enter the Technical Analysis (ta) menu -ta - -# Show the fibonacci retracement levels -fib - -# Enter the comparison analysis (ca) menu -../ca - -# Set two extra tickers based on the arguments used. E.g. -i TSLA,AAPL,MSFT -set $ARGV[1],$ARGV[2] - -# Plot the historical prices -historical - -# Return to home -/ \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/example_with_inputs_saved.openbb b/openbb_terminal/miscellaneous/routines/example_with_inputs_saved.openbb deleted file mode 100644 index 89355838c11..00000000000 --- a/openbb_terminal/miscellaneous/routines/example_with_inputs_saved.openbb +++ /dev/null @@ -1,80 +0,0 @@ -# This script requires you to use an argument. This can be done with the following: -# exe routines/example_with_inputs_saved.openbb -i AMZN - -# Select location folder to export data to (if doesn't exist, will be created by default) -export didier_analysis_on_$ARGV[0] - -# Go into the stocks context -stocks - -# Load a ticker that's given as a first argument of the routine -load $ARGV[0] - -# Go into the Sector and Industry analysis -sia - -# When filtering by industry peers remove market cap filtering -clear mktcap - -# Compare ticker against industry peers regarding their revenues over time -vis re --export jpg - -# Filter by large market cap -mktcap Large - -# Compare industry peers (with large market cap) regarding their current quick ratio -metric qr --export jpg - -# Take these companies to Comparison Analysis menu -ca - -# Access these companies historical raw price since 2019 -historical -s 2019-01-01 -n --export jpg - -# Compute their correlation of price -hcorr -s 2019-01-01 --export jpg - -# Compare their income statements for current year -income --export csv - -# Go back one menu to the main stocks context -.. - -# Enter in the Dark Pool short menu -dps - -# Shows stock price vs short interest volume -psi --export jpg,csv - -# Go back one menu and go into Behavioural Analysis menu -../ba - -# Check interest on google search of covid and quarantine correlated with ticker price -interest -s 2019-01-01 -w covid,quarantine --export interest_with_covid_quarantine.jpg - -# Correlate headlines news sentiment with stock price -snews --export jpg - -# Check shareholders of company (leave menu, go into Fundamental Analysis command and call command) -../fa/shrs --export csv - -# Get SEC filings -../dd/sec --export csv - -# Analyst ratings over time -rot --export jpg - -# Price targets over time vs stock price -pt --export jpg - -# Apply Relative Strength Index to the stock price -../ta/rsi --export jpg - -# Get similar companies arccording to Finnhub API -../ca/getfinnhub - -# Compare their volume -volume --export jpg - -# Return to home -/ \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/fa_demo.openbb b/openbb_terminal/miscellaneous/routines/fa_demo.openbb deleted file mode 100644 index 483c15c08e3..00000000000 --- a/openbb_terminal/miscellaneous/routines/fa_demo.openbb +++ /dev/null @@ -1,47 +0,0 @@ -# Demonstration of the Fundamental Analysis features, with a user-defined ticker. -# This can be done on the home menu through 'exe fa_demo.openbb -i AAPL' - -# Enter stocks menu, load $ARGV[0], enter the Fundamental Analysis submenu and show a quote and overview statistics. -stocks -load $ARGV[0] -fa -quote -overview -mgmt - -# NLP analysis of SEC filings -analysis - -# Table of the corporate executives with links to their recent trading activity. -mgmt - -# Major shareholders -shrs - -# Sustainability Metrics -sust - -# Performance ratios -key -enterprise -l 10 -ratios -l 10 -growth -l 10 -metrics -l 10 - -# Financial Statements -income --source Polygon -income -q -l 8 --source Polygon -balance --source Polygon -balance -q -l 8 --source Polygon -cash -l 8 --source FinancialModelingPrep -data - -# Charts -divs -p -splits -mktcap -s 1900-01-01 - - -# Discount Cash Flow -dcfc -l 10 -dcf diff --git a/openbb_terminal/miscellaneous/routines/gov_demo.openbb b/openbb_terminal/miscellaneous/routines/gov_demo.openbb deleted file mode 100644 index 3ece377a48f..00000000000 --- a/openbb_terminal/miscellaneous/routines/gov_demo.openbb +++ /dev/null @@ -1,43 +0,0 @@ -# This script requires you to use arguments. This can be done with the following: -# exe routines/example_with_inputs.openbb -i TSLA,AAPL,MSFT - -# Go to the Government submenu -stocks -gov - -# Last Senate, Congress & House trades -lasttrades congress -lasttrades senate -lasttrades house - -# Lobbying efforts -toplobbying -toplobbying -l 50 --raw - -# Government spending -lastcontracts -p 1 -l 100 -s - -# Load Microsoft for analysis -load msft - -# Show government officials trades over six months -gtrades congress -gtrades congress --raw -gtrades senate -gtrades senate --raw -gtrades house -gtrades house --raw - -# Show MSFT lobbying efforts on sigle-issue agendas -lobbying -l 20 - -# Historical Quarterly Government Contracts Awarded to MSFT -histcont - -# Top tickers for overall trading by elected officials -topbuys congress -topbuys senate -topbuys house -topsells congress -topsells senate -topsells house \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/insider_demo.openbb b/openbb_terminal/miscellaneous/routines/insider_demo.openbb deleted file mode 100644 index 40a181983f4..00000000000 --- a/openbb_terminal/miscellaneous/routines/insider_demo.openbb +++ /dev/null @@ -1,34 +0,0 @@ -# This script does not require you to use arguments. - -# Go to the Insider Trading menu. -stocks -ins - -# Commands not dependent on a loaded ticker -lcb -lit -lis -blcs -tispm -tippm -lip -lpsb - -# Screener functions -set Gold-Silver -filter -set Retail-Trade -filter -set Guided-Missiles -filter -set Credit-Industry -filter -set Pharmaceuticals -filter - -# Functions requiring a ticker - -load spgi -s 2022-01-01 -act -stats -lins \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/options_demo.openbb b/openbb_terminal/miscellaneous/routines/options_demo.openbb deleted file mode 100644 index 7c7091f8b7f..00000000000 --- a/openbb_terminal/miscellaneous/routines/options_demo.openbb +++ /dev/null @@ -1,58 +0,0 @@ -# This script does not require you to use arguments. - -# Go to the Options menu and load SPY with an expiry that is the second closest date. -stocks -options -load SPY -exp 0 - -# Show the chain's info -info - -# Show the Put/Call Ratio with a 10, 30, and 90 day window. -pcr -l 10 -pcr -l 30 -pcr -l 90 - -# Show Open Interest and Volume -vol -oi - -# Plot strike vs last trade date of puts and calls. -plot -p -x s -y ltd -plot -x s -y ltd - -# Plot the volatility smile of puts and calls. -plot -c smile -plot -p -c smile - -# Get chains and greeks data and export to spreadsheet. - -chains --export xlsx -greeks -a -d 1.4 -r 1 -greeks -p -a -d 1.4 -r 1 - -# Binomial pricing for $400 strike put and call. -binom -s 400 -binom -p -s 400 - -# Run screeners - -screen -set Highest_OI -scr -set Highest_Volume -scr -set Highest_IV -scr -set SPY_ATM_Calls -scr -set SPY_ATM_Poots - -# Show unusual options list and export to a spreadsheet -.. -unu -l 500 --export xlsx - - - - diff --git a/openbb_terminal/miscellaneous/routines/portfolio_optimization_demo.openbb b/openbb_terminal/miscellaneous/routines/portfolio_optimization_demo.openbb deleted file mode 100644 index 8e7826bdd1d..00000000000 --- a/openbb_terminal/miscellaneous/routines/portfolio_optimization_demo.openbb +++ /dev/null @@ -1,26 +0,0 @@ -# Go to the Portfolio Optimization (po) menu -portfolio/po - -# Load in an allocation sheet with all S&P 500 tickers -load SP_500_Portfolio.xlsx - -# Load in a parameters file -file OpenBB_Parameters_Template_v1.0.0.xlsx - -# Apply the Hierarchical Risk Parity (hrp) technique -hrp - -# Show HRP results based on sector -show HRP_0 -ct SECTOR - -# Plot the sector distribution -plot HRP_0 -ct SECTOR -pi - -# Show a histogram of returns and drawdowns -plot HRP_0 -ct SECTOR -hi -dd - -# Show assets clustermap and risk contribution -plot HRP_0 -ct SECTOR -rc -he - -# Return to home -/ \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/routine_example.openbb b/openbb_terminal/miscellaneous/routines/routine_example.openbb new file mode 100644 index 00000000000..95f4efd903a --- /dev/null +++ b/openbb_terminal/miscellaneous/routines/routine_example.openbb @@ -0,0 +1,23 @@ +# Go into the stocks context +stocks + +# Load a company ticker, e.g. Apple +load AAPL + +# Show a candle chart with a 20 day Moving Average +candle --ma 20 + +# Switch over to the Due Diligence menu +dd + +# Show analyst ratings +analyst + +# Show price targets charts +pt + +# Show future estimations +est + +# Return to home +home \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/stock_screener_demo.openbb b/openbb_terminal/miscellaneous/routines/stock_screener_demo.openbb deleted file mode 100644 index d2d2af3f1fd..00000000000 --- a/openbb_terminal/miscellaneous/routines/stock_screener_demo.openbb +++ /dev/null @@ -1,47 +0,0 @@ -# Enter the Stock Screener menu -stocks/scr - -# Top Gainers -technical -s Gap -technical -s RSI -overview -s Volume - -# Strong Support Levels Preset -set stocks_strong_support_levels -overview -performance -financial - -# Multiple Bottom Preset -set multiple_bottom -technical -l 15 -s RSI - -# Cheap Dividend -set cheap_dividend -overview -l 20 -s Market Cap - -# Potential Reversals -set potential_reversals -performance -s Perf Week -overview -s Volume - -# Unusual Volume -set unusual_volume -performance -l 20 -s Volume -overview -l 20 -s Market Cap - -# Value stocks -set value_stocks -overview -s Market Cap -performance - -# Major News -set major_news -overview -l 20 -s Market Cap -performance -l 20 -s Volume - -# Display Correlation Heat Map of the last screened tickers -ca -hcorr -t r --display-full-matrix - -# Scroll back up the terminal screen to review the different outputs of the screeners diff --git a/openbb_terminal/miscellaneous/routines/stocks_demo.openbb b/openbb_terminal/miscellaneous/routines/stocks_demo.openbb deleted file mode 100644 index 834a94e4044..00000000000 --- a/openbb_terminal/miscellaneous/routines/stocks_demo.openbb +++ /dev/null @@ -1,36 +0,0 @@ -# Go into the stocks context -stocks - -# Load a company ticker, e.g. Amazon -load AMZN - -# Show a simple plot of the ticker, adding in any basic indicator. -candle --ma 20,30 - -# Switch over to the due diligence menu -dd - -# Show the price targets of Amazon, both the graph as well as the table -pt -pt --raw - -# Show estimates of annual and quarterly earnings as well as quarterly revenue estimates -est - -# Open the comparison analysis menu (ca) -../ca - -# Pick stocks that are competitors to Amazon -add ebay,wmt,tgt,baba,jd - -# Determine the valuations of each company -valuation - -# Show correlations between each company -hcorr - -# Figure out the sentiment perceived of each company -sentiment - -# Return to home -/ diff --git a/openbb_terminal/miscellaneous/routines/ta_demo.openbb b/openbb_terminal/miscellaneous/routines/ta_demo.openbb deleted file mode 100644 index ab835c4bad8..00000000000 --- a/openbb_terminal/miscellaneous/routines/ta_demo.openbb +++ /dev/null @@ -1,37 +0,0 @@ -# Demonstration of the Technical Analysis features, using SPY. No arguments are required to run this routine. - -# Enter stocks menu, load intraday SPY with 30 minute interval, enter the T/A menu. -stocks -load spy -i 30 -ta - -# Show the RSI and OBV for 30 minute intervals and weekly intervals. -rsi -obv -.. -load spy -w -ta -rsi -obv - -# Show one week of OBV, VWAP, Bollinger Bands, MACD, and Fibonacci Retracements with one-minute intervals. -.. -load spy -i 1 -ta -obv -vwap -bbands -fib -macd - -# Print T/A summary -summary - -# Show long chart of SPY with monthly intervals with EMA for 3 and 6 months & MACD using six months as the slow and 4 as the signal. -.. -load spy -s 1993-02-01 -m -ta -ema 3,6 -macd -f 1 -s 6 --signal 4 -.. -candle --ma 6,12 \ No newline at end of file diff --git a/openbb_terminal/miscellaneous/routines/template.openbb b/openbb_terminal/miscellaneous/routines/template.openbb deleted file mode 100644 index 9e1eb14ea84..00000000000 --- a/openbb_terminal/miscellaneous/routines/template.openbb +++ /dev/null @@ -1,17 +0,0 @@ -# This is a comment, below you can find a command -stocks - -# This is another comment -# There can be multiple lines of comments if desired -load MSFT - -# You can also have multiple commands below each other -candle -fa - -# You have the ability to move around menus by using / -/portfolio/po -/economy - -# Returning to home is easily done with home -home \ No newline at end of file diff --git a/openbb_terminal/stocks/insider/presets/Agriculture.ini b/openbb_terminal/miscellaneous/stocks/insider/Agriculture.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Agriculture.ini rename to openbb_terminal/miscellaneous/stocks/insider/Agriculture.ini diff --git a/openbb_terminal/stocks/insider/presets/Agro-Chemicals.ini b/openbb_terminal/miscellaneous/stocks/insider/Agro-Chemicals.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Agro-Chemicals.ini rename to openbb_terminal/miscellaneous/stocks/insider/Agro-Chemicals.ini diff --git a/openbb_terminal/stocks/insider/presets/Air-Transportation.ini b/openbb_terminal/miscellaneous/stocks/insider/Air-Transportation.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Air-Transportation.ini rename to openbb_terminal/miscellaneous/stocks/insider/Air-Transportation.ini diff --git a/openbb_terminal/stocks/insider/presets/Apparel.ini b/openbb_terminal/miscellaneous/stocks/insider/Apparel.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Apparel.ini rename to openbb_terminal/miscellaneous/stocks/insider/Apparel.ini diff --git a/openbb_terminal/stocks/insider/presets/Banks.ini b/openbb_terminal/miscellaneous/stocks/insider/Banks.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Banks.ini rename to openbb_terminal/miscellaneous/stocks/insider/Banks.ini diff --git a/openbb_terminal/stocks/insider/presets/Brokers.ini b/openbb_terminal/miscellaneous/stocks/insider/Brokers.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Brokers.ini rename to openbb_terminal/miscellaneous/stocks/insider/Brokers.ini diff --git a/openbb_terminal/stocks/insider/presets/Building-Materials.ini b/openbb_terminal/miscellaneous/stocks/insider/Building-Materials.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Building-Materials.ini rename to openbb_terminal/miscellaneous/stocks/insider/Building-Materials.ini diff --git a/openbb_terminal/stocks/insider/presets/Business-Services.ini b/openbb_terminal/miscellaneous/stocks/insider/Business-Services.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Business-Services.ini rename to openbb_terminal/miscellaneous/stocks/insider/Business-Services.ini diff --git a/openbb_terminal/stocks/insider/presets/Closed-End-Funds.ini b/openbb_terminal/miscellaneous/stocks/insider/Closed-End-Funds.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Closed-End-Funds.ini rename to openbb_terminal/miscellaneous/stocks/insider/Closed-End-Funds.ini diff --git a/openbb_terminal/stocks/insider/presets/Construction.ini b/openbb_terminal/miscellaneous/stocks/insider/Construction.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Construction.ini rename to openbb_terminal/miscellaneous/stocks/insider/Construction.ini diff --git a/openbb_terminal/stocks/insider/presets/Credit-Industry.ini b/openbb_terminal/miscellaneous/stocks/insider/Credit-Industry.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Credit-Industry.ini rename to openbb_terminal/miscellaneous/stocks/insider/Credit-Industry.ini diff --git a/openbb_terminal/stocks/insider/presets/Durable-Goods.ini b/openbb_terminal/miscellaneous/stocks/insider/Durable-Goods.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Durable-Goods.ini rename to openbb_terminal/miscellaneous/stocks/insider/Durable-Goods.ini diff --git a/openbb_terminal/stocks/insider/presets/Electronics.ini b/openbb_terminal/miscellaneous/stocks/insider/Electronics.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Electronics.ini rename to openbb_terminal/miscellaneous/stocks/insider/Electronics.ini diff --git a/openbb_terminal/stocks/insider/presets/Furniture.ini b/openbb_terminal/miscellaneous/stocks/insider/Furniture.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Furniture.ini rename to openbb_terminal/miscellaneous/stocks/insider/Furniture.ini diff --git a/openbb_terminal/stocks/insider/presets/Gold-Silver.ini b/openbb_terminal/miscellaneous/stocks/insider/Gold-Silver.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Gold-Silver.ini rename to openbb_terminal/miscellaneous/stocks/insider/Gold-Silver.ini diff --git a/openbb_terminal/stocks/insider/presets/Grocery.ini b/openbb_terminal/miscellaneous/stocks/insider/Grocery.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Grocery.ini rename to openbb_terminal/miscellaneous/stocks/insider/Grocery.ini diff --git a/openbb_terminal/stocks/insider/presets/Ground-Freight.ini b/openbb_terminal/miscellaneous/stocks/insider/Ground-Freight.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Ground-Freight.ini rename to openbb_terminal/miscellaneous/stocks/insider/Ground-Freight.ini diff --git a/openbb_terminal/stocks/insider/presets/Guided-Missiles.ini b/openbb_terminal/miscellaneous/stocks/insider/Guided-Missiles.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Guided-Missiles.ini rename to openbb_terminal/miscellaneous/stocks/insider/Guided-Missiles.ini diff --git a/openbb_terminal/stocks/insider/presets/Health.ini b/openbb_terminal/miscellaneous/stocks/insider/Health.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Health.ini rename to openbb_terminal/miscellaneous/stocks/insider/Health.ini diff --git a/openbb_terminal/stocks/insider/presets/Hotels.ini b/openbb_terminal/miscellaneous/stocks/insider/Hotels.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Hotels.ini rename to openbb_terminal/miscellaneous/stocks/insider/Hotels.ini diff --git a/openbb_terminal/stocks/insider/presets/Insurance-Agents.ini b/openbb_terminal/miscellaneous/stocks/insider/Insurance-Agents.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Insurance-Agents.ini rename to openbb_terminal/miscellaneous/stocks/insider/Insurance-Agents.ini diff --git a/openbb_terminal/stocks/insider/presets/Insurance-Carriers.ini b/openbb_terminal/miscellaneous/stocks/insider/Insurance-Carriers.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Insurance-Carriers.ini rename to openbb_terminal/miscellaneous/stocks/insider/Insurance-Carriers.ini diff --git a/openbb_terminal/stocks/insider/presets/Investment-Offices.ini b/openbb_terminal/miscellaneous/stocks/insider/Investment-Offices.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Investment-Offices.ini rename to openbb_terminal/miscellaneous/stocks/insider/Investment-Offices.ini diff --git a/openbb_terminal/stocks/insider/presets/Legal.ini b/openbb_terminal/miscellaneous/stocks/insider/Legal.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Legal.ini rename to openbb_terminal/miscellaneous/stocks/insider/Legal.ini diff --git a/openbb_terminal/stocks/insider/presets/Lumber.ini b/openbb_terminal/miscellaneous/stocks/insider/Lumber.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Lumber.ini rename to openbb_terminal/miscellaneous/stocks/insider/Lumber.ini diff --git a/openbb_terminal/stocks/insider/presets/Manufacturing.ini b/openbb_terminal/miscellaneous/stocks/insider/Manufacturing.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Manufacturing.ini rename to openbb_terminal/miscellaneous/stocks/insider/Manufacturing.ini diff --git a/openbb_terminal/stocks/insider/presets/Mining.ini b/openbb_terminal/miscellaneous/stocks/insider/Mining.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Mining.ini rename to openbb_terminal/miscellaneous/stocks/insider/Mining.ini diff --git a/openbb_terminal/stocks/insider/presets/Mortgages.ini b/openbb_terminal/miscellaneous/stocks/insider/Mortgages.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Mortgages.ini rename to openbb_terminal/miscellaneous/stocks/insider/Mortgages.ini diff --git a/openbb_terminal/stocks/insider/presets/Nondurable-Goods.ini b/openbb_terminal/miscellaneous/stocks/insider/Nondurable-Goods.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Nondurable-Goods.ini rename to openbb_terminal/miscellaneous/stocks/insider/Nondurable-Goods.ini diff --git a/openbb_terminal/stocks/insider/presets/Personal-Credit.ini b/openbb_terminal/miscellaneous/stocks/insider/Personal-Credit.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Personal-Credit.ini rename to openbb_terminal/miscellaneous/stocks/insider/Personal-Credit.ini diff --git a/openbb_terminal/stocks/insider/presets/Pharmaceuticals.ini b/openbb_terminal/miscellaneous/stocks/insider/Pharmaceuticals.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Pharmaceuticals.ini rename to openbb_terminal/miscellaneous/stocks/insider/Pharmaceuticals.ini diff --git a/openbb_terminal/stocks/insider/presets/Professional-Services.ini b/openbb_terminal/miscellaneous/stocks/insider/Professional-Services.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Professional-Services.ini rename to openbb_terminal/miscellaneous/stocks/insider/Professional-Services.ini diff --git a/openbb_terminal/stocks/insider/presets/Railroads.ini b/openbb_terminal/miscellaneous/stocks/insider/Railroads.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Railroads.ini rename to openbb_terminal/miscellaneous/stocks/insider/Railroads.ini diff --git a/openbb_terminal/stocks/insider/presets/Real-Estate.ini b/openbb_terminal/miscellaneous/stocks/insider/Real-Estate.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Real-Estate.ini rename to openbb_terminal/miscellaneous/stocks/insider/Real-Estate.ini diff --git a/openbb_terminal/stocks/insider/presets/Restaurants.ini b/openbb_terminal/miscellaneous/stocks/insider/Restaurants.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Restaurants.ini rename to openbb_terminal/miscellaneous/stocks/insider/Restaurants.ini diff --git a/openbb_terminal/stocks/insider/presets/Retail-Stores.ini b/openbb_terminal/miscellaneous/stocks/insider/Retail-Stores.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Retail-Stores.ini rename to openbb_terminal/miscellaneous/stocks/insider/Retail-Stores.ini diff --git a/openbb_terminal/stocks/insider/presets/Retail-Trade.ini b/openbb_terminal/miscellaneous/stocks/insider/Retail-Trade.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Retail-Trade.ini rename to openbb_terminal/miscellaneous/stocks/insider/Retail-Trade.ini diff --git a/openbb_terminal/stocks/insider/presets/Tobacco.ini b/openbb_terminal/miscellaneous/stocks/insider/Tobacco.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Tobacco.ini rename to openbb_terminal/miscellaneous/stocks/insider/Tobacco.ini diff --git a/openbb_terminal/stocks/insider/presets/Utility-Communications.ini b/openbb_terminal/miscellaneous/stocks/insider/Utility-Communications.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Utility-Communications.ini rename to openbb_terminal/miscellaneous/stocks/insider/Utility-Communications.ini diff --git a/openbb_terminal/stocks/insider/presets/Utility-Gas.ini b/openbb_terminal/miscellaneous/stocks/insider/Utility-Gas.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Utility-Gas.ini rename to openbb_terminal/miscellaneous/stocks/insider/Utility-Gas.ini diff --git a/openbb_terminal/stocks/insider/presets/Wholesale-Trade.ini b/openbb_terminal/miscellaneous/stocks/insider/Wholesale-Trade.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/Wholesale-Trade.ini rename to openbb_terminal/miscellaneous/stocks/insider/Wholesale-Trade.ini diff --git a/openbb_terminal/stocks/insider/presets/template.ini b/openbb_terminal/miscellaneous/stocks/insider/template.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/template.ini rename to openbb_terminal/miscellaneous/stocks/insider/template.ini diff --git a/openbb_terminal/stocks/insider/presets/whales.ini b/openbb_terminal/miscellaneous/stocks/insider/whales.ini similarity index 100% rename from openbb_terminal/stocks/insider/presets/whales.ini rename to openbb_terminal/miscellaneous/stocks/insider/whales.ini diff --git a/openbb_terminal/stocks/screener/presets/5pct_above_low.ini b/openbb_terminal/miscellaneous/stocks/screener/5pct_above_low.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/5pct_above_low.ini rename to openbb_terminal/miscellaneous/stocks/screener/5pct_above_low.ini diff --git a/openbb_terminal/stocks/screener/presets/analyst_strong_buy.ini b/openbb_terminal/miscellaneous/stocks/screener/analyst_strong_buy.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/analyst_strong_buy.ini rename to openbb_terminal/miscellaneous/stocks/screener/analyst_strong_buy.ini diff --git a/openbb_terminal/stocks/screener/presets/break_out_stocks.ini b/openbb_terminal/miscellaneous/stocks/screener/break_out_stocks.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/break_out_stocks.ini rename to openbb_terminal/miscellaneous/stocks/screener/break_out_stocks.ini diff --git a/openbb_terminal/stocks/screener/presets/buffett_like.ini b/openbb_terminal/miscellaneous/stocks/screener/buffett_like.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/buffett_like.ini rename to openbb_terminal/miscellaneous/stocks/screener/buffett_like.ini diff --git a/openbb_terminal/stocks/screener/presets/bull_runs_over_10pct.ini b/openbb_terminal/miscellaneous/stocks/screener/bull_runs_over_10pct.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/bull_runs_over_10pct.ini rename to openbb_terminal/miscellaneous/stocks/screener/bull_runs_over_10pct.ini diff --git a/openbb_terminal/stocks/screener/presets/channel_up_and_low_debt_and_sma_50and200.ini b/openbb_terminal/miscellaneous/stocks/screener/channel_up_and_low_debt_and_sma_50and200.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/channel_up_and_low_debt_and_sma_50and200.ini rename to openbb_terminal/miscellaneous/stocks/screener/channel_up_and_low_debt_and_sma_50and200.ini diff --git a/openbb_terminal/stocks/screener/presets/cheap_bottom_dividend.ini b/openbb_terminal/miscellaneous/stocks/screener/cheap_bottom_dividend.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/cheap_bottom_dividend.ini rename to openbb_terminal/miscellaneous/stocks/screener/cheap_bottom_dividend.ini diff --git a/openbb_terminal/stocks/screener/presets/cheap_dividend.ini b/openbb_terminal/miscellaneous/stocks/screener/cheap_dividend.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/cheap_dividend.ini rename to openbb_terminal/miscellaneous/stocks/screener/cheap_dividend.ini diff --git a/openbb_terminal/stocks/screener/presets/cheap_oversold.ini b/openbb_terminal/miscellaneous/stocks/screener/cheap_oversold.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/cheap_oversold.ini rename to openbb_terminal/miscellaneous/stocks/screener/cheap_oversold.ini diff --git a/openbb_terminal/stocks/screener/presets/continued_momentum_scan.ini b/openbb_terminal/miscellaneous/stocks/screener/continued_momentum_scan.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/continued_momentum_scan.ini rename to openbb_terminal/miscellaneous/stocks/screener/continued_momentum_scan.ini diff --git a/openbb_terminal/stocks/screener/presets/death_cross.ini b/openbb_terminal/miscellaneous/stocks/screener/death_cross.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/death_cross.ini rename to openbb_terminal/miscellaneous/stocks/screener/death_cross.ini diff --git a/openbb_terminal/stocks/screener/presets/golden_cross.ini b/openbb_terminal/miscellaneous/stocks/screener/golden_cross.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/golden_cross.ini rename to openbb_terminal/miscellaneous/stocks/screener/golden_cross.ini diff --git a/openbb_terminal/stocks/screener/presets/golden_cross_penny.ini b/openbb_terminal/miscellaneous/stocks/screener/golden_cross_penny.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/golden_cross_penny.ini rename to openbb_terminal/miscellaneous/stocks/screener/golden_cross_penny.ini diff --git a/openbb_terminal/stocks/screener/presets/growth_stocks.ini b/openbb_terminal/miscellaneous/stocks/screener/growth_stocks.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/growth_stocks.ini rename to openbb_terminal/miscellaneous/stocks/screener/growth_stocks.ini diff --git a/openbb_terminal/stocks/screener/presets/heavy_inst_ins.ini b/openbb_terminal/miscellaneous/stocks/screener/heavy_inst_ins.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/heavy_inst_ins.ini rename to openbb_terminal/miscellaneous/stocks/screener/heavy_inst_ins.ini diff --git a/openbb_terminal/stocks/screener/presets/high_vol_and_low_debt.ini b/openbb_terminal/miscellaneous/stocks/screener/high_vol_and_low_debt.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/high_vol_and_low_debt.ini rename to openbb_terminal/miscellaneous/stocks/screener/high_vol_and_low_debt.ini diff --git a/openbb_terminal/stocks/screener/presets/modified_dreman.ini b/openbb_terminal/miscellaneous/stocks/screener/modified_dreman.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/modified_dreman.ini rename to openbb_terminal/miscellaneous/stocks/screener/modified_dreman.ini diff --git a/openbb_terminal/stocks/screener/presets/modified_neff.ini b/openbb_terminal/miscellaneous/stocks/screener/modified_neff.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/modified_neff.ini rename to openbb_terminal/miscellaneous/stocks/screener/modified_neff.ini diff --git a/openbb_terminal/stocks/screener/presets/news_scanner.ini b/openbb_terminal/miscellaneous/stocks/screener/news_scanner.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/news_scanner.ini rename to openbb_terminal/miscellaneous/stocks/screener/news_scanner.ini diff --git a/openbb_terminal/stocks/screener/presets/oversold.ini b/openbb_terminal/miscellaneous/stocks/screener/oversold.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/oversold.ini rename to openbb_terminal/miscellaneous/stocks/screener/oversold.ini diff --git a/openbb_terminal/stocks/screener/presets/oversold_under_3dol.ini b/openbb_terminal/miscellaneous/stocks/screener/oversold_under_3dol.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/oversold_under_3dol.ini rename to openbb_terminal/miscellaneous/stocks/screener/oversold_under_3dol.ini diff --git a/openbb_terminal/stocks/screener/presets/oversold_under_5dol.ini b/openbb_terminal/miscellaneous/stocks/screener/oversold_under_5dol.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/oversold_under_5dol.ini rename to openbb_terminal/miscellaneous/stocks/screener/oversold_under_5dol.ini diff --git a/openbb_terminal/stocks/screener/presets/potential_reversals.ini b/openbb_terminal/miscellaneous/stocks/screener/potential_reversals.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/potential_reversals.ini rename to openbb_terminal/miscellaneous/stocks/screener/potential_reversals.ini diff --git a/openbb_terminal/stocks/screener/presets/recent_growth_and_support.ini b/openbb_terminal/miscellaneous/stocks/screener/recent_growth_and_support.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/recent_growth_and_support.ini rename to openbb_terminal/miscellaneous/stocks/screener/recent_growth_and_support.ini diff --git a/openbb_terminal/stocks/screener/presets/rosenwald.ini b/openbb_terminal/miscellaneous/stocks/screener/rosenwald.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/rosenwald.ini rename to openbb_terminal/miscellaneous/stocks/screener/rosenwald.ini diff --git a/openbb_terminal/stocks/screener/presets/rosenwald_gtfo.ini b/openbb_terminal/miscellaneous/stocks/screener/rosenwald_gtfo.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/rosenwald_gtfo.ini rename to openbb_terminal/miscellaneous/stocks/screener/rosenwald_gtfo.ini diff --git a/openbb_terminal/stocks/screener/presets/sexy_year.ini b/openbb_terminal/miscellaneous/stocks/screener/sexy_year.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/sexy_year.ini rename to openbb_terminal/miscellaneous/stocks/screener/sexy_year.ini diff --git a/openbb_terminal/stocks/screener/presets/short_squeeze_scan.ini b/openbb_terminal/miscellaneous/stocks/screener/short_squeeze_scan.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/short_squeeze_scan.ini rename to openbb_terminal/miscellaneous/stocks/screener/short_squeeze_scan.ini diff --git a/openbb_terminal/stocks/screener/presets/simplistic_momentum_scanner_under_7dol.ini b/openbb_terminal/miscellaneous/stocks/screener/simplistic_momentum_scanner_under_7dol.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/simplistic_momentum_scanner_under_7dol.ini rename to openbb_terminal/miscellaneous/stocks/screener/simplistic_momentum_scanner_under_7dol.ini diff --git a/openbb_terminal/stocks/screener/presets/stocks_strong_support_levels.ini b/openbb_terminal/miscellaneous/stocks/screener/stocks_strong_support_levels.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/stocks_strong_support_levels.ini rename to openbb_terminal/miscellaneous/stocks/screener/stocks_strong_support_levels.ini diff --git a/openbb_terminal/stocks/screener/presets/top_performers_all.ini b/openbb_terminal/miscellaneous/stocks/screener/top_performers_all.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/top_performers_all.ini rename to openbb_terminal/miscellaneous/stocks/screener/top_performers_all.ini diff --git a/openbb_terminal/stocks/screener/presets/top_performers_healthcare.ini b/openbb_terminal/miscellaneous/stocks/screener/top_performers_healthcare.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/top_performers_healthcare.ini rename to openbb_terminal/miscellaneous/stocks/screener/top_performers_healthcare.ini diff --git a/openbb_terminal/stocks/screener/presets/top_performers_tech.ini b/openbb_terminal/miscellaneous/stocks/screener/top_performers_tech.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/top_performers_tech.ini rename to openbb_terminal/miscellaneous/stocks/screener/top_performers_tech.ini diff --git a/openbb_terminal/stocks/screener/presets/under_15dol_stocks.ini b/openbb_terminal/miscellaneous/stocks/screener/under_15dol_stocks.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/under_15dol_stocks.ini rename to openbb_terminal/miscellaneous/stocks/screener/under_15dol_stocks.ini diff --git a/openbb_terminal/stocks/screener/presets/undervalue.ini b/openbb_terminal/miscellaneous/stocks/screener/undervalue.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/undervalue.ini rename to openbb_terminal/miscellaneous/stocks/screener/undervalue.ini diff --git a/openbb_terminal/stocks/screener/presets/unusual_volume.ini b/openbb_terminal/miscellaneous/stocks/screener/unusual_volume.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/unusual_volume.ini rename to openbb_terminal/miscellaneous/stocks/screener/unusual_volume.ini diff --git a/openbb_terminal/stocks/screener/presets/value_stocks.ini b/openbb_terminal/miscellaneous/stocks/screener/value_stocks.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/value_stocks.ini rename to openbb_terminal/miscellaneous/stocks/screener/value_stocks.ini diff --git a/openbb_terminal/stocks/screener/presets/weak_support_and_top_performers.ini b/openbb_terminal/miscellaneous/stocks/screener/weak_support_and_top_performers.ini similarity index 100% rename from openbb_terminal/stocks/screener/presets/weak_support_and_top_performers.ini rename to openbb_terminal/miscellaneous/stocks/screener/weak_support_and_top_performers.ini diff --git a/openbb_terminal/parent_classes.py b/openbb_terminal/parent_classes.py index 66bc7477c08..c7e1577815e 100644 --- a/openbb_terminal/parent_classes.py +++ b/openbb_terminal/parent_classes.py @@ -408,7 +408,7 @@ class BaseController(metaclass=ABCMeta): dest="command", default=None, help="Obtain documentation on the given command or menu", - choices=self.CHOICES_COMMANDS + self.CHOICES_MENUS, + choices=self.CHOICES_COMMANDS + self.CHOICES_MENUS + self.CHOICES_COMMON, ) if other_args and "-" not in other_args[0][0]: diff --git a/openbb_terminal/portfolio/portfolio_controller.py b/openbb_terminal/portfolio/portfolio_controller.py index 25da7ba23af..938908fd481 100644 --- a/openbb_terminal/portfolio/portfolio_controller.py +++ b/openbb_terminal/portfolio/portfolio_controller.py @@ -82,7 +82,6 @@ class PortfolioController(BaseController): CHOICES_MENUS = [ "bro", "po", - "pa", ] VALID_DISTRIBUTIONS = ["laplace", "student_t", "logistic", "normal"] AGGREGATION_METRICS = ["assets", "sectors", "countries", "regions"] @@ -121,15 +120,6 @@ class PortfolioController(BaseController): for file_type in self.file_types for filepath in self.DEFAULT_HOLDINGS_PATH.rglob(f"*.{file_type}") } - self.DATA_HOLDINGS_FILES.update( - { - filepath.name: filepath - for file_type in self.file_types - for filepath in ( - MISCELLANEOUS_DIRECTORY / "portfolio_examples" / "holdings" - ).rglob(f"*.{file_type}") - } - ) self.portfolio_df = pd.DataFrame( columns=[ @@ -224,7 +214,7 @@ class PortfolioController(BaseController): > bro brokers holdings, \t\t supports: robinhood, ally, degiro, coinbase > po portfolio optimization, \t optimize your portfolio weights efficiently[/menu] [cmds] - load load data into the portfolio + load load transactions into the portfolio (use load --example for an example) show show existing transactions bench define the benchmark [/cmds] @@ -314,7 +304,6 @@ class PortfolioController(BaseController): "--file", type=str, dest="file", - required="-h" not in other_args, help="The file to be loaded", choices={c: {} for c in self.DATA_HOLDINGS_FILES}, metavar="FILE", @@ -334,12 +323,28 @@ class PortfolioController(BaseController): dest="risk_free_rate", help="Set the risk free rate.", ) + parser.add_argument( + "-e", + "--example", + help="Run an example holdings file to understand how the portfolio menu can be used.", + dest="example", + action="store_true", + default=False, + ) if other_args and "-" not in other_args[0][0]: other_args.insert(0, "-f") ns_parser = self.parse_known_args_and_warn(parser, other_args) - if ns_parser and ns_parser.file: - if ns_parser.file in self.DATA_HOLDINGS_FILES: + if ns_parser and ns_parser.file or ns_parser and ns_parser.example: + if ns_parser.example: + file_location = ( + MISCELLANEOUS_DIRECTORY / "portfolio" / "holdings_example.xlsx" + ) + console.print( + "[green]Loading an example, please type `about` " + "to learn how to create your own Portfolio Excel sheet.[/green]\n" + ) + elif ns_parser.file in self.DATA_HOLDINGS_FILES: file_location = self.DATA_HOLDINGS_FILES[ns_parser.file] else: file_location = ns_parser.file # type: ignore @@ -352,6 +357,8 @@ class PortfolioController(BaseController): if ns_parser.name: self.portfolio_name = ns_parser.name + elif ns_parser.example: + self.portfolio_name = "OpenBB Example Portfolio" else: self.portfolio_name = ns_parser.file console.print( diff --git a/openbb_terminal/portfolio/portfolio_optimization/parameters/params_controller.py b/openbb_terminal/portfolio/portfolio_optimization/parameters/params_controller.py index 4535277a911..6577d7324d0 100644 --- a/openbb_terminal/portfolio/portfolio_optimization/parameters/params_controller.py +++ b/openbb_terminal/portfolio/portfolio_optimization/parameters/params_controller.py @@ -161,13 +161,13 @@ class ParametersController(BaseController): add_help=False, formatter_class=argparse.ArgumentDefaultsHelpFormatter, prog="file", - description="Load portfolio risk parameters (ini or xlsx)", + description="Select parameter file to use (ini or xlsx). The OpenBB Parameters Template can be " + "found inside the Portfolio Optimization documentation. Please type `about` to access the documentation.", ) parser.add_argument( "-f", "--file", - required="-h" not in other_args, nargs="+", dest="file", help="Parameter file to be used", @@ -178,14 +178,21 @@ class ParametersController(BaseController): ns_parser = self.parse_known_args_and_warn(parser, other_args) if ns_parser: - self.current_file = " ".join(ns_parser.file) - - if self.current_file in self.DATA_FILES: - file_location = str(self.DATA_FILES[self.current_file]) + if not ns_parser.file: + console.print( + "[green]The OpenBB Parameters Template can be found inside " + "the Portfolio Optimization documentation. Please type `about` " + "to access the documentation. [green]\n" + ) else: - file_location = str(self.current_file) + self.current_file = " ".join(ns_parser.file) - self.params, self.current_model = params_view.load_file(file_location) + if self.current_file in self.DATA_FILES: + file_location = str(self.DATA_FILES[self.current_file]) + else: + file_location = str(self.current_file) + + self.params, self.current_model = params_view.load_file(file_location) @log_start_end(log=logger) def call_save(self, other_args: List[str]): diff --git a/openbb_terminal/portfolio/portfolio_optimization/po_controller.py b/openbb_terminal/portfolio/portfolio_optimization/po_controller.py index d6b41d56cef..12cf786d001 100644 --- a/openbb_terminal/portfolio/portfolio_optimization/po_controller.py +++ b/openbb_terminal/portfolio/portfolio_optimization/po_controller.py @@ -155,9 +155,6 @@ def get_valid_portfolio_categories( class PortfolioOptimizationController(BaseController): """Portfolio Optimization Controller class""" - DEFAULT_PORTFOLIO_DIRECTORY = MISCELLANEOUS_DIRECTORY / "portfolio_examples" - DEFAULT_ALLOCATION_DIRECTORY = DEFAULT_PORTFOLIO_DIRECTORY / "allocation" - DEFAULT_OPTIMIZATION_DIRECTORY = DEFAULT_PORTFOLIO_DIRECTORY / "optimization" FILE_TYPE_LIST = ["xlsx", "ini"] CHOICES_COMMANDS = [ @@ -196,17 +193,10 @@ class PortfolioOptimizationController(BaseController): allocation_file_map = { filepath.name: filepath for file_type in cls.FILE_TYPE_LIST - for filepath in cls.DEFAULT_ALLOCATION_DIRECTORY.rglob(f"*.{file_type}") + for filepath in (USER_PORTFOLIO_DATA_DIRECTORY / "allocation").rglob( + f"*.{file_type}" + ) } - allocation_file_map.update( - { - filepath.name: filepath - for file_type in cls.FILE_TYPE_LIST - for filepath in (USER_PORTFOLIO_DATA_DIRECTORY / "allocation").rglob( - f"*.{file_type}" - ) - } - ) return allocation_file_map @@ -215,19 +205,11 @@ class PortfolioOptimizationController(BaseController): optimization_file_map = { filepath.name: filepath for file_type in cls.FILE_TYPE_LIST - for filepath in cls.DEFAULT_OPTIMIZATION_DIRECTORY.rglob(f"*.{file_type}") + for filepath in (USER_PORTFOLIO_DATA_DIRECTORY / "optimization").rglob( + f"*.{file_type}" + ) } - optimization_file_map.update( - { - filepath.name: filepath - for file_type in cls.FILE_TYPE_LIST - for filepath in (USER_PORTFOLIO_DATA_DIRECTORY / "optimization").rglob( - f"*.{file_type}" - ) - } - ) - return optimization_file_map def __init__( @@ -564,13 +546,13 @@ class PortfolioOptimizationController(BaseController): add_help=False, formatter_class=argparse.ArgumentDefaultsHelpFormatter, prog="file", - description="Select parameter file to use", + description="Select parameter file to use. The OpenBB Parameters Template can be " + "found inside the Portfolio Optimization documentation. Please type `about` to access the documentation.", ) parser.add_argument( "-f", "--file", - required="-h" not in other_args, nargs="+", dest="file", help="Parameter file to be used", @@ -583,14 +565,21 @@ class PortfolioOptimizationController(BaseController): ns_parser = self.parse_known_args_and_warn(parser, other_args) if ns_parser: - self.current_file = " ".join(ns_parser.file) - - if self.current_file in self.optimization_file_map: - file_location = self.optimization_file_map[self.current_file] + if not ns_parser.file: + console.print( + "[green]The OpenBB Parameters Template can be found inside " + "the Portfolio Optimization documentation. Please type `about` " + "to access the documentation. [green]\n" + ) else: - file_location = self.current_file # type: ignore + self.current_file = " ".join(ns_parser.file) - self.params, self.current_model = params_view.load_file(file_location) + if self.current_file in self.optimization_file_map: + file_location = self.optimization_file_map[self.current_file] + else: + file_location = self.current_file # type: ignore + + self.params, self.current_model = params_view.load_file(file_location) @log_start_end(log=logger) def call_params(self, _): @@ -677,13 +666,13 @@ class PortfolioOptimizationController(BaseController): if portfolio in portfolios: self.portfolios.pop(portfolio) portfolios.remove(portfolio) - console.print(f"[yellow]Removed '{portfolio}'.[/yellow]") + console.print(f"[param]Removed '{portfolio}'.[/param]") else: console.print(f"[red]Portfolio '{portfolio}' does not exist.[/red]") if self.portfolios: console.print( - f"\n[yellow]Current Portfolios: [/yellow]{('None', ', '.join(portfolios))[bool(portfolios)]}" + f"\n[param]Current Portfolios: [/param]{('None', ', '.join(portfolios))[bool(portfolios)]}" ) self.update_runtime_choices() @@ -699,31 +688,68 @@ class PortfolioOptimizationController(BaseController): parser.add_argument( "-f", "--file", - required="-h" not in other_args, nargs="+", dest="file", help="Allocation file to be used", choices=self.allocation_file_map.keys(), ) + parser.add_argument( + "-e", + "--example", + help="Run an example allocation file to understand how the portfolio optimization menu can be used.", + dest="example", + action="store_true", + default=False, + ) if other_args and "-" not in other_args[0][0]: other_args.insert(0, "--file") ns_parser = self.parse_known_args_and_warn(parser, other_args) if ns_parser: - filename = " ".join(ns_parser.file) + filename = "" - if filename in self.allocation_file_map: - file_location = self.allocation_file_map[filename] + if ns_parser.file: + filename = " ".join(ns_parser.file) + elif ns_parser.example: + filename = "OpenBB Example Portfolio" else: - file_location = filename # type: ignore + console.print( + "[green]Please input a filename with load --file or obtain an example with load --example[/green]" + ) - self.tickers, self.categories = excel_model.load_allocation(file_location) - self.available_categories = list(self.categories.keys()) - if "CURRENT_INVESTED_AMOUNT" in self.available_categories: - self.available_categories.remove("CURRENT_INVESTED_AMOUNT") - self.portfolios = dict() - self.update_runtime_choices() - self.current_portfolio = filename + if filename: + if ns_parser.example: + file_location = ( + MISCELLANEOUS_DIRECTORY + / "portfolio" + / "allocation_example.xlsx" + ) + + console.print( + "[green]Loading an example, please type `about` " + "to learn how to create your own Portfolio Optimization Excel sheet.[/green]\n" + ) + elif filename in self.allocation_file_map: + file_location = self.allocation_file_map[filename] + else: + file_location = filename # type: ignore + + self.tickers, self.categories = excel_model.load_allocation( + file_location + ) + self.available_categories = list(self.categories.keys()) + if "CURRENT_INVESTED_AMOUNT" in self.available_categories: + self.available_categories.remove("CURRENT_INVESTED_AMOUNT") + self.portfolios = dict() + self.update_runtime_choices() + self.current_portfolio = filename + + console.print( + f"[param]Portfolio loaded:[/param] {self.current_portfolio}" + ) + console.print( + f"[param]Categories:[/param] {', '.join(self.available_categories)}\n" + ) @log_start_end(log=logger) def call_plot(self, other_args: List[str]): @@ -820,8 +846,8 @@ class PortfolioOptimizationController(BaseController): or ns_parser.heat ): console.print( - "[yellow]Please select at least one chart to plot[/yellow]", - "[yellow]from the following: -pi, -hi, -dd, -rc, -he.[/yellow]", + "[red]Please select at least one chart to plot " + "from the following: -pi, -hi, -dd, -rc, -he.[/red]", ) return diff --git a/openbb_terminal/reports/reports_model.py b/openbb_terminal/reports/reports_model.py index 9bf91ce74aa..2a1201249f4 100644 --- a/openbb_terminal/reports/reports_model.py +++ b/openbb_terminal/reports/reports_model.py @@ -56,11 +56,9 @@ PORTFOLIO_HOLDINGS_FILES = { PORTFOLIO_HOLDINGS_FILES.update( { - filepath.name: filepath - for file_type in ["xlsx", "csv"] - for filepath in ( - MISCELLANEOUS_DIRECTORY / "portfolio_examples" / "holdings" - ).rglob(f"*.{file_type}") + "holdings_example.xlsx": MISCELLANEOUS_DIRECTORY + / "portfolio" + / "holdings_example.xlsx" } ) diff --git a/openbb_terminal/reports/templates/portfolio.ipynb b/openbb_terminal/reports/templates/portfolio.ipynb index 6be92d9ba2d..8ed34dde174 100644 --- a/openbb_terminal/reports/templates/portfolio.ipynb +++ b/openbb_terminal/reports/templates/portfolio.ipynb @@ -92,7 +92,7 @@ "source": [ "# Parameters that will be replaced when calling this notebook\n", "# Do not leave parameters blank as notebook will not run otherwise\n", - "transactions = \"market.csv\"\n", + "transactions = \"holdings_example.xlsx\"\n", "report_name = \"Portfolio Report\"" ] }, @@ -105,7 +105,7 @@ "source": [ "file_0 = (\n", " str(REPOSITORY_DIRECTORY)\n", - " + \"/openbb_terminal/miscellaneous/portfolio_examples/holdings/\"\n", + " + \"/openbb_terminal/miscellaneous/portfolio/\"\n", " + transactions\n", ")\n", "file_1 = str(USER_PORTFOLIO_DATA_DIRECTORY) + \"/holdings/\" + transactions\n", @@ -489,7 +489,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3.9.13 ('obb')", + "display_name": "obb", "language": "python", "name": "python3" }, @@ -503,11 +503,11 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.9.6 | packaged by conda-forge | (default, Jul 11 2021, 03:36:15) \n[Clang 11.1.0 ]" }, "vscode": { "interpreter": { - "hash": "e784374cc4f9a84ed6af2983247aaf351b155c82bcc2188134a65f3c99031000" + "hash": "100174a9203096c0c10fb537684ff280825ee9e252451beb8786068677204f06" } } }, diff --git a/openbb_terminal/stocks/insider/openinsider_model.py b/openbb_terminal/stocks/insider/openinsider_model.py index 784a38f6d32..bc9b980c84d 100644 --- a/openbb_terminal/stocks/insider/openinsider_model.py +++ b/openbb_terminal/stocks/insider/openinsider_model.py @@ -2,13 +2,15 @@ import configparser import logging import textwrap from datetime import datetime -from pathlib import Path from typing import Dict, List import pandas as pd from bs4 import BeautifulSoup -from openbb_terminal.core.config.paths import USER_PRESETS_DIRECTORY +from openbb_terminal.core.config.paths import ( + USER_PRESETS_DIRECTORY, + MISCELLANEOUS_DIRECTORY, +) from openbb_terminal.decorators import log_start_end from openbb_terminal.rich_config import console from openbb_terminal.helper_funcs import request @@ -1110,7 +1112,7 @@ def get_preset_choices() -> Dict: """ PRESETS_PATH = USER_PRESETS_DIRECTORY / "stocks" / "insider" - PRESETS_PATH_DEFAULT = Path(__file__).parent / "presets" + PRESETS_PATH_DEFAULT = MISCELLANEOUS_DIRECTORY / "stocks" / "insider" preset_choices = { filepath.name.strip(".ini"): filepath for filepath in PRESETS_PATH.iterdir() diff --git a/openbb_terminal/stocks/insider/presets/__init__.py b/openbb_terminal/stocks/insider/presets/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_terminal/stocks/screener/finviz_model.py b/openbb_terminal/stocks/screener/finviz_model.py index b24822158a8..60112cd554b 100644 --- a/openbb_terminal/stocks/screener/finviz_model.py +++ b/openbb_terminal/stocks/screener/finviz_model.py @@ -1,6 +1,5 @@ import configparser import logging -from pathlib import Path import pandas as pd from finvizfinance.screener import ( @@ -13,13 +12,16 @@ from finvizfinance.screener import ( ) from openbb_terminal.decorators import log_start_end -from openbb_terminal.core.config.paths import USER_PRESETS_DIRECTORY +from openbb_terminal.core.config.paths import ( + USER_PRESETS_DIRECTORY, + MISCELLANEOUS_DIRECTORY, +) from openbb_terminal.rich_config import console logger = logging.getLogger(__name__) PRESETS_PATH = USER_PRESETS_DIRECTORY / "stocks" / "screener" -PRESETS_PATH_DEFAULT = Path(__file__).parent / "presets" +PRESETS_PATH_DEFAULT = MISCELLANEOUS_DIRECTORY / "stocks" / "screener" preset_choices = { filepath.name: filepath for filepath in PRESETS_PATH.iterdir() diff --git a/openbb_terminal/stocks/screener/presets/README.md b/openbb_terminal/stocks/screener/presets/README.md deleted file mode 100644 index c12f0da327b..00000000000 --- a/openbb_terminal/stocks/screener/presets/README.md +++ /dev/null @@ -1,183 +0,0 @@ -# PRESETS - -- [How to add presets](#how-to-add-presets) -- [template](#template) -- [sexy_year](#sexy_year) -- [buffett_like](#buffett_like) -- [cheap_bottom_dividend](#cheap_bottom_dividend) -- [cheap_dividend](#cheap_dividend) -- [cheap_oversold](#cheap_oversold) -- [cdeath_cross](#death_cross) -- [golden_cross](#golden_cross) -- [heavy_inst_ins](#heavy_inst_ins) -- [modified_dreman](#modified_dreman) -- [modified_neff](#modified_neff) -- [rosenwald](#rosenwald) -- [rosenwald_gtfo](#rosenwald_gtfo) -- [undervalue](#undervalue) - ---- - -## How to add presets - -1. Go to the folder OpenBBTerminal/openbb_terminal/screener/presets. - -2. There should be a `README.md` file and multiple `.ini` files. One of these `.ini` files should be named `template.ini`. - - 1 - -3. Copy the `template.ini` file and paste it in the same directory. -4. Rename that file to something you find meaningful, e.g. `my_own_filter.ini`. - - 2 - -5. Open the file you just renamed (e.g. `my_own_filter.ini`), and set the parameters you want to filter. - - 3 - -6. It may be useful to play with the main source since you can tweak these and - understand how they influence the outcome of the filtered stocks. - - 4 - -7. Update the Author and Description name. E.g. - - 5 - -8. Start the terminal, and go to the `> scr` menu. In there, you can play with it on the terminal as shown: - - - **view**: Allows to see the screeners available. I.e. all `.ini` files in presets folder. - 6 - - - **view **: Allows to see the specific parameters set for the preset selected. - Captura de ecrรฃ 2021-06-28, ร s 23 58 35 - - - **set **: Allows to set this preset as main filter. See that the help menu will display a different - `PRESET: my_own_filter` - 7 - - - **historical, overview, valuation, financial, ownership, performance, technical** commands will now be performed on - tickers that are filtered with the selected preset. Note: Since it is likely that there will be a big range of - tickers, we cap it to 10 randomly. So, it is normal if for the same filter the user sees 10 different tickers. - If the user wants to see more than 10 tickers, it can select a different limit using `-l` flag. - - 8 - -9. Share with other Apes. You can do so by either creating yourself a Pull Request with this change, or asking a dev - (e.g. @Sexy_Year) on our discord server to add it for you. - ---- - -## template - -- **Author of preset:** OpenBBTerminal -- **Contact:** -- **Description:** Template with all available filters and their options menu. More information can be found in - and - ---- - -## sexy_year - -- **Author of preset:** Sexy Year -- **Contact:** Add contact of author, if (s)he whishes to be contacted. This can be an hyperlink, an e-mail, wtv -- **Description:** This is just a sample. The user that adds the preset can add a description for what type of stocks - these filters are aimed for - ---- - -## buffett_like - -- **Author of preset:** Traceabl3 -- **Contact:** via smoke signals -- **Description:** Buffet like value screener (Value invsting for long term growth) - ---- - -## cheap_bottom_dividend - -- **Author of preset:** Traceabl3 -- **Contact:** swing the bullroarer -- **ABOUT:** High Yield Dividend stonks that are at-or-near their lowest price. Inverse Head and shoulders pattern recognized. - ---- - -## cheap_dividend - -- **Author of preset:** Traceabl3 -- **Contact:** illuminated bat symbol in the sky -- **Description:** cheap dividend stocks - ---- - -## cheap_oversold - -- **Author of preset:** Traceabl3 -- **Contact:** hit me on my skytel pager -- **Description:** Cheap stonks that are oversold: under 10% above the low, and oversold on the RSI. - ---- - -## death_cross - -- **Author of preset:** Traceabl3 -- **Contact:** take the red pill -- **Description:** Death cross : when the 50sma crosses below the 200 sma -- **More information:** - ---- - -## golden_cross - -- **Author of preset:** Traceabl3 -- **Contact:** flip the pigeons -- **Description:** Golden Cross when the 50 day moves above the 200 day from below. - ---- - -## heavy_inst_ins - -- **Author of preset:** Traceabl3 -- **Contact:** blow into the conch shell -- **Description:** Heavily owned by institutions and insiders (>30% each) - ---- - -## modified_dreman - -- **Author of preset:** Traceabl3 -- **Contact:** Drum Telegraphy -- **Description:** Modified Version of the Dreman Screener. - ---- - -## modified_neff - -- **Author of preset:** Traceabl3 -- **Contact:** bang the drums -- **Description:** Neff Screener with modifications // operational margin <50% -- **More information:** - ---- - -## rosenwald - -- **Author of preset:** Traceabl3 -- **Contact:** three shots in the air. -- **Description:** the classic rosenwald screen based on some dude I work with best guess. - ---- - -## rosenwald_gtfo - -- **Author of preset:** Traceabl3 -- **Contact:** wave the white flag -- **Description:** Too many indicators indicating an impending downturn. - ---- - -## undervalue - -- **Author of preset:** Traceabl3 -- **Contact:** message on tor browser. -- **Description:** Potential Undervalued stocks diff --git a/openbb_terminal/stocks/screener/presets/template.ini b/openbb_terminal/stocks/screener/presets/template.ini deleted file mode 100644 index 7d60fc68e4d..00000000000 --- a/openbb_terminal/stocks/screener/presets/template.ini +++ /dev/null @@ -1,212 +0,0 @@ -# Author of preset: OpenBBTerminal (https://github.com/OpenBB-finance/OpenBBTerminal) -# Description: Template with all available filters and their options menu. -# More information can be found in https://finviz.com/help/screener.ashx -# and https://finviz.com/help/technical-analysis/charts-patterns.ashx - -[General] -# Ticker, Company, Sector, Industry, Country, Market Cap., Price/Earnings, Forward Price/Earnings, PEG (Price/Earnings/Growth), Price/Sales, Price/Book, Price/Cash, Price/Free Cash Flow, Dividend Yield, Payout Ratio, EPS (ttm), EPS growth this year, EPS growth next year, EPS growth past 5 years, EPS growth next 5 years, Sales growth past 5 years, EPS growth qtr over qtr, Sales growth qtr over qtr, Shares Outstanding, Shares Float, Insider Ownership, Insider Transactions, Institutional Ownership, Institutional Transactions, Short Interest Share, Short Interest Ratio, Earnings Date, Return on Assets, Return on Equity, Return on Investment, Current Ratio, Quick Ratio, LT Debt/Equity, Total Debt/Equity, Gross Margin, Operating Margin, Net Profit Margin, Analyst Recommendation, Performance (Week), Performance (Month), Performance (Quarter), Performance (Half Year), Performance (Year), Performance (Year To Date), Beta, Average True Range, Volatility (Week), Volatility (Month), 20-Day SMA (Relative), 50-Day SMA (Relative), 200-Day SMA (Relative), 50-Day High (Relative), 50-Day Low (Relative), 52-Week High (Relative), 52-Week Low (Relative), Relative Strength Index (14), Average Volume (3 Month), Relative Volume, Change, Change from Open, Gap, Volume, Price, Target Price, IPO Date -Order = Ticker - -# None (all stocks), Top Gainers, Top Losers, New High, New Low, Most Volatile, Most Active, Unusual Volume, Overbought, Oversold, Downgrades, Upgrades, Earnings Before, Earnings After, Recent Insider Buying, Recent Insider Selling, Major News, Horizontal S/R, TL Resistance, TL Support, Wedge Up, Wedge Down, Triangle Ascending, Triangle Descending, Wedge, Channel Up, Channel Down, Channel, Double Top, Double Bottom, Multiple Top, Multiple Bottom, Head & Shoulders, Head & Shoulders Inverse -Signal = Top Gainers - - -[Descriptive] -# Any, AMEX, NASDAQ, NYSE -Exchange = Any - -# Any, Mega ($200bln and more), Large ($10bln to $200bln), Mid ($2bl to $10bln), Small ($300mln to $2bln), Micro ($50mln to $300mln), Nano (under $50mln), +Large (over $50mln), +Mid (over $2bln), +Small (over $300mln), +Micro (over $50mln), -Large (under $200bln), -Mid (under $10bln), -Small (under $2bln), -Micro (under $300mln) -Market Cap. = Any - -# Any, Today, Today Before Market Open, Today Before Market Close, Tomorrow, Tomorrow Before Market Open, Tomorrow Before Market Close, Yesterday, Yesterday Before Market Open, Yesterday Before Market Close, Next 5 Days, Previous 5 Days, This Week, Next Week, Previous Week, This Month -Earnings Date = Any - -# Any, 50% Above Price, 40% Above Price, 30% Above Price, 20% Above Price, 10% Above Price, 5% Above Price, Above Price, Below Price, 5% Below Price, 10% Below Price, 20% Below Price, 30% Below Price, 40% Below Price, 50% Below Price -Target Price = Any - -# Any, S&P 500, DJIA -Index = Any - -# Any, None (0%), Positive (>0%), High (>5%), Very High (>10%), Over 1%, Over 2%, Over 3%, Over 4%, Over 5%, Over 6%, Over 7%, Over 8%, Over 9%, Over 10% -Dividend Yield = Any - -# Any, Under 50K, Under 100K, Under 500K, Under 750K, Under 1M, Over 50K, Over 100K, Over 300K, Over 400K, Over 500K, Over 750K, Over 1M, Over 2M, 100K to 500K, 100K to 1M, 500K to 1M, 500K to 10M -Average Volume = Any - -# Any, Today, Yesterday, In the last week, In the last month, In the last quarter, In the last year, In the last 2 years, In the last 3 years, In the last 5 years, More than a year ago, More that 5 years ago, More than 10 years ago, More than 15 years ago, More than 20 years ago, More than 25 years ago -IPO Date = Any - -# Any, Basic Materials, Communication Services, Consumer Cyclical, Consumer Defensive, Energy, Financial, Healthcare, Industrials, Real Estate, Technology, Utilities -Sector = Any - -# Any, Low (<5%), High (>20%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -Float Short = Any - -# Any, Over 10, Over 5, Over 3, Over 2, Over 1.5, Over 1, Over 0.75, Over 0.5, Over 0.25, Under 2, Under 1, Under 1.5, Under 1, Under 0.75, Under 0.5, Under 0.25, Under 0.1 -Relative Volume = Any - -# Any, Under 1M, Under 5M, Under 10M, Under 20M, Under 50M, Under 100M, Over 1M, Over 2M, Over 5M, Over 10M, Over 20M, Over 50M, Over 100M, Over 200M, Over 500M, Over 1000M -Shares Outstanding = Any - -# Any, Agricultural Inputs, Aluminum, Building Materials, Chemicals, Coking Coal, Copper, Gold, Lumber & Wood Production, Other Industrial Metals & Mining, Other Precious Metals & Mining, Paper & Paper Products, Silver, Specialty Chemicals, Steel -Industry = Any - -# Any, Strong Buy (1), Buy or Better, Buy, Hold or better, Hold, Hold or worse, Sell, Sell or worse, Strong Sell (5) -Analyst Recom. = Any - -# Any, Under 100K, Under 500K, Under 750K, Under 1M, Over 0, Over 50K, Over 100K, Over 200K, Over 300K, Over 400K, Over 500K, Over 750K, Over 1M, Over 2M, Over 5M, Over 10M, Over 20M -Current Volume = Any - -# Any, Under 1M, Under 5M, Under 10M, Under 20M, Under 50M, Under 100M, Over 1M, Over 2M, Over 5M, Over 10M, Over 20M, Over 50M, Over 100M, Over 200M, Over 500M, Over 1000M -Float = Any - -# Any, Asia, Europe, Latin America, BRIC, Argentina, Australia, Bahamas, Belgium, BeNeLux, Bermuda, Brazil, Canada, Cayman Islands, Chile, China, China & Hong Kong, Colombia, Cyprus, Denmark, Finland, France, Germany, Greece, Hong Kong, Hungary, Iceland, India, Indonesia, Ireland, Israel, Italy, Japan, Kazakhstan, Luxembourg, Malaysia, Malta, Mexico, Monaco, Netherlands, New Zealand, Norway, Panama, Peru, Philippines, Portugal, Russia, Singapore, South Africa, South Korea, Spain, Sweden, Switzerland, Taiwan, Turkey, United Arab Emirates, United Kingdom, Uruguay -Country = Any - -# Any, Optionable, Shortable, Optionable and shortable -Option/Short = Any - -# Any, Under $1, Under $2, Under $3, Under $4, Under $5, Under $7, Under $10, Under $15, Under $20, Under $30, Under $40, Under $50, Over $1, Over $2, Over $3, Over $4, Over $5 ,Over $7, Over $10, Over $15, Over $20, Over $30, Over $40, Over $50, Over $60, Over $70, Over $80, Over $90, Over $100, $1 to $5, $1 to $10, $1 to $20, $5 to $10, $5 to $20, $5 to $50, $10 to $20, $10 to $50, $20 to $50, $50 to $100 -Price = Any - - -[Fundamental] -# Any, Low (<15), Profitable (>0), High (>50), Under 5, Under 10, Under 15, Under 20, Under 25, Under 30, Under 35, Under 40, Under 45, Under 50, Over 5, Over 10, Over 15, Over 25, Over 30, Over 35, Over 40, Over 45, Over 50 -P/E = Any - -# Any, Low (<3), High (>50), Under 1, Under 2, Under 3, Under 4, Under 5, Under 6, Under 7, Under 8, Under 9, Under 10, Over 1, Over 2, Over 3, Over 4, Over 5, Over 6, Over 7, Over 8, Over 9, Over 10, Over 20, Over 30, Over 40, Over 50 -Price/Cash = Any - -# Any, Negative (<0%), Positive (>0%), Positive Low (<10%), High (>25%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -EPS growthnext 5 years = Any - -# Any, Positive (>0%), Negative (<0%), Very Positive (>30%), Very Negative (<-15%), Under -50%, Under -40%, Under -35%, Under -30%, Under -25%, Under -20%, Under -15%, Under -10%, Under -5%, Over +50%, Over +45%, Over +40%, Over +35%, Over +30%, Over +25%, Over +20%, Over +15%, Over +10%, Over +5% -Return on Equity = Any - -# Any, High (>0.5), Low (<0.1), Under 1, Under 0.9, Under 0.8, Under 0.7, Under 0.6, Under 0.5, Under 0.4, Under 0.3, Under 0.2, Under 0.1, Over 0.1, Over 0.2, Over 0.3, Over 0.4, Over 0.5, Over 0.6, Over 0.7, Over 0.8, Over 0.9, Over 1 -Debt/Equity = Any - -# Any, Low (<5%), High (>30%), Very High (>50%), Over 10%, Over 20%, Over 30%, Over 40%, Over 50%, Over 60%, Over 70%, Over 80%, Over 90% -InsiderOwnership = Any - -# Any, Low (<15), Profitable (>0), High (>50), Under 5, Under 10, Under 15, Under 20, Under 25, Under 30, Under 35, Under 40, Under 45, Under 50, Over 5, Over 10, Over 15, Over 20, Over 25, Over 30, Over 35, Over 40, Over 45, Over 50 -Forward P/E = Any - -# Any, Low (<15), High (>50), Under 5, Under 10, Under 15, Under 20, Under 25, Under 30, Under 35, Under 40, Under 45, Under 50, Under 60, Under 70, Under 80, Under 90, Under 100, Over 5, Over 10, Over 15, Over 20, Over 25, Over 30, Over 35, Over 40, Over 45, Over 50, Over 60, Over 70, Over 80, Over 90, Over 100 -Price/Free Cash Flow = Any - -# Any, Negative (<0%), Positive (>0%), Positive Low (0-10%), High (>25%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -Sales growthpast 5 years = Any - -# Any, Positive (>0%), Negative (<0%), Very Positive (>25%), Very Negative (<-10%), Under -50%, Under -45%, Under -40%, Under -35%, Under -30%, Under -25%, Under -20%, Under -15%, Under -10%, Under -5%, Over +5%, Over +10%, Over +15%, Over +20%, Over +25%, Over +30%, Over +35%, Over +40%, Over +45%, Over +50% -Return on Investment = Any - -# Any, Positive (>0%), Negative (<0%), High (>50%), Under 90%, Under 80%, Under 70%, Under 60%, Under 50%, Under 45%, Under 40%, Under 35%, Under 30%, Under 25%, Under 20%, Under 15%, Under 10%, Under 5%, Under 0%, Under -10%, Under -20%, Under -30%, Under -50%, Under -70%, Under -100%, Over 0%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30%, Over 40%, Over 45%, Over 50%, Over 60%, Over 70%, Over 80%, Over 90% -Gross Margin = Any - -# Any, Very Negative (<20%), Negative (<0%), Positive (>0%), Very Positive (>20%), Under -90%, Under -80%, Under -70%, Under -60%, Under -50%, Under -45%, Under -40%, Under -35%, Under -30%, Under -25%, Under -20%, Under -15%, Under -10%, Under -5%, Over +5%, Over +10%, Over +15%, Over +20%, Over +25%, Over +30%, Over +35%, Over +40%, Over +45%, Over +50%, Over +60%, Over +70%, Over +80%, Over +90% -InsiderTransactions = Any - -# Any, Low (<1), High (>2), Under 1, Under 2, Under 3, Over 1, Over 2, Over 3 -PEG = Any - -# Any, Negative (<0%), Positive (>0%), Positive Low (0-10%), High (>25%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -EPS growththis year = Any - -# Any, Negative (<0%), Positive (>0%), Positive Low (0-10%), High (>25%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -EPS growthqtr over qtr = Any - -# Any, High (>3), Low (<1), Under 1, Under 0.5, Over 0.5, Over 1, Over 1.5, Over 2, Over 3, Over 4, Over 5, Over 10 -Current Ratio = Any - -# Any, Negative (<0%), Positive (>0%), Very Negative (<-20%), High (>25%), Under 90%, Under 80%, Under 70%, Under 60%, Under 50%, Under 45%, Under 40%, Under 35%, Under 30%, Under 25%, Under 20%, Under 15%, Under 10%, Under 5%, Under 0%, Under -10%, Under -20%, Under -30%, Under -50%, Under -70%, Under -100%, Over 0%, Over 10%, Under 15%, Over 20%, Over 25%, Over 30%, Over 35%, Over 40%, Over 45%, Over 50%, Over 60%, Over 70%, Over 80%, Over 90% -Operating Margin = Any - -# Any, Low (<5%), High (>90%), Under 90%, Under 80%, Under 70%, Under 60%, Under 50%, Under 40%, Under 30%, Under 20%, Under 10%, Over 10%, Over 20%, Over 30%, Over 40%, Over 50%, Over 60%, Over 70%, Over 80%, Over 90% -InstitutionalOwnership = Any - -# Any, Low (<1), High (>10), Under 1, Under 2, Under 3, Under 4, Under 5, Under 6, Under 7, Under 8, Under 9, Under 10, Over 1, Over 2, Over 3, Over 4, Over 5, Over 6, Over 6, Over 7, Over 8, Over 9, Over 10 -P/S = Any - -# Any, Negative (<0%), Positive (>0%), Positive Low (0-10%), High (>25%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -EPS growthnext year = Any - -# Any, Negative (<0%), Positive (>0%), Positive Low (0-10%), High (>25%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -Sales growthqtr over qtr = Any - -# Any, High (>3), Low (<0.5), Under 1, Under 0.5, Over 0.5, Over 1, Over 1.5, Over 2, Over 3, Over 4, Over 5, Over 10 -Quick Ratio = Any - -# Any, Positive (>0%), Negative (<0%), Very Negative (<-20%), High (>20%), Under 90%, Under 80%, Under 70%, Under 60%, Under 50%, Under 45%, Under 40%, Under 35%, Under 30%, Under 25%, Under 20%, Under 15%, Under 10%, Under 5%, Under 0%, Under -10%, Under -20%, Under -30%, Under -50%, Under -70%, Under -100%, Over 0%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30%, Over 35%, Over 40%, Over 45%, Over 50%, Over 60%, Over 70%, Over 80%, Over 90% -Net Profit Margin = Any - -# Any, Very Negative (<20%), Negative (<0%), Positive (>0%), Very Positive (>20%), Under -50%, Under -45%, Under -40%, Under -35%, Under -30%, Under -25%, Under -20%, Under -15%, Under -10%, Under -5%, Over +5%, Over +10%, Over +15%, Over +20%, Over +25%, Over +30%, Over +35%, Over +40%, Over +45%, Over +50% -InstitutionalTransactions = Any - -# Any, Low (<1), High (>5), Under 1, Under 2, Under 3, Under 4, Under 5, Under 6, Under 7, Under 8, Under 9, Under 10, Over 1, Over 2, Over 3, Over 4, Over 5, Over 6, Over 7, Over 8, Over 9, Over 10 -P/B = Any - -# Any, Negative (<0%), Positive (>0%), Positive Low (0-10%), High (>25%), Under 5%, Under 10%, Under 15%, Under 20%, Under 25%, Under 30%, Over 5%, Over 10%, Over 15%, Over 20%, Over 25%, Over 30% -EPS growthpast 5 years = Any - -# Any, Positive (>0%), Negative (<0%), Very Positive (>15%), Very Negative (<-15%), Under -50%, Under -45%, Under -40%, Under -35%, Under -30%, Under -25%, Under -20%, Under -15%, Under -10%, Under -5%, Over +5%, Over +10%, Over +15%, Over +20%, Over +25%, Over +30%, Over +35%, Over +40%, Over +45%, Over +50% -Return on Assets = Any - -# Any, High (>0.5), Low (<0.1), Under 1, Under 0.9, Under 0.8, Under 0.7, Under 0.6, Under 0.5, Under 0.4, Under 0.3, Under 0.2, Under 0.1, Over 0.1, Over 0.2, Over 0.3, Over 0.4, Over.5, Over 0.6, Over 0.7, Over 0.8, Over 0.9, Over 1 -LT Debt/Equity = Any - -# Any, None (0%), Positive (>0%), Low (<20%), High (>50%), Over 0%, Over 10%, Over 20%, Over 30%, Over 40%, Over 50%, Over 60%, Over 70%, Over 80%, Over 90%, Over 100%, Under 10%, Under 20%, Under 30%, Under 40%, Under 50%, Under 60%, Under 70%, Under 80%, Under 90%, Under 100% -Payout Ratio = Any - - -[Technical] -# Any, Today Up, Today Down, Today -15%, Today -10%, Today -5%, Today +5%, Today +10%, Today +15%, Week -30%, Week -20%, Week -10%, Week Down, Week Up, Week +10%, Week +20%, Week +30%, Month -50%, Month -30%, Month -20%, Month -10%, Month Down, Month Up, Month +10%, Month +20%, Month +30%, Month +50%, Quarter -50%, Quarter -30%, Quarter -20%, Quarter -10%, Quarter Down, Quarter Up, Quarter +10%, Quarter +20%, Quarter +30%, Quarter +50%, Half -75%, Half -50%, Half -30%, Half -20%, Half -10%, Half Down, Half Up, Half +10%, Half +20%, Half +30%, Half +50%, Half +100%, Year -75%, Year -50%, Year -30%, Year -20%, Year -10%, Year Down, Year Up, Year +10%, Year +20%, Year +30%, Year +50%, Year +100%, Year +200%, Year +300%, Year +500%, YTD -75%, YTD -50%, YTD -30%, YTD -20%, YTD -10%, YTD -5%, YTD Down, YTD Up, YTD +5%, YTD +10%, YTD +20%, YTD +30, YTD +50%, YTD +100% -Performance = Any - -# Any, Price below SMA20, Price 10% below SMA20, Price 20% below SMA20, Price 30% below SMA20, Price 40% below SMA20, Price 50% below SMA20, Price above SMA20, Price 10% above SMA20, Price 20% above SMA20, Price 30% above SMA20, Price 40% above SMA20, Price 50% above SMA20, Price crossed SMA20, Price crossed SMA20 above, Price crossed SMA20 below, SMA20 crossed SMA50, SMA20 crossed SMA50 above, SMA20 crossed SMA50 below, SMA20 cross SMA200, SMA20 crossed SMA200 below, SMA20 crossed SMA200 above, SMA20 above SMA50, SMA20 below SMA50, SMA20 above SMA200, SMA20 below SMA200 -20-Day Simple Moving Average = Any - -# Any, New High, New Low, 5% or more below High, 10% or more below High, 15% or more below High, 20% or more below High, 30% or more below High, 40% or more below High, 50% or more below High, 0-3% below High, 0-5% below High, 0-10% below High, 5% or more above Low, 10% or more above Low, 15% or more above Low, 20% or more above Low, 30% or more above Low, 40% or more above Low, 50% or more above Low, 0-3% above Low, 0-5% above Low, 0-10% above Low -20-Day High/Low = Any - -# Any, Under 0, Under 0.5, Under 1, Under 1.5, Under 2, Over 0, Over 0.5, Over 1, Over 1.5, Over 2, Over 2.5, Over 3, Over 4, 0 to 0.5, 0 to 1, 0.5 to 1, 0.5 to 1.5, 1 to 1.5, 1 to 2 -Beta = Any - -# Any, Today Up, Today Down, Today -15%, Today -10%, Today -5%, Today +5%, Today +10%, Today +15%, Week -30%, Week -20%, Week -10%, Week Down, Week Up, Week +10%, Week +20%, Week +30%, Month -50%, Month -30%, Month -20%, Month -10%, Month Down, Month Up, Month +10%, Month +20%, Month +30%, Month +50%, Quarter -50%, Quarter -30%, Quarter -20%, Quarter -10%, Quarter Down, Quarter Up, Quarter +10%, Quarter +20%, Quarter +30%, Quarter +50%, Half -75%, Half -50%, Half -30%, Half -20%, Half -10%, Half Down, Half Up, Half +10%, Half +20%, Half +30%, Half +50%, Half +100%, Year -75%, Year -50%, Year -30%, Year -20%, Year -10%, Year Down, Year Up, Year +10%, Year +20%, Year +30%, Year +50%, Year +100%, Year +200%, Year +300%, Year +500%, YTD -75%, YTD -50%, YTD -30%, YTD -20%, YTD -10%, YTD -5%, YTD Down, YTD Up, YTD +5%, YTD +10%, YTD +20%, YTD +30, YTD +50%, YTD +100% -Performance 2 = Any - -# Any, Price below SMA50, Price 10% below SMA50, Price 20% below SMA50, Price 30% below SMA50, Price 40% below SMA50, Price 50% below SMA50, Price above SMA50, Price 10% above SMA50, Price 20% above SMA50, Price 30% above SMA50, Price 40% above SMA50, Price 50% above SMA50, Price crossed SMA50, Price crossed SMA50 above, Price crossed SMA50 below, SMA50 crossed SMA20, SMA50 crossed SMA20 above, SMA50 crossed SMA20 below, SMA50 cross SMA200, SMA50 crossed SMA200 below, SMA50 crossed SMA200 above, SMA50 above SMA20, SMA50 below SMA20, SMA50 above SMA200, SMA50 below SMA200 -50-Day Simple Moving Average = Any - -# Any, New High, New Low, 5% or more below High, 10% or more below High, 15% or more below High, 20% or more below High, 30% or more below High, 40% or more below High, 50% or more below High, 0-3% below High, 0-5% below High, 0-10% below High, 5% or more above Low, 10% or more above Low, 15% or more above Low, 20% or more above Low, 30% or more above Low, 40% or more above Low, 50% or more above Low, 0-3% above Low, 0-5% above Low, 0-10% above Low -50-Day High/Low = Any - -# Any, Over 0.25, Over 0.5, Over 0.75, Over 1, Over 1.5, Over 2. Over 2.5, Over 3, Over 3.5, Over 4, Over 4.5, Over 5, Under 0.25, Under 0.5, Under 0.75, Under 1, Under 1.5, Under 2, Under 2.5, Under 3, Under 3.5, Under 4, Under 4.5, Under 5 -Average True Range = Any - -# Any, Week - Over 3%, Week - Over 4%, Week - Over 5%, Week - Over 6%, Week - Over 7%, Week - Over 8%, Week - Over 9%, Week - Over 10%, Week - Over 12%, Week - Over 15%, Month - Over2%, Month - Over3%, Month - Over4%, Month - Over 5%, Month - Over 5%, Month - Over 6%, Month - Over 7%, Month - Over 8%, Month - Over 9%, Month - Over 10%, Month - Over 12%, Month - Over 15% -Volatility = Any - -# Any, Price below SMA200, Price 10% below SMA200, Price 20% below SMA200, Price 30% below SMA200, Price 40% below SMA200, Price 50% below SMA200, Price above SMA200, Price 10% above SMA200, Price 20% above SMA200, Price 30% above SMA200, Price 40% above SMA200, Price 50% above SMA200, Price crossed SMA200, Price crossed SMA200 above, Price crossed SMA200 below, SMA200 crossed SMA20, SMA20 crossed SMA20 above, SMA20 crossed SMA20 below, SMA200 cross SMA50, SMA200 crossed SMA50 below, SMA200 crossed SMA50 above, SMA200 above SMA20, SMA200 below SMA20, SMA200 above SMA50, SMA200 below SMA50 -200-Day Simple Moving Average = Any - -# Any, New High, New Low, 5% or more below High, 10% or more below High, 15% or more below High, 20% or more below High, 30% or more below High, 40% or more below High, 50% or more below High, 0-3% below High, 0-5% below High, 0-10% below High, 5% or more above Low, 10% or more above Low, 15% or more above Low, 20% or more above Low, 30% or more above Low, 40% or more above Low, 50% or more above Low, 0-3% above Low, 0-5% above Low, 0-10% above Low -52-Week High/Low = Any - -# Any, Overbought (90), Overbought (80), Overbought (70), Overbought (60), Oversold (40), Oversold (30), Oversold (20), Oversold (10), Not Overbought (<60), Not Overbought (<50), Not Oversold (>50), Not Oversold (>40) -RSI (14) = Any - -# Any, Up, Up 1%, Up 2%, Up 3%, Up 4%, Up 5%, Up 6%, Up 7%, Up 8%, Up 9%, Up 10%, Up 15%, Up 20%, Down, Down 1%, Down 2%, Down 3%, Down 4%, Down 5%, Down 6%, Down 7%, Down 8%, Down 9%, Down 10%, Down 15%, Down 20% -Change = Any - -# Any, Horizontal S/R, Horizontal S/R (Strong), TL Resistance, TL Resistance (Strong), TL Support, TL Support (Strong), Wedge Up, Wedge Up (Strong), Wedge Down, Wedge Down (Strong), Triangle Ascending, Triangle Ascending (Strong), Triangle Descending, Triangle Descending (Strong), Wedge, Wedge (Strong), Channel Up, Channel Up (Strong), Channel Down, Channel Down (Strong), Channel, Channel (Strong), Double Top, Double Bottom, Multiple Top, Multiple Bottom, Head & Shoulders, Head & Shoulders Inverse -Pattern = Any - -# Any, Up, Up 1%, Up 2%, Up 3%, Up 4%, Up 5%, Up 6%, Up 7%, Up 8%, Up 9%, Up 10%, Up 15%, Up 20%, Down, Down 1%, Down 2%, Down 3%, Down 4%, Down 5%, Down 6%, Down 7%, Down 8%, Down 9%, Down 10%, Down 15%, Down 20% -Gap = Any - -# Any, Up, Up 1%, Up 2%, Up 3%, Up 4%, Up 5%, Up 6%, Up 7%, Up 8%, Up 9%, Up 10%, Up 15%, Up 20%, Down, Down 1%, Down 2%, Down 3%, Down 4%, Down 5%, Down 6%, Down 7%, Down 8%, Down 9%, Down 10%, Down 15%, Down 20% -Change from Open = Any - -# Any, Long Lower Shadow, Long Upper Shadow, Hammer, Inverted Hammer, Spinning Top White, Spinning Top Black, Doji, Dragonfly Doji, Gravestone Doji, Marubozu White, Marubozu Black -Candlestick = Any diff --git a/openbb_terminal/stocks/screener/screener_controller.py b/openbb_terminal/stocks/screener/screener_controller.py index 0f5467cef60..5b8964addd9 100644 --- a/openbb_terminal/stocks/screener/screener_controller.py +++ b/openbb_terminal/stocks/screener/screener_controller.py @@ -4,13 +4,15 @@ __docformat__ = "numpy" import argparse import datetime import logging -from pathlib import Path from typing import List from openbb_terminal.custom_prompt_toolkit import NestedCompleter from openbb_terminal import feature_flags as obbff -from openbb_terminal.core.config.paths import USER_PRESETS_DIRECTORY +from openbb_terminal.core.config.paths import ( + USER_PRESETS_DIRECTORY, + MISCELLANEOUS_DIRECTORY, +) from openbb_terminal.decorators import log_start_end from openbb_terminal.helper_funcs import ( EXPORT_BOTH_RAW_DATA_AND_FIGURES, @@ -55,7 +57,7 @@ class ScreenerController(BaseController): "technical", ] - PRESETS_PATH_DEFAULT = Path(__file__).parent / "presets" + PRESETS_PATH_DEFAULT = MISCELLANEOUS_DIRECTORY / "stocks" / "screener" preset_choices = { filepath.name.replace(".ini", ""): filepath for filepath in PRESETS_PATH.iterdir() diff --git a/openbb_terminal/stocks/screener/screener_view.py b/openbb_terminal/stocks/screener/screener_view.py index 376102e64d2..5771655b91a 100644 --- a/openbb_terminal/stocks/screener/screener_view.py +++ b/openbb_terminal/stocks/screener/screener_view.py @@ -2,14 +2,16 @@ __docformat__ = "numpy" import configparser -from pathlib import Path from openbb_terminal.rich_config import console -from openbb_terminal.core.config.paths import USER_PRESETS_DIRECTORY +from openbb_terminal.core.config.paths import ( + USER_PRESETS_DIRECTORY, + MISCELLANEOUS_DIRECTORY, +) from openbb_terminal.stocks.screener import finviz_model PRESETS_PATH = USER_PRESETS_DIRECTORY / "stocks" / "screener" -PRESETS_PATH_DEFAULT = Path(__file__).parent / "presets" +PRESETS_PATH_DEFAULT = MISCELLANEOUS_DIRECTORY / "stocks" / "screener" preset_choices = { filepath.name: filepath for filepath in PRESETS_PATH.iterdir() diff --git a/openbb_terminal/stocks/screener/yahoofinance_model.py b/openbb_terminal/stocks/screener/yahoofinance_model.py index a00c24d9694..9b96f952413 100644 --- a/openbb_terminal/stocks/screener/yahoofinance_model.py +++ b/openbb_terminal/stocks/screener/yahoofinance_model.py @@ -3,7 +3,6 @@ __docformat__ = "numpy" import configparser import datetime import logging -from pathlib import Path from typing import List, Tuple import random @@ -17,7 +16,10 @@ from sklearn.preprocessing import MinMaxScaler from openbb_terminal.decorators import log_start_end -from openbb_terminal.core.config.paths import USER_PRESETS_DIRECTORY +from openbb_terminal.core.config.paths import ( + USER_PRESETS_DIRECTORY, + MISCELLANEOUS_DIRECTORY, +) from openbb_terminal.rich_config import console from openbb_terminal.stocks.screener import finviz_model @@ -26,7 +28,7 @@ logger = logging.getLogger(__name__) register_matplotlib_converters() PRESETS_PATH = USER_PRESETS_DIRECTORY / "stocks" / "screener" -PRESETS_PATH_DEFAULT = Path(__file__).parent / "presets" +PRESETS_PATH_DEFAULT = MISCELLANEOUS_DIRECTORY / "stocks" / "screener" preset_choices = { filepath.name: filepath for filepath in PRESETS_PATH.iterdir() diff --git a/openbb_terminal/terminal_controller.py b/openbb_terminal/terminal_controller.py index 6cf1e65684b..5df3afe4d2b 100644 --- a/openbb_terminal/terminal_controller.py +++ b/openbb_terminal/terminal_controller.py @@ -13,6 +13,7 @@ import sys import webbrowser from typing import List, Dict, Optional import contextlib +import time import certifi from rich import panel @@ -61,7 +62,7 @@ from openbb_terminal.common import feedparser_view from openbb_terminal.reports.reports_model import ipykernel_launcher # pylint: disable=too-many-public-methods,import-outside-toplevel, too-many-function-args -# pylint: disable=too-many-branches,no-member,C0302,too-many-return-statements +# pylint: disable=too-many-branches,no-member,C0302,too-many-return-statements, inconsistent-return-statements logger = logging.getLogger(__name__) @@ -132,15 +133,20 @@ class TerminalController(BaseController): """Update runtime choices.""" self.ROUTINE_FILES = { filepath.name: filepath - for filepath in (MISCELLANEOUS_DIRECTORY / "routines").rglob("*.openbb") + for filepath in USER_ROUTINES_DIRECTORY.rglob("*.openbb") } - self.ROUTINE_FILES.update( - { - filepath.name: filepath - for filepath in USER_ROUTINES_DIRECTORY.rglob("*.openbb") - } - ) - self.ROUTINE_CHOICES = {filename: None for filename in self.ROUTINE_FILES} + + self.ROUTINE_CHOICES = {} + self.ROUTINE_CHOICES["--file"] = { + filename: None for filename in self.ROUTINE_FILES + } + self.ROUTINE_CHOICES["--example"] = None + self.ROUTINE_CHOICES["-e"] = None + self.ROUTINE_CHOICES["--input"] = None + self.ROUTINE_CHOICES["-i"] = None + self.ROUTINE_CHOICES["--help"] = None + self.ROUTINE_CHOICES["--h"] = None + if session and obbff.USE_PROMPT_TOOLKIT: choices: dict = {c: {} for c in self.controller_choices} choices["support"] = self.SUPPORT_CHOICES @@ -159,8 +165,7 @@ class TerminalController(BaseController): if not is_packaged_application(): mt.add_cmd("update") mt.add_cmd("wiki") - mt.add_cmd("record") - mt.add_cmd("stop") + mt.add_cmd("news") mt.add_raw("\n") mt.add_info("_configure_") mt.add_menu("keys") @@ -168,7 +173,9 @@ class TerminalController(BaseController): mt.add_menu("sources") mt.add_menu("settings") mt.add_raw("\n") - mt.add_cmd("news") + mt.add_info("_scripts_") + mt.add_cmd("record") + mt.add_cmd("stop") mt.add_cmd("exe") mt.add_raw("\n") mt.add_info("_main_menu_") @@ -228,7 +235,6 @@ class TerminalController(BaseController): def call_guess(self, other_args: List[str]) -> None: """Process guess command.""" - import time import json import random @@ -650,7 +656,9 @@ class TerminalController(BaseController): if not other_args: console.print( - "[red]Provide a path to the routine you wish to execute.\n[/red]" + "[red]Provide a path to the routine you wish to execute. For an example, please use " + "`exe --example` and for documentation and to learn how create your own script " + "type `about exe`.\n[/red]" ) return @@ -677,14 +685,15 @@ class TerminalController(BaseController): add_help=False, formatter_class=argparse.ArgumentDefaultsHelpFormatter, prog="exe", - description="Execute automated routine script.", + description="Execute automated routine script. For an example, please use " + "`exe --example` and for documentation and to learn how create your own script " + "type `about exe`.", ) parser_exe.add_argument( "--file", help="The path or .openbb file to run.", dest="path", - default="", - required="-h" not in args, + default=None, ) parser_exe.add_argument( "-i", @@ -693,12 +702,33 @@ class TerminalController(BaseController): dest="routine_args", type=lambda s: [str(item) for item in s.split(",")], ) + parser_exe.add_argument( + "-e", + "--example", + help="Run an example script to understand how routines can be used.", + dest="example", + action="store_true", + default=False, + ) + + if not args[0]: + return console.print("[red]Please select an .openbb routine file.[/red]\n") + if args and "-" not in args[0][0]: args.insert(0, "--file") ns_parser_exe = self.parse_simple_args(parser_exe, args) if ns_parser_exe: - if ns_parser_exe.path: - if ns_parser_exe.path in self.ROUTINE_CHOICES: + if ns_parser_exe.path or ns_parser_exe.example: + if ns_parser_exe.example: + path = ( + MISCELLANEOUS_DIRECTORY / "routines" / "routine_example.openbb" + ) + console.print( + "[green]Executing an example, please type `about exe` " + "to learn how to create your own script.[/green]\n" + ) + time.sleep(3) + elif ns_parser_exe.path in self.ROUTINE_CHOICES["--file"]: path = self.ROUTINE_FILES[ns_parser_exe.path] else: path = ns_parser_exe.path diff --git a/openbb_terminal/terminal_helper.py b/openbb_terminal/terminal_helper.py index 5022ca7a880..686bd10bdd9 100644 --- a/openbb_terminal/terminal_helper.py +++ b/openbb_terminal/terminal_helper.py @@ -137,6 +137,9 @@ def open_openbb_documentation( elif "sources" in path: path = "/guides/advanced/changing-sources" command = "" + elif "params" in path: + path = "/guides/intros/portfolio/po" + command = "" else: if arg_type == "command": # user passed a command name path = f"/reference/{path}" @@ -166,9 +169,20 @@ def open_openbb_documentation( elif "sources" in path: path = "/guides/advanced/changing-sources" command = "" - elif "exe" == command: + elif command in ["record", "stop", "exe"]: path = "/guides/advanced/scripts-and-routines" command = "" + elif command in [ + "intro", + "about", + "support", + "survey", + "update", + "wiki", + "news", + ]: + path = "" + command = "" elif command in ["ta", "ba", "qa"]: path = f"/guides/intros/common/{command}" command = "" diff --git a/tests/openbb_terminal/portfolio/portfolio_optimization/txt/test_po_controller/test_print_help.txt b/tests/openbb_terminal/portfolio/portfolio_optimization/txt/test_po_controller/test_print_help.txt index 4c869f468ac..e517da99d40 100644 --- a/tests/openbb_terminal/portfolio/portfolio_optimization/txt/test_po_controller/test_print_help.txt +++ b/tests/openbb_terminal/portfolio/portfolio_optimization/txt/test_po_controller/test_print_help.txt @@ -1,4 +1,4 @@ - load load tickers and categories from .xlsx or .csv file + load load tickers and categories from .xlsx or .csv file (use load --example for an example) Portfolio loaded: diff --git a/tests/openbb_terminal/portfolio/txt/test_portfolio_controller/test_print_help.txt b/tests/openbb_terminal/portfolio/txt/test_portfolio_controller/test_print_help.txt index 0fb5a2f066b..e0ebd79e8a0 100644 --- a/tests/openbb_terminal/portfolio/txt/test_portfolio_controller/test_print_help.txt +++ b/tests/openbb_terminal/portfolio/txt/test_portfolio_controller/test_print_help.txt @@ -2,7 +2,7 @@ > bro brokers holdings, supports: robinhood, ally, degiro, coinbase > po portfolio optimization, optimize your portfolio weights efficiently - load load data into the portfolio + load load transactions into the portfolio (use load --example for an example) show show existing transactions bench define the benchmark diff --git a/tests/openbb_terminal/reports/test_reports_controller.py b/tests/openbb_terminal/reports/test_reports_controller.py index 5cffe7bf90b..1fda96d3618 100644 --- a/tests/openbb_terminal/reports/test_reports_controller.py +++ b/tests/openbb_terminal/reports/test_reports_controller.py @@ -232,13 +232,13 @@ def test_call_func_expect_queue(expected_queue, func, queue): ( "call_portfolio", [ - "--transactions=market.csv", + "--transactions=holdings_example.xlsx", ], "reports_model.render_report", [], dict( input_path=str(reports_model.REPORTS_FOLDER / "portfolio"), - args_dict={"transactions": "market.csv"}, + args_dict={"transactions": "holdings_example.xlsx"}, ), ), ( diff --git a/website/content/sdk/guides/intros/portfolio/index.md b/website/content/sdk/guides/intros/portfolio/index.md index 4921bbb23a1..9b5a4725203 100644 --- a/website/content/sdk/guides/intros/portfolio/index.md +++ b/website/content/sdk/guides/intros/portfolio/index.md @@ -45,7 +45,29 @@ Many of the functions in this module will also have a companion command, `_chart ### Portfolio Files -Portfolio files are spreadsheets (xlsx or csv files) containing historical trades which add up to represent a net balance in the Portfolio Engine. Users should keep their collection of holdings files in the OpenBBUserData folder, `~/OpenBBUserData/portfolio/holdings`. They are shared resources with the CLI Terminal, and sample files are included within the installation folder. See the [source code](https://github.com/OpenBB-finance/OpenBBTerminal/tree/main/openbb_terminal/miscellaneous/portfolio_examples/holdings) on GitHub to view and download them directly. We recommend using the example files as a template when creating a new portfolio because of specific formatting requirements. The table below illustrates the required column titles: +Portfolio files are spreadsheets (xlsx or csv files) containing historical trades which add up to represent a net balance in the Portfolio Engine. Users should keep their collection of holdings files in the OpenBBUserData folder, `~/OpenBBUserData/portfolio/holdings`. + +:::note If you wish to load in your own Excel holdings file, please follow the following steps: +1. Download the Excel file that can be used as a template [here](https://www.dropbox.com/s/03wjjf1lfkqjmtn/holdings_example.xlsx?dl=0). +2. Move the file inside the `portfolio/holdings` folder within the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder and, optionally, adjust the name to your liking. +3. Open the Excel file and remove, edit or add to the values as you desire (e.g. your own orders). This is the default template that is also loaded in with `load --example`. +4. Open up the OpenBB Terminal, go to `portfolio` and type `load --file`. Your Excel file should then be one of the options. +::: + +Note that the Excel sheet requires the following columns: + +- **Date** - The date the trade occurred +- **Name** - The name of the security +- **Type** - The type of the security. Use Cash/Stock/Crypto/ETF as appropriate +- **Price** - The price the security was added or removed at, on a per-unit + basis +- **Quantity** - How much of the security in question was added or removed +- **Side** - Whether you bought or sold. Use Buy/Deposit/1 to add to the + portfolio or Sell/Withdrawal/0 to remove from the portfolio a search criteria, + country, sector or industry. + + +This is also illustrated int the table beThe table below illustrates the required column titles: | Date | Type | Ticker | Side | Price | Quantity | Fees | Investment | Currency | Sector | Industry | Country | Region | |:-----------|:-------|:---------|:-------|--------:|-----------:|-------:|-------------:|:-----------|:-----------------------|:-------------------------------|:--------------|:--------------| @@ -58,16 +80,7 @@ Portfolio files are spreadsheets (xlsx or csv files) containing historical trade | 2011-01-03 | STOCK | TSLA | Buy | 1.76 | 100 | 0 | 176 | USD | Consumer Cyclical | Auto Manufacturers | United States | North America | | 2011-01-03 | STOCK | GOOG | Buy | 15.01 | 100 | 0 | 1501 | USD | Communication Services | Internet Content & Information | United States | North America | -Not every column needs to contain a value, but they must exist despite being empty. The accepted values for `Type` are currently: - -- Crypto -- ETF -- Stock -- More Coming Soon! - -The table above is supplied here as a portfolio XLSX file - [example.xlsx](https://github.com/OpenBB-finance/OpenBBTerminal/files/10096861/example.xlsx) - save the file in the OpenBBUserData folder, `~/OpenBBUserData/portfolio/holdings/` - -Categorization will be done automatically where the information is not supplied. To manually set the asset categorization (region, sector, industry, country), use the template file, `Public_Equity_Orderbook.xlsx`. +The template Excel file also has additional columns but these are _optional_. The OpenBB SDK can figure out by itself what industry, sector, country and region belongs to the loaded in Equity. So the field can be left blank if your holdings do not include this information. ## Examples @@ -83,7 +96,7 @@ import pandas as pd ### Load -Taking the downloaded `example.xlsx` file from the previous section, let's load it into the Portfolio Engine. There are a few parameters available for this function, and an object is returned. +Taking the downloaded `holdings_example.xlsx` file from the previous section, let's load it into the Portfolio Engine. There are a few parameters available for this function, and an object is returned. ```python help(openbb.portfolio.load) @@ -119,7 +132,7 @@ The syntax should resemble something like the sample below; don't forget to modi ```python P = openbb.portfolio.load( - transactions_file_path = '/Users/path_to/OpenBBUserData/portfolio/holdings/example.xlsx', + transactions_file_path = '/Users/path_to/OpenBBUserData/portfolio/holdings/holdings_example.xlsx', benchmark_symbol = 'VTI', full_shares = False, risk_free_rate = 3.0 diff --git a/website/content/sdk/guides/intros/portfolio/po.md b/website/content/sdk/guides/intros/portfolio/po.md index 6eeed073a4a..37aed259099 100644 --- a/website/content/sdk/guides/intros/portfolio/po.md +++ b/website/content/sdk/guides/intros/portfolio/po.md @@ -16,7 +16,20 @@ from openbb_terminal.sdk import openbb This menu requires the usage of the Excel templates to work properly. As there is a lot of complexity involved around these techniques, these templates allow the user to understand what values for each parameter are actually used and allow for an easy way to define the allocation. -:::note For this there are two templates that need to be set, the **OpenBB Parameters Template** and the **60_40_Portfolio.xlsx**. These files can be found in [here](https://github.com/OpenBB-finance/OpenBBTerminal/tree/main/openbb_terminal/miscellaneous/portfolio_examples). One is in the `allocation` folder and the other is in `optimization`. the Select a file and press "Download" on the right, then place it into the OpenBBUserData folder. You can find more about this folder [here](/sdk/advanced/data). +:::note If you wish to load in your own Excel allocation file, please follow the following steps: +1. Download the Excel file that can be used as a template [here](https://www.dropbox.com/s/wp1lcq86exyngjy/allocation_example.xlsx?dl=0). +2. Move the file inside the `portfolio/allocation` folder within the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder and, optionally, adjust the name to your liking. +3. Open the Excel file and remove, edit or add to the values as you desire (e.g. your own allocation). This is the default template that is also loaded in with `load --example`. +4. The file can now be used by following the guide. +::: + +Furthermore, given the amount of options you can choose from in each command and giving the complexity of the topic, we also provide a parameter file (both .xlsx and .ini to adjust parameters in a user-friendly way). + +:::note If you wish to load in your own Excel or ini parameter file, please follow the following steps: +1. Download the file that can be used as a template: [xlsx](https://www.dropbox.com/s/qfhd7ntj7mlwsuc/parameters_template.xlsx?dl=0) (recommended) or [ini](https://www.dropbox.com/s/3ehwg3hiwm89hgo/parameters_template.ini?dl=0) (advanced). +2. Move the file inside the `portfolio/optimization` folder within the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder and, optionally, adjust the name to your liking. +3. Open the file and set parameters as you wish. +4. Open up the OpenBB Terminal, go to `portfolio/po` and type `file --file`. The file should then be one of the options. ::: ### OpenBB Parameters Template @@ -37,7 +50,7 @@ You can load in the portfolio template with the following code: import pandas as pd # Define your own orderbook path here, current value won't work -order_book_path = "60_40_Portfolio.xlsx" +order_book_path = "allocation_example.xlsx" # Read in the file order_book = pd.read_excel(order_book_path) @@ -83,7 +96,7 @@ It is possible to use the commands without loading in the parameters template or ```python # Perform calculations -weights_riskparity, data_returns_riskparity = openbb.portfolio.po.riskparity(p, interval="10y", risk_measure="CVaR") +weights_riskparity, data_returns_riskparity = openbb.portfolio.po.riskparity(p, interval="5y", risk_measure="CVaR") weights_riskparity ``` @@ -106,13 +119,13 @@ Which returns: ## Examples -To demonstrate the capabilities of the Portfolio Optimization menu, the entire S&P 500 index (as of 30th of May 2022) is used and optimized and analysed in a variety of ways. Starting by loading in the dataset with the following: +Starting by loading in the same dataset again with the following: ```python import pandas as pd # Define your own orderbook path here, current value won't work -order_book_path = "pathto/SP_500_Portfolio.xlsx" +order_book_path = "allocation_example.xlsx" # Read in the file order_book = pd.read_excel(order_book_path) @@ -124,29 +137,12 @@ order_book_cols = ['Ticker', 'Asset Class', 'Sector', 'Industry', 'Country', order_book = order_book[order_book_cols] # Load in the portfolio -tickers, categories = openbb.portfolio.po.load(symbols_file_path=order_book_path) +P = openbb.portfolio.po.load(symbols_file_path=order_book_path) ``` Then, the Hierarchical Risk Parity technique is applied by using the following: ```python -order_book_path = "pathto/SP_500_Portfolio.xlsx" - -order_book = pd.read_excel(order_book_path) -# Adjust the columns accordingly -order_book_cols = [ - 'Ticker', - 'Asset Class', - 'Sector', - 'Industry', - 'Country', - 'Current Invested Amount', - 'Currency', -] - -order_book = order_book[order_book_cols] - -p = openbb.portfolio.po.load(symbols_file_path=order_book_path) riskparity, data_returns_riskparity = openbb.portfolio.po.hrp(p, interval="5y", risk_measure='SLPM', risk_aversion=0.8) @@ -155,7 +151,7 @@ print(riskparity) print(data_returns_riskparity) ``` -This results in the following (the result is edited, as it would show 500 tickers, to prevent flooding this page): +This results in a similar result as the following: | | Hierarchical Risk Parity | |:------|---------------------------:| diff --git a/website/content/sdk/guides/intros/stocks/stocks-screener.md b/website/content/sdk/guides/intros/stocks/stocks-screener.md index 982f4d78a23..120284df83d 100644 --- a/website/content/sdk/guides/intros/stocks/stocks-screener.md +++ b/website/content/sdk/guides/intros/stocks/stocks-screener.md @@ -4,11 +4,7 @@ keywords: [screen, screener, stock, stocks, historical, overview, valuation, fin description: This guide introduces the Stock Screener, within the Stocks menu, briefly explains the features, and shows examples in context. --- -The Stocks Screener module imports the same screener found in the OpenBB Terminal, and adds advanced scripting capabilities in the SDK layer. The screener utilizes presets (.ini files) to scan for stocks meeting the criteria defined. User-generated files are kept in the `OpenBBUserData` folder under, `~/OpenBBUserData/presets/stocks/screener/`. There are also presets included within the cloned repo folder: - -`path_to_git_clone/OpenBBTerminal/openbb_terminal/stocks/screener/presets` - -For convenience, they are supplied here as a ZIP file, [stocks_screener_preset.zip](https://github.com/OpenBB-finance/OpenBBTerminal/files/10127462/stocks_screener_preset.zip). +The Stocks Screener module imports the same screener found in the OpenBB Terminal, and adds advanced scripting capabilities in the SDK layer. The screener utilizes presets (.ini files) to scan for stocks meeting the criteria defined. User-generated files are kept in the `stocks/screener` folder within the [OpenBBUserData](https://docs.openbb.co/sdk/guides/advanced/data) folder. This screener can find stocks on three exchanges: @@ -26,9 +22,7 @@ The data returned is grouped into five categories: ## How to Use -### Template.ini - -This file is for seeing all possible arguments and parameters for the screener. Reference this file (included in the ZIP file above) for the master list of settings. There are four categories of parameters to set. Without any parameters, a screener preset file must contain the following at a minimum: +Without any parameters, a screener preset file must contain the following at a minimum: ```console # Author of preset: @@ -51,6 +45,17 @@ Parameters should be added as required, and they all have pre-defined values; fo Price/Free Cash Flow = Any ``` +:::note To create your own preset please use the following steps: + +1. Download the default preset as found [here](https://www.dropbox.com/s/xqdo5m87j1krh0h/stocks_screener_template.ini?dl=0). +2. Place the `stocks_screener_template.ini` in the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder under `presets/stocks/screener`. +3. Rename that file to something you find meaningful, e.g. `my_own_filter.ini`. +4. Open the file you just renamed (e.g. `my_own_filter.ini`), and set the parameters you want to filter. +5. It may be useful to play with the main source ([Finviz](https://finviz.com/screener.ashx)) since you can tweak these and understand how they influence the outcome of the filtered stocks. +6. Load in your preset within the OpenBB SDK with `openbb.stocks.screener.screener_data(preset_loaded='my_own_filter.ini')` which is explained further in the examples. +::: + + ## Examples To make a screener with only a few filters, it should look something like this: @@ -74,9 +79,7 @@ Price/Free Cash Flow = Low (<15) Beta = Under 1 ``` -Copy the block above to a new text file in any editor, and save the file to the OpenBBUserData folder, naming it something like, `sdk_guide_preset.ini`. Declaring the path to the preset file, when located in the OpenBBUserData folder, is not required. The kernel must be restarted in order for the file to be recalled this way; however, changes to the preset itself will be reflected without a restart. - -**This preset file has been included in the ZIP file at the top of the page.** +Copy the block above to a new text file in any editor, and save the file to the [OpenBBUserData](https://docs.openbb.co/sdk/guides/advanced/data) folder, naming it something like, `sdk_guide_preset.ini`. Declaring the path to the preset file, when located in the OpenBBUserData folder, is not required. The kernel must be restarted in order for the file to be recalled this way; however, changes to the preset itself will be reflected without a restart. It is a good idea to test choices made before making it too complicated. Start with a handful of filters and modify, or add, them one-at-a-time. Let's pass what we have so far through the screener with `performance` selected as the `data_type`. diff --git a/website/content/terminal/guides/advanced/scripts-and-routines.md b/website/content/terminal/guides/advanced/scripts-and-routines.md index 6edb2724d79..fffb575a010 100644 --- a/website/content/terminal/guides/advanced/scripts-and-routines.md +++ b/website/content/terminal/guides/advanced/scripts-and-routines.md @@ -4,73 +4,82 @@ title: Scripts & Routines description: The .openbb scripts offer the ability to automatically run a set of commands in the form of a **routine**. Furthermore, the scripts can be adapted, and documented, at any moment giving the user full control over the type of analysis you wish to do (and repeat). This can fundamental research, understanding market movements, finding hidden gems and even doing advanced statistical/econometric research. keywords: [scripts, routines, .do file, stata, spss, r studio, python, automation, data collection, aggregation, script, routine, openbb terminal] --- -The `.openbb` scripts offer the ability to automatically run a set of commands in the form of a **routine**. Furthermore, the scripts can be adapted, and documented, at any moment giving the user full control over the type of analysis you wish to do (and repeat). This can fundamental research, understanding market movements, finding hidden gems and even doing advanced statistical/econometric research. +The `.openbb` scripts offer the ability to automatically run a set of commands in the form of a **routine**. Furthermore, the scripts can be adapted, and documented, at any moment giving the user full control over the type of analysis you wish to do (and repeat). This can fundamental research, understanding market movements, finding hidden gems and even doing advanced statistical/econometric research. + +The .openbb scripts offer a vast amount of capabilities to export data from the OpenBB Terminal directly into Excel files allowing students, professors, researchers and professionals to collect a a large dataset incredibly quick. For example, the GIF below demonstrates market data collection of all constituents of the S&P 500. Download the routine file [here](https://www.dropbox.com/s/3w8jgtzl0yoq9o9/sp500.openbb?dl=0) and place it in the `routines` folder as found in the `OpenBBUserData` folder and execute with `exe sp500.openbb`. Read on to understand in detail how to create and execute these type of files. + + + +### Create your own script + +Within the OpenBB Terminal, you have the option to record your own session with `record` which converts any commands you run in an .openbb script until you type `stop`. Find a short demonstration below. + + + +As shown in the video, scripts and routines reside in the `routines` folder within the `OpenBBUserData` folder (as found [here](https://docs.openbb.co/terminal/guides/advanced/data)) and are automatically shown when you type `exe` from the home screen (`home`). + +:::note To manually create your own .openbb script use the following: +1. Download the file that can be used as a template [here](https://www.dropbox.com/s/73g9qx9xgtbb2ec/routines_template.openbb?dl=0). +2. Move the file inside the `routines` folder within the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder and, optionally, adjust the name to your liking. +3. Open the file with a Text Editor (e.g. Notepad or TextEdit) and adjust the file accordingly. +4. Open up the OpenBB Terminal, and type `exe --file`. The file should then be one of the options. +5. Select the file to run the routine script. +::: + +As long as the file remains in the `routines` folder, you will be able to find your file automatically as shown below: + +![Script Showcase](https://user-images.githubusercontent.com/46355364/213746605-53cfeb46-13f2-4550-b0fd-9de8a6d06bf1.png) ### Explanation of scripts -The script file below is titled _stocks_demo.openbb_. This file follows the following logic: +The script file follows the following logic: -- Comments: any text after a `#` is referred to as a comment. This is used to explain what is happening within the script and is not taking into account when running terminal commands. -- Commands: any text **without** a `#` is being ran inside the OpenBB Terminal. E.g. on the second line it says `stocks` thus within the OpenBB Terminal the script will enter `stocks` and run this for you. +- **Comments**: any text after a hashtag (`#`) is referred to as a comment. This is used to explain what is happening within the script and is not taking into account when running terminal commands. +- **Commands**: any text *without* a hashtag is being ran inside the OpenBB Terminal. E.g. on the second line it says `stocks` thus within the OpenBB Terminal the script will enter `stocks` and run this for you. -These scripts have a 1-to-1 relationship with how you would normally use the terminal. To get a better understanding of how the terminal is used, please see Structure of the OpenBB Terminal. +These scripts have a 1-to-1 relationship with how you would normally use the terminal. To get a better understanding of how the terminal is used, please see Structure of the OpenBB Terminal. The example below can be executed by running `exe --example`. ``` # Go into the stocks context stocks -# Load a company ticker, e.g. Amazon -load AMZN +# Load a company ticker, e.g. Apple +load AAPL -# Show a simple plot of the ticker, adding in any basic indicator. -candle --ma 20,30 +# Show a candle chart with a 20 day Moving Average +candle --ma 20 -# Switch over to the due diligence menu +# Switch over to the Due Diligence menu dd -# Show the price targets of Amazon, both the graph as well as the table -pt -pt --raw +# Show analyst ratings +analyst -# Show estimates of annual and quarterly earnings as well as quarterly revenue estimates +# Show price targets charts +pt + +# Show future estimations est -# Open the comparison analysis menu (ca) -../ca - -# Pick stocks that are competitors to Amazon -add ebay,wmt,tgt,baba,jd - -# Determine the valuations of each company -valuation - -# Show correlations between each company -hcorr - -# Figure out the sentiment perceived of each company -sentiment - # Return to home -/ +home ``` ### Executing a script -By going to the main menu as depicted below (accessible with `home`), the `exe` command can be used. With this command you can run any `.openbb` script. These scripts are located where the application is located inside the routines folder. +By going to the main menu as depicted below (accessible with `home`), the `exe` command can be used. With this command you can run any `.openbb` script. These scripts are located where the application is located inside the `routines` folder as found in the `OpenBBUserData` folder. -![Routine Exe OpenBB Terminal](https://user-images.githubusercontent.com/46355364/174588513-5c52ea20-548a-4c2b-a4c1-6054e2d71786.png) +Thus, using the earlier mentioned script, we can enter `exe --file routines_template.openbb` which automatically runs all commands within the script file. Thus, it will return a candle chart with a moving average of 20 days, expectations and price targets from analysts and estimated future performance before returning to the home window. -Thus, using the earlier mentioned script, we can enter `exe stocks_demo.openbb` which automatically runs all commands within the script file. Thus, it will return a candle chart with moving averages, price targets from Analysts, valuations of related companies, the correlation between these companies and the market sentiment. This results in the following: +![OpenBB Routine Script Execution](https://user-images.githubusercontent.com/46355364/213746495-6b38ab67-1d90-46b1-898f-9df1ce4063c0.png) -![Script Stocks Demo OpenBB](https://user-images.githubusercontent.com/46355364/176903147-720eb2af-7e5d-40df-8ec6-7363cbc08430.png) +### Custom arguments -#### Custom arguments - -Next to that, it is also possible to add in custom arguments to your script making the script more interactive and allow you to do the same analysis for multiple companies. This is done in the following script: +Next to that, it is also possible to add in custom arguments to your script making the script more interactive and allow you to do the same analysis for multiple companies. This is done in the following script (and can be downloaded [here](https://www.dropbox.com/s/usooz6y29r1xldb/routines_template_with_inputs.openbb?dl=0): ``` # This script requires you to use arguments. This can be done with the following: -# exe example_with_inputs.openbb -i TSLA,AAPL,MSFT +# exe --file routines_template_with_inputs.openbb -i TSLA,AAPL,MSFT # Go to the stocks menu stocks @@ -88,25 +97,17 @@ fib ../ca # Set two extra tickers based on the arguments used. E.g. -i TSLA,AAPL,MSFT -set $ARGV[1],$ARGV[2] +add $ARGV[1],$ARGV[2] # Plot the historical prices historical # Return to home -/ +home ``` This script includes `$ARGV[0]`, `$ARGV[1]` and `$ARGV[2]`. This means that the script requires you to submit three arguments. In this case, they refer to stock tickers. Therefore, like the script also says, you can include these arguments with `-i` followed by three tickers (e.g. `exe example_with_inputs.openbb -i TSLA,AAPL,MSFT`). This results in the following: -![Example with Inputs OpenBB Script](https://user-images.githubusercontent.com/46355364/176903205-3cb55bf5-8710-4ad6-8eef-f9a99294ea3b.png) +![OpenBB Script with Input](https://user-images.githubusercontent.com/46355364/213747540-1907ffdb-1950-42a7-bb5b-8482777a9763.png) -It is an incredibly simple script, but it gives an understanding what the possibilities are. - -### Create your own script - -Scripts and routines reside in the `routines` folder and are automatically shown when you type `exe` from the home screen (`home`). To create your own, you can use the `template.openbb` file as a basis but you are free to duplicate one of the demo files. - -Within this template, some examples are given, and you are free to change the contents and rename the file. As long as the file remains in the same folder, you will be able to find your file automatically as shown below: - -![Show Copy of Template OpenBB Script](https://user-images.githubusercontent.com/46355364/176903253-00a5b0f9-a6e7-49c7-a1d8-49ae819e28e3.png) +It is an incredibly simple script, but it gives an understanding what the possibilities are. Do make sure you saved this script in the `routines` folder else you are not able to execute it. diff --git a/website/content/terminal/guides/intros/common/ta.md b/website/content/terminal/guides/intros/common/ta.md index 92d718f0392..e9a9c49bacc 100644 --- a/website/content/terminal/guides/intros/common/ta.md +++ b/website/content/terminal/guides/intros/common/ta.md @@ -67,7 +67,4 @@ Bollinger Bands with a 1-minute resolution for AMZN - `bbands` The Accumulation/Distribution line of AMZN - `ad` -![AMZN Accumulation/Distribution Line](https://user-images.githubusercontent.com/85772166/174499247-e63f8f57-a06a-446b-bca3-0fe89258fd4b.png) - -To play a demonstration of this menu in the OpenBB Terminal run, -`exe ta_demo.openbb`, from the main menu. +![AMZN Accumulation/Distribution Line](https://user-images.githubusercontent.com/85772166/174499247-e63f8f57-a06a-446b-bca3-0fe89258fd4b.png) \ No newline at end of file diff --git a/website/content/terminal/guides/intros/portfolio/index.md b/website/content/terminal/guides/intros/portfolio/index.md index d8a05971e28..575f1dc17b5 100644 --- a/website/content/terminal/guides/intros/portfolio/index.md +++ b/website/content/terminal/guides/intros/portfolio/index.md @@ -13,18 +13,14 @@ The Portfolio menu is called upon by typing `portfolio` which opens the followin ![Portfolio Menu](https://user-images.githubusercontent.com/46355364/180178234-0cb80009-74d8-41fb-9f4c-fa393361903a.png) -The first step in using this menu is loading a portfolio with load. Here, we provide an example titled "Public_Equity_Orderbook.xlsx" which can be loaded in. This file also serves as a template when you wish to fill in your own orders. This results in the following: +The first step in using this menu is loading a portfolio with load. Within this guide, we provide an example file when running `load --example` which will be used to explain the functionality through the guide. -``` -2022 Jul 19, 10:03 (๐Ÿฆ‹) /portfolio/ $ load Public_Equity_Orderbook.xlsx - Preprocessing orderbook: .......... - Loading price data: . - Calculating returns: . - - -Portfolio: Public_Equity_Orderbook.xlsx -Risk Free Rate: 0 -``` +:::note If you wish to load in your own Excel holdings file, please follow the following steps: +1. Download the Excel file that can be used as a template [here](https://www.dropbox.com/s/03wjjf1lfkqjmtn/holdings_example.xlsx?dl=0). +2. Move the file inside the `portfolio/holdings` folder within the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder and, optionally, adjust the name to your liking. +3. Open the Excel file and remove, edit or add to the values as you desire (e.g. your own orders). This is the default template that is also loaded in with `load --example`. +4. Open up the OpenBB Terminal, go to `portfolio` and type `load --file`. Your Excel file should then be one of the options. +::: Note that the Excel sheet requires the following columns: @@ -38,7 +34,24 @@ Note that the Excel sheet requires the following columns: portfolio or Sell/Withdrawal/0 to remove from the portfolio a search criteria, country, sector or industry. -Furthermore, the chosen Excel sheet above also has additional columns but these are _optional_. The OpenBB Terminal can figure out by itself what industry, sector, country and region belongs to the loaded in equity. You can see this in action by loading in the "Public_Equity_Orderbook_No_Categorization.xlsx" Excel sheet. +The template Excel file also has additional columns but these are _optional_. The OpenBB Terminal can figure out by itself what industry, sector, country and region belongs to the loaded in Equity. So the field can be left blank if your holdings do not include this information. + +Continuing with the example, this results in the following: + +``` +(๐Ÿฆ‹) /portfolio/ $ load --example + +Loading an example, please type `about` to learn how to create your own Portfolio Excel sheet. + +Preprocessing transactions: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 14/14 [00:02<00:00, 4.88it/s] + Loading price data: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 1/1 [00:00<00:00, 1.83it/s] + Calculating returns: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 1/1 [00:00<00:00, 2.46it/s] + Loading benchmark: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 4/4 [00:01<00:00, 2.35it/s] + +Portfolio: OpenBB Example Portfolio +Risk Free Rate: 0.00% +Benchmark: SPDR S&P 500 ETF Trust (SPY) +``` With the show command we can show how the data has been loaded in: @@ -67,20 +80,33 @@ With the SPDR S&P 500 ETF Trust (SPY) with the bench command as follows: +After loading in the portfolio, it is time to select a benchmark. By default, this is set to SPDR S&P 500 ETF Trust (SPY). It is important to choose a benchmark that closely matches your portfolio so that you can understand if the trades you have made actually were beneficial. For example, let's load in the with the bench command as follows: ``` -2022 Jul 19, 10:14 (๐Ÿฆ‹) /portfolio/ $ bench SPDR S&P 500 ETF Trust (SPY) +(๐Ÿฆ‹) /portfolio/ $ bench --benchmark VTI -Benchmark: SPDR S&P 500 ETF Trust (SPY) (SPY) + Loading benchmark: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 4/4 [00:01<00:00, 2.91it/s] -2022 Jul 19, 10:16 (๐Ÿฆ‹) /portfolio/ $ +(๐Ÿฆ‹) /portfolio/ $ ? + +โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Portfolio โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +โ”‚ โ”‚ +โ”‚ โ”‚ +โ”‚ > bro brokers holdings, supports: robinhood, ally, degiro, coinbase โ”‚ +โ”‚ > po portfolio optimization, optimize your portfolio weights efficiently โ”‚ +โ”‚ โ”‚ +โ”‚ load load data into the portfolio โ”‚ +โ”‚ show show existing transactions โ”‚ +โ”‚ bench define the benchmark โ”‚ +โ”‚ โ”‚ +โ”‚ Loaded transactions file: OpenBB Example Portfolio โ”‚ +โ”‚ Risk Free Rate: 0.00% โ”‚ +โ”‚ Benchmark: Vanguard Total Stock Market ETF (VTI) + ``` Note that the `bench` command has a large selection of products you can choose from. Instead of taking the index directly, an ETF product is used to represent something that you could have actually invested in. By using the `DOWN` (โŒ„) arrow and pressing `ENTER` (โŽ) you can select a different benchmark. -![Benchmark Selection](https://user-images.githubusercontent.com/46355364/180178291-eacebad5-79be-4c57-85a2-c75d88b0470c.png) - After defining both the portfolio and the benchmark, a lot more options become available: ![Portfolio Menu after loading Portfolio and Benchmark](https://user-images.githubusercontent.com/46355364/180178329-0aca57bf-ad29-47cc-a787-298a4de4070a.png) @@ -88,7 +114,7 @@ After defining both the portfolio and the benchmark, a lot more options become a For example, with `perf`, we can see how the portfolio performed compared to if you invested the same amount of money into the benchmark instead. This reflects the capabilities of you, as an investor, to outperform a passive strategy. ``` -2022 Jul 20, 08:26 (๐Ÿฆ‹) /portfolio/ $ perf +(๐Ÿฆ‹) /portfolio/ $ perf Portfolio vs. Benchmark - Totals in period: all โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ @@ -107,7 +133,7 @@ For example, with `perf`, we can see how the portfolio performed compared to if Compliment this by showing the volatility of the portfolio for different time periods with `metric` as follows: ``` -2022 Jul 20, 08:27 (๐Ÿฆ‹) /portfolio/ $ metric volatility +(๐Ÿฆ‹) /portfolio/ $ metric volatility Volatility for Portfolio and Benchmark โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ @@ -137,32 +163,31 @@ Volatility for Portfolio and Benchmark ### Examples -Instead of loading the "Public_Equity_Orderbook.xlsx" file, we now load in "Public_Equity_Orderbook_No_Categorization.xlsx" which does not include categorization of the stocks by industry, sector, country and region. Therefore, we let the OpenBB Terminal figure this out. This takes a bit longer to load. +Starting off by loading in the OpenBB Example Portfolio again and changing the benchmark, the Vanguard Total Stock Market ETF (VTI). ``` -2022 Jul 21, 04:43 (๐Ÿฆ‹) /portfolio/ $ load Public_Equity_Orderbook_No_Categorization.xlsx - Preprocessing orderbook: .......... - Loading company data: .......... - Loading price data: . - Calculating returns: . +(๐Ÿฆ‹) /portfolio/ $ load --example +Loading an example, please type `about` to learn how to create your own Portfolio Excel sheet. -Portfolio: Public_Equity_Orderbook_No_Categorization.xlsx -Risk Free Rate: 0 -``` +Preprocessing transactions: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 14/14 [00:02<00:00, 4.88it/s] + Loading price data: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 1/1 [00:00<00:00, 1.83it/s] + Calculating returns: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 1/1 [00:00<00:00, 2.46it/s] + Loading benchmark: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 4/4 [00:01<00:00, 2.35it/s] -Then we load in a benchmark again with `bench` where we select the Vanguard Total Stock Market ETF (VTI). +Portfolio: OpenBB Example Portfolio +Risk Free Rate: 0.00% +Benchmark: SPDR S&P 500 ETF Trust (SPY) -``` -2022 Jul 21, 04:44 (๐Ÿฆ‹) /portfolio/ $ bench Vanguard Total Stock Market ETF (VTI) +(๐Ÿฆ‹) /portfolio/ $ bench VTI -Benchmark: Vanguard Total Stock Market ETF (VTI) (VTI) + Loading benchmark: 100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 4/4 [00:01<00:00, 3.32it/s] ``` Then, we can show our performance compared to that of the benchmark with `perf` as well as show the rolling beta with `rbeta`. ``` -2022 Jul 21, 04:45 (๐Ÿฆ‹) /portfolio/ $ perf +(๐Ÿฆ‹) /portfolio/ $ perf Portfolio vs. Benchmark - Totals in period: all โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ @@ -177,7 +202,7 @@ Then, we can show our performance compared to that of the benchmark with `perf` โ”‚ Total Abs Return โ”‚ 13149.27 โ”‚ 11235.47 โ”‚ 1913.79 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -2022 Jul 21, 04:46 (๐Ÿฆ‹) /portfolio/ $ rbeta +(๐Ÿฆ‹) /portfolio/ $ rbeta ``` ![Rolling Beta of the Portfolio](https://user-images.githubusercontent.com/46355364/180178392-96efb6e1-60a1-4f76-92d8-434fb3637c21.png) @@ -185,7 +210,7 @@ Then, we can show our performance compared to that of the benchmark with `perf` This helps in understanding that, even though you achieved a superior return, this also came at a greater risk compared to that of the benchmark. With the available functionalities you can further look into these results, e.g. by looking at the `summary` statistics: ``` -2022 Jul 21, 04:46 (๐Ÿฆ‹) /portfolio/ $ summary +๐Ÿฆ‹) /portfolio/ $ summary Summary of Portfolio vs Benchmark for all period โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ @@ -210,7 +235,7 @@ Summary of Portfolio vs Benchmark for all period As well as look into how the allocations differ per sector and country with `alloc`. This shows that there is a clear difference in how the benchmark and the portfolio are constructed implying the Total Market ETF might not be the best benchmark for your portfolio. ``` -2022 Jul 21, 04:52 (๐Ÿฆ‹) /portfolio/ $ alloc sectors +(๐Ÿฆ‹) /portfolio/ $ alloc sectors Portfolio vs. Benchmark - Top 4 Sectors Allocation @@ -226,7 +251,7 @@ As well as look into how the allocations differ per sector and country with `all โ”‚ Communication Services โ”‚ 1.50% โ”‚ 7.98% โ”‚ -6.48% โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -2022 Jul 21, 04:52 (๐Ÿฆ‹) /portfolio/ $ alloc countries +(๐Ÿฆ‹) /portfolio/ $ alloc countries Portfolio vs. Benchmark - Top 5 Countries Allocation diff --git a/website/content/terminal/guides/intros/portfolio/po.md b/website/content/terminal/guides/intros/portfolio/po.md index fccb27f2fc0..e7730d20c4e 100644 --- a/website/content/terminal/guides/intros/portfolio/po.md +++ b/website/content/terminal/guides/intros/portfolio/po.md @@ -12,14 +12,42 @@ The portfolio optimization menu can be reached by visiting the `portfolio` menu -This menu requires the usage of the Excel templates to work properly. As there is a lot of complexity involved around these techniques, these templates allow the user to understand what values for each parameter are actually used and allow for an easy way to define the allocation. +The first step in using this menu is loading a portfolio with load. Within this guide, we provide an example file when running `load --example` which will be used to explain the functionality through the guide. -For this there are two templates that need to be set: +:::note If you wish to load in your own Excel allocation file, please follow the following steps: +1. Download the Excel file that can be used as a template [here](https://www.dropbox.com/s/wp1lcq86exyngjy/allocation_example.xlsx?dl=0). +2. Move the file inside the `portfolio/allocation` folder within the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder and, optionally, adjust the name to your liking. +3. Open the Excel file and remove, edit or add to the values as you desire (e.g. your own allocation). This is the default template that is also loaded in with `load --example`. +4. Open up the OpenBB Terminal, go to `portfolio/po` and type `load --file`. Your Excel file should then be one of the options. +::: -- **OpenBB Parameters Template**: found in the OpenBBUserData directory within `~/OpenBBUserData/portfolio/parameters` -- **OpenBB Portfolio Template**: found in the OpenBBUserData directory within `~/OpenBBUserData/portfolio/allocation` +Furthermore, given the amount of options you can choose from in each command and giving the complexity of the topic, we also provide a parameter file (both .xlsx and .ini to adjust parameters in a user-friendly way). -The OpenBBUserData directory is created automatically. See for more information [here](https://docs.openbb.co/terminal/quickstart/data). +:::note If you wish to load in your own Excel or ini parameter file, please follow the following steps: +1. Download the file that can be used as a template: [xlsx](https://www.dropbox.com/s/qfhd7ntj7mlwsuc/parameters_template.xlsx?dl=0) (recommended) or [ini](https://www.dropbox.com/s/3ehwg3hiwm89hgo/parameters_template.ini?dl=0) (advanced). +2. Move the file inside the `portfolio/optimization` folder within the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder and, optionally, adjust the name to your liking. +3. Open the file and set parameters as you wish. +4. Open up the OpenBB Terminal, go to `portfolio/po` and type `file --file`. The file should then be one of the options. +::: + +Find more information about these two templates below. + +#### OpenBB Portfolio Template + +This template hands the user a format to work with it to define the portfolio. Here, categorization is applied based on asset class, sector, industry, country and currency. By using the dropdown menus within this Excel, you are able to apply the proper categorization. This is based on the same methodology as found in other areas of the terminal. + + + +You can load in the portfolio template by using the load command or use `load --example` to obtain an example allocation: + +``` +(๐Ÿฆ‹) /portfolio/po/ $ load --file allocation_example.xlsx +(๐Ÿฆ‹) /portfolio/po/ $ show + +Current Portfolios: None + +Current Categories: ASSET_CLASS, SECTOR, INDUSTRY, COUNTRY, CURRENT_INVESTED_AMOUNT, CURRENCY +``` #### OpenBB Parameters Template @@ -32,7 +60,7 @@ The OpenBB Terminal does, however, allow the user to run any model despite the ` Once you have defined the parameters, save the template and load it inside the terminal by using the file command. If done correctly, the parameters file should show automatically after typing `file` and pressing SPACE. Then, by using the DOWN KEY (โŒ„) you can select the file by pressing ENTER (โŽ) which will then be loaded into the terminal: ``` -2022 May 02, 06:51 (๐Ÿฆ‹) /portfolio/po/ $ file OpenBB_Parameters_Template v1.0.0.xlsx +(๐Ÿฆ‹) /portfolio/po/ $ file parameters_template.xlsx Parameters: historic_period : 3y log_returns : 0 @@ -52,229 +80,248 @@ Parameters: short_allocation : 0 ``` -#### OpenBB Portfolio Template - -This template hands the user a format to work with it to define the portfolio. Here, categorization is applied based on asset class, sector, industry, country and currency. By using the dropdown menus within this Excel, you are able to apply the proper categorization. This is based on the same methodology as found in other areas of the terminal. - - - -You can load in the portfolio template by using the load command: - -``` -2022 Apr 26, 01:35 (๐Ÿฆ‹) /portfolio/po/ $ load OpenBB_Portfolio_Template_v1.0.0.xlsx -2022 Apr 26, 02:15 (๐Ÿฆ‹) /portfolio/po/ $ show - -Current Portfolios: None - -Current Categories: ASSET_CLASS, SECTOR, INDUSTRY, COUNTRY, CURRENT_INVESTED_AMOUNT, CURRENCY -``` - #### Performing optimization -Based on the parameters and allocation the user has set, the optimization process begins. What optimization technique is ideal depends entirely on the user's risk profile and objectives. As an illustration, Risk Parity is presented below via the riskparity command: +Based on the parameters and allocation the user has set, the optimization process begins. What optimization technique is ideal depends entirely on the user's risk profile and objectives. As an illustration, Risk Parity is presented below via the riskparity command. + +First of all, we load in the example portfolio as follows: ``` -2022 May 30, 05:47 (๐Ÿฆ‹) /portfolio/po/ $ riskparity +(๐Ÿฆ‹) /portfolio/po/ $ load --example + +Loading an example, please type `about` to learn how to create your own Portfolio Optimization Excel sheet. + + +(๐Ÿฆ‹) /portfolio/po/ $ ? + +โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Portfolio - Portfolio Optimization โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +โ”‚ โ”‚ +โ”‚ load load tickers and categories from .xlsx or .csv file โ”‚ +โ”‚ โ”‚ +โ”‚ Portfolio loaded: OpenBB Example Portfolio โ”‚ +โ”‚ โ”‚ +โ”‚ Tickers: AAPL, AMZN, APTV, ASML, BABA, GOOGL, HYG, IYR, NKE, PEX, PSP, REZ, TIP, TLT, TSM โ”‚ +โ”‚ Categories: ASSET_CLASS, SECTOR, INDUSTRY, COUNTRY, CURRENCY | + +``` + +``` +(๐Ÿฆ‹) /portfolio/po/ $ riskparity + Optimization can take time. Please be patient... - [3 Years] Risk parity portfolio based on risk budgeting approach +[3 Years] Risk parity portfolio based on risk budgeting approach using volatility as risk measure - - Weights + Weights โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ โ”ƒ Value โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ AAPL โ”‚ 3.27 % โ”‚ +โ”‚ AAPL โ”‚ 3.68 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ AMZN โ”‚ 3.81 % โ”‚ +โ”‚ AMZN โ”‚ 3.75 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ APTV โ”‚ 2.17 % โ”‚ +โ”‚ APTV โ”‚ 2.46 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ ASML โ”‚ 2.48 % โ”‚ +โ”‚ ASML โ”‚ 2.67 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ BABA โ”‚ 3.42 % โ”‚ +โ”‚ BABA โ”‚ 3.62 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ GOOGL โ”‚ 3.54 % โ”‚ +โ”‚ GOOGL โ”‚ 3.82 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ HYG โ”‚ 9.40 % โ”‚ +โ”‚ HYG โ”‚ 9.53 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ IYR โ”‚ 3.98 % โ”‚ +โ”‚ IYR โ”‚ 4.38 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ NKE โ”‚ 3.66 % โ”‚ +โ”‚ NKE โ”‚ 3.72 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ PEX โ”‚ 3.88 % โ”‚ +โ”‚ PEX โ”‚ 4.27 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ PSP โ”‚ 3.49 % โ”‚ +โ”‚ PSP โ”‚ 3.68 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ REZ โ”‚ 4.08 % โ”‚ +โ”‚ REZ โ”‚ 4.60 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ TIP โ”‚ 26.61 % โ”‚ +โ”‚ TIP โ”‚ 25.52 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ TLT โ”‚ 22.86 % โ”‚ +โ”‚ TLT โ”‚ 20.60 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ TSM โ”‚ 3.35 % โ”‚ +โ”‚ TSM โ”‚ 3.72 % โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -Annual (by 252) expected return: 10.03% -Annual (by โˆš252) volatility: 11.62% -Sharpe ratio: 0.8373 +Annual (by 252) expected return: 4.35% +Annual (by โˆš252) volatility: 14.59% +Sharpe ratio: 0.0317 ``` To understand how this portfolio differs from the original portfolio, the show command can be used. This also shows the allocations to each asset class, sector, industry and currency. Using the optimized portfolio, this generates the following results: ``` -2022 May 30, 05:47 (๐Ÿฆ‹) /portfolio/po/ $ show RP_0 +(๐Ÿฆ‹) /portfolio/po/ $ show RP_0 Portfolio - RP_0 - Category - Asset_Class + Category - Asset_Class โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ โ”ƒ Asset_Class โ”ƒ Current_Invested_Amount โ”ƒ Current_Weights โ”ƒ Value โ”ƒ โ”กโ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ USD โ”‚ FIXED INCOME โ”‚ 2,550,000 $ โ”‚ 30.03 % โ”‚ 58.87 % โ”‚ +โ”‚ USD โ”‚ FIXED INCOME โ”‚ 2,550,000 $ โ”‚ 30.03 % โ”‚ 55.65 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ PRIVATE EQUITY โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 7.37 % โ”‚ +โ”‚ USD โ”‚ PRIVATE EQUITY โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 7.95 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ PUBLIC EQUITY โ”‚ 4,242,000 $ โ”‚ 49.95 % โ”‚ 25.69 % โ”‚ +โ”‚ USD โ”‚ PUBLIC EQUITY โ”‚ 4,242,000 $ โ”‚ 49.95 % โ”‚ 27.42 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ REAL ESTATE โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 8.07 % โ”‚ +โ”‚ USD โ”‚ REAL ESTATE โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 8.98 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ USD โ”‚ TOTAL USD โ”‚ 8,492,000 $ โ”‚ 100.00 % โ”‚ 100.00 % โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - - - Category - Country -โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ -โ”ƒ โ”ƒ Country โ”ƒ Current_Invested_Amount โ”ƒ Current_Weights โ”ƒ Value โ”ƒ -โ”กโ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ USD โ”‚ CHINA โ”‚ 246,000 $ โ”‚ 2.90 % โ”‚ 3.42 % โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ NETHERLANDS โ”‚ 920,000 $ โ”‚ 10.83 % โ”‚ 2.48 % โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ TAIWAN โ”‚ 380,000 $ โ”‚ 4.47 % โ”‚ 3.35 % โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ UNITED STATES โ”‚ 6,946,000 $ โ”‚ 81.79 % โ”‚ 90.76 % โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ TOTAL USD โ”‚ 8,492,000 $ โ”‚ 100.00 % โ”‚ 100.00 % โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - - - - Category - Sector + Category - Sector โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ โ”ƒ Sector โ”ƒ Current_Invested_Amount โ”ƒ Current_Weights โ”ƒ Value โ”ƒ โ”กโ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ USD โ”‚ COMMUNICATION SERVICES โ”‚ 636,000 $ โ”‚ 7.49 % โ”‚ 3.54 % โ”‚ +โ”‚ USD โ”‚ COMMUNICATION SERVICES โ”‚ 636,000 $ โ”‚ 7.49 % โ”‚ 3.82 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ CONSUMER CYCLICAL โ”‚ 1,926,000 $ โ”‚ 22.68 % โ”‚ 13.06 % โ”‚ +โ”‚ USD โ”‚ CONSUMER CYCLICAL โ”‚ 751,000 $ โ”‚ 8.84 % โ”‚ 7.34 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ CORPORATE BOND โ”‚ 810,000 $ โ”‚ 9.54 % โ”‚ 9.40 % โ”‚ +โ”‚ USD โ”‚ CONSUMER DISCRETIONARY โ”‚ 1,175,000 $ โ”‚ 13.84 % โ”‚ 6.21 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ FINANCIAL โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 7.37 % โ”‚ +โ”‚ USD โ”‚ CORPORATE BOND โ”‚ 810,000 $ โ”‚ 9.54 % โ”‚ 9.53 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ GOVERNMENT BOND โ”‚ 1,740,000 $ โ”‚ 20.49 % โ”‚ 49.47 % โ”‚ +โ”‚ USD โ”‚ FINANCIALS โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 7.95 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ REAL ESTATE โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 8.07 % โ”‚ +โ”‚ USD โ”‚ GOVERNMENT BOND โ”‚ 1,740,000 $ โ”‚ 20.49 % โ”‚ 46.12 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ TECHNOLOGY โ”‚ 1,680,000 $ โ”‚ 19.78 % โ”‚ 9.09 % โ”‚ +โ”‚ USD โ”‚ INFORMATION TECHNOLOGY โ”‚ 1,680,000 $ โ”‚ 19.78 % โ”‚ 10.06 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ USD โ”‚ REAL ESTATE โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 8.98 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ USD โ”‚ TOTAL USD โ”‚ 8,492,000 $ โ”‚ 100.00 % โ”‚ 100.00 % โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - - - Category - Industry + Category - Industry โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ โ”ƒ Industry โ”ƒ Current_Invested_Amount โ”ƒ Current_Weights โ”ƒ Value โ”ƒ โ”กโ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ USD โ”‚ AUTO PARTS & EQUIPMENT โ”‚ 429,000 $ โ”‚ 5.05 % โ”‚ 2.17 % โ”‚ +โ”‚ USD โ”‚ AUTO PARTS & EQUIPMENT โ”‚ 429,000 $ โ”‚ 5.05 % โ”‚ 2.46 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ FINANCIAL SERVICES โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 7.37 % โ”‚ +โ”‚ USD โ”‚ FINANCIAL SERVICES โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 7.95 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ FOOTWEAR & ACCESSORIES โ”‚ 505,000 $ โ”‚ 5.95 % โ”‚ 3.66 % โ”‚ +โ”‚ USD โ”‚ FOOTWEAR & ACCESSORIES โ”‚ 505,000 $ โ”‚ 5.95 % โ”‚ 3.72 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ HIGH YIELD BOND โ”‚ 810,000 $ โ”‚ 9.54 % โ”‚ 9.40 % โ”‚ +โ”‚ USD โ”‚ HIGH YIELD BOND โ”‚ 810,000 $ โ”‚ 9.54 % โ”‚ 9.53 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ INFLATION-PROTECTED BOND โ”‚ 890,000 $ โ”‚ 10.48 % โ”‚ 26.61 % โ”‚ +โ”‚ USD โ”‚ INFLATION-PROTECTED BOND โ”‚ 890,000 $ โ”‚ 10.48 % โ”‚ 25.52 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ INTERACTIVE MEDIA & SERVICES โ”‚ 636,000 $ โ”‚ 7.49 % โ”‚ 3.54 % โ”‚ +โ”‚ USD โ”‚ INTERACTIVE MEDIA & SERVICES โ”‚ 636,000 $ โ”‚ 7.49 % โ”‚ 3.82 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ INTERNET & DIRECT MARKETING RETAIL โ”‚ 992,000 $ โ”‚ 11.68 % โ”‚ 7.23 % โ”‚ +โ”‚ USD โ”‚ INTERNET & DIRECT MARKETING RETAIL โ”‚ 992,000 $ โ”‚ 11.68 % โ”‚ 7.37 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ LONG GOVERNMENT โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 22.86 % โ”‚ +โ”‚ USD โ”‚ LONG GOVERNMENT โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 20.60 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ RESIDENTIAL โ”‚ 280,000 $ โ”‚ 3.30 % โ”‚ 4.08 % โ”‚ +โ”‚ USD โ”‚ RESIDENTIAL โ”‚ 280,000 $ โ”‚ 3.30 % โ”‚ 4.60 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ SEMICONDUCTORS โ”‚ 1,300,000 $ โ”‚ 15.31 % โ”‚ 5.82 % โ”‚ +โ”‚ USD โ”‚ SEMICONDUCTORS โ”‚ 1,300,000 $ โ”‚ 15.31 % โ”‚ 6.39 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ TECHNOLOGY HARDWARE, STORAGE & PERIPHERALS โ”‚ 380,000 $ โ”‚ 4.47 % โ”‚ 3.27 % โ”‚ +โ”‚ USD โ”‚ TECHNOLOGY HARDWARE, STORAGE & PERIPHERALS โ”‚ 380,000 $ โ”‚ 4.47 % โ”‚ 3.68 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ TOTAL MARKET โ”‚ 570,000 $ โ”‚ 6.71 % โ”‚ 3.98 % โ”‚ +โ”‚ USD โ”‚ TOTAL MARKET โ”‚ 570,000 $ โ”‚ 6.71 % โ”‚ 4.38 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ USD โ”‚ TOTAL USD โ”‚ 8,492,000 $ โ”‚ 100.00 % โ”‚ 100.00 % โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + + Category - Country +โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ +โ”ƒ โ”ƒ Country โ”ƒ Current_Invested_Amount โ”ƒ Current_Weights โ”ƒ Value โ”ƒ +โ”กโ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ +โ”‚ USD โ”‚ ASIA โ”‚ 626,000 $ โ”‚ 7.37 % โ”‚ 7.34 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ USD โ”‚ EUROPE โ”‚ 1,425,000 $ โ”‚ 16.78 % โ”‚ 6.39 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ USD โ”‚ UNITED STATES โ”‚ 6,441,000 $ โ”‚ 75.85 % โ”‚ 86.28 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ USD โ”‚ TOTAL USD โ”‚ 8,492,000 $ โ”‚ 100.00 % โ”‚ 100.00 % โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` -It is possible to use the commands without loading in the parameters template or by using the parameters template but changing some arguments directly into the terminal. For example, using the same method as described above, the risk measure is changed to Conditional Value at Risk (CVaR) and the used historic period is increased to 10 years (keeping all other parameters unchanged): +It is possible to use the commands without loading in the parameters template or by using the parameters template but changing some arguments directly into the terminal. For example, using the same method as described above, the risk measure is changed to Conditional Value at Risk (CVaR) and the used historic period is increased to 5 years (keeping all other parameters unchanged): ``` -2022 May 30, 05:47 (๐Ÿฆ‹) /portfolio/po/ $ riskparity -rm CVaR -p 10y +(๐Ÿฆ‹) /portfolio/po/ $ riskparity -rm CVaR -p 5y + Optimization can take time. Please be patient... - [10 Years] Risk parity portfolio based on risk budgeting approach +[5 Years] Risk parity portfolio based on risk budgeting approach using conditional value at risk (CVaR) as risk measure - - Weights + Weights โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ โ”ƒ Value โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ AAPL โ”‚ 3.78 % โ”‚ +โ”‚ AAPL โ”‚ 3.73 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ AMZN โ”‚ 3.55 % โ”‚ +โ”‚ AMZN โ”‚ 3.27 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ APTV โ”‚ 3.06 % โ”‚ +โ”‚ APTV โ”‚ 2.68 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ ASML โ”‚ 3.11 % โ”‚ +โ”‚ ASML โ”‚ 2.75 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ GOOGL โ”‚ 3.80 % โ”‚ +โ”‚ BABA โ”‚ 4.10 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ HYG โ”‚ 11.68 % โ”‚ +โ”‚ GOOGL โ”‚ 3.59 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ IYR โ”‚ 4.68 % โ”‚ +โ”‚ HYG โ”‚ 9.43 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ NKE โ”‚ 4.31 % โ”‚ +โ”‚ IYR โ”‚ 4.36 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ PSP โ”‚ 4.54 % โ”‚ +โ”‚ NKE โ”‚ 3.42 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ REZ โ”‚ 4.91 % โ”‚ +โ”‚ PEX โ”‚ 4.16 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ TIP โ”‚ 29.23 % โ”‚ +โ”‚ PSP โ”‚ 3.60 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ TLT โ”‚ 19.69 % โ”‚ +โ”‚ REZ โ”‚ 4.58 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ TSM โ”‚ 3.66 % โ”‚ +โ”‚ TIP โ”‚ 26.33 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ TLT โ”‚ 20.29 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ TSM โ”‚ 3.70 % โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -Annual (by 252) expected return: 9.70% -Annual (by โˆš252) volatility: 8.34% -Sharpe ratio: 1.1275 -Annual (by โˆš252) conditional value at risk (CVaR) : 19.84% -Return / conditional value at risk (CVaR) ratio: 0.4738 +Annual (by 252) expected return: 6.99% +Annual (by โˆš252) volatility: 12.21% +Sharpe ratio: 0.2538 +Annual (by โˆš252) conditional value at risk (CVaR) : 28.63% +Return / conditional value at risk (CVaR) ratio: 0.1083 ``` ## Examples -To demonstrate the capabilities of the Portfolio Optimization menu, the entire S&P 500 index (as of 30th of May 2022) is used and optimized and analysed in a variety of ways. Starting by loading in the dataset, which is visible when you type `load` as it resides in the same directory as the earlier mentioned template: +The example portfolio is again loaded in: - +``` +(๐Ÿฆ‹) /portfolio/po/ $ load --example + +Loading an example, please type `about` to learn how to create your own Portfolio Optimization Excel sheet. + + +(๐Ÿฆ‹) /portfolio/po/ $ ? + +โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Portfolio - Portfolio Optimization โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +โ”‚ โ”‚ +โ”‚ load load tickers and categories from .xlsx or .csv file โ”‚ +โ”‚ โ”‚ +โ”‚ Portfolio loaded: OpenBB Example Portfolio โ”‚ +โ”‚ โ”‚ +โ”‚ Tickers: AAPL, AMZN, APTV, ASML, BABA, GOOGL, HYG, IYR, NKE, PEX, PSP, REZ, TIP, TLT, TSM โ”‚ +โ”‚ Categories: ASSET_CLASS, SECTOR, INDUSTRY, COUNTRY, CURRENCY | + +``` It is possible to load the parameters template here but this is not necessary as each parameter has a default value set regardless. However, because the Excel file provides a more structured way of presenting the choices, the template is loaded in: ``` -2022 May 30, 06:15 (๐Ÿฆ‹) /portfolio/po/ $ file OpenBB_Parameters_Template_v1.0.0.xlsx +(๐Ÿฆ‹) /portfolio/po/ $ file --file parameters_template.xlsx Parameters: historic_period : 3y log_returns : 0 @@ -294,98 +341,112 @@ Parameters: short_allocation : 0 ``` -Then, the Hierarchical Risk Parity technique is applied by running the hrp command. This results in the following (the result is edited, as it would show 500 tickers, to prevent flooding this page): +Then, the Hierarchical Risk Parity technique is applied by running the hrp command. This results in the following: ``` -2022 May 30, 06:22 (๐Ÿฆ‹) /portfolio/po/ $ hrp +(๐Ÿฆ‹) /portfolio/po/ $ hrp + Optimization can take time. Please be patient... - [3 Years] Hierarchical risk parity portfolio using pearson codependence, +[3 Years] Hierarchical risk parity portfolio using pearson codependence, single linkage and volatility as risk measure - - Weights + Weights โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ โ”ƒ Value โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ A โ”‚ 0.23 % โ”‚ +โ”‚ AAPL โ”‚ 1.47 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ AAL โ”‚ 0.04 % โ”‚ +โ”‚ AMZN โ”‚ 2.54 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ AAP โ”‚ 0.21 % โ”‚ +โ”‚ APTV โ”‚ 0.44 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ AAPL โ”‚ 0.15 % โ”‚ +โ”‚ ASML โ”‚ 0.93 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ ABBV โ”‚ 0.41 % โ”‚ +โ”‚ BABA โ”‚ 0.64 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ ABC โ”‚ 0.18 % โ”‚ +โ”‚ GOOGL โ”‚ 1.68 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค - +โ”‚ HYG โ”‚ 10.46 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ IYR โ”‚ 1.28 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ NKE โ”‚ 1.33 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ PEX โ”‚ 1.31 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ PSP โ”‚ 1.75 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ REZ โ”‚ 1.39 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ TIP โ”‚ 62.12 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ TLT โ”‚ 11.40 % โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ TSM โ”‚ 1.26 % โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -Annual (by 252) expected return: 19.65% -Annual (by โˆš252) volatility: 21.64% -Sharpe ratio: 0.8943 +Annual (by 252) expected return: 2.48% +Annual (by โˆš252) volatility: 9.13% +Sharpe ratio: -0.1546 ``` This optimization process is then compared with the current holdings. To keep things manageable, only the sector allocations are compared between the unoptimized and optimized portfolio which is done with the show command: ``` -2022 May 31, 03:31 (๐Ÿฆ‹) /portfolio/po/ $ show HRP_0 -ct SECTOR +(๐Ÿฆ‹) /portfolio/po/ $ show _HRP0 -ct SECTOR - Category - Sector +Current Portfolios: _HRP0 + +Current Categories: INDUSTRY, CURRENT_INVESTED_AMOUNT, ASSET_CLASS, COUNTRY, CURRENCY, SECTOR + +Portfolio: _HRP0 + + Category - Sector โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ โ”ƒ Sector โ”ƒ Current_Invested_Amount โ”ƒ Current_Weights โ”ƒ Value โ”ƒ โ”กโ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ -โ”‚ USD โ”‚ COMMUNICATION SERVICES โ”‚ 14,934,743 $ โ”‚ 5.89 % โ”‚ 6.07 % โ”‚ +โ”‚ USD โ”‚ COMMUNICATION SERVICES โ”‚ 636,000 $ โ”‚ 7.49 % โ”‚ 1.68 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ CONSUMER DISCRETIONARY โ”‚ 31,210,119 $ โ”‚ 12.31 % โ”‚ 9.58 % โ”‚ +โ”‚ USD โ”‚ CONSUMER CYCLICAL โ”‚ 751,000 $ โ”‚ 8.84 % โ”‚ 1.97 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ CONSUMER STAPLES โ”‚ 15,957,911 $ โ”‚ 6.29 % โ”‚ 11.93 % โ”‚ +โ”‚ USD โ”‚ CONSUMER DISCRETIONARY โ”‚ 1,175,000 $ โ”‚ 13.84 % โ”‚ 2.98 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ ENERGY โ”‚ 9,582,634 $ โ”‚ 3.78 % โ”‚ 1.97 % โ”‚ +โ”‚ USD โ”‚ CORPORATE BOND โ”‚ 810,000 $ โ”‚ 9.54 % โ”‚ 10.46 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ FINANCIALS โ”‚ 30,165,029 $ โ”‚ 11.89 % โ”‚ 8.93 % โ”‚ +โ”‚ USD โ”‚ FINANCIALS โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 3.06 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ HEALTH CARE โ”‚ 31,802,164 $ โ”‚ 12.54 % โ”‚ 17.35 % โ”‚ +โ”‚ USD โ”‚ GOVERNMENT BOND โ”‚ 1,740,000 $ โ”‚ 20.49 % โ”‚ 73.52 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ INDUSTRIALS โ”‚ 38,183,932 $ โ”‚ 15.06 % โ”‚ 14.04 % โ”‚ +โ”‚ USD โ”‚ INFORMATION TECHNOLOGY โ”‚ 1,680,000 $ โ”‚ 19.78 % โ”‚ 3.66 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ INFORMATION TECHNOLOGY โ”‚ 37,669,554 $ โ”‚ 14.85 % โ”‚ 12.95 % โ”‚ +โ”‚ USD โ”‚ REAL ESTATE โ”‚ 850,000 $ โ”‚ 10.01 % โ”‚ 2.67 % โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ MATERIALS โ”‚ 14,155,430 $ โ”‚ 5.58 % โ”‚ 5.49 % โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ REAL ESTATE โ”‚ 17,137,343 $ โ”‚ 6.76 % โ”‚ 4.82 % โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ UTILITIES โ”‚ 12,808,749 $ โ”‚ 5.05 % โ”‚ 6.87 % โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ USD โ”‚ TOTAL USD โ”‚ 253,607,608 $ โ”‚ 100.00 % โ”‚ 100.00 % โ”‚ +โ”‚ USD โ”‚ TOTAL USD โ”‚ 8,492,000 $ โ”‚ 100.00 % โ”‚ 100.00 % โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` This table shows how the portfolio changed and how much is allocated to each sector. It is possible to delve further into these findings with the plot command. This gives the ability to visually depict allocations, e.g. below the sector allocation is visually depicted. ``` -2022 May 31, 03:39 (๐Ÿฆ‹) /portfolio/po/ $ plot HRP_0 -ct SECTOR -pi +(๐Ÿฆ‹) /portfolio/po/ $ plot --portfolios _HRP0 -ct SECTOR -pi ``` -Sectors Pie Chart +![Sectors Pie Chart](https://user-images.githubusercontent.com/46355364/213746043-58cd5d69-6e62-4ebd-b12c-724be62458ac.png) Further analysis can be done by looking at the portfolio's returns histogram which also includes a variety of risk measures as well as the portfolio's drawdowns. ```` -2022 May 31, 03:39 (๐Ÿฆ‹) /portfolio/po/ $ plot HRP_0 -ct SECTOR -hi -dd +(๐Ÿฆ‹) /portfolio/po/ $ plot --portfolios _HRP0 -ct SECTOR -hi -dd ```` -Portfokio Returns Histogram -Portfolio Drawdowns +![Portfolio Returns Histogram](https://user-images.githubusercontent.com/46355364/213745938-f6f97e06-287c-4c0d-a4f1-bc23828b346e.png) +![Portfolio Drawdowns](https://user-images.githubusercontent.com/46355364/213746000-5f7f6bc0-9f5c-4be3-a217-12551c79bcee.png) Next to that, to delve deeper in the underlying conclusions the HRP method has drawn. Here, a closer look can be given to the assets cluster map, which links certain categories to each other. The linkage process is done per asset basis but here it is grouped per sector. Based on these results, the user can identify whether the optimization techniques also logically makes sense. ```` - -2022 May 31, 03:45 (๐Ÿฆ‹) /portfolio/po/ $ plot HRP_0 -ct SECTOR -rc -he - +(๐Ÿฆ‹) /portfolio/po/ $ plot --portfolios _HRP0 -ct SECTOR -rc -he ```` - -Heatmap with Linkage Method -Risk Contributions +![Heatmap with Linkage Method](https://user-images.githubusercontent.com/46355364/213745877-8d0ab932-7775-4c9b-be60-da614c338b8d.png) +![Risk Contributions](https://user-images.githubusercontent.com/46355364/213745808-d4dede01-a16c-4b3f-83a7-f8b2096896e3.png) diff --git a/website/content/terminal/guides/intros/stocks/comparison.md b/website/content/terminal/guides/intros/stocks/comparison.md index 00c0ada4248..98a3bbc3c21 100644 --- a/website/content/terminal/guides/intros/stocks/comparison.md +++ b/website/content/terminal/guides/intros/stocks/comparison.md @@ -295,6 +295,4 @@ Other available yearly timeframes are: 2017, 2018, 2019, 2020, 2021 โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Diluted Shares Outstanding โ”‚ 444.2M โ”‚ 8.56B โ”‚ 2.05B โ”‚ 1.35B โ”‚ 3.03B โ”‚ 355.8M โ”‚ 426M โ”‚ 4.1B โ”‚ 1.82B โ”‚ 1.49B โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ -```` - -To run a demonstration of the commands presented here, in the OpenBB Terminal, run this command from the home menu: `exe routines/comparison_demo.openbb` \ No newline at end of file +```` \ No newline at end of file diff --git a/website/content/terminal/guides/intros/stocks/gov.md b/website/content/terminal/guides/intros/stocks/gov.md index 000bbc8dec6..e84f1b45e44 100644 --- a/website/content/terminal/guides/intros/stocks/gov.md +++ b/website/content/terminal/guides/intros/stocks/gov.md @@ -238,5 +238,3 @@ The consistency of quarterly contract awards over time is reflected in a chart r The ten most purchased and sold stocks amongst Senate Representatives, `topsells senate` & `topbuys senate`: ![Senate's Most Bought and Sold Stocks](https://user-images.githubusercontent.com/85772166/173206214-964bfe40-a72c-4833-8cc1-a803bba97c6e.png) - -To play a demonstration in the OpenBB Terminal of the features presented in this guide, execute the routine file, `gov_demo.openbb`, from the home menu. diff --git a/website/content/terminal/guides/intros/stocks/ins.md b/website/content/terminal/guides/intros/stocks/ins.md index c14053bad04..d96f63adc99 100644 --- a/website/content/terminal/guides/intros/stocks/ins.md +++ b/website/content/terminal/guides/intros/stocks/ins.md @@ -335,5 +335,3 @@ The latest purchases from insiders of penny stock companies is displayed with `l D: Derivative transaction in filing (usually option exercise) M: Multiple transactions in filing; earliest reported transaction date & weighted average transaction price ``` - -Run `exe insider_demo.openbb`, from the Main Menu, to play a demonstration of the features in the OpenBB Terminal. diff --git a/website/content/terminal/guides/intros/stocks/screener.md b/website/content/terminal/guides/intros/stocks/screener.md index e3c4ac068cb..022a848bafe 100644 --- a/website/content/terminal/guides/intros/stocks/screener.md +++ b/website/content/terminal/guides/intros/stocks/screener.md @@ -9,7 +9,19 @@ The Stock sScreener menu is a diverse tool for stock discovery. There are catego ### How to use -The default preset is `top_gainers.ini`. Use the commands `view` and `set` to select a new one. The file in the presets folder, `template.ini`, is a blank slate for creating something fresh. Modify individual parameters within the different presets to get more precision from a starting point. To get started, simply choose one of the categories to scour, like `technical`. +The default preset is `top_gainers.ini`. Use the commands `view` and `set` to select a new one. Modify individual parameters within the different presets to get more precision from a starting point. + +:::note To create your own preset please use the following steps: + +1. Download the default preset as found [here](https://www.dropbox.com/s/xqdo5m87j1krh0h/stocks_screener_template.ini?dl=0). +2. Place the `stocks_screener_template.ini` in the [OpenBBUserData](https://docs.openbb.co/terminal/guides/advanced/data) folder under `presets/stocks/screener`. +3. Rename that file to something you find meaningful, e.g. `my_own_filter.ini`. +4. Open the file you just renamed (e.g. `my_own_filter.ini`), and set the parameters you want to filter. +5. It may be useful to play with the main source ([Finviz](https://finviz.com/screener.ashx)) since you can tweak these and understand how they influence the outcome of the filtered stocks. +6. Start the terminal, and go to the `stocks/scr` menu. In there, you load in your template with `set`. +::: + +To get started, simply choose one of the categories, like `technical`. ``` (๐Ÿฆ‹) /stocks/scr/ $ technical @@ -48,8 +60,6 @@ To see a description of each preset, use `view`, and autocomplete will allow the Autocomplete with the set function -Unexpected results can be obtained through combining presets with the category of screen. - ### Examples Using the `modified_dreman.ini` preset and the `financial` category, then sorting for return-on-investment. diff --git a/website/old_content/terminal/stocks/scr/_index.md b/website/old_content/terminal/stocks/scr/_index.md index 79a2a1af31a..24e16653df9 100644 --- a/website/old_content/terminal/stocks/scr/_index.md +++ b/website/old_content/terminal/stocks/scr/_index.md @@ -42,8 +42,4 @@ Setting the preset to `short_squeeze_scan` and scanning with the `ownership` cat `set triangle_ascending`, show `techincal` & `overview` -![triangle_ascending preset with technical and overview categories](https://user-images.githubusercontent.com/85772166/173903827-15d6852e-90bf-4ea3-b008-47ce3c482380.png) - -Enter `exe stock_screener_demo.openbb` from the main menu to play a demonstration of the Stock Screener in the Terminal. - -Back to the Introduction Guide to the Stocks Menu +![triangle_ascending preset with technical and overview categories](https://user-images.githubusercontent.com/85772166/173903827-15d6852e-90bf-4ea3-b008-47ce3c482380.png) \ No newline at end of file