From 2cfafadc9cad6f610ace949a9e73629b08227f3b Mon Sep 17 00:00:00 2001
From: Ambrose Ikpele <68953964+ambroseikpele@users.noreply.github.com>
Date: Tue, 1 Oct 2024 15:26:46 +0100
Subject: [PATCH 1/2] Added file : Created Notebook for Portfolio Optimization
Using Modern Portfolio Theory
---
...timizationUsingModernPortfolioTheory.ipynb | 2248 +++++++++++++++++
1 file changed, 2248 insertions(+)
create mode 100644 examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb
diff --git a/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb b/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb
new file mode 100644
index 000000000000..08732cb16501
--- /dev/null
+++ b/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb
@@ -0,0 +1,2248 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HRMC-0N0sSjJ"
+ },
+ "source": [
+ "## Portfolio Optimization Using Modern Portfolio Theory\n",
+ "\n",
+ "#### Description\n",
+ "This notebook utilizes OpenBB’s data for portfolio optimization based on MPT principles. We would be optimizing a portfolio of top 10 crypto assets, using the daily close data from 1st october 2023 to 1st october 2024.\n",
+ "\n",
+ "The portfolio optimization would be done using the mean-variance approach. The mean-variance approach helps determine the optimal allocation of assets in a portfolio to minimize overall risk while maximizing expected returns.\n",
+ "\n",
+ "#### Author\n",
+ "[Ambrose Ikpele](https://github.com/ambroseikpele)\n",
+ "\n",
+ "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/OpenBB-Finance/OpenBB/blob/develop/examples/[Notebook_Name].ipynb)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Install external packages"
+ ],
+ "metadata": {
+ "id": "_rMPfEH2KJjA"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "!pip install openbb\n",
+ "!pip install PyPortfolioOpt"
+ ],
+ "metadata": {
+ "id": "iexQsZ1XvYa8"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Import necessary packages"
+ ],
+ "metadata": {
+ "id": "CH4i_WQGRmG-"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "id": "B8m_9BassSjK"
+ },
+ "outputs": [],
+ "source": [
+ "from openbb import obb\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "from pypfopt import EfficientFrontier\n",
+ "from pypfopt import CovarianceShrinkage, CLA, expected_returns"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Fetch the daily data of the top crypto currencies for a period of one year using openbb"
+ ],
+ "metadata": {
+ "id": "w3XB7egmzlmI"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "top_crypto= ['ADA-USD', 'BNB-USD', 'BTC-USD', 'DOT-USD', 'ETH-USD', 'LTC-USD','MATIC-USD', 'SOL-USD', 'TRX-USD', 'XRP-USD']\n",
+ "\n",
+ "ohlc_data= obb.crypto.price.historical(top_crypto, provider=\"yfinance\", interval='1d', start_date='2023-10-01', end_date='2024-10-01').to_df()\n",
+ "ohlc_data"
+ ],
+ "metadata": {
+ "id": "C3UwCtY8vDaQ",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 455
+ },
+ "outputId": "8ab3c023-43e8-4d81-f5ef-22451d3604bb"
+ },
+ "execution_count": 2,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " open high low close \\\n",
+ "date \n",
+ "2023-10-01 0.254043 0.267471 0.254019 0.265895 \n",
+ "2023-10-01 214.800323 219.133835 213.506516 218.047134 \n",
+ "2023-10-01 26967.396484 28047.238281 26965.093750 27983.750000 \n",
+ "2023-10-01 4.105477 4.279937 4.103880 4.261009 \n",
+ "2023-10-01 1671.161499 1750.595703 1670.082153 1733.810425 \n",
+ "... ... ... ... ... \n",
+ "2024-10-01 66.820854 68.483223 66.786285 67.686295 \n",
+ "2024-10-01 0.395941 0.404462 0.394638 0.399719 \n",
+ "2024-10-01 152.604584 157.199478 151.796982 155.045334 \n",
+ "2024-10-01 0.155929 0.156981 0.155710 0.156684 \n",
+ "2024-10-01 0.611519 0.633387 0.611519 0.627602 \n",
+ "\n",
+ " volume symbol \n",
+ "date \n",
+ "2023-10-01 1.650882e+08 ADA-USD \n",
+ "2023-10-01 3.874081e+08 BNB-USD \n",
+ "2023-10-01 9.503917e+09 BTC-USD \n",
+ "2023-10-01 8.294334e+07 DOT-USD \n",
+ "2023-10-01 5.054880e+09 ETH-USD \n",
+ "... ... ... \n",
+ "2024-10-01 2.475363e+08 LTC-USD \n",
+ "2024-10-01 3.507427e+07 MATIC-USD \n",
+ "2024-10-01 1.949461e+09 SOL-USD \n",
+ "2024-10-01 3.093434e+08 TRX-USD \n",
+ "2024-10-01 1.424177e+09 XRP-USD \n",
+ "\n",
+ "[3670 rows x 6 columns]"
+ ],
+ "text/html": [
+ "\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " open | \n",
+ " high | \n",
+ " low | \n",
+ " close | \n",
+ " volume | \n",
+ " symbol | \n",
+ "
\n",
+ " \n",
+ " date | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 2023-10-01 | \n",
+ " 0.254043 | \n",
+ " 0.267471 | \n",
+ " 0.254019 | \n",
+ " 0.265895 | \n",
+ " 1.650882e+08 | \n",
+ " ADA-USD | \n",
+ "
\n",
+ " \n",
+ " 2023-10-01 | \n",
+ " 214.800323 | \n",
+ " 219.133835 | \n",
+ " 213.506516 | \n",
+ " 218.047134 | \n",
+ " 3.874081e+08 | \n",
+ " BNB-USD | \n",
+ "
\n",
+ " \n",
+ " 2023-10-01 | \n",
+ " 26967.396484 | \n",
+ " 28047.238281 | \n",
+ " 26965.093750 | \n",
+ " 27983.750000 | \n",
+ " 9.503917e+09 | \n",
+ " BTC-USD | \n",
+ "
\n",
+ " \n",
+ " 2023-10-01 | \n",
+ " 4.105477 | \n",
+ " 4.279937 | \n",
+ " 4.103880 | \n",
+ " 4.261009 | \n",
+ " 8.294334e+07 | \n",
+ " DOT-USD | \n",
+ "
\n",
+ " \n",
+ " 2023-10-01 | \n",
+ " 1671.161499 | \n",
+ " 1750.595703 | \n",
+ " 1670.082153 | \n",
+ " 1733.810425 | \n",
+ " 5.054880e+09 | \n",
+ " ETH-USD | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 2024-10-01 | \n",
+ " 66.820854 | \n",
+ " 68.483223 | \n",
+ " 66.786285 | \n",
+ " 67.686295 | \n",
+ " 2.475363e+08 | \n",
+ " LTC-USD | \n",
+ "
\n",
+ " \n",
+ " 2024-10-01 | \n",
+ " 0.395941 | \n",
+ " 0.404462 | \n",
+ " 0.394638 | \n",
+ " 0.399719 | \n",
+ " 3.507427e+07 | \n",
+ " MATIC-USD | \n",
+ "
\n",
+ " \n",
+ " 2024-10-01 | \n",
+ " 152.604584 | \n",
+ " 157.199478 | \n",
+ " 151.796982 | \n",
+ " 155.045334 | \n",
+ " 1.949461e+09 | \n",
+ " SOL-USD | \n",
+ "
\n",
+ " \n",
+ " 2024-10-01 | \n",
+ " 0.155929 | \n",
+ " 0.156981 | \n",
+ " 0.155710 | \n",
+ " 0.156684 | \n",
+ " 3.093434e+08 | \n",
+ " TRX-USD | \n",
+ "
\n",
+ " \n",
+ " 2024-10-01 | \n",
+ " 0.611519 | \n",
+ " 0.633387 | \n",
+ " 0.611519 | \n",
+ " 0.627602 | \n",
+ " 1.424177e+09 | \n",
+ " XRP-USD | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
3670 rows × 6 columns
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "ohlc_data",
+ "summary": "{\n \"name\": \"ohlc_data\",\n \"rows\": 3670,\n \"fields\": [\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2023-10-01\",\n \"max\": \"2024-10-01\",\n \"num_unique_values\": 367,\n \"samples\": [\n \"2024-04-11\",\n \"2023-11-03\",\n \"2023-10-16\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"open\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16646.479249400243,\n \"min\": 0.08486499637365341,\n \"max\": 73079.375,\n \"num_unique_values\": 3669,\n \"samples\": [\n 0.49170398712158203,\n 0.4794990122318268,\n 2683.719970703125\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"high\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16979.65920014512,\n \"min\": 0.08571500331163406,\n \"max\": 73750.0703125,\n \"num_unique_values\": 3670,\n \"samples\": [\n 0.4922049939632416,\n 0.4812979996204376,\n 63872.44140625\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16307.879682680239,\n \"min\": 0.0847959965467453,\n \"max\": 71334.09375,\n \"num_unique_values\": 3665,\n \"samples\": [\n 6.224710941314697,\n 0.3214839994907379,\n 0.4614889919757843\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16670.124390346416,\n \"min\": 0.08486700057983398,\n \"max\": 73083.5,\n \"num_unique_values\": 3665,\n \"samples\": [\n 65738.7265625,\n 519.870361328125,\n 139.4636993408203\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 10083345827.063368,\n \"min\": 33682820.0,\n \"max\": 108991085584.0,\n \"num_unique_values\": 3670,\n \"samples\": [\n 734621817.0,\n 1322556294.0,\n 42710252573.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"symbol\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"TRX-USD\",\n \"BNB-USD\",\n \"LTC-USD\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 2
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Select the close data from ohlc_data for each crypto currency"
+ ],
+ "metadata": {
+ "id": "diAUqkPi5BYe"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "close_symbol= ohlc_data[['close', 'symbol']]\n",
+ "\n",
+ "# Setting the symbol as the second index level\n",
+ "close_symbol = close_symbol.set_index('symbol', append= True)\n",
+ "\n",
+ "# Unstack 'symbol' to make each unique symbol a separate column\n",
+ "close_symbol_unstacked= close_symbol.unstack(level='symbol')\n",
+ "\n",
+ "# Flatten the column headers\n",
+ "close_symbol_unstacked.columns = close_symbol_unstacked.columns.get_level_values(1)\n",
+ "\n",
+ "prices= close_symbol_unstacked\n",
+ "\n",
+ "prices"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 455
+ },
+ "id": "PXNs59lSzMqv",
+ "outputId": "265b039d-f797-40be-8817-6c96a7aaf431"
+ },
+ "execution_count": 3,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "symbol ADA-USD BNB-USD BTC-USD DOT-USD ETH-USD \\\n",
+ "date \n",
+ "2023-10-01 0.265895 218.047134 27983.750000 4.261009 1733.810425 \n",
+ "2023-10-02 0.259513 214.757935 27530.785156 4.123762 1663.627563 \n",
+ "2023-10-03 0.261028 213.435944 27429.978516 4.074247 1656.685669 \n",
+ "2023-10-04 0.259315 213.413086 27799.394531 4.047316 1647.838135 \n",
+ "2023-10-05 0.260149 210.679672 27415.912109 4.022738 1611.476440 \n",
+ "... ... ... ... ... ... \n",
+ "2024-09-27 0.402328 607.867004 65790.664062 4.892055 2695.900635 \n",
+ "2024-09-28 0.401052 601.567200 65887.648438 4.805896 2677.539062 \n",
+ "2024-09-29 0.397597 596.411194 65635.304688 4.768428 2659.346924 \n",
+ "2024-09-30 0.373214 567.260071 63329.500000 4.437086 2603.062744 \n",
+ "2024-10-01 0.380300 574.313965 63394.039062 4.461926 2610.701416 \n",
+ "\n",
+ "symbol LTC-USD MATIC-USD SOL-USD TRX-USD XRP-USD \n",
+ "date \n",
+ "2023-10-01 68.233315 0.568532 23.836487 0.090118 0.524204 \n",
+ "2023-10-02 66.011124 0.547513 23.371700 0.087566 0.512832 \n",
+ "2023-10-03 65.493515 0.566308 23.552694 0.090858 0.538387 \n",
+ "2023-10-04 64.452065 0.563369 23.144787 0.088999 0.532931 \n",
+ "2023-10-05 64.858765 0.546018 22.694141 0.088276 0.523366 \n",
+ "... ... ... ... ... ... \n",
+ "2024-09-27 71.188202 0.433774 157.749939 0.155170 0.588927 \n",
+ "2024-09-28 70.003967 0.423559 156.912430 0.155068 0.614801 \n",
+ "2024-09-29 69.314423 0.421419 158.629166 0.156474 0.641947 \n",
+ "2024-09-30 66.820450 0.395917 152.618469 0.155915 0.611492 \n",
+ "2024-10-01 67.686295 0.399719 155.045334 0.156684 0.627602 \n",
+ "\n",
+ "[367 rows x 10 columns]"
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " symbol | \n",
+ " ADA-USD | \n",
+ " BNB-USD | \n",
+ " BTC-USD | \n",
+ " DOT-USD | \n",
+ " ETH-USD | \n",
+ " LTC-USD | \n",
+ " MATIC-USD | \n",
+ " SOL-USD | \n",
+ " TRX-USD | \n",
+ " XRP-USD | \n",
+ "
\n",
+ " \n",
+ " date | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 2023-10-01 | \n",
+ " 0.265895 | \n",
+ " 218.047134 | \n",
+ " 27983.750000 | \n",
+ " 4.261009 | \n",
+ " 1733.810425 | \n",
+ " 68.233315 | \n",
+ " 0.568532 | \n",
+ " 23.836487 | \n",
+ " 0.090118 | \n",
+ " 0.524204 | \n",
+ "
\n",
+ " \n",
+ " 2023-10-02 | \n",
+ " 0.259513 | \n",
+ " 214.757935 | \n",
+ " 27530.785156 | \n",
+ " 4.123762 | \n",
+ " 1663.627563 | \n",
+ " 66.011124 | \n",
+ " 0.547513 | \n",
+ " 23.371700 | \n",
+ " 0.087566 | \n",
+ " 0.512832 | \n",
+ "
\n",
+ " \n",
+ " 2023-10-03 | \n",
+ " 0.261028 | \n",
+ " 213.435944 | \n",
+ " 27429.978516 | \n",
+ " 4.074247 | \n",
+ " 1656.685669 | \n",
+ " 65.493515 | \n",
+ " 0.566308 | \n",
+ " 23.552694 | \n",
+ " 0.090858 | \n",
+ " 0.538387 | \n",
+ "
\n",
+ " \n",
+ " 2023-10-04 | \n",
+ " 0.259315 | \n",
+ " 213.413086 | \n",
+ " 27799.394531 | \n",
+ " 4.047316 | \n",
+ " 1647.838135 | \n",
+ " 64.452065 | \n",
+ " 0.563369 | \n",
+ " 23.144787 | \n",
+ " 0.088999 | \n",
+ " 0.532931 | \n",
+ "
\n",
+ " \n",
+ " 2023-10-05 | \n",
+ " 0.260149 | \n",
+ " 210.679672 | \n",
+ " 27415.912109 | \n",
+ " 4.022738 | \n",
+ " 1611.476440 | \n",
+ " 64.858765 | \n",
+ " 0.546018 | \n",
+ " 22.694141 | \n",
+ " 0.088276 | \n",
+ " 0.523366 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 2024-09-27 | \n",
+ " 0.402328 | \n",
+ " 607.867004 | \n",
+ " 65790.664062 | \n",
+ " 4.892055 | \n",
+ " 2695.900635 | \n",
+ " 71.188202 | \n",
+ " 0.433774 | \n",
+ " 157.749939 | \n",
+ " 0.155170 | \n",
+ " 0.588927 | \n",
+ "
\n",
+ " \n",
+ " 2024-09-28 | \n",
+ " 0.401052 | \n",
+ " 601.567200 | \n",
+ " 65887.648438 | \n",
+ " 4.805896 | \n",
+ " 2677.539062 | \n",
+ " 70.003967 | \n",
+ " 0.423559 | \n",
+ " 156.912430 | \n",
+ " 0.155068 | \n",
+ " 0.614801 | \n",
+ "
\n",
+ " \n",
+ " 2024-09-29 | \n",
+ " 0.397597 | \n",
+ " 596.411194 | \n",
+ " 65635.304688 | \n",
+ " 4.768428 | \n",
+ " 2659.346924 | \n",
+ " 69.314423 | \n",
+ " 0.421419 | \n",
+ " 158.629166 | \n",
+ " 0.156474 | \n",
+ " 0.641947 | \n",
+ "
\n",
+ " \n",
+ " 2024-09-30 | \n",
+ " 0.373214 | \n",
+ " 567.260071 | \n",
+ " 63329.500000 | \n",
+ " 4.437086 | \n",
+ " 2603.062744 | \n",
+ " 66.820450 | \n",
+ " 0.395917 | \n",
+ " 152.618469 | \n",
+ " 0.155915 | \n",
+ " 0.611492 | \n",
+ "
\n",
+ " \n",
+ " 2024-10-01 | \n",
+ " 0.380300 | \n",
+ " 574.313965 | \n",
+ " 63394.039062 | \n",
+ " 4.461926 | \n",
+ " 2610.701416 | \n",
+ " 67.686295 | \n",
+ " 0.399719 | \n",
+ " 155.045334 | \n",
+ " 0.156684 | \n",
+ " 0.627602 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
367 rows × 10 columns
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "close_symbol_unstacked",
+ "summary": "{\n \"name\": \"close_symbol_unstacked\",\n \"rows\": 367,\n \"fields\": [\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2023-10-01\",\n \"max\": \"2024-10-01\",\n \"num_unique_values\": 367,\n \"samples\": [\n \"2024-04-11\",\n \"2023-11-03\",\n \"2023-10-16\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ADA-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.12231550584081373,\n \"min\": 0.2434529960155487,\n \"max\": 0.7741900086402893,\n \"num_unique_values\": 366,\n \"samples\": [\n 0.5035750269889832,\n 0.32902100682258606,\n 0.25156301259994507\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BNB-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 152.46468320666116,\n \"min\": 205.2294158935547,\n \"max\": 710.4640502929688,\n \"num_unique_values\": 367,\n \"samples\": [\n 604.893798828125,\n 230.60597229003906,\n 214.82395935058594\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BTC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 13044.480615583347,\n \"min\": 26756.798828125,\n \"max\": 73083.5,\n \"num_unique_values\": 367,\n \"samples\": [\n 70060.609375,\n 34732.32421875,\n 28519.466796875\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"DOT-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.7193378737799296,\n \"min\": 3.6488780975341797,\n \"max\": 11.542901992797852,\n \"num_unique_values\": 367,\n \"samples\": [\n 8.379441261291504,\n 4.6154937744140625,\n 3.7862110137939453\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ETH-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 644.9463072659804,\n \"min\": 1539.6124267578125,\n \"max\": 4066.445068359375,\n \"num_unique_values\": 367,\n \"samples\": [\n 3505.247802734375,\n 1832.795166015625,\n 1600.5343017578125\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"LTC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 9.815022518838514,\n \"min\": 55.983909606933594,\n \"max\": 109.25897216796875,\n \"num_unique_values\": 367,\n \"samples\": [\n 98.68910217285156,\n 69.49114227294922,\n 63.337162017822266\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"MATIC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.20676285473019815,\n \"min\": 0.3659299910068512,\n \"max\": 1.2714049816131592,\n \"num_unique_values\": 367,\n \"samples\": [\n 0.8783450126647949,\n 0.6719430088996887,\n 0.5341209769248962\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"SOL-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 46.954204670567634,\n \"min\": 21.300268173217773,\n \"max\": 202.87413024902344,\n \"num_unique_values\": 367,\n \"samples\": [\n 172.5763702392578,\n 39.51976013183594,\n 23.98295783996582\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"TRX-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.018127298632971522,\n \"min\": 0.08486700057983398,\n \"max\": 0.16655699908733368,\n \"num_unique_values\": 363,\n \"samples\": [\n 0.13199299573898315,\n 0.09731300175189972,\n 0.08891399949789047\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"XRP-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.056190198963527865,\n \"min\": 0.4198229908943176,\n \"max\": 0.7180359959602356,\n \"num_unique_values\": 367,\n \"samples\": [\n 0.6088799834251404,\n 0.6130020022392273,\n 0.49797698855400085\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 3
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "calculate the expected returns of each asset and covariance matrix of crypto assets"
+ ],
+ "metadata": {
+ "id": "pFLyyT7v4E5J"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Expected returns of crypto assets using the mean historical return.\n",
+ "portfolio_expected_returns = expected_returns.mean_historical_return(prices, frequency=365, compounding=False)\n",
+ "\n",
+ "# Covariance matrix of crypto assets using the Ledoit-Wolf shrinkage method.\n",
+ "covariance = CovarianceShrinkage(prices).ledoit_wolf()"
+ ],
+ "metadata": {
+ "id": "S_sH-1sq6bnI"
+ },
+ "execution_count": 4,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "portfolio_expected_returns"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 429
+ },
+ "id": "8q1RvkuV7ouF",
+ "outputId": "7cdc9e09-c38c-4443-8d66-2de154614d74"
+ },
+ "execution_count": 5,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "symbol\n",
+ "ADA-USD 0.621306\n",
+ "BNB-USD 1.130899\n",
+ "BTC-USD 0.950751\n",
+ "DOT-USD 0.324462\n",
+ "ETH-USD 0.592597\n",
+ "LTC-USD 0.186095\n",
+ "MATIC-USD -0.048860\n",
+ "SOL-USD 2.297820\n",
+ "TRX-USD 0.619805\n",
+ "XRP-USD 0.370310\n",
+ "dtype: float64"
+ ],
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " symbol | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " ADA-USD | \n",
+ " 0.621306 | \n",
+ "
\n",
+ " \n",
+ " BNB-USD | \n",
+ " 1.130899 | \n",
+ "
\n",
+ " \n",
+ " BTC-USD | \n",
+ " 0.950751 | \n",
+ "
\n",
+ " \n",
+ " DOT-USD | \n",
+ " 0.324462 | \n",
+ "
\n",
+ " \n",
+ " ETH-USD | \n",
+ " 0.592597 | \n",
+ "
\n",
+ " \n",
+ " LTC-USD | \n",
+ " 0.186095 | \n",
+ "
\n",
+ " \n",
+ " MATIC-USD | \n",
+ " -0.048860 | \n",
+ "
\n",
+ " \n",
+ " SOL-USD | \n",
+ " 2.297820 | \n",
+ "
\n",
+ " \n",
+ " TRX-USD | \n",
+ " 0.619805 | \n",
+ "
\n",
+ " \n",
+ " XRP-USD | \n",
+ " 0.370310 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "covariance"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 394
+ },
+ "id": "OGZqN0i47sBC",
+ "outputId": "f4e4ac0a-f2c0-4f58-b999-e7d056d59b18"
+ },
+ "execution_count": 6,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "symbol ADA-USD BNB-USD BTC-USD DOT-USD ETH-USD LTC-USD \\\n",
+ "symbol \n",
+ "ADA-USD 0.365908 0.149985 0.179671 0.303813 0.203350 0.204707 \n",
+ "BNB-USD 0.149985 0.230834 0.122378 0.150464 0.138874 0.108916 \n",
+ "BTC-USD 0.179671 0.122378 0.189577 0.175989 0.172308 0.127100 \n",
+ "DOT-USD 0.303813 0.150464 0.175989 0.385419 0.206734 0.192864 \n",
+ "ETH-USD 0.203350 0.138874 0.172308 0.206734 0.259265 0.160001 \n",
+ "LTC-USD 0.204707 0.108916 0.127100 0.192864 0.160001 0.270176 \n",
+ "MATIC-USD 0.278248 0.173514 0.170163 0.287835 0.224481 0.190943 \n",
+ "SOL-USD 0.296429 0.171700 0.221531 0.333077 0.232270 0.191517 \n",
+ "TRX-USD 0.083626 0.046899 0.054940 0.085921 0.063282 0.055659 \n",
+ "XRP-USD 0.194114 0.093489 0.120379 0.192047 0.133110 0.158148 \n",
+ "\n",
+ "symbol MATIC-USD SOL-USD TRX-USD XRP-USD \n",
+ "symbol \n",
+ "ADA-USD 0.278248 0.296429 0.083626 0.194114 \n",
+ "BNB-USD 0.173514 0.171700 0.046899 0.093489 \n",
+ "BTC-USD 0.170163 0.221531 0.054940 0.120379 \n",
+ "DOT-USD 0.287835 0.333077 0.085921 0.192047 \n",
+ "ETH-USD 0.224481 0.232270 0.063282 0.133110 \n",
+ "LTC-USD 0.190943 0.191517 0.055659 0.158148 \n",
+ "MATIC-USD 0.414685 0.290214 0.075435 0.180736 \n",
+ "SOL-USD 0.290214 0.593740 0.095372 0.184846 \n",
+ "TRX-USD 0.075435 0.095372 0.098433 0.057513 \n",
+ "XRP-USD 0.180736 0.184846 0.057513 0.267617 "
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " symbol | \n",
+ " ADA-USD | \n",
+ " BNB-USD | \n",
+ " BTC-USD | \n",
+ " DOT-USD | \n",
+ " ETH-USD | \n",
+ " LTC-USD | \n",
+ " MATIC-USD | \n",
+ " SOL-USD | \n",
+ " TRX-USD | \n",
+ " XRP-USD | \n",
+ "
\n",
+ " \n",
+ " symbol | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " ADA-USD | \n",
+ " 0.365908 | \n",
+ " 0.149985 | \n",
+ " 0.179671 | \n",
+ " 0.303813 | \n",
+ " 0.203350 | \n",
+ " 0.204707 | \n",
+ " 0.278248 | \n",
+ " 0.296429 | \n",
+ " 0.083626 | \n",
+ " 0.194114 | \n",
+ "
\n",
+ " \n",
+ " BNB-USD | \n",
+ " 0.149985 | \n",
+ " 0.230834 | \n",
+ " 0.122378 | \n",
+ " 0.150464 | \n",
+ " 0.138874 | \n",
+ " 0.108916 | \n",
+ " 0.173514 | \n",
+ " 0.171700 | \n",
+ " 0.046899 | \n",
+ " 0.093489 | \n",
+ "
\n",
+ " \n",
+ " BTC-USD | \n",
+ " 0.179671 | \n",
+ " 0.122378 | \n",
+ " 0.189577 | \n",
+ " 0.175989 | \n",
+ " 0.172308 | \n",
+ " 0.127100 | \n",
+ " 0.170163 | \n",
+ " 0.221531 | \n",
+ " 0.054940 | \n",
+ " 0.120379 | \n",
+ "
\n",
+ " \n",
+ " DOT-USD | \n",
+ " 0.303813 | \n",
+ " 0.150464 | \n",
+ " 0.175989 | \n",
+ " 0.385419 | \n",
+ " 0.206734 | \n",
+ " 0.192864 | \n",
+ " 0.287835 | \n",
+ " 0.333077 | \n",
+ " 0.085921 | \n",
+ " 0.192047 | \n",
+ "
\n",
+ " \n",
+ " ETH-USD | \n",
+ " 0.203350 | \n",
+ " 0.138874 | \n",
+ " 0.172308 | \n",
+ " 0.206734 | \n",
+ " 0.259265 | \n",
+ " 0.160001 | \n",
+ " 0.224481 | \n",
+ " 0.232270 | \n",
+ " 0.063282 | \n",
+ " 0.133110 | \n",
+ "
\n",
+ " \n",
+ " LTC-USD | \n",
+ " 0.204707 | \n",
+ " 0.108916 | \n",
+ " 0.127100 | \n",
+ " 0.192864 | \n",
+ " 0.160001 | \n",
+ " 0.270176 | \n",
+ " 0.190943 | \n",
+ " 0.191517 | \n",
+ " 0.055659 | \n",
+ " 0.158148 | \n",
+ "
\n",
+ " \n",
+ " MATIC-USD | \n",
+ " 0.278248 | \n",
+ " 0.173514 | \n",
+ " 0.170163 | \n",
+ " 0.287835 | \n",
+ " 0.224481 | \n",
+ " 0.190943 | \n",
+ " 0.414685 | \n",
+ " 0.290214 | \n",
+ " 0.075435 | \n",
+ " 0.180736 | \n",
+ "
\n",
+ " \n",
+ " SOL-USD | \n",
+ " 0.296429 | \n",
+ " 0.171700 | \n",
+ " 0.221531 | \n",
+ " 0.333077 | \n",
+ " 0.232270 | \n",
+ " 0.191517 | \n",
+ " 0.290214 | \n",
+ " 0.593740 | \n",
+ " 0.095372 | \n",
+ " 0.184846 | \n",
+ "
\n",
+ " \n",
+ " TRX-USD | \n",
+ " 0.083626 | \n",
+ " 0.046899 | \n",
+ " 0.054940 | \n",
+ " 0.085921 | \n",
+ " 0.063282 | \n",
+ " 0.055659 | \n",
+ " 0.075435 | \n",
+ " 0.095372 | \n",
+ " 0.098433 | \n",
+ " 0.057513 | \n",
+ "
\n",
+ " \n",
+ " XRP-USD | \n",
+ " 0.194114 | \n",
+ " 0.093489 | \n",
+ " 0.120379 | \n",
+ " 0.192047 | \n",
+ " 0.133110 | \n",
+ " 0.158148 | \n",
+ " 0.180736 | \n",
+ " 0.184846 | \n",
+ " 0.057513 | \n",
+ " 0.267617 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "covariance",
+ "summary": "{\n \"name\": \"covariance\",\n \"rows\": 10,\n \"fields\": [\n {\n \"column\": \"symbol\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"TRX-USD\",\n \"BNB-USD\",\n \"LTC-USD\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ADA-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.08399565915696695,\n \"min\": 0.08362553819611086,\n \"max\": 0.3659083337012825,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.08362553819611086,\n 0.14998516163196035,\n 0.2047069631024427\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BNB-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05020004647894999,\n \"min\": 0.046898875545741514,\n \"max\": 0.2308336523892049,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.046898875545741514,\n 0.2308336523892049,\n 0.10891574953326724\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BTC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.04740882944655909,\n \"min\": 0.05494028218787688,\n \"max\": 0.2215314271485503,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.05494028218787688,\n 0.122377933753199,\n 0.1271004200389094\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"DOT-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.09244576902400627,\n \"min\": 0.08592093186029039,\n \"max\": 0.38541925039220976,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.08592093186029039,\n 0.15046379153531964,\n 0.1928641592350875\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ETH-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05794804124952129,\n \"min\": 0.06328236381571051,\n \"max\": 0.2592647482722747,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.06328236381571051,\n 0.13887388492595099,\n 0.16000095558799182\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"LTC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05905788884342094,\n \"min\": 0.055658596533961685,\n \"max\": 0.2701762101903239,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.055658596533961685,\n 0.10891574953326724,\n 0.2701762101903239\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"MATIC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0931143715716287,\n \"min\": 0.07543475955857806,\n \"max\": 0.41468483972877146,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.07543475955857806,\n 0.17351366843631816,\n 0.19094304224077283\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"SOL-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.13598906639151898,\n \"min\": 0.09537234646176183,\n \"max\": 0.5937402669570883,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.09537234646176183,\n 0.1717001397491843,\n 0.1915168174066942\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"TRX-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.018435705985375535,\n \"min\": 0.046898875545741514,\n \"max\": 0.09843309328469316,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.09843309328469316,\n 0.046898875545741514,\n 0.055658596533961685\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"XRP-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05963845253060871,\n \"min\": 0.05751300817149977,\n \"max\": 0.2676166222951364,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.05751300817149977,\n 0.09348869771452553,\n 0.1581484240854997\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 6
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Calculate the efficient frontier using the Critical Line Algorithm"
+ ],
+ "metadata": {
+ "id": "3IsFJL2x9qHV"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Create a Critical Line Algorithm (CLA) object using the calculated expected returns and covariance matrix.\n",
+ "cla = CLA(portfolio_expected_returns, covariance)\n",
+ "\n",
+ "# Calculate the efficient frontier, obtaining the returns, volatility, and weights for various portfolios.\n",
+ "(returns, volatility, weights) = cla.efficient_frontier()"
+ ],
+ "metadata": {
+ "id": "NarHAjA25b61"
+ },
+ "execution_count": 7,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Visualize the efficient frontier"
+ ],
+ "metadata": {
+ "id": "AaQTTEhZ70e7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "plt.figure(figsize=(10,5))\n",
+ "plt.scatter(volatility, returns, label='Portfolios on efficient frontier')\n",
+ "plt.legend()\n",
+ "plt.ylabel('Expected Reward')\n",
+ "plt.xlabel('Volatiity')\n",
+ "plt.show()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 465
+ },
+ "id": "Kt1n-3HQ1gj7",
+ "outputId": "cea126b2-e715-4995-bbdf-e201a35d0cfd"
+ },
+ "execution_count": 8,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAHACAYAAACVhTgAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABPGklEQVR4nO3de1yUdd7/8fcFykGFUUwEFFfTLAnP3hbaydQ8tNx616528Gy1mh2t3XK3JMw03fKufpWt5qFSsyyzLBc1FQ+kWSkmWpqGYTZ4okAwUGfm9wfL3CLgzOAc4fV8PObxcC6+18xn8Mp48/1e349hs9lsAgAAAABUKcjXBQAAAACAvyM4AQAAAIADBCcAAAAAcIDgBAAAAAAOEJwAAAAAwAGCEwAAAAA4QHACAAAAAAcITgAAAADgQB1fF+BtVqtVv/zyiyIiImQYhq/LAQAAAOAjNptNp06dUlxcnIKCLj6nVOuC0y+//KL4+HhflwEAAADATxw+fFjNmze/6JhaF5wiIiIklX5zIiMjfVwNAAAAAF8pKChQfHy8PSNcTK0LTmXL8yIjIwlOAAAAAJy6hYfNIQAAAADAAYITAAAAADhAcAIAAAAAB2rdPU7OsNlsOnfunCwWi69LAeAhwcHBqlOnDm0JAACAUwhOFzhz5ozMZrNOnz7t61IAeFi9evUUGxurkJAQX5cCAAD8HMHpPFarVdnZ2QoODlZcXJxCQkL4bTRQA9lsNp05c0bHjx9Xdna2rrjiCodN7wAAQO1GcDrPmTNnZLVaFR8fr3r16vm6HAAeFB4errp16+qnn37SmTNnFBYW5uuSAACAH+NXrJXgN89A7cB/6wAAwFn81AAAAAAADrBUDwAAAIBXZB8rUv+XN6rEYlNosKG0h29Uq+j6vi7LKcw4oVq+//57XXvttQoLC1OnTp2cOmfUqFEaPHiw/flNN92kRx55xCP1+ZLNZtN9992nqKgoGYahzMzMSo+58vnT09NlGIZ+++03j9ZelYyMDLVv315169Yt93foTYZhaMWKFT55bwAAcOkun/SZes1KV4nFJkkqsdjUa1a6Lp/0mY8rcw4zTjXEqFGj9NZbb0mS6tatqxYtWmjEiBH6+9//rjp1qv/XPGrUKP32228VfmBNSUlR/fr1tW/fPjVo0KBar718+XLVrVu32rX5q7S0NC1cuFDp6em6/PLLddlll1V6zJXP36NHD5nNZplMJrfVeejQIbVq1Uo7d+50GH4nTpyoTp066d///ne1/76d9cwzz2jFihXKzMwsd9xsNqtRo0YefW8AAOAZl0/6TFZb5V+z2kq//uP0W71blIsITh5isdq0PTtPx04VKzoiTN1bRSk4yLNbm/fv318LFixQSUmJVq1apQkTJqhu3bqaNGmSy69lsVguuhX7wYMHdeutt+oPf/hDteuNioqq9rn+7ODBg4qNjVWPHj0uesyVzx8SEqKYmBi31umKgwcPaty4cWrevHmlX7fZbLJYLJcU0h251M9/5swZ+jUBAOAD2ceKqgxNZay20nH+vGyPpXoekJZl1nUz1uvOudv08NJM3Tl3m66bsV5pWWaPvm9oaKhiYmL0hz/8QePHj1efPn30ySefSJJ+/fVXjRgxQo0aNVK9evU0YMAA/fDDD/ZzFy5cqIYNG+qTTz5RQkKCQkNDNWbMGL311lv6+OOPZRiGDMOwLxn75ptvNGXKFBmGoWeeeUaStHv3bt18880KDw9X48aNdd9996mwsLDKei9cquaoxp9++knJyclq1KiR6tevr6uvvlqrVq2q8vWd/cyrV69Wu3bt1KBBA/Xv319m88X/nrKysjRgwAA1aNBATZs21fDhw3XixAlJpTN0Dz74oHJycmQYhlq2bFnpsco+f0lJiZ544gnFx8crNDRUbdq00bx58yRVvlRvy5Ytuv766xUeHq74+Hg99NBDKioqsn+9ZcuWmjZtmsaMGaOIiAi1aNFCc+bMsX+9VatWkqTOnTvLMAzddNNNFT7roUOHZBiGTp48qTFjxsgwDPvMmWEY+ve//62uXbsqNDRUW7ZsUUlJiR566CFFR0crLCxM1113nb766iv765Wdt27dOnXr1k316tVTjx49tG/fPvvfSWpqqnbt2mW/5hYuXCip4lK9w4cPa8iQIWrYsKGioqI0aNAgHTp0yP71sqWhzz33nOLi4nTllVde9O8VAAB4Rv+XN7p1nK8QnNwsLcus8Yt2yJxfXO54bn6xxi/a4fHwdL7w8HCdOXNGUukPkV9//bU++eQTbd26VTabTQMHDtTZs2ft40+fPq0ZM2bozTff1J49e/TKK69oyJAh9jBhNpvtS8auvvpqPfbYYzKbzXr88cdVVFSkfv36qVGjRvrqq6+0bNkyff7553rggQecrtdRjRMmTFBJSYk2bdqk3bt3a8aMGRddNubsZ37hhRf0zjvvaNOmTcrJydHjjz9e5Wv+9ttvuvnmm9W5c2d9/fXXSktL09GjRzVkyBBJ0ssvv6wpU6aoefPmMpvN+uqrryo9VpkRI0bo3Xff1SuvvKLvvvtO//rXv6r8fAcPHlT//v11++2369tvv9V7772nLVu2VPh+v/jii+rWrZt27typ+++/X+PHj7eHlO3bt0uSPv/8c5nNZi1fvrzC+8THx8tsNisyMlIvvfSSzGazhg4dav/6k08+qeeff17fffedOnTooL/97W/68MMP9dZbb2nHjh1q06aN+vXrp7y8vHKv+49//EMvvviivv76a9WpU0djxoyRJA0dOlSPPfaYrr76avs1d/77lTl79qz69euniIgIbd68WRkZGfbgW3bNS9K6deu0b98+rV27Vp9++mml30sAAOBZZfc0uWucr7BUz40sVptSV+5VZX/lNkmGpNSVe9U3Icajy/ZsNpvWrVun1atX68EHH9QPP/ygTz75RBkZGfalYosXL1Z8fLxWrFihP//5z5JKfxh9/fXX1bFjR/trhYeHq6SkpNwyqZiYGNWpU0cNGjSwH587d66Ki4v19ttvq3790inWV199VcnJyZoxY4aaNm160ZqdqTEnJ0e333672rdvL0m6/PLLL+n1yj7zG2+8odatW0uSHnjgAU2ZMqXK13311VfVuXNnTZs2zX5s/vz5io+P1/79+9W2bVtFREQoODi43PessmPn279/v95//32tXbtWffr0cfj5pk+frrvvvts+Y3XFFVfolVde0Y033qjZs2fbm7kOHDhQ999/vyTpiSee0P/+7/9qw4YNuvLKK9WkSRNJUuPGjausq6xmwzBkMpkqjJsyZYr69u0rSSoqKtLs2bO1cOFCDRgwQFLpdbF27VrNmzdPf/3rX+3nPffcc7rxxhsllYavW2+9VcXFxQoPD1eDBg1Up06diy7Ne++992S1WvXmm2/al5QuWLBADRs2VHp6um655RZJUv369fXmm2+yRA8AAB8KDTacCkWhwZ69reVSMePkRtuz8yrMNJ3PJsmcX6zt2XlVjrkUn376qRo0aKCwsDANGDBAQ4cO1TPPPKPvvvtOderU0TXXXGMf27hxY1155ZX67rvv7MdCQkLUoUOHar33d999p44dO9pD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x6pzLX3yySdKSkrShAkT1LRpUyUmJmratGmyWCzeKht+5lJ/RpKkefPm6Y477lD9+vU9VSZqmDq+LgBVO3HihCwWi5o2bVrueNOmTfX9999XeV5+fr6aNWumkpISBQcH6/XXX1ffvn09XS78VHWuoy1btmjevHnKzMz0QoUIBNW5jq688krNnz9fHTp0UH5+vl544QX16NFDe/bsUfPmzb1RNvxQda6lH3/8UevXr9fdd9+tVatW6cCBA7r//vt19uxZpaSkeKNs+Jnq/oxUZvv27crKytK8efM8VSJqIIJTDRQREaHMzEwVFhZq3bp1mjhxoi6//HLddNNNvi4NAeDUqVMaPny45s6dq8suu8zX5SCAJSUlKSkpyf68R48eateunf71r3/p2Wef9WFlCDRWq1XR0dGaM2eOgoOD1bVrVx05ckT//Oc/CU6olnnz5ql9+/bq3r27r0tBACE4+bHLLrtMwcHBOnr0aLnjR48eVUxMTJXnBQUFqU2bNpKkTp066bvvvtP06dMJTrWUq9fRwYMHdejQISUnJ9uPWa1WSVKdOnW0b98+tW7d2rNFw+9U99+j89WtW1edO3fWgQMHPFEiAkR1rqXY2FjVrVtXwcHB9mPt2rVTbm6uzpw5o5CQEI/WDP9zKf8mFRUVaenSpZoyZYonS0QNxD1OfiwkJERdu3bVunXr7MesVqvWrVtX7re4jlitVpWUlHiiRAQAV6+jq666Srt371ZmZqb98d///d/q1auXMjMzFR8f783y4Sfc8e+RxWLR7t27FRsb66kyEQCqcy317NlTBw4csP8SR5L279+v2NhYQlMtdSn/Ji1btkwlJSUaNmyYp8tETePr3SlwcUuXLrWFhobaFi5caNu7d6/tvvvuszVs2NCWm5trs9lstuHDh9uefPJJ+/hp06bZ1qxZYzt48KBt7969thdeeMFWp04d29y5c331EeAHXL2OLsSuerDZXL+OUlNTbatXr7YdPHjQ9s0339juuOMOW1hYmG3Pnj2++gjwE65eSzk5ObaIiAjbAw88YNu3b5/t008/tUVHR9umTp3qq48AP1Dd/7ddd911tqFDh3q7XNQALNXzc0OHDtXx48c1efJk5ebmqlOnTkpLS7PfDJmTk6OgoP+bOCwqKtL999+vn3/+WeHh4brqqqu0aNEiDR061FcfAX7A1esIqIyr19Gvv/6qe++9V7m5uWrUqJG6du2qL774QgkJCb76CPATrl5L8fHxWr16tR599FF16NBBzZo108MPP6wnnnjCVx8BfqA6/2/bt2+ftmzZojVr1viiZAQ4w2az2XxdBAAAAAD4M37FDAAAAAAOEJwAAAAAwAGCEwAAAAA4QHACAAAAAAcITgAAAADgAMEJAAAAABwgOAEAAACAAwQnAECN0rJlS7300ktufx3DMLRixYpLfl0AQGAiOAEA/EZycrL69+9f6dc2b94swzD07bffuvU9Fy5cqIYNG1Y4/tVXX+m+++6zPzebzRowYIAk6dChQzIMQ5mZmW6tBQDgvwhOAAC/MXbsWK1du1Y///xzha8tWLBA3bp1U4cOHbxSS5MmTVSvXj3785iYGIWGhnrlvQEA/ofgBADwG3/84x/VpEkTLVy4sNzxwsJCLVu2TGPHjtWHH36oq6++WqGhoWrZsqVefPHFi77mrFmz1L59e9WvX1/x8fG6//77VVhYKElKT0/X6NGjlZ+fL8MwZBiGnnnmGUkXX6rXqlUrSVLnzp1lGIZuuukmbdq0SXXr1lVubm6593/kkUd0/fXXV/+bAgDwCwQnAIDfqFOnjkaMGKGFCxfKZrPZjy9btkwWi0Xt2rXTkCFDdMcdd2j37t165pln9PTTT1cIWucLCgrSK6+8oj179uitt97S+vXr9be//U2S1KNHD7300kuKjIyU2WyW2WzW448/7rDO7du3S5I+//xzmc1mLV++XDfccIMuv/xyvfPOO/ZxZ8+e1eLFizVmzJhqfkcAAP6C4AQA8CtjxozRwYMHtXHjRvuxBQsW6Pbbb9ecOXPUu3dvPf3002rbtq1GjRqlBx54QP/85z+rfL1HHnlEvXr1UsuWLXXzzTdr6tSpev/99yVJISEhMplMMgxDMTExiomJUYMGDRzW2KRJE0lS48aNFRMTo6ioKEmlSw0XLFhgH7dy5UoVFxdryJAh1fpeAAD8B8EJAOBXrrrqKvXo0UPz58+XJB04cECbN2/W2LFj9d1336lnz57lxvfs2VM//PCDLBZLpa/3+eefq3fv3mrWrJkiIiI0fPhwnTx5UqdPn3Z77aNGjdKBAwe0bds2SaUbTwwZMkT169d3+3sBALyL4AQA8Dtl9zKdOnVKCxYsUOvWrXXjjTe6/DqHDh3SH//4R3Xo0EEffvihvvnmG7322muSpDNnzri7bEVHRys5OVkLFizQ0aNH9e9//5tlegBQQxCcAAB+Z8iQIQoKCtKSJUv09ttva8yYMTIMQ+3atVNGRka5sRkZGWrbtq2Cg4MrvM4333wjq9WqF198Uddee63atm2rX375pdyYkJCQKmerqhISEiJJlZ53zz336L333tOcOXPUunXrCjNkAIDARHACAPidBg0aaOjQoZo0aZLMZrNGjRolSXrssce0bt06Pfvss9q/f7/eeustvfrqq1Vu6NCmTRudPXtW/+///T/9+OOPeuedd/TGG2+UG9OyZUsVFhZq3bp1OnHihFNL+KKjoxUeHq60tDQdPXpU+fn59q/169dPkZGRmjp1qkaPHl39bwIAwK8QnAAAfmns2LH69ddf1a9fP8XFxUmSunTpovfff19Lly5VYmKiJk+erClTptiD1YU6duyoWbNmacaMGUpMTNTixYs1ffr0cmN69OihcePGaejQoWrSpIlmzpzpsLY6derolVde0b/+9S/FxcVp0KBB9q8FBQVp1KhRslgsGjFiRPW/AQAAv2LYzt/vFQAAXLKxY8fq+PHj+uSTT3xdCgDATer4ugAAAGqK/Px87d69W0uWLCE0AUANQ3ACAMBNBg0apO3bt2vcuHHq27evr8sBALgRS/UAAAAAwAE2hwAAAAAABwhOAAAAAOAAwQkAAAAAHCA4AQAAAIADBCcAAAAAcIDgBAAAAAAOEJwAAAAAwAGCEwAAAAA4QHACAAAAAAf+PxQgu/yncpVBAAAAAElFTkSuQmCC\n"
+ },
+ "metadata": {}
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Get the weights (in perentage) of the portfolio with the lowest volatility"
+ ],
+ "metadata": {
+ "id": "v4jE07br-DEJ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "\n",
+ "optimized_weight=weights[volatility.index(min(volatility))]\n",
+ "pie_df=pd.DataFrame(optimized_weight*100, index=prices.columns, columns=['weights'])\n",
+ "pie_df= pie_df.sort_values(by=['weights'], ascending=False)\n",
+ "pie_df"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 394
+ },
+ "id": "FzvioR9k11Tx",
+ "outputId": "16dd12f8-ee60-44ab-eaa0-1c4dc2482a01"
+ },
+ "execution_count": 9,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " weights\n",
+ "symbol \n",
+ "TRX-USD 67.715856\n",
+ "BNB-USD 13.161715\n",
+ "BTC-USD 9.982129\n",
+ "XRP-USD 5.275661\n",
+ "LTC-USD 3.864639\n",
+ "ADA-USD 0.000000\n",
+ "DOT-USD 0.000000\n",
+ "ETH-USD 0.000000\n",
+ "MATIC-USD 0.000000\n",
+ "SOL-USD 0.000000"
+ ],
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " weights | \n",
+ "
\n",
+ " \n",
+ " symbol | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " TRX-USD | \n",
+ " 67.715856 | \n",
+ "
\n",
+ " \n",
+ " BNB-USD | \n",
+ " 13.161715 | \n",
+ "
\n",
+ " \n",
+ " BTC-USD | \n",
+ " 9.982129 | \n",
+ "
\n",
+ " \n",
+ " XRP-USD | \n",
+ " 5.275661 | \n",
+ "
\n",
+ " \n",
+ " LTC-USD | \n",
+ " 3.864639 | \n",
+ "
\n",
+ " \n",
+ " ADA-USD | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " DOT-USD | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " ETH-USD | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " MATIC-USD | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " SOL-USD | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "pie_df",
+ "summary": "{\n \"name\": \"pie_df\",\n \"rows\": 10,\n \"fields\": [\n {\n \"column\": \"symbol\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"MATIC-USD\",\n \"BNB-USD\",\n \"ADA-USD\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"weights\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 20.819539048319967,\n \"min\": 0.0,\n \"max\": 67.71585619449834,\n \"num_unique_values\": 6,\n \"samples\": [\n 67.71585619449834,\n 13.161715147317723,\n 0.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 9
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Display Pie Chart of the weights"
+ ],
+ "metadata": {
+ "id": "WSHUOb_O_12C"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "pie_df= pie_df.query('weights != 0.000000')\n",
+ "\n",
+ "fig, ax = plt.subplots()\n",
+ "ax.pie(pie_df.weights, labels=pie_df.index.values.tolist(), autopct='%1.1f%%', radius=2)\n",
+ "plt.show()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 664
+ },
+ "id": "Ad1Ncn3N2iRj",
+ "outputId": "3f635343-2f6d-4966-e15f-13ac9e15bb40"
+ },
+ "execution_count": 10,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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4Z577sEff/zRqveVyWRISkpCZmamTTOSY2LBJavrFuGDr+YPwhtX90KEr4fdn/8Jnx+4ektkR9qGakzwihcdw2YkSLg86XKsvGwlxseMFx3HqkaNGoW0tDSkpaVhx44dmDBhAi655BJkZWVd9H1bcwjT5s2bmwq0TqfDp59+2qZ8w4cPR0ZGBtavX4/LL78chw4dwrBhw/D000+36v0tFgskyQFeViS7Y8Elm5mSGo71943AwrGJ0Cjt809tpH8ZwnN/sctzEdFfZhTlio5gE6lBqfj80s/x+KDH4a3yFh3H6jw9PZGQkICEhAT069cP77//PmpqavDee+9d9H2TkpJw9OjRC96nb9++TQU6LS0NU6dOBQB4e3ujoqLinPuXl5efs7VBqVRi2LBheOCBB7BmzRo89dRTePrpp6HX6y/43CaTCSdOnEBsbOxFPxZyPSy4ZFMapRwLxyZhw30jMblHmM2f7yn/nyBxdCiR3fXM3otYzwjRMawmWBuMZ4c9i48v+RhdA7uKjmM3kiRBJpOhrq7uove95pprcPz48WZHdv3JYrGgoqICHh4eTQU6ISEBXl6Ng4KSk5OxZ8+ec95vz549SEq68ICMLl26wGg0or7+woNGPvroI5SVlWHmzJkX/VjI9bDgkl2E+3rgzWt64+v5g9AtwjarIEP9KxCV85NNHpuILm6GzFd0hA5TyVSY130evr/se0yOm+zyL283NDQgPz8f+fn5OHLkCO68805UV1djypQpF33fWbNm4corr8TVV1+NZ555Brt27UJWVhZWr16NsWPHYuPG859DvmDBAhw/fhx33XUX9u/fj2PHjuHll1/G559/jvvuu6/pfiNHjsS7776L3bt3IzMzEz/++CMefvhhjBo1Ct7ef30tqa2tRX5+Ps6cOYNt27bhgQcewPz587FgwQKMGjWqY39I5JQ4yYzszmy24Ktd2XhxzTEUV1/4Jaa2+DXhS8ScOXclgYjso0QXhLEhXjCajaKjtMvoqNH4V79/IcorSnQUu5g7dy4++uijpl97eXkhJSUFDzzwwDmrniNHjkTPnj3x6quvNrvdbDZj8eLFWLJkCQ4dOgSFQoHExETMnj0b8+bNg4fH+a/D2LlzJx555BGkpaVBr9cjJSUFDz74IC677LKm+zz77LP4/vvvcezYMdTW1iI8PByTJ0/GY4891nTS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\n"
+ },
+ "metadata": {}
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [],
+ "metadata": {
+ "id": "FgllhXez_sr3"
+ },
+ "execution_count": 10,
+ "outputs": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "obb",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python",
+ "version": "3.9.19"
+ },
+ "colab": {
+ "provenance": []
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
From bd8e31e358c7a8af09fad0e59fe26de4cf48cea2 Mon Sep 17 00:00:00 2001
From: Ambrose Ikpele <68953964+ambroseikpele@users.noreply.github.com>
Date: Wed, 2 Oct 2024 01:42:15 +0100
Subject: [PATCH 2/2] Updated file : Updated Notebook for Portfolio
Optimization Using Modern Portfolio Theory (Hacktoberfest)
Addressed review comments
---
...timizationUsingModernPortfolioTheory.ipynb | 1159 ++++++++++++-----
1 file changed, 844 insertions(+), 315 deletions(-)
diff --git a/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb b/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb
index 08732cb16501..ae2e21fd1502 100644
--- a/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb
+++ b/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb
@@ -19,6 +19,24 @@
"[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/OpenBB-Finance/OpenBB/blob/develop/examples/[Notebook_Name].ipynb)"
]
},
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Introduction"
+ ],
+ "metadata": {
+ "id": "-Ih2c6xRxklu"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Modern Portfolio Theory (MPT) is a mathematical framework for constructing a portfolio of assets to maximize expected return based on a given level of risk. In this notebook, we will implement MPT to construct an optimal portfolio with minimum volatility using a selection of the top cryptocurrencies as our assets. The notebook will fetch historical price data for these assets, calculate the portfolio's expected return and risk, and visualize the optimal portfolio based on risk-return trade-offs."
+ ],
+ "metadata": {
+ "id": "mWd0TC0DxZm-"
+ }
+ },
{
"cell_type": "markdown",
"source": [
@@ -37,7 +55,7 @@
"metadata": {
"id": "iexQsZ1XvYa8"
},
- "execution_count": null,
+ "execution_count": 17,
"outputs": []
},
{
@@ -70,12 +88,21 @@
{
"cell_type": "markdown",
"source": [
- "Fetch the daily data of the top crypto currencies for a period of one year using openbb"
+ "### Define the assets and fetch the data"
],
"metadata": {
"id": "w3XB7egmzlmI"
}
},
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Fetch the daily data of the top crypto currencies for a period of one year using openbb"
+ ],
+ "metadata": {
+ "id": "SyF2ROKDyKdJ"
+ }
+ },
{
"cell_type": "code",
"source": [
@@ -90,7 +117,7 @@
"base_uri": "https://localhost:8080/",
"height": 455
},
- "outputId": "8ab3c023-43e8-4d81-f5ef-22451d3604bb"
+ "outputId": "fd4a3544-32f9-49c1-d7ad-bca9efa88baa"
},
"execution_count": 2,
"outputs": [
@@ -106,11 +133,11 @@
"2023-10-01 4.105477 4.279937 4.103880 4.261009 \n",
"2023-10-01 1671.161499 1750.595703 1670.082153 1733.810425 \n",
"... ... ... ... ... \n",
- "2024-10-01 66.820854 68.483223 66.786285 67.686295 \n",
- "2024-10-01 0.395941 0.404462 0.394638 0.399719 \n",
- "2024-10-01 152.604584 157.199478 151.796982 155.045334 \n",
- "2024-10-01 0.155929 0.156981 0.155710 0.156684 \n",
- "2024-10-01 0.611519 0.633387 0.611519 0.627602 \n",
+ "2024-09-30 69.314308 69.321297 66.454277 66.820450 \n",
+ "2024-09-30 0.421419 0.421627 0.394318 0.395917 \n",
+ "2024-09-30 158.632416 159.508926 152.019836 152.618469 \n",
+ "2024-09-30 0.156474 0.156746 0.154867 0.155915 \n",
+ "2024-09-30 0.641945 0.652411 0.610951 0.611492 \n",
"\n",
" volume symbol \n",
"date \n",
@@ -120,17 +147,17 @@
"2023-10-01 8.294334e+07 DOT-USD \n",
"2023-10-01 5.054880e+09 ETH-USD \n",
"... ... ... \n",
- "2024-10-01 2.475363e+08 LTC-USD \n",
- "2024-10-01 3.507427e+07 MATIC-USD \n",
- "2024-10-01 1.949461e+09 SOL-USD \n",
- "2024-10-01 3.093434e+08 TRX-USD \n",
- "2024-10-01 1.424177e+09 XRP-USD \n",
+ "2024-09-30 3.003743e+08 LTC-USD \n",
+ "2024-09-30 3.730373e+07 MATIC-USD \n",
+ "2024-09-30 2.376781e+09 SOL-USD \n",
+ "2024-09-30 3.565544e+08 TRX-USD \n",
+ "2024-09-30 2.051369e+09 XRP-USD \n",
"\n",
- "[3670 rows x 6 columns]"
+ "[3660 rows x 6 columns]"
],
"text/html": [
"\n",
- " \n",
+ "
\n",
"
\n",
"\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " returns | \n",
+ " volatility | \n",
+ " weights | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 2.288214 | \n",
+ " 0.771558 | \n",
+ " [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.... | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 2.288214 | \n",
+ " 0.771558 | \n",
+ " [[0.0], [8.540177112501205e-18], [0.0], [0.0],... | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 2.288214 | \n",
+ " 0.771558 | \n",
+ " [[0.0], [1.708035422500241e-17], [0.0], [0.0],... | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 2.288214 | \n",
+ " 0.771558 | \n",
+ " [[0.0], [2.5620531337503614e-17], [0.0], [0.0]... | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 2.288214 | \n",
+ " 0.771558 | \n",
+ " [[0.0], [3.416070845000482e-17], [0.0], [0.0],... | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 74 | \n",
+ " 0.699686 | \n",
+ " 0.289411 | \n",
+ " [[0.0], [0.14064237710852637], [0.110488877515... | \n",
+ "
\n",
+ " \n",
+ " 75 | \n",
+ " 0.695988 | \n",
+ " 0.289372 | \n",
+ " [[0.0], [0.1384244599412712], [0.1077026598376... | \n",
+ "
\n",
+ " \n",
+ " 76 | \n",
+ " 0.692291 | \n",
+ " 0.289344 | \n",
+ " [[0.0], [0.136206542774016], [0.10491644215937... | \n",
+ "
\n",
+ " \n",
+ " 77 | \n",
+ " 0.688593 | \n",
+ " 0.289328 | \n",
+ " [[0.0], [0.1339886256067608], [0.1021302244811... | \n",
+ "
\n",
+ " \n",
+ " 78 | \n",
+ " 0.684895 | \n",
+ " 0.289322 | \n",
+ " [[0.0], [0.1317707084395056], [0.0993440068028... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
79 rows × 3 columns
\n",
+ "
\n",
+ "
\n",
+ "
\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "efficient_frontier_portfolios",
+ "summary": "{\n \"name\": \"efficient_frontier_portfolios\",\n \"rows\": 79,\n \"fields\": [\n {\n \"column\": \"returns\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": 0.6848950166508636,\n \"max\": 2.2882141236911924,\n \"num_unique_values\": 66,\n \"samples\": [\n 0.72557090559056,\n 0.6959884409071444,\n 2.2882141236911924\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volatility\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": 0.2893221746578987,\n \"max\": 0.7715581124191021,\n \"num_unique_values\": 66,\n \"samples\": [\n 0.28999332370675096,\n 0.2893721484198184,\n 0.7715581124191021\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"weights\",\n \"properties\": {\n \"dtype\": \"object\",\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 7
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Visualize the efficient frontier"
],
"metadata": {
"id": "AaQTTEhZ70e7"
@@ -1770,7 +2298,7 @@
"height": 465
},
"id": "Kt1n-3HQ1gj7",
- "outputId": "cea126b2-e715-4995-bbdf-e201a35d0cfd"
+ "outputId": "686d5698-8806-4c7e-ba07-46b26d76add0"
},
"execution_count": 8,
"outputs": [
@@ -1780,7 +2308,7 @@
"text/plain": [
"