Skip to content

Instantly share code, notes, and snippets.

@aarongilman
Last active January 28, 2019 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aarongilman/8c78ac91ad89ed9475406755664bee18 to your computer and use it in GitHub Desktop.
Save aarongilman/8c78ac91ad89ed9475406755664bee18 to your computer and use it in GitHub Desktop.
Capital Market Assumptions Optimizer without interactive.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Capital Market Assumptions Optimizer without interactive.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true,
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/aarongilman/8c78ac91ad89ed9475406755664bee18/capital-market-assumptions-optimizer.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"metadata": {
"id": "lG85PS_s-roE",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# IFP Asset Management Assumptions from the JPMorgan Capital Market Assumptions\n",
"\n",
"by Aaron Gilman, CFA and Pete Nunley, CFA\n",
"\n",
"JPMorgan releases capital market assumptions annually and are always transparent and consistent in terms of sharing how they arrive at each number and the robust process followed year after year. In the past, we typically use these numbers as one input into our strategic asset allocation process and it takes some massaging to transform into something investable/palatable for the average retail client. This year, we decided to take the capital market assumptions and experiment with portfolio optimizations at different levels of required returns to help set expectations going forward for what may be a suppressed return environment for risky assets. You can find the full version of their capital market assumptions with their own conclusions here: [2019 Long-Term Capital Market Assumptions (LTCMA)](https://am.jpmorgan.com/gb/en/asset-management/gim/adv/insights/ltcma-2019)\n",
"\n",
"I got inspiration for this from the guys at Newfound Research LLC. They have a cool web page that illustrates what they call \"The Weird Portfolio\", and it is an unconstrained portfolio optimization using similar asset classes to JPMorgan's Capital Market Assumptions that shows how weird a 60/40 portfolio looks in todays environment. You can check it out [here](https://www.theweirdportfolio.com)\n",
"\n",
"We are constraining our optimizations below, with a maximum of 20% in an asset class and long-only (no shorting/negative allocations).\n",
"\n",
"Full disclosure, this is by no means an attempt to predict which portfolio allocation is best over the next decade, it is simply a thought experiment to understand the implications published by a very well respected source in our industry and what it could mean for investors and portfolios. Our team uses this as a way to understand one possible path for the future and we realize it may or may not be realized.\n",
"\n",
"The spreadsheet we use for the optimization below can also be found [here](https://www.dropbox.com/s/5ipl1s0e0jmi40e/capital%20market%20assumptions.xlsx?dl=1) if you want to use it for your own research."
]
},
{
"metadata": {
"id": "k9v3ROYFaUQV",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Install required packages for analysis"
]
},
{
"metadata": {
"id": "HYXuYLsb-oMz",
"colab_type": "code",
"outputId": "7522cddb-e4cf-4645-ecb1-1790d49703e1",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
}
},
"cell_type": "code",
"source": [
"!pip install PyPortfolioOpt xlrd"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting PyPortfolioOpt\n",
" Downloading https://files.pythonhosted.org/packages/12/d4/6d616ceb238c16d863d84cb24a45d76914242a21d09b32bd9ce785f06b78/PyPortfolioOpt-0.2.0-py3-none-any.whl\n",
"Requirement already satisfied: xlrd in /usr/local/lib/python3.6/dist-packages (1.1.0)\n",
"Collecting noisyopt (from PyPortfolioOpt)\n",
" Downloading https://files.pythonhosted.org/packages/ed/e1/9fef3bf87c80ddb5e88df2654c8351bef9d027f3f4d485ad3c31b4f7ed50/noisyopt-0.2.2-py2.py3-none-any.whl\n",
"Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from PyPortfolioOpt) (1.1.0)\n",
"Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from PyPortfolioOpt) (0.22.0)\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from PyPortfolioOpt) (1.14.6)\n",
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.6/dist-packages (from PyPortfolioOpt) (0.20.2)\n",
"Requirement already satisfied: pytz>=2011k in /usr/local/lib/python3.6/dist-packages (from pandas->PyPortfolioOpt) (2018.9)\n",
"Requirement already satisfied: python-dateutil>=2 in /usr/local/lib/python3.6/dist-packages (from pandas->PyPortfolioOpt) (2.5.3)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2->pandas->PyPortfolioOpt) (1.11.0)\n",
"Installing collected packages: noisyopt, PyPortfolioOpt\n",
"Successfully installed PyPortfolioOpt-0.2.0 noisyopt-0.2.2\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "eznbjEM3aZ7N",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Import modules needed for code to execute"
]
},
{
"metadata": {
"id": "2cWM9rsAnok-",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"import pandas as pd\n",
"from pypfopt.efficient_frontier import EfficientFrontier\n",
"from pypfopt import risk_models\n",
"from pypfopt import expected_returns"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "jhT41YQcahOu",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Here we import the capital market assumptions spreadsheet to leverage for expected returns and covariances."
]
},
{
"metadata": {
"id": "lWqdWlK6ntym",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"expected_return = pd.read_excel('https://www.dropbox.com/s/5ipl1s0e0jmi40e/capital%20market%20assumptions.xlsx?dl=1', index_col=0)\n",
"expected_cov = pd.read_excel('https://www.dropbox.com/s/5ipl1s0e0jmi40e/capital%20market%20assumptions.xlsx?dl=1', sheet_name='covariance', index_col=0)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "ViLD8UNnvcFV",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Let's take a look at some of the data first. Let's start by looking at the top 10 asset classes with the highest expected return."
]
},
{
"metadata": {
"id": "abFShaPYvbB9",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 377
},
"outputId": "0cafb01f-dbf0-4550-960f-4ac446b69cd1"
},
"cell_type": "code",
"source": [
"expected_return.sort_values(by='arithmetic_return', ascending=False).head(10)"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>compound_return</th>\n",
" <th>arithmetic_return</th>\n",
" <th>volatility</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Asset Class</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Emerging Markets Equity</th>\n",
" <td>0.0850</td>\n",
" <td>0.1043</td>\n",
" <td>0.2125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>AC Asia ex-Japan Equity</th>\n",
" <td>0.0850</td>\n",
" <td>0.1035</td>\n",
" <td>0.2075</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Private Equity</th>\n",
" <td>0.0825</td>\n",
" <td>0.1020</td>\n",
" <td>0.2100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Value-Added Real Estate*</th>\n",
" <td>0.0775</td>\n",
" <td>0.0953</td>\n",
" <td>0.2000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Euro Area Large Cap</th>\n",
" <td>0.0700</td>\n",
" <td>0.0903</td>\n",
" <td>0.2150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hong Kong Equity</th>\n",
" <td>0.0675</td>\n",
" <td>0.0850</td>\n",
" <td>0.2000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>EAFE Equity</th>\n",
" <td>0.0675</td>\n",
" <td>0.0794</td>\n",
" <td>0.1675</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UK Large Cap</th>\n",
" <td>0.0650</td>\n",
" <td>0.0779</td>\n",
" <td>0.1675</td>\n",
" </tr>\n",
" <tr>\n",
" <th>European ex-UK Core Real Estate*</th>\n",
" <td>0.0650</td>\n",
" <td>0.0774</td>\n",
" <td>0.1650</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Japanese Equity</th>\n",
" <td>0.0675</td>\n",
" <td>0.0768</td>\n",
" <td>0.1450</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" compound_return arithmetic_return \\\n",
"Asset Class \n",
"Emerging Markets Equity 0.0850 0.1043 \n",
"AC Asia ex-Japan Equity 0.0850 0.1035 \n",
"Private Equity 0.0825 0.1020 \n",
"U.S. Value-Added Real Estate* 0.0775 0.0953 \n",
"Euro Area Large Cap 0.0700 0.0903 \n",
"Hong Kong Equity 0.0675 0.0850 \n",
"EAFE Equity 0.0675 0.0794 \n",
"UK Large Cap 0.0650 0.0779 \n",
"European ex-UK Core Real Estate* 0.0650 0.0774 \n",
"Japanese Equity 0.0675 0.0768 \n",
"\n",
" volatility \n",
"Asset Class \n",
"Emerging Markets Equity 0.2125 \n",
"AC Asia ex-Japan Equity 0.2075 \n",
"Private Equity 0.2100 \n",
"U.S. Value-Added Real Estate* 0.2000 \n",
"Euro Area Large Cap 0.2150 \n",
"Hong Kong Equity 0.2000 \n",
"EAFE Equity 0.1675 \n",
"UK Large Cap 0.1675 \n",
"European ex-UK Core Real Estate* 0.1650 \n",
"Japanese Equity 0.1450 "
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"metadata": {
"id": "qr0I8bo0wU3R",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"If you are an investor looking for returns above 7%, the JP Morgan Capital Market Assumptions suggest that these are the only asset classes that will get you there over the next decade. Does this look like a portfolio that any retail investors would be comfortable with? In my experience, it does not."
]
},
{
"metadata": {
"id": "f9qZnw5pv5aC",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Now, let's add a column for the sharpe ratio and look at the top 10 asset classes with the highest sharpe ratios."
]
},
{
"metadata": {
"id": "bkZz36qFvbEb",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"expected_return['sharpe_ratio'] = (expected_return['arithmetic_return'] - .02) / expected_return['volatility']"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "XQSJ11tJvbG2",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 377
},
"outputId": "abf3dfd5-248c-4042-c1f9-08c60e0531f5"
},
"cell_type": "code",
"source": [
"expected_return.sort_values(by='sharpe_ratio', ascending=False).head(10)"
],
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>compound_return</th>\n",
" <th>arithmetic_return</th>\n",
" <th>volatility</th>\n",
" <th>sharpe_ratio</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Asset Class</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>U.S. Short Duration Government/Credit</th>\n",
" <td>0.0325</td>\n",
" <td>0.0327</td>\n",
" <td>0.0200</td>\n",
" <td>0.635000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Aggregate Bonds</th>\n",
" <td>0.0400</td>\n",
" <td>0.0406</td>\n",
" <td>0.0350</td>\n",
" <td>0.588571</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Emerging Markets Corporate Bonds</th>\n",
" <td>0.0600</td>\n",
" <td>0.0632</td>\n",
" <td>0.0825</td>\n",
" <td>0.523636</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Emerging Markets Sovereign Debt</th>\n",
" <td>0.0625</td>\n",
" <td>0.0667</td>\n",
" <td>0.0950</td>\n",
" <td>0.491579</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Global Credit Sensitive Convertible</th>\n",
" <td>0.0475</td>\n",
" <td>0.0494</td>\n",
" <td>0.0625</td>\n",
" <td>0.470400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. High Yield Bonds</th>\n",
" <td>0.0550</td>\n",
" <td>0.0582</td>\n",
" <td>0.0825</td>\n",
" <td>0.463030</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Global Infrastructure Debt</th>\n",
" <td>0.0475</td>\n",
" <td>0.0495</td>\n",
" <td>0.0650</td>\n",
" <td>0.453846</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Inv Grade Corporate Bonds</th>\n",
" <td>0.0450</td>\n",
" <td>0.0467</td>\n",
" <td>0.0600</td>\n",
" <td>0.445000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Emerging Markets Local Currency Debt</th>\n",
" <td>0.0675</td>\n",
" <td>0.0744</td>\n",
" <td>0.1225</td>\n",
" <td>0.444082</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Leveraged Loans</th>\n",
" <td>0.0500</td>\n",
" <td>0.0527</td>\n",
" <td>0.0750</td>\n",
" <td>0.436000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" compound_return arithmetic_return \\\n",
"Asset Class \n",
"U.S. Short Duration Government/Credit 0.0325 0.0327 \n",
"U.S. Aggregate Bonds 0.0400 0.0406 \n",
"Emerging Markets Corporate Bonds 0.0600 0.0632 \n",
"Emerging Markets Sovereign Debt 0.0625 0.0667 \n",
"Global Credit Sensitive Convertible 0.0475 0.0494 \n",
"U.S. High Yield Bonds 0.0550 0.0582 \n",
"Global Infrastructure Debt 0.0475 0.0495 \n",
"U.S. Inv Grade Corporate Bonds 0.0450 0.0467 \n",
"Emerging Markets Local Currency Debt 0.0675 0.0744 \n",
"U.S. Leveraged Loans 0.0500 0.0527 \n",
"\n",
" volatility sharpe_ratio \n",
"Asset Class \n",
"U.S. Short Duration Government/Credit 0.0200 0.635000 \n",
"U.S. Aggregate Bonds 0.0350 0.588571 \n",
"Emerging Markets Corporate Bonds 0.0825 0.523636 \n",
"Emerging Markets Sovereign Debt 0.0950 0.491579 \n",
"Global Credit Sensitive Convertible 0.0625 0.470400 \n",
"U.S. High Yield Bonds 0.0825 0.463030 \n",
"Global Infrastructure Debt 0.0650 0.453846 \n",
"U.S. Inv Grade Corporate Bonds 0.0600 0.445000 \n",
"Emerging Markets Local Currency Debt 0.1225 0.444082 \n",
"U.S. Leveraged Loans 0.0750 0.436000 "
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"metadata": {
"id": "VLf6xuV1w8aQ",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"It is extremely interesting to see that the top ten asset classes with the best forecasted sharpe ratios are all technically fixed income investments. I find this particularly worth noting during a period with most investors have written off fixed income as an efficient investment for the next decade."
]
},
{
"metadata": {
"id": "noUUok9yxahN",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"If you created a portfolio of these asset classes and equal weighted them, your average nominal return is forecasted to be 5.34%. If inflation averages 3% over the next decade, these efficient asset classes would return an investor a little over 2.3%."
]
},
{
"metadata": {
"id": "4879tDXLxUO-",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "f57b49f9-9d32-42ea-d72d-79088445bb24"
},
"cell_type": "code",
"source": [
"expected_return.sort_values(by='sharpe_ratio', ascending=False).head(10)['arithmetic_return'].mean()"
],
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.05341"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"metadata": {
"id": "DO5K4HR6n0J1",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"mu = expected_return['arithmetic_return']\n",
"S = expected_cov"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "5vKKSgimarqt",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Next, we initiate the efficient frontier class from the pypfopt package, using the imported expected returns, covariances, and defined min and max weight thresholds for each asset class for the purposes of the optimizations that follow."
]
},
{
"metadata": {
"id": "8YN09TG4ohX9",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"ef = EfficientFrontier(mu, S, weight_bounds=(0, 0.2))"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "c1HuXARea63m",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"We created two dataframes that will be used to store all the optimization results so we can examine them at the end of this analysis."
]
},
{
"metadata": {
"id": "mTNV1qcJ8E-P",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"all_results_df = pd.DataFrame(index=expected_return.index, columns=['max_sharpe', 'min_vol'])\n",
"all_stats_df = pd.DataFrame(index=['Expected annual return', 'Annual volatility', 'Sharpe Ratio'], columns=['max_sharpe', 'min_vol'])"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "lr9Vt-mSG-zL",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Maximum Sharpe Ratio\n",
"\n",
"This optimization finds the most efficient portfolio, in terms of return per unit of risk. "
]
},
{
"metadata": {
"id": "QuaoZJZjpgjZ",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"ef.max_sharpe()\n",
"weights = ef.clean_weights()\n",
"performance = ef.portfolio_performance()\n",
"all_stats_df.loc['Expected annual return','max_sharpe'] = performance[0]\n",
"all_stats_df.loc['Annual volatility','max_sharpe'] = performance[1]\n",
"all_stats_df.loc['Sharpe Ratio','max_sharpe'] = performance[2]\n",
"all_results_df['max_sharpe'] = pd.DataFrame.from_dict(weights, orient='index')"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "lH8ZsGxpGoUl",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Minimum Volatility\n",
"\n",
"The optimization below finds the portfolio that has the lowest volatilty on the efficient frontier. This can be used as a gauge for what a portfolio allocation could look like for the extremely risk averse investor, but is not one we typically use for asset allocations in practice."
]
},
{
"metadata": {
"id": "HIkeLad5BqiD",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"ef.min_volatility()\n",
"weights = ef.clean_weights()\n",
"all_results_df['min_vol'] = pd.DataFrame.from_dict(weights, orient='index')\n",
"performance = ef.portfolio_performance()\n",
"all_stats_df.loc['Expected annual return','min_vol'] = performance[0]\n",
"all_stats_df.loc['Annual volatility','min_vol'] = performance[1]\n",
"all_stats_df.loc['Sharpe Ratio','min_vol'] = performance[2]"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "KNda5qS9B0eq",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Return Targeting\n",
"\n",
"Now we are going to optimize for different levels of required rates of return. Previously, I ran return targets going as high as 14%, but quickly realized that the highest rate of return you can get with a 20% max posiiton size in each asset class is just shy of 10%. Below we run rates of return from 4% up to 10% and will examine the outputs to see what is realistic to achieve under these assumptions."
]
},
{
"metadata": {
"id": "w0Ag5T2JohhN",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"return_targets = [.04, .05, .06, .07, .08, .09, .10]\n",
"for return_target in return_targets:\n",
" formatted_name = str(round(return_target * 100))\n",
" column_name = \"target_return_{}\".format(str(formatted_name))\n",
" ef.efficient_return(target_return=return_target, market_neutral=False)\n",
" weights = ef.clean_weights()\n",
" performance = ef.portfolio_performance()\n",
" all_stats_df.loc['Expected annual return',column_name] = performance[0]\n",
" all_stats_df.loc['Annual volatility',column_name] = performance[1]\n",
" all_stats_df.loc['Sharpe Ratio',column_name] = performance[2]\n",
" all_results_df[column_name] = pd.DataFrame.from_dict(weights, orient='index')"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "DKthUva5bQ7V",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"We remove any rows that have 0% allocations across every optimization to make it easier to read and analyze."
]
},
{
"metadata": {
"id": "HRljNdkBFLKF",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"non_zero_results = all_results_df[(all_results_df.T != 0).any()]"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "aidhwhIgbJY7",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Below we store the results to a csv that can be used for further research in Excel if that is your cup of tea."
]
},
{
"metadata": {
"id": "HK5wn2pvFU_r",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"non_zero_results.to_csv('non_zero_results.csv')\n",
"all_results_df.to_csv('all_results.csv')\n",
"all_stats_df.to_csv('all_stats.csv')"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "Kv_TOzqTbcf9",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"We are formatting the dataframes so we can view them as percentages and the Sharpe Ratios as decimals for easier visual analysis for the readers."
]
},
{
"metadata": {
"id": "kYHGnnryOoR2",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"formatted_tr_weights = non_zero_results.applymap(lambda x: \"{0:.2f}%\".format(x * 100))\n",
"formatted_tr_stats = all_stats_df.copy()\n",
"formatted_tr_stats.loc['Expected annual return':'Annual volatility'] = formatted_tr_stats.loc['Expected annual return':'Annual volatility'].applymap(lambda x: \"{0:.2f}%\".format(x * 100))\n",
"formatted_tr_stats.loc['Sharpe Ratio'] = formatted_tr_stats.loc['Sharpe Ratio'].apply(lambda x: round(x, 2))"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "SF241JhEbkzr",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Optimization Statistics \n",
"\n",
"Below you can find the output of the statistical results from our optimizations."
]
},
{
"metadata": {
"id": "XQt2HioAQTGx",
"colab_type": "code",
"outputId": "0a730be8-ba2e-41a3-aa08-88a7946bdf42",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 137
}
},
"cell_type": "code",
"source": [
"formatted_tr_stats"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>max_sharpe</th>\n",
" <th>min_vol</th>\n",
" <th>target_return_4</th>\n",
" <th>target_return_5</th>\n",
" <th>target_return_6</th>\n",
" <th>target_return_7</th>\n",
" <th>target_return_8</th>\n",
" <th>target_return_9</th>\n",
" <th>target_return_10</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Expected annual return</th>\n",
" <td>4.09%</td>\n",
" <td>3.29%</td>\n",
" <td>4.00%</td>\n",
" <td>5.00%</td>\n",
" <td>6.00%</td>\n",
" <td>7.00%</td>\n",
" <td>8.00%</td>\n",
" <td>9.00%</td>\n",
" <td>9.91%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Annual volatility</th>\n",
" <td>2.14%</td>\n",
" <td>1.52%</td>\n",
" <td>2.17%</td>\n",
" <td>3.45%</td>\n",
" <td>5.38%</td>\n",
" <td>7.84%</td>\n",
" <td>10.67%</td>\n",
" <td>14.03%</td>\n",
" <td>17.99%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sharpe Ratio</th>\n",
" <td>0.97</td>\n",
" <td>0.85</td>\n",
" <td>0.92</td>\n",
" <td>0.87</td>\n",
" <td>0.74</td>\n",
" <td>0.64</td>\n",
" <td>0.56</td>\n",
" <td>0.5</td>\n",
" <td>0.44</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" max_sharpe min_vol target_return_4 target_return_5 \\\n",
"Expected annual return 4.09% 3.29% 4.00% 5.00% \n",
"Annual volatility 2.14% 1.52% 2.17% 3.45% \n",
"Sharpe Ratio 0.97 0.85 0.92 0.87 \n",
"\n",
" target_return_6 target_return_7 target_return_8 \\\n",
"Expected annual return 6.00% 7.00% 8.00% \n",
"Annual volatility 5.38% 7.84% 10.67% \n",
"Sharpe Ratio 0.74 0.64 0.56 \n",
"\n",
" target_return_9 target_return_10 \n",
"Expected annual return 9.00% 9.91% \n",
"Annual volatility 14.03% 17.99% \n",
"Sharpe Ratio 0.5 0.44 "
]
},
"metadata": {
"tags": []
},
"execution_count": 35
}
]
},
{
"metadata": {
"id": "vCFw6r9qDg15",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Optimization Conclusions and Observations - Statistics\n",
"\n",
"The output above shows the expected return, risk and sharpe ratio for the different optimizations we previously ran. As mentioned previously, the highest rate of return we can get under the max position size of 20% per asset class is just shy of 10%. If you compare the different return rate optimization results with the maximum sharpe ratio portfolio to the target rate of return portfolios, the most efficient portfolio will only earn 4.09% over the next decade.\n",
"\n",
"The results also illustrate that in order to achieve higher rates of return over the next decade, investors will have to accept much more risk per unit of return. You can see this by the rapid decline in the sharpe ratio as you move up the required return spectrum. What this also means to investors is that the return from year to year and month to month will vary quite a bit over the next decade, resulting in a wide range of expected returns over the short-term, which presents a different challenge altogether (and one that is rooted in investor behavior)."
]
},
{
"metadata": {
"id": "BxA2BW2sb1xq",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Optimization Weights\n",
"\n",
"Below you can find the output of the asset allocations for each optimization."
]
},
{
"metadata": {
"id": "UuEr_JD2QUnB",
"colab_type": "code",
"outputId": "183d1618-2c6c-4f22-96ea-1f1c17867a4f",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1238
}
},
"cell_type": "code",
"source": [
"formatted_tr_weights"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>max_sharpe</th>\n",
" <th>min_vol</th>\n",
" <th>target_return_4</th>\n",
" <th>target_return_5</th>\n",
" <th>target_return_6</th>\n",
" <th>target_return_7</th>\n",
" <th>target_return_8</th>\n",
" <th>target_return_9</th>\n",
" <th>target_return_10</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Asset Class</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>U.S. Cash</th>\n",
" <td>4.98%</td>\n",
" <td>20.00%</td>\n",
" <td>9.51%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Intermediate Treasuries</th>\n",
" <td>20.00%</td>\n",
" <td>10.82%</td>\n",
" <td>12.10%</td>\n",
" <td>17.60%</td>\n",
" <td>8.04%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Long Treasuries</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>2.79%</td>\n",
" <td>12.70%</td>\n",
" <td>20.00%</td>\n",
" <td>20.00%</td>\n",
" <td>20.00%</td>\n",
" <td>7.57%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Aggregate Bonds</th>\n",
" <td>20.00%</td>\n",
" <td>4.44%</td>\n",
" <td>9.02%</td>\n",
" <td>17.56%</td>\n",
" <td>13.21%</td>\n",
" <td>1.49%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Short Duration Government/Credit</th>\n",
" <td>20.00%</td>\n",
" <td>13.40%</td>\n",
" <td>11.84%</td>\n",
" <td>10.60%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Long Duration Government/Credit</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>3.26%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Leveraged Loans</th>\n",
" <td>0.71%</td>\n",
" <td>4.28%</td>\n",
" <td>5.02%</td>\n",
" <td>0.85%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>World Government Bonds hedged</th>\n",
" <td>3.72%</td>\n",
" <td>11.20%</td>\n",
" <td>9.16%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>World ex-U.S. Government Bonds hedged</th>\n",
" <td>0.00%</td>\n",
" <td>12.47%</td>\n",
" <td>8.55%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Emerging Markets Sovereign Debt</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>2.51%</td>\n",
" <td>5.16%</td>\n",
" <td>4.71%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Emerging Markets Local Currency Debt</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>2.44%</td>\n",
" <td>9.30%</td>\n",
" <td>11.56%</td>\n",
" <td>10.06%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Muni 1-15 Yr Blend</th>\n",
" <td>9.78%</td>\n",
" <td>9.84%</td>\n",
" <td>8.71%</td>\n",
" <td>2.31%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Euro Area Large Cap</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>20.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Japanese Equity</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.79%</td>\n",
" <td>0.52%</td>\n",
" <td>3.74%</td>\n",
" <td>6.39%</td>\n",
" <td>8.22%</td>\n",
" <td>7.66%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Emerging Markets Equity</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>10.00%</td>\n",
" <td>20.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>AC Asia ex-Japan Equity</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>12.20%</td>\n",
" <td>20.00%</td>\n",
" <td>20.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Global Credit Sensitive Convertible</th>\n",
" <td>11.24%</td>\n",
" <td>6.94%</td>\n",
" <td>11.51%</td>\n",
" <td>18.17%</td>\n",
" <td>20.00%</td>\n",
" <td>14.30%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Private Equity</th>\n",
" <td>1.82%</td>\n",
" <td>0.00%</td>\n",
" <td>2.76%</td>\n",
" <td>9.20%</td>\n",
" <td>14.52%</td>\n",
" <td>19.04%</td>\n",
" <td>20.00%</td>\n",
" <td>20.00%</td>\n",
" <td>20.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Core Real Estate*</th>\n",
" <td>0.00%</td>\n",
" <td>1.27%</td>\n",
" <td>2.23%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>U.S. Value-Added Real Estate*</th>\n",
" <td>3.14%</td>\n",
" <td>0.00%</td>\n",
" <td>1.15%</td>\n",
" <td>5.41%</td>\n",
" <td>10.22%</td>\n",
" <td>15.81%</td>\n",
" <td>20.00%</td>\n",
" <td>20.00%</td>\n",
" <td>20.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>European ex-UK Core Real Estate*</th>\n",
" <td>4.61%</td>\n",
" <td>1.80%</td>\n",
" <td>2.57%</td>\n",
" <td>1.98%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Global Infrastructure Equity</th>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>2.27%</td>\n",
" <td>3.11%</td>\n",
" <td>7.83%</td>\n",
" <td>7.89%</td>\n",
" <td>2.86%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Diversified Hedge Funds</th>\n",
" <td>0.00%</td>\n",
" <td>3.53%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" <td>0.00%</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" max_sharpe min_vol target_return_4 \\\n",
"Asset Class \n",
"U.S. Cash 4.98% 20.00% 9.51% \n",
"U.S. Intermediate Treasuries 20.00% 10.82% 12.10% \n",
"U.S. Long Treasuries 0.00% 0.00% 2.79% \n",
"U.S. Aggregate Bonds 20.00% 4.44% 9.02% \n",
"U.S. Short Duration Government/Credit 20.00% 13.40% 11.84% \n",
"U.S. Long Duration Government/Credit 0.00% 0.00% 0.00% \n",
"U.S. Leveraged Loans 0.71% 4.28% 5.02% \n",
"World Government Bonds hedged 3.72% 11.20% 9.16% \n",
"World ex-U.S. Government Bonds hedged 0.00% 12.47% 8.55% \n",
"Emerging Markets Sovereign Debt 0.00% 0.00% 0.00% \n",
"Emerging Markets Local Currency Debt 0.00% 0.00% 0.00% \n",
"U.S. Muni 1-15 Yr Blend 9.78% 9.84% 8.71% \n",
"Euro Area Large Cap 0.00% 0.00% 0.00% \n",
"Japanese Equity 0.00% 0.00% 0.79% \n",
"Emerging Markets Equity 0.00% 0.00% 0.00% \n",
"AC Asia ex-Japan Equity 0.00% 0.00% 0.00% \n",
"Global Credit Sensitive Convertible 11.24% 6.94% 11.51% \n",
"Private Equity 1.82% 0.00% 2.76% \n",
"U.S. Core Real Estate* 0.00% 1.27% 2.23% \n",
"U.S. Value-Added Real Estate* 3.14% 0.00% 1.15% \n",
"European ex-UK Core Real Estate* 4.61% 1.80% 2.57% \n",
"Global Infrastructure Equity 0.00% 0.00% 2.27% \n",
"Diversified Hedge Funds 0.00% 3.53% 0.00% \n",
"\n",
" target_return_5 target_return_6 \\\n",
"Asset Class \n",
"U.S. Cash 0.00% 0.00% \n",
"U.S. Intermediate Treasuries 17.60% 8.04% \n",
"U.S. Long Treasuries 12.70% 20.00% \n",
"U.S. Aggregate Bonds 17.56% 13.21% \n",
"U.S. Short Duration Government/Credit 10.60% 0.00% \n",
"U.S. Long Duration Government/Credit 0.00% 0.00% \n",
"U.S. Leveraged Loans 0.85% 0.00% \n",
"World Government Bonds hedged 0.00% 0.00% \n",
"World ex-U.S. Government Bonds hedged 0.00% 0.00% \n",
"Emerging Markets Sovereign Debt 0.00% 0.00% \n",
"Emerging Markets Local Currency Debt 0.00% 2.44% \n",
"U.S. Muni 1-15 Yr Blend 2.31% 0.00% \n",
"Euro Area Large Cap 0.00% 0.00% \n",
"Japanese Equity 0.52% 3.74% \n",
"Emerging Markets Equity 0.00% 0.00% \n",
"AC Asia ex-Japan Equity 0.00% 0.00% \n",
"Global Credit Sensitive Convertible 18.17% 20.00% \n",
"Private Equity 9.20% 14.52% \n",
"U.S. Core Real Estate* 0.00% 0.00% \n",
"U.S. Value-Added Real Estate* 5.41% 10.22% \n",
"European ex-UK Core Real Estate* 1.98% 0.00% \n",
"Global Infrastructure Equity 3.11% 7.83% \n",
"Diversified Hedge Funds 0.00% 0.00% \n",
"\n",
" target_return_7 target_return_8 \\\n",
"Asset Class \n",
"U.S. Cash 0.00% 0.00% \n",
"U.S. Intermediate Treasuries 0.00% 0.00% \n",
"U.S. Long Treasuries 20.00% 20.00% \n",
"U.S. Aggregate Bonds 1.49% 0.00% \n",
"U.S. Short Duration Government/Credit 0.00% 0.00% \n",
"U.S. Long Duration Government/Credit 3.26% 0.00% \n",
"U.S. Leveraged Loans 0.00% 0.00% \n",
"World Government Bonds hedged 0.00% 0.00% \n",
"World ex-U.S. Government Bonds hedged 0.00% 0.00% \n",
"Emerging Markets Sovereign Debt 2.51% 5.16% \n",
"Emerging Markets Local Currency Debt 9.30% 11.56% \n",
"U.S. Muni 1-15 Yr Blend 0.00% 0.00% \n",
"Euro Area Large Cap 0.00% 0.00% \n",
"Japanese Equity 6.39% 8.22% \n",
"Emerging Markets Equity 0.00% 0.00% \n",
"AC Asia ex-Japan Equity 0.00% 12.20% \n",
"Global Credit Sensitive Convertible 14.30% 0.00% \n",
"Private Equity 19.04% 20.00% \n",
"U.S. Core Real Estate* 0.00% 0.00% \n",
"U.S. Value-Added Real Estate* 15.81% 20.00% \n",
"European ex-UK Core Real Estate* 0.00% 0.00% \n",
"Global Infrastructure Equity 7.89% 2.86% \n",
"Diversified Hedge Funds 0.00% 0.00% \n",
"\n",
" target_return_9 target_return_10 \n",
"Asset Class \n",
"U.S. Cash 0.00% 0.00% \n",
"U.S. Intermediate Treasuries 0.00% 0.00% \n",
"U.S. Long Treasuries 7.57% 0.00% \n",
"U.S. Aggregate Bonds 0.00% 0.00% \n",
"U.S. Short Duration Government/Credit 0.00% 0.00% \n",
"U.S. Long Duration Government/Credit 0.00% 0.00% \n",
"U.S. Leveraged Loans 0.00% 0.00% \n",
"World Government Bonds hedged 0.00% 0.00% \n",
"World ex-U.S. Government Bonds hedged 0.00% 0.00% \n",
"Emerging Markets Sovereign Debt 4.71% 0.00% \n",
"Emerging Markets Local Currency Debt 10.06% 0.00% \n",
"U.S. Muni 1-15 Yr Blend 0.00% 0.00% \n",
"Euro Area Large Cap 0.00% 20.00% \n",
"Japanese Equity 7.66% 0.00% \n",
"Emerging Markets Equity 10.00% 20.00% \n",
"AC Asia ex-Japan Equity 20.00% 20.00% \n",
"Global Credit Sensitive Convertible 0.00% 0.00% \n",
"Private Equity 20.00% 20.00% \n",
"U.S. Core Real Estate* 0.00% 0.00% \n",
"U.S. Value-Added Real Estate* 20.00% 20.00% \n",
"European ex-UK Core Real Estate* 0.00% 0.00% \n",
"Global Infrastructure Equity 0.00% 0.00% \n",
"Diversified Hedge Funds 0.00% 0.00% "
]
},
"metadata": {
"tags": []
},
"execution_count": 20
}
]
},
{
"metadata": {
"id": "xR4QtszrFEqO",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Optimization Conclusions and Observations - Allocations\n",
"\n",
"With the Federal Reserve raising rates in the United States, it appears to have made it easier for investors to achieve return targets of 4-5% without having to invest in too many obscure asset classes. The higher interest rate environment should bode well for investors requiring more conservative rates of return over the next decade.\n",
"\n",
"When you start to move further up the required return spectrum, allocations start to become less palatable and one could argue, unfeasible for the average retail investor to realistically achieve without being an accredited investor. One pattern that pops out at us is that illiquidity is the only risk premium that will get investors to higher rates of return over the next decade. This could be a result of tightening liquidity from Central Banks globally, meaning that investors will be rewarded if they are okay with having their capital tied up for 5-10 years in private equity or direct real estate.\n",
"\n",
"Bottom line, the JPMorgan Capital Market Assumptions demonstrate that investors looking for higher returns that historically could be achieved with liquid, traditional equities will have to become more comfortable with less-liquid alternatives. In our experience, retail investors cannot gain access to asset classes like Private Equity or Direct Real Estate in an efficient manner. Meaning, the higher expected return will be easily negated by higher fee structures present in the retail versions of these more sophisticated asset classes. Most retail investors do not have the stomach for investing in these non-traditional assets and are better served by planning to save more, spend less, and invest in a more traditional manner with the understanding that returns over the next decade may fall well short of most expectations (if using historical averages to set return expectations for the next decade)."
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment