diff --git a/Another_copy_of_FinRL_Ensemble_StockTrading_ICAIF_2020.ipynb b/Another_copy_of_FinRL_Ensemble_StockTrading_ICAIF_2020.ipynb new file mode 100644 index 0000000..1d8a4dc --- /dev/null +++ b/Another_copy_of_FinRL_Ensemble_StockTrading_ICAIF_2020.ipynb @@ -0,0 +1,3205 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Lb9q2_QZgdNk" + }, + "source": [ + "\n", + " \"Open\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gXaoZs2lh1hi" + }, + "source": [ + "# Deep Reinforcement Learning for Stock Trading from Scratch: Multiple Stock Trading Using Ensemble Strategy\n", + "\n", + "Tutorials to use OpenAI DRL to trade multiple stocks using ensemble strategy in one Jupyter Notebook | Presented at ICAIF 2020\n", + "\n", + "* This notebook is the reimplementation of our paper: Deep Reinforcement Learning for Automated Stock Trading: An Ensemble Strategy, using FinRL.\n", + "* Check out medium blog for detailed explanations: https://medium.com/@ai4finance/deep-reinforcement-learning-for-automated-stock-trading-f1dad0126a02\n", + "* Please report any issues to our Github: https://github.com/AI4Finance-LLC/FinRL-Library/issues\n", + "* **Pytorch Version**\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lGunVt8oLCVS" + }, + "source": [ + "# Content" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HOzAKQ-SLGX6" + }, + "source": [ + "* [1. Problem Definition](#0)\n", + "* [2. Getting Started - Load Python packages](#1)\n", + " * [2.1. Install Packages](#1.1) \n", + " * [2.2. Check Additional Packages](#1.2)\n", + " * [2.3. Import Packages](#1.3)\n", + " * [2.4. Create Folders](#1.4)\n", + "* [3. Download Data](#2)\n", + "* [4. Preprocess Data](#3) \n", + " * [4.1. Technical Indicators](#3.1)\n", + " * [4.2. Perform Feature Engineering](#3.2)\n", + "* [5.Build Environment](#4) \n", + " * [5.1. Training & Trade Data Split](#4.1)\n", + " * [5.2. User-defined Environment](#4.2) \n", + " * [5.3. Initialize Environment](#4.3) \n", + "* [6.Implement DRL Algorithms](#5) \n", + "* [7.Backtesting Performance](#6) \n", + " * [7.1. BackTestStats](#6.1)\n", + " * [7.2. BackTestPlot](#6.2) \n", + " * [7.3. Baseline Stats](#6.3) \n", + " * [7.3. Compare to Stock Market Index](#6.4) " + ] + }, + { + "cell_type": "code", + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ], + "metadata": { + "id": "X2qJ-7rHBp8W", + "collapsed": true + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sApkDlD9LIZv" + }, + "source": [ + "\n", + "# Part 1. Problem Definition" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HjLD2TZSLKZ-" + }, + "source": [ + "This problem is to design an automated trading solution for single stock trading. We model the stock trading process as a Markov Decision Process (MDP). We then formulate our trading goal as a maximization problem.\n", + "\n", + "The algorithm is trained using Deep Reinforcement Learning (DRL) algorithms and the components of the reinforcement learning environment are:\n", + "\n", + "\n", + "* Action: The action space describes the allowed actions that the agent interacts with the\n", + "environment. Normally, a ∈ A includes three actions: a ∈ {−1, 0, 1}, where −1, 0, 1 represent\n", + "selling, holding, and buying one stock. Also, an action can be carried upon multiple shares. We use\n", + "an action space {−k, ..., −1, 0, 1, ..., k}, where k denotes the number of shares. For example, \"Buy\n", + "10 shares of AAPL\" or \"Sell 10 shares of AAPL\" are 10 or −10, respectively\n", + "\n", + "* Reward function: r(s, a, s′) is the incentive mechanism for an agent to learn a better action. The change of the portfolio value when action a is taken at state s and arriving at new state s', i.e., r(s, a, s′) = v′ − v, where v′ and v represent the portfolio\n", + "values at state s′ and s, respectively\n", + "\n", + "* State: The state space describes the observations that the agent receives from the environment. Just as a human trader needs to analyze various information before executing a trade, so\n", + "our trading agent observes many different features to better learn in an interactive environment.\n", + "\n", + "* Environment: Dow 30 consituents\n", + "\n", + "\n", + "The data of the single stock that we will be using for this case study is obtained from Yahoo Finance API. The data contains Open-High-Low-Close price and volume.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ffsre789LY08" + }, + "source": [ + "\n", + "# Part 2. Getting Started- Load Python Packages" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Uy5_PTmOh1hj" + }, + "source": [ + "\n", + "## 2.1. Install all the packages through FinRL library\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 707 + }, + "id": "mPT0ipYE28wL", + "outputId": "8e103cdb-23f8-4190-d7e1-289bd3dd3d54", + "collapsed": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Successfully installed AutoROM.accept-rom-license-0.6.1 Cython-3.0.11 MarkupSafe-2.1.5 PyYAML-6.0.1 SQLAlchemy-2.0.35 absl-py-2.1.0 aiodns-3.2.0 aiohappyeyeballs-2.4.0 aiohttp-3.10.6 aiohttp-cors-0.7.0 aiosignal-1.3.1 ale-py-0.8.1 alpaca-trade-api-3.2.0 annotated-types-0.7.0 asttokens-2.4.1 async-timeout-4.0.3 attrs-24.2.0 autorom-0.6.1 beautifulsoup4-4.12.3 cachetools-5.5.0 ccxt-3.1.60 certifi-2024.8.30 cffi-1.17.1 charset-normalizer-3.3.2 clarabel-0.9.0 click-8.1.7 cloudpickle-3.0.0 colorful-0.5.6 contourpy-1.3.0 cryptography-43.0.1 cvxpy-1.5.3 cycler-0.12.1 decorator-5.1.1 deprecation-2.1.0 distlib-0.3.8 ecos-2.0.14 elegantrl-0.3.10 empyrical-0.5.5 exceptiongroup-1.2.2 exchange-calendars-4.5.6 executing-2.1.0 farama-notifications-0.0.4 filelock-3.16.1 finrl-0.3.6 fonttools-4.54.1 frozendict-2.4.4 frozenlist-1.4.1 fsspec-2024.9.0 google-api-core-2.20.0 google-auth-2.35.0 googleapis-common-protos-1.65.0 greenlet-3.1.1 grpcio-1.66.1 gymnasium-0.29.1 html5lib-1.1 idna-3.10 importlib-resources-6.4.5 ipython-8.27.0 jedi-0.19.1 jinja2-3.1.4 joblib-1.4.2 jqdatasdk-1.9.6 jsonschema-4.23.0 jsonschema-specifications-2023.12.1 kiwisolver-1.4.7 korean-lunar-calendar-0.3.1 linkify-it-py-2.0.3 lxml-5.3.0 markdown-3.7 markdown-it-py-3.0.0 matplotlib-3.9.2 matplotlib-inline-0.1.7 mdit-py-plugins-0.4.2 mdurl-0.1.2 memray-1.14.0 mpmath-1.3.0 msgpack-1.0.3 multidict-6.1.0 multitasking-0.0.11 networkx-3.3 numpy-1.26.4 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvjitlink-cu12-12.6.68 nvidia-nvtx-cu12-12.1.105 opencensus-0.11.4 opencensus-context-0.1.3 opencv-python-4.10.0.84 osqp-0.6.7.post1 packaging-23.2 pandas-2.2.3 pandas-datareader-0.10.0 parso-0.8.4 peewee-3.17.6 pexpect-4.9.0 pillow-10.4.0 platformdirs-4.3.6 ply-3.11 prometheus-client-0.21.0 prompt-toolkit-3.0.48 proto-plus-1.24.0 protobuf-5.28.2 psutil-6.0.0 psycopg2-binary-2.9.9 ptyprocess-0.7.0 pure-eval-0.2.3 py-spy-0.3.14 pyarrow-17.0.0 pyasn1-0.6.1 pyasn1-modules-0.4.1 pycares-4.4.0 pycparser-2.22 pydantic-2.9.2 pydantic-core-2.23.4 pyfolio-0.9.2 pygame-2.6.0 pygments-2.18.0 pyluach-2.2.0 pymysql-1.1.1 pyparsing-3.1.4 pyportfolioopt-1.5.5 python-dateutil-2.9.0.post0 pytz-2024.2 qdldl-0.1.7.post4 ray-2.37.0 referencing-0.35.1 requests-2.32.3 rich-13.8.1 rpds-py-0.20.0 rsa-4.9 scikit-learn-1.5.2 scipy-1.12.0 scs-3.2.7 seaborn-0.13.2 setuptools-75.1.0 shimmy-1.3.0 six-1.16.0 smart-open-7.0.4 soupsieve-2.6 stable-baselines3-2.4.0a7 stack-data-0.6.3 stockstats-0.5.4 sympy-1.13.3 tensorboard-2.18.0 tensorboard-data-server-0.7.2 tensorboardX-2.6.2.2 textual-0.81.0 threadpoolctl-3.5.0 thriftpy2-0.5.2 toolz-0.12.1 torch-2.4.1 tqdm-4.66.5 traitlets-5.14.3 triton-3.0.0 typing-extensions-4.12.2 tzdata-2024.2 uc-micro-py-1.0.3 urllib3-1.26.20 virtualenv-20.26.5 wcwidth-0.2.13 webencodings-0.5.1 websocket-client-1.8.0 websockets-10.4 werkzeug-3.0.4 wrapt-1.16.0 wrds-3.2.0 yarl-1.12.1 yfinance-0.2.43\n", + "\u001b[33mWARNING: Target directory /content/drive/packages/psycopg2 already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/greenlet already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/dateutil already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/tzdata already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/greenlet-3.1.1.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/numpy already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/scipy-1.12.0.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/packaging-23.2.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/psycopg2_binary-2.9.9.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/tzdata-2024.2.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/scipy.libs already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/numpy-1.26.4.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/pytz-2024.2.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/numpy.libs already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/pandas-2.2.3.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/pytz already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/sqlalchemy already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/psycopg2_binary.libs already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/typing_extensions.py already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/SQLAlchemy-2.0.35.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/scipy already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/typing_extensions-4.12.2.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/__pycache__ already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/python_dateutil-2.9.0.post0.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/packaging already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/wrds already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/six.py already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/wrds-3.2.0.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/six-1.16.0.dist-info already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/pandas already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/include already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Target directory /content/drive/packages/bin already exists. Specify --upgrade to force replacement.\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + }, + { + "output_type": "display_data", + "data": { + "application/vnd.colab-display-data+json": { + "pip_warning": { + "packages": [ + "PIL", + "certifi", + "cffi", + "cycler", + "google", + "kiwisolver", + "matplotlib_inline", + "pexpect", + "pytz", + "six", + "wcwidth" + ] + }, + "id": "867206b47fa44e579f9d1705d740fa15" + } + }, + "metadata": {} + } + ], + "source": [ + "!pip install --target='/content/drive/packages' wrds\n", + "!pip install --target='/content/drive/packages' swig\n", + "!pip install --target='/content/drive/packages' -q condacolab\n", + "import condacolab\n", + "condacolab.install()\n", + "!apt-get update -y -qq && apt-get install -y -qq cmake libopenmpi-dev python3-dev zlib1g-dev libgl1-mesa-glx swig\n", + "!pip install --target='/content/drive/packages' git+https://github.com/AI4Finance-Foundation/FinRL.git" + ] + }, + { + "cell_type": "code", + "source": [ + "# from google.colab import drive\n", + "# drive.mount('/content/drive')\n", + "!cp -r /content/drive/packages/* /content/drive/\n" + ], + "metadata": { + "id": "IA0PE8RWivNh" + }, + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "osBHhVysOEzi" + }, + "source": [ + "\n", + "\n", + "## 2.2. Check if the additional packages needed are present, if not install them.\n", + "* Yahoo Finance API\n", + "* pandas\n", + "* numpy\n", + "* matplotlib\n", + "* stockstats\n", + "* OpenAI gym\n", + "* stable-baselines\n", + "* tensorflow\n", + "* pyfolio" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nGv01K8Sh1hn" + }, + "source": [ + "\n", + "## 2.3. Import Packages" + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "TOPYpjid4xoL" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "lPqeTTwoh1hn", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "72b957ff-3f49-41e7-faca-1d989271c100", + "collapsed": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "None\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/tensorflow/lite/python/util.py:55: DeprecationWarning: jax.xla_computation is deprecated. Please use the AOT APIs; see https://jax.readthedocs.io/en/latest/aot.html. For example, replace xla_computation(f)(*xs) with jit(f).lower(*xs).compiler_ir('hlo'). See CHANGELOG.md for 0.4.30 for more examples.\n", + " from jax import xla_computation as _xla_computation\n", + "/usr/local/lib/python3.10/dist-packages/pandas_datareader/compat/__init__.py:11: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.\n", + " PANDAS_VERSION = LooseVersion(pd.__version__)\n", + "/content/drive/packages/pyfolio/pos.py:26: UserWarning: Module \"zipline.assets\" not found; mutltipliers will not be applied to position notionals.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "# matplotlib.use('Agg')\n", + "import datetime\n", + "\n", + "import sys\n", + "os = sys.path.append(\"/content/drive/packages\")\n", + "print(os)\n", + "\n", + "import itertools\n", + "\n", + "\n", + "%matplotlib inline\n", + "from finrl.config_tickers import DOW_30_TICKER\n", + "from finrl.meta.preprocessor.yahoodownloader import YahooDownloader\n", + "from finrl.meta.preprocessor.preprocessors import FeatureEngineer, data_split\n", + "from finrl.meta.env_stock_trading.env_stocktrading import StockTradingEnv\n", + "from finrl.agents.stablebaselines3.models import DRLAgent,DRLEnsembleAgent\n", + "from finrl.plot import backtest_stats, backtest_plot, get_daily_return, get_baseline\n", + "\n", + "from pprint import pprint\n", + "\n", + "import sys\n", + "sys.path.append(\"../FinRL-Library\")\n", + "\n", + "import itertools" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "T2owTj985RW4" + }, + "source": [ + "\n", + "## 2.4. Create Folders" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "w9A8CN5R5PuZ" + }, + "outputs": [], + "source": [ + "import os\n", + "from finrl.main import check_and_make_directories\n", + "from finrl.config import (\n", + " DATA_SAVE_DIR,\n", + " TRAINED_MODEL_DIR,\n", + " TENSORBOARD_LOG_DIR,\n", + " RESULTS_DIR,\n", + " INDICATORS,\n", + " TRAIN_START_DATE,\n", + " TRAIN_END_DATE,\n", + " TEST_START_DATE,\n", + " TEST_END_DATE,\n", + " TRADE_START_DATE,\n", + " TRADE_END_DATE,\n", + ")\n", + "\n", + "check_and_make_directories([DATA_SAVE_DIR, TRAINED_MODEL_DIR, TENSORBOARD_LOG_DIR, RESULTS_DIR])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A289rQWMh1hq" + }, + "source": [ + "\n", + "# Part 3. Download Data\n", + "Yahoo Finance is a website that provides stock data, financial news, financial reports, etc. All the data provided by Yahoo Finance is free.\n", + "* FinRL uses a class **YahooDownloader** to fetch data from Yahoo Finance API\n", + "* Call Limit: Using the Public API (without authentication), you are limited to 2,000 requests per hour per IP (or up to a total of 48,000 requests a day).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NPeQ7iS-LoMm" + }, + "source": [ + "\n", + "\n", + "-----\n", + "class YahooDownloader:\n", + " Provides methods for retrieving daily stock data from\n", + " Yahoo Finance API\n", + "\n", + " Attributes\n", + " ----------\n", + " start_date : str\n", + " start date of the data (modified from config.py)\n", + " end_date : str\n", + " end date of the data (modified from config.py)\n", + " ticker_list : list\n", + " a list of stock tickers (modified from config.py)\n", + "\n", + " Methods\n", + " -------\n", + " fetch_data()\n", + " Fetches data from yahoo API\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JzqRRTOX6aFu", + "outputId": "0c705e10-bc77-4495-c665-e85f1ef3bcba" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "['AXP', 'AMGN', 'AAPL', 'BA', 'CAT', 'CSCO', 'CVX', 'GS', 'HD', 'HON', 'IBM', 'INTC', 'JNJ', 'KO', 'JPM', 'MCD', 'MMM', 'MRK', 'MSFT', 'NKE', 'PG', 'TRV', 'UNH', 'CRM', 'VZ', 'V', 'WBA', 'WMT', 'DIS', 'DOW']\n" + ] + } + ], + "source": [ + "print(DOW_30_TICKER)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "yCKm4om-s9kE", + "outputId": "5953ed90-c8ae-4fc4-cd69-89bf86bf7d4f" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n", + "[*********************100%***********************] 1 of 1 completed\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Shape of DataFrame: (97013, 8)\n" + ] + } + ], + "source": [ + "# TRAIN_START_DATE = '2009-04-01'\n", + "# TRAIN_END_DATE = '2021-01-01'\n", + "# TEST_START_DATE = '2021-01-01'\n", + "# TEST_END_DATE = '2022-06-01'\n", + "\n", + "TRAIN_START_DATE = '2010-01-01'\n", + "TRAIN_END_DATE = '2021-10-01'\n", + "TEST_START_DATE = '2021-10-01'\n", + "TEST_END_DATE = '2023-03-01'\n", + "\n", + "df = YahooDownloader(start_date = TRAIN_START_DATE,\n", + " end_date = TEST_END_DATE,\n", + " ticker_list = DOW_30_TICKER).fetch_data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "GiRuFOTOtj1Y", + "outputId": "63e8739f-1cb1-447c-cd0b-8421cd7065bc" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " date open high low close volume tic \\\n", + "0 2010-01-04 7.622500 7.660714 7.585000 6.454504 493729600 AAPL \n", + "1 2010-01-04 56.630001 57.869999 56.560001 40.915897 5277400 AMGN \n", + "2 2010-01-04 40.810001 41.099998 40.389999 32.992157 6894300 AXP \n", + "3 2010-01-04 55.720001 56.389999 54.799999 43.777557 6186700 BA \n", + "4 2010-01-04 57.650002 59.189999 57.509998 40.027199 7325600 CAT \n", + "\n", + " day \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 " + ], + "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", + "
dateopenhighlowclosevolumeticday
02010-01-047.6225007.6607147.5850006.454504493729600AAPL0
12010-01-0456.63000157.86999956.56000140.9158975277400AMGN0
22010-01-0440.81000141.09999840.38999932.9921576894300AXP0
32010-01-0455.72000156.38999954.79999943.7775576186700BA0
42010-01-0457.65000259.18999957.50999840.0271997325600CAT0
\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": "df", + "summary": "{\n \"name\": \"df\",\n \"rows\": 97013,\n \"fields\": [\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 3311,\n \"samples\": [\n \"2010-03-19\",\n \"2012-09-13\",\n \"2015-06-23\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"open\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 73.3337048274467,\n \"min\": 6.870357036590576,\n \"max\": 555.0,\n \"num_unique_values\": 38726,\n \"samples\": [\n 153.4499969482422,\n 208.27000427246094,\n 7.67642879486084\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"high\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 74.08851731233877,\n \"min\": 7.0,\n \"max\": 558.0999755859375,\n \"num_unique_values\": 39077,\n \"samples\": [\n 169.03846740722656,\n 27.3700008392334,\n 47.7400016784668\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 72.55584141136859,\n \"min\": 6.794642925262451,\n \"max\": 550.1300048828125,\n \"num_unique_values\": 38859,\n \"samples\": [\n 12.343570709228516,\n 61.5099983215332,\n 131.2100067138672\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 70.17611073368398,\n \"min\": 5.792194366455078,\n \"max\": 538.8892822265625,\n \"num_unique_values\": 92710,\n \"samples\": [\n 42.52291488647461,\n 218.6311492919922,\n 75.48799133300781\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 61733648,\n \"min\": 305400,\n \"max\": 1880998000,\n \"num_unique_values\": 81903,\n \"samples\": [\n 3372002,\n 5786400,\n 37385300\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tic\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 30,\n \"samples\": [\n \"WBA\",\n \"JPM\",\n \"TRV\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"day\",\n \"properties\": {\n \"dtype\": \"int32\",\n \"num_unique_values\": 5,\n \"samples\": [\n 1,\n 4,\n 2\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + } + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "DSw4ZEzVtj1Z", + "outputId": "a004e91f-c848-4ce0-f5b4-dac3011b122b" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " date open high low close volume \\\n", + "97008 2023-02-28 482.670013 483.359985 473.920013 463.423553 3902100 \n", + "97009 2023-02-28 220.000000 221.770004 219.500000 217.388611 5385400 \n", + "97010 2023-02-28 38.700001 38.970001 38.549999 34.966160 16685300 \n", + "97011 2023-02-28 35.480000 35.779999 35.320000 31.987909 8847000 \n", + "97012 2023-02-28 47.000000 47.549999 46.983334 46.214355 18054000 \n", + "\n", + " tic day \n", + "97008 UNH 1 \n", + "97009 V 1 \n", + "97010 VZ 1 \n", + "97011 WBA 1 \n", + "97012 WMT 1 " + ], + "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", + "
dateopenhighlowclosevolumeticday
970082023-02-28482.670013483.359985473.920013463.4235533902100UNH1
970092023-02-28220.000000221.770004219.500000217.3886115385400V1
970102023-02-2838.70000138.97000138.54999934.96616016685300VZ1
970112023-02-2835.48000035.77999935.32000031.9879098847000WBA1
970122023-02-2847.00000047.54999946.98333446.21435518054000WMT1
\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", + "repr_error": "0" + } + }, + "metadata": {}, + "execution_count": 9 + } + ], + "source": [ + "df.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CV3HrZHLh1hy", + "outputId": "19a67c12-4b0a-4a76-e238-192f58fa696e" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(97013, 8)" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "4hYkeaPiICHS", + "outputId": "67b0637f-e4ce-43c8-d437-ff491dcfb702" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " date open high low close volume tic \\\n", + "0 2010-01-04 7.622500 7.660714 7.585000 6.454504 493729600 AAPL \n", + "1 2010-01-04 56.630001 57.869999 56.560001 40.915897 5277400 AMGN \n", + "2 2010-01-04 40.810001 41.099998 40.389999 32.992157 6894300 AXP \n", + "3 2010-01-04 55.720001 56.389999 54.799999 43.777557 6186700 BA \n", + "4 2010-01-04 57.650002 59.189999 57.509998 40.027199 7325600 CAT \n", + "\n", + " day \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 " + ], + "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", + "
dateopenhighlowclosevolumeticday
02010-01-047.6225007.6607147.5850006.454504493729600AAPL0
12010-01-0456.63000157.86999956.56000140.9158975277400AMGN0
22010-01-0440.81000141.09999840.38999932.9921576894300AXP0
32010-01-0455.72000156.38999954.79999943.7775576186700BA0
42010-01-0457.65000259.18999957.50999840.0271997325600CAT0
\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", + "summary": "{\n \"name\": \"df\",\n \"rows\": 5,\n \"fields\": [\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"2010-01-04\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"open\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 21.308478892619465,\n \"min\": 7.622499942779541,\n \"max\": 57.650001525878906,\n \"num_unique_values\": 5,\n \"samples\": [\n 56.630001068115234\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"high\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 21.82086885953129,\n \"min\": 7.660714149475098,\n \"max\": 59.189998626708984,\n \"num_unique_values\": 5,\n \"samples\": [\n 57.869998931884766\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 21.177861035901508,\n \"min\": 7.585000038146973,\n \"max\": 57.5099983215332,\n \"num_unique_values\": 5,\n \"samples\": [\n 56.560001373291016\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 15.270260867050599,\n \"min\": 6.454503536224365,\n \"max\": 43.777557373046875,\n \"num_unique_values\": 5,\n \"samples\": [\n 40.915897369384766\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 217932410,\n \"min\": 5277400,\n \"max\": 493729600,\n \"num_unique_values\": 5,\n \"samples\": [\n 5277400\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tic\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"AMGN\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"day\",\n \"properties\": {\n \"dtype\": \"int32\",\n \"num_unique_values\": 1,\n \"samples\": [\n 0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + } + }, + "metadata": {}, + "execution_count": 11 + } + ], + "source": [ + "df.sort_values(['date','tic']).head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "a2vryMsdNL9H", + "outputId": "9aa5465c-4d73-49c2-bcf0-88f1d68e746a" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "30" + ] + }, + "metadata": {}, + "execution_count": 12 + } + ], + "source": [ + "len(df.tic.unique())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "XcNyXa7RNPrF", + "outputId": "b681106e-013a-4ca9-f253-99b7de0393ff", + "collapsed": true + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "tic\n", + "AAPL 3311\n", + "AMGN 3311\n", + "WMT 3311\n", + "WBA 3311\n", + "VZ 3311\n", + "V 3311\n", + "UNH 3311\n", + "TRV 3311\n", + "PG 3311\n", + "NKE 3311\n", + "MSFT 3311\n", + "MRK 3311\n", + "MMM 3311\n", + "MCD 3311\n", + "KO 3311\n", + "JPM 3311\n", + "JNJ 3311\n", + "INTC 3311\n", + "IBM 3311\n", + "HON 3311\n", + "HD 3311\n", + "GS 3311\n", + "DIS 3311\n", + "CVX 3311\n", + "CSCO 3311\n", + "CRM 3311\n", + "CAT 3311\n", + "BA 3311\n", + "AXP 3311\n", + "DOW 994\n", + "Name: count, dtype: int64" + ], + "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", + "
count
tic
AAPL3311
AMGN3311
WMT3311
WBA3311
VZ3311
V3311
UNH3311
TRV3311
PG3311
NKE3311
MSFT3311
MRK3311
MMM3311
MCD3311
KO3311
JPM3311
JNJ3311
INTC3311
IBM3311
HON3311
HD3311
GS3311
DIS3311
CVX3311
CSCO3311
CRM3311
CAT3311
BA3311
AXP3311
DOW994
\n", + "

" + ] + }, + "metadata": {}, + "execution_count": 13 + } + ], + "source": [ + "df.tic.value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uqC6c40Zh1iH" + }, + "source": [ + "# Part 4: Preprocess Data\n", + "Data preprocessing is a crucial step for training a high quality machine learning model. We need to check for missing data and do feature engineering in order to convert the data into a model-ready state.\n", + "* Add technical indicators. In practical trading, various information needs to be taken into account, for example the historical stock prices, current holding shares, technical indicators, etc. In this article, we demonstrate two trend-following technical indicators: MACD and RSI.\n", + "* Add turbulence index. Risk-aversion reflects whether an investor will choose to preserve the capital. It also influences one's trading strategy when facing different market volatility level. To control the risk in a worst-case scenario, such as financial crisis of 2007–2008, FinRL employs the financial turbulence index that measures extreme asset price fluctuation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kM5bH9uroCeg" + }, + "outputs": [], + "source": [ + " INDICATORS = ['macd',\n", + " 'rsi_30',\n", + " 'cci_30',\n", + " 'dx_30']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jgXfBcjxtj1a", + "outputId": "54ad090e-1ea8-4bd4-90be-0880fa5e763c", + "collapsed": true + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Successfully added technical indicators\n", + "Successfully added turbulence index\n" + ] + } + ], + "source": [ + "fe = FeatureEngineer(use_technical_indicator=True,\n", + " tech_indicator_list = INDICATORS,\n", + " use_turbulence=True,\n", + " user_defined_feature = False)\n", + "\n", + "processed = fe.preprocess_data(df)\n", + "processed = processed.copy()\n", + "processed = processed.fillna(0)\n", + "processed = processed.replace(np.inf,0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "grvhGJJII3Xn", + "outputId": "c84822f8-623f-402b-acb5-5260a75ed07b", + "collapsed": true + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " date open high low close volume \\\n", + "23141 2013-03-06 24.583332 24.709999 24.416668 19.109367 21448800 \n", + "26932 2013-09-11 32.570000 32.930000 32.529999 27.212698 39087500 \n", + "85216 2021-09-03 175.100006 175.220001 173.809998 160.690674 4096900 \n", + "54590 2017-06-26 147.906311 148.900574 147.829834 106.022476 2252561 \n", + "75283 2020-04-27 43.333332 43.436668 42.723331 39.941040 17923800 \n", + "\n", + " tic day macd rsi_30 cci_30 dx_30 turbulence \n", + "23141 WMT 2 0.204328 59.008303 206.577885 41.378700 25.371484 \n", + "26932 MSFT 2 -0.114314 50.723271 44.325067 8.025848 33.204657 \n", + "85216 JNJ 4 0.729121 57.466903 15.587760 0.764838 7.185696 \n", + "54590 IBM 0 -0.030324 45.774899 123.891858 18.141758 22.193627 \n", + "75283 WMT 0 1.155208 55.933852 80.628321 28.997452 55.566703 " + ], + "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", + "
dateopenhighlowclosevolumeticdaymacdrsi_30cci_30dx_30turbulence
231412013-03-0624.58333224.70999924.41666819.10936721448800WMT20.20432859.008303206.57788541.37870025.371484
269322013-09-1132.57000032.93000032.52999927.21269839087500MSFT2-0.11431450.72327144.3250678.02584833.204657
852162021-09-03175.100006175.220001173.809998160.6906744096900JNJ40.72912157.46690315.5877600.7648387.185696
545902017-06-26147.906311148.900574147.829834106.0224762252561IBM0-0.03032445.774899123.89185818.14175822.193627
752832020-04-2743.33333243.43666842.72333139.94104017923800WMT01.15520855.93385280.62832128.99745255.566703
\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", + "repr_error": "0" + } + }, + "metadata": {}, + "execution_count": 26 + } + ], + "source": [ + "processed.sample(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-QsYaY0Dh1iw" + }, + "source": [ + "\n", + "# Part 5. Design Environment\n", + "Considering the stochastic and interactive nature of the automated stock trading tasks, a financial task is modeled as a **Markov Decision Process (MDP)** problem. The training process involves observing stock price change, taking an action and reward's calculation to have the agent adjusting its strategy accordingly. By interacting with the environment, the trading agent will derive a trading strategy with the maximized rewards as time proceeds.\n", + "\n", + "Our trading environments, based on OpenAI Gym framework, simulate live stock markets with real market data according to the principle of time-driven simulation.\n", + "\n", + "The action space describes the allowed actions that the agent interacts with the environment. Normally, action a includes three actions: {-1, 0, 1}, where -1, 0, 1 represent selling, holding, and buying one share. Also, an action can be carried upon multiple shares. We use an action space {-k,…,-1, 0, 1, …, k}, where k denotes the number of shares to buy and -k denotes the number of shares to sell. For example, \"Buy 10 shares of AAPL\" or \"Sell 10 shares of AAPL\" are 10 or -10, respectively. The continuous action space needs to be normalized to [-1, 1], since the policy is defined on a Gaussian distribution, which needs to be normalized and symmetric." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q2zqII8rMIqn", + "outputId": "2e9ec7cc-9d29-4a19-f2d0-8248c252ba14" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Stock Dimension: 29, State Space: 175\n" + ] + } + ], + "source": [ + "stock_dimension = len(processed.tic.unique())\n", + "state_space = 1 + 2*stock_dimension + len(INDICATORS)*stock_dimension\n", + "print(f\"Stock Dimension: {stock_dimension}, State Space: {state_space}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "AWyp84Ltto19" + }, + "outputs": [], + "source": [ + "env_kwargs = {\n", + " \"hmax\": 100,\n", + " \"initial_amount\": 1000000,\n", + " \"buy_cost_pct\": 0.001,\n", + " \"sell_cost_pct\": 0.001,\n", + " \"state_space\": state_space,\n", + " \"stock_dim\": stock_dimension,\n", + " \"tech_indicator_list\": INDICATORS,\n", + " \"action_space\": stock_dimension,\n", + " \"reward_scaling\": 1e-4,\n", + " \"print_verbosity\":5\n", + "\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HMNR5nHjh1iz" + }, + "source": [ + "\n", + "# Part 6: Implement DRL Algorithms\n", + "* The implementation of the DRL algorithms are based on **OpenAI Baselines** and **Stable Baselines**. Stable Baselines is a fork of OpenAI Baselines, with a major structural refactoring, and code cleanups.\n", + "* FinRL library includes fine-tuned standard DRL algorithms, such as DQN, DDPG,\n", + "Multi-Agent DDPG, PPO, SAC, A2C and TD3. We also allow users to\n", + "design their own DRL algorithms by adapting these DRL algorithms.\n", + "\n", + "* In this notebook, we are training and validating 3 agents (A2C, PPO, DDPG) using Rolling-window Ensemble Method ([reference code](https://github.com/AI4Finance-LLC/Deep-Reinforcement-Learning-for-Automated-Stock-Trading-Ensemble-Strategy-ICAIF-2020/blob/80415db8fa7b2179df6bd7e81ce4fe8dbf913806/model/models.py#L92))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "v-gthCxMtj1d" + }, + "outputs": [], + "source": [ + "rebalance_window = 63 # rebalance_window is the number of days to retrain the model\n", + "validation_window = 63 # validation_window is the number of days to do validation and trading (e.g. if validation_window=63, then both validation and trading period will be 63 days)\n", + "\n", + "ensemble_agent = DRLEnsembleAgent(df=processed,\n", + " train_period=(TRAIN_START_DATE,TRAIN_END_DATE),\n", + " val_test_period=(TEST_START_DATE,TEST_END_DATE),\n", + " rebalance_window=rebalance_window,\n", + " validation_window=validation_window,\n", + " **env_kwargs)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "KsfEHa_Etj1d", + "scrolled": false + }, + "outputs": [], + "source": [ + "A2C_model_kwargs = {\n", + " 'n_steps': 5,\n", + " 'ent_coef': 0.005,\n", + " 'learning_rate': 0.0007\n", + " }\n", + "\n", + "PPO_model_kwargs = {\n", + " \"ent_coef\":0.01,\n", + " \"n_steps\": 2048,\n", + " \"learning_rate\": 0.00025,\n", + " \"batch_size\": 128\n", + " }\n", + "\n", + "DDPG_model_kwargs = {\n", + " #\"action_noise\":\"ornstein_uhlenbeck\",\n", + " \"buffer_size\": 10_000,\n", + " \"learning_rate\": 0.0005,\n", + " \"batch_size\": 64\n", + " }\n", + "\n", + "timesteps_dict = {'a2c' : 10_000,\n", + " 'ppo' : 10_000,\n", + " 'ddpg' : 10_000\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 193 + }, + "id": "_1lyCECstj1e", + "outputId": "3dca2625-62e8-4cad-f2bd-f4e4bcb96e84", + "scrolled": true + }, + "outputs": [ + { + "output_type": "error", + "ename": "TypeError", + "evalue": "DRLEnsembleAgent.run_ensemble_strategy() missing 2 required positional arguments: 'TD3_model_kwargs' and 'timesteps_dict'", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m df_summary = ensemble_agent.run_ensemble_strategy(A2C_model_kwargs,\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mPPO_model_kwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mDDPG_model_kwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m timesteps_dict)\n", + "\u001b[0;31mTypeError\u001b[0m: DRLEnsembleAgent.run_ensemble_strategy() missing 2 required positional arguments: 'TD3_model_kwargs' and 'timesteps_dict'" + ] + } + ], + "source": [ + "df_summary = ensemble_agent.run_ensemble_strategy(A2C_model_kwargs,\n", + " PPO_model_kwargs,\n", + " DDPG_model_kwargs,\n", + " timesteps_dict)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 175 + }, + "id": "-0qd8acMtj1f", + "outputId": "9f0cbf89-5f4b-4691-9e43-daa093ebceae" + }, + "outputs": [ + { + "data": { + "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", + "
IterVal StartVal EndModel UsedA2C SharpePPO SharpeDDPG Sharpe
01262021-10-042022-01-03DDPG0.1318750.2236220.327114
11892022-01-032022-04-04A2C-0.14693-0.253404-0.238802
22522022-04-042022-07-06DDPG-0.302721-0.232303-0.168003
33152022-07-062022-10-04DDPG-0.150338-0.177032-0.138149
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " Iter Val Start Val End Model Used A2C Sharpe PPO Sharpe DDPG Sharpe\n", + "0 126 2021-10-04 2022-01-03 DDPG 0.131875 0.223622 0.327114\n", + "1 189 2022-01-03 2022-04-04 A2C -0.14693 -0.253404 -0.238802\n", + "2 252 2022-04-04 2022-07-06 DDPG -0.302721 -0.232303 -0.168003\n", + "3 315 2022-07-06 2022-10-04 DDPG -0.150338 -0.177032 -0.138149" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_summary" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "W6vvNSC6h1jZ" + }, + "source": [ + "\n", + "# Part 7: Backtest Our Strategy\n", + "Backtesting plays a key role in evaluating the performance of a trading strategy. Automated backtesting tool is preferred because it reduces the human error. We usually use the Quantopian pyfolio package to backtest our trading strategies. It is easy to use and consists of various individual plots that provide a comprehensive image of the performance of a trading strategy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "X4JKB--8tj1g" + }, + "outputs": [], + "source": [ + "unique_trade_date = processed[(processed.date > TEST_START_DATE)&(processed.date <= TEST_END_DATE)].date.unique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "q9mKF7GGtj1g", + "outputId": "99c5e5f8-2e3f-49c3-e5a6-4e66ed92e40a", + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sharpe Ratio: -0.11910800246459344\n" + ] + } + ], + "source": [ + "df_trade_date = pd.DataFrame({'datadate':unique_trade_date})\n", + "\n", + "df_account_value=pd.DataFrame()\n", + "for i in range(rebalance_window+validation_window, len(unique_trade_date)+1,rebalance_window):\n", + " temp = pd.read_csv('results/account_value_trade_{}_{}.csv'.format('ensemble',i))\n", + " df_account_value = df_account_value.append(temp,ignore_index=True)\n", + "sharpe=(252**0.5)*df_account_value.account_value.pct_change(1).mean()/df_account_value.account_value.pct_change(1).std()\n", + "print('Sharpe Ratio: ',sharpe)\n", + "df_account_value=df_account_value.join(df_trade_date[validation_window:].reset_index(drop=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "oyosyW7_tj1g", + "outputId": "0e54f2d5-6057-4a14-c94a-5f2af26ad171" + }, + "outputs": [ + { + "data": { + "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", + "
account_valuedatedaily_returndatadate
01000000.0000002022-01-03NaN2022-01-03
1999006.1778902022-01-04-0.0009942022-01-04
2992190.3751432022-01-05-0.0068232022-01-05
3986549.9187762022-01-06-0.0056852022-01-06
4984951.5226952022-01-07-0.0016202022-01-07
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + " account_value date daily_return datadate\n", + "0 1000000.000000 2022-01-03 NaN 2022-01-03\n", + "1 999006.177890 2022-01-04 -0.000994 2022-01-04\n", + "2 992190.375143 2022-01-05 -0.006823 2022-01-05\n", + "3 986549.918776 2022-01-06 -0.005685 2022-01-06\n", + "4 984951.522695 2022-01-07 -0.001620 2022-01-07" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_account_value.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 293 + }, + "id": "wLsRdw2Ctj1h", + "outputId": "0e2b0bc2-840c-47fd-87d4-01201d8e4e3d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "df_account_value.account_value.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Lr2zX7ZxNyFQ" + }, + "source": [ + "\n", + "## 7.1 BackTestStats\n", + "pass in df_account_value, this information is stored in env class\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Nzkr9yv-AdV_", + "outputId": "ab0971b8-10b0-4fb1-a151-71a1de89cdf2", + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==============Get Backtest Results===========\n", + "Annual return -0.039389\n", + "Cumulative returns -0.039389\n", + "Annual volatility 0.189054\n", + "Sharpe ratio -0.119108\n", + "Calmar ratio -0.226725\n", + "Stability 0.009971\n", + "Max drawdown -0.173731\n", + "Omega ratio 0.980324\n", + "Sortino ratio -0.165730\n", + "Skew NaN\n", + "Kurtosis NaN\n", + "Tail ratio 0.958268\n", + "Daily value at risk -0.023908\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "print(\"==============Get Backtest Results===========\")\n", + "now = datetime.datetime.now().strftime('%Y%m%d-%Hh%M')\n", + "\n", + "perf_stats_all = backtest_stats(account_value=df_account_value)\n", + "perf_stats_all = pd.DataFrame(perf_stats_all)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DiHhM1YkoCel", + "outputId": "c233f613-67a3-4882-8710-c1839247590e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==============Get Baseline Stats===========\n", + "\r[*********************100%***********************] 1 of 1 completed\n", + "Shape of DataFrame: (251, 8)\n", + "Annual return -0.094324\n", + "Cumulative returns -0.093968\n", + "Annual volatility 0.198502\n", + "Sharpe ratio -0.402058\n", + "Calmar ratio -0.429901\n", + "Stability 0.236972\n", + "Max drawdown -0.219408\n", + "Omega ratio 0.936015\n", + "Sortino ratio -0.559755\n", + "Skew NaN\n", + "Kurtosis NaN\n", + "Tail ratio 1.014390\n", + "Daily value at risk -0.025326\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "#baseline stats\n", + "print(\"==============Get Baseline Stats===========\")\n", + "df_dji_ = get_baseline(\n", + " ticker=\"^DJI\",\n", + " start = df_account_value.loc[0,'date'],\n", + " end = df_account_value.loc[len(df_account_value)-1,'date'])\n", + "\n", + "stats = backtest_stats(df_dji_, value_col_name = 'close')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RhJ9whD75WTs", + "outputId": "8ae25787-8400-4357-ecc0-af7538689cee" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "df_dji: date dji\n", + "0 2022-01-03 1.000000e+06\n", + "1 2022-01-04 1.005866e+06\n", + "2 2022-01-05 9.951360e+05\n", + "3 2022-01-06 9.904718e+05\n", + "4 2022-01-07 9.903404e+05\n", + ".. ... ...\n", + "247 2022-12-27 9.086102e+05\n", + "248 2022-12-28 8.986103e+05\n", + "249 2022-12-29 9.080428e+05\n", + "250 2022-12-30 9.060324e+05\n", + "251 2023-01-03 NaN\n", + "\n", + "[252 rows x 2 columns]\n", + "df_dji: dji\n", + "date \n", + "2022-01-03 1.000000e+06\n", + "2022-01-04 1.005866e+06\n", + "2022-01-05 9.951360e+05\n", + "2022-01-06 9.904718e+05\n", + "2022-01-07 9.903404e+05\n", + "... ...\n", + "2022-12-27 9.086102e+05\n", + "2022-12-28 8.986103e+05\n", + "2022-12-29 9.080428e+05\n", + "2022-12-30 9.060324e+05\n", + "2023-01-03 NaN\n", + "\n", + "[252 rows x 1 columns]\n" + ] + } + ], + "source": [ + "df_dji = pd.DataFrame()\n", + "df_dji['date'] = df_account_value['date']\n", + "df_dji['dji'] = df_dji_['close'] / df_dji_['close'][0] * env_kwargs[\"initial_amount\"]\n", + "print(\"df_dji: \", df_dji)\n", + "df_dji.to_csv(\"df_dji.csv\")\n", + "df_dji = df_dji.set_index(df_dji.columns[0])\n", + "print(\"df_dji: \", df_dji)\n", + "df_dji.to_csv(\"df_dji+.csv\")\n", + "\n", + "df_account_value.to_csv('df_account_value.csv')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9U6Suru3h1jc" + }, + "source": [ + "\n", + "## 7.2 BackTestPlot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "HggausPRoCem", + "outputId": "615e8d79-f3d7-47e9-c886-3cd18e4535f2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "df_result_ensemble.columns: Index(['ensemble'], dtype='object')\n", + "df_trade_date: datadate\n", + "0 2021-10-04\n", + "1 2021-10-05\n", + "2 2021-10-06\n", + "3 2021-10-07\n", + "4 2021-10-08\n", + ".. ...\n", + "348 2023-02-22\n", + "349 2023-02-23\n", + "350 2023-02-24\n", + "351 2023-02-27\n", + "352 2023-02-28\n", + "\n", + "[353 rows x 1 columns]\n", + "df_result_ensemble: ensemble\n", + "date \n", + "2022-01-03 1000000.000000\n", + "2022-01-04 999006.177890\n", + "2022-01-05 992190.375143\n", + "2022-01-06 986549.918776\n", + "2022-01-07 984951.522695\n", + "... ...\n", + "2022-12-27 966931.603579\n", + "2022-12-28 956294.904131\n", + "2022-12-29 964607.097342\n", + "2022-12-30 960687.624327\n", + "2023-01-03 960610.826884\n", + "\n", + "[252 rows x 1 columns]\n", + "==============Compare to DJIA===========\n", + "result: ensemble dji\n", + "date \n", + "2022-01-03 1000000.000000 1.000000e+06\n", + "2022-01-04 999006.177890 1.005866e+06\n", + "2022-01-05 992190.375143 9.951360e+05\n", + "2022-01-06 986549.918776 9.904718e+05\n", + "2022-01-07 984951.522695 9.903404e+05\n", + "... ... ...\n", + "2022-12-27 966931.603579 9.086102e+05\n", + "2022-12-28 956294.904131 8.986103e+05\n", + "2022-12-29 964607.097342 9.080428e+05\n", + "2022-12-30 960687.624327 9.060324e+05\n", + "2023-01-03 960610.826884 NaN\n", + "\n", + "[252 rows x 2 columns]\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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yHd3WQvgwIc2W6Xj9L+It4iEnAI4ERERkZEiKx9am+DwDlv/rbmufyUERCTkAlVGQERERETCXXa+XZZthjFN9rmGUIoMKwrgREREREaKtKk262T5FlsAHDSEUmSYUQAnIiIiMlJERMC4+TaRSXKWXZeaG9ImiUj/KIAboNtvv53ExERqa2tZsWIF55xzDjfeeCM333wzs2fPDnXzRERERLzLzocNv4eMGRCfAbGJoW6RiPSDArhBuuOOO9qf33fffSFsiYiIiIgfsvKhpQF2v6QEJiLDkLJQ9sOaNWuYPn06p512Gjt37gTguuuu4/HHHwfgzDPPpHsRchEREZGw4klkcuyA5r+JDEPDrwfuuVvhwAeBPee4eXD+D3rdZePGjTzyyCNs3ryZlpYWFi1axEknnRTYdoiIiIgEW/o0iE5QCQGRYUo9cH564403+MhHPkJ8fDzJyclccskloW6SiIiISP9FRNovr0E9cCLD0PDrgeujp0xERERE+pCdD8XvqAacyDCkHjg/rVixgn/84x80NDRw9OhRnnrqqVA3SURERGRgJi6HiGjInBHqlohIPw2/HrgQWbRoEf/xH//BggULGDNmDEuWLGnfZowJYctERERE+mnWxXDzdkjMDHVLRKSfFMD1w2233cZtt93WZd3FF19MWloaAGvXrg1Bq0RERET6yRgFbyLDlIZQDsL1119PfX09p512WqibIiIiIiIiI4B64AbhgQceCHUTRERERERkBFEPnIiIiIiIyDAxbAI4x3FC3YQTht5LEREREZHhaVgEcHFxcVRWVirwCADHcaisrCQuLi7UTRERERERkX4aFnPgcnJyKCkp4fDhw6FuygkhLi6OnJycUDdDRERERET6aVgEcNHR0UyePDnUzRAREREREQmpYTGEUkRERERERBTAiYiIiIiIDBsK4ERERERERIYJE26ZHY0xh4HCULfDiwygItSNkBOW7i8JJt1fEiy6tySYdH9JsAyHe2ui4ziZ3jaEXQAXrowxGxzHWRzqdsiJSfeXBJPuLwkW3VsSTLq/JFiG+72lIZQiIiIiIiLDhAI4ERERERGRYUIBnP9+F+oGyAlN95cEk+4vCRbdWxJMur8kWIb1vaU5cCIiIiIiIsOEeuBERERERESGiWEbwBljJhhjXjXGbDPGbDXGfMVdn2aMedEYU+AuR7vrrzHG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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "\n", + "# print(\"==============Compare to DJIA===========\")\n", + "# %matplotlib inline\n", + "# # S&P 500: ^GSPC\n", + "# # Dow Jones Index: ^DJI\n", + "# # NASDAQ 100: ^NDX\n", + "# backtest_plot(df_account_value,\n", + "# baseline_ticker = '^DJI',\n", + "# baseline_start = df_account_value.loc[0,'date'],\n", + "# baseline_end = df_account_value.loc[len(df_account_value)-1,'date'])\n", + "df.to_csv(\"df.csv\")\n", + "df_result_ensemble = pd.DataFrame({'date': df_account_value['date'], 'ensemble': df_account_value['account_value']})\n", + "df_result_ensemble = df_result_ensemble.set_index('date')\n", + "\n", + "print(\"df_result_ensemble.columns: \", df_result_ensemble.columns)\n", + "\n", + "# df_result_ensemble.drop(df_result_ensemble.columns[0], axis = 1)\n", + "print(\"df_trade_date: \", df_trade_date)\n", + "# df_result_ensemble['date'] = df_trade_date['datadate']\n", + "# df_result_ensemble['account_value'] = df_account_value['account_value']\n", + "df_result_ensemble.to_csv(\"df_result_ensemble.csv\")\n", + "print(\"df_result_ensemble: \", df_result_ensemble)\n", + "print(\"==============Compare to DJIA===========\")\n", + "result = pd.DataFrame()\n", + "# result = pd.merge(result, df_result_ensemble, left_index=True, right_index=True)\n", + "# result = pd.merge(result, df_dji, left_index=True, right_index=True)\n", + "result = pd.merge(df_result_ensemble, df_dji, left_index=True, right_index=True)\n", + "print(\"result: \", result)\n", + "result.to_csv(\"result.csv\")\n", + "result.columns = ['ensemble', 'dji']\n", + "\n", + "%matplotlib inline\n", + "plt.rcParams[\"figure.figsize\"] = (15,5)\n", + "plt.figure();\n", + "result.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oBQx4bVQFi-a" + }, + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [], + "include_colab_link": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file