diff --git a/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb b/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb new file mode 100644 index 000000000000..ae2e21fd1502 --- /dev/null +++ b/examples/portfolioOptimizationUsingModernPortfolioTheory.ipynb @@ -0,0 +1,2777 @@ +{ + "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": [ + "### 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": [ + "Install external packages" + ], + "metadata": { + "id": "_rMPfEH2KJjA" + } + }, + { + "cell_type": "code", + "source": [ + "!pip install openbb\n", + "!pip install PyPortfolioOpt" + ], + "metadata": { + "id": "iexQsZ1XvYa8" + }, + "execution_count": 17, + "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": [ + "### 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": [ + "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": "fd4a3544-32f9-49c1-d7ad-bca9efa88baa" + }, + "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-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", + "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-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", + "[3660 rows x 6 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
openhighlowclosevolumesymbol
date
2023-10-010.2540430.2674710.2540190.2658951.650882e+08ADA-USD
2023-10-01214.800323219.133835213.506516218.0471343.874081e+08BNB-USD
2023-10-0126967.39648428047.23828126965.09375027983.7500009.503917e+09BTC-USD
2023-10-014.1054774.2799374.1038804.2610098.294334e+07DOT-USD
2023-10-011671.1614991750.5957031670.0821531733.8104255.054880e+09ETH-USD
.....................
2024-09-3069.31430869.32129766.45427766.8204503.003743e+08LTC-USD
2024-09-300.4214190.4216270.3943180.3959173.730373e+07MATIC-USD
2024-09-30158.632416159.508926152.019836152.6184692.376781e+09SOL-USD
2024-09-300.1564740.1567460.1548670.1559153.565544e+08TRX-USD
2024-09-300.6419450.6524110.6109510.6114922.051369e+09XRP-USD
\n", + "

3660 rows × 6 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "ohlc_data", + "summary": "{\n \"name\": \"ohlc_data\",\n \"rows\": 3660,\n \"fields\": [\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2023-10-01\",\n \"max\": \"2024-09-30\",\n \"num_unique_values\": 366,\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\": 16639.836555374353,\n \"min\": 0.08486499637365341,\n \"max\": 73079.375,\n \"num_unique_values\": 3659,\n \"samples\": [\n 227.13491821289062,\n 0.28950101137161255,\n 0.4867730140686035\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"high\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16973.343411209262,\n \"min\": 0.08571500331163406,\n \"max\": 73750.0703125,\n \"num_unique_values\": 3660,\n \"samples\": [\n 229.19149780273438,\n 0.29728201031684875,\n 0.4899919927120209\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16300.377275687548,\n \"min\": 0.0847959965467453,\n \"max\": 71334.09375,\n \"num_unique_values\": 3655,\n \"samples\": [\n 2419.36279296875,\n 177.46127319335938,\n 0.5218260288238525\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16663.48894012965,\n \"min\": 0.08486700057983398,\n \"max\": 73083.5,\n \"num_unique_values\": 3655,\n \"samples\": [\n 2487.515625,\n 1.0434010028839111,\n 0.5468699932098389\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 10083764369.937248,\n \"min\": 33682820.0,\n \"max\": 108991085584.0,\n \"num_unique_values\": 3660,\n \"samples\": [\n 282899321.0,\n 146280893.0,\n 385469444.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": "1bced258-fac0-4be7-c433-e6c08e40afd6" + }, + "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-26 0.401882 596.776917 65181.019531 4.816284 2632.199951 \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", + "\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-26 68.518311 0.424973 155.576096 0.153201 0.590421 \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", + "\n", + "[366 rows x 10 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
symbolADA-USDBNB-USDBTC-USDDOT-USDETH-USDLTC-USDMATIC-USDSOL-USDTRX-USDXRP-USD
date
2023-10-010.265895218.04713427983.7500004.2610091733.81042568.2333150.56853223.8364870.0901180.524204
2023-10-020.259513214.75793527530.7851564.1237621663.62756366.0111240.54751323.3717000.0875660.512832
2023-10-030.261028213.43594427429.9785164.0742471656.68566965.4935150.56630823.5526940.0908580.538387
2023-10-040.259315213.41308627799.3945314.0473161647.83813564.4520650.56336923.1447870.0889990.532931
2023-10-050.260149210.67967227415.9121094.0227381611.47644064.8587650.54601822.6941410.0882760.523366
.................................
2024-09-260.401882596.77691765181.0195314.8162842632.19995168.5183110.424973155.5760960.1532010.590421
2024-09-270.402328607.86700465790.6640624.8920552695.90063571.1882020.433774157.7499390.1551700.588927
2024-09-280.401052601.56720065887.6484384.8058962677.53906270.0039670.423559156.9124300.1550680.614801
2024-09-290.397597596.41119465635.3046884.7684282659.34692469.3144230.421419158.6291660.1564740.641947
2024-09-300.373214567.26007163329.5000004.4370862603.06274466.8204500.395917152.6184690.1559150.611492
\n", + "

366 rows × 10 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\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\": 366,\n \"fields\": [\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2023-10-01\",\n \"max\": \"2024-09-30\",\n \"num_unique_values\": 366,\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.12241864696655712,\n \"min\": 0.2434529960155487,\n \"max\": 0.7741900086402893,\n \"num_unique_values\": 365,\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.5214407182818,\n \"min\": 205.2294158935547,\n \"max\": 710.4640502929688,\n \"num_unique_values\": 366,\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\": 13053.33386869586,\n \"min\": 26756.798828125,\n \"max\": 73083.5,\n \"num_unique_values\": 366,\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.71868220447839,\n \"min\": 3.6488780975341797,\n \"max\": 11.542901992797852,\n \"num_unique_values\": 366,\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\": 645.7801836761455,\n \"min\": 1539.6124267578125,\n \"max\": 4066.445068359375,\n \"num_unique_values\": 366,\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.82303289832029,\n \"min\": 55.983909606933594,\n \"max\": 109.25897216796875,\n \"num_unique_values\": 366,\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.20641913692628033,\n \"min\": 0.3659299910068512,\n \"max\": 1.2714049816131592,\n \"num_unique_values\": 366,\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.98292860601651,\n \"min\": 21.300268173217773,\n \"max\": 202.87413024902344,\n \"num_unique_values\": 366,\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.018051530692952913,\n \"min\": 0.08486700057983398,\n \"max\": 0.16655699908733368,\n \"num_unique_values\": 362,\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.05616593942864053,\n \"min\": 0.4198229908943176,\n \"max\": 0.7180359959602356,\n \"num_unique_values\": 366,\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 Portfolio's Expected Returns" + ], + "metadata": { + "id": "PbL5KdtRyn9C" + } + }, + { + "cell_type": "markdown", + "source": [ + "The expected returns serve as the basis for evaluating different asset combinations and determining the optimal portfolio allocation. In the next steps, these returns will be used along with the covariance matrix to analyze risk-return profiles." + ], + "metadata": { + "id": "i-IM_cAUywwL" + } + }, + { + "cell_type": "markdown", + "source": [ + "$$return=\\frac{Σ\\space r_{i}}{N}⋅365$$\n", + "\n", + "where $r_i$ is the daily return of a particular asset and $N$ is the number of days in the data, we multiply by 365 so as to annualize the result" + ], + "metadata": { + "id": "Ktrk_3fHbmS2" + } + }, + { + "cell_type": "code", + "source": [ + "# Expected returns of crypto assets using the mean historical return.\n", + "assets_expected_returns = expected_returns.mean_historical_return(prices, frequency=365, compounding=False)\n", + "assets_expected_returns" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 429 + }, + "id": "Mx_MLbe4mxfa", + "outputId": "310d6922-1a13-458e-b5a3-a066f4ddc7f6" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "symbol\n", + "ADA-USD 0.604022\n", + "BNB-USD 1.121563\n", + "BTC-USD 0.952337\n", + "DOT-USD 0.319752\n", + "ETH-USD 0.591286\n", + "LTC-USD 0.173647\n", + "MATIC-USD -0.058596\n", + "SOL-USD 2.288214\n", + "TRX-USD 0.616572\n", + "XRP-USD 0.344980\n", + "dtype: float64" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
symbol
ADA-USD0.604022
BNB-USD1.121563
BTC-USD0.952337
DOT-USD0.319752
ETH-USD0.591286
LTC-USD0.173647
MATIC-USD-0.058596
SOL-USD2.288214
TRX-USD0.616572
XRP-USD0.344980
\n", + "

" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "The frequency parameter indicates the number of trading periods in a year. For crypto daily data, it is set to 365, since crypto can be traded everyday.\n", + "\n", + "The compounding parameter calculate returns using simple or compounded growth. Setting compounding=False results in simple annualized returns. If compounding=True, the function would compute geometric (compounded) returns, which consider reinvested returns over time." + ], + "metadata": { + "id": "eBDVKkQZ2Wx3" + } + }, + { + "cell_type": "markdown", + "source": [ + "### Calculate the Covariance Matrix Using the Ledoit-Wolf Shrinkage Estimator" + ], + "metadata": { + "id": "1gvka-on5JDC" + } + }, + { + "cell_type": "markdown", + "source": [ + "The covariance matrix represents the relationship between the returns of the assets. It measures how returns of one asset(e.g btc) vary in relation to another(e.g eth), which is essential for understanding the overall risk of a portfolio. Assets with high positive covariance tend to move in the same direction, while those with negative covariance move in opposite directions." + ], + "metadata": { + "id": "fT9f1AWN5l1L" + } + }, + { + "cell_type": "markdown", + "source": [ + "The formula below uses an example of btc and eth to express how covariance is calculated:\n", + "\n", + "$$Cov({r_{btc}, r_{eth} })= \\frac{Σ(r_{btc}-\\bar r_{btc})(r_{eth}-\\bar r_{eth})}{N}$$\n", + "\n", + "Where $r$ is the daily returns of the assets and $\\bar r$ is the average daily returns of the assets." + ], + "metadata": { + "id": "69Uyh-rPUWD3" + } + }, + { + "cell_type": "code", + "source": [ + "# Covariance matrix of crypto assets using the Ledoit-Wolf shrinkage method.\n", + "covariance = CovarianceShrinkage(prices).ledoit_wolf()\n", + "covariance" + ], + "metadata": { + "id": "S_sH-1sq6bnI", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 394 + }, + "outputId": "c1e9855e-c6c7-4dbd-8f66-50ec26743425" + }, + "execution_count": 5, + "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.366706 0.150286 0.180182 0.304589 0.203891 0.205121 \n", + "BNB-USD 0.150286 0.231405 0.122723 0.150846 0.139246 0.109135 \n", + "BTC-USD 0.180182 0.122723 0.190093 0.176476 0.172781 0.127462 \n", + "DOT-USD 0.304589 0.150846 0.176476 0.386458 0.207296 0.193352 \n", + "ETH-USD 0.203891 0.139246 0.172781 0.207296 0.259972 0.160428 \n", + "LTC-USD 0.205121 0.109135 0.127462 0.193352 0.160428 0.270809 \n", + "MATIC-USD 0.278896 0.173927 0.170640 0.288592 0.225087 0.191384 \n", + "SOL-USD 0.297128 0.172109 0.222148 0.333958 0.232898 0.191960 \n", + "TRX-USD 0.083817 0.047007 0.055094 0.086146 0.063453 0.055784 \n", + "XRP-USD 0.194349 0.093584 0.120736 0.192491 0.133452 0.158367 \n", + "\n", + "symbol MATIC-USD SOL-USD TRX-USD XRP-USD \n", + "symbol \n", + "ADA-USD 0.278896 0.297128 0.083817 0.194349 \n", + "BNB-USD 0.173927 0.172109 0.047007 0.093584 \n", + "BTC-USD 0.170640 0.222148 0.055094 0.120736 \n", + "DOT-USD 0.288592 0.333958 0.086146 0.192491 \n", + "ETH-USD 0.225087 0.232898 0.063453 0.133452 \n", + "LTC-USD 0.191384 0.191960 0.055784 0.158367 \n", + "MATIC-USD 0.415755 0.290945 0.075620 0.181063 \n", + "SOL-USD 0.290945 0.595302 0.095612 0.185187 \n", + "TRX-USD 0.075620 0.095612 0.098694 0.057615 \n", + "XRP-USD 0.181063 0.185187 0.057615 0.267912 " + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
symbolADA-USDBNB-USDBTC-USDDOT-USDETH-USDLTC-USDMATIC-USDSOL-USDTRX-USDXRP-USD
symbol
ADA-USD0.3667060.1502860.1801820.3045890.2038910.2051210.2788960.2971280.0838170.194349
BNB-USD0.1502860.2314050.1227230.1508460.1392460.1091350.1739270.1721090.0470070.093584
BTC-USD0.1801820.1227230.1900930.1764760.1727810.1274620.1706400.2221480.0550940.120736
DOT-USD0.3045890.1508460.1764760.3864580.2072960.1933520.2885920.3339580.0861460.192491
ETH-USD0.2038910.1392460.1727810.2072960.2599720.1604280.2250870.2328980.0634530.133452
LTC-USD0.2051210.1091350.1274620.1933520.1604280.2708090.1913840.1919600.0557840.158367
MATIC-USD0.2788960.1739270.1706400.2885920.2250870.1913840.4157550.2909450.0756200.181063
SOL-USD0.2971280.1721090.2221480.3339580.2328980.1919600.2909450.5953020.0956120.185187
TRX-USD0.0838170.0470070.0550940.0861460.0634530.0557840.0756200.0956120.0986940.057615
XRP-USD0.1943490.0935840.1207360.1924910.1334520.1583670.1810630.1851870.0576150.267912
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \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.08419792941723192,\n \"min\": 0.0838165711742476,\n \"max\": 0.36670604147106206,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.0838165711742476,\n 0.15028626508263157,\n 0.20512138740953018\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BNB-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05033753143602621,\n \"min\": 0.047006792196747846,\n \"max\": 0.2314051405350048,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.047006792196747846,\n 0.2314051405350048,\n 0.1091350550550174\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"BTC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.04753744415710665,\n \"min\": 0.05509418774013776,\n \"max\": 0.22214831696745932,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.05509418774013776,\n 0.12272305327668202,\n 0.1274618190134865\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"DOT-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.09269535390671813,\n \"min\": 0.08614584593812935,\n \"max\": 0.3864581165922623,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.08614584593812935,\n 0.15084590749143012,\n 0.19335241933484426\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"ETH-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05810745048757783,\n \"min\": 0.06345275246548801,\n \"max\": 0.25997209569152796,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.06345275246548801,\n 0.139245809134133,\n 0.16042795625973533\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"LTC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05919478941890474,\n \"min\": 0.05578366873261023,\n \"max\": 0.27080940309104257,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.05578366873261023,\n 0.1091350550550174,\n 0.27080940309104257\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"MATIC-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.09336165890150132,\n \"min\": 0.07561993114423143,\n \"max\": 0.4157545421078801,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.07561993114423143,\n 0.17392703381920863,\n 0.1913835647642417\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"SOL-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.1363595110476115,\n \"min\": 0.09561239112443014,\n \"max\": 0.5953019208397278,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.09561239112443014,\n 0.17210936103624314,\n 0.1919600059080584\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"TRX-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.01848799121692438,\n \"min\": 0.047006792196747846,\n \"max\": 0.09869415860549288,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.09869415860549288,\n 0.047006792196747846,\n 0.05578366873261023\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"XRP-USD\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.05970145542480502,\n \"min\": 0.057614883985101284,\n \"max\": 0.2679123979532293,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.057614883985101284,\n 0.09358410593039336,\n 0.15836736522902278\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + } + }, + "metadata": {}, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "**Ledoit-Wolf Shrinkage**:is a technique used to improve the estimation of covariance matrices, especially when dealing with high-dimensional data (like multiple crypto assets) relative to the number of observations." + ], + "metadata": { + "id": "91CYiL0a6XaY" + } + }, + { + "cell_type": "markdown", + "source": [ + "### Portfolio Optimization using Critical Line Algorithm (CLA)" + ], + "metadata": { + "id": "apy1KgWNPBew" + } + }, + { + "cell_type": "markdown", + "source": [ + "Portfolio risk, also known as portfolio volatility, is determined by calculating the variance of the returns of the assets. The variance is calculated using the below equation:\n", + "\n", + "$$ \\sigma^2= W⋅Cov⋅W^T $$\n", + "\n", + "Where $W$ is the weights of the asstes and $Cov$ is the covariance of the returns of the assets in the portfolio." + ], + "metadata": { + "id": "rBxNCT2b6oCH" + } + }, + { + "cell_type": "markdown", + "source": [ + "**The Critical Line Algorithm (CLA)** optimizes asset weights in a portfolio by calculating the risk and expected return for various combinations of these weights. It systematically varies the weights assigned to each asset, assessing how each combination affects overall portfolio performance. This process helps identify efficient portfolios that maximize expected returns for a given level of risk or minimize risk for a desired return." + ], + "metadata": { + "id": "xgfgtZldOGE6" + } + }, + { + "cell_type": "code", + "source": [ + "# Create a Critical Line Algorithm (CLA) object using the calculated expected returns and covariance matrix.\n", + "cla = CLA(assets_expected_returns, covariance)" + ], + "metadata": { + "id": "NarHAjA25b61" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "**The Efficient Frontier** is a curve showing optimal portfolios with the best risk-return tradeoffs. It's important because it helps us identify portfolios that maximize return for a given risk level or minimize risk for a desired return." + ], + "metadata": { + "id": "Cgz_DmDcPXpN" + } + }, + { + "cell_type": "code", + "source": [ + "# Calculate the efficient frontier, obtaining the returns, volatility, and weights for various portfolios.\n", + "(returns, volatility, weights) = cla.efficient_frontier()\n", + "\n", + "efficient_frontier_portfolios= pd.DataFrame([returns, volatility, weights]).T\n", + "efficient_frontier_portfolios.columns=['returns', 'volatility', 'weights']\n", + "\n", + "efficient_frontier_portfolios" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "VMD3zD-p9AfE", + "outputId": "c43b28ee-757d-447a-f128-6cda567b1b1b" + }, + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " returns volatility weights\n", + "0 2.288214 0.771558 [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0....\n", + "1 2.288214 0.771558 [[0.0], [8.540177112501205e-18], [0.0], [0.0],...\n", + "2 2.288214 0.771558 [[0.0], [1.708035422500241e-17], [0.0], [0.0],...\n", + "3 2.288214 0.771558 [[0.0], [2.5620531337503614e-17], [0.0], [0.0]...\n", + "4 2.288214 0.771558 [[0.0], [3.416070845000482e-17], [0.0], [0.0],...\n", + ".. ... ... ...\n", + "74 0.699686 0.289411 [[0.0], [0.14064237710852637], [0.110488877515...\n", + "75 0.695988 0.289372 [[0.0], [0.1384244599412712], [0.1077026598376...\n", + "76 0.692291 0.289344 [[0.0], [0.136206542774016], [0.10491644215937...\n", + "77 0.688593 0.289328 [[0.0], [0.1339886256067608], [0.1021302244811...\n", + "78 0.684895 0.289322 [[0.0], [0.1317707084395056], [0.0993440068028...\n", + "\n", + "[79 rows x 3 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
returnsvolatilityweights
02.2882140.771558[[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0....
12.2882140.771558[[0.0], [8.540177112501205e-18], [0.0], [0.0],...
22.2882140.771558[[0.0], [1.708035422500241e-17], [0.0], [0.0],...
32.2882140.771558[[0.0], [2.5620531337503614e-17], [0.0], [0.0]...
42.2882140.771558[[0.0], [3.416070845000482e-17], [0.0], [0.0],...
............
740.6996860.289411[[0.0], [0.14064237710852637], [0.110488877515...
750.6959880.289372[[0.0], [0.1384244599412712], [0.1077026598376...
760.6922910.289344[[0.0], [0.136206542774016], [0.10491644215937...
770.6885930.289328[[0.0], [0.1339886256067608], [0.1021302244811...
780.6848950.289322[[0.0], [0.1317707084395056], [0.0993440068028...
\n", + "

79 rows × 3 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\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" + } + }, + { + "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": "686d5698-8806-4c7e-ba07-46b26d76add0" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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lZeXa926ddq+fbtmzZp11mVjzn7m5557Tu+8847WrVunffv26f7776/1NX///XddccUVSk5O1qZNm5SZmamDBw9qxIgRkqQXX3xRjz/+uNq3by+TyaTvvvuuxmM1GTNmjN577z299NJL+uGHH/Tvf/+71s+Xn5+voUOH6oYbbtD333+v999/Xxs2bKj2/X7++efVu3dvbd26VXfeeacmTZpkb1Kys7MlSV988YVMJpOWLl1a7X3i4+NlMpkUFRWl2bNny2QyaeTIkfavP/zww3r66af1ww8/qFu3bnrwwQf1n//8R2+99Za2bNmizp07a8iQISoqKqryuo888oief/55bdq0SSEhIRo/frwkaeTIkbrvvvt08cUX26+509+v0smTJzVkyBBFRkZq/fr1ysrKsje+lde8JK1evVo7d+7UqlWr9Omnn9b4vQQAAJ5ldTzEpXG+wlI9N7JYbUpfnidbDV+zSTJISl+ep8GJsR5dtmez2bR69WqtXLlSd911l3bt2qVPPvlEWVlZ9qVi7777ruLj47Vs2TL97W9/k1Txy+irr76q7t27218rIiJC5eXlVZZJxcbGKiQkRM2bN7cff/3111VWVqa3335bzZo1kyS9/PLLSk1N1axZs9SmTZuz1uxMjfv27dMNN9ygrl27SpLOO++8er1e5Wd+7bXX1KlTJ0nSlClT9Pjjj9f6ui+//LKSk5M1c+ZM+7E333xT8fHx+umnn3TBBRcoMjJSwcHBVb5nNR073U8//aQPPvhAq1at0lVXXeXw82VkZOiWW26xz1idf/75eumll3T55Zdrzpw59s1cr7nmGt15552SpIceekj/+te/9NVXX+nCCy9U69atJUmtWrWqta7Kmg0Gg4xGY7Vxjz/+uAYPHixJOnbsmObMmaMFCxZo2LBhkiqui1WrVmnevHl64IEH7Oc99dRTuvzyyyVVNF/XXnutysrKFBERoebNmyskJOSsS/Pef/99Wa1WvfHGG/YlpfPnz1eLFi20Zs0aXX311ZKkZs2a6Y033mCJHgAAPhQk55oif5/R8ff6Akp2QVG1mabT2SSZzGXKLiiqdUx9fPrpp2revLnCw8M1bNgwjRw5Uo899ph++OEHhYSEqE+fPvaxrVq10oUXXqgffvjBfiw0NFTdunWr03v/8MMP6t69u71pkqT+/fvLarXaZzgcne+o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VqtVq1evrvKvuI5YrVaVl5d7okQEAFevo4suukjbt29XTk6O/fGXv/xFgwYNUk5OjuLj471ZPvyEO34eWSwWbd++XXFxcZ4qE36uLtdR//79tXv3bvs/4EjSTz/9pLi4OJqmRqw+P5OWLFmi8vJyjRo1ytNloiHydToFard48WJbWFiYbcGCBba8vDzbHXfcYWvRooWtsLDQZrPZbKNHj7Y9/PDD9vEzZ860ff7557b8/HxbXl6e7bnnnrOFhITYXn/9dV99BPgBV6+jM5GqB5vN9esoPT3dtnLlSlt+fr5t8+bNthtvvNEWHh5u27Fjh68+AvyAq9fRvn37bJGRkbYpU6bYdu7cafv0009tMTExtieffNJXHwF+oq7/b7v00kttI0eO9Ha5aCBYqufHRo4cqcOHD2vGjBkqLCxUjx49lJmZab8Zct++fQoK+mPS8NixY7rzzjv1yy+/KCIiQhdddJEWLlyokSNH+uojwA+4eh0BNXH1Ovrtt990++23q7CwUC1btlSvXr309ddfKzEx0VcfAX7A1esoPj5eK1eu1L333qtu3bqpXbt2uueee/TQQw/56iPAT9Tl/207d+7Uhg0b9Pnnn/uiZDQABpvNZvN1EQAAAADgz/hnZgAAAABwgMYJAAAAABygcQIAAAAAB2icAAAAAMABGicAAAAAcIDGCQAAAAAcoHECAAAAAAdonAAADUrHjh01e/Zst7+OwWDQsmXL6v26AIDAROMEAPAbqampGjp0aI1fW79+vQwGg77//nu3vueCBQvUokWLase/++473XHHHfbnJpNJw4YNkyTt3btXBoNBOTk5bq0FAOC/aJwAAH5jwoQJWrVqlX755ZdqX5s/f7569+6tbt26eaWW1q1bq2nTpvbnsbGxCgsL88p7AwD8D40TAMBv/PnPf1br1q21YMGCKsdLS0u1ZMkSTZgwQf/5z3908cUXKywsTB07dtTzzz9/1td84YUX1LVrVzVr1kzx8fG68847VVpaKklas2aNxo0bJ7PZLIPBIIPBoMcee0zS2ZfqJSQkSJKSk5NlMBg0cOBArVu3Tk2aNFFhYWGV9586daoGDBhQ928KAMAv0DgBAPxGSEiIxowZowULFshms9mPL1myRBaLRV26dNGIESN04403avv27Xrsscf06KOPVmu0ThcUFKSXXnpJO3bs0FtvvaUvv/xSDz74oCSpX79+mj17tqKiomQymWQymXT//fc7rDM7O1uS9MUXX8hkMmnp0qW67LLLdN555+mdd96xjzt58qTeffddjR8/vo7fEQCAv6BxAgD4lfHjxys/P19r1661H5s/f75uuOEGzZ07V1deeaUeffRRXXDBBRo7dqymTJmiZ599ttbXmzp1qgYNGqSOHTvqiiuu0JNPPqkPPvhAkhQaGiqj0SiDwaDY2FjFxsaqefPmDmts3bq1JKlVq1aKjY1VdHS0pIqlhvPnz7ePW758ucrKyjRixIg6fS8AAP6DxgkA4Fcuuugi9evXT2+++aYkaffu3Vq/fr0mTJigH374Qf37968yvn///tq1a5csFkuNr/fFF1/oyiuvVLt27RQZGanRo0fr6NGjOn78uNtrHzt2rHbv3q1vvvlGUkXwxIgRI9SsWTO3vxcAwLtonAAAfqfyXqaSkhLNnz9fnTp10uWXX+7y6+zdu1d//vOf1a1bN/3nP//R5s2b9corr0iSTpw44e6yFRMTo9TUVM2fP18HDx7Uf//7X5bpAUADQeMEAPA7I0aMUFBQkBYtWqS3335b48ePl8FgUJcuXZSVlVVlbFZWli644AIFBwdXe53NmzfLarXq+eef1yWXXKILLrhAv/76a5UxoaGhtc5W1SY0NFSSajzvtttu0/vvv6+5c+eqU6dO1WbIAACBicYJAOB3mjdvrpEjR2r69OkymUwaO3asJOm+++7T6tWr9cQTT+inn37SW2+9pZdffrnWQIfOnTvr5MmT+n//7/9pz549euedd/Taa69VGdOxY0eVlpZq9erVOnLkiFNL+GJiYhQREaHMzEwdPHhQZrPZ/rUhQ4YoKipKTz75pMaNG1f3bwIAwK/QOAEA/NKECRP022+/aciQIWrbtq0kqWfPnvrggw+0ePFiJSUlacaMGXr88cftjdWZunfvrhdeeEGzZs1SUlKS3n33XWVkZFQZ069fP02cOFEjR45U69at9cwzzzisLSQkRC+99JL+/e9/q23btho+fLj9a0FBQRo7dqwsFovGjBlT928AAMCvGGyn570CAIB6mzBhgg4fPqxPPvnE16UAANwkxNcFAADQUJjNZm3fvl2LFi2iaQKABobGCQAANxk+fLiys7M1ceJEDR482NflAADciKV6AAAAAOAA4RAAAAAA4ACNEwAAAAA4QOMEAAAAAA7QOAEAAACAAzROAAAAAOAAjRMAAAAAOEDjBAAAAAAO0DgBAAAAgAM0TgAAAADgwP8HilfyNTSmaHQAAAAASUVORK5CYII=\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": [ + "optimized_weight=np.array(list(cla.max_sharpe().values()))\n", + "optimized_weight= np.round(optimized_weight, 4)\n", + "\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": "9eae848f-52ba-47bc-c17f-4cf753c82504" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " weights\n", + "symbol \n", + "SOL-USD 37.11\n", + "TRX-USD 32.71\n", + "BNB-USD 30.17\n", + "ADA-USD 0.00\n", + "BTC-USD -0.00\n", + "DOT-USD 0.00\n", + "ETH-USD 0.00\n", + "LTC-USD 0.00\n", + "MATIC-USD 0.00\n", + "XRP-USD 0.00" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
weights
symbol
SOL-USD37.11
TRX-USD32.71
BNB-USD30.17
ADA-USD0.00
BTC-USD-0.00
DOT-USD0.00
ETH-USD0.00
LTC-USD0.00
MATIC-USD0.00
XRP-USD0.00
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \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 \"TRX-USD\",\n \"DOT-USD\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"weights\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 16.184783972059133,\n \"min\": 0.0,\n \"max\": 37.11,\n \"num_unique_values\": 4,\n \"samples\": [\n 32.71,\n 0.0,\n 37.11\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": 638 + }, + "id": "Ad1Ncn3N2iRj", + "outputId": "a6919539-1140-48d5-c244-0ea49c1e5c8c" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArYAAAJtCAYAAADD+jMAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABrDElEQVR4nO3dd3yV5f3G8euck70HCRkEkpCwhzJEcACiglRwo9ZWULHVauuorVZ/1YpYR1v3qHvXvUUJiAsFAUFkIysQIAESsudJzvn9EY0iK+Oc3Oc55/N+vXgByZPnXKElXtz5Pvdtc7vdbgEAAAAWZzcdAAAAAPAEii0AAAD8AsUWAAAAfoFiCwAAAL9AsQUAAIBfoNgCAADAL1BsAQAA4BcotgAAAPALFFsAAAD4BYotAAAA/ALFFgAA7GPPnj26/PLL1b17d4WGhiolJUXjx4/XV1991XLNggULNHHiRMXHxyssLEwDBw7UPffco6ampn3uZbPZ9M4777T6tceMGaOrr756v7c/++yziouLa/l9TU2N/va3v6lnz54KCwtTUlKSRo8erXfffXefe9lsNtlsNoWGhio9PV2TJk3SW2+91eo8sBaKLQAA2MdZZ52lb7/9Vs8995y+//57vffeexozZoxKSkokSW+//bZGjx6tbt266dNPP9W6det01VVXaebMmTrvvPPkdru9nvGyyy7TW2+9pQcffFDr1q3T7NmzdfbZZ7dk/NGll16qwsJCbdq0SW+++ab69eun8847T7/73e+8nhGdL8h0AAAA4DvKyso0f/58ffbZZxo9erQkqUePHjrqqKMkSdXV1br00ks1efJkPf744y0fN336dHXt2lWTJ0/Wa6+9pnPPPderOd977z3df//9mjhxoiQpMzNTQ4cO3e+6iIgIpaSkSJK6deumo48+Wn369NHFF1+sKVOm6MQTT/RqTnQuVmwBAECLqKgoRUVF6Z133lF9ff1+758zZ45KSkp03XXX7fe+SZMmqVevXnr55Ze9njMlJUUffvihKisr2/yxU6dOVXx8PCMJfohiCwAAWgQFBenZZ5/Vc889p7i4OB1zzDG68cYbtWLFCknS999/L0nq27fvAT++T58+Ldd40+OPP64FCxYoMTFRw4cP1zXXXLPPDPCh2O129erVS/n5+d4NiU5HsQUAAPs466yztHPnTr333nua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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "The above weights forms a portfolio with maximum sharpe ratio" + ], + "metadata": { + "id": "GAT1yTIEXGh4" + } + } + ], + "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