diff --git a/README.md b/README.md index 9bcacdc..3b8a8ab 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# big-portfolio-learner v0.5.3 +# big-portfolio-learner v0.6.0 Final project for CIS 545 Big Data Analytics. @@ -14,7 +14,17 @@ The project proposal can be found [here](https://docs.google.com/document/d/1jpF - install packages using `pip install -r requirements.txt` or `sudo -H pip install -r requirements.txt`. -## DataLoader.py +## Analysis and Portfolio Learner + +### big_portfolio_learner.ipynb + +A iPython notebook designed to run on Google CoLab. + +This notebook pulls the data from an S3 bucket, cleans and munges it, does some Exploratory Data Analysis, and finally implements the core logic of predicting which stocks to invest in. + +## Pulling data from the Alpha Vantage API + +### DataLoader.py Contains the interface for loading data from Alpha Vantage API. @@ -22,6 +32,6 @@ The DataLoader will call the API and write .csv files (for each stock ticker) to The last step is to zip up the data directories so that it can be manually uploaded to our S3 bucket. -## alpha_utils.py +### alpha_utils.py Contains utility functions for grabbing data from Alpha Vantage API. diff --git a/big_portfolio_learner_data_cleaning.ipynb b/big_portfolio_learner_data_cleaning.ipynb index d07ac9f..23de408 100644 --- a/big_portfolio_learner_data_cleaning.ipynb +++ b/big_portfolio_learner_data_cleaning.ipynb @@ -1,27 +1,10 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "big-portfolio-learner.ipynb", - "provenance": [], - "collapsed_sections": [], - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "markdown", "metadata": { - "id": "view-in-github", - "colab_type": "text" + "colab_type": "text", + "id": "view-in-github" }, "source": [ "\"Open" @@ -42,9 +25,11 @@ }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "ccEPNzH-QeHL" }, + "outputs": [], "source": [ "import numpy as np \n", "import json\n", @@ -57,28 +42,22 @@ "import seaborn as sns\n", "import re\n", "import os" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": null, "metadata": { - "id": "j6wnsoAUQ4BJ", "colab": { "base_uri": "https://localhost:8080/" }, + "id": "j6wnsoAUQ4BJ", "outputId": "ec375733-6fc3-44d0-d89c-6a57df963684" }, - "source": [ - "## If boto3 not already installed uncomment the following:\n", - "!pip3 install boto3" - ], - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Collecting boto3\n", " Downloading boto3-1.20.24-py3-none-any.whl (131 kB)\n", @@ -107,13 +86,19 @@ "Successfully installed boto3-1.20.24 botocore-1.23.24 jmespath-0.10.0 s3transfer-0.5.0 urllib3-1.26.7\n" ] } + ], + "source": [ + "## If boto3 not already installed uncomment the following:\n", + "!pip3 install boto3" ] }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "dkkvY7IDQ-ou" }, + "outputs": [], "source": [ "import boto3\n", "from botocore import UNSIGNED\n", @@ -122,15 +107,15 @@ "\n", "s3 = boto3.resource('s3', config=Config(signature_version=UNSIGNED))\n", "s3.Bucket('cis545project').download_file('data/stock_data.zip', 'stock_data.zip')" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": null, "metadata": { "id": "tOt0sxq1RGQR" }, + "outputs": [], "source": [ "%%capture\n", "\n", @@ -146,36 +131,23 @@ " os.makedirs(tech_dir)\n", "!unzip /content/technical_data.zip -d /content/$tech_dir\n", "!rm -f $tech_dir/.gitempty" - ], - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "AZIMhDz8WCqX" + }, "source": [ "### Step 3: Add features to stock price\n", "\n", "Add independent variables into dataframe as features for one particular stock as an example. \n", "Try using pandas before running huge data in spark. " - ], - "metadata": { - "id": "AZIMhDz8WCqX" - } + ] }, { "cell_type": "code", - "source": [ - "ticker = 'ABM.csv' # change ticker to try different stock\n", - "\n", - "stock_data = pd.read_csv(os.path.join(in_dir, ticker)).copy()\n", - "stock_data = stock_data.drop(columns=['open', 'high', 'low', 'close', 'volume', 'dividend_amount', 'split_coefficient'])\n", - "\n", - "technical_data = pd.read_csv(os.path.join(tech_dir, ticker)).copy()\n", - "technical_data = technical_data.drop(columns=['symbol'])\n", - "\n", - "stock_df = pd.merge(stock_data, technical_data, on='timestamp')\n", - "stock_df.info()" - ], + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -183,11 +155,10 @@ "id": "0pn-8VtOWSAH", "outputId": "f8e256aa-25b5-4fe0-d6ab-837281ee5209" }, - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "Int64Index: 5501 entries, 0 to 5500\n", @@ -212,22 +183,55 @@ "memory usage: 644.6+ KB\n" ] } + ], + "source": [ + "ticker = 'ABM.csv' # change ticker to try different stock\n", + "\n", + "stock_data = pd.read_csv(os.path.join(in_dir, ticker)).copy()\n", + "stock_data = stock_data.drop(columns=['open', 'high', 'low', 'close', 'volume', 'dividend_amount', 'split_coefficient'])\n", + "\n", + "technical_data = pd.read_csv(os.path.join(tech_dir, ticker)).copy()\n", + "technical_data = technical_data.drop(columns=['symbol'])\n", + "\n", + "stock_df = pd.merge(stock_data, technical_data, on='timestamp')\n", + "stock_df.info()" ] }, { "cell_type": "markdown", + "metadata": { + "id": "mJSAvAX6jy_R" + }, "source": [ "### Step 4: Check correlation of stock and technical data to find pattern. \n", "\n", "Check correlation of stock and technical data. \n", "Plot the correlation matrix. " - ], - "metadata": { - "id": "mJSAvAX6jy_R" - } + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 645 + }, + "id": "LJaXMOffkO9t", + "outputId": "e8da8fa6-fca8-49c5-ac72-b66062eefec2" + }, + "outputs": [ + { + "data": { + "image/png": "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s8YICAgwdu3aZRQUFBgHDx40jh49ahiGYTzyyCNGr169jBMnThinT582goKCjKVLl9rm4u3tbbz//vtGbm6usWnTJsPX19fIysoyDKPw52nXrl2Gv7+/kZKSYlitVuPEiRO2z+E333xjHDp0yCgoKDC2b99u+Pr6Gj/++GOR96s4np6exsGDBwu15ebmGt7e3samTZuua/w9e/YYP/zwg5GXl2ccOXLECAoKMhYsWFCq9x+oqKjoAuUsKytL1atXv+LXuQkJCRo2bJhq1KghV1dXDRs2TF988YXtuJ2dnaKionTXXXfJyclJktSsWTN17dpVdnZ2OnfunJKTkzVu3DjdfffdqlGjhp588kklJSUVe73Q0FBbTIMGDVJubq5SU1OvaT4JCQl68skn5eHhoSpVquiFF17QmjVrCq2pHT58uJycnPTggw/qwQcf1E8//VTiePPnz1fz5s1t2+UqsiQZhqGVK1dq3LhxqlatmpydnTVkyBDbvKpXr67AwEBVrlxZzs7Oeu655/Svf/3rqnN4+umn5ezsrEaNGsnT01Pt2rWTh4eHqlatqg4dOmjfvn3XPH5oaKg8PT1199136/nnn9e6detslcuEhASFhIQUG0NoaKheffVVpaSkaMCAAWrbtq0+/vjjEmPetGmT7rvvPoWFhcnBwUHBwcFq0KCBvvnmG508eVKbN2/WpEmTdM8998jR0VEtW7Ys9D6+9dZb2rp1qxYvXixXV9dir/Hvf/9bCxYs0Pz58/Xqq6/aKqCHDh1Sq1atZBjGVd9bSTp16tQVP4+ff/65nn76afn6+spisei+++5T3bp1becPGDBAtWrVUrVq1fTII49o//79tmMODg4aNmyYHB0d1bFjR919993FfnY///xz9erVS+3atZOdnZ1q1aqlhg0bSpI6deqk+vXry2KxqGXLlmrXrl2Z1ss7OjqqevXqOnPmzHWN37hxYzVr1kwODg6qV6+eIiMjr+lzDIA1ukC5q1atmk6fPn3FdbQnT55UnTp1bPt16tTRyZMnbfvVq1dXpUqVCp1Tu3Zt2+vjx48rPz9fAQEBtraCggK5u7sXe71PPvlEn3/+uU6ePCmLxaJz587Zvna9mpMnTxZKSurWrav8/HxlZGTY2u69917b68qVK+vChQsljjdo0CCNGjXKtn95rackZWZmKicnRxEREbbjhmGooKBAkpSTk6O33npLW7ZssSUZ58+fl9Vqlb29fYnX/GN8lSpVKrJ/6tSpax7/j+9xnTp1lJeXp9OnTxcasyQ9e/ZUz549lZeXpw0bNuill16St7e32rdvX6Tvnz8jl6+Xnp6uEydO6J577tE999xT7HXOnj2rlStXavr06apatWqJ8Xz22WeKjIxUy5YtNWvWLD3zzDOaOnWqMjIy1KpVK1kslqvOSbr65zEtLc22ZKM4NWvWtL2uXLlyoX8L1apVK/TvqKTPV1pamjp27Fjs+MnJyZo9e7YOHjyogoIC/f777/L09LymuRUnLy9PmZmZtve/tOOnpqbq7bff1o8//qicnBxZrVb5+PhcdzxARUKiC5QzPz8/3XXXXdqwYYOCgoKK7ePm5qbjx4+rUaNGki79T9rNzc12vLgE449ttWvX1l133aXvvvvuqjcC7dy5U/PmzdPChQvVqFEj2dnZqUWLFrZq3dWSGTc3Nx07dsy2f/z4cTk4OKhGjRpXvHHpelSvXl1OTk5KSkpSrVq1ihyfP3++UlNTtXLlStWsWVP79+9XWFjYNVcer+Zaxk9LSyv0+nJ1rzQcHR3VrVs3zZ07VwcOHCg20b38GfmjtLQ0tW/fXrVr19aZM2eUnZ0tFxeXIue6uLho2rRpGjlypGbNmqWHH3642Djy8/OVl5cnSfL19dX06dM1YsQIubi46P3337/m+Vzt8+ju7q7Dhw9f83jXo6Rr5ObmKioqSlOmTFGXLl3k6OiooUOHlukz8/XXX8ve3l6+vr5XHb+4f18TJ07UQw89pHfffVfOzs5auHCh1q9ff93xABUJSxeAcla1alVFRUXp9ddf14YNG5STk6O8vDwlJydr6tSpkqQePXroww8/VGZmpjIzMzV79uwSv/Iujpubm9q1a6e3335b586dU0FBgQ4fPqwdO3YU6Xv+/HnZ29vL1dVV+fn5mjVrls6dO2c7XqNGDR07dsxWNf2z4OBgLVq0SEeOHNH58+c1ffp0devW7abcaW9nZ6fevXvrzTfftFWM09PTtWXLFttcKlWqJBcXF2VlZWnWrFmFzr/33nt15MiR677+1caXpC+++EI///yzcnJy9MEHHygwMPCK1eTLYmNjtWnTJtt/r+TkZP3888/y9fUtNvaOHTvq4MGDSkhIUH5+vtasWaOff/5ZnTp1kpubmzp06KBJkybpzJkzysvLK/LVd6tWrfTOO+9oxIgR2r17d7ExBQUF6dNPP9W//vUvFRQUyM3NTXXr1tWpU6euaU6XXe3z+Nhjj2n+/Pn68ccfZRiGDh06VOiPpxvhscceU2xsrLZt26aCggKlp6frl19+UW5urnJzc+Xq6ioHBwclJydr69at13WNrKwsffHFF3r99dc1ePBgVa9e/arj16hRQ1lZWbYbOKVLn7MqVaqoSpUq+uWXX7Rs2bIyzx+oKEh0gdvAoEGDFB0drTlz5qhNmzbq1KmTPvvsM3Xt2lWSNHToUDVu3Nj2VbaPj0+Jd82XZOrUqcrLy1P37t3VokULRUVF6bfffivS7/Jd8IGBgercubMqVapU6Ov3y1XnVq1aFfvs3F69eqlnz57q37+/unTporvuukuvvfZaqWItjZdeekn33XefHn/8cfn7++vJJ5+0rckcOHCgLl68qNatWysyMrJIJfRvf/ub1q9frxYtWuiNN94o9bWvNr50aa1tdHS02rVrp9zcXL3yyiu2Yz169Ci01vqPnJ2d9dFHH+mRRx5R8+bN9c4772jixIm2x839Ofbq1avro48+0oIFC9SqVSvNmzdPH330kW297dSpU+Xg4KBu3bqpbdu2WrRoUZFrtmvXTm+++aaeffbZQk85uKx79+568cUX9dprr8nf31/Dhg1TZGSkXn75ZQ0ZMqRUz8W90uexW7duevbZZzV69GjbdS4vDblRfH199dZbb+nNN9/Uww8/rP79++v48eNydnbWq6++qpEjR6pFixZKTExU586dSzV2aGio/Pz89Oijj2rVqlUaO3asnn/+eUm66vgNGzZUjx491LVrVzVv3lzp6ekaM2aMEhMT5e/vr9dee03du3e/oe8FYGYW40Z9hwcAKGTAgAHq2bOnevfuXd6hAECFREUXAAAApkSiCwAAAFNi6QIAAABMiYouAAAATIlEFwAAAKZEogsAAABTItEFAACAKZHoAgAAwJRIdAEAAGBKJLoAAAAwJRJdAAAAmBKJLgAAAEyJRBcAAACmRKILAAAAUyLRBQAAgCmR6AIAAMCUSHQBAABgSiS6AAAAMCUSXQAAAJgSiS4AAABMiUQXAAAApnTbJbrbt29XRESEJGnPnj0aPXp0mcZKSUkpcxylFR0drSVLllzXuQAAALgxbrtE94+aNGmid99997rP37Fjh7Zu3XoDIwIAAMCdwuFWXmz06NFKTU1VXl6e6tevrzfffFP33HOPpk+frjVr1sjFxUUtW7a09d++fbumTJmi2NjYQq//fOzXX3/V2LFjlZOTo4KCAoWHhysgIEDLly9XQUGBvv32W/Xo0UPPPPOMkpOT9eGHHyo3N1eOjo4aO3asmjVrJkklxlGS9PR0vfHGGzp48KAkKTg4WEOGDCnU5/z583rjjTe0Z88eSVJoaKgGDx4sSZo1a5YSExNVqVIlWSwWLV68WC4uLtq1a5feeecdnT9/XpIUFRWlTp06lem9BwAAqGhuaaL7yiuvyNXVVdKlpHLu3Lny9/fXxo0btXr1ajk5OWnYsGGlHnfp0qXq3LmzLck8c+aM7rnnHvXp00cXLlzQmDFjJEmHDx/WnDlz9Mknn8jZ2VkHDhzQ4MGDtWnTJm3cuLHUcbz44ovq2LGjZs6cKUnKzMws0mfOnDkqKChQQkKCzp8/r8jISHl6eqpp06ZauHChUlJS5OTkpHPnzsnJyUnZ2dmaMGGCPv74Y7m5uenkyZN67LHHlJiYKBcXl1K/NwAAABXVLU104+PjlZCQoLy8PF24cEH333+/8vLy1L17d1WpUkWS9Nhjj2nOnDmlGrdFixaaNm2acnJy1KpVK7Vu3brYflu2bNHhw4f1xBNP2Nry8/N16tQpbd++vVRxnD9/Xj/88IMWLFhga7ucxP/Rtm3bNG7cOFksFjk7O6tHjx7atm2bAgICVL9+fb388ssKCAhQp06d5OzsrB9++EFHjx61VX0lyWKx6NChQ2rSpEmp3hcAAICK7JYlujt37tSyZcu0fPlyubq6KiEhQStXrrzm8+3t7WUYhm3/4sWLtteBgYFq1qyZtm7dqrlz5yomJkbvvPNOseO0b99eU6dOvf6J3CD29vZauXKlvv/+e3333XeKiIjQvHnzZBiGvLy89Nlnn5V3iAAAAHe0W3YzWnZ2tpydnVWtWjXl5uYqJiZGktS6dWutXbtWFy5ckNVqtbX/mYeHh44cOaIzZ87IMAwlJSXZjh06dEg1a9ZURESEhg0bZlsP6+zsrLNnz9r6tWvXTlu2bNGBAwdsbbt37y5VHJdVqVJFfn5+Wrhwoa2tuKULbdq0UUxMjAzD0Llz57RmzRq1bdtW586dU2Zmplq2bKmoqCh5enrqwIED8vPz06FDh/Tdd98VivGPST4AAACu7pZVdNu3b68vvvhCgYGBql69upo3b649e/bokUce0f/93/8pNDTUdhNYenq67TyLxSJJqlWrlv7+978rIiJC9957r1q0aGFLWNeuXauEhAQ5OjrKYrFo3LhxkqSuXbtq9erVCg0Ntd2MNm3aNL3yyiv6/ffflZeXJ39/f/n6+l41juK88847mjRpkoKDg2VnZ6fg4GA988wzhfoMHTpU//jHPxQSEiJJ6tmzpzp06KATJ05oxIgR+v3332UYhh566CE9+uijqlSpkubMmaNp06bpzTffVF5enjw8PPTRRx/Z3gsAAABcncW4jUuFa9asUUxMjD755JPyDgUAAAB3mNv2ObrLly/X+++/r7///e/lHQoAAADuQLd1Rfd2kJycrPfee69I+wsvvKCOHTuWQ0QAAAC4FiS6AAAAMKXbdukCAAAAUBYkugAAADAlEl0AAACYEokuAAAATIlEFwAAAKZEogsAAABTItEFAACAKZHoAgAAwJRIdAEAAGBKJLoAAAAwJRJdAAAAmBKJLgAAAEyJRBcAAACm5FDeAeDGOxAQWN4hlKhRyvryDgEAAFQQVHQBAABgSiS6AAAAMCUSXQAAAJgSiS4AAABMiUQXAAAApkSiCwAAAFMi0QUAAIApkegCAADAlEh0AQAAYEokugAAADAlEl0AAACYEokuAAAATIlEFwAAAKZEogsAAABTItG9CdauXauwsDCFhoYqKChIo0ePliR17txZAQEBslqttr6xsbHy8vLSkiVLCo0xbdo0NW7cWBkZGbc0dgAAALNwKO8AzObkyZOaNGmS4uLi5O7uLsMwtH//fttxNzc3paSkqGPHjpKkuLg4+fj4FBrDarUqPj5e/v7+io+P16BBg27pHAAAAMyAiu4NdurUKTk4OKhatWqSJIvFooceesh2PDw8XLGxsZKkI0eO6MKFC/L09Cw0RnJysurXr6+oqChbXwAAAJQOie4N9uCDD8rX11edOnVSVFSUFi5cqNOnT9uOt2zZUv/973915swZxcXFKSwsrMgYMTExioiIUPPmzZWXl6ddu3bdyikAAACYAonuDWZnZ6c5c+bo008/VatWrZScnKyePXsqKytL0qUKb7du3ZSUlKSkpCQFBwcXOj8jI0M7duxQUFCQJCksLEwxMTG3fB4AAAB3Otbo3iSenp7y9PTUE088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7VrVqFFD3t7eSkxMlHQpH/P29i7VsoX09HTb6/379+vYsWN64IEHrn2CJbgtK7otW7bU0qVLdebMGcXFxSksLEx79+61HY+JiVFERISaN2+uvLw87dq1S02bNtXevXvl6+tbqms1bNhQTk5OSk1NLfHcp59+Wi+//LJ8fHzUtGlTBQYGFtt39uzZcnFx0bp165SVlaWIiAgFBgbajv/444/6/PPPVbVqVT311FNKSEjQ448/roceekhLly6Vvb29Tp06pYiICAUEBOiee+4p1VwAAADKw8SJExUdHa05c+bIxcXFVugbPHiwoqKi1KRJE+3cuVMvvPCCzp07J8MwlJSUpMmTJ6t9+/Z67733tHfvXtnZ2cnR0VFTp04tVOW9XrdlomuxWNStWzclJSUpKSlJy5cvtyW6GRkZ2rFjh+0NDAsLU0xMjJo2bXrd1zMM44rHe/bsqfbt22vbtm3auXOnBg4cqH/84x+2uwsv2759u20JRLVq1dS1a9dCxwMCAmxfAfj6+urw4cOSpMzMTI0bN06HDh2Svb29zpw5o9TUVDVr1uy65wQAAGBzk38ZrWHDhlq1alWR9rlz59peN2/eXJs3by72/D8/V/dGuS0TXenS8oXevXurRYsWhRYix8fHKz8/Xz179pQk5efnKycnR+PGjZOPj49iYmJKdZ1ff/1VFy9eVIMGDa7Yr3r16urevbu6d++u2rVrKzExsUiiezWVKlWyvba3t9fFixclXforqHPnzpo1a5YsFosCAwNtxwAAAMrsJj9H93Z1W67RlS6tnx01apSGDh1aqD02NlazZ8/Wxo0btXHjRm3evFm+vr5at26devTooczMTM2bN89WpT137pxWrFhR7DWOHj2qV155RX379pWzs3OJsWzatMmWeFqtVv3nP/9RvXr1ivRr2bKl4uPjJUnZ2dn6+uuvr2muZ8+eVd26dWWxWLR161YdOnToms4DAABAyW7biq4kRUZGFtrPyspSVlaWWrduXag9JCREMTExCgsL06effqpp06apS5cuqlKlihwcHNSvXz9b39WrV2vbtm22x4uFhIRowIABV4xj+/btmjJlihwcHGS1WtW4ceNin7YwbNgwjR07VkFBQapZs6YaN258xQT6stGjR2vSpEmaOXOmmjRpIi8vr6ueAwAAcM1KcXOZmViMqy1QxTXLy8tTQUGBKlWqpHPnzqlv374aO3as2rZte0vjOPbGO7f0eqVR99UXJUlZB34u50hKVq3RXyRJmd/9q5wjKZlr6xaSpAMBgVfpWX4apaxX1k//Le8wrqjag55X7wQAJnBiwZJSn1P77/1vQiS31m1d0b3TZGdna/DgwbJarbp48aKCg4NveZILAABQxE2+Ge12RaL7P/v371d0dHSR9v79+6t3797XNEaNGjUKPdcXAADgdlCa5+KaCYnu/3h7e9tuJAMAAMCdj0QXAADA7Cro48VIdAEAAMzOrmKu0a2YswYAAIDpUdEFAAAwuwq6dIGKLgAAAEyJii4AAIDZVdCKLokuAACAyVm4GQ0AAAAwDyq6AAAAZsfSBQAAAJhSBf0JYJYuAAAAwJQshmEY5R0EAAAAbp6TcQmlPsctPOQmRHJrUdEFAACAKbFG14TSTmWWdwglcr/XVZKUsu/nco6kZAEP/UWStHX/7RtjO+9LMR4ICCznSErWKGX9bR2fdCnGtDnzyjuMErkPfbq8QwBgEpYKejMaFV0AAACYEhVdAAAAs7NUzNpmxZw1AABARWJnKf1WCqmpqYqMjFRgYKAiIyN18ODBIn1SUlIUERGhxo0ba8qUKYWOWa1WTZo0SV27dtVf//pXrVq1qiyztSHRBQAAQJlMmDBB/fr10/r169WvXz+NHz++SB8PDw9NnjxZTz31VJFjCQkJOnz4sL788kutWLFCM2fO1NGjR8scF4kuAACA2Vkspd+uUUZGhvbt26fg4GBJUnBwsPbt26fMzMI3x993333y9vaWg0PRlbNr1qxR7969ZWdnJ1dXV3Xt2lXr1q0r25zFGl0AAADzsyt9bTM7O1vZ2dlF2l1cXOTi4mLbT0tLU61atWRvby9Jsre3l5ubm9LS0uTq6npN10pLS1OdOnVs++7u7jpx4kSpY/4zEl0AAAAUsWjRIs2aNatI+/DhwzVixIhyiKj0SHQBAADM7jqeoztw4ECFh4cXaf9jNVe6VH1NT0+X1WqVvb29rFarTp48KXd392u+lru7u44fPy5fX19JRSu814s1ugAAACjCxcVF9erVK7L9OdGtUaOGvL29lZiYKElKTEyUt7f3NS9bkKSgoCCtWrVKBQUFyszM1IYNGxQYWPYfHSLRBQAAMDmLnaXUW2lMnDhRS5YsUWBgoJYsWaJJkyZJkgYPHqw9e/ZIknbu3KkOHTpowYIFWr58uTp06KAtW7ZIkkJDQ1WvXj09+uijevzxxzVs2DB5eHiUed4sXQAAADC7m/yDEQ0bNiz22bdz5861vW7evLk2b95c7Pn29va25PhGoqILAAAAU6KiCwAAYHalXIpgFiS6AAAAZncdT10wAxLda7R27Vr985//lGEYunjxonx8fPTuu+/Ky8tL33//vapUqVLma3h5ecnT01OSlJubKx8fHw0dOlR/+ctfyjw2AABARUOiew1OnjypSZMmKS4uTu7u7jIMQ/v3778p11q+fLmqVKmigoICrVixQn379lVsbOwNufMQAABUUDf5ZrTbVcWcdSmdOnVKDg4OqlatmiTJYrHooYceKtJv9+7dioyMVEhIiCIjI7V7925J0rvvvqt58+ZJuvRbzg8++KAyMjIkXXrsRkpKSpGx7Ozs1LdvXwUEBGjp0qU3a2oAAACmRaJ7DR588EH5+vqqU6dOioqK0sKFC3X69OlCfXJzcxUVFaWRI0cqISFBzz//vKKiopSbm6s2bdpo27ZtkqTvvvtOzZo103fffae8vDzt3r1bDz/8cInXbtq0qX7++eebOj8AAGBuN/s5urcrEt1rYGdnpzlz5ujTTz9Vq1atlJycrJ49eyorK8vWJzU1VY6OjmrTpo0kqW3btnJ0dFRqaqr8/f31448/Kjc3V99//72GDh2qb7/9Vrt27VKjRo1UuXLlEq9tGMZNnx8AADA5i6X0mwmQ6JaCp6ennnjiCS1YsEBVq1bVjh07ruk8JycneXp6KikpSTVr1lTr1q31f//3f9q2bZtat259xXP37NmjRo0a3YjwAQBARWVnV/rNBMwxi5ssPT1dP/zwg23/xIkTyszMVL169WxtDzzwgPLy8vTdd99JkrZt26b8/Hw98MADkqQ2bdpo5syZatOmje666y7Vrl1bcXFxtgrwnxUUFGjlypXasmWL+vbtexNnBwAATK+CVnR56sI1yM/P18yZM3Xs2DE5OTmpoKBAI0eOLHRD2l133aUZM2Zo8uTJunDhgu6++2598MEHuuuuuyRdSnQ/+OADWwW3devW+v777+Xr61voWn369JF0ac3vQw89pGXLlvHEBQAAgOtAonsN6tatq/nz5xd77D//+Y/tta+vr1asWFFsPz8/v0J9Bw8erMGDB5c4FgAAwA1jkpvLSotEFwAA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lISEhATMmjVLeR+5XI5bt27B0tISYWFhiIiIgFwux9OnT9GiRYsyP5ZMJnvp8Z49e6J+/foAgEGDBuHLL7986bkjR44gKysLBw8eBADk5ubC2tpa+Xl9+/ZFnTp1Xpqv6NSFuLg4zJo1CwcPHkTt2rVLfd4WFhZo164dAKBTp0747bfflF+jX79+qFu3rjJz0eJORERERGVX4Tm6kZGRmD9/PjZs2ABTU1O1o59nz57FTz/9hD179sDMzAwREREICAgo82OZmpoiLS1N5VhqairMzc3LG1uFQqHA4sWLYWdnp/Z8WUrui7p27Yq8vDzEx8cjNze31Oetp6en/FhHRwd5eXnlfxJEREREVKoKT11wdnZG9+7dERUVBX19fYSGhirPJSQkICsrCxkZGTAwMICJiQlyc3MRFBRUrsfo3r07IiMjkZ6eDgB48OABTpw4AVtbW+V9oqOjkZKSAqBgJYSynHN0dMSOHTvwzz//AACysrKUUy0q6vr168jOzkazZs0q/LxtbW0RGRmJp0+f4vnz5+V+vYiIiIjoXxW+GA0ouODK3d0dmzZtwubNm7Ft2zbk5+ejXr16WLNmDXr06IHw8HA4OTnB1NQUNjY2uHTpUpm/fvfu3TFs2DCMHj0aMpkMurq6WLhwIVq2bKm8j42NDWbOnInk5GS0atUK8+bNe+m5yZMnY/369Rg0aBBkMhlkMhmmTZumvCCsrArn6CoUCigUCixfvhxmZmYVft69evXC+fPn4eLiorwYLTk5uVyZiIiIiKiATKFQKESHqKh169bh6dOnmDt3brnOabt4eyfREUrU+kTBvGhmrJzCjBl/PRCcpGRGTRrjTvLfomOU6s1GDZCeeFt0jBIZW7QAAJy4clNojtLYt2sFAIi5Vrl3xV4nO2tLZL4wDU5qDE1MNOJnjiZkJCqKO6MRERERkVaq1NSFV+Hq1asq0w0KjRo1CoMHDy71c6dPn16hc2X15MkTTJgwodjxPn36YNq0aZX++kRERET0+ggvum3bti3zpgxVrV69epLNRkRERESl49QFIiIiItJKLLpEREREpJVYdImIiIhIK7HoEhEREZFWYtElIiIiIq3EoktEREREWolFl4iIiIi0EosuEREREWklFl0iIiIi0kosukRERESklVh0iYiIiEgryRQKhUJ0CCIiIiKiV40jukRERESklVh0iYiIiEgrsegSERERkVZi0SUiIiIircSiS0RERERaiUWXiIiIiLQSiy4RERERaSUWXSIiIiLSSiy6RERERKSVWHSJiIiISCux6BIRERGRVmLRJSIiSXr69KnoCESk4Vh0qURZWVn4888/Rcd4qdzcXISFhWHs2LGioxBJzv379+Hr64uPPvoIH330Eb7++mvcv39fdCwlPz8/tcezs7MxceLEKk5DRNqmhugAJE1Hjx7FokWLoKuriyNHjuDSpUv49ttvsXHjRtHRlC5evIi9e/fi4MGD6NChA9zc3ERHKlFubi4iIyMRHByMnTt3io6jlJWVhcTERABAy5YtUbduXcGJivvqq6/w+eefv/SYCEePHi31/Pvvv19FSdRLSEjA8OHDYW9vDzs7OwDApUuX4O7ujh9//BGWlpZC8wFAdHQ0jI2NVf5QLSy5VlZWApNpFql/LxKJwqJLavn5+WHv3r2YNGkSAKBDhw5ISkoSnApISUlBeHg4goKCIJfL4erqitq1a2Pr1q2io6kl1TKen58PHx8f7NmzB/r6+lAoFMjJycGIESMwf/58yGQy0RGVzp49W+zYmTNnBCQprrQ0LN9rAAAgAElEQVTvO5lMJrxc+Pv7Y9asWRg2bJjK8YCAAPj7+2PVqlWCkv1r69atGDVqFAwNDeHu7q5ScpcuXSo6HgDAw8Oj1H8Te/furcI06hV+L+bm5uLSpUvKPxJu3LiBjh07Cv9eBDTjddSEjFQ+LLpUogYNGqjc1tPTE5TkXw4ODrCxsYG3tze6dOkCAAgMDBScSpUmlPFdu3bh8uXLCA8PR8uWLQEAt27dwsKFC7Fr1y6MHj1acEIgMjISkZGRuH//PmbMmKE8npWVBX19fYHJ/vXDDz+IjlCqP//8U22ZHTx4MLZv3y4gUXFmZmbYtm0bxowZA6Dg33ObNm3g7e0tONm/5s6dKzrCSxV+L86aNQsLFizA22+/DaDgj22pvItU+DpGR0fj1q1bGDRoEAAgODgYFhYWIqMpaUJGKh8WXVKrbt26ePz4sfIv27i4OBgaGgpOBYwdOxbh4eH45ptv4OHhAScnJ9GRitGEMh4REYHVq1ejWbNmymMtW7bEypUrMXPmTEkUXQsLC/Ts2ROXLl1Cz549lccNDAyUb8NLSWZmJhITE5GTk6M89u677wpMVPIfpzKZTBJ/uALAs2fPYGJignXr1mH8+PHo2bMn5s6di2fPngEAateuLTgh8N5774mOUGbx8fHKkgsAHTt2xI0bNwQm+lfh6+jr64uAgADl75devXoVe9dBFE3ISOXDoktqeXl5YdKkSbh37x5Gjx6N27dvY8OGDaJjYc6cOZg9ezaOHj2KoKAgLF++HHl5eYiNjYWtra3oeAA0o4xnZGSolNxCzZo1Q2ZmpoBExVlbW8Pa2hqOjo4wMTERHadUBw4cwIoVK5CRkYGGDRsiKSkJ1tbWCAkJEZpLJpPhn3/+gUKhUHtOCjp37qzMolAoEBISgtDQUCgUCshkMly9elVwQmD//v3o0KEDmjdvDgBYsmQJ9u3bh2bNmsHX1xetW7cWnPBftWvXRlhYGFxcXAAA4eHhkvhjoaj09HTk5OQo35nJzc1Fenq64FSqNCEjlY1Moe4nIBEKRqh+//13AAW/jIyMjAQnKu7JkycICwtDSEgI0tPTcezYMdGRABTMgS0s46dPn0ZeXh78/f0lU8bd3d0RHBxc7nMi/O9//8PUqVNRu3ZtjBkzBleuXIG3t7fyF7kUDBw4EN999x0mTpyI0NBQnDx5EgcPHhQ+x9Ta2hoymUyl6BbelkqJ1AQDBgxAQEAAateujcOHD+Orr77C2rVrcfnyZRw+fFgy00CAggsQ58yZg/j4eMhkMlhZWWHFihWSuPCw0OrVqxEdHY1+/foBKJim1LNnT3z66aeCk/1LEzJS2bDoklpZWVmoU6cOdHR0cOPGDcTHx6NPnz6SebtTnYsXL6Jjx46iYxQjxTLerVs3uLq6FjuuUCgQHh6OkydPCkil3sCBAxEeHo7o6GiEhYVh3rx5mDx5MsLCwkRHUyr842DAgAGIiIgAALi5uQkf0dUkp06dgo2NjSR/xhR+DwLA4sWL0aBBA0ybNg0A4OLiIqnvxUJZWVkACqb6SNGRI0dw+vRpAICtra3K9CSp0ISM9HKcukBqjRkzBrt27VK5Avr48eP43//+JzTX7t27Sz0vxaJbr149TJgwARMmTMDFixdFxwEAjBgxosRzw4cPr8IkZXfmzBn06dMHjRo1kszb7oX09PSgUCjw5ptv4ocffkDTpk0ltdmBlEtkoR07dmDmzJmwsrKCnZ0d7Ozs0LFjR+jq6oqOhvz8fOXHf/zxB+bNm6f2nFQkJSUhKSkJz58/Vx6TwqoLRTk6OsLR0VF0jFJpQkZ6ORZdUkuhUKBOnTrYv38/hgwZgunTp2PAgAGiY2HZsmVo3769pNfX1IQyXjgapQnq1auHxYsX4/jx45g8eTLy8vJUfoFLwYwZM5CVlQUvLy8sWbIEmZmZWLx4sehYSlIukYU2b96MvLw8nD9/HrGxsZg9ezbS09Nx7tw50dHw7rvvYtasWahfvz5SU1NhY2MDoGCFlRo1pPVrdNWqVQgMDISlpSV0dAr2hJLCUndF3bp1Cxs2bMDdu3eRl5enPC6lpbs0ISOVjbT+hZJk5OTkIDc3FydPnsSoUaMAQPlDUyQfHx+EhIQgPj4ebm5u6N+/P4yNjUXHUqEJZTwwMBAKhQJDhgxROR4QEABdXV14eHgISlbcqlWrEB4eDjc3NxgbG+PevXsYP3686FgqCleBMDQ0xI4dO8SGUUPKJbJQSkoKYmNjcerUKZw/fx4WFhaSWV1jwYIF+P777/Hw4UNs27ZNOTJ+69YtyX0vRkVF4fDhw5KdsgAULIHWt29fuLu7S+qPraI0ISOVDYsuqdWvXz90794db775Jrp06YK///4btWrVEh0L7u7ucHd3x927dxEaGophw4bBysoKU6ZMgbW1teh4ADSjjAcGBqq9gKZfv34YM2aMpIqumZkZxo0bp7zdrFkztStGiJSTk4Pw8PBioz+fffaZwFT/knKJLNS9e3d06tQJU6dOxeLFi1GzZk3RkZRq1qyJgQMHIjk5WbnudEpKCg4dOoSQkBAMHDhQcMJ/NWjQQNIlFyiY7vHxxx+LjlEqTchIZcOiS2pNmzYNo0ePhqGhIXR0dFCnTh2sW7dOdCwlc3NzjBs3DvXr14efnx/s7e0lU3Q1oYzn5eWp/WVoYGCgUtREmjNnDnx9fUvcqUhKbyHOmDEDcrkcHTt2lOQ8WCmXyEKrVq1CbGwsVqxYgYYNG8LW1hbdunVD+/btRUdDYGAgvL29YWJiAlNTU8yYMQPz5s2Dvb09goKCRMdT0alTJ+VoZNHBCSlNXejUqROuXbsmmZ+H6mhCRiobrrpAJTp+/DhOnToFoOAXpb29veBEBXOHjx8/juDgYMTHx8PZ2RkuLi4wNzcXHU2tzMxM7Nu3D35+fpg1axYGDx4sOhIAoHfv3jh8+LDac//5z3/w66+/VnGi4i5fvoy33npLedXzi6S0iL+zszMiIyNFxyjRgQMHEBsbiz/++ENyJfJFcrkc+/fvh5+fHx48eCCJJdD++9//Ys2aNWjdujXOnTuHMWPGYNWqVejbt6/oaMWo2+xFJpPh+++/F5BGPVdXV9y8eRMWFhYqZVxKf7xqQkYqGxZdUmvr1q0IDQ3Ff//7XwAFvyhdXV0xceJEobl69OiBhg0bwt3dHe+9916xkb5WrVoJSvYvTSjjc+fORatWrTBp0iSV49u3b8fVq1fh6+srKJlmmjx5Mr755hvJv2UsxRJZaPv27YiJicGlS5fQpk0b2Nraws7ODp06dRIdrdgSYn379kVUVJTARJpNE/541YSMVDYsuqTWgAED8NNPPyl/cWdlZWH48OHKNUJFKbrUS9GF7wv/VwojkZpQxh8/foxRo0bBxMREuV3ohQsXkJqail27dqFBgwaCEwLz588v9fzy5curKMnLzZ49G5cvX0aPHj1Upi5IZY6ulEtkoW+++QZ2dnbo0qWLJK4HKKpfv35Yt26dcuMNT09PldtS+DddlBS3oyYShXN0qURFR6ekMlJ15MgRldvp6ek4ffo0zM3NJTOXqmbNmkhNTcW2bduwbds2lXNSKeP169dHaGgoIiIicOXKFQCAh4cH+vfvL5ntQt966y3lx1u2bCk2+iwlFhYWsLCwEB2jRGlpaZgwYYIkS2ShWbNmIS8vD4mJiQAKXlOpLN31zz//FPv+K7wtlX/ThaS6HXVRmZmZ2LJlC65evapSxqU0vUITMlLZcESX1CocTSucU7p3714oFArho2heXl748MMPYW1tjbS0NLi4uMDAwACpqamYOXOmJObA3r9/H02bNlV7rnDeqRTl5uYiKioKQUFB2Llzp+g4KlxdXREaGio6hkaTaoksdPnyZUyfPl15oVxeXh7WrVsnyXnEUibV7aiLmj59OiwtLbF//37MmDEDQUFBaN++Pby8vERHU9KEjFQ20vpJR5LxxRdf4Ntvv8WXX34JoGDL2E8++URwKuDPP/9UjtyGhYXB0tIS27dvx8OHD/HRRx9JouhOmzZNOXoyaNAglYsXvvjiC0mNrAAFWycHBQUhKioKHTp0gJubm+hIxUhtJ7QXrVy5stgxQ0NDdOrUSRLLeGlCifzyyy/h4+OjfL1iYmKwbNky7NmzR3AyzVKjRg3Uq1dPualK9+7d8fXXXwtOperOnTtYt24dfv31V/Tv3x8ffPABxowZIzqWCk3ISGXDoktq1alTB3PmzBEdoxh9fX3lx+fOnUPv3r0BAG+88YZkylDRN0leXKpLKm+gpKSkIDw8HEFBQZDL5XB1dUXt2rWxdetW0dE00pMnT3D27Fnl9+Ovv/6KDh06IDIyEs7OzpgyZYrQfJpQIp89e6byR4GdnZ3wLcc1kdS3owagnMdes2ZNpKWlwdjYGCkpKYJTqdKEjFQ2LLqk4mXb144cObKKkpQsOTkZxsbGOH36NDw9PZXHi86jEqlo4X6xfEuljDs4OMDGxgbe3t7o0qULgIK1QqWk6ChpcnJysVFTqVzoBQCPHj1CcHCwcmOQqVOnYvr06fjxxx8xZMgQ4UVXE0pk7dq1ERcXh65duwIouOpdKvPFNYnUt6MGgBYtWiAtLQ0DBgzA0KFDYWhoKKl3FwDNyEhlw6JLKi5fviw6QqkmT54MV1dX1KxZE++8847yaufz58+jSZMmgtMVyMnJQUJCAhQKhcrHheekYOzYsQgPD8c333wDDw8PODk5iY5UTJ06dZQfjxgxQmCSlyv846uQkZER/v77bxgYGEhiAwlNKJELFizAjBkzlK+XXC6Hn5+f4FSaR+rbUQNQTqUYP348OnTogMzMTPTo0UNwKlWakJHKhhejkcb5+++/8fjxY1hbWytHSJOTk/H8+XNJlN2iS6C9SEpXaOfn5yM6OhrBwcE4ffo08vLy4O/vD1tbW9HRymXv3r0YNGiQ0Ayenp4wNjaGu7s7ACAkJASpqalYtWoVhg0bhuDgYKH5Ll68qLZESu3CSLlcrnLBnBR3cJOq58+f49ChQzA2Nka3bt3w/fff49SpU7CwsMAnn3wCQ0ND0RGLycnJQXx8PJo2bQpTU1PRcdTShIxUOhZdUmvz5s0YMmQITExMAACpqakICgrChx9+KDgZvQ4pKSkICwtDcHAw0tPTcezYMdGRyszNzU34BX5ZWVn49ttvERcXB6BgUfmpU6eidu3ayMjIgJmZmdB8gHRL5LNnz0o9L7WRZ6latGgRbty4gdzcXDRr1gw5OTno2bMnzpw5A4VCgdWrV4uOiNjYWCxduhTGxsaYM2cOZs6ciby8PDx9+hT/+9//JPHOkiZkpPJh0SW1XtwJCOAST9qktLnYaWlpmDp1ahWmqRx+X5ZME0pk4TszRX8VFd0ERkq7t0lZv379sH//fjx79gw9evRATEwM9PT0kJ+fj4EDB2Lfvn2iI8Ld3R0zZsxAZmYmvL298e233+K9997D9evX8dlnnxX7ncOM9Cpwji6ppe7vn8LlakjzLVu2DO3bt4eVlZXoKJUm8gK/wlUVSvrDQfTFm507d5Z8ibx27ZrKbSluAqMJ9PT0IJPJUKdOHZibmyunqejo6Ehm9D4/Px/vv/8+AMDPz0+5nW6bNm1ExlKhCRmpfFh0Sa0WLVrgu+++w7hx46BQKLBjxw40b95cdCx6RXx8fBASEoL4+Hi4ubmhf//+KhdTUdnEx8fD2dlZshdxakKJ1IRNYDRBbm6u8sLXoh8D0rkItugfpXXr1lU5p6OjU9Vx1NKEjFQ+nLpAaiUnJ2POnDn4448/IJPJ0LlzZ/j6+qJhw4aio9ErdPfuXYSGhuLAgQOwsrLClClTJFOAyopTF0qmCSXS2dkZkZGRAICdO3fi6NGjKpvA8K3istGEi2DfffdddOvWDQBw6tQp5ccKhQKxsbE4ffq0yHgANCMjlQ9HdEmtRo0a4fvvv1cuNF50qScAOHbsGBwcHEREo1fI3Nwc48aNQ/369eHn5wd7e3vJFd2srCzlRVQtW7YsNsoicj3YmzdvwszMTHmx2YEDB7Bv3z6Ym5tj+vTpMDAwEJYN0IydBDVhExhNcOTIkTLdLyUlRdjFkQsWLFB+3LNnT5VzvXr1quI06mlCRiofFl0q1YsFt9Dq1atZdDWYQqHA8ePHERwcrHz7PSAgAObm5qKjKeXn58PHxwd79uyBvr6+cl3iESNGYP78+coSJLKYz5s3D/7+/gCAS5cuYeHChZgyZQquX7+OL7/8UvimDJpSIqW+CYw2mThxorBVSsq6vbi/v7+wLec1ISOVDyecUIVwxotmc3BwwNq1a/Huu+9izZo16Nu3L3JycnDz5k3cvHlTdDwAwK5du3D58mWEh4fj7NmzOHfuHMLDw3H58mXs2rVLdDwABUWscDrPwYMH4ebmhkmTJmHFihWSmbebnJyMf/75B6dPn1ZeWANIp0QWbgLzwQcfSHYTGG2iCT+7f/nlF9ERXkoTMlIBjuhShUhpNIjKr2bNmkhNTcW2bduwffv2YlflS2E+X0REBFavXo1mzZopj7Vs2RIrV67EzJkzMXr0aIHpChS9OOXChQvKVRZ0dXWhq6srKpaSJuwk6OzsDBsbG+UmMIUaN26MZcuWCUymnTThZ7cmlHFNyEgFWHSJqqGyzucTKSMjQ6XkFmrWrBkyMzMFJCrujTfewO7du9GoUSP8+eefyu1Xc3NzIZfLBafTnBLZoEEDNGjQQOVYo0aNBKUh0TShjGtCRirAoksVwr9m6XV78aKzokqaO17VFi9eDG9vbyQnJ8Pb21u5RFtMTEyxC1lEYYmkovizm6obFl2qkJkzZ4qOQFru4cOHWLlyZbHjCoUCycnJAhIV16RJE2zatKnY8ffff1+56DwA7N27F4MGDarKaFQNPX/+HHv37sXQoUNLvE+fPn2qMFHFaEIZ14SMVIDr6JIKDw+PUt+S2bt3bxWmoeps/fr1pZ6fNm1aFSWpPDc3N2FXulP14u7ujuDgYNExXioxMREJCQno3bs3srOzIZfLYWJiAkDsEmhAwR8MgwYNKvXfrOiMVHYc0SUVc+fOBQBER0fj1q1bylGo4OBgWFhYiIxG1YwmFdmX4XgCVZWuXbsiKioKffv2FR2lRCEhIdi0aRPkcjl69+6N5ORkLF26FDt27AAA4QVSV1cXderUQU5ODmrVqqX2PqIzUtmx6JKKwuWHfH19ERAQoBzd7dWrF4YNGyYyGlUzgYGBUCgUGDJkiMrxgIAA6OrqwsPDQ1Cy8uOFK1RVQkJC8N1330FfXx+1a9eGQqGATCZDTEyM6GhKO3fuRFBQkHKVkpYtW+Lx48eCU6mysLDAyJEj4eTkpHJNQGFm0hwsuqRWeno6cnJylAvO5+bmIj09XXAqqk4CAwOxffv2Ysf79euHMWPGaFTRJaoqQUFBoiO8VM2aNYtdbCqF5fiKev78OVq3bo1bt26JjkKVxKJLajk7O2Po0KHo168fACAyMlL5MVFVyMvLU7uFroGBAfLy8gQkqjhOXaCq0rRpU2RlZeHOnTto37696DhqmZiYIDExUflOR1hYGN544w3BqVQtX75cdAR6RXgxGpXoyJEjOH36NADA1tZWMsslUfXQu3dvHD58WO25//znP5LY1KJQVlYWEhMTARS8DfviaNW1a9eEblVM1cfRo0exaNEi6Orq4siRI7h06RK+/fZbbNy4UXQ0pcTERMyePRu3bt2CmZkZ9PX1sXHjRjRv3lx0NKVnz55h06ZNuHv3LlatWoWEhAQkJiYqt9EmzcERXSqRo6MjOnXqxEn3JMQ777yDLVu2YNKkSSrHt2/fji5dughKpSo/Px8+Pj7Ys2cP9PX1oVAokJOTgxEjRmD+/PnKESuWXKoqfn5+2Lt3r/LfTYcOHZCUlCQ4lSoLCwsEBgbi9u3bUCgUsLCwkNzUhSVLlqBBgwa4du0agILNYWbPns2iq4FYdEmtCxcu4NNPP0V+fj6OHj2KS5cuISAgQFK7KZF2mzNnDkaNGoVff/0Vb7/9NoCC78vU1FTs2rVLcLoCu3btwuXLlxEeHo6WLVsCAG7duoWFCxdi165dktimmKqfFzcI0dPTE5RE1bNnz1RuF25DnZubCwCoXbt2lWcqyfXr17FixQqcOHECQMEGNvn5+YJTUUWw6JJay5cvx5YtW+Dl5QWgYFRg3rx5glNRdVK/fn2EhoYiIiICV65cAVCwznP//v0l8wsxIiICq1evVtmquGXLlli5ciVmzpzJoktVrm7dunj8+LHy3YS4uDgYGhoKTlWgc+fOkMlkKnPWC2/LZDJcvXpVYDpVL/5xkJOTw7n2GopFl9SSy+Vo1aqVyrGaNWsKSkPVlb6+PgYPHqy8nZubi6ioKAQFBWHnzp0CkxXIyMhQKbmFmjVrhszMTAGJqLrz8vLCpEmTcO/ePYwePRq3b9/Ghg0bRMcCAOU0AE1gY2ODjRs3Ijc3F3Fxcfjuu+/g6OgoOhZVAIsuqaWnp4fs7GzlqMDNmzdLXDib6HW7ePEigoKCEBUVhQ4dOsDNzU10JAAodtFZUUXX3iSqKh07dsT333+P33//HUDBKKqRkZHgVAVenLrwIqm8UwMUbHO/detW1K1bF76+vnB0dMTkyZNFx6IK4KoLpNbRo0exYcMG3L17Fz169MDx48fh6+uLbt26iY5G1URKSgrCw8MRFBQEuVwOV1dX7NmzB9HR0aKjKXXr1g2urq7FjisUCoSHh+PkyZMCUlF1FhgYCDs7O7XvNIhmbW1d6uYpUpq6QNqDI7qk1vvvv4+WLVvi+PHjUCgUmDJlCt58803RsagacXBwgI2NDby9vZWrLAQGBgpOpWrEiBElnhs+fHgVJiEqcOXKFWzbtg1yuRy2traws7ODra0t6tevLzqacuqCv78/9PT0MHToUCgUCgQGBkIulwtOpyorKwv+/v6IjY0FANjZ2WHKlClq1/YmaeOILqmlblkndceIXhdfX1+Eh4fjzTffhIeHB5ycnDBgwABJrZ9LJFUPHz5EdHQ0Nm/ejAcPHkhqtNTNzQ0hISEqx9zd3REcHCwoUXGenp4wMDDAoEGDAADBwcHIyMiAn5+f4GRUXhzRJbUOHDhQrNSqO0b0usyZMwezZ89GdHQ0goODsXz5cuTl5SE2Nha2trai4wEoGGFWKBQYMmSIyvGAgADo6upym2KqcpcvX0ZMTAxiYmLw999/w97eHnZ2dqJjqfjnn39w584d5buESUlJL52/W9Xi4+MRGRmpvN2lSxc4OzsLTEQVxaJLKk6ePIkTJ07g0aNHWLlypfJ4VlYWl1ahKqejowNHR0c4OjoiJSUFYWFh+Oqrr5Ceno5jx46JjofAwEBs37692PF+/fphzJgxLLpU5QYNGoTOnTtj1qxZePfdd0XHUWvmzJkYMmQI3nrrLSgUCly9elVya7Q3bNgQKSkpyg2TUlNT0ahRI8GpqCJYdElFzZo1UbduXchkMpWrxhs2bMgrTqlK7d69u9gxPT09DBs2DGlpaQISFZeXl6d2zp6BgQHy8vIEJKLqLiAgALGxsfD398eTJ0/QpUsXdOvWDR988IHoaEoffPAB3nnnHVy4cAEAJLkDp6mpKVxcXNCrVy8AQHR0NGxsbJQDQJ999pnIeFQOnKNLat24cQNWVlaiY1A1Zm1tjfbt25f4fbh8+fIqTlRc7969cfjwYbXn/vOf/3A+MQmTnJyM3377TVJzdDVpebH169eXen7atGlVlIQqi0WX1Pruu+8waNAgGBoaYs6cObh06RIWLlwIe3t70dGomggODkZISAiePXsGNzc39O/fH8bGxqJjqZg7dy5atWpVbO769u3bcfXqVfj6+gpKRtXV0qVLERsbi3/++Qe2trbK/xo2bCg6GpcXIyFYdEmtAQMGICIiArGxsdiyZQumTp2KL7/8UlJXxVL1cPfuXYSGhuLAgQOwsrLClClTYG1tLToWAODx48cYNWoUTExM8PbbbwMALly4gNTUVOzatQsNGjQQnJCqm59//hl2dnZo3ry56CglKml5sY8//lh0NKUXlxeztbXFJ598wuXFNJCO6AAkTbq6ugAK9kkfMGAAunTpwovRSAhzc3OMGzcOY8aMwenTp3Hp0iXRkZTq16+P0NBQeHh4IDc3F7m5ufDw8EBoaChLLgkxdOhQGBoaIjo6GtHR0UhNTRUdqZhffvkFH374IQwNDWFkZISJEyfi0KFDomOpWLBgAdLS0rBw4UIsXLgQGRkZWLBggehYVAG8GI3U0tfXx+bNm7F//37s3r0bCoVCcgt6k3ZTKBQ4fvw4goODER8fD2dnZwQEBMDc3Fx0NBX6+voYPHiw8nZubi6ioqIQFBSEnTt3CkxG1dHx48cxZ84ctG3bFgBw/fp1+Pr6onv37oKT/YvLi1FVYtEltZYvX44ff/wRXl5eaNCgAZKSkjBgwADRsagacXBwQMOGDeHu7o6pU6dCJpMhJycHN2/eBAC0atVKcEJVFy9eRFBQEKKiotChQwe4ubmJjkTV0OrVq7F7925YWloCABISEjBnzhxJFd2iy4sBBbu5cXkxel04R5eIJMnR0VH5sUwmU5k6I5PJJLGiQUpKCsLDwxEUFAS5XA5XV1fs2bMH0dHRoqNRNTVw4ECEh4e/9Jhojx8/xsWLFwFIc3mxTz/9FOfOnSu2vNgbb7wBgMuLaRKO6JJaHh4eaq+O3bt3r4A0VB0dOXJEdISXcnBwgI2NDby9vdGlSxcABZtIEIliZmaG4OBguLu7AwBCQkIkVyKBgvntRf+YlZpWrVqpvGv04u6HpDk4oktqnT59WvlxTk4O9u/fj4YNG2LWrFkCUxFJi6+vL8LDw/Hmm2/Cw8MDTk5OGDBggCRGm6l6SkpKgpeXF65duwYAaNu2Lb7++mtJzG0fO3Ysdu7cCVtbW5WBFIVCAZlMhpiYGIHpSLDiLTsAAAfcSURBVFux6FKZKBQKDB8+HHv27BEdhUhS8vPzER0djeDgYJw+fRp5eXnw9/eHra2t6GhUjWVnZwMA6tati4CAAEmMSD569AgNGzbE/fv31Z5v2rRpFScq7sWNImQyGerVqwdbW1u0aNFCTCiqFBZdKpPMzEy4ubmVuAsUERXM2Q0LC0NwcDDS09Nx7Ngx0ZGI0LNnT84bL6MVK1YUO5aWloYTJ05g0aJF6NOnj4BUVBmco0tqFZ2jm5+fj3v37mH8+PGCUxFJy+7du4sd09PTw7Bhw5CWliYgEVFxUhnPGjRoUKnnpXANyNy5c9Uef/DgAaZNm8aiq4FYdEmtov/YdXV1YW5uLoktJImkZNmyZWjfvj2srKxERyEqUWnb7lalhIQEtGzZEu7u7mjdurXoOOXSuHFj5Ofni45BFcCiS2q99957oiMQSZ6Pjw9CQkIQHx8PNzc39O/fH8bGxqJjUTW0cuVKtccVCgUyMzOrOI16J0+eRFRUFEJCQhAaGgpXV1eN+TeTkZHBoquhOEeXVMyZMwe+vr5qlxeTyWQwMTHBhAkTYGdnJyghkfTcvXsXoaGhOHDgAKysrDBlyhRYW1uLjkXVyIsXUb1o2rRpVZSkbAr/zQQGBsLLywsDBw4UHQmA+ulIaWlpiIqKwrBhwzBy5EgBqagyOKJLKsaOHft/7d1NSFRfGMfx35gTQYgiES2SXoVAWmURoUQi0ViWBTFBMNQiKCIM2pSrXhYFFUTtCkNclTWjFURBWlEtopdVURHT5NbElJnANLBFzPAfveadzM459//97O4ozA+GGZ7n3OeeI2nyOaX+/n4dP35c9+/f/5exAKtVVFRoz549mjdvni5evKiamhoKXfxTfgvZmzdvTjkrO9PS6bSePn2qZ8+eadGiRbmjgG3w5s2bCa+Vl5fr2LFjWrdunYFEmC5WdFGw69evKxqNmo4BGDc2NqYnT54okUjo48ePikQi2rZtmxV7lgJetm/frs7OTiPv/fjxY3V1denDhw9qaGhQU1OTFi5caCTLdNnQMMAfCl3kmexEtCwbnooFbFFbW6v58+drx44dWrNmzYTvzn9PVgJs0NTUpK6uLiPvvWLFClVVVXl+VyS3jtU12TCgMIwuIE92ZOHRo0f69OlTrmNNJBJasmSJyWiAdcLhsL5+/arW1lZdvXo1bxunUCjECWmwjskdGA4ePGjNDhDTxRqhOyh0kSe728LZs2fV0dGR+1HasGGDdu3aZTIaYJ2enh7TEQBnHDp0yNf/uTAWEJSC/f+gyHQA2GloaEjfv3/PXY+MjGhoaMhgIgDAdLmwEum18wHwp1jRhadIJKJoNKqGhgZJ0t27dxWJRAynAgBMx5kzZ0xHmJILxbgLGfELD6NhUg8fPtTz588VCoW0du1arV+/3nQkAICHID1I7MKDXu/fv2cLQUewogtP6XRar1+/VjKZ1PDwsN6+favW1la1t7ebjgYAGGeyvc9RGL8NA0WuOyh04amlpUXLli3T58+f1dzcrHg8rqqqKtOxAAAegnRsu8kbzTQMwcPoAjxt3bpVt2/fVmNjo+7cuaORkRHFYjFdu3bNdDQAwCTS6bSuXLmid+/e5T1Q7NLdOMYC8DexogtPs2fPlvRrn9DBwUGVlpZqYGDAcCoAwO/YfDfOpbGAIDQM+IVCF54WL16swcFBNTY2KhqNqqSkxJofSwCAt97eXl26dEnd3d3asmWLNm7cqFgsZjqWJLfGAmxuGFAYCl14OnfunCRp7969WrlypdLptGpraw2nAgD8js1341yaI7a5YUBhKHQxperqatMRAAA+uHA3zoWxAJsbBhSGQhcAgIBw4W6cC2MBLjQM8IddFwAACJBUKqVkMqn6+nplMhn9+PFDZWVlpmPluLarz8uXL3MNQ3Ex64OuKTIdAAAA/B2JREIHDhzQ6dOnJUl9fX06fPiw4VT5xo8FhMNhK8cCUqmUHjx4oOrqaq1evVqZTMZ0JPwBCl0AAAKivb1d8XhcJSUlkqSlS5eqv7/fcKp848cCdu7cad1YgAsNA/xhDR4AgIAIh8OaO3du3muzZs0ylMabC3PE2YZh9+7dkuxsGOAPhS4AAAFRVlamVCqVO5jh1q1bWrBggeFUE42fI85kMlbNEbvQMMAfCl0AAAKipaVFR44cUSqVUl1dnebMmaNTp06ZjpUnkUjo8uXLGh0dVX19vfr6+nTy5Em1tbWZjpbjSsOAqVHoAgAQAF++fNG3b9/U0dGh3t5eDQwM6N69e9q/f79evHhhOl6OC2MBLjQM8IdCFwAAx924cUMnTpxQaWmpysvL1dzcrKNHj6qmpkbxeNx0vDy2jwW40jDAHwpdAAAc19bWps7OTlVWVurVq1eKxWI6f/68Nm3aZDraBDaPBbjUMMAfCl0AABxXXFysyspKSdKqVatUUVFhZZEr2T0W4FLDAH8odAEAcNzo6KiSyaSyh50WFRXlXS9fvtxkvBzbxwJcahjgD4UuAACOGx4e1r59+/Jey16HQiF1d3ebiJXHhbEAVxoG+Bcay356AAAAM2Tz5s26cOGC1WMBdXV1k/7NloYBhWFFFwAAzDgXxgJ6enpMR8BfRqELAABmHGMBMIHRBQAAMOMYC4AJFLoAAAAIpCLTAQAAAICZQKELAACAQKLQBQAAQCBR6AIAACCQfgLO/oqlVdMSzAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "corr = stock_df.corr(method ='pearson')\n", "\n", @@ -255,136 +259,91 @@ " square=True, linewidths=.5, cbar_kws={\"shrink\": .5})\n", "plt.title(\"Correlation Heatmap: Stock & Technical Data\")\n", "plt.show()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 645 - }, - "id": "LJaXMOffkO9t", - "outputId": "e8da8fa6-fca8-49c5-ac72-b66062eefec2" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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s8YICAgwdu3aZRQUFBgHDx40jh49ahiGYTzyyCNGr169jBMnThinT582goKCjKVLl9rm4u3tbbz//vtGbm6usWnTJsPX19fIysoyDKPw52nXrl2Gv7+/kZKSYlitVuPEiRO2z+E333xjHDp0yCgoKDC2b99u+Pr6Gj/++GOR96s4np6exsGDBwu15ebmGt7e3samTZuua/w9e/YYP/zwg5GXl2ccOXLECAoKMhYsWFCq9x+oqKjoAuUsKytL1atXv+LXuQkJCRo2bJhq1KghV1dXDRs2TF988YXtuJ2dnaKionTXXXfJyclJktSsWTN17dpVdnZ2OnfunJKTkzVu3DjdfffdqlGjhp588kklJSUVe73Q0FBbTIMGDVJubq5SU1OvaT4JCQl68skn5eHhoSpVquiFF17QmjVrCq2pHT58uJycnPTggw/qwQcf1E8//VTiePPnz1fz5s1t2+UqsiQZhqGVK1dq3LhxqlatmpydnTVkyBDbvKpXr67AwEBVrlxZzs7Oeu655/Svf/3rqnN4+umn5ezsrEaNGsnT01Pt2rWTh4eHqlatqg4dOmjfvn3XPH5oaKg8PT1199136/nnn9e6detslcuEhASFhIQUG0NoaKheffVVpaSkaMCAAWrbtq0+/vjjEmPetGmT7rvvPoWFhcnBwUHBwcFq0KCBvvnmG508eVKbN2/WpEmTdM8998jR0VEtW7Ys9D6+9dZb2rp1qxYvXixXV9dir/Hvf/9bCxYs0Pz58/Xqq6/aKqCHDh1Sq1atZBjGVd9bSTp16tQVP4+ff/65nn76afn6+spisei+++5T3bp1becPGDBAtWrVUrVq1fTII49o//79tmMODg4aNmyYHB0d1bFjR919993FfnY///xz9erVS+3atZOdnZ1q1aqlhg0bSpI6deqk+vXry2KxqGXLlmrXrl2Z1ss7OjqqevXqOnPmzHWN37hxYzVr1kwODg6qV6+eIiMjr+lzDIA1ukC5q1atmk6fPn3FdbQnT55UnTp1bPt16tTRyZMnbfvVq1dXpUqVCp1Tu3Zt2+vjx48rPz9fAQEBtraCggK5u7sXe71PPvlEn3/+uU6ePCmLxaJz587Zvna9mpMnTxZKSurWrav8/HxlZGTY2u69917b68qVK+vChQsljjdo0CCNGjXKtn95rackZWZmKicnRxEREbbjhmGooKBAkpSTk6O33npLW7ZssSUZ58+fl9Vqlb29fYnX/GN8lSpVKrJ/6tSpax7/j+9xnTp1lJeXp9OnTxcasyQ9e/ZUz549lZeXpw0bNuill16St7e32rdvX6Tvnz8jl6+Xnp6uEydO6J577tE999xT7HXOnj2rlStXavr06apatWqJ8Xz22WeKjIxUy5YtNWvWLD3zzDOaOnWqMjIy1KpVK1kslqvOSbr65zEtLc22ZKM4NWvWtL2uXLlyoX8L1apVK/TvqKTPV1pamjp27Fjs+MnJyZo9e7YOHjyogoIC/f777/L09LymuRUnLy9PmZmZtve/tOOnpqbq7bff1o8//qicnBxZrVb5+PhcdzxARUKiC5QzPz8/3XXXXdqwYYOCgoKK7ePm5qbjx4+rUaNGki79T9rNzc12vLgE449ttWvX1l133aXvvvvuqjcC7dy5U/PmzdPChQvVqFEj2dnZqUWLFrZq3dWSGTc3Nx07dsy2f/z4cTk4OKhGjRpXvHHpelSvXl1OTk5KSkpSrVq1ihyfP3++UlNTtXLlStWsWVP79+9XWFjYNVcer+Zaxk9LSyv0+nJ1rzQcHR3VrVs3zZ07VwcOHCg20b38GfmjtLQ0tW/fXrVr19aZM2eUnZ0tFxeXIue6uLho2rRpGjlypGbNmqWHH3642Djy8/OVl5cnSfL19dX06dM1YsQIubi46P3337/m+Vzt8+ju7q7Dhw9f83jXo6Rr5ObmKioqSlOmTFGXLl3k6OiooUOHlukz8/XXX8ve3l6+vr5XHb+4f18TJ07UQw89pHfffVfOzs5auHCh1q9ff93xABUJSxeAcla1alVFRUXp9ddf14YNG5STk6O8vDwlJydr6tSpkqQePXroww8/VGZmpjIzMzV79uwSv/Iujpubm9q1a6e3335b586dU0FBgQ4fPqwdO3YU6Xv+/HnZ29vL1dVV+fn5mjVrls6dO2c7XqNGDR07dsxWNf2z4OBgLVq0SEeOHNH58+c1ffp0devW7abcaW9nZ6fevXvrzTfftFWM09PTtWXLFttcKlWqJBcXF2VlZWnWrFmFzr/33nt15MiR677+1caXpC+++EI///yzcnJy9MEHHygwMPCK1eTLYmNjtWnTJtt/r+TkZP3888/y9fUtNvaOHTvq4MGDSkhIUH5+vtasWaOff/5ZnTp1kpubmzp06KBJkybpzJkzysvLK/LVd6tWrfTOO+9oxIgR2r17d7ExBQUF6dNPP9W//vUvFRQUyM3NTXXr1tWpU6euaU6XXe3z+Nhjj2n+/Pn68ccfZRiGDh06VOiPpxvhscceU2xsrLZt26aCggKlp6frl19+UW5urnJzc+Xq6ioHBwclJydr69at13WNrKwsffHFF3r99dc1ePBgVa9e/arj16hRQ1lZWbYbOKVLn7MqVaqoSpUq+uWXX7Rs2bIyzx+oKEh0gdvAoEGDFB0drTlz5qhNmzbq1KmTPvvsM3Xt2lWSNHToUDVu3Nj2VbaPj0+Jd82XZOrUqcrLy1P37t3VokULRUVF6bfffivS7/Jd8IGBgercubMqVapU6Ov3y1XnVq1aFfvs3F69eqlnz57q37+/unTporvuukuvvfZaqWItjZdeekn33XefHn/8cfn7++vJJ5+0rckcOHCgLl68qNatWysyMrJIJfRvf/ub1q9frxYtWuiNN94o9bWvNr50aa1tdHS02rVrp9zcXL3yyiu2Yz169Ci01vqPnJ2d9dFHH+mRRx5R8+bN9c4772jixIm2x839Ofbq1avro48+0oIFC9SqVSvNmzdPH330kW297dSpU+Xg4KBu3bqpbdu2WrRoUZFrtmvXTm+++aaeffbZQk85uKx79+568cUX9dprr8nf31/Dhg1TZGSkXn75ZQ0ZMqRUz8W90uexW7duevbZZzV69GjbdS4vDblRfH199dZbb+nNN9/Uww8/rP79++v48eNydnbWq6++qpEjR6pFixZKTExU586dSzV2aGio/Pz89Oijj2rVqlUaO3asnn/+eUm66vgNGzZUjx491LVrVzVv3lzp6ekaM2aMEhMT5e/vr9dee03du3e/oe8FYGYW40Z9hwcAKGTAgAHq2bOnevfuXd6hAECFREUXAAAApkSiCwAAAFNi6QIAAABMiYouAAAATIlEFwAAAKZEogsAAABTItEFAACAKZHoAgAAwJRIdAEAAGBKJLoAAAAwJRJdAAAAmBKJLgAAAEyJRBcAAACmRKILAAAAUyLRBQAAgCmR6AIAAMCUSHQBAABgSiS6AAAAMCUSXQAAAJgSiS4AAABMiUQXAAAApnTbJbrbt29XRESEJGnPnj0aPXp0mcZKSUkpcxylFR0drSVLllzXuQAAALgxbrtE94+aNGmid99997rP37Fjh7Zu3XoDIwIAAMCdwuFWXmz06NFKTU1VXl6e6tevrzfffFP33HOPpk+frjVr1sjFxUUtW7a09d++fbumTJmi2NjYQq//fOzXX3/V2LFjlZOTo4KCAoWHhysgIEDLly9XQUGBvv32W/Xo0UPPPPOMkpOT9eGHHyo3N1eOjo4aO3asmjVrJkklxlGS9PR0vfHGGzp48KAkKTg4WEOGDCnU5/z583rjjTe0Z88eSVJoaKgGDx4sSZo1a5YSExNVqVIlWSwWLV68WC4uLtq1a5feeecdnT9/XpIUFRWlTp06lem9BwAAqGhuaaL7yiuvyNXVVdKlpHLu3Lny9/fXxo0btXr1ajk5OWnYsGGlHnfp0qXq3LmzLck8c+aM7rnnHvXp00cXLlzQmDFjJEmHDx/WnDlz9Mknn8jZ2VkHDhzQ4MGDtWnTJm3cuLHUcbz44ovq2LGjZs6cKUnKzMws0mfOnDkqKChQQkKCzp8/r8jISHl6eqpp06ZauHChUlJS5OTkpHPnzsnJyUnZ2dmaMGGCPv74Y7m5uenkyZN67LHHlJiYKBcXl1K/NwAAABXVLU104+PjlZCQoLy8PF24cEH333+/8vLy1L17d1WpUkWS9Nhjj2nOnDmlGrdFixaaNm2acnJy1KpVK7Vu3brYflu2bNHhw4f1xBNP2Nry8/N16tQpbd++vVRxnD9/Xj/88IMWLFhga7ucxP/Rtm3bNG7cOFksFjk7O6tHjx7atm2bAgICVL9+fb388ssKCAhQp06d5OzsrB9++EFHjx61VX0lyWKx6NChQ2rSpEmp3hcAAICK7JYlujt37tSyZcu0fPlyubq6KiEhQStXrrzm8+3t7WUYhm3/4sWLtteBgYFq1qyZtm7dqrlz5yomJkbvvPNOseO0b99eU6dOvf6J3CD29vZauXKlvv/+e3333XeKiIjQvHnzZBiGvLy89Nlnn5V3iAAAAHe0W3YzWnZ2tpydnVWtWjXl5uYqJiZGktS6dWutXbtWFy5ckNVqtbX/mYeHh44cOaIzZ87IMAwlJSXZjh06dEg1a9ZURESEhg0bZlsP6+zsrLNnz9r6tWvXTlu2bNGBAwdsbbt37y5VHJdVqVJFfn5+Wrhwoa2tuKULbdq0UUxMjAzD0Llz57RmzRq1bdtW586dU2Zmplq2bKmoqCh5enrqwIED8vPz06FDh/Tdd98VivGPST4AAACu7pZVdNu3b68vvvhCgYGBql69upo3b649e/bokUce0f/93/8pNDTUdhNYenq67TyLxSJJqlWrlv7+978rIiJC9957r1q0aGFLWNeuXauEhAQ5OjrKYrFo3LhxkqSuXbtq9erVCg0Ntd2MNm3aNL3yyiv6/ffflZeXJ39/f/n6+l41juK88847mjRpkoKDg2VnZ6fg4GA988wzhfoMHTpU//jHPxQSEiJJ6tmzpzp06KATJ05oxIgR+v3332UYhh566CE9+uijqlSpkubMmaNp06bpzTffVF5enjw8PPTRRx/Z3gsAAABcncW4jUuFa9asUUxMjD755JPyDgUAAAB3mNv2ObrLly/X+++/r7///e/lHQoAAADuQLd1Rfd2kJycrPfee69I+wsvvKCOHTuWQ0QAAAC4FiS6AAAAMKXbdukCAAAAUBYkugAAADAlEl0AAACYEokuAAAATIlEFwAAAKZEogsAAABTItEFAACAKZHoAgAAwJRIdAEAAGBKJLoAAAAwJRJdAAAAmBKJLgAAAEyJRBcAAACm5FDeAeDGOxAQWN4hlKhRyvryDgEAAFQQVHQBAABgSiS6AAAAMCUSXQAAAJgSiS4AAABMiUQXAAAApkSiCwAAAFMi0QUAAIApkegCAADAlEh0AQAAYEokugAAADAlEl0AAACYEokuAAAATIlEFwAAAKZEogsAAABTItG9CdauXauwsDCFhoYqKChIo0ePliR17txZAQEBslqttr6xsbHy8vLSkiVLCo0xbdo0NW7cWBkZGbc0dgAAALNwKO8AzObkyZOaNGmS4uLi5O7uLsMwtH//fttxNzc3paSkqGPHjpKkuLg4+fj4FBrDarUqPj5e/v7+io+P16BBg27pHAAAAMyAiu4NdurUKTk4OKhatWqSJIvFooceesh2PDw8XLGxsZKkI0eO6MKFC/L09Cw0RnJysurXr6+oqChbXwAAAJQOie4N9uCDD8rX11edOnVSVFSUFi5cqNOnT9uOt2zZUv/973915swZxcXFKSwsrMgYMTExioiIUPPmzZWXl6ddu3bdyikAAACYAonuDWZnZ6c5c+bo008/VatWrZScnKyePXsqKytL0qUKb7du3ZSUlKSkpCQFBwcXOj8jI0M7duxQUFCQJCksLEwxMTG3fB4AAAB3Otbo3iSenp7y9PTUE088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7VrVqFFD3t7eSkxMlHQpH/P29i7VsoX09HTb6/379+vYsWN64IEHrn2CJbgtK7otW7bU0qVLdebMGcXFxSksLEx79+61HY+JiVFERISaN2+uvLw87dq1S02bNtXevXvl6+tbqms1bNhQTk5OSk1NLfHcp59+Wi+//LJ8fHzUtGlTBQYGFtt39uzZcnFx0bp165SVlaWIiAgFBgbajv/444/6/PPPVbVqVT311FNKSEjQ448/roceekhLly6Vvb29Tp06pYiICAUEBOiee+4p1VwAAADKw8SJExUdHa05c+bIxcXFVugbPHiwoqKi1KRJE+3cuVMvvPCCzp07J8MwlJSUpMmTJ6t9+/Z67733tHfvXtnZ2cnR0VFTp04tVOW9XrdlomuxWNStWzclJSUpKSlJy5cvtyW6GRkZ2rFjh+0NDAsLU0xMjJo2bXrd1zMM44rHe/bsqfbt22vbtm3auXOnBg4cqH/84x+2uwsv2759u20JRLVq1dS1a9dCxwMCAmxfAfj6+urw4cOSpMzMTI0bN06HDh2Svb29zpw5o9TUVDVr1uy65wQAAGBzk38ZrWHDhlq1alWR9rlz59peN2/eXJs3by72/D8/V/dGuS0TXenS8oXevXurRYsWhRYix8fHKz8/Xz179pQk5efnKycnR+PGjZOPj49iYmJKdZ1ff/1VFy9eVIMGDa7Yr3r16urevbu6d++u2rVrKzExsUiiezWVKlWyvba3t9fFixclXforqHPnzpo1a5YsFosCAwNtxwAAAMrsJj9H93Z1W67RlS6tnx01apSGDh1aqD02NlazZ8/Wxo0btXHjRm3evFm+vr5at26devTooczMTM2bN89WpT137pxWrFhR7DWOHj2qV155RX379pWzs3OJsWzatMmWeFqtVv3nP/9RvXr1ivRr2bKl4uPjJUnZ2dn6+uuvr2muZ8+eVd26dWWxWLR161YdOnToms4DAABAyW7biq4kRUZGFtrPyspSVlaWWrduXag9JCREMTExCgsL06effqpp06apS5cuqlKlihwcHNSvXz9b39WrV2vbtm22x4uFhIRowIABV4xj+/btmjJlihwcHGS1WtW4ceNin7YwbNgwjR07VkFBQapZs6YaN258xQT6stGjR2vSpEmaOXOmmjRpIi8vr6ueAwAAcM1KcXOZmViMqy1QxTXLy8tTQUGBKlWqpHPnzqlv374aO3as2rZte0vjOPbGO7f0eqVR99UXJUlZB34u50hKVq3RXyRJmd/9q5wjKZlr6xaSpAMBgVfpWX4apaxX1k//Le8wrqjag55X7wQAJnBiwZJSn1P77/1vQiS31m1d0b3TZGdna/DgwbJarbp48aKCg4NveZILAABQxE2+Ge12RaL7P/v371d0dHSR9v79+6t3797XNEaNGjUKPdcXAADgdlCa5+KaCYnu/3h7e9tuJAMAAMCdj0QXAADA7Cro48VIdAEAAMzOrmKu0a2YswYAAIDpUdEFAAAwuwq6dIGKLgAAAEyJii4AAIDZVdCKLokuAACAyVm4GQ0AAAAwDyq6AAAAZsfSBQAAAJhSBf0JYJYuAAAAwJQshmEY5R0EAAAAbp6TcQmlPsctPOQmRHJrUdEFAACAKbFG14TSTmWWdwglcr/XVZKUsu/nco6kZAEP/UWStHX/7RtjO+9LMR4ICCznSErWKGX9bR2fdCnGtDnzyjuMErkPfbq8QwBgEpYKejMaFV0AAACYEhVdAAAAs7NUzNpmxZw1AABARWJnKf1WCqmpqYqMjFRgYKAiIyN18ODBIn1SUlIUERGhxo0ba8qUKYWOWa1WTZo0SV27dtVf//pXrVq1qiyztSHRBQAAQJlMmDBB/fr10/r169WvXz+NHz++SB8PDw9NnjxZTz31VJFjCQkJOnz4sL788kutWLFCM2fO1NGjR8scF4kuAACA2Vkspd+uUUZGhvbt26fg4GBJUnBwsPbt26fMzMI3x993333y9vaWg0PRlbNr1qxR7969ZWdnJ1dXV3Xt2lXr1q0r25zFGl0AAADzsyt9bTM7O1vZ2dlF2l1cXOTi4mLbT0tLU61atWRvby9Jsre3l5ubm9LS0uTq6npN10pLS1OdOnVs++7u7jpx4kSpY/4zEl0AAAAUsWjRIs2aNatI+/DhwzVixIhyiKj0SHQBAADM7jqeoztw4ECFh4cXaf9jNVe6VH1NT0+X1WqVvb29rFarTp48KXd392u+lru7u44fPy5fX19JRSu814s1ugAAACjCxcVF9erVK7L9OdGtUaOGvL29lZiYKElKTEyUt7f3NS9bkKSgoCCtWrVKBQUFyszM1IYNGxQYWPYfHSLRBQAAMDmLnaXUW2lMnDhRS5YsUWBgoJYsWaJJkyZJkgYPHqw9e/ZIknbu3KkOHTpowYIFWr58uTp06KAtW7ZIkkJDQ1WvXj09+uijevzxxzVs2DB5eHiUed4sXQAAADC7m/yDEQ0bNiz22bdz5861vW7evLk2b95c7Pn29va25PhGoqILAAAAU6KiCwAAYHalXIpgFiS6AAAAZncdT10wAxLda7R27Vr985//lGEYunjxonx8fPTuu+/Ky8tL33//vapUqVLma3h5ecnT01OSlJubKx8fHw0dOlR/+ctfyjw2AABARUOiew1OnjypSZMmKS4uTu7u7jIMQ/v3778p11q+fLmqVKmigoICrVixQn379lVsbOwNufMQAABUUDf5ZrTbVcWcdSmdOnVKDg4OqlatmiTJYrHooYceKtJv9+7dioyMVEhIiCIjI7V7925J0rvvvqt58+ZJuvRbzg8++KAyMjIkXXrsRkpKSpGx7Ozs1LdvXwUEBGjp0qU3a2oAAACmRaJ7DR588EH5+vqqU6dOioqK0sKFC3X69OlCfXJzcxUVFaWRI0cqISFBzz//vKKiopSbm6s2bdpo27ZtkqTvvvtOzZo103fffae8vDzt3r1bDz/8cInXbtq0qX7++eebOj8AAGBuN/s5urcrEt1rYGdnpzlz5ujTTz9Vq1atlJycrJ49eyorK8vWJzU1VY6OjmrTpo0kqW3btnJ0dFRqaqr8/f31448/Kjc3V99//72GDh2qb7/9Vrt27VKjRo1UuXLlEq9tGMZNnx8AADA5i6X0mwmQ6JaCp6ennnjiCS1YsEBVq1bVjh07ruk8JycneXp6KikpSTVr1lTr1q31f//3f9q2bZtat259xXP37NmjRo0a3YjwAQBARWVnV/rNBMwxi5ssPT1dP/zwg23/xIkTyszMVL169WxtDzzwgPLy8vTdd99JkrZt26b8/Hw98MADkqQ2bdpo5syZatOmje666y7Vrl1bcXFxtgrwnxUUFGjlypXasmWL+vbtexNnBwAATK+CVnR56sI1yM/P18yZM3Xs2DE5OTmpoKBAI0eOLHRD2l133aUZM2Zo8uTJunDhgu6++2598MEHuuuuuyRdSnQ/+OADWwW3devW+v777+Xr61voWn369JF0ac3vQw89pGXLlvHEBQAAgOtAonsN6tatq/nz5xd77D//+Y/tta+vr1asWFFsPz8/v0J9Bw8erMGDB5c4FgAAwA1jkpvLSotEFwAAwOQsPEcXAAAAMA8qugAAAGZnkpvLSouKLgAAAEyJii4AAIDZcTMaAAAATImb0QAAAADzoKILAABgdixdAAAAgBlZeOoCAAAAYB5UdAEAAMzOrmLWNivmrAEAAGB6VHQBAADM7iav0U1NTVV0dLSysrJUrVo1TZkyRffff3+hPlarVW+88Ya2bNkii8WiZ555Rr1795YkzZw5U0uXLpWbm5skyd/fXxMmTChzXCS6AAAAZneTE90JEyaoX79+Cg0NVXx8vMaPH6/FixcX6pOQkKDDhw/ryy+/VFZWlsLCwtSmTRvVq1dPkhQWFqYxY8bc0LhYugAAAIAisrOzdfTo0SJbdnZ2oX4ZGRnat2+fgoODJUnBwcHat2+fMjMzC/Vbs2aNevfuLTs7O7m6uqpr165at27dTZ0DFV0Tcr/XtbxDuKqAh/5S3iFcVTvv2z/GRinryzuEK7rd45Mk96FPl3cIAHDzXcfNaIsWLdKsWbOKtA8fPlwjRoyw7aelpalWrVqyt7eXJNnb28vNzU1paWlydXUt1K9OnTq2fXd3d504ccK2n5SUpJSUFNWsWVMjRoyQn59fqWP+MxJdEzqRcbq8QyhR7RrVJUnbfvqlnCMpWZsHG0q6M2JM7TOonCMp2QPL5+tAQGB5h3FFjVLW69T6DeUdRonuDewqSbf1+3gn/DED4Pqeoztw4ECFh4cXaXdxcbkRIRXSp08fPfvss3J0dNTWrVs1dOhQrVmzRtWrVy/TuCS6AAAAZncdv4zm4uJyTUmtu7u70tPTZbVaZW9vL6vVqpMnT8rd3b1Iv+PHj8vX11dS4QpvzZo1bf3atWsnd3d3HThwQC1btix13H/EGl0AAACzs9iVfrtGNWrUkLe3txITEyVJiYmJ8vb2LrRsQZKCgoK0atUqFRQUKDMzUxs2bFBg4KVvrNLT02399u/fr2PHjumBBx4o87Sp6AIAAKBMJk6cqOjoaM2ZM0cuLi6aMmWKJGnw4MGKiopSkyZNFBoaql27dunRRx+VJA0bNkweHh6SpPfee0979+6VnZ2dHB0dNXXq1EJV3utFogsAAGB217F0oTQaNmyoVatWFWmfO3eu7bW9vb0mTZpU7PmXE+MbjaULAAAAMCUqugAAAGZ3k38w4nZFogsAAGB2pbi5zEwq5qwBAABgelR0AQAATM5yk29Gu12R6AIAAJhdBV2jy9IFAAAAmBIVXQAAALOzq5i1zYo5awD4f+zde1zN9+MH8NcpErq7zSWTSBjD2hRp9GXJF93c75exGTJkLjPEli/NEMvd2NisdEcxs1wrl81tbkmEkdE9Vied3x/9OuvolC70/pzT6/l47PHtfD6nzuucb+rV+7w/7zcREWk9jugSERERabtqOkeXRZeIiIhI21XTVRc4daGcIiMj4erqChcXF/Tt2xezZ88GALRp0wbZ2dmv5DGKfq2UlBS4ublhzZo1r+RrExEREVUXHNEth0ePHsHb2xshISFo3LgxFAoFrl69+toe78GDB5gwYQKGDBmC8ePHv7bHISIiIu0m485o9DKPHz9GjRo1YGJiAgCQyWRo165dsftdvHgRQ4cOxYABAzB06FBcvHgRALBq1Sps3boVAHDgwAFYW1vjyZMnAIBJkybhxIkTyq+RlJSE0aNHbeXTRgAAIABJREFUY8KECSy5REREVDkyWfn/0wIsuuVgbW2Njh07omfPnvD09MSOHTuQmpqqcp/c3Fx4enri008/RUREBGbMmAFPT0/k5ubCzs4OMTExAIDY2Fh06tQJsbGxkMvluHjxIt555x3l1xk3bhw+/vhjDB48uEqfIxEREZG2YNEtBx0dHfj7++OHH35A165dcfToUQwcOBBpaWnK+yQmJqJmzZqws7MDAHTr1g01a9ZEYmIiunTpgsuXLyM3Nxe///47PvnkE5w6dQoXLlxA69atUbt2beXX6dmzJ/bu3YusrKwqf55ERESkZXRk5f9PC7DoVoCVlRVGjhyJ7777DoaGhjh9+nSZPk9fXx9WVlbYv38/GjRoAFtbW5w/fx4xMTGwtbVVue8XX3wBKysrfPjhhyy7RERERBXAolsOycnJ+OOPP5S3Hz58iJSUFDRr1kx5zMLCAnK5HLGxsQCAmJgY5OXlwcLCAgBgZ2eHdevWwc7ODnp6enjjjTcQEhKiHAEuJJPJ4O3tzbJLRERElaerW/7/tABXXSiHvLw8rFu3Dvfv34e+vj7y8/Px6aefqlyQpqenBz8/P3z11Vd4+vQp6tSpg7Vr10JPTw9AQdFdu3atcgTX1tYWv//+Ozp27Fjs8QrL7qJFi/Dhhx9i69atMDAwqJonS0RERKThZAqFQiE6BL1aD5+kvvxOgrxRzxQAEHMtQXCSktlZWwLQjIyJwyYITlIyiz3bEW/vJDpGqVqfOIjHBw+LjlGi+k69AUDSr2PrEwdFRyCiMsh8/Ljcn2NYv/5rSFK1OKJLREREpO10quds1er5rImIiIhI63FEl4iIiEjbackGEOXFEV0iIiIibfead0ZLTEzE0KFD4eTkhKFDh+L27dvF7vP8+XN4e3ujd+/e6NOnDwIDA8t0rjJYdImIiIioUhYvXowRI0bg4MGDGDFiBBYtWlTsPhEREUhKSsKhQ4fw888/Y926dbh3795Lz1UGiy4RERGRttPRKfd/GRkZuHfvXrH/MjIyVL70kydPcOXKFfTv3x8A0L9/f1y5cgUpKSkq9ztw4AAGDx4MHR0dmJmZoXfv3oiKinrpucrgHF0iIiIiKmbnzp1Yv359sePTpk3D9OnTlbcfPHiARo0aQff/N5nQ1dVFw4YN8eDBA5iZmancr0mTJsrbjRs3xsOHD196rjJYdImIiIi0XH4FLkYbO3Ys3Nzcih03MjJ6FZGqBIsuERERkZbLr8D2YKZGRmUqtY0bN0ZycjKeP38OXV1dPH/+HI8ePULjxo2L3e+vv/5S7gZbdBS3tHOVwTm6RERERFRh9erVQ9u2bbFv3z4AwL59+9C2bVuVaQsA0LdvXwQGBiI/Px8pKSk4fPgwnJycXnquMjiiS0RERKTl8hUVGNIthyVLlmDevHnw9/eHkZERVqxYAQCYNGkSPD090aFDB7i4uODChQv44IMPAABTp06Fubk5AJR6rjJYdImIiIi0nOI1F11LS0u1a99u2bJF+bGuri68vb3Vfn5p5yqDUxeIiIiISCtxRJeIiIhIy73mAV3J4oguEREREWklmeJ1T9ogIiIiIqGSU9LK/TmNzExeQ5KqxakLWujhth9ERyjRGxNHAwAy/nogOEnJjJoUrPuXfitRcJKSGbe0AADE21d+6ZXXpfWJg7i7YKnoGKUy91kk+dcQkP7/z4BmZCSqzqrruCanLhARERGRVuKILhEREZGWq64juiy6RERERFquIlsAawMWXSIiIiItV11HdDlHl4iIiIi0Ekd0iYiIiLRcPqrniC6LLhEREZGW49QFIiIiIiItwhFdIiIiIi1XTQd0WXSJiIiItF1+NW26nLpARERERFqJI7pEREREWq66XozGoktERESk5Th1gYiIiIhIi3BEl4iIiEjLVdMBXRbdquLo6Ag9PT3o6elBLpdjwoQJGDx4MHJzc+Hj44MzZ85AR0cHCoUCH330EQYMGIC4uDisWLECwcHBouMTERERaRwW3Srk5+cHKysr3LhxA+7u7nBwcEBERATS0tIQHh4OXV1dZGdn4++//xYdlYiIiLQIL0ajKmNlZQUjIyMkJyfj4cOHqF+/PnR1dQEAdevWRd26dQUnJCIiIm1SXS9GY9EV4Ny5czA1NYW1tTVq1aqFiRMnIi4uDp07d4aDgwN69+4tOiIRERGRxmPRrUKenp5QKBRISkrC2rVroaenhzZt2uDXX3/FmTNn8Pvvv2PZsmU4duwYli5dKjouERERaQmRUxeePXuG+fPn488//4Suri7mzp2LXr16qb1vQEAAtmzZAoVCAQcHByxcuBA6OjqIi4vD5MmT0aJFCwCAnp4eAgMDX/rYLLpVqHCObmRkJObPn48uXbqgfv36qFWrFuzt7WFvb4/3338f48ePZ9ElIiKiV0bkxIVt27bBwMAAv/zyC27fvo2RI0fi0KFDxaZq3r17F+vXr0doaChMTEwwadIkhIeHw9XVFQBgaWlZ7gv0uY6uAM7OzujevTs2bdqEs2fP4smTJ8pzf/75J5o1ayYwHRERERGQkZGBe/fuFfsvIyOjXF8nMjISQ4cOBQC0aNECb731Fo4dO1bsfgcPHkTv3r1hZmYGHR0dDB48GAcOHKjUc+CIriCzZ8+Gu7s72rdvjy+//BJyuRw6OjqoV68efH19RccjIiIiLVKRi9F27tyJ9evXFzs+bdo0TJ8+vcxf56+//kLTpk2Vtxs3boyHDx8Wu9+DBw/QpEkT5e0mTZrgwYMHytu3b9+Gm5sbatSogREjRsDNze2lj82iW0WOHDmicvvNN9/EuXPnAEA5JP+irl27cg1dIiIiqrSKzNEdO3as2jJpZGSkctvNzQ1//fWX2q9x6tSpcj+uOu3bt8fRo0dhaGiIu3fvYvz48WjUqBG6detW6uex6BIRERFpuYqM6BoZGRUrteqEhISUer5Jkya4f/8+zMzMABSM3Hbt2rXY/Ro3bqxSmP/66y80btwYAGBgYKA8bm5ujt69e+P3339/adHlHF0iIiIiem369u2Ln3/+GUDB9INLly6hR48exe7n5OSEw4cPIyUlBfn5+QgMDISzszMA4NGjR8pR6bS0NJw8eRLW1tYvfWyO6BIRERFpOZH7RUycOBHz5s1Dnz59oKOjg6VLlypHaNeuXYuGDRti+PDhMDc3xyeffIIhQ4YAALp3746BAwcCAA4dOoSffvoJNWrUwPPnz+Hq6lqmfQdYdImIiIi0nMh1dOvUqQM/Pz+152bMmKFye9iwYRg2bFix+40aNQqjRo0q92Nz6gIRERERaSWO6BIRERFpuYpcjKYNWHSJiIiItJzIqQsiceoCEREREWkljugSERERabn86jmgyxFdIiIiItJOHNElIiIi0nIKVM8hXRZdIiIiIi3Hi9GIiIiIiLQIR3SJiIiItFx1XUdXpqiuY9lERERE1cSJKzfL/Tn27Vq9hiRVi0WXiIiIiLQSpy5ooXh7J9ERStT6xEEAzFhZhRnT790TnKRkxs2a4Y+EJNExStXZsjnS/rwqOkaJTNq3BVCxkZiqUjjiE3MtQXCSktlZWyItXrqvIQCYtNb8kTMiKeLFaERERESklVh0iYiIiEgrsegSERERkVZi0SUiIiIircSiS0RERERaiUWXiIiIiLQSiy4RERERaSUWXSIiIiLSSiy6RERERKSVWHSJiIiISCux6BIRERGRVmLRJSIiIiKtxKJLRERERFqJRZeIiIiItBKLLhERERFppRrl/QRHR0fo6elBT08PcrkcEyZMwODBgyv04HFxcVixYgWCg4NLvM+6devw9OlTzJ07t0KP8ToVvha1atVCTk4ObGxssHjxYtSsWfOVPcbo0aMxYcIE9OrV65V9TSIiIqLqoNxFFwD8/PxgZWWFGzduwN3dHQ4ODmjUqNGrziYJeXl5qFGj5Jep8LV4/vw5Ro4ciV9++QX9+vWrwoREREREpE6Fim4hKysrGBkZITk5GdnZ2fDx8UFqairkcjnGjh0LDw8PAMDs2bORmJgIuVyO5s2bw8fHB8bGxpUKfufOHSxatAgpKSmoUaMGZs6cCQcHB+zZswfXr1/H4sWLcfHiRQwePBiBgYHo2LEjlixZgrZt22Lo0KG4cOECvv76a2RnZwMAPD090bNnT9y7dw8eHh5wd3dHbGwshgwZguHDh780T05ODnJycmBkZAQAiImJwZo1a5CTk4Pnz5/j448/xn//+18ABaO0b731Fs6fP49Hjx7B2dkZXl5eAICbN29i/vz5ePr0KaysrJCTk1Op14mIiIiouqpU0T137hxMTU1hbW2NYcOGwdfXF5aWlsjKyoKHhwc6deoES0tLfP755zAzMwMArF69Glu2bFEWu4ry8vLCkCFDMHjwYNy8eRMjR45EZGQk7OzssGPHDgAFZbNz586IjY1Fx44dERMTgwkTJiAjIwOLFy/G5s2b0bBhQzx69AiDBg3Cvn37AABpaWno0KFDmaZLeHp6olatWkhKSoK9vT3s7e0BAO3atcOPP/4IXV1dPH78GO7u7rC3t1cW/AcPHmD37t3Izs5G7969MWjQILRo0QKfffYZRo8eDTc3N5w/f75MJZuIiIiIiqtQ0fX09IRCoUBSUhLWrl2LpKQkJCQkYNasWcr7yOVy3Lp1C5aWlggLC0NERATkcjmePn2KFi1aVCp0VlYWrl69qhwxbtWqFdq2bYvz58/D0dEROTk5ePjwIWJiYjBz5kxs3LgRAwYMUI4oHz16FPfu3cOkSZOUX1Mmk+HOnTswNTVFrVq14OzsXKYshVMXcnJyMH36dOzYsQPjxo1DSkoKFixYgDt37kBXVxfp6elITExEp06dAAB9+/aFjo4ODA0NYWlpiaSkJNSvXx83btyAi4sLAKBTp06wsrKq1GtFREREVF1Vao5uZGQk5s+fjw0bNsDU1BRhYWHF7nv27Fn89NNP2LNnD8zMzBAREYGAgIBKBy+Nra0tfvvtNzx58gRdu3bFsmXLEB0dja5duwIAFAoF2rRpg927dxf73Hv37qF27dqQyWTlesxatWqhZ8+eiI6Oxrhx47BkyRI4Ojpi/fr1kMlkcHJyUpmGUKtWLeXHurq6eP78eQWfLRERERGpU6nlxZydndG9e3dERUVBX18foaGhynMJCQnIyspCRkYGDAwMYGJigtzcXAQFBVU6tIGBAdq2bYuQkBDlY127dk05Wmpra4stW7agc+fOAIAuXbpgy5YtsLOzAwB07twZd+7cQWxsrPJrXrx4EQqFosKZ8vPzcebMGeVodWZmJpo2bQqZTIaTJ0/izp07ZXpeVlZWiIiIUGa6ceNGhTMRERERVWeVmqMLFFxo5u7ujk2bNmHz5s3Ytm0b8vPzUa9ePaxZswY9evRAeHg4nJycYGpqChsbG1y6dKlcj7Fnzx7s379fefuTTz7B119/jUWLFmHHjh2oUaMGVq5cqZwHbGtri88++0xZbG1tbfHzzz/D1tYWAGBsbAx/f3/4+vrCx8cHcrkc5ubm2LhxY7mff+EcXblcjtatW2Pq1KnK18Xb2xvr1q1Dhw4d0KZNmzJ9vZUrV2L+/PnYsmULrKys0KFDh3JnIiIiIiJApqjMMCZJUry9k+gIJWp94iAAZqyswozp9+4JTlIy42bN8EdCkugYpeps2Rxpf14VHaNEJu3bAgBOXLkpOEnJ7Nu1AgDEXEsQnKRkdtaWSIuX7msIACatW4mOQKSVuDMaEREREWmlSk9deBWuXr2KefPmFTs+atSoCu+69qqsX78ev/zyS7Hj27dvR7169QQkIiIiIqKykETRbdu2rdoVG6Rg2rRpmDZtmugYRERERFROnLpARERERFqJRZeIiIiItBKLLhERERFpJRZdIiIiItJKLLpEREREpJVYdImIiIhIK7HoEhEREZFWYtElIiIiIq3EoktEREREWolFl4iIiIi0EosuEREREWklmUKhUIgOQURERET0qnFEl4iIiIi0Ug3RAejVi7d3Eh2hRK1PHATAjJVVmDHj/l+Ck5TMqGkTXL/7QHSMUrUxb4y0+JuiY5TIpHUrAMCJK9LNaN+uIGPMtQTBSUpmZ22JjL+k/b1o1KSxRvzMIdI0HNElIiIiIq3EoktEREREWolFl4iIiIi0EosuEREREWklFl0iIiIi0kosukRERESklVh0iYiIiEgrsegSERERkVZi0SUiIiIircSiS0RERERaiUWXiIiIiLQSiy4RERERaSUWXSIiIiLSSiy6RERERKSVWHSJiIiISCu9tOg6Ojqib9++GDhwIJydnREYGFjhB4uLi4O7u3up91m3bh3atGmD6Oho5bHs7Gx07txZ+bnJyckYPXp0iV+jTZs2yM7Ofum50u73MsHBwbCxsYGLiwtcXFzg5uaGmJiYCn2tkpTl9SIiIiIi9WqU5U5+fn6wsrLCjRs34O7uDgcHBzRq1Oi1hWrfvj1CQkLQs2dPAEBUVBQsLCyU5xs1aoQffvjhtT1+WXXr1g1+fn4AgKNHj2Lp0qWIjIwUnIqIiIiIgDIW3UJWVlYwMjJCcnIysrOz4ePjg9TUVMjlcowdOxYeHh4AgNmzZyMxMRFyuRzNmzeHj48PjI2Ny/w47733HqKjo5Geng5jY2OEhobCzc0NISEhAIB79+7Bw8MDcXFxAIBDhw7hm2++Qa1atfDBBx+ofK3SzhV169atEp9PWWRmZqo8x5Jeg7i4OPj4+ODtt9/GH3/8AZlMhtWrV8PS0hIAsHr1ahw4cABGRkZ47733yvz4RERERKSqXHN0z507B1NTU1hbW8PLywvz589HUFAQfvzxR2zevBkJCQkAgM8//xzBwcGIiIhAq1atsGXLlnKFkslk6NevH/bv34+7d+/i6dOnsLKyUnvfx48f44svvoC/vz/CwsKgp6dXpnNF5eXllfp8SnLq1Cm4uLigT58+WLx4Mby8vJTnSnsNbt68iWHDhiEiIgLOzs7w9/cHABw5cgRHjhxBaGgoAgICkJiYWObXjIiIiIhUlWlE19PTEwqFAklJSVi7di2SkpKQkJCAWbNmKe8jl8tx69YtWFpaIiwsDBEREZDL5Xj69ClatGhR7mBubm7w8vLC48eP4erqWuL9Lly4gHbt2qFly5YAgKFDh+Lrr79+6bmibt++XerzKUnRqQtxcXGYNWsWDh48iNq1a5f6GlhYWKBdu3YAgE6dOuG3335Tfo1+/fqhbt26AIBBgwYpSzARERERlU+55uhGRkZi/vz52LBhA0xNTREWFlbsvmfPnsVPP/2EPXv2wMzMDBEREQgICCh3MHNzc+jp6SEgIAARERG4ceNGub9GWSkUihKfT1l17doVeXl5iI+PR25ubqmvQdGRZR0dHeTl5VUqPxEREREVV66pC87OzujevTuioqKgr6+P0NBQ5bmEhARkZWUhIyMDBgYGMDExQW5uLoKCgiocbtasWfDy8oKpqWmJ9+nUqROuXLmC27dvA4DKqhClnSvKwsKixOdTVtevX0d2djaaNWtW4dfA1tYWkZGRePr0KZ4/f16p146IiIiouivXxWhAwUVW7u7u2LRpEzZv3oxt27YhPz8f9erVw5o1a9CjRw+Eh4fDyckJpqamsLGxwaVLlyoUrnPnzujcuXOp96lXrx6WLVuGjz/+GPr6+ioXnJV2rqgaNWpg48aN8PHxKfZ8SlM4R1ehUEChUGD58uUwMzOr8GvQq1cvnD9/Hi4uLsqL0ZKTk1/6eURERERUnEyhUChEh6BXK97eSXSEErU+cRAAM1ZWYcaM+38JTlIyo6ZNcP3uA9ExStXGvDHS4m+KjlEik9atAAAnrkg3o327gowx10q/eFckO2tLZPwl7e9FoyaNNeJnDpGm4c5oRERERKSVyj114VW4evUq5s2bV+z4qFGjMHjwYAGJ1Hvy5AkmTJhQ7HifPn0wbdo0AYmIiIiIqKyEFN22bdtWaoWDqlKvXj2NyElERERExXHqAhERERFpJRZdIiIiItJKLLpEREREpJVYdImIiIhIK7HoEhEREZFWYtElIiIiIq3EoktEREREWolFl4iIiIi0EosuEREREWklFl0iIiIi0kosukRERESklWQKhUIhOgQRERER0avGEV0iIiIi0ko1RAegVy/e3kl0hBK1PnEQADNWVmHGjL8eCE5SMqMmjXEn+W/RMUr1ZqMGSE+8LTpGiYwtWgAATly5KTRHaezbtQIAxFxLEJykZHbWlshMSxMdo1SGJiYa8TNHEzISFcURXSIiIiLSSiy6RERERKSVWHSJiIiISCux6BIRERGRVmLRJSIiIiKtxKJLRERERFqJRZeIiIiItBKLLhERERFpJRZdIiIiItJKLLpEREREpJVYdImIiIhIK7HoEhEREZFWYtElIiIiIq3EoktEREREWolFl4iIiIi0UrmKrqOjI/r27YuBAwfC2dkZgYGBFX7guLg4uLu7l3qfefPmYdeuXSrHVqxYgXXr1lX4cV+V4OBg2NjYwMXFBS4uLnBzc0NMTMwrfYyyvEZEREREpF6N8n6Cn58frKyscOPGDbi7u8PBwQGNGjV6HdmEy8vLQ40aJb9E3bp1g5+fHwDg6NGjWLp0KSIjI6sqHhERERGVotxFt5CVlRWMjIyQnJyM7Oxs+Pj4IDU1FXK5HGPHjoWHhwcAYPbs2UhMTIRcLkfz5s3h4+MDY2PjVxJ+3bp1uHnzJlJTU/Ho0SO0bt0aPj4+MDQ0LPVcbm4uVq9ejTNnziA3Nxdt2rTBkiVLULduXcybNw+6urpITExEdnY2wsLCypQlMzNT5XmV9Lzj4uLg4+ODt99+G3/88QdkMhlWr14NS0tLAMDq1atx4MABGBkZ4b333nslrxMRERFRdVThObrnzp2DqakprK2t4eXlhfnz5yMoKAg//vgjNm/ejISEBADA559/juDgYERERKBVq1bYsmXLKwtfmOObb75BVFQUDAwM4O/v/9JzW7duhaGhIfbu3Yvw8HA0bNgQmzdvVn7e1atXsXXr1peW3FOnTsHFxQV9+vTB4sWL4eXlpTxX2vO+efMmhg0bhoiICDg7OytzHTlyBEeOHEFoaCgCAgKQmJj4Sl4jIiIiouqo3CO6np6eUCgUSEpKwtq1a5GUlISEhATMmjVLeR+5XI5bt27B0tISYWFhiIiIgFwux9OnT9GiRYsyP5ZMJnvp8Z49e6J+/foAgEGDBuHLL7986bkjR44gKysLBw8eBADk5ubC2tpa+Xl9+/ZFnTp1Xpqv6NSFuLg4zJo1CwcPHkTt2rVLfd4WFhZo164dAKBTp0747bfflF+jX79+qFu3rjJz0eJORERERGVX4Tm6kZGRmD9/PjZs2ABTU1O1o59nz57FTz/9hD179sDMzAwREREICAgo82OZmpoiLS1N5VhqairMzc3LG1uFQqHA4sWLYWdnp/Z8WUrui7p27Yq8vDzEx8cjNze31Oetp6en/FhHRwd5eXnlfxJEREREVKoKT11wdnZG9+7dERUVBX19fYSGhirPJSQkICsrCxkZGTAwMICJiQlyc3MRFBRUrsfo3r07IiMjkZ6eDgB48OABTpw4AVtbW+V9oqOjkZKSAqBgJYSynHN0dMSOHTvwzz//AACysrKUUy0q6vr168jOzkazZs0q/LxtbW0RGRmJp0+f4vnz5+V+vYiIiIjoXxW+GA0ouODK3d0dmzZtwubNm7Ft2zbk5+ejXr16WLNmDXr06IHw8HA4OTnB1NQUNjY2uHTpUpm/fvfu3TFs2DCMHj0aMpkMurq6WLhwIVq2bKm8j42NDWbOnInk5GS0atUK8+bNe+m5yZMnY/369Rg0aBBkMhlkMhmmTZumvCCsrArn6CoUCigUCixfvhxmZmYVft69evXC+fPn4eLiorwYLTk5uVyZiIiIiKiATKFQKESHqKh169bh6dOnmDt3brnOabt4eyfREUrU+kTBvGhmrJzCjBl/PRCcpGRGTRrjTvLfomOU6s1GDZCeeFt0jBIZW7QAAJy4clNojtLYt2sFAIi5Vrl3xV4nO2tLZL4wDU5qDE1MNOJnjiZkJCqKO6MRERERkVaq1NSFV+Hq1asq0w0KjRo1CoMHDy71c6dPn16hc2X15MkTTJgwodjxPn36YNq0aZX++kRERET0+ggvum3bti3zpgxVrV69epLNRkRERESl49QFIiIiItJKLLpEREREpJVYdImIiIhIK7HoEhEREZFWYtElIiIiIq3EoktEREREWolFl4iIiIi0EosuEREREWklFl0iIiIi0kosukRERESklVh0iYiIiEgryRQKhUJ0CCIiIiKiV40jukRERESklVh0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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {} - } ] }, { "cell_type": "markdown", - "source": [ - "# Section 2: Structuring Data: Acquisition, Wrangling, Integration, Cleaning. " - ], "metadata": { "id": "yqflBPq6YuDq" - } + }, + "source": [ + "# Section 2: Structuring Data: Acquisition, Wrangling, Integration, Cleaning. " + ] }, { "cell_type": "markdown", - "source": [ - "### Step 0: Setting up AWS environment" - ], "metadata": { "id": "7qEh0yC2dHfY" - } + }, + "source": [ + "### Step 0: Setting up AWS environment" + ] }, { "cell_type": "code", - "source": [ - "%%capture\n", - "!apt update\n", - "!apt install gcc python-dev libkrb5-dev\n", - "!pip install sparkmagic\n", - "\n", - "%load_ext sparkmagic.magics \n", - "\n", - "%spark add -s spark_session -l python -u \thttp://ec2-54-146-11-159.compute-1.amazonaws.com -a cis545-livy -p 2wsxxsw2 -t Basic_Access\n", - "\n", - "from pyspark import SparkContext\n", - "from pyspark.sql import SparkSession\n", - "from pyspark.sql.types import *\n" - ], + "execution_count": null, "metadata": { - "id": "OOSIIVa8dgFf", "colab": { "base_uri": "https://localhost:8080/", "height": 53 }, + "id": "OOSIIVa8dgFf", "outputId": "fe8f5e80-3db4-494b-8ff6-3dd67a671a35" }, - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stderr", + "output_type": "stream", "text": [ "An error was encountered:\n", "Error sending http request and maximum retry encountered.\n" ] } + ], + "source": [ + "%%capture\n", + "!apt update\n", + "!apt install gcc python-dev libkrb5-dev\n", + "!pip install sparkmagic\n", + "\n", + "%load_ext sparkmagic.magics \n", + "\n", + "%spark add -s spark_session -l python -u \thttp://ec2-54-146-11-159.compute-1.amazonaws.com -a cis545-livy -p 2wsxxsw2 -t Basic_Access\n", + "\n", + "from pyspark import SparkContext\n", + "from pyspark.sql import SparkSession\n", + "from pyspark.sql.types import *\n" ] }, { "cell_type": "markdown", - "source": [ - "### Step 1: Acquire stock price data for 500 stocks over the period of 2002-2019. " - ], "metadata": { "id": "73SQVQlTX9bW" - } + }, + "source": [ + "### Step 1: Acquire stock price data for 500 stocks over the period of 2002-2019. " + ] }, { "cell_type": "code", - "source": [ - "import math\n", - "\n", - "stock_data_files = os.listdir(in_dir)\n", - "print(len(stock_data_files))\n", - "\n", - "all_stock_data = pd.DataFrame()\n", - "\n", - "for file in stock_data_files: \n", - " stock_data = pd.read_csv(os.path.join(in_dir, file))\n", - " all_stock_data = all_stock_data.append(stock_data)\n", - "\n", - "all_stock_data = all_stock_data[['symbol', 'timestamp', 'adjusted_close']]\n", - "all_stock_data['timestamp'] = pd.to_datetime(all_stock_data.timestamp)\n", - "all_stock_data = all_stock_data[all_stock_data['timestamp'] < pd.Timestamp(2020,1,1)]\n", - "all_stock_data['price_DoD'] = all_stock_data['adjusted_close'].pct_change(1)\n", - "\n", - "# add quarter / month column\n", - "all_stock_data['quarter'] = all_stock_data['timestamp'].dt.to_period('Q')\n", - "all_stock_data['month'] = all_stock_data['timestamp'].dt.to_period('M')\n", - "\n", - "all_stock_data.head()" - ], + "execution_count": null, "metadata": { - "id": "Y9sMnBkKZQhT", "colab": { "base_uri": "https://localhost:8080/", "height": 224 }, + "id": "Y9sMnBkKZQhT", "outputId": "9e09148f-d18b-4d36-ed4e-a3697322123c" }, - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "100\n" ] }, { - "output_type": "execute_result", "data": { "text/html": [ "\n", @@ -551,116 +510,110 @@ "490 USPH 2019-12-24 113.578159 0.013687 2019Q4 2019-12" ] }, + "execution_count": 89, "metadata": {}, - "execution_count": 89 + "output_type": "execute_result" } + ], + "source": [ + "import math\n", + "\n", + "stock_data_files = os.listdir(in_dir)\n", + "print(len(stock_data_files))\n", + "\n", + "all_stock_data = pd.DataFrame()\n", + "\n", + "for file in stock_data_files: \n", + " stock_data = pd.read_csv(os.path.join(in_dir, file))\n", + " all_stock_data = all_stock_data.append(stock_data)\n", + "\n", + "all_stock_data = all_stock_data[['symbol', 'timestamp', 'adjusted_close']]\n", + "all_stock_data['timestamp'] = pd.to_datetime(all_stock_data.timestamp)\n", + "all_stock_data = all_stock_data[all_stock_data['timestamp'] < pd.Timestamp(2020,1,1)]\n", + "all_stock_data['price_DoD'] = all_stock_data['adjusted_close'].pct_change(1)\n", + "\n", + "# add quarter / month column\n", + "all_stock_data['quarter'] = all_stock_data['timestamp'].dt.to_period('Q')\n", + "all_stock_data['month'] = all_stock_data['timestamp'].dt.to_period('M')\n", + "\n", + "all_stock_data.head()" ] }, { "cell_type": "markdown", - "source": [ - "### Step 2: Acquire independent variable data. " - ], "metadata": { "id": "PUE6oTdNZRxe" - } + }, + "source": [ + "### Step 2: Acquire independent variable data. " + ] }, { "cell_type": "markdown", - "source": [ - "2(a) Acquire last-twelve-month (LTM) price-to-sales (P/S), price-to-earning (P/E), price-to-book (P/B), price-to-cashflow (P/CF) ratio of each quarter. " - ], "metadata": { "id": "dzRPU-Z7aA0K" - } + }, + "source": [ + "2(a) Acquire last-twelve-month (LTM) price-to-sales (P/S), price-to-earning (P/E), price-to-book (P/B), price-to-cashflow (P/CF) ratio of each quarter. " + ] }, { "cell_type": "code", - "source": [ - "" - ], + "execution_count": null, "metadata": { "id": "g1VDACmkZdCu" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", - "source": [ - "2(b) Acquire quarterly revenue, adjusted earning, cash flow yoy growth rate. " - ], "metadata": { "id": "hxA9_e9OaKoq" - } + }, + "source": [ + "2(b) Acquire quarterly revenue, adjusted earning, cash flow yoy growth rate. " + ] }, { "cell_type": "code", - "source": [ - "" - ], + "execution_count": null, "metadata": { "id": "tTKX1zqXaO-o" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", - "source": [ - "2(c) Acquire prior day technical indicators of respective stock, including SMA, EMA, VWAP, MACD, STOCH, RSI, ADX, CCI, AROON, BBANDS, AD, OBV. " - ], "metadata": { "id": "E69HjlsHaPSv" - } + }, + "source": [ + "2(c) Acquire prior day technical indicators of respective stock, including SMA, EMA, VWAP, MACD, STOCH, RSI, ADX, CCI, AROON, BBANDS, AD, OBV. " + ] }, { "cell_type": "code", - "source": [ - "" - ], + "execution_count": null, "metadata": { "id": "L0e6O8OVaUqs" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [] }, { "cell_type": "markdown", - "source": [ - "2(d) Acquire overnight stock index performance of other major stock markets, e.g. FTSE, DAX, CAC, Nikkei, HKSE, SHSE." - ], "metadata": { "id": "RvzY6EgUaUz4" - } + }, + "source": [ + "2(d) Acquire overnight stock index performance of other major stock markets, e.g. FTSE, DAX, CAC, Nikkei, HKSE, SHSE." + ] }, { "cell_type": "code", - "source": [ - "stockindex_data = pd.read_csv('/content/other_data/stockindex.csv')\n", - "\n", - "stockindex_data = stockindex_data[['date', 'FTSE100', 'DAX', 'CAC', 'Nikkei225', 'Hang_Seng', 'SHSZ300']]\n", - "stockindex_data['date'] = pd.to_datetime(stockindex_data.date)\n", - "stockindex_data = stockindex_data[stockindex_data['date'] < pd.Timestamp(2020,1,1)]\n", - "\n", - "# filling missing data\n", - "stockindex_data = stockindex_data.fillna(method='ffill')\n", - "stockindex_data.iloc[0, stockindex_data.columns.get_loc('Nikkei225')] = 10871.49\n", - "stockindex_data.iloc[1, stockindex_data.columns.get_loc('Nikkei225')] = 10871.49\n", - "stockindex_data.iloc[0, stockindex_data.columns.get_loc('SHSZ300')] = 1316.46\n", - "stockindex_data.iloc[1, stockindex_data.columns.get_loc('SHSZ300')] = 1316.46\n", - "\n", - "# calculating day-over-day % price change\n", - "stockindex_data['FTSE100_DoD'] = stockindex_data['FTSE100'].pct_change(1)\n", - "stockindex_data['DAX_DoD'] = stockindex_data['DAX'].pct_change(1)\n", - "stockindex_data['CAC_DoD'] = stockindex_data['CAC'].pct_change(1)\n", - "stockindex_data['Nikkei225_DoD'] = stockindex_data['Nikkei225'].pct_change(1)\n", - "stockindex_data['Hang_Seng_DoD'] = stockindex_data['Hang_Seng'].pct_change(1)\n", - "stockindex_data['SHSZ300_DoD'] = stockindex_data['SHSZ300'].pct_change(1)\n", - "stockindex_data = stockindex_data[['date', 'FTSE100_DoD', 'DAX_DoD', 'CAC_DoD', 'Nikkei225_DoD', 'Hang_Seng_DoD', 'SHSZ300_DoD']]\n", - " \n", - "stockindex_data.head()" - ], + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -669,10 +622,8 @@ "id": "-z2rlZo7abxL", "outputId": "a254bae1-c127-4ff1-b254-4c51d2eeb856" }, - "execution_count": null, "outputs": [ { - "output_type": "execute_result", "data": { "text/html": [ "\n", @@ -847,36 +798,49 @@ "[5 rows x 7 columns]" ] }, + "execution_count": 37, "metadata": {}, - "execution_count": 37 + "output_type": "execute_result" } + ], + "source": [ + "stockindex_data = pd.read_csv('/content/other_data/stockindex.csv')\n", + "\n", + "stockindex_data = stockindex_data[['date', 'FTSE100', 'DAX', 'CAC', 'Nikkei225', 'Hang_Seng', 'SHSZ300']]\n", + "stockindex_data['date'] = pd.to_datetime(stockindex_data.date)\n", + "stockindex_data = stockindex_data[stockindex_data['date'] < pd.Timestamp(2020,1,1)]\n", + "\n", + "# filling missing data\n", + "stockindex_data = stockindex_data.fillna(method='ffill')\n", + "stockindex_data.iloc[0, stockindex_data.columns.get_loc('Nikkei225')] = 10871.49\n", + "stockindex_data.iloc[1, stockindex_data.columns.get_loc('Nikkei225')] = 10871.49\n", + "stockindex_data.iloc[0, stockindex_data.columns.get_loc('SHSZ300')] = 1316.46\n", + "stockindex_data.iloc[1, stockindex_data.columns.get_loc('SHSZ300')] = 1316.46\n", + "\n", + "# calculating day-over-day % price change\n", + "stockindex_data['FTSE100_DoD'] = stockindex_data['FTSE100'].pct_change(1)\n", + "stockindex_data['DAX_DoD'] = stockindex_data['DAX'].pct_change(1)\n", + "stockindex_data['CAC_DoD'] = stockindex_data['CAC'].pct_change(1)\n", + "stockindex_data['Nikkei225_DoD'] = stockindex_data['Nikkei225'].pct_change(1)\n", + "stockindex_data['Hang_Seng_DoD'] = stockindex_data['Hang_Seng'].pct_change(1)\n", + "stockindex_data['SHSZ300_DoD'] = stockindex_data['SHSZ300'].pct_change(1)\n", + "stockindex_data = stockindex_data[['date', 'FTSE100_DoD', 'DAX_DoD', 'CAC_DoD', 'Nikkei225_DoD', 'Hang_Seng_DoD', 'SHSZ300_DoD']]\n", + " \n", + "stockindex_data.head()" ] }, { "cell_type": "markdown", - "source": [ - "2(e) Acquire tresaury bond (1-yr, 3yr, 10-yr) market daily performance" - ], "metadata": { "id": "GWvXy4qvacOq" - } + }, + "source": [ + "2(e) Acquire tresaury bond (1-yr, 3yr, 10-yr) market daily performance" + ] }, { "cell_type": "code", - "source": [ - "tbond_data = pd.read_csv('/content/other_data/tbond.csv')\n", - "\n", - "tbond_data = tbond_data[['date', '3M', '1Y', '10Y']]\n", - "tbond_data['date'] = pd.to_datetime(tbond_data.date)\n", - "tbond_data = tbond_data[tbond_data['date'] < pd.Timestamp(2020,1,1)]\n", - "\n", - "tbond_data['3M_DoD'] = tbond_data['3M'].pct_change(1)\n", - "tbond_data['1Y_DoD'] = tbond_data['1Y'].pct_change(1)\n", - "tbond_data['10Y_DoD'] = tbond_data['10Y'].pct_change(1)\n", - "tbond_data = tbond_data[['date', '3M_DoD', '1Y_DoD','10Y_DoD']]\n", - " \n", - "tbond_data.head()" - ], + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -885,10 +849,8 @@ "id": "wHlQIvh5agym", "outputId": "d3c19f7e-6536-410c-96c0-0be269e29e44" }, - "execution_count": null, "outputs": [ { - "output_type": "execute_result", "data": { "text/html": [ "\n", @@ -1043,45 +1005,38 @@ "4 2002-01-08 0.000000 0.000000 0.001965" ] }, + "execution_count": 38, "metadata": {}, - "execution_count": 38 + "output_type": "execute_result" } + ], + "source": [ + "tbond_data = pd.read_csv('/content/other_data/tbond.csv')\n", + "\n", + "tbond_data = tbond_data[['date', '3M', '1Y', '10Y']]\n", + "tbond_data['date'] = pd.to_datetime(tbond_data.date)\n", + "tbond_data = tbond_data[tbond_data['date'] < pd.Timestamp(2020,1,1)]\n", + "\n", + "tbond_data['3M_DoD'] = tbond_data['3M'].pct_change(1)\n", + "tbond_data['1Y_DoD'] = tbond_data['1Y'].pct_change(1)\n", + "tbond_data['10Y_DoD'] = tbond_data['10Y'].pct_change(1)\n", + "tbond_data = tbond_data[['date', '3M_DoD', '1Y_DoD','10Y_DoD']]\n", + " \n", + "tbond_data.head()" ] }, { "cell_type": "markdown", - "source": [ - "2(f) Acquire forex market (USD/EUR, USD/JPY, USD/AUD, etc.) daily performance" - ], "metadata": { "id": "_JS9iwgV-Bap" - } + }, + "source": [ + "2(f) Acquire forex market (USD/EUR, USD/JPY, USD/AUD, etc.) daily performance" + ] }, { "cell_type": "code", - "source": [ - "forex_data = pd.read_csv('/content/other_data/forex.csv')\n", - "\n", - "forex_data = forex_data[['date', 'USDGBP', 'USDEUR', 'USDJPY', 'USDHKD', 'USDAUD', 'USDCAD']]\n", - "\n", - "# filling missing data\n", - "forex_data = forex_data.fillna(method='ffill')\n", - "\n", - "# convert data format\n", - "forex_data['date'] = pd.to_datetime(forex_data.date)\n", - "forex_data = forex_data[forex_data['date'] < pd.Timestamp(2020,1,1)]\n", - "\n", - "# calculating day-over-day % price change\n", - "forex_data['USDGBP_DoD'] = forex_data['USDGBP'].pct_change(1)\n", - "forex_data['USDEUR_DoD'] = forex_data['USDEUR'].pct_change(1)\n", - "forex_data['USDJPY_DoD'] = forex_data['USDJPY'].pct_change(1)\n", - "forex_data['USDHKD_DoD'] = forex_data['USDHKD'].pct_change(1)\n", - "forex_data['USDAUD_DoD'] = forex_data['USDAUD'].pct_change(1)\n", - "forex_data['USDCAD_DoD'] = forex_data['USDCAD'].pct_change(1)\n", - "forex_data = forex_data[['date', 'USDGBP_DoD', 'USDEUR_DoD', 'USDJPY_DoD', 'USDHKD_DoD', 'USDAUD_DoD', 'USDCAD_DoD']]\n", - " \n", - "forex_data.head()" - ], + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1090,10 +1045,8 @@ "id": "UqA0M0or-Bwb", "outputId": "9d119238-de71-4ca7-c7e6-9729562ec208" }, - "execution_count": null, "outputs": [ { - "output_type": "execute_result", "data": { "text/html": [ "\n", @@ -1268,53 +1221,57 @@ "[5 rows x 7 columns]" ] }, + "execution_count": 39, "metadata": {}, - "execution_count": 39 + "output_type": "execute_result" } + ], + "source": [ + "forex_data = pd.read_csv('/content/other_data/forex.csv')\n", + "\n", + "forex_data = forex_data[['date', 'USDGBP', 'USDEUR', 'USDJPY', 'USDHKD', 'USDAUD', 'USDCAD']]\n", + "\n", + "# filling missing data\n", + "forex_data = forex_data.fillna(method='ffill')\n", + "\n", + "# convert data format\n", + "forex_data['date'] = pd.to_datetime(forex_data.date)\n", + "forex_data = forex_data[forex_data['date'] < pd.Timestamp(2020,1,1)]\n", + "\n", + "# calculating day-over-day % price change\n", + "forex_data['USDGBP_DoD'] = forex_data['USDGBP'].pct_change(1)\n", + "forex_data['USDEUR_DoD'] = forex_data['USDEUR'].pct_change(1)\n", + "forex_data['USDJPY_DoD'] = forex_data['USDJPY'].pct_change(1)\n", + "forex_data['USDHKD_DoD'] = forex_data['USDHKD'].pct_change(1)\n", + "forex_data['USDAUD_DoD'] = forex_data['USDAUD'].pct_change(1)\n", + "forex_data['USDCAD_DoD'] = forex_data['USDCAD'].pct_change(1)\n", + "forex_data = forex_data[['date', 'USDGBP_DoD', 'USDEUR_DoD', 'USDJPY_DoD', 'USDHKD_DoD', 'USDAUD_DoD', 'USDCAD_DoD']]\n", + " \n", + "forex_data.head()" ] }, { "cell_type": "markdown", - "source": [ - "2(g) Acquire economic data, including monthly unemployment rate, quarterly yoy GDP growth" - ], "metadata": { "id": "7JjWUMtZag9-" - } + }, + "source": [ + "2(g) Acquire economic data, including monthly unemployment rate, quarterly yoy GDP growth" + ] }, { "cell_type": "code", - "source": [ - "gdp_data = pd.read_csv('/content/other_data/gdp.csv')\n", - "\n", - "gdp_data = gdp_data[['date', 'real_gdp']]\n", - "\n", - "# filling missing data\n", - "gdp_data = gdp_data.fillna(method='ffill')\n", - "\n", - "# convert data format\n", - "gdp_data['date'] = pd.to_datetime(gdp_data.date)\n", - "gdp_data = gdp_data[gdp_data['date'] < pd.Timestamp(2020,1,1)]\n", - "gdp_data['real_gdp_QoQ'] = gdp_data['real_gdp'].pct_change(1)\n", - "gdp_data = gdp_data.drop(columns=['real_gdp'])\n", - "\n", - "# add quarter column\n", - "gdp_data['quarter'] = gdp_data['date'].dt.to_period('Q')\n", - "\n", - "gdp_data.head()" - ], + "execution_count": null, "metadata": { - "id": "PPdhac8DakMW", "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, + "id": "PPdhac8DakMW", "outputId": "d7bf107f-acac-463f-fbff-286e642285eb" }, - "execution_count": null, "outputs": [ { - "output_type": "execute_result", "data": { "text/html": [ "\n", @@ -1463,41 +1420,43 @@ "4 2003-03-31 0.005166 2003Q1" ] }, + "execution_count": 113, "metadata": {}, - "execution_count": 113 + "output_type": "execute_result" } - ] - }, - { - "cell_type": "markdown", - "source": [ - "2(h) Acquire monthly unemployment data. " ], - "metadata": { - "id": "yn0V9VrGuJ0z" - } - }, - { - "cell_type": "code", "source": [ - "unemployment_data = pd.read_csv('/content/other_data/unemployment.csv')\n", + "gdp_data = pd.read_csv('/content/other_data/gdp.csv')\n", "\n", - "unemployment_data = unemployment_data[['date', 'unemployment']]\n", + "gdp_data = gdp_data[['date', 'real_gdp']]\n", "\n", "# filling missing data\n", - "unemployment_data = unemployment_data.fillna(method='ffill')\n", + "gdp_data = gdp_data.fillna(method='ffill')\n", "\n", "# convert data format\n", - "unemployment_data['date'] = pd.to_datetime(unemployment_data.date)\n", - "unemployment_data = unemployment_data[unemployment_data['date'] < pd.Timestamp(2020,1,1)]\n", - "unemployment_data['unemployment_MoM'] = unemployment_data['unemployment'].pct_change(1)\n", - "unemployment_data = unemployment_data.drop(columns=['unemployment'])\n", + "gdp_data['date'] = pd.to_datetime(gdp_data.date)\n", + "gdp_data = gdp_data[gdp_data['date'] < pd.Timestamp(2020,1,1)]\n", + "gdp_data['real_gdp_QoQ'] = gdp_data['real_gdp'].pct_change(1)\n", + "gdp_data = gdp_data.drop(columns=['real_gdp'])\n", "\n", - "# add month column\n", - "unemployment_data['month'] = unemployment_data['date'].dt.to_period('M')\n", + "# add quarter column\n", + "gdp_data['quarter'] = gdp_data['date'].dt.to_period('Q')\n", "\n", - "unemployment_data.head()" - ], + "gdp_data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yn0V9VrGuJ0z" + }, + "source": [ + "2(h) Acquire monthly unemployment data. " + ] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1506,10 +1465,8 @@ "id": "UtmoeCMouJ-X", "outputId": "0621b46c-ca2d-4125-ea69-456b478af3c1" }, - "execution_count": null, "outputs": [ { - "output_type": "execute_result", "data": { "text/html": [ "\n", @@ -1658,43 +1615,54 @@ "4 2002-05-31 -0.016949 2002-05" ] }, + "execution_count": 112, "metadata": {}, - "execution_count": 112 + "output_type": "execute_result" } + ], + "source": [ + "unemployment_data = pd.read_csv('/content/other_data/unemployment.csv')\n", + "\n", + "unemployment_data = unemployment_data[['date', 'unemployment']]\n", + "\n", + "# filling missing data\n", + "unemployment_data = unemployment_data.fillna(method='ffill')\n", + "\n", + "# convert data format\n", + "unemployment_data['date'] = pd.to_datetime(unemployment_data.date)\n", + "unemployment_data = unemployment_data[unemployment_data['date'] < pd.Timestamp(2020,1,1)]\n", + "unemployment_data['unemployment_MoM'] = unemployment_data['unemployment'].pct_change(1)\n", + "unemployment_data = unemployment_data.drop(columns=['unemployment'])\n", + "\n", + "# add month column\n", + "unemployment_data['month'] = unemployment_data['date'].dt.to_period('M')\n", + "\n", + "unemployment_data.head()" ] }, { "cell_type": "markdown", - "source": [ - "### Step 3: Merge 2(a) - 2(h) into a single dataframe. " - ], "metadata": { "id": "YPAdUXqkalRZ" - } + }, + "source": [ + "### Step 3: Merge 2(a) - 2(h) into a single dataframe. " + ] }, { "cell_type": "code", - "source": [ - "mega_data = all_stock_data.merge(stockindex_data, left_on='timestamp', right_on='date', how='left')\n", - "mega_data = mega_data.merge(tbond_data, left_on='timestamp', right_on='date', how='left')\n", - "mega_data = mega_data.merge(forex_data, left_on='timestamp', right_on='date', how='left')\n", - "mega_data = mega_data.merge(gdp_data, left_on='quarter', right_on='quarter', how='left')\n", - "mega_data = mega_data.merge(unemployment_data, left_on='month', right_on='month', how='left')\n", - "\n", - "mega_data.info()" - ], + "execution_count": null, "metadata": { - "id": "s_JYyma5aqKU", "colab": { "base_uri": "https://localhost:8080/" }, + "id": "s_JYyma5aqKU", "outputId": "547b2c14-4d36-4e55-958e-b92a372bf867" }, - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "Int64Index: 186682 entries, 0 to 186681\n", @@ -1733,36 +1701,40 @@ "memory usage: 41.3+ MB\n" ] } + ], + "source": [ + "mega_data = all_stock_data.merge(stockindex_data, left_on='timestamp', right_on='date', how='left')\n", + "mega_data = mega_data.merge(tbond_data, left_on='timestamp', right_on='date', how='left')\n", + "mega_data = mega_data.merge(forex_data, left_on='timestamp', right_on='date', how='left')\n", + "mega_data = mega_data.merge(gdp_data, left_on='quarter', right_on='quarter', how='left')\n", + "mega_data = mega_data.merge(unemployment_data, left_on='month', right_on='month', how='left')\n", + "\n", + "mega_data.info()" ] }, { "cell_type": "markdown", - "source": [ - "### Step 4: Cleanning data" - ], "metadata": { "id": "4guvgU8Nasqi" - } + }, + "source": [ + "### Step 4: Cleanning data" + ] }, { "cell_type": "code", - "source": [ - "mega_data = mega_data.drop(columns=['date_x', 'date_y', 'date'])\n", - "mega_data = mega_data.dropna()\n", - "mega_data.info()" - ], + "execution_count": null, "metadata": { - "id": "2F4g9H4haxZZ", "colab": { "base_uri": "https://localhost:8080/" }, + "id": "2F4g9H4haxZZ", "outputId": "8a58c647-09cf-40c3-dea5-c1b8311741a8" }, - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "\n", "Int64Index: 169360 entries, 1 to 186681\n", @@ -1796,7 +1768,29 @@ "memory usage: 31.0+ MB\n" ] } + ], + "source": [ + "mega_data = mega_data.drop(columns=['date_x', 'date_y', 'date'])\n", + "mega_data = mega_data.dropna()\n", + "mega_data.info()" ] } - ] -} \ No newline at end of file + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "include_colab_link": true, + "name": "big-portfolio-learner.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}