From 857977dd4a68c887b876c1a3088a84521b8652d5 Mon Sep 17 00:00:00 2001 From: aymeric75 Date: Wed, 8 Jan 2025 00:50:24 +0100 Subject: [PATCH] Added a scrapper for Yahoo Finance Data in the YahooFinanceProcessor class (#1305) * last * last * added yahoo scrapper * reformatted with isort and black * last * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * last * last * last * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- examples/Stock_NeurIPS2018_SB3.ipynb | 7824 ++++------------- .../data_processors/processor_yahoofinance.py | 123 + 2 files changed, 1857 insertions(+), 6090 deletions(-) diff --git a/examples/Stock_NeurIPS2018_SB3.ipynb b/examples/Stock_NeurIPS2018_SB3.ipynb index 842260512..d595d5b7e 100644 --- a/examples/Stock_NeurIPS2018_SB3.ipynb +++ b/examples/Stock_NeurIPS2018_SB3.ipynb @@ -1,6099 +1,1743 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "yfv52r2G33jY" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gXaoZs2lh1hi" - }, - "source": [ - "# Deep Reinforcement Learning for Stock Trading from Scratch: Multiple Stock Trading\n", - "\n", - "* **Pytorch Version** \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lGunVt8oLCVS" - }, - "source": [ - "# Content" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HOzAKQ-SLGX6" - }, - "source": [ - "* [1. Task Description](#0)\n", - "* [2. Install Python packages](#1)\n", - " * [2.1. Install Packages](#1.1) \n", - " * [2.2. A List of Python Packages](#1.2)\n", - " * [2.3. Import Packages](#1.3)\n", - " * [2.4. Create Folders](#1.4)\n", - "* [3. Download and Preprocess 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 Market Environment in OpenAI Gym-style](#4) \n", - " * [5.1. Data Split](#4.1) \n", - " * [5.3. Environment for Training](#4.2) \n", - "* [6. Train DRL Agents](#5)\n", - "* [7. Backtesting Performance](#6) \n", - " * [7.1. BackTestStats](#6.1)\n", - " * [7.2. BackTestPlot](#6.2) \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sApkDlD9LIZv" - }, - "source": [ - "\n", - "# Part 1. Task Discription" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HjLD2TZSLKZ-" - }, - "source": [ - "We train a DRL agent for stock trading. This task is modeled as a Markov Decision Process (MDP), and the objective function is maximizing (expected) cumulative return.\n", - "\n", - "We specify the state-action-reward as follows:\n", - "\n", - "* **State s**: The state space represents an agent's perception of the market environment. Just like a human trader analyzing various information, here our agent passively observes many features and learns by interacting with the market environment (usually by replaying historical data).\n", - "\n", - "* **Action a**: The action space includes allowed actions that an agent can take at each state. For example, a ∈ {−1, 0, 1}, where −1, 0, 1 represent\n", - "selling, holding, and buying. When an action operates multiple shares, a ∈{−k, ..., −1, 0, 1, ..., k}, e.g.. \"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′)**: Reward is an incentive for an agent to learn a better policy. For example, it can be the change of the portfolio value when taking a at state s and arriving at new state s', i.e., r(s, a, s′) = v′ − v, where v′ and v represent the portfolio values at state s′ and s, respectively\n", - "\n", - "\n", - "**Market environment**: 30 consituent stocks of Dow Jones Industrial Average (DJIA) index. Accessed at the starting date of the testing period.\n", - "\n", - "\n", - "The data 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. Install Python Packages" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Uy5_PTmOh1hj" - }, - "source": [ - "\n", - "## 2.1. Install packages\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "mPT0ipYE28wL", - "outputId": "6dad74d2-c37f-4b86-c584-2436d2ef5bae" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", - "Collecting swig\n", - " Using cached swig-4.1.1-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.8 MB)\n", - "Installing collected packages: swig\n", - "Successfully installed swig-4.1.1\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0mLooking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", - "Requirement already satisfied: wrds in /usr/local/lib/python3.9/site-packages (3.1.6)\n", - "Requirement already satisfied: psycopg2-binary in /usr/local/lib/python3.9/site-packages (from wrds) (2.9.6)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.9/site-packages (from wrds) (1.24.2)\n", - "Requirement already satisfied: scipy in /usr/local/lib/python3.9/site-packages (from wrds) (1.10.1)\n", - "Requirement already satisfied: sqlalchemy<2 in /usr/local/lib/python3.9/site-packages (from wrds) (1.4.47)\n", - "Requirement already satisfied: pandas in /usr/local/lib/python3.9/site-packages (from wrds) (2.0.0)\n", - "Requirement already satisfied: greenlet!=0.4.17 in /usr/local/lib/python3.9/site-packages (from sqlalchemy<2->wrds) (2.0.2)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.9/site-packages (from pandas->wrds) (2.8.2)\n", - "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.9/site-packages (from pandas->wrds) (2023.3)\n", - "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.9/site-packages (from pandas->wrds) (2023.3)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.9/site-packages (from python-dateutil>=2.8.2->pandas->wrds) (1.16.0)\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0mLooking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", - "Collecting pyportfolioopt\n", - " Using cached pyportfolioopt-1.5.4-py3-none-any.whl (61 kB)\n", - "Requirement already satisfied: pandas>=0.19 in /usr/local/lib/python3.9/site-packages (from pyportfolioopt) (2.0.0)\n", - "Requirement already satisfied: scipy<2.0,>=1.3 in /usr/local/lib/python3.9/site-packages (from pyportfolioopt) (1.10.1)\n", - "Collecting cvxpy<2.0.0,>=1.1.10\n", - " Downloading cvxpy-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.0/4.0 MB\u001b[0m \u001b[31m29.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: numpy<2.0.0,>=1.22.4 in /usr/local/lib/python3.9/site-packages (from pyportfolioopt) (1.24.2)\n", - "Requirement already satisfied: setuptools>65.5.1 in /usr/local/lib/python3.9/site-packages (from cvxpy<2.0.0,>=1.1.10->pyportfolioopt) (65.6.3)\n", - "Collecting ecos>=2\n", - " Downloading ecos-2.0.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (220 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m220.1/220.1 kB\u001b[0m \u001b[31m18.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting scs>=1.1.6\n", - " Downloading scs-3.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.7 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.7/10.7 MB\u001b[0m \u001b[31m41.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting osqp>=0.4.1\n", - " Downloading osqp-0.6.2.post8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (298 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m298.2/298.2 kB\u001b[0m \u001b[31m22.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.9/site-packages (from pandas>=0.19->pyportfolioopt) (2.8.2)\n", - "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.9/site-packages (from pandas>=0.19->pyportfolioopt) (2023.3)\n", - "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.9/site-packages (from pandas>=0.19->pyportfolioopt) (2023.3)\n", - "Collecting qdldl\n", - " Downloading qdldl-0.1.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m45.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: six>=1.5 in /usr/local/lib/python3.9/site-packages (from python-dateutil>=2.8.2->pandas>=0.19->pyportfolioopt) (1.16.0)\n", - "Installing collected packages: scs, qdldl, ecos, osqp, cvxpy, pyportfolioopt\n", - "Successfully installed cvxpy-1.3.1 ecos-2.0.12 osqp-0.6.2.post8 pyportfolioopt-1.5.4 qdldl-0.1.7 scs-3.2.3\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m✨🍰✨ Everything looks OK!\n", - "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", - "Collecting git+https://github.com/AI4Finance-Foundation/FinRL.git\n", - " Cloning https://github.com/AI4Finance-Foundation/FinRL.git to /tmp/pip-req-build-cseb5t6p\n", - " Running command git clone --filter=blob:none --quiet https://github.com/AI4Finance-Foundation/FinRL.git /tmp/pip-req-build-cseb5t6p\n", - " Resolved https://github.com/AI4Finance-Foundation/FinRL.git to commit 2ed2207c926608d559789624df26ef26682d2e14\n", - " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", - " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", - " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting elegantrl@ git+https://github.com/AI4Finance-Foundation/ElegantRL.git#egg=elegantrl\n", - " Cloning https://github.com/AI4Finance-Foundation/ElegantRL.git to /tmp/pip-install-_lm24vb_/elegantrl_c12ae7d2917240d88d343d99b571685b\n", - " Running command git clone --filter=blob:none --quiet https://github.com/AI4Finance-Foundation/ElegantRL.git /tmp/pip-install-_lm24vb_/elegantrl_c12ae7d2917240d88d343d99b571685b\n", - " Resolved https://github.com/AI4Finance-Foundation/ElegantRL.git to commit c22e8402e4778f15475bade34d1b9e37b557d97d\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Collecting pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2\n", - " Cloning https://github.com/quantopian/pyfolio.git to /tmp/pip-install-_lm24vb_/pyfolio_8da514f26bb94b29bbca93fedbe6536b\n", - " Running command git clone --filter=blob:none --quiet https://github.com/quantopian/pyfolio.git /tmp/pip-install-_lm24vb_/pyfolio_8da514f26bb94b29bbca93fedbe6536b\n", - " Resolved https://github.com/quantopian/pyfolio.git to commit 4b901f6d73aa02ceb6d04b7d83502e5c6f2e81aa\n", - " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "Requirement already satisfied: lz4 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (4.3.2)\n", - "Requirement already satisfied: stable-baselines3<2.0.0,>=1.6.2 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (1.8.0)\n", - "Requirement already satisfied: tensorboardX in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (2.6)\n", - "Requirement already satisfied: yfinance in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (0.2.17)\n", - "Requirement already satisfied: exchange_calendars==3.6.3 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (3.6.3)\n", - "Requirement already satisfied: gputil in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (1.4.0)\n", - "Requirement already satisfied: alpaca_trade_api>=2.1.0 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (3.0.0)\n", - "Requirement already satisfied: wrds>=3.1.6 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (3.1.6)\n", - "Requirement already satisfied: importlib-metadata==4.13.0 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (4.13.0)\n", - "Requirement already satisfied: stockstats>=0.4.0 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (0.5.2)\n", - "Requirement already satisfied: ccxt>=1.66.32 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (3.0.63)\n", - "Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (1.24.2)\n", - "Requirement already satisfied: scikit-learn>=0.21.0 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (1.2.2)\n", - "Requirement already satisfied: pandas>=1.1.5 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (2.0.0)\n", - "Requirement already satisfied: ray[default,tune]>=2.0.0 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (2.3.1)\n", - "Requirement already satisfied: gym>=0.17 in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (0.21.0)\n", - "Requirement already satisfied: matplotlib in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (3.7.1)\n", - "Requirement already satisfied: jqdatasdk in /usr/local/lib/python3.9/site-packages (from finrl==0.3.5) (1.8.11)\n", - "Requirement already satisfied: toolz in /usr/local/lib/python3.9/site-packages (from exchange_calendars==3.6.3->finrl==0.3.5) (0.12.0)\n", - "Requirement already satisfied: pyluach in /usr/local/lib/python3.9/site-packages (from exchange_calendars==3.6.3->finrl==0.3.5) (2.2.0)\n", - "Requirement already satisfied: korean-lunar-calendar in /usr/local/lib/python3.9/site-packages (from exchange_calendars==3.6.3->finrl==0.3.5) (0.3.1)\n", - "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.9/site-packages (from exchange_calendars==3.6.3->finrl==0.3.5) (2.8.2)\n", - "Requirement already satisfied: pytz in /usr/local/lib/python3.9/site-packages (from exchange_calendars==3.6.3->finrl==0.3.5) (2023.3)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.9/site-packages (from importlib-metadata==4.13.0->finrl==0.3.5) (3.15.0)\n", - "Requirement already satisfied: deprecation==2.1.0 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (2.1.0)\n", - "Requirement already satisfied: msgpack==1.0.3 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (1.0.3)\n", - "Requirement already satisfied: requests<3,>2 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (2.28.2)\n", - "Requirement already satisfied: websocket-client<2,>=0.56.0 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (1.5.1)\n", - "Requirement already satisfied: websockets<11,>=9.0 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (10.4)\n", - "Requirement already satisfied: PyYAML==6.0 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (6.0)\n", - "Requirement already satisfied: urllib3<2,>1.24 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (1.26.15)\n", - "Requirement already satisfied: aiohttp==3.8.1 in /usr/local/lib/python3.9/site-packages (from alpaca_trade_api>=2.1.0->finrl==0.3.5) (3.8.1)\n", - "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.9/site-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (22.2.0)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /usr/local/lib/python3.9/site-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (4.0.2)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.9/site-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (6.0.4)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.9/site-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (1.8.2)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.9/site-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (1.3.1)\n", - "Requirement already satisfied: charset-normalizer<3.0,>=2.0 in /usr/local/lib/python3.9/site-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (2.1.1)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.9/site-packages (from aiohttp==3.8.1->alpaca_trade_api>=2.1.0->finrl==0.3.5) (1.3.3)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.9/site-packages (from deprecation==2.1.0->alpaca_trade_api>=2.1.0->finrl==0.3.5) (23.1)\n", - "Requirement already satisfied: setuptools>=60.9.0 in /usr/local/lib/python3.9/site-packages (from ccxt>=1.66.32->finrl==0.3.5) (65.6.3)\n", - "Requirement already satisfied: certifi>=2018.1.18 in /usr/local/lib/python3.9/site-packages (from ccxt>=1.66.32->finrl==0.3.5) (2022.12.7)\n", - "Requirement already satisfied: cryptography>=2.6.1 in /usr/local/lib/python3.9/site-packages (from ccxt>=1.66.32->finrl==0.3.5) (39.0.2)\n", - "Requirement already satisfied: aiodns>=1.1.1 in /usr/local/lib/python3.9/site-packages (from ccxt>=1.66.32->finrl==0.3.5) (3.0.0)\n", - "Requirement already satisfied: cloudpickle>=1.2.0 in /usr/local/lib/python3.9/site-packages (from gym>=0.17->finrl==0.3.5) (2.2.1)\n", - "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.9/site-packages (from pandas>=1.1.5->finrl==0.3.5) (2023.3)\n", - "Requirement already satisfied: protobuf!=3.19.5,>=3.15.3 in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (3.20.3)\n", - "Requirement already satisfied: grpcio>=1.32.0 in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (1.53.0)\n", - "Requirement already satisfied: click>=7.0 in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (8.1.3)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (3.11.0)\n", - "Requirement already satisfied: jsonschema in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (4.17.3)\n", - "Requirement already satisfied: virtualenv>=20.0.24 in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (20.21.0)\n", - "Requirement already satisfied: tabulate in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.9.0)\n", - "Requirement already satisfied: colorful in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.5.5)\n", - "Requirement already satisfied: opencensus in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.11.2)\n", - "Requirement already satisfied: gpustat>=1.0.0 in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (1.1)\n", - "Requirement already satisfied: aiohttp-cors in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.7.0)\n", - "Requirement already satisfied: py-spy>=0.2.0 in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.3.14)\n", - "Requirement already satisfied: pydantic in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (1.10.7)\n", - "Requirement already satisfied: prometheus-client>=0.7.1 in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (0.16.0)\n", - "Requirement already satisfied: smart-open in /usr/local/lib/python3.9/site-packages (from ray[default,tune]>=2.0.0->finrl==0.3.5) (6.3.0)\n", - "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.9/site-packages (from scikit-learn>=0.21.0->finrl==0.3.5) (1.2.0)\n", - "Requirement already satisfied: scipy>=1.3.2 in /usr/local/lib/python3.9/site-packages (from scikit-learn>=0.21.0->finrl==0.3.5) (1.10.1)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.9/site-packages (from scikit-learn>=0.21.0->finrl==0.3.5) (3.1.0)\n", - "Requirement already satisfied: torch>=1.11 in /usr/local/lib/python3.9/site-packages (from stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (2.0.0)\n", - "Requirement already satisfied: psycopg2-binary in /usr/local/lib/python3.9/site-packages (from wrds>=3.1.6->finrl==0.3.5) (2.9.6)\n", - "Requirement already satisfied: sqlalchemy<2 in /usr/local/lib/python3.9/site-packages (from wrds>=3.1.6->finrl==0.3.5) (1.4.47)\n", - "Requirement already satisfied: pymysql>=0.7.6 in /usr/local/lib/python3.9/site-packages (from jqdatasdk->finrl==0.3.5) (1.0.3)\n", - "Requirement already satisfied: thriftpy2>=0.3.9 in /usr/local/lib/python3.9/site-packages (from jqdatasdk->finrl==0.3.5) (0.4.16)\n", - "Requirement already satisfied: six in /usr/local/lib/python3.9/site-packages (from jqdatasdk->finrl==0.3.5) (1.16.0)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.9/site-packages (from matplotlib->finrl==0.3.5) (3.0.9)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.9/site-packages (from matplotlib->finrl==0.3.5) (1.4.4)\n", - "Requirement already satisfied: importlib-resources>=3.2.0 in /usr/local/lib/python3.9/site-packages (from matplotlib->finrl==0.3.5) (5.12.0)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.9/site-packages (from matplotlib->finrl==0.3.5) (4.39.3)\n", - "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.9/site-packages (from matplotlib->finrl==0.3.5) (9.5.0)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.9/site-packages (from matplotlib->finrl==0.3.5) (1.0.7)\n", - "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.9/site-packages (from matplotlib->finrl==0.3.5) (0.11.0)\n", - "Requirement already satisfied: ipython>=3.2.3 in /usr/local/lib/python3.9/site-packages (from pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (8.12.0)\n", - "Requirement already satisfied: seaborn>=0.7.1 in /usr/local/lib/python3.9/site-packages (from pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.12.2)\n", - "Requirement already satisfied: empyrical>=0.5.0 in /usr/local/lib/python3.9/site-packages (from pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.5.5)\n", - "Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.9/site-packages (from yfinance->finrl==0.3.5) (0.0.11)\n", - "Requirement already satisfied: beautifulsoup4>=4.11.1 in /usr/local/lib/python3.9/site-packages (from yfinance->finrl==0.3.5) (4.12.2)\n", - "Requirement already satisfied: appdirs>=1.4.4 in /usr/local/lib/python3.9/site-packages (from yfinance->finrl==0.3.5) (1.4.4)\n", - "Requirement already satisfied: frozendict>=2.3.4 in /usr/local/lib/python3.9/site-packages (from yfinance->finrl==0.3.5) (2.3.7)\n", - "Requirement already satisfied: html5lib>=1.1 in /usr/local/lib/python3.9/site-packages (from yfinance->finrl==0.3.5) (1.1)\n", - "Requirement already satisfied: lxml>=4.9.1 in /usr/local/lib/python3.9/site-packages (from yfinance->finrl==0.3.5) (4.9.2)\n", - "Requirement already satisfied: pycares>=4.0.0 in /usr/local/lib/python3.9/site-packages (from aiodns>=1.1.1->ccxt>=1.66.32->finrl==0.3.5) (4.3.0)\n", - "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.9/site-packages (from beautifulsoup4>=4.11.1->yfinance->finrl==0.3.5) (2.4)\n", - "Requirement already satisfied: cffi>=1.12 in /usr/local/lib/python3.9/site-packages (from cryptography>=2.6.1->ccxt>=1.66.32->finrl==0.3.5) (1.15.1)\n", - "Requirement already satisfied: pandas-datareader>=0.2 in /usr/local/lib/python3.9/site-packages (from empyrical>=0.5.0->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.10.0)\n", - "Requirement already satisfied: nvidia-ml-py>=11.450.129 in /usr/local/lib/python3.9/site-packages (from gpustat>=1.0.0->ray[default,tune]>=2.0.0->finrl==0.3.5) (11.525.112)\n", - "Requirement already satisfied: blessed>=1.17.1 in /usr/local/lib/python3.9/site-packages (from gpustat>=1.0.0->ray[default,tune]>=2.0.0->finrl==0.3.5) (1.20.0)\n", - "Requirement already satisfied: psutil>=5.6.0 in /usr/local/lib/python3.9/site-packages (from gpustat>=1.0.0->ray[default,tune]>=2.0.0->finrl==0.3.5) (5.9.4)\n", - "Requirement already satisfied: webencodings in /usr/local/lib/python3.9/site-packages (from html5lib>=1.1->yfinance->finrl==0.3.5) (0.5.1)\n", - "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (4.5.0)\n", - "Requirement already satisfied: stack-data in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.6.2)\n", - "Requirement already satisfied: jedi>=0.16 in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.18.2)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (3.0.38)\n", - "Requirement already satisfied: backcall in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.2.0)\n", - "Requirement already satisfied: decorator in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (5.1.1)\n", - "Requirement already satisfied: pickleshare in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.7.5)\n", - "Requirement already satisfied: traitlets>=5 in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (5.9.0)\n", - "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (4.8.0)\n", - "Requirement already satisfied: matplotlib-inline in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.1.6)\n", - "Requirement already satisfied: pygments>=2.4.0 in /usr/local/lib/python3.9/site-packages (from ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (2.15.0)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/site-packages (from requests<3,>2->alpaca_trade_api>=2.1.0->finrl==0.3.5) (3.4)\n", - "Requirement already satisfied: greenlet!=0.4.17 in /usr/local/lib/python3.9/site-packages (from sqlalchemy<2->wrds>=3.1.6->finrl==0.3.5) (2.0.2)\n", - "Requirement already satisfied: ply<4.0,>=3.4 in /usr/local/lib/python3.9/site-packages (from thriftpy2>=0.3.9->jqdatasdk->finrl==0.3.5) (3.11)\n", - "Requirement already satisfied: nvidia-cuda-cupti-cu11==11.7.101 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (11.7.101)\n", - "Requirement already satisfied: jinja2 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (3.1.2)\n", - "Requirement already satisfied: nvidia-cuda-runtime-cu11==11.7.99 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (11.7.99)\n", - "Requirement already satisfied: nvidia-nvtx-cu11==11.7.91 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (11.7.91)\n", - "Requirement already satisfied: networkx in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (3.1)\n", - "Requirement already satisfied: triton==2.0.0 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (2.0.0)\n", - "Requirement already satisfied: sympy in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (1.11.1)\n", - "Requirement already satisfied: nvidia-cuda-nvrtc-cu11==11.7.99 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (11.7.99)\n", - "Requirement already satisfied: nvidia-cudnn-cu11==8.5.0.96 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (8.5.0.96)\n", - "Requirement already satisfied: nvidia-nccl-cu11==2.14.3 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (2.14.3)\n", - "Requirement already satisfied: nvidia-cusolver-cu11==11.4.0.1 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (11.4.0.1)\n", - "Requirement already satisfied: nvidia-cufft-cu11==10.9.0.58 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (10.9.0.58)\n", - "Requirement already satisfied: nvidia-curand-cu11==10.2.10.91 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (10.2.10.91)\n", - "Requirement already satisfied: nvidia-cublas-cu11==11.10.3.66 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (11.10.3.66)\n", - "Requirement already satisfied: nvidia-cusparse-cu11==11.7.4.91 in /usr/local/lib/python3.9/site-packages (from torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (11.7.4.91)\n", - "Requirement already satisfied: wheel in /usr/local/lib/python3.9/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (0.38.4)\n", - "Requirement already satisfied: cmake in /usr/local/lib/python3.9/site-packages (from triton==2.0.0->torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (3.26.3)\n", - "Requirement already satisfied: lit in /usr/local/lib/python3.9/site-packages (from triton==2.0.0->torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (16.0.1)\n", - "Requirement already satisfied: distlib<1,>=0.3.6 in /usr/local/lib/python3.9/site-packages (from virtualenv>=20.0.24->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.3.6)\n", - "Requirement already satisfied: platformdirs<4,>=2.4 in /usr/local/lib/python3.9/site-packages (from virtualenv>=20.0.24->ray[default,tune]>=2.0.0->finrl==0.3.5) (3.2.0)\n", - "Requirement already satisfied: box2d-py==2.3.5 in /usr/local/lib/python3.9/site-packages (from gym>=0.17->finrl==0.3.5) (2.3.5)\n", - "Requirement already satisfied: pyglet>=1.4.0 in /usr/local/lib/python3.9/site-packages (from gym>=0.17->finrl==0.3.5) (2.0.5)\n", - "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.9/site-packages (from jsonschema->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.19.3)\n", - "Requirement already satisfied: google-api-core<3.0.0,>=1.0.0 in /usr/local/lib/python3.9/site-packages (from opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (2.11.0)\n", - "Requirement already satisfied: opencensus-context>=0.1.3 in /usr/local/lib/python3.9/site-packages (from opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.1.3)\n", - "Requirement already satisfied: wcwidth>=0.1.4 in /usr/local/lib/python3.9/site-packages (from blessed>=1.17.1->gpustat>=1.0.0->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.2.6)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.9/site-packages (from cffi>=1.12->cryptography>=2.6.1->ccxt>=1.66.32->finrl==0.3.5) (2.21)\n", - "Requirement already satisfied: google-auth<3.0dev,>=2.14.1 in /usr/local/lib/python3.9/site-packages (from google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (2.17.3)\n", - "Requirement already satisfied: googleapis-common-protos<2.0dev,>=1.56.2 in /usr/local/lib/python3.9/site-packages (from google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (1.59.0)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /usr/local/lib/python3.9/site-packages (from jedi>=0.16->ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.8.3)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.9/site-packages (from pexpect>4.3->ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.7.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.9/site-packages (from jinja2->torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (2.1.2)\n", - "Requirement already satisfied: asttokens>=2.1.0 in /usr/local/lib/python3.9/site-packages (from stack-data->ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (2.2.1)\n", - "Requirement already satisfied: pure-eval in /usr/local/lib/python3.9/site-packages (from stack-data->ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (0.2.2)\n", - "Requirement already satisfied: executing>=1.2.0 in /usr/local/lib/python3.9/site-packages (from stack-data->ipython>=3.2.3->pyfolio@ git+https://github.com/quantopian/pyfolio.git#egg=pyfolio-0.9.2->finrl==0.3.5) (1.2.0)\n", - "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.9/site-packages (from sympy->torch>=1.11->stable-baselines3<2.0.0,>=1.6.2->finrl==0.3.5) (1.3.0)\n", - "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.9/site-packages (from google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (5.3.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.9/site-packages (from google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (4.9)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.9/site-packages (from google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.2.8)\n", - "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth<3.0dev,>=2.14.1->google-api-core<3.0.0,>=1.0.0->opencensus->ray[default,tune]>=2.0.0->finrl==0.3.5) (0.4.8)\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m" - ] - } - ], - "source": [ - "## install required packages\n", - "!pip install swig\n", - "!pip install wrds\n", - "!pip install pyportfolioopt\n", - "## install finrl library\n", - "!pip install -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 git+https://github.com/AI4Finance-Foundation/FinRL.git" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "osBHhVysOEzi" - }, - "source": [ - "\n", - "\n", - "## 2.2. A list of Python packages \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", - "execution_count": 2, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "lPqeTTwoh1hn", - "outputId": "e55033fc-48ae-4696-ae45-08b8bef664d5" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.9/site-packages/pyfolio/pos.py:26: UserWarning: Module \"zipline.assets\" not found; multipliers 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", - "%matplotlib inline\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\n", - "from stable_baselines3.common.logger import configure\n", - "from finrl.meta.data_processor import DataProcessor\n", - "\n", - "from finrl.plot import backtest_stats, backtest_plot, get_daily_return, get_baseline\n", - "from pprint import pprint\n", - "\n", - "import sys\n", - "sys.path.append(\"../FinRL\")\n", - "\n", - "import itertools" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "T2owTj985RW4" - }, - "source": [ - "\n", - "## 2.4. Create Folders" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "RtUc_ofKmpdy" - }, - "outputs": [], - "source": [ - "from finrl import config\n", - "from finrl import config_tickers\n", - "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", - "check_and_make_directories([DATA_SAVE_DIR, TRAINED_MODEL_DIR, TENSORBOARD_LOG_DIR, RESULTS_DIR])\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "A289rQWMh1hq" - }, - "source": [ - "\n", - "# Part 3. Download Data\n", - "Yahoo Finance provides stock data, financial news, financial reports, etc. Yahoo Finance is free.\n", - "* FinRL uses a class **YahooDownloader** in FinRL-Meta to fetch data via 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)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NPeQ7iS-LoMm" - }, - "source": [ - "\n", - "\n", - "-----\n", - "class YahooDownloader:\n", - " 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" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 0 - }, - "id": "h3XJnvrbLp-C", - "outputId": "a03772b5-9cad-463f-e1d6-58d91a70a594" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'2021-10-01'" - ], - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - } - }, - "metadata": {}, - "execution_count": 87 - } - ], - "source": [ - "# from config.py, TRAIN_START_DATE is a string\n", - "TRAIN_START_DATE\n", - "# from config.py, TRAIN_END_DATE is a string\n", - "TRAIN_END_DATE" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": { - "id": "FUnY8WEfLq3C" - }, - "outputs": [], - "source": [ - "TRAIN_START_DATE = '2010-01-01'\n", - "TRAIN_END_DATE = '2021-10-01'\n", - "TRADE_START_DATE = '2021-10-01'\n", - "TRADE_END_DATE = '2023-03-01'" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "yCKm4om-s9kE", - "outputId": "fd758d58-8946-42ee-e2e3-16f4ac74add2" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "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", - "Shape of DataFrame: (97013, 8)\n" - ] - } - ], - "source": [ - "df = YahooDownloader(start_date = TRAIN_START_DATE,\n", - " end_date = TRADE_END_DATE,\n", - " ticker_list = config_tickers.DOW_30_TICKER).fetch_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "JzqRRTOX6aFu", - "outputId": "58a21ede-016a-4eaf-db9f-aeb190b3f939" - }, - "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(config_tickers.DOW_30_TICKER)" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "CV3HrZHLh1hy", - "outputId": "c2cf4956-210b-4811-be12-0c7fd18b923c" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "(97013, 8)" - ] - }, - "metadata": {}, - "execution_count": 91 - } - ], - "source": [ - "df.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 0 - }, - "id": "4hYkeaPiICHS", - "outputId": "6d7a1c0d-15dc-4adc-b776-f1020e173a5c" - }, - "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.505281 493729600 AAPL \\\n", - "1 2010-01-04 56.630001 57.869999 56.560001 42.888958 5277400 AMGN \n", - "2 2010-01-04 40.810001 41.099998 40.389999 33.551674 6894300 AXP \n", - "3 2010-01-04 55.720001 56.389999 54.799999 43.777550 6186700 BA \n", - "4 2010-01-04 57.650002 59.189999 57.509998 41.156906 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", - " \n", - "
dateopenhighlowclosevolumeticday
02010-01-047.6225007.6607147.5850006.505281493729600AAPL0
12010-01-0456.63000157.86999956.56000142.8889585277400AMGN0
22010-01-0440.81000141.09999840.38999933.5516746894300AXP0
32010-01-0455.72000156.38999954.79999943.7775506186700BA0
42010-01-0457.65000259.18999957.50999841.1569067325600CAT0
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 92 - } - ], - "source": [ - "df.sort_values(['date','tic'],ignore_index=True).head()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uqC6c40Zh1iH" - }, - "source": [ - "# Part 4: Preprocess Data\n", - "We need to check for missing data and do feature engineering to convert the data point into a state.\n", - "* **Adding technical indicators**. In practical trading, various information needs to be taken into account, such as historical prices, current holding shares, technical indicators, etc. Here, we demonstrate two trend-following technical indicators: MACD and RSI.\n", - "* **Adding turbulence index**. Risk-aversion reflects whether an investor prefers to protect 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 turbulence index that measures extreme fluctuation of asset price." - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "PmKP-1ii3RLS", - "outputId": "22fecb54-5555-4ec4-cb32-0a54f443e54e" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Successfully added technical indicators\n", - "[*********************100%***********************] 1 of 1 completed\n", - "Shape of DataFrame: (3310, 8)\n", - "Successfully added vix\n", - "Successfully added turbulence index\n" - ] - } - ], - "source": [ - "fe = FeatureEngineer(\n", - " use_technical_indicator=True,\n", - " tech_indicator_list = INDICATORS,\n", - " use_vix=True,\n", - " use_turbulence=True,\n", - " user_defined_feature = False)\n", - "\n", - "processed = fe.preprocess_data(df)" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": { - "id": "Kixon2tR3RLT" - }, - "outputs": [], - "source": [ - "list_ticker = processed[\"tic\"].unique().tolist()\n", - "list_date = list(pd.date_range(processed['date'].min(),processed['date'].max()).astype(str))\n", - "combination = list(itertools.product(list_date,list_ticker))\n", - "\n", - "processed_full = pd.DataFrame(combination,columns=[\"date\",\"tic\"]).merge(processed,on=[\"date\",\"tic\"],how=\"left\")\n", - "processed_full = processed_full[processed_full['date'].isin(processed['date'])]\n", - "processed_full = processed_full.sort_values(['date','tic'])\n", - "\n", - "processed_full = processed_full.fillna(0)" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 0 - }, - "id": "grvhGJJII3Xn", - "outputId": "2af27938-0df3-4fea-e86d-7a361e71d2e2" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " date tic open high low close \n", - "0 2010-01-04 AAPL 7.622500 7.660714 7.585000 6.505281 \\\n", - "1 2010-01-04 AMGN 56.630001 57.869999 56.560001 42.888958 \n", - "2 2010-01-04 AXP 40.810001 41.099998 40.389999 33.551674 \n", - "3 2010-01-04 BA 55.720001 56.389999 54.799999 43.777550 \n", - "4 2010-01-04 CAT 57.650002 59.189999 57.509998 41.156906 \n", - "5 2010-01-04 CRM 18.652500 18.882500 18.547501 18.705000 \n", - "6 2010-01-04 CSCO 24.110001 24.840000 24.010000 17.264450 \n", - "7 2010-01-04 CVX 78.199997 79.199997 78.160004 46.851871 \n", - "8 2010-01-04 DIS 32.500000 32.750000 31.870001 27.933922 \n", - "9 2010-01-04 GS 170.050003 174.250000 169.509995 139.862900 \n", - "\n", - " volume day macd boll_ub boll_lb rsi_30 cci_30 dx_30 \n", - "0 493729600.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \\\n", - "1 5277400.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "2 6894300.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "3 6186700.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "4 7325600.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "5 7906000.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "6 59853700.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "7 10173800.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "8 13700400.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "9 9135000.0 0.0 0.0 6.526808 6.495 100.0 66.666667 100.0 \n", - "\n", - " close_30_sma close_60_sma vix turbulence \n", - "0 6.505281 6.505281 20.040001 0.0 \n", - "1 42.888958 42.888958 20.040001 0.0 \n", - "2 33.551674 33.551674 20.040001 0.0 \n", - "3 43.777550 43.777550 20.040001 0.0 \n", - "4 41.156906 41.156906 20.040001 0.0 \n", - "5 18.705000 18.705000 20.040001 0.0 \n", - "6 17.264450 17.264450 20.040001 0.0 \n", - "7 46.851871 46.851871 20.040001 0.0 \n", - "8 27.933922 27.933922 20.040001 0.0 \n", - "9 139.862900 139.862900 20.040001 0.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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dateticopenhighlowclosevolumedaymacdboll_ubboll_lbrsi_30cci_30dx_30close_30_smaclose_60_smavixturbulence
02010-01-04AAPL7.6225007.6607147.5850006.505281493729600.00.00.06.5268086.495100.066.666667100.06.5052816.50528120.0400010.0
12010-01-04AMGN56.63000157.86999956.56000142.8889585277400.00.00.06.5268086.495100.066.666667100.042.88895842.88895820.0400010.0
22010-01-04AXP40.81000141.09999840.38999933.5516746894300.00.00.06.5268086.495100.066.666667100.033.55167433.55167420.0400010.0
32010-01-04BA55.72000156.38999954.79999943.7775506186700.00.00.06.5268086.495100.066.666667100.043.77755043.77755020.0400010.0
42010-01-04CAT57.65000259.18999957.50999841.1569067325600.00.00.06.5268086.495100.066.666667100.041.15690641.15690620.0400010.0
52010-01-04CRM18.65250018.88250018.54750118.7050007906000.00.00.06.5268086.495100.066.666667100.018.70500018.70500020.0400010.0
62010-01-04CSCO24.11000124.84000024.01000017.26445059853700.00.00.06.5268086.495100.066.666667100.017.26445017.26445020.0400010.0
72010-01-04CVX78.19999779.19999778.16000446.85187110173800.00.00.06.5268086.495100.066.666667100.046.85187146.85187120.0400010.0
82010-01-04DIS32.50000032.75000031.87000127.93392213700400.00.00.06.5268086.495100.066.666667100.027.93392227.93392220.0400010.0
92010-01-04GS170.050003174.250000169.509995139.8629009135000.00.00.06.5268086.495100.066.666667100.0139.862900139.86290020.0400010.0
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 95 - } - ], - "source": [ - "processed_full.sort_values(['date','tic'],ignore_index=True).head(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": { - "id": "5vdORQ384Qx-" - }, - "outputs": [], - "source": [ - "mvo_df = processed_full.sort_values(['date','tic'],ignore_index=True)[['date','tic','close']]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-QsYaY0Dh1iw" - }, - "source": [ - "\n", - "# Part 5. Build A Market Environment in OpenAI Gym-style\n", - "The training process involves observing stock price change, taking an action and reward's calculation. By interacting with the market environment, the agent will eventually derive a trading strategy that may maximize (expected) rewards.\n", - "\n", - "Our market environment, based on OpenAI Gym, simulates stock markets with historical market data." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5TOhcryx44bb" - }, - "source": [ - "## Data Split\n", - "We split the data into training set and testing set as follows:\n", - "\n", - "Training data period: 2009-01-01 to 2020-07-01\n", - "\n", - "Trading data period: 2020-07-01 to 2021-10-31\n" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "W0qaVGjLtgbI", - "outputId": "4f16484e-811e-46cd-efee-54c6b309f5a5" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "85753\n", - "10237\n" - ] - } - ], - "source": [ - "train = data_split(processed_full, TRAIN_START_DATE,TRAIN_END_DATE)\n", - "trade = data_split(processed_full, TRADE_START_DATE,TRADE_END_DATE)\n", - "train_length = len(train)\n", - "trade_length = len(trade)\n", - "print(train_length)\n", - "print(trade_length)" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 0 - }, - "id": "p52zNCOhTtLR", - "outputId": "d708401b-129f-495b-e691-7ab8666d6847" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " date tic open high low close \n", - "2956 2021-09-30 UNH 401.489990 403.489990 390.459991 383.180176 \\\n", - "2956 2021-09-30 V 227.580002 228.789993 222.630005 220.257767 \n", - "2956 2021-09-30 VZ 54.500000 54.509998 54.000000 49.011551 \n", - "2956 2021-09-30 WBA 48.790001 48.930000 46.919998 43.957283 \n", - "2956 2021-09-30 WMT 140.639999 141.729996 139.250000 136.114777 \n", - "\n", - " volume day macd boll_ub boll_lb rsi_30 \n", - "2956 3779900.0 3.0 -4.349256 419.212270 386.863774 40.895395 \\\n", - "2956 7128500.0 3.0 -1.538728 228.639270 216.529608 44.078996 \n", - "2956 18736600.0 3.0 -0.233667 50.131163 48.744038 41.824917 \n", - "2956 6449400.0 3.0 -0.253540 48.531810 43.597246 44.613711 \n", - "2956 7485900.0 3.0 -1.554834 146.155111 135.633136 40.165878 \n", - "\n", - " cci_30 dx_30 close_30_sma close_60_sma vix turbulence \n", - "2956 -222.938238 41.980385 405.947466 405.438423 23.139999 24.872328 \n", - "2956 -54.614579 19.569853 224.777295 231.479431 23.139999 24.872328 \n", - "2956 -102.798842 21.682953 49.605026 50.130592 23.139999 24.872328 \n", - "2956 -107.390223 0.941150 45.886550 44.857786 23.139999 24.872328 \n", - "2956 -151.542656 45.466733 142.345313 141.246727 23.139999 24.872328 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dateticopenhighlowclosevolumedaymacdboll_ubboll_lbrsi_30cci_30dx_30close_30_smaclose_60_smavixturbulence
29562021-09-30UNH401.489990403.489990390.459991383.1801763779900.03.0-4.349256419.212270386.86377440.895395-222.93823841.980385405.947466405.43842323.13999924.872328
29562021-09-30V227.580002228.789993222.630005220.2577677128500.03.0-1.538728228.639270216.52960844.078996-54.61457919.569853224.777295231.47943123.13999924.872328
29562021-09-30VZ54.50000054.50999854.00000049.01155118736600.03.0-0.23366750.13116348.74403841.824917-102.79884221.68295349.60502650.13059223.13999924.872328
29562021-09-30WBA48.79000148.93000046.91999843.9572836449400.03.0-0.25354048.53181043.59724644.613711-107.3902230.94115045.88655044.85778623.13999924.872328
29562021-09-30WMT140.639999141.729996139.250000136.1147777485900.03.0-1.554834146.155111135.63313640.165878-151.54265645.466733142.345313141.24672723.13999924.872328
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 98 - } - ], - "source": [ - "train.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 0 - }, - "id": "k9zU9YaTTvFq", - "outputId": "9080799c-a150-4414-c2de-a68c5e7c3a85" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " date tic open high low close \n", - "0 2021-10-01 AAPL 141.899994 142.919998 139.110001 141.404266 \\\n", - "0 2021-10-01 AMGN 213.589996 214.610001 210.800003 203.845871 \n", - "0 2021-10-01 AXP 168.500000 175.119995 168.479996 170.065353 \n", - "0 2021-10-01 BA 222.850006 226.720001 220.600006 226.000000 \n", - "0 2021-10-01 CAT 192.899994 195.869995 191.240005 187.928040 \n", - "\n", - " volume day macd boll_ub boll_lb rsi_30 cci_30 \n", - "0 94639600.0 4.0 -1.703488 155.382846 137.132193 46.927735 -142.190202 \\\n", - "0 2629400.0 4.0 -3.097330 212.767980 199.379595 40.408533 -96.757039 \n", - "0 3956000.0 4.0 2.273329 174.218856 149.232889 56.265093 117.538402 \n", - "0 9113600.0 4.0 0.730320 226.909442 205.727561 51.614047 116.649440 \n", - "0 3695500.0 4.0 -3.640324 205.735919 181.432783 41.999435 -112.087765 \n", - "\n", - " dx_30 close_30_sma close_60_sma vix turbulence \n", - "0 41.749873 147.171798 146.269415 21.1 120.122978 \n", - "0 36.189244 208.480832 217.103342 21.1 120.122978 \n", - "0 15.667511 161.215661 163.458888 21.1 120.122978 \n", - "0 2.027170 217.175334 221.968500 21.1 120.122978 \n", - "0 36.203176 196.993869 200.522109 21.1 120.122978 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dateticopenhighlowclosevolumedaymacdboll_ubboll_lbrsi_30cci_30dx_30close_30_smaclose_60_smavixturbulence
02021-10-01AAPL141.899994142.919998139.110001141.40426694639600.04.0-1.703488155.382846137.13219346.927735-142.19020241.749873147.171798146.26941521.1120.122978
02021-10-01AMGN213.589996214.610001210.800003203.8458712629400.04.0-3.097330212.767980199.37959540.408533-96.75703936.189244208.480832217.10334221.1120.122978
02021-10-01AXP168.500000175.119995168.479996170.0653533956000.04.02.273329174.218856149.23288956.265093117.53840215.667511161.215661163.45888821.1120.122978
02021-10-01BA222.850006226.720001220.600006226.0000009113600.04.00.730320226.909442205.72756151.614047116.6494402.027170217.175334221.96850021.1120.122978
02021-10-01CAT192.899994195.869995191.240005187.9280403695500.04.0-3.640324205.735919181.43278341.999435-112.08776536.203176196.993869200.52210921.1120.122978
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 99 - } - ], - "source": [ - "trade.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "zYN573SOHhxG", - "outputId": "f5dcfc60-af90-4aa0-8849-11848b3ef619" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['macd',\n", - " 'boll_ub',\n", - " 'boll_lb',\n", - " 'rsi_30',\n", - " 'cci_30',\n", - " 'dx_30',\n", - " 'close_30_sma',\n", - " 'close_60_sma']" - ] - }, - "metadata": {}, - "execution_count": 100 - } - ], - "source": [ - "INDICATORS" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Q2zqII8rMIqn", - "outputId": "b6f16ea3-8f52-44c7-ceb1-f58dabe3d1be" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Stock Dimension: 29, State Space: 291\n" - ] - } - ], - "source": [ - "stock_dimension = len(train.tic.unique())\n", - "state_space = 1 + 2*stock_dimension + len(INDICATORS)*stock_dimension\n", - "print(f\"Stock Dimension: {stock_dimension}, State Space: {state_space}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 102, - "metadata": { - "id": "AWyp84Ltto19" - }, - "outputs": [], - "source": [ - "buy_cost_list = sell_cost_list = [0.001] * stock_dimension\n", - "num_stock_shares = [0] * stock_dimension\n", - "\n", - "env_kwargs = {\n", - " \"hmax\": 100,\n", - " \"initial_amount\": 1000000,\n", - " \"num_stock_shares\": num_stock_shares,\n", - " \"buy_cost_pct\": buy_cost_list,\n", - " \"sell_cost_pct\": sell_cost_list,\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", - "}\n", - "\n", - "\n", - "e_train_gym = StockTradingEnv(df = train, **env_kwargs)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "64EoqOrQjiVf" - }, - "source": [ - "## Environment for Training\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "xwSvvPjutpqS", - "outputId": "e8fc8f68-b8c9-47a8-e7d2-a6ed0715d216" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\n" - ] - } - ], - "source": [ - "env_train, _ = e_train_gym.get_sb_env()\n", - "print(type(env_train))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HMNR5nHjh1iz" - }, - "source": [ - "\n", - "# Part 6: Train DRL Agents\n", - "* The DRL algorithms are from **Stable Baselines 3**. Users are also encouraged to try **ElegantRL** and **Ray RLlib**.\n", - "* FinRL includes fine-tuned standard DRL algorithms, such as DQN, DDPG, Multi-Agent DDPG, PPO, SAC, A2C and TD3. We also allow users to\n", - "design their own DRL algorithms by adapting these DRL algorithms." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "id": "364PsqckttcQ" - }, - "outputs": [], - "source": [ - "agent = DRLAgent(env = env_train)\n", - "\n", - "if_using_a2c = True\n", - "if_using_ddpg = True\n", - "if_using_ppo = True\n", - "if_using_td3 = True\n", - "if_using_sac = True\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "YDmqOyF9h1iz" - }, - "source": [ - "### Agent Training: 5 algorithms (A2C, DDPG, PPO, TD3, SAC)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uijiWgkuh1jB" - }, - "source": [ - "### Agent 1: A2C\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "GUCnkn-HIbmj", - "outputId": "7112ce2a-0f62-4a9c-c8be-4443779b4ba0" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "{'n_steps': 5, 'ent_coef': 0.01, 'learning_rate': 0.0007}\n", - "Using cpu device\n", - "Logging to results/a2c\n" - ] - } - ], - "source": [ - "agent = DRLAgent(env = env_train)\n", - "model_a2c = agent.get_model(\"a2c\")\n", - "\n", - "if if_using_a2c:\n", - " # set up logger\n", - " tmp_path = RESULTS_DIR + '/a2c'\n", - " new_logger_a2c = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", - " # Set new logger\n", - " model_a2c.set_logger(new_logger_a2c)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "0GVpkWGqH4-D", - "outputId": "d00d9ef6-7489-4126-f53f-376612f48466" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "----------------------------------------\n", - "| time/ | |\n", - "| fps | 86 |\n", - "| iterations | 100 |\n", - "| time_elapsed | 5 |\n", - "| total_timesteps | 500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.4 |\n", - "| explained_variance | -0.753 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 99 |\n", - "| policy_loss | -34.1 |\n", - "| reward | -0.101721555 |\n", - "| std | 1.01 |\n", - "| value_loss | 3.66 |\n", - "----------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 74 |\n", - "| iterations | 200 |\n", - "| time_elapsed | 13 |\n", - "| total_timesteps | 1000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | -0.0231 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 199 |\n", - "| policy_loss | -71 |\n", - "| reward | 0.90710044 |\n", - "| std | 1.01 |\n", - "| value_loss | 6.44 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 65 |\n", - "| iterations | 300 |\n", - "| time_elapsed | 22 |\n", - "| total_timesteps | 1500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | 5.96e-08 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 299 |\n", - "| policy_loss | 16.1 |\n", - "| reward | -2.4830217 |\n", - "| std | 1.01 |\n", - "| value_loss | 3.89 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 70 |\n", - "| iterations | 400 |\n", - "| time_elapsed | 28 |\n", - "| total_timesteps | 2000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 399 |\n", - "| policy_loss | -38.5 |\n", - "| reward | -2.3722556 |\n", - "| std | 1.01 |\n", - "| value_loss | 6.41 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 70 |\n", - "| iterations | 500 |\n", - "| time_elapsed | 35 |\n", - "| total_timesteps | 2500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | -0.00813 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 499 |\n", - "| policy_loss | -74.9 |\n", - "| reward | -1.3848053 |\n", - "| std | 1.01 |\n", - "| value_loss | 5.89 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 600 |\n", - "| time_elapsed | 45 |\n", - "| total_timesteps | 3000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.4 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 599 |\n", - "| policy_loss | 9.33 |\n", - "| reward | 0.40211454 |\n", - "| std | 1.01 |\n", - "| value_loss | 0.104 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 700 |\n", - "| time_elapsed | 50 |\n", - "| total_timesteps | 3500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 699 |\n", - "| policy_loss | 24.8 |\n", - "| reward | 0.5960596 |\n", - "| std | 1.01 |\n", - "| value_loss | 0.787 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 69 |\n", - "| iterations | 800 |\n", - "| time_elapsed | 57 |\n", - "| total_timesteps | 4000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 799 |\n", - "| policy_loss | -113 |\n", - "| reward | 0.29731598 |\n", - "| std | 1.01 |\n", - "| value_loss | 7.73 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 900 |\n", - "| time_elapsed | 67 |\n", - "| total_timesteps | 4500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 899 |\n", - "| policy_loss | 65.6 |\n", - "| reward | 1.8696517 |\n", - "| std | 1.01 |\n", - "| value_loss | 3.23 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 1000 |\n", - "| time_elapsed | 73 |\n", - "| total_timesteps | 5000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 999 |\n", - "| policy_loss | -343 |\n", - "| reward | 2.8599794 |\n", - "| std | 1.01 |\n", - "| value_loss | 161 |\n", - "-------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 1100 |\n", - "| time_elapsed | 79 |\n", - "| total_timesteps | 5500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1099 |\n", - "| policy_loss | 149 |\n", - "| reward | -0.89934605 |\n", - "| std | 1.01 |\n", - "| value_loss | 39.1 |\n", - "---------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 1200 |\n", - "| time_elapsed | 89 |\n", - "| total_timesteps | 6000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | -0.109 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1199 |\n", - "| policy_loss | -80.9 |\n", - "| reward | -1.2479767 |\n", - "| std | 1.01 |\n", - "| value_loss | 4.9 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 1300 |\n", - "| time_elapsed | 96 |\n", - "| total_timesteps | 6500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.6 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1299 |\n", - "| policy_loss | -77.1 |\n", - "| reward | 0.3952496 |\n", - "| std | 1.02 |\n", - "| value_loss | 4.22 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 1400 |\n", - "| time_elapsed | 102 |\n", - "| total_timesteps | 7000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.6 |\n", - "| explained_variance | -0.0301 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1399 |\n", - "| policy_loss | 127 |\n", - "| reward | 0.37600544 |\n", - "| std | 1.02 |\n", - "| value_loss | 11.7 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 1500 |\n", - "| time_elapsed | 112 |\n", - "| total_timesteps | 7500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.6 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1499 |\n", - "| policy_loss | -9.18 |\n", - "| reward | 1.1150984 |\n", - "| std | 1.02 |\n", - "| value_loss | 0.346 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 1600 |\n", - "| time_elapsed | 118 |\n", - "| total_timesteps | 8000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.6 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1599 |\n", - "| policy_loss | -6.38 |\n", - "| reward | -0.5224333 |\n", - "| std | 1.02 |\n", - "| value_loss | 4.36 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 1700 |\n", - "| time_elapsed | 125 |\n", - "| total_timesteps | 8500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.7 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1699 |\n", - "| policy_loss | 388 |\n", - "| reward | 9.236983 |\n", - "| std | 1.02 |\n", - "| value_loss | 140 |\n", - "-------------------------------------\n", - "------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 1800 |\n", - "| time_elapsed | 135 |\n", - "| total_timesteps | 9000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.7 |\n", - "| explained_variance | 0.0156 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1799 |\n", - "| policy_loss | -140 |\n", - "| reward | 0.933411 |\n", - "| std | 1.02 |\n", - "| value_loss | 13.9 |\n", - "------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 1900 |\n", - "| time_elapsed | 141 |\n", - "| total_timesteps | 9500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.7 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1899 |\n", - "| policy_loss | -81.9 |\n", - "| reward | 1.4432659 |\n", - "| std | 1.02 |\n", - "| value_loss | 4.5 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 2000 |\n", - "| time_elapsed | 148 |\n", - "| total_timesteps | 10000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 1999 |\n", - "| policy_loss | -5.75 |\n", - "| reward | 0.3948126 |\n", - "| std | 1.02 |\n", - "| value_loss | 0.328 |\n", - "-------------------------------------\n", - "------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 2100 |\n", - "| time_elapsed | 158 |\n", - "| total_timesteps | 10500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.7 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2099 |\n", - "| policy_loss | -117 |\n", - "| reward | 3.777475 |\n", - "| std | 1.02 |\n", - "| value_loss | 16.7 |\n", - "------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 2200 |\n", - "| time_elapsed | 164 |\n", - "| total_timesteps | 11000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2199 |\n", - "| policy_loss | 54.7 |\n", - "| reward | -2.081327 |\n", - "| std | 1.02 |\n", - "| value_loss | 5.43 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 2300 |\n", - "| time_elapsed | 171 |\n", - "| total_timesteps | 11500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.7 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2299 |\n", - "| policy_loss | 491 |\n", - "| reward | 0.36665618 |\n", - "| std | 1.02 |\n", - "| value_loss | 178 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 2400 |\n", - "| time_elapsed | 180 |\n", - "| total_timesteps | 12000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 0.104 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2399 |\n", - "| policy_loss | 38.8 |\n", - "| reward | -0.6101983 |\n", - "| std | 1.02 |\n", - "| value_loss | 1.19 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 2500 |\n", - "| time_elapsed | 186 |\n", - "| total_timesteps | 12500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.7 |\n", - "| explained_variance | -0.32 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2499 |\n", - "| policy_loss | -84.1 |\n", - "| reward | 1.4439964 |\n", - "| std | 1.02 |\n", - "| value_loss | 5.86 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 2600 |\n", - "| time_elapsed | 193 |\n", - "| total_timesteps | 13000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2599 |\n", - "| policy_loss | 85.7 |\n", - "| reward | -1.2166104 |\n", - "| std | 1.02 |\n", - "| value_loss | 6.91 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 2700 |\n", - "| time_elapsed | 203 |\n", - "| total_timesteps | 13500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2699 |\n", - "| policy_loss | 58.4 |\n", - "| reward | -1.4893322 |\n", - "| std | 1.02 |\n", - "| value_loss | 3.64 |\n", - "--------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 2800 |\n", - "| time_elapsed | 209 |\n", - "| total_timesteps | 14000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2799 |\n", - "| policy_loss | -85.7 |\n", - "| reward | -0.53823775 |\n", - "| std | 1.02 |\n", - "| value_loss | 6.8 |\n", - "---------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 2900 |\n", - "| time_elapsed | 215 |\n", - "| total_timesteps | 14500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2899 |\n", - "| policy_loss | 246 |\n", - "| reward | -1.935958 |\n", - "| std | 1.02 |\n", - "| value_loss | 82.6 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 3000 |\n", - "| time_elapsed | 225 |\n", - "| total_timesteps | 15000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 1.79e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 2999 |\n", - "| policy_loss | -1.51 |\n", - "| reward | -0.4458434 |\n", - "| std | 1.02 |\n", - "| value_loss | 0.0488 |\n", - "--------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 3100 |\n", - "| time_elapsed | 231 |\n", - "| total_timesteps | 15500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3099 |\n", - "| policy_loss | -66.7 |\n", - "| reward | -0.29501697 |\n", - "| std | 1.02 |\n", - "| value_loss | 5.04 |\n", - "---------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 3200 |\n", - "| time_elapsed | 237 |\n", - "| total_timesteps | 16000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3199 |\n", - "| policy_loss | 519 |\n", - "| reward | 3.2372885 |\n", - "| std | 1.02 |\n", - "| value_loss | 169 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 3300 |\n", - "| time_elapsed | 247 |\n", - "| total_timesteps | 16500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3299 |\n", - "| policy_loss | -35.2 |\n", - "| reward | -1.0215844 |\n", - "| std | 1.02 |\n", - "| value_loss | 1.25 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 3400 |\n", - "| time_elapsed | 254 |\n", - "| total_timesteps | 17000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3399 |\n", - "| policy_loss | -261 |\n", - "| reward | -1.4371744 |\n", - "| std | 1.03 |\n", - "| value_loss | 126 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 3500 |\n", - "| time_elapsed | 259 |\n", - "| total_timesteps | 17500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3499 |\n", - "| policy_loss | -772 |\n", - "| reward | -4.4645677 |\n", - "| std | 1.03 |\n", - "| value_loss | 364 |\n", - "--------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 3600 |\n", - "| time_elapsed | 269 |\n", - "| total_timesteps | 18000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | -0.0184 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3599 |\n", - "| policy_loss | 29.8 |\n", - "| reward | -0.22187884 |\n", - "| std | 1.03 |\n", - "| value_loss | 0.795 |\n", - "---------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 3700 |\n", - "| time_elapsed | 276 |\n", - "| total_timesteps | 18500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3699 |\n", - "| policy_loss | 21.5 |\n", - "| reward | 0.2606225 |\n", - "| std | 1.03 |\n", - "| value_loss | 2.37 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 3800 |\n", - "| time_elapsed | 281 |\n", - "| total_timesteps | 19000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3799 |\n", - "| policy_loss | 61.2 |\n", - "| reward | 0.2569313 |\n", - "| std | 1.03 |\n", - "| value_loss | 8.23 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 3900 |\n", - "| time_elapsed | 291 |\n", - "| total_timesteps | 19500 |\n", - "| train/ | |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3899 |\n", - "| policy_loss | -82.6 |\n", - "| reward | 0.6337838 |\n", - "| std | 1.03 |\n", - "| value_loss | 5.46 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 4000 |\n", - "| time_elapsed | 298 |\n", - "| total_timesteps | 20000 |\n", - "| train/ | |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | 0.00329 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 3999 |\n", - "| policy_loss | -282 |\n", - "| reward | -14.585105 |\n", - "| std | 1.03 |\n", - "| value_loss | 57.7 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 4100 |\n", - "| time_elapsed | 304 |\n", - "| total_timesteps | 20500 |\n", - "| train/ | |\n", - "| entropy_loss | -42 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4099 |\n", - "| policy_loss | -300 |\n", - "| reward | 0.90241796 |\n", - "| std | 1.03 |\n", - "| value_loss | 50.1 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 4200 |\n", - "| time_elapsed | 314 |\n", - "| total_timesteps | 21000 |\n", - "| train/ | |\n", - "| entropy_loss | -42 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4199 |\n", - "| policy_loss | 37.2 |\n", - "| reward | -1.0533274 |\n", - "| std | 1.03 |\n", - "| value_loss | 1.52 |\n", - "--------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 4300 |\n", - "| time_elapsed | 321 |\n", - "| total_timesteps | 21500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 0.153 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4299 |\n", - "| policy_loss | 81.8 |\n", - "| reward | -0.45561686 |\n", - "| std | 1.03 |\n", - "| value_loss | 4.86 |\n", - "---------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 4400 |\n", - "| time_elapsed | 327 |\n", - "| total_timesteps | 22000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | -0.0523 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4399 |\n", - "| policy_loss | -14.6 |\n", - "| reward | -2.289123 |\n", - "| std | 1.03 |\n", - "| value_loss | 1.85 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 4500 |\n", - "| time_elapsed | 336 |\n", - "| total_timesteps | 22500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4499 |\n", - "| policy_loss | 139 |\n", - "| reward | 5.3293443 |\n", - "| std | 1.03 |\n", - "| value_loss | 15.6 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 4600 |\n", - "| time_elapsed | 343 |\n", - "| total_timesteps | 23000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4599 |\n", - "| policy_loss | 219 |\n", - "| reward | 1.2114522 |\n", - "| std | 1.04 |\n", - "| value_loss | 46.6 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 4700 |\n", - "| time_elapsed | 349 |\n", - "| total_timesteps | 23500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4699 |\n", - "| policy_loss | 43.9 |\n", - "| reward | 2.9557362 |\n", - "| std | 1.03 |\n", - "| value_loss | 2.94 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 4800 |\n", - "| time_elapsed | 358 |\n", - "| total_timesteps | 24000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4799 |\n", - "| policy_loss | -18.3 |\n", - "| reward | -0.8173089 |\n", - "| std | 1.03 |\n", - "| value_loss | 1.11 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 4900 |\n", - "| time_elapsed | 366 |\n", - "| total_timesteps | 24500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 4.77e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4899 |\n", - "| policy_loss | 140 |\n", - "| reward | 0.12697145 |\n", - "| std | 1.03 |\n", - "| value_loss | 13.9 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 5000 |\n", - "| time_elapsed | 372 |\n", - "| total_timesteps | 25000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 4999 |\n", - "| policy_loss | -184 |\n", - "| reward | 1.2172059 |\n", - "| std | 1.03 |\n", - "| value_loss | 22.1 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 5100 |\n", - "| time_elapsed | 380 |\n", - "| total_timesteps | 25500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5099 |\n", - "| policy_loss | 311 |\n", - "| reward | 1.1731412 |\n", - "| std | 1.03 |\n", - "| value_loss | 64.2 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 5200 |\n", - "| time_elapsed | 388 |\n", - "| total_timesteps | 26000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | -0.00065 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5199 |\n", - "| policy_loss | 109 |\n", - "| reward | 1.1864622 |\n", - "| std | 1.03 |\n", - "| value_loss | 9.56 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 5300 |\n", - "| time_elapsed | 394 |\n", - "| total_timesteps | 26500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5299 |\n", - "| policy_loss | 306 |\n", - "| reward | -5.989423 |\n", - "| std | 1.04 |\n", - "| value_loss | 59.3 |\n", - "-------------------------------------\n", - "day: 2956, episode: 10\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 6683165.62\n", - "total_reward: 5683165.62\n", - "total_cost: 23114.39\n", - "total_trades: 56020\n", - "Sharpe: 0.863\n", - "=================================\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 5400 |\n", - "| time_elapsed | 403 |\n", - "| total_timesteps | 27000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.2 |\n", - "| explained_variance | 1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5399 |\n", - "| policy_loss | -88.2 |\n", - "| reward | -0.79377145 |\n", - "| std | 1.04 |\n", - "| value_loss | 4.92 |\n", - "---------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 5500 |\n", - "| time_elapsed | 411 |\n", - "| total_timesteps | 27500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.2 |\n", - "| explained_variance | -0.49 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5499 |\n", - "| policy_loss | 30 |\n", - "| reward | 0.04138078 |\n", - "| std | 1.04 |\n", - "| value_loss | 0.815 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 5600 |\n", - "| time_elapsed | 416 |\n", - "| total_timesteps | 28000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.2 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5599 |\n", - "| policy_loss | -84.1 |\n", - "| reward | 0.9021898 |\n", - "| std | 1.04 |\n", - "| value_loss | 9.85 |\n", - "-------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 5700 |\n", - "| time_elapsed | 424 |\n", - "| total_timesteps | 28500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.3 |\n", - "| explained_variance | 5.96e-08 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5699 |\n", - "| policy_loss | -34.2 |\n", - "| reward | -0.18503402 |\n", - "| std | 1.04 |\n", - "| value_loss | 2.41 |\n", - "---------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 5800 |\n", - "| time_elapsed | 433 |\n", - "| total_timesteps | 29000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.3 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5799 |\n", - "| policy_loss | 111 |\n", - "| reward | 0.7673725 |\n", - "| std | 1.04 |\n", - "| value_loss | 15 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 5900 |\n", - "| time_elapsed | 438 |\n", - "| total_timesteps | 29500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.4 |\n", - "| explained_variance | -0.000187 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5899 |\n", - "| policy_loss | -75.2 |\n", - "| reward | -1.0595187 |\n", - "| std | 1.05 |\n", - "| value_loss | 8.22 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 6000 |\n", - "| time_elapsed | 446 |\n", - "| total_timesteps | 30000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.4 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 5999 |\n", - "| policy_loss | -148 |\n", - "| reward | 0.9425562 |\n", - "| std | 1.05 |\n", - "| value_loss | 15.3 |\n", - "-------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6100 |\n", - "| time_elapsed | 455 |\n", - "| total_timesteps | 30500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.4 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6099 |\n", - "| policy_loss | 54.9 |\n", - "| reward | -0.46677366 |\n", - "| std | 1.04 |\n", - "| value_loss | 5.95 |\n", - "---------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 6200 |\n", - "| time_elapsed | 462 |\n", - "| total_timesteps | 31000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.4 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6199 |\n", - "| policy_loss | -212 |\n", - "| reward | -3.7030914 |\n", - "| std | 1.05 |\n", - "| value_loss | 57.7 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6300 |\n", - "| time_elapsed | 472 |\n", - "| total_timesteps | 31500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.4 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6299 |\n", - "| policy_loss | 83 |\n", - "| reward | 0.8240016 |\n", - "| std | 1.05 |\n", - "| value_loss | 6.22 |\n", - "-------------------------------------\n", - "------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6400 |\n", - "| time_elapsed | 480 |\n", - "| total_timesteps | 32000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6399 |\n", - "| policy_loss | 228 |\n", - "| reward | 8.043127 |\n", - "| std | 1.05 |\n", - "| value_loss | 44.7 |\n", - "------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6500 |\n", - "| time_elapsed | 486 |\n", - "| total_timesteps | 32500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 5.96e-08 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6499 |\n", - "| policy_loss | -34.8 |\n", - "| reward | 0.5315314 |\n", - "| std | 1.05 |\n", - "| value_loss | 45.5 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6600 |\n", - "| time_elapsed | 494 |\n", - "| total_timesteps | 33000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6599 |\n", - "| policy_loss | -165 |\n", - "| reward | -2.345529 |\n", - "| std | 1.05 |\n", - "| value_loss | 16.7 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6700 |\n", - "| time_elapsed | 503 |\n", - "| total_timesteps | 33500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6699 |\n", - "| policy_loss | 15.2 |\n", - "| reward | 1.4328392 |\n", - "| std | 1.05 |\n", - "| value_loss | 1.09 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6800 |\n", - "| time_elapsed | 509 |\n", - "| total_timesteps | 34000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 0.0389 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6799 |\n", - "| policy_loss | 17.9 |\n", - "| reward | -3.0146182 |\n", - "| std | 1.05 |\n", - "| value_loss | 6.76 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 6900 |\n", - "| time_elapsed | 518 |\n", - "| total_timesteps | 34500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6899 |\n", - "| policy_loss | 78.2 |\n", - "| reward | 1.1767033 |\n", - "| std | 1.05 |\n", - "| value_loss | 6.61 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7000 |\n", - "| time_elapsed | 526 |\n", - "| total_timesteps | 35000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | -0.000428 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 6999 |\n", - "| policy_loss | 150 |\n", - "| reward | 1.8981657 |\n", - "| std | 1.05 |\n", - "| value_loss | 13.5 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7100 |\n", - "| time_elapsed | 531 |\n", - "| total_timesteps | 35500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7099 |\n", - "| policy_loss | 5.28 |\n", - "| reward | 0.79177964 |\n", - "| std | 1.05 |\n", - "| value_loss | 0.0603 |\n", - "--------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7200 |\n", - "| time_elapsed | 540 |\n", - "| total_timesteps | 36000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | -1.73e-05 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7199 |\n", - "| policy_loss | 40.5 |\n", - "| reward | -0.41675776 |\n", - "| std | 1.05 |\n", - "| value_loss | 2.05 |\n", - "---------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7300 |\n", - "| time_elapsed | 548 |\n", - "| total_timesteps | 36500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.6 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7299 |\n", - "| policy_loss | 109 |\n", - "| reward | -0.614702 |\n", - "| std | 1.05 |\n", - "| value_loss | 8.67 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7400 |\n", - "| time_elapsed | 554 |\n", - "| total_timesteps | 37000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.6 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7399 |\n", - "| policy_loss | -406 |\n", - "| reward | 2.9344776 |\n", - "| std | 1.05 |\n", - "| value_loss | 94.3 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7500 |\n", - "| time_elapsed | 562 |\n", - "| total_timesteps | 37500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.6 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7499 |\n", - "| policy_loss | -46.1 |\n", - "| reward | 3.3778825 |\n", - "| std | 1.05 |\n", - "| value_loss | 3.56 |\n", - "-------------------------------------\n", - "------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7600 |\n", - "| time_elapsed | 571 |\n", - "| total_timesteps | 38000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.7 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7599 |\n", - "| policy_loss | 68.1 |\n", - "| reward | 8.8951 |\n", - "| std | 1.06 |\n", - "| value_loss | 6.43 |\n", - "------------------------------------\n", - "----------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7700 |\n", - "| time_elapsed | 576 |\n", - "| total_timesteps | 38500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.7 |\n", - "| explained_variance | 0.0107 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7699 |\n", - "| policy_loss | 19.1 |\n", - "| reward | -0.079490714 |\n", - "| std | 1.06 |\n", - "| value_loss | 0.259 |\n", - "----------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7800 |\n", - "| time_elapsed | 585 |\n", - "| total_timesteps | 39000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.7 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7799 |\n", - "| policy_loss | 38.6 |\n", - "| reward | -0.7558417 |\n", - "| std | 1.06 |\n", - "| value_loss | 1.37 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 7900 |\n", - "| time_elapsed | 593 |\n", - "| total_timesteps | 39500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.8 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7899 |\n", - "| policy_loss | -73.1 |\n", - "| reward | 0.98963994 |\n", - "| std | 1.06 |\n", - "| value_loss | 3.09 |\n", - "--------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8000 |\n", - "| time_elapsed | 599 |\n", - "| total_timesteps | 40000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.9 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 7999 |\n", - "| policy_loss | -9.09 |\n", - "| reward | -0.19837299 |\n", - "| std | 1.06 |\n", - "| value_loss | 0.497 |\n", - "---------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8100 |\n", - "| time_elapsed | 608 |\n", - "| total_timesteps | 40500 |\n", - "| train/ | |\n", - "| entropy_loss | -43 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8099 |\n", - "| policy_loss | -54 |\n", - "| reward | 4.5389633 |\n", - "| std | 1.07 |\n", - "| value_loss | 3.58 |\n", - "-------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8200 |\n", - "| time_elapsed | 616 |\n", - "| total_timesteps | 41000 |\n", - "| train/ | |\n", - "| entropy_loss | -43 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8199 |\n", - "| policy_loss | -1.03e+03 |\n", - "| reward | -7.644335 |\n", - "| std | 1.07 |\n", - "| value_loss | 644 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8300 |\n", - "| time_elapsed | 622 |\n", - "| total_timesteps | 41500 |\n", - "| train/ | |\n", - "| entropy_loss | -43 |\n", - "| explained_variance | -0.0583 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8299 |\n", - "| policy_loss | -117 |\n", - "| reward | -1.0602136 |\n", - "| std | 1.07 |\n", - "| value_loss | 13.6 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8400 |\n", - "| time_elapsed | 630 |\n", - "| total_timesteps | 42000 |\n", - "| train/ | |\n", - "| entropy_loss | -43 |\n", - "| explained_variance | 0.000235 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8399 |\n", - "| policy_loss | -94.3 |\n", - "| reward | 0.6174811 |\n", - "| std | 1.07 |\n", - "| value_loss | 7.66 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8500 |\n", - "| time_elapsed | 638 |\n", - "| total_timesteps | 42500 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8499 |\n", - "| policy_loss | -36.7 |\n", - "| reward | -1.7684387 |\n", - "| std | 1.07 |\n", - "| value_loss | 3.43 |\n", - "--------------------------------------\n", - "------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8600 |\n", - "| time_elapsed | 644 |\n", - "| total_timesteps | 43000 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8599 |\n", - "| policy_loss | 5.35 |\n", - "| reward | 3.532196 |\n", - "| std | 1.07 |\n", - "| value_loss | 4.08 |\n", - "------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8700 |\n", - "| time_elapsed | 652 |\n", - "| total_timesteps | 43500 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8699 |\n", - "| policy_loss | -87.6 |\n", - "| reward | 2.3305223 |\n", - "| std | 1.07 |\n", - "| value_loss | 4.95 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8800 |\n", - "| time_elapsed | 661 |\n", - "| total_timesteps | 44000 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8799 |\n", - "| policy_loss | 932 |\n", - "| reward | -1.1599989 |\n", - "| std | 1.07 |\n", - "| value_loss | 523 |\n", - "--------------------------------------\n", - "------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 8900 |\n", - "| time_elapsed | 667 |\n", - "| total_timesteps | 44500 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8899 |\n", - "| policy_loss | 95.4 |\n", - "| reward | 1.23851 |\n", - "| std | 1.07 |\n", - "| value_loss | 5.59 |\n", - "------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9000 |\n", - "| time_elapsed | 674 |\n", - "| total_timesteps | 45000 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 1.79e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 8999 |\n", - "| policy_loss | 78 |\n", - "| reward | 0.81774557 |\n", - "| std | 1.07 |\n", - "| value_loss | 3.88 |\n", - "--------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9100 |\n", - "| time_elapsed | 683 |\n", - "| total_timesteps | 45500 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9099 |\n", - "| policy_loss | -16 |\n", - "| reward | -1.3974568 |\n", - "| std | 1.07 |\n", - "| value_loss | 0.808 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9200 |\n", - "| time_elapsed | 689 |\n", - "| total_timesteps | 46000 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9199 |\n", - "| policy_loss | 200 |\n", - "| reward | 0.9757047 |\n", - "| std | 1.07 |\n", - "| value_loss | 25.5 |\n", - "-------------------------------------\n", - "------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9300 |\n", - "| time_elapsed | 697 |\n", - "| total_timesteps | 46500 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9299 |\n", - "| policy_loss | 126 |\n", - "| reward | 6.874766 |\n", - "| std | 1.07 |\n", - "| value_loss | 11.4 |\n", - "------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9400 |\n", - "| time_elapsed | 706 |\n", - "| total_timesteps | 47000 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | -2.38e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9399 |\n", - "| policy_loss | 111 |\n", - "| reward | 4.1356363 |\n", - "| std | 1.07 |\n", - "| value_loss | 80.4 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9500 |\n", - "| time_elapsed | 712 |\n", - "| total_timesteps | 47500 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9499 |\n", - "| policy_loss | 41.3 |\n", - "| reward | 0.15961184 |\n", - "| std | 1.07 |\n", - "| value_loss | 1.22 |\n", - "--------------------------------------\n", - "----------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9600 |\n", - "| time_elapsed | 719 |\n", - "| total_timesteps | 48000 |\n", - "| train/ | |\n", - "| entropy_loss | -43.2 |\n", - "| explained_variance | 0.203 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9599 |\n", - "| policy_loss | -9.32 |\n", - "| reward | -0.113297194 |\n", - "| std | 1.07 |\n", - "| value_loss | 0.747 |\n", - "----------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9700 |\n", - "| time_elapsed | 728 |\n", - "| total_timesteps | 48500 |\n", - "| train/ | |\n", - "| entropy_loss | -43.1 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9699 |\n", - "| policy_loss | -11.3 |\n", - "| reward | -0.942293 |\n", - "| std | 1.07 |\n", - "| value_loss | 1.77 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9800 |\n", - "| time_elapsed | 734 |\n", - "| total_timesteps | 49000 |\n", - "| train/ | |\n", - "| entropy_loss | -43 |\n", - "| explained_variance | 0 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9799 |\n", - "| policy_loss | -251 |\n", - "| reward | -1.0976613 |\n", - "| std | 1.07 |\n", - "| value_loss | 32.3 |\n", - "--------------------------------------\n", - "-------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 9900 |\n", - "| time_elapsed | 742 |\n", - "| total_timesteps | 49500 |\n", - "| train/ | |\n", - "| entropy_loss | -42.9 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9899 |\n", - "| policy_loss | -193 |\n", - "| reward | 6.7274637 |\n", - "| std | 1.07 |\n", - "| value_loss | 27.1 |\n", - "-------------------------------------\n", - "--------------------------------------\n", - "| time/ | |\n", - "| fps | 66 |\n", - "| iterations | 10000 |\n", - "| time_elapsed | 751 |\n", - "| total_timesteps | 50000 |\n", - "| train/ | |\n", - "| entropy_loss | -42.9 |\n", - "| explained_variance | -1.19e-07 |\n", - "| learning_rate | 0.0007 |\n", - "| n_updates | 9999 |\n", - "| policy_loss | 335 |\n", - "| reward | -16.778671 |\n", - "| std | 1.06 |\n", - "| value_loss | 330 |\n", - "--------------------------------------\n" - ] - } - ], - "source": [ - "trained_a2c = agent.train_model(model=model_a2c, \n", - " tb_log_name='a2c',\n", - " total_timesteps=50000) if if_using_a2c else None" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MRiOtrywfAo1" - }, - "source": [ - "### Agent 2: DDPG" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "M2YadjfnLwgt", - "outputId": "8c8b5e98-763c-453c-a280-1b4f3ac13510" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "{'batch_size': 128, 'buffer_size': 50000, 'learning_rate': 0.001}\n", - "Using cpu device\n", - "Logging to results/ddpg\n" - ] - } - ], - "source": [ - "agent = DRLAgent(env = env_train)\n", - "model_ddpg = agent.get_model(\"ddpg\")\n", - "\n", - "if if_using_ddpg:\n", - " # set up logger\n", - " tmp_path = RESULTS_DIR + '/ddpg'\n", - " new_logger_ddpg = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", - " # Set new logger\n", - " model_ddpg.set_logger(new_logger_ddpg)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "tCDa78rqfO_a", - "outputId": "35589661-85de-42ca-b9f1-52cde7ded447" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "day: 2956, episode: 20\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 2896568.03\n", - "total_reward: 1896568.03\n", - "total_cost: 1065.27\n", - "total_trades: 47321\n", - "Sharpe: 0.607\n", - "=================================\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 4 |\n", - "| fps | 24 |\n", - "| time_elapsed | 482 |\n", - "| total_timesteps | 11828 |\n", - "| train/ | |\n", - "| actor_loss | 3.26 |\n", - "| critic_loss | 41.2 |\n", - "| learning_rate | 0.001 |\n", - "| n_updates | 8871 |\n", - "| reward | -4.6516004 |\n", - "-----------------------------------\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 8 |\n", - "| fps | 21 |\n", - "| time_elapsed | 1088 |\n", - "| total_timesteps | 23656 |\n", - "| train/ | |\n", - "| actor_loss | -2.37 |\n", - "| critic_loss | 2.02 |\n", - "| learning_rate | 0.001 |\n", - "| n_updates | 20699 |\n", - "| reward | -4.6516004 |\n", - "-----------------------------------\n", - "day: 2956, episode: 30\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 2898382.52\n", - "total_reward: 1898382.52\n", - "total_cost: 1065.67\n", - "total_trades: 50276\n", - "Sharpe: 0.598\n", - "=================================\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 12 |\n", - "| fps | 20 |\n", - "| time_elapsed | 1709 |\n", - "| total_timesteps | 35484 |\n", - "| train/ | |\n", - "| actor_loss | -3.95 |\n", - "| critic_loss | 1.36 |\n", - "| learning_rate | 0.001 |\n", - "| n_updates | 32527 |\n", - "| reward | -4.6516004 |\n", - "-----------------------------------\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 16 |\n", - "| fps | 20 |\n", - "| time_elapsed | 2344 |\n", - "| total_timesteps | 47312 |\n", - "| train/ | |\n", - "| actor_loss | -5.3 |\n", - "| critic_loss | 0.938 |\n", - "| learning_rate | 0.001 |\n", - "| n_updates | 44355 |\n", - "| reward | -4.6516004 |\n", - "-----------------------------------\n" - ] - } - ], - "source": [ - "trained_ddpg = agent.train_model(model=model_ddpg, \n", - " tb_log_name='ddpg',\n", - " total_timesteps=50000) if if_using_ddpg else None" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_gDkU-j-fCmZ" - }, - "source": [ - "### Agent 3: PPO" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "y5D5PFUhMzSV", - "outputId": "2abd06c0-deca-457b-819b-3059c3f17645" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "{'n_steps': 2048, 'ent_coef': 0.01, 'learning_rate': 0.00025, 'batch_size': 128}\n", - "Using cpu device\n", - "Logging to results/ppo\n" - ] - } - ], - "source": [ - "agent = DRLAgent(env = env_train)\n", - "PPO_PARAMS = {\n", - " \"n_steps\": 2048,\n", - " \"ent_coef\": 0.01,\n", - " \"learning_rate\": 0.00025,\n", - " \"batch_size\": 128,\n", - "}\n", - "model_ppo = agent.get_model(\"ppo\",model_kwargs = PPO_PARAMS)\n", - "\n", - "if if_using_ppo:\n", - " # set up logger\n", - " tmp_path = RESULTS_DIR + '/ppo'\n", - " new_logger_ppo = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", - " # Set new logger\n", - " model_ppo.set_logger(new_logger_ppo)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Gt8eIQKYM4G3", - "outputId": "26365c9a-f608-4dd4-9695-018b98d1036a" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "---------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 1 |\n", - "| time_elapsed | 30 |\n", - "| total_timesteps | 2048 |\n", - "| train/ | |\n", - "| reward | 2.736287 |\n", - "---------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 69 |\n", - "| iterations | 2 |\n", - "| time_elapsed | 59 |\n", - "| total_timesteps | 4096 |\n", - "| train/ | |\n", - "| approx_kl | 0.012204561 |\n", - "| clip_fraction | 0.187 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.2 |\n", - "| explained_variance | -0.0229 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 9.56 |\n", - "| n_updates | 10 |\n", - "| policy_gradient_loss | -0.0219 |\n", - "| reward | -1.1999706 |\n", - "| std | 1 |\n", - "| value_loss | 19.6 |\n", - "-----------------------------------------\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 3 |\n", - "| time_elapsed | 89 |\n", - "| total_timesteps | 6144 |\n", - "| train/ | |\n", - "| approx_kl | 0.0233445 |\n", - "| clip_fraction | 0.193 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.2 |\n", - "| explained_variance | 0.00147 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 40.7 |\n", - "| n_updates | 20 |\n", - "| policy_gradient_loss | -0.0196 |\n", - "| reward | 1.6823713 |\n", - "| std | 1 |\n", - "| value_loss | 95.8 |\n", - "---------------------------------------\n", - "----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 4 |\n", - "| time_elapsed | 121 |\n", - "| total_timesteps | 8192 |\n", - "| train/ | |\n", - "| approx_kl | 0.01568921 |\n", - "| clip_fraction | 0.155 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.3 |\n", - "| explained_variance | -0.0312 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 13.1 |\n", - "| n_updates | 30 |\n", - "| policy_gradient_loss | -0.0172 |\n", - "| reward | 0.4094886 |\n", - "| std | 1 |\n", - "| value_loss | 38.3 |\n", - "----------------------------------------\n", - "----------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 5 |\n", - "| time_elapsed | 149 |\n", - "| total_timesteps | 10240 |\n", - "| train/ | |\n", - "| approx_kl | 0.01757015 |\n", - "| clip_fraction | 0.222 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.3 |\n", - "| explained_variance | -0.0286 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 6.71 |\n", - "| n_updates | 40 |\n", - "| policy_gradient_loss | -0.024 |\n", - "| reward | -1.0190102 |\n", - "| std | 1.01 |\n", - "| value_loss | 19.7 |\n", - "----------------------------------------\n", - "day: 2956, episode: 40\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 3710303.65\n", - "total_reward: 2710303.65\n", - "total_cost: 383322.44\n", - "total_trades: 80523\n", - "Sharpe: 0.663\n", - "=================================\n", - "---------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 6 |\n", - "| time_elapsed | 178 |\n", - "| total_timesteps | 12288 |\n", - "| train/ | |\n", - "| approx_kl | 0.0189244 |\n", - "| clip_fraction | 0.2 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.4 |\n", - "| explained_variance | 0.000586 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 54.5 |\n", - "| n_updates | 50 |\n", - "| policy_gradient_loss | -0.0164 |\n", - "| reward | 0.229152 |\n", - "| std | 1.01 |\n", - "| value_loss | 75.9 |\n", - "---------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 7 |\n", - "| time_elapsed | 211 |\n", - "| total_timesteps | 14336 |\n", - "| train/ | |\n", - "| approx_kl | 0.024691764 |\n", - "| clip_fraction | 0.224 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | -0.00182 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 28.3 |\n", - "| n_updates | 60 |\n", - "| policy_gradient_loss | -0.0165 |\n", - "| reward | 2.8490999 |\n", - "| std | 1.01 |\n", - "| value_loss | 109 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 8 |\n", - "| time_elapsed | 239 |\n", - "| total_timesteps | 16384 |\n", - "| train/ | |\n", - "| approx_kl | 0.019562809 |\n", - "| clip_fraction | 0.204 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.5 |\n", - "| explained_variance | 0.0154 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 38.4 |\n", - "| n_updates | 70 |\n", - "| policy_gradient_loss | -0.0196 |\n", - "| reward | -1.1492106 |\n", - "| std | 1.01 |\n", - "| value_loss | 80.2 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 9 |\n", - "| time_elapsed | 268 |\n", - "| total_timesteps | 18432 |\n", - "| train/ | |\n", - "| approx_kl | 0.017293174 |\n", - "| clip_fraction | 0.214 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.6 |\n", - "| explained_variance | 0.000796 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 149 |\n", - "| n_updates | 80 |\n", - "| policy_gradient_loss | -0.0199 |\n", - "| reward | 0.9604615 |\n", - "| std | 1.02 |\n", - "| value_loss | 177 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 10 |\n", - "| time_elapsed | 301 |\n", - "| total_timesteps | 20480 |\n", - "| train/ | |\n", - "| approx_kl | 0.018084986 |\n", - "| clip_fraction | 0.187 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.6 |\n", - "| explained_variance | 0.0248 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 49 |\n", - "| n_updates | 90 |\n", - "| policy_gradient_loss | -0.0167 |\n", - "| reward | 4.2871847 |\n", - "| std | 1.02 |\n", - "| value_loss | 116 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 11 |\n", - "| time_elapsed | 330 |\n", - "| total_timesteps | 22528 |\n", - "| train/ | |\n", - "| approx_kl | 0.02062156 |\n", - "| clip_fraction | 0.183 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.7 |\n", - "| explained_variance | 0.00724 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 132 |\n", - "| n_updates | 100 |\n", - "| policy_gradient_loss | -0.0171 |\n", - "| reward | -0.59720796 |\n", - "| std | 1.02 |\n", - "| value_loss | 206 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 68 |\n", - "| iterations | 12 |\n", - "| time_elapsed | 360 |\n", - "| total_timesteps | 24576 |\n", - "| train/ | |\n", - "| approx_kl | 0.019513914 |\n", - "| clip_fraction | 0.249 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 0.062 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 12.1 |\n", - "| n_updates | 110 |\n", - "| policy_gradient_loss | -0.0151 |\n", - "| reward | 0.7724313 |\n", - "| std | 1.02 |\n", - "| value_loss | 23.5 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 13 |\n", - "| time_elapsed | 392 |\n", - "| total_timesteps | 26624 |\n", - "| train/ | |\n", - "| approx_kl | 0.015009267 |\n", - "| clip_fraction | 0.132 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 0.00529 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 97.5 |\n", - "| n_updates | 120 |\n", - "| policy_gradient_loss | -0.0182 |\n", - "| reward | -0.09052762 |\n", - "| std | 1.02 |\n", - "| value_loss | 192 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 14 |\n", - "| time_elapsed | 421 |\n", - "| total_timesteps | 28672 |\n", - "| train/ | |\n", - "| approx_kl | 0.019826401 |\n", - "| clip_fraction | 0.22 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.8 |\n", - "| explained_variance | 0.00322 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 76.1 |\n", - "| n_updates | 130 |\n", - "| policy_gradient_loss | -0.0105 |\n", - "| reward | 4.809871 |\n", - "| std | 1.02 |\n", - "| value_loss | 138 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 15 |\n", - "| time_elapsed | 454 |\n", - "| total_timesteps | 30720 |\n", - "| train/ | |\n", - "| approx_kl | 0.025237966 |\n", - "| clip_fraction | 0.256 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | -0.063 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 3.86 |\n", - "| n_updates | 140 |\n", - "| policy_gradient_loss | -0.0151 |\n", - "| reward | 0.7681675 |\n", - "| std | 1.03 |\n", - "| value_loss | 12.4 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 16 |\n", - "| time_elapsed | 485 |\n", - "| total_timesteps | 32768 |\n", - "| train/ | |\n", - "| approx_kl | 0.019492429 |\n", - "| clip_fraction | 0.215 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -41.9 |\n", - "| explained_variance | 0.021 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 54.9 |\n", - "| n_updates | 150 |\n", - "| policy_gradient_loss | -0.0112 |\n", - "| reward | 0.03731302 |\n", - "| std | 1.03 |\n", - "| value_loss | 83.3 |\n", - "-----------------------------------------\n", - "----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 17 |\n", - "| time_elapsed | 514 |\n", - "| total_timesteps | 34816 |\n", - "| train/ | |\n", - "| approx_kl | 0.02347028 |\n", - "| clip_fraction | 0.222 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42 |\n", - "| explained_variance | 0.00434 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 27.4 |\n", - "| n_updates | 160 |\n", - "| policy_gradient_loss | -0.0183 |\n", - "| reward | -1.6830779 |\n", - "| std | 1.03 |\n", - "| value_loss | 77.9 |\n", - "----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 18 |\n", - "| time_elapsed | 544 |\n", - "| total_timesteps | 36864 |\n", - "| train/ | |\n", - "| approx_kl | 0.016928129 |\n", - "| clip_fraction | 0.187 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 0.0164 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 3.95 |\n", - "| n_updates | 170 |\n", - "| policy_gradient_loss | -0.019 |\n", - "| reward | -4.010391 |\n", - "| std | 1.03 |\n", - "| value_loss | 10.3 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 19 |\n", - "| time_elapsed | 576 |\n", - "| total_timesteps | 38912 |\n", - "| train/ | |\n", - "| approx_kl | 0.017712107 |\n", - "| clip_fraction | 0.194 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.1 |\n", - "| explained_variance | 0.000695 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 10.5 |\n", - "| n_updates | 180 |\n", - "| policy_gradient_loss | -0.0233 |\n", - "| reward | -0.7916964 |\n", - "| std | 1.04 |\n", - "| value_loss | 33.8 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 20 |\n", - "| time_elapsed | 605 |\n", - "| total_timesteps | 40960 |\n", - "| train/ | |\n", - "| approx_kl | 0.035940316 |\n", - "| clip_fraction | 0.27 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.2 |\n", - "| explained_variance | 0.0138 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 19.5 |\n", - "| n_updates | 190 |\n", - "| policy_gradient_loss | -0.0122 |\n", - "| reward | -3.1133146 |\n", - "| std | 1.04 |\n", - "| value_loss | 73.5 |\n", - "-----------------------------------------\n", - "day: 2956, episode: 50\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 4489520.08\n", - "total_reward: 3489520.08\n", - "total_cost: 373083.24\n", - "total_trades: 79300\n", - "Sharpe: 0.752\n", - "=================================\n", - "------------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 21 |\n", - "| time_elapsed | 635 |\n", - "| total_timesteps | 43008 |\n", - "| train/ | |\n", - "| approx_kl | 0.028285751 |\n", - "| clip_fraction | 0.23 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.2 |\n", - "| explained_variance | -0.0141 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 12.6 |\n", - "| n_updates | 200 |\n", - "| policy_gradient_loss | -0.0122 |\n", - "| reward | -0.055241805 |\n", - "| std | 1.04 |\n", - "| value_loss | 26.9 |\n", - "------------------------------------------\n", - "-------------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 22 |\n", - "| time_elapsed | 667 |\n", - "| total_timesteps | 45056 |\n", - "| train/ | |\n", - "| approx_kl | 0.015426388 |\n", - "| clip_fraction | 0.218 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.3 |\n", - "| explained_variance | -0.01 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 47.4 |\n", - "| n_updates | 210 |\n", - "| policy_gradient_loss | -0.0143 |\n", - "| reward | -0.0147438925 |\n", - "| std | 1.04 |\n", - "| value_loss | 68.7 |\n", - "-------------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 23 |\n", - "| time_elapsed | 695 |\n", - "| total_timesteps | 47104 |\n", - "| train/ | |\n", - "| approx_kl | 0.042087153 |\n", - "| clip_fraction | 0.314 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.4 |\n", - "| explained_variance | 0.00911 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 18.8 |\n", - "| n_updates | 220 |\n", - "| policy_gradient_loss | -0.0173 |\n", - "| reward | 2.4495711 |\n", - "| std | 1.04 |\n", - "| value_loss | 52.7 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 24 |\n", - "| time_elapsed | 725 |\n", - "| total_timesteps | 49152 |\n", - "| train/ | |\n", - "| approx_kl | 0.04404234 |\n", - "| clip_fraction | 0.306 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.4 |\n", - "| explained_variance | 0.00196 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 30 |\n", - "| n_updates | 230 |\n", - "| policy_gradient_loss | -0.0121 |\n", - "| reward | -0.55505633 |\n", - "| std | 1.05 |\n", - "| value_loss | 68.1 |\n", - "-----------------------------------------\n", - "-----------------------------------------\n", - "| time/ | |\n", - "| fps | 67 |\n", - "| iterations | 25 |\n", - "| time_elapsed | 757 |\n", - "| total_timesteps | 51200 |\n", - "| train/ | |\n", - "| approx_kl | 0.018749528 |\n", - "| clip_fraction | 0.19 |\n", - "| clip_range | 0.2 |\n", - "| entropy_loss | -42.5 |\n", - "| explained_variance | 0.0504 |\n", - "| learning_rate | 0.00025 |\n", - "| loss | 6.77 |\n", - "| n_updates | 240 |\n", - "| policy_gradient_loss | -0.0183 |\n", - "| reward | 0.8350754 |\n", - "| std | 1.05 |\n", - "| value_loss | 22.2 |\n", - "-----------------------------------------\n" - ] - } - ], - "source": [ - "trained_ppo = agent.train_model(model=model_ppo, \n", - " tb_log_name='ppo',\n", - " total_timesteps=50000) if if_using_ppo else None" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3Zpv4S0-fDBv" - }, - "source": [ - "### Agent 4: TD3" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "JSAHhV4Xc-bh", - "outputId": "db147b9a-163a-4d03-dd6c-9e89f0e8f421" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "{'batch_size': 100, 'buffer_size': 1000000, 'learning_rate': 0.001}\n", - "Using cpu device\n", - "Logging to results/td3\n" - ] - } - ], - "source": [ - "agent = DRLAgent(env = env_train)\n", - "TD3_PARAMS = {\"batch_size\": 100, \n", - " \"buffer_size\": 1000000, \n", - " \"learning_rate\": 0.001}\n", - "\n", - "model_td3 = agent.get_model(\"td3\",model_kwargs = TD3_PARAMS)\n", - "\n", - "if if_using_td3:\n", - " # set up logger\n", - " tmp_path = RESULTS_DIR + '/td3'\n", - " new_logger_td3 = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", - " # Set new logger\n", - " model_td3.set_logger(new_logger_td3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "OSRxNYAxdKpU", - "outputId": "1d85d74c-54cf-4682-a34b-481a5aafe5d4" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 4 |\n", - "| fps | 25 |\n", - "| time_elapsed | 464 |\n", - "| total_timesteps | 11828 |\n", - "| train/ | |\n", - "| actor_loss | 85.6 |\n", - "| critic_loss | 2.26e+03 |\n", - "| learning_rate | 0.001 |\n", - "| n_updates | 8871 |\n", - "| reward | -5.8078027 |\n", - "-----------------------------------\n", - "day: 2956, episode: 60\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 3391778.54\n", - "total_reward: 2391778.54\n", - "total_cost: 999.00\n", - "total_trades: 50252\n", - "Sharpe: 0.630\n", - "=================================\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 8 |\n", - "| fps | 22 |\n", - "| time_elapsed | 1070 |\n", - "| total_timesteps | 23656 |\n", - "| train/ | |\n", - "| actor_loss | 59.1 |\n", - "| critic_loss | 438 |\n", - "| learning_rate | 0.001 |\n", - "| n_updates | 20699 |\n", - "| reward | -5.8078027 |\n", - "-----------------------------------\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 12 |\n", - "| fps | 21 |\n", - "| time_elapsed | 1681 |\n", - "| total_timesteps | 35484 |\n", - "| train/ | |\n", - "| actor_loss | 43.3 |\n", - "| critic_loss | 82.1 |\n", - "| learning_rate | 0.001 |\n", - "| n_updates | 32527 |\n", - "| reward | -5.8078027 |\n", - "-----------------------------------\n" - ] - } - ], - "source": [ - "trained_td3 = agent.train_model(model=model_td3, \n", - " tb_log_name='td3',\n", - " total_timesteps=50000) if if_using_td3 else None" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Dr49PotrfG01" - }, - "source": [ - "### Agent 5: SAC" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "xwOhVjqRkCdM", - "outputId": "9018f9ed-0dff-4b75-c0b2-7566784c52cf" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "{'batch_size': 128, 'buffer_size': 100000, 'learning_rate': 0.0001, 'learning_starts': 100, 'ent_coef': 'auto_0.1'}\n", - "Using cpu device\n", - "Logging to results/sac\n" - ] - } - ], - "source": [ - "agent = DRLAgent(env = env_train)\n", - "SAC_PARAMS = {\n", - " \"batch_size\": 128,\n", - " \"buffer_size\": 100000,\n", - " \"learning_rate\": 0.0001,\n", - " \"learning_starts\": 100,\n", - " \"ent_coef\": \"auto_0.1\",\n", - "}\n", - "\n", - "model_sac = agent.get_model(\"sac\",model_kwargs = SAC_PARAMS)\n", - "\n", - "if if_using_sac:\n", - " # set up logger\n", - " tmp_path = RESULTS_DIR + '/sac'\n", - " new_logger_sac = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", - " # Set new logger\n", - " model_sac.set_logger(new_logger_sac)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "K8RSdKCckJyH", - "outputId": "bfa91496-f7e6-4d0f-fb77-bc9dd1797e81" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "day: 2956, episode: 80\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 2788059.56\n", - "total_reward: 1788059.56\n", - "total_cost: 247103.77\n", - "total_trades: 76956\n", - "Sharpe: 0.561\n", - "=================================\n", - "----------------------------------\n", - "| time/ | |\n", - "| episodes | 4 |\n", - "| fps | 19 |\n", - "| time_elapsed | 622 |\n", - "| total_timesteps | 11828 |\n", - "| train/ | |\n", - "| actor_loss | 258 |\n", - "| critic_loss | 22.5 |\n", - "| ent_coef | 0.0849 |\n", - "| ent_coef_loss | -113 |\n", - "| learning_rate | 0.0001 |\n", - "| n_updates | 11727 |\n", - "| reward | -9.282894 |\n", - "----------------------------------\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 8 |\n", - "| fps | 19 |\n", - "| time_elapsed | 1235 |\n", - "| total_timesteps | 23656 |\n", - "| train/ | |\n", - "| actor_loss | 107 |\n", - "| critic_loss | 22.7 |\n", - "| ent_coef | 0.0261 |\n", - "| ent_coef_loss | -166 |\n", - "| learning_rate | 0.0001 |\n", - "| n_updates | 23555 |\n", - "| reward | -12.521359 |\n", - "-----------------------------------\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 12 |\n", - "| fps | 19 |\n", - "| time_elapsed | 1864 |\n", - "| total_timesteps | 35484 |\n", - "| train/ | |\n", - "| actor_loss | 56.2 |\n", - "| critic_loss | 16.1 |\n", - "| ent_coef | 0.00811 |\n", - "| ent_coef_loss | -181 |\n", - "| learning_rate | 0.0001 |\n", - "| n_updates | 35383 |\n", - "| reward | -13.549046 |\n", - "-----------------------------------\n", - "day: 2956, episode: 90\n", - "begin_total_asset: 1000000.00\n", - "end_total_asset: 5929965.89\n", - "total_reward: 4929965.89\n", - "total_cost: 6822.53\n", - "total_trades: 53683\n", - "Sharpe: 0.843\n", - "=================================\n", - "-----------------------------------\n", - "| time/ | |\n", - "| episodes | 16 |\n", - "| fps | 18 |\n", - "| time_elapsed | 2490 |\n", - "| total_timesteps | 47312 |\n", - "| train/ | |\n", - "| actor_loss | 32.3 |\n", - "| critic_loss | 4.64 |\n", - "| ent_coef | 0.00272 |\n", - "| ent_coef_loss | -90.9 |\n", - "| learning_rate | 0.0001 |\n", - "| n_updates | 47211 |\n", - "| reward | -7.4855604 |\n", - "-----------------------------------\n" - ] - } - ], - "source": [ - "trained_sac = agent.train_model(model=model_sac, \n", - " tb_log_name='sac',\n", - " total_timesteps=50000) if if_using_sac else None" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "f2wZgkQXh1jE" - }, - "source": [ - "## In-sample Performance\n", - "\n", - "Assume that the initial capital is $1,000,000." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bEv5KGC8h1jE" - }, - "source": [ - "### Set turbulence threshold\n", - "Set the turbulence threshold to be greater than the maximum of insample turbulence data. If current turbulence index is greater than the threshold, then we assume that the current market is volatile" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": { - "id": "efwBi84ch1jE" - }, - "outputs": [], - "source": [ - "data_risk_indicator = processed_full[(processed_full.date=TRAIN_START_DATE)]\n", - "insample_risk_indicator = data_risk_indicator.drop_duplicates(subset=['date'])" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "VHZMBpSqh1jG", - "outputId": "3164bf6e-3b83-4bbf-ecd4-7688c6309e8c" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "count 2957.000000\n", - "mean 18.105293\n", - "std 7.272476\n", - "min 9.140000\n", - "25% 13.370000\n", - "50% 16.209999\n", - "75% 20.629999\n", - "max 82.690002\n", - "Name: vix, dtype: float64" - ] - }, - "metadata": {}, - "execution_count": 79 - } - ], - "source": [ - "insample_risk_indicator.vix.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "BDkszkMloRWT", - "outputId": "7e36e119-63e2-4379-f110-490836222522" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "57.212001831054636" - ] - }, - "metadata": {}, - "execution_count": 80 - } - ], - "source": [ - "insample_risk_indicator.vix.quantile(0.996)" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "AL7hs7svnNWT", - "outputId": "13abfde5-de24-40b7-921e-385dd435b3e8" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "count 2957.000000\n", - "mean 34.139585\n", - "std 43.879110\n", - "min 0.000000\n", - "25% 14.613506\n", - "50% 23.644663\n", - "75% 38.292580\n", - "max 652.504902\n", - "Name: turbulence, dtype: float64" - ] - }, - "metadata": {}, - "execution_count": 81 - } - ], - "source": [ - "insample_risk_indicator.turbulence.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "N78hfHckoqJ9", - "outputId": "b5f650e9-cf0a-4481-b519-b77c8a0b1b2a" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "291.72619195879605" - ] - }, - "metadata": {}, - "execution_count": 82 - } - ], - "source": [ - "insample_risk_indicator.turbulence.quantile(0.996)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "U5mmgQF_h1jQ" - }, - "source": [ - "### Trading (Out-of-sample Performance)\n", - "\n", - "We update periodically in order to take full advantage of the data, e.g., retrain quarterly, monthly or weekly. We also tune the parameters along the way, in this notebook we use the in-sample data from 2009-01 to 2020-07 to tune the parameters once, so there is some alpha decay here as the length of trade date extends. \n", - "\n", - "Numerous hyperparameters – e.g. the learning rate, the total number of samples to train on – influence the learning process and are usually determined by testing some variations." - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "metadata": { - "id": "cIqoV0GSI52v" - }, - "outputs": [], - "source": [ - "e_trade_gym = StockTradingEnv(df = trade, turbulence_threshold = 70,risk_indicator_col='vix', **env_kwargs)\n", - "# env_trade, obs_trade = e_trade_gym.get_sb_env()" - ] - }, - { - "cell_type": "code", - "execution_count": 106, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 357 - }, - "id": "W_XNgGsBMeVw", - "outputId": "13588f5a-daef-4a7b-c116-c737bf61e994" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " date tic open high low close \n", - "0 2021-10-01 AAPL 141.899994 142.919998 139.110001 141.404266 \\\n", - "0 2021-10-01 AMGN 213.589996 214.610001 210.800003 203.845871 \n", - "0 2021-10-01 AXP 168.500000 175.119995 168.479996 170.065353 \n", - "0 2021-10-01 BA 222.850006 226.720001 220.600006 226.000000 \n", - "0 2021-10-01 CAT 192.899994 195.869995 191.240005 187.928040 \n", - "\n", - " volume day macd boll_ub boll_lb rsi_30 cci_30 \n", - "0 94639600.0 4.0 -1.703488 155.382846 137.132193 46.927735 -142.190202 \\\n", - "0 2629400.0 4.0 -3.097330 212.767980 199.379595 40.408533 -96.757039 \n", - "0 3956000.0 4.0 2.273329 174.218856 149.232889 56.265093 117.538402 \n", - "0 9113600.0 4.0 0.730320 226.909442 205.727561 51.614047 116.649440 \n", - "0 3695500.0 4.0 -3.640324 205.735919 181.432783 41.999435 -112.087765 \n", - "\n", - " dx_30 close_30_sma close_60_sma vix turbulence \n", - "0 41.749873 147.171798 146.269415 21.1 120.122978 \n", - "0 36.189244 208.480832 217.103342 21.1 120.122978 \n", - "0 15.667511 161.215661 163.458888 21.1 120.122978 \n", - "0 2.027170 217.175334 221.968500 21.1 120.122978 \n", - "0 36.203176 196.993869 200.522109 21.1 120.122978 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dateticopenhighlowclosevolumedaymacdboll_ubboll_lbrsi_30cci_30dx_30close_30_smaclose_60_smavixturbulence
02021-10-01AAPL141.899994142.919998139.110001141.40426694639600.04.0-1.703488155.382846137.13219346.927735-142.19020241.749873147.171798146.26941521.1120.122978
02021-10-01AMGN213.589996214.610001210.800003203.8458712629400.04.0-3.097330212.767980199.37959540.408533-96.75703936.189244208.480832217.10334221.1120.122978
02021-10-01AXP168.500000175.119995168.479996170.0653533956000.04.02.273329174.218856149.23288956.265093117.53840215.667511161.215661163.45888821.1120.122978
02021-10-01BA222.850006226.720001220.600006226.0000009113600.04.00.730320226.909442205.72756151.614047116.6494402.027170217.175334221.96850021.1120.122978
02021-10-01CAT192.899994195.869995191.240005187.9280403695500.04.0-3.640324205.735919181.43278341.999435-112.08776536.203176196.993869200.52210921.1120.122978
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 106 - } - ], - "source": [ - "trade.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 107, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "lbFchno5j3xs", - "outputId": "5df880d8-ff14-4104-a2f8-a2d1a417cc1c" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "hit end!\n" - ] - } - ], - "source": [ - "trained_moedl = trained_a2c\n", - "df_account_value_a2c, df_actions_a2c = DRLAgent.DRL_prediction(\n", - " model=trained_moedl, \n", - " environment = e_trade_gym)" - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "JbYljWGjj3pH", - "outputId": "2fb2632a-dd77-40f2-eeff-e4b3385727f2" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "hit end!\n" - ] - } - ], - "source": [ - "trained_moedl = trained_ddpg\n", - "df_account_value_ddpg, df_actions_ddpg = DRLAgent.DRL_prediction(\n", - " model=trained_moedl, \n", - " environment = e_trade_gym)" - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "74jNP2DBj3hb", - "outputId": "9659e354-3d56-4fe3-b6bb-81777d179c51" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "hit end!\n" - ] - } - ], - "source": [ - "trained_moedl = trained_ppo\n", - "df_account_value_ppo, df_actions_ppo = DRLAgent.DRL_prediction(\n", - " model=trained_moedl, \n", - " environment = e_trade_gym)" - ] - }, - { - "cell_type": "code", - "execution_count": 110, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "S7VyGGJPj3SH", - "outputId": "a65b52c5-aba0-4e48-b111-481b514fcce2" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "hit end!\n" - ] - } - ], - "source": [ - "trained_moedl = trained_td3\n", - "df_account_value_td3, df_actions_td3 = DRLAgent.DRL_prediction(\n", - " model=trained_moedl, \n", - " environment = e_trade_gym)" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "eLOnL5eYh1jR", - "outputId": "3d9bf94b-2bb5-4091-dc7f-bfe2851dc0be" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "hit end!\n" - ] - } - ], - "source": [ - "trained_moedl = trained_sac\n", - "df_account_value_sac, df_actions_sac = DRLAgent.DRL_prediction(\n", - " model=trained_moedl, \n", - " environment = e_trade_gym)" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "ERxw3KqLkcP4", - "outputId": "219b1298-4a18-41a3-8390-788739158dd7" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "(353, 2)" - ] - }, - "metadata": {}, - "execution_count": 112 - } - ], - "source": [ - "df_account_value_a2c.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GcE-t08w6DaW" - }, - "source": [ - "\n", - "# Part 6.5: Mean Variance Optimization" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Mean Variance optimization is a very classic strategy in portfolio management. Here, we go through the whole process to do the mean variance optimization and add it as a baseline to compare.\n", - "\n", - "First, process dataframe to the form for MVO weight calculation." - ], - "metadata": { - "id": "GzyHU-RokTaj" - } - }, - { - "cell_type": "code", - "source": [ - "def process_df_for_mvo(df):\n", - " df = df.sort_values(['date','tic'],ignore_index=True)[['date','tic','close']]\n", - " fst = df\n", - " fst = fst.iloc[0:stock_dimension, :]\n", - " tic = fst['tic'].tolist()\n", - "\n", - " mvo = pd.DataFrame()\n", - "\n", - " for k in range(len(tic)):\n", - " mvo[tic[k]] = 0\n", - "\n", - " for i in range(df.shape[0]//stock_dimension):\n", - " n = df\n", - " n = n.iloc[i * stock_dimension:(i+1) * stock_dimension, :]\n", - " date = n['date'][i*stock_dimension]\n", - " mvo.loc[date] = n['close'].tolist()\n", - " \n", - " return mvo" - ], - "metadata": { - "id": "ZaxdYAdRcA67" - }, - "execution_count": 134, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### Helper functions for mean returns and variance-covariance matrix" - ], - "metadata": { - "id": "tcHDZ7hFkdyL" - } - }, - { - "cell_type": "code", - "source": [ - "# Codes in this section partially refer to Dr G A Vijayalakshmi Pai\n", - "\n", - "# https://www.kaggle.com/code/vijipai/lesson-5-mean-variance-optimization-of-portfolios/notebook\n", - "\n", - "def StockReturnsComputing(StockPrice, Rows, Columns): \n", - " import numpy as np \n", - " StockReturn = np.zeros([Rows-1, Columns]) \n", - " for j in range(Columns): # j: Assets \n", - " for i in range(Rows-1): # i: Daily Prices \n", - " StockReturn[i,j]=((StockPrice[i+1, j]-StockPrice[i,j])/StockPrice[i,j])* 100 \n", - " \n", - " return StockReturn" - ], - "metadata": { - "id": "gKjY9bvYcEkb" - }, - "execution_count": 135, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### Calculate the weights for mean-variance" - ], - "metadata": { - "id": "CPnMNonxkj-I" - } - }, - { - "cell_type": "code", - "source": [ - "train_mvo = data_split(processed_full, TRAIN_START_DATE,TRAIN_END_DATE).reset_index()\n", - "trade_mvo = data_split(processed_full, TRADE_START_DATE,TRADE_END_DATE).reset_index()" - ], - "metadata": { - "id": "wdF2erPNcVd3" - }, - "execution_count": 138, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "StockData = process_df_for_mvo(train_mvo)\n", - "TradeData = process_df_for_mvo(trade_mvo)\n", - "\n", - "TradeData.to_numpy()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "9-64xYTOcJ36", - "outputId": "5cf98bac-c467-4ef1-e98c-2bb858a848c2" - }, - "execution_count": 139, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([[141.404, 203.846, 170.065, ..., 49.275, 43.724, 133.839],\n", - " [137.925, 201.483, 168.814, ..., 49.456, 43.621, 132.55 ],\n", - " [139.878, 201.883, 170.867, ..., 49.465, 43.995, 133.419],\n", - " ...,\n", - " [149.4 , 237.62 , 174.494, ..., 37.903, 36.21 , 141.51 ],\n", - " [146.71 , 233.66 , 173.607, ..., 38.109, 35.8 , 141.888],\n", - " [147.92 , 234.45 , 172.66 , ..., 38.247, 35.39 , 140.863]])" - ] - }, - "metadata": {}, - "execution_count": 139 - } - ] - }, - { - "cell_type": "code", - "source": [ - "#compute asset returns\n", - "arStockPrices = np.asarray(StockData)\n", - "[Rows, Cols]=arStockPrices.shape\n", - "arReturns = StockReturnsComputing(arStockPrices, Rows, Cols)\n", - "\n", - "#compute mean returns and variance covariance matrix of returns\n", - "meanReturns = np.mean(arReturns, axis = 0)\n", - "covReturns = np.cov(arReturns, rowvar=False)\n", - " \n", - "#set precision for printing results\n", - "np.set_printoptions(precision=3, suppress = True)\n", - "\n", - "#display mean returns and variance-covariance matrix of returns\n", - "print('Mean returns of assets in k-portfolio 1\\n', meanReturns)\n", - "print('Variance-Covariance matrix of returns\\n', covReturns)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "28q2-ebfcfbu", - "outputId": "3a51ec82-f586-4462-f5d1-604017ffa1fe" - }, - "execution_count": 65, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Mean returns of assets in k-portfolio 1\n", - " [0.12 0.065 0.07 0.08 0.068 0.116 0.051 0.039 0.073 0.049 0.102 0.078\n", - " 0.024 0.06 0.048 0.072 0.039 0.064 0.045 0.048 0.096 0.092 0.046 0.058\n", - " 0.104 0.094 0.043 0.034 0.048]\n", - "Variance-Covariance matrix of returns\n", - " [[3.14 1.017 1.294 1.529 1.374 1.696 1.379 1.13 1.092 1.377 1.165 1.224\n", - " 1.035 1.526 0.693 1.272 0.667 0.819 1.032 0.737 1.579 1.145 0.672 0.863\n", - " 1.146 1.34 0.526 0.909 0.635]\n", - " [1.017 2.406 1.076 1.016 1.067 1.218 1.027 0.967 0.938 1.128 0.984 1.032\n", - " 0.851 1.155 0.892 1.143 0.643 0.668 0.909 1.074 1.092 0.879 0.727 0.855\n", - " 1.147 1.058 0.629 1.027 0.648]\n", - " [1.294 1.076 3.307 2.486 1.912 1.575 1.435 1.926 1.721 2.24 1.382 1.859\n", - " 1.342 1.534 0.866 2.37 0.994 1.082 1.384 0.959 1.362 1.424 0.73 1.509\n", - " 1.416 1.802 0.75 1.223 0.586]\n", - " [1.529 1.016 2.486 4.984 2.129 1.698 1.518 2.153 1.845 2.214 1.537 2.132\n", - " 1.536 1.706 0.911 2.308 1.123 1.201 1.47 0.947 1.444 1.583 0.752 1.613\n", - " 1.483 1.722 0.738 1.374 0.609]\n", - " [1.374 1.067 1.912 2.129 3.34 1.621 1.522 1.893 1.473 2.005 1.242 1.874\n", - " 1.355 1.567 0.827 2.044 0.851 0.86 1.591 0.916 1.336 1.299 0.684 1.274\n", - " 1.219 1.408 0.738 1.228 0.614]\n", - " [1.696 1.218 1.575 1.698 1.621 5.063 1.658 1.263 1.357 1.61 1.363 1.447\n", - " 1.191 1.648 0.76 1.573 0.741 0.99 1.155 0.915 1.859 1.499 0.659 1.048\n", - " 1.209 1.728 0.567 1.02 0.624]\n", - " [1.379 1.027 1.435 1.518 1.522 1.658 2.806 1.307 1.267 1.508 1.137 1.36\n", - " 1.247 1.584 0.846 1.518 0.731 0.826 1.22 0.881 1.486 1.151 0.744 1.006\n", - " 1.1 1.314 0.656 1.064 0.689]\n", - " [1.13 0.967 1.926 2.153 1.893 1.263 1.307 2.928 1.393 1.833 1.207 1.647\n", - " 1.274 1.395 0.839 1.948 0.922 0.999 1.268 0.958 1.208 1.141 0.69 1.367\n", - " 1.299 1.384 0.743 1.066 0.519]\n", - " [1.092 0.938 1.721 1.845 1.473 1.357 1.267 1.393 2.459 1.621 1.156 1.467\n", - " 1.059 1.226 0.703 1.685 0.832 0.866 1.12 0.767 1.151 1.201 0.665 1.1\n", - " 1.059 1.31 0.661 0.997 0.579]\n", - " [1.377 1.128 2.24 2.214 2.005 1.61 1.508 1.833 1.621 3.381 1.354 1.732\n", - " 1.324 1.576 0.833 2.733 0.83 0.944 1.415 0.968 1.42 1.322 0.696 1.504\n", - " 1.384 1.531 0.721 1.24 0.616]\n", - " [1.165 0.984 1.382 1.537 1.242 1.363 1.137 1.207 1.156 1.354 2.063 1.244\n", - " 1.002 1.247 0.693 1.369 0.735 0.915 1.036 0.766 1.208 1.205 0.695 1.083\n", - " 1.14 1.21 0.632 0.916 0.723]\n", - " [1.224 1.032 1.859 2.132 1.874 1.447 1.36 1.647 1.467 1.732 1.244 2.184\n", - " 1.214 1.351 0.83 1.831 0.914 0.928 1.418 0.898 1.251 1.307 0.698 1.257\n", - " 1.259 1.411 0.694 1.145 0.579]\n", - " [1.035 0.851 1.342 1.536 1.355 1.191 1.247 1.274 1.059 1.324 1.002 1.214\n", - " 1.982 1.287 0.709 1.371 0.771 0.754 1.084 0.777 1.13 0.96 0.664 1.004\n", - " 1.011 1.106 0.644 0.966 0.548]\n", - " [1.526 1.155 1.534 1.706 1.567 1.648 1.584 1.395 1.226 1.576 1.247 1.351\n", - " 1.287 3.246 0.788 1.572 0.79 0.796 1.18 0.858 1.697 1.132 0.729 1.131\n", - " 1.153 1.333 0.67 1.081 0.705]\n", - " [0.693 0.892 0.866 0.911 0.827 0.76 0.846 0.839 0.703 0.833 0.693 0.83\n", - " 0.709 0.788 1.123 0.881 0.614 0.564 0.791 0.781 0.787 0.688 0.641 0.695\n", - " 0.835 0.796 0.567 0.783 0.522]\n", - " [1.272 1.143 2.37 2.308 2.044 1.573 1.518 1.948 1.685 2.733 1.369 1.831\n", - " 1.371 1.572 0.881 3.241 0.933 0.966 1.436 1.022 1.381 1.351 0.74 1.627\n", - " 1.402 1.561 0.807 1.291 0.637]\n", - " [0.667 0.643 0.994 1.123 0.851 0.741 0.731 0.922 0.832 0.83 0.735 0.914\n", - " 0.771 0.79 0.614 0.933 1.2 0.656 0.763 0.635 0.747 0.738 0.692 0.834\n", - " 0.737 0.81 0.593 0.683 0.492]\n", - " [0.819 0.668 1.082 1.201 0.86 0.99 0.826 0.999 0.866 0.944 0.915 0.928\n", - " 0.754 0.796 0.564 0.966 0.656 1.426 0.753 0.644 0.877 0.912 0.546 0.893\n", - " 0.813 0.947 0.483 0.605 0.471]\n", - " [1.032 0.909 1.384 1.47 1.591 1.155 1.22 1.268 1.12 1.415 1.036 1.418\n", - " 1.084 1.18 0.791 1.436 0.763 0.753 1.83 0.758 1.03 1.041 0.652 1.036\n", - " 1.007 1.122 0.632 1.027 0.56 ]\n", - " [0.737 1.074 0.959 0.947 0.916 0.915 0.881 0.958 0.767 0.968 0.766 0.898\n", - " 0.777 0.858 0.781 1.022 0.635 0.644 0.758 1.666 0.855 0.756 0.626 0.822\n", - " 0.925 0.884 0.627 0.79 0.525]\n", - " [1.579 1.092 1.362 1.444 1.336 1.859 1.486 1.208 1.151 1.42 1.208 1.251\n", - " 1.13 1.697 0.787 1.381 0.747 0.877 1.03 0.855 2.5 1.163 0.754 0.993\n", - " 1.191 1.409 0.638 0.964 0.707]\n", - " [1.145 0.879 1.424 1.583 1.299 1.499 1.151 1.141 1.201 1.322 1.205 1.307\n", - " 0.96 1.132 0.688 1.351 0.738 0.912 1.041 0.756 1.163 2.694 0.631 0.985\n", - " 1.087 1.28 0.565 0.881 0.585]\n", - " [0.672 0.727 0.73 0.752 0.684 0.659 0.744 0.69 0.665 0.696 0.695 0.698\n", - " 0.664 0.729 0.641 0.74 0.692 0.546 0.652 0.626 0.754 0.631 1.15 0.678\n", - " 0.666 0.693 0.579 0.689 0.604]\n", - " [0.863 0.855 1.509 1.613 1.274 1.048 1.006 1.367 1.1 1.504 1.083 1.257\n", - " 1.004 1.131 0.695 1.627 0.834 0.893 1.036 0.822 0.993 0.985 0.678 1.978\n", - " 1.09 1.12 0.702 0.924 0.589]\n", - " [1.146 1.147 1.416 1.483 1.219 1.209 1.1 1.299 1.059 1.384 1.14 1.259\n", - " 1.011 1.153 0.835 1.402 0.737 0.813 1.007 0.925 1.191 1.087 0.666 1.09\n", - " 2.629 1.186 0.61 0.998 0.617]\n", - " [1.34 1.058 1.802 1.722 1.408 1.728 1.314 1.384 1.31 1.531 1.21 1.411\n", - " 1.106 1.333 0.796 1.561 0.81 0.947 1.122 0.884 1.409 1.28 0.693 1.12\n", - " 1.186 2.58 0.607 0.93 0.574]\n", - " [0.526 0.629 0.75 0.738 0.738 0.567 0.656 0.743 0.661 0.721 0.632 0.694\n", - " 0.644 0.67 0.567 0.807 0.593 0.483 0.632 0.627 0.638 0.565 0.579 0.702\n", - " 0.61 0.607 1.195 0.663 0.512]\n", - " [0.909 1.027 1.223 1.374 1.228 1.02 1.064 1.066 0.997 1.24 0.916 1.145\n", - " 0.966 1.081 0.783 1.291 0.683 0.605 1.027 0.79 0.964 0.881 0.689 0.924\n", - " 0.998 0.93 0.663 3.131 0.71 ]\n", - " [0.635 0.648 0.586 0.609 0.614 0.624 0.689 0.519 0.579 0.616 0.723 0.579\n", - " 0.548 0.705 0.522 0.637 0.492 0.471 0.56 0.525 0.707 0.585 0.604 0.589\n", - " 0.617 0.574 0.512 0.71 1.408]]\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Use PyPortfolioOpt" - ], - "metadata": { - "id": "Ei3f_NxDkpOx" - } - }, - { - "cell_type": "code", - "source": [ - "from pypfopt.efficient_frontier import EfficientFrontier\n", - "\n", - "ef_mean = EfficientFrontier(meanReturns, covReturns, weight_bounds=(0, 0.5))\n", - "raw_weights_mean = ef_mean.max_sharpe()\n", - "cleaned_weights_mean = ef_mean.clean_weights()\n", - "mvo_weights = np.array([1000000 * cleaned_weights_mean[i] for i in range(29)])\n", - "mvo_weights" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "bHc3FC3Hckay", - "outputId": "6585f4b7-fda4-4d83-c3cc-38c5ed750aea" - }, - "execution_count": 66, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([288130., 0., 0., 0., 0., 69330., 0.,\n", - " 0., 0., 0., 316160., 0., 0., 0.,\n", - " 0., 0., 0., 0., 0., 0., 0.,\n", - " 66290., 0., 0., 237410., 22690., 0., 0.,\n", - " 0.])" - ] - }, - "metadata": {}, - "execution_count": 66 - } - ] - }, - { - "cell_type": "code", - "source": [ - "LastPrice = np.array([1/p for p in StockData.tail(1).to_numpy()[0]])\n", - "Initial_Portfolio = np.multiply(mvo_weights, LastPrice)\n", - "Initial_Portfolio" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "iFiwDj29ck9s", - "outputId": "1e4c7967-c5af-43de-a858-beadfef5116c" - }, - "execution_count": 67, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([2054.193, 0. , 0. , 0. , 0. , 255.623,\n", - " 0. , 0. , 0. , 0. , 998.634, 0. ,\n", - " 0. , 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 463.5 , 0. , 0. ,\n", - " 619.578, 103.016, 0. , 0. , 0. ])" - ] - }, - "metadata": {}, - "execution_count": 67 - } - ] - }, - { - "cell_type": "code", - "source": [ - "Portfolio_Assets = TradeData @ Initial_Portfolio\n", - "MVO_result = pd.DataFrame(Portfolio_Assets, columns=[\"Mean Var\"])\n", - "# MVO_result" - ], - "metadata": { - "id": "wbcVsNYfcn2B" - }, - "execution_count": 68, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "W6vvNSC6h1jZ" - }, - "source": [ - "\n", - "# Part 7: Backtesting Results\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": 145, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "KeDeGAc9VrEg", - "outputId": "fe8802d9-e883-48fb-ed8d-36a8236322f7" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "==============Get Baseline Stats===========\n", - "\r[*********************100%***********************] 1 of 1 completed\n", - "Shape of DataFrame: (354, 8)\n", - "Annual return -0.034876\n", - "Cumulative returns -0.048644\n", - "Annual volatility 0.181612\n", - "Sharpe ratio -0.105351\n", - "Calmar ratio -0.158953\n", - "Stability 0.280983\n", - "Max drawdown -0.219408\n", - "Omega ratio 0.982546\n", - "Sortino ratio -0.146974\n", - "Skew NaN\n", - "Kurtosis NaN\n", - "Tail ratio 0.970602\n", - "Daily value at risk -0.022957\n", - "dtype: float64\n", - " a2c ddpg td3 ppo \n", - "date \n", - "2021-10-01 1.000000e+06 1.000000e+06 1.000000e+06 1.000000e+06 \\\n", - "2021-10-04 9.971647e+05 9.977126e+05 9.961645e+05 9.995875e+05 \n", - "2021-10-05 1.000508e+06 1.003342e+06 1.002158e+06 1.000310e+06 \n", - "2021-10-06 1.002597e+06 1.004220e+06 1.006038e+06 1.000651e+06 \n", - "2021-10-07 1.012727e+06 1.010823e+06 1.016102e+06 1.002144e+06 \n", - "\n", - " sac Mean Var \n", - "date \n", - "2021-10-01 1.000000e+06 1.007573e+06 \n", - "2021-10-04 9.978017e+05 9.921956e+05 \n", - "2021-10-05 1.002751e+06 1.004253e+06 \n", - "2021-10-06 1.004620e+06 1.008231e+06 \n", - "2021-10-07 1.012706e+06 1.025692e+06 \n" - ] - } - ], - "source": [ - "df_result_a2c = df_account_value_a2c.set_index(df_account_value_a2c.columns[0])\n", - "df_result_a2c.rename(columns = {'account_value':'a2c'}, inplace = True)\n", - "df_result_ddpg = df_account_value_ddpg.set_index(df_account_value_ddpg.columns[0])\n", - "df_result_ddpg.rename(columns = {'account_value':'ddpg'}, inplace = True)\n", - "df_result_td3 = df_account_value_td3.set_index(df_account_value_td3.columns[0])\n", - "df_result_td3.rename(columns = {'account_value':'td3'}, inplace = True)\n", - "df_result_ppo = df_account_value_ppo.set_index(df_account_value_ppo.columns[0])\n", - "df_result_ppo.rename(columns = {'account_value':'ppo'}, inplace = True)\n", - "df_result_sac = df_account_value_sac.set_index(df_account_value_sac.columns[0])\n", - "df_result_sac.rename(columns = {'account_value':'sac'}, inplace = True)\n", - "df_account_value_a2c.to_csv(\"df_account_value_a2c.csv\")\n", - "#baseline stats\n", - "print(\"==============Get Baseline Stats===========\")\n", - "df_dji_ = get_baseline(\n", - " ticker=\"^DJI\", \n", - " start = TRADE_START_DATE,\n", - " end = TRADE_END_DATE)\n", - "stats = backtest_stats(df_dji_, value_col_name = 'close')\n", - "df_dji = pd.DataFrame()\n", - "df_dji['date'] = df_account_value_a2c['date']\n", - "df_dji['account_value'] = df_dji_['close'] / df_dji_['close'][0] * env_kwargs[\"initial_amount\"]\n", - "df_dji.to_csv(\"df_dji.csv\")\n", - "df_dji = df_dji.set_index(df_dji.columns[0])\n", - "df_dji.to_csv(\"df_dji+.csv\")\n", - "\n", - "result = pd.DataFrame()\n", - "result = pd.merge(result, df_result_a2c, how='outer', left_index=True, right_index=True)\n", - "result = pd.merge(result, df_result_ddpg, how='outer', left_index=True, right_index=True)\n", - "result = pd.merge(result, df_result_td3, how='outer', left_index=True, right_index=True)\n", - "result = pd.merge(result, df_result_ppo, how='outer', left_index=True, right_index=True)\n", - "result = pd.merge(result, df_result_sac, how='outer', left_index=True, right_index=True)\n", - "result = pd.merge(result, MVO_result, how='outer', left_index=True, right_index=True)\n", - "print(result.head())\n", - "result = pd.merge(result, df_dji, how='outer', left_index=True, right_index=True)\n", - "# result.columns = ['a2c', 'ddpg', 'td3', 'ppo', 'sac', 'mean var', 'dji']\n", - "\n", - "# print(\"result: \", result)\n", - "result.to_csv(\"result.csv\")" - ] - }, - { - "cell_type": "code", - "source": [ - "df_result_ddpg" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 455 - }, - "id": "WLapAJTri_7B", - "outputId": "d9625b21-8814-4ec5-bc6e-3a331be40856" - }, - "execution_count": 141, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " ddpg\n", - "date \n", - "2021-10-01 1.000000e+06\n", - "2021-10-04 9.977126e+05\n", - "2021-10-05 1.003342e+06\n", - "2021-10-06 1.004220e+06\n", - "2021-10-07 1.010823e+06\n", - "... ...\n", - "2023-02-21 9.815355e+05\n", - "2023-02-22 9.794530e+05\n", - "2023-02-23 9.820209e+05\n", - "2023-02-24 9.739605e+05\n", - "2023-02-27 9.752743e+05\n", - "\n", - "[353 rows x 1 columns]" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ddpg
date
2021-10-011.000000e+06
2021-10-049.977126e+05
2021-10-051.003342e+06
2021-10-061.004220e+06
2021-10-071.010823e+06
......
2023-02-219.815355e+05
2023-02-229.794530e+05
2023-02-239.820209e+05
2023-02-249.739605e+05
2023-02-279.752743e+05
\n", - "

353 rows × 1 columns

\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 141 - } - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "yfv52r2G33jY" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gXaoZs2lh1hi" + }, + "source": [ + "# Deep Reinforcement Learning for Stock Trading from Scratch: Multiple Stock Trading\n", + "\n", + "* **Pytorch Version** \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lGunVt8oLCVS" + }, + "source": [ + "# Content" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HOzAKQ-SLGX6" + }, + "source": [ + "* [1. Task Description](#0)\n", + "* [2. Install Python packages](#1)\n", + " * [2.1. Install Packages](#1.1) \n", + " * [2.2. A List of Python Packages](#1.2)\n", + " * [2.3. Import Packages](#1.3)\n", + " * [2.4. Create Folders](#1.4)\n", + "* [3. Download and Preprocess 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 Market Environment in OpenAI Gym-style](#4) \n", + " * [5.1. Data Split](#4.1) \n", + " * [5.3. Environment for Training](#4.2) \n", + "* [6. Train DRL Agents](#5)\n", + "* [7. Backtesting Performance](#6) \n", + " * [7.1. BackTestStats](#6.1)\n", + " * [7.2. BackTestPlot](#6.2) \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sApkDlD9LIZv" + }, + "source": [ + "\n", + "# Part 1. Task Discription" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HjLD2TZSLKZ-" + }, + "source": [ + "We train a DRL agent for stock trading. This task is modeled as a Markov Decision Process (MDP), and the objective function is maximizing (expected) cumulative return.\n", + "\n", + "We specify the state-action-reward as follows:\n", + "\n", + "* **State s**: The state space represents an agent's perception of the market environment. Just like a human trader analyzing various information, here our agent passively observes many features and learns by interacting with the market environment (usually by replaying historical data).\n", + "\n", + "* **Action a**: The action space includes allowed actions that an agent can take at each state. For example, a ∈ {−1, 0, 1}, where −1, 0, 1 represent\n", + "selling, holding, and buying. When an action operates multiple shares, a ∈{−k, ..., −1, 0, 1, ..., k}, e.g.. \"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′)**: Reward is an incentive for an agent to learn a better policy. For example, it can be the change of the portfolio value when taking a at state s and arriving at new state s', i.e., r(s, a, s′) = v′ − v, where v′ and v represent the portfolio values at state s′ and s, respectively\n", + "\n", + "\n", + "**Market environment**: 30 consituent stocks of Dow Jones Industrial Average (DJIA) index. Accessed at the starting date of the testing period.\n", + "\n", + "\n", + "The data 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. Install Python Packages" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Uy5_PTmOh1hj" + }, + "source": [ + "\n", + "## 2.1. Install packages\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mPT0ipYE28wL", + "outputId": "6dad74d2-c37f-4b86-c584-2436d2ef5bae" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: swig in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (4.3.0)\n", + "Requirement already satisfied: wrds in /home/random/.local/lib/python3.12/site-packages (3.2.0)\n", + "Requirement already satisfied: numpy<1.27,>=1.26 in /home/random/.local/lib/python3.12/site-packages (from wrds) (1.26.4)\n", + "Requirement already satisfied: packaging<23.3 in /home/random/.local/lib/python3.12/site-packages (from wrds) (23.2)\n", + "Requirement already satisfied: pandas<2.3,>=2.2 in /home/random/.local/lib/python3.12/site-packages (from wrds) (2.2.3)\n", + "Requirement already satisfied: psycopg2-binary<2.10,>=2.9 in /home/random/.local/lib/python3.12/site-packages (from wrds) (2.9.10)\n", + "Requirement already satisfied: scipy<1.13,>=1.12 in /home/random/.local/lib/python3.12/site-packages (from wrds) (1.12.0)\n", + "Requirement already satisfied: sqlalchemy<2.1,>=2 in /home/random/.local/lib/python3.12/site-packages (from wrds) (2.0.36)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /home/random/.local/lib/python3.12/site-packages (from pandas<2.3,>=2.2->wrds) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from pandas<2.3,>=2.2->wrds) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /home/random/.local/lib/python3.12/site-packages (from pandas<2.3,>=2.2->wrds) (2024.2)\n", + "Requirement already satisfied: typing-extensions>=4.6.0 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from sqlalchemy<2.1,>=2->wrds) (4.12.2)\n", + "Requirement already satisfied: greenlet!=0.4.17 in /home/random/.local/lib/python3.12/site-packages (from sqlalchemy<2.1,>=2->wrds) (3.1.1)\n", + "Requirement already satisfied: six>=1.5 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas<2.3,>=2.2->wrds) (1.16.0)\n", + "Requirement already satisfied: pyportfolioopt in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (1.5.6)\n", + "Requirement already satisfied: cvxpy>=1.1.19 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from pyportfolioopt) (1.6.0)\n", + "Requirement already satisfied: ecos<3.0.0,>=2.0.14 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from pyportfolioopt) (2.0.14)\n", + "Requirement already satisfied: numpy>=1.26.0 in /home/random/.local/lib/python3.12/site-packages (from pyportfolioopt) (1.26.4)\n", + "Requirement already satisfied: pandas>=0.19 in /home/random/.local/lib/python3.12/site-packages (from pyportfolioopt) (2.2.3)\n", + "Requirement already satisfied: plotly<6.0.0,>=5.0.0 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from pyportfolioopt) (5.24.1)\n", + "Requirement already satisfied: scipy>=1.3 in /home/random/.local/lib/python3.12/site-packages (from pyportfolioopt) (1.12.0)\n", + "Requirement already satisfied: osqp>=0.6.2 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from cvxpy>=1.1.19->pyportfolioopt) (0.6.7.post3)\n", + "Requirement already satisfied: clarabel>=0.5.0 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from cvxpy>=1.1.19->pyportfolioopt) (0.9.0)\n", + "Requirement already satisfied: scs>=3.2.4.post1 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from cvxpy>=1.1.19->pyportfolioopt) (3.2.7)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /home/random/.local/lib/python3.12/site-packages (from pandas>=0.19->pyportfolioopt) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from pandas>=0.19->pyportfolioopt) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /home/random/.local/lib/python3.12/site-packages (from pandas>=0.19->pyportfolioopt) (2024.2)\n", + "Requirement already satisfied: tenacity>=6.2.0 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from plotly<6.0.0,>=5.0.0->pyportfolioopt) (9.0.0)\n", + "Requirement already satisfied: packaging in /home/random/.local/lib/python3.12/site-packages (from plotly<6.0.0,>=5.0.0->pyportfolioopt) (23.2)\n", + "Requirement already satisfied: qdldl in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from osqp>=0.6.2->cvxpy>=1.1.19->pyportfolioopt) (0.1.7.post4)\n", + "Requirement already satisfied: six>=1.5 in /home/random/anaconda3/envs/finrl/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas>=0.19->pyportfolioopt) (1.16.0)\n", + "[sudo] password for random: cmake is already the newest version (3.28.3-1build7).\n", + "libopenmpi-dev is already the newest version (4.1.6-7ubuntu2).\n", + "python3-dev is already the newest version (3.12.3-0ubuntu2).\n", + "zlib1g-dev is already the newest version (1:1.3.dfsg-3.1ubuntu2.1).\n", + "libgl1-mesa-glx is already the newest version (23.0.4-0ubuntu1~22.04.1).\n", + "swig is already the newest version (4.2.0-2ubuntu1).\n", + "0 upgraded, 0 newly installed, 0 to remove and 39 not upgraded.\n", + "Collecting git+https://github.com/AI4Finance-Foundation/FinRL.git\n", + " Cloning https://github.com/AI4Finance-Foundation/FinRL.git to /tmp/pip-req-build-flt95p98\n", + " Running command git clone --filter=blob:none --quiet https://github.com/AI4Finance-Foundation/FinRL.git /tmp/pip-req-build-flt95p98\n", + " Resolved https://github.com/AI4Finance-Foundation/FinRL.git to commit ef471fcea1f3667442f5ecbf7b4c214610a5dd55\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", + "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hCollecting elegantrl@ git+https://github.com/AI4Finance-Foundation/ElegantRL.git (from finrl==0.3.6)\n", + " Cloning https://github.com/AI4Finance-Foundation/ElegantRL.git to /tmp/pip-install-u43l6ss9/elegantrl_36782baa6d82461e89b600dda61820c8\n", + " Running command git clone --filter=blob:none --quiet https://github.com/AI4Finance-Foundation/ElegantRL.git /tmp/pip-install-u43l6ss9/elegantrl_36782baa6d82461e89b600dda61820c8\n", + " Resolved https://github.com/AI4Finance-Foundation/ElegantRL.git to commit 59d9a33e2b3ba2d77c052c2810bb61059736d88c\n", + " Preparing metadata (setup.py) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: alpaca-trade-api<4,>=3 in /home/random/.local/lib/python3.12/site-packages (from finrl==0.3.6) (3.2.0)\n", + "Collecting ccxt<4,>=3 (from finrl==0.3.6)\n", + " Using cached ccxt-3.1.60-py2.py3-none-any.whl.metadata (108 kB)\n", + "Requirement already satisfied: exchange-calendars<5,>=4 in /home/random/.local/lib/python3.12/site-packages (from finrl==0.3.6) (4.6)\n", + "Collecting jqdatasdk<2,>=1 (from finrl==0.3.6)\n", + " Using cached jqdatasdk-1.9.7-py3-none-any.whl.metadata (5.8 kB)\n", + "Collecting pyfolio<0.10,>=0.9 (from finrl==0.3.6)\n", + " Using cached pyfolio-0.9.2.tar.gz (91 kB)\n", + " Preparing metadata (setup.py) ... \u001b[?25lerror\n", + " \u001b[1;31merror\u001b[0m: \u001b[1msubprocess-exited-with-error\u001b[0m\n", + " \n", + " \u001b[31m×\u001b[0m \u001b[32mpython setup.py egg_info\u001b[0m did not run successfully.\n", + " \u001b[31m│\u001b[0m exit code: \u001b[1;36m1\u001b[0m\n", + " \u001b[31m╰─>\u001b[0m \u001b[31m[18 lines of output]\u001b[0m\n", + " \u001b[31m \u001b[0m /tmp/pip-install-u43l6ss9/pyfolio_f61a15f976d345b4a7050d0999ff9c7b/versioneer.py:468: SyntaxWarning: invalid escape sequence '\\s'\n", + " \u001b[31m \u001b[0m LONG_VERSION_PY['git'] = '''\n", + " \u001b[31m \u001b[0m Traceback (most recent call last):\n", + " \u001b[31m \u001b[0m File \"\", line 2, in \n", + " \u001b[31m \u001b[0m File \"\", line 34, in \n", + " \u001b[31m \u001b[0m File \"/tmp/pip-install-u43l6ss9/pyfolio_f61a15f976d345b4a7050d0999ff9c7b/setup.py\", line 71, in \n", + " \u001b[31m \u001b[0m version=versioneer.get_version(),\n", + " \u001b[31m \u001b[0m ^^^^^^^^^^^^^^^^^^^^^^^^\n", + " \u001b[31m \u001b[0m File \"/tmp/pip-install-u43l6ss9/pyfolio_f61a15f976d345b4a7050d0999ff9c7b/versioneer.py\", line 1407, in get_version\n", + " \u001b[31m \u001b[0m return get_versions()[\"version\"]\n", + " \u001b[31m \u001b[0m ^^^^^^^^^^^^^^\n", + " \u001b[31m \u001b[0m File \"/tmp/pip-install-u43l6ss9/pyfolio_f61a15f976d345b4a7050d0999ff9c7b/versioneer.py\", line 1341, in get_versions\n", + " \u001b[31m \u001b[0m cfg = get_config_from_root(root)\n", + " \u001b[31m \u001b[0m ^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " \u001b[31m \u001b[0m File \"/tmp/pip-install-u43l6ss9/pyfolio_f61a15f976d345b4a7050d0999ff9c7b/versioneer.py\", line 399, in get_config_from_root\n", + " \u001b[31m \u001b[0m parser = configparser.SafeConfigParser()\n", + " \u001b[31m \u001b[0m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " \u001b[31m \u001b[0m AttributeError: module 'configparser' has no attribute 'SafeConfigParser'. Did you mean: 'RawConfigParser'?\n", + " \u001b[31m \u001b[0m \u001b[31m[end of output]\u001b[0m\n", + " \n", + " \u001b[1;35mnote\u001b[0m: This error originates from a subprocess, and is likely not a problem with pip.\n", + "\u001b[1;31merror\u001b[0m: \u001b[1mmetadata-generation-failed\u001b[0m\n", + "\n", + "\u001b[31m×\u001b[0m Encountered error while generating package metadata.\n", + "\u001b[31m╰─>\u001b[0m See above for output.\n", + "\n", + "\u001b[1;35mnote\u001b[0m: This is an issue with the package mentioned above, not pip.\n", + "\u001b[1;36mhint\u001b[0m: See above for details.\n", + "\u001b[?25h" + ] + } + ], + "source": [ + "## install required packages\n", + "!pip install swig\n", + "!pip install wrds\n", + "!pip install pyportfolioopt\n", + "## install finrl library\n", + "!pip install -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 git+https://github.com/AI4Finance-Foundation/FinRL.git" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "osBHhVysOEzi" + }, + "source": [ + "\n", + "\n", + "## 2.2. A list of Python packages \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", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lPqeTTwoh1hn", + "outputId": "e55033fc-48ae-4696-ae45-08b8bef664d5" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-01-04 15:29:19.697527: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n", + "2025-01-04 15:29:19.724461: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", + "E0000 00:00:1736000959.745993 24692 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "E0000 00:00:1736000959.755250 24692 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2025-01-04 15:29:19.798332: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "/home/random/anaconda3/envs/finrl/lib/python3.12/site-packages/pyfolio/pos.py:25: UserWarning: Module \"zipline.assets\" not found; multipliers 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", + "%matplotlib inline\n", + "\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\n", + "from stable_baselines3.common.logger import configure\n", + "from finrl.meta.data_processor import DataProcessor\n", + "from finrl.meta.data_processors.processor_yahoofinance import YahooFinanceProcessor\n", + "from finrl.plot import backtest_stats, backtest_plot, get_daily_return, get_baseline\n", + "from pprint import pprint\n", + "\n", + "import sys\n", + "sys.path.append(\"../FinRL\")\n", + "\n", + "import itertools" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "T2owTj985RW4" + }, + "source": [ + "\n", + "## 2.4. Create Folders" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "RtUc_ofKmpdy" + }, + "outputs": [], + "source": [ + "from finrl import config\n", + "from finrl import config_tickers\n", + "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", + "check_and_make_directories([DATA_SAVE_DIR, TRAINED_MODEL_DIR, TENSORBOARD_LOG_DIR, RESULTS_DIR])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A289rQWMh1hq" + }, + "source": [ + "\n", + "# Part 3. Download Data\n", + "Yahoo Finance provides stock data, financial news, financial reports, etc. Yahoo Finance is free.\n", + "* FinRL uses a class **YahooDownloader** in FinRL-Meta to fetch data via 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)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NPeQ7iS-LoMm" + }, + "source": [ + "\n", + "\n", + "-----\n", + "class YahooDownloader:\n", + " 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" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "id": "h3XJnvrbLp-C", + "outputId": "a03772b5-9cad-463f-e1d6-58d91a70a594" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'2020-07-31'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# from config.py, TRAIN_START_DATE is a string\n", + "TRAIN_START_DATE\n", + "# from config.py, TRAIN_END_DATE is a string\n", + "TRAIN_END_DATE" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "FUnY8WEfLq3C" + }, + "outputs": [], + "source": [ + "TRAIN_START_DATE = '2010-01-01'\n", + "TRAIN_END_DATE = '2021-10-01'\n", + "TRADE_START_DATE = '2021-10-01'\n", + "TRADE_END_DATE = '2023-03-01'" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "yCKm4om-s9kE", + "outputId": "fd758d58-8946-42ee-e2e3-16f4ac74add2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing AXP (1/3)... 33.33% complete.\n", + "Processing AMGN (2/3)... 66.67% complete.\n", + "Processing AAPL (3/3)... 100.00% complete.\n", + " Date Open High Low Close Adj Close Volume tick day\n", + "0 2010-01-04 7.62 7.66 7.59 7.64 6.45 493729600 AAPL 3\n", + "1 2010-01-04 56.63 57.87 56.56 57.72 40.92 5277400 AMGN 3\n", + "2 2010-01-04 40.81 41.10 40.39 40.92 32.83 6894300 AXP 3\n", + "3 2010-01-05 7.66 7.70 7.62 7.66 6.46 601904800 AAPL 4\n", + "4 2010-01-05 57.33 57.69 56.27 57.22 40.56 7882800 AMGN 4\n", + "5 2010-01-05 40.83 41.23 40.37 40.83 32.76 10641200 AXP 4\n", + "6 2010-01-06 7.66 7.69 7.53 7.53 6.36 552160000 AAPL 5\n", + "7 2010-01-06 56.94 57.39 56.50 56.79 40.26 6015100 AMGN 5\n", + "8 2010-01-06 41.23 41.67 41.17 41.49 33.29 8399400 AXP 5\n", + "9 2010-01-07 7.56 7.57 7.47 7.52 6.34 477131200 AAPL 6\n", + "10 2010-01-07 56.41 56.53 54.65 56.27 39.89 10371600 AMGN 6\n", + "11 2010-01-07 41.26 42.24 41.11 41.98 33.83 8981700 AXP 6\n", + "12 2010-01-08 7.51 7.57 7.47 7.57 6.39 447610800 AAPL 7\n", + "13 2010-01-08 56.07 56.83 55.64 56.77 40.24 6576000 AMGN 7\n", + "14 2010-01-08 41.76 42.48 41.40 41.95 33.80 7907700 AXP 7\n", + "15 2010-01-11 7.60 7.61 7.44 7.50 6.33 462229600 AAPL 10\n", + "16 2010-01-11 56.93 57.36 56.62 57.02 40.42 4062700 AMGN 10\n", + "17 2010-01-11 41.74 41.96 41.25 41.47 33.42 7396000 AXP 10\n", + "18 2010-01-12 7.47 7.49 7.37 7.42 6.26 594459600 AAPL 11\n", + "19 2010-01-12 57.14 57.42 54.82 56.03 39.72 11268300 AMGN 11\n", + "20 2010-01-12 41.27 42.35 41.25 42.02 33.86 12657300 AXP 11\n", + "21 2010-01-13 7.42 7.53 7.29 7.52 6.35 605892000 AAPL 12\n", + "22 2010-01-13 56.35 56.75 55.96 56.53 40.07 5056200 AMGN 12\n", + "23 2010-01-13 41.85 42.24 41.57 42.15 33.96 10137200 AXP 12\n", + "24 2010-01-14 7.50 7.52 7.47 7.48 6.31 432894000 AAPL 13\n", + "25 2010-01-14 56.35 56.53 55.91 56.16 39.81 4668900 AMGN 13\n", + "26 2010-01-14 42.04 42.74 42.02 42.68 34.39 8238400 AXP 13\n", + "27 2010-01-15 7.53 7.56 7.35 7.35 6.20 594067600 AAPL 14\n", + "28 2010-01-15 56.03 56.51 55.65 56.25 39.87 7240000 AMGN 14\n", + "29 2010-01-15 42.52 42.84 42.02 42.39 34.16 13629000 AXP 14\n", + "30 2010-01-19 7.44 7.69 7.40 7.68 6.48 730007600 AAPL 18\n", + "31 2010-01-19 56.41 57.75 56.24 57.55 40.80 8570100 AMGN 18\n", + "32 2010-01-19 42.24 43.05 42.11 42.96 34.62 9533800 AXP 18\n", + "33 2010-01-20 7.68 7.70 7.48 7.56 6.38 612152800 AAPL 19\n", + "34 2010-01-20 57.62 57.62 56.41 57.20 40.55 6625700 AMGN 19\n", + "35 2010-01-20 42.93 43.25 42.26 42.98 34.63 11643000 AXP 19\n", + "36 2010-01-21 7.57 7.62 7.40 7.43 6.27 608154400 AAPL 20\n", + "37 2010-01-21 57.43 57.56 56.31 56.63 40.14 5833700 AMGN 20\n", + "38 2010-01-21 42.99 43.10 41.53 42.16 33.97 16974300 AXP 20\n", + "39 2010-01-22 7.39 7.41 7.04 7.06 5.96 881767600 AAPL 21\n", + "40 2010-01-22 56.67 57.30 56.53 56.60 40.12 5967600 AMGN 21\n", + "41 2010-01-22 41.36 41.49 38.19 38.59 31.09 26170800 AXP 21\n", + "42 2010-01-25 7.23 7.31 7.15 7.25 6.12 1065699600 AAPL 24\n", + "43 2010-01-25 56.72 56.79 55.55 55.71 39.49 6719400 AMGN 24\n", + "44 2010-01-25 39.10 39.29 37.50 37.79 30.45 17587600 AXP 24\n", + "45 2010-01-26 7.36 7.63 7.24 7.36 6.20 1867110000 AAPL 25\n", + "46 2010-01-26 56.20 56.87 55.70 56.58 40.11 14880300 AMGN 25\n", + "47 2010-01-26 37.54 39.23 37.52 38.10 30.70 15709900 AXP 25\n", + "48 2010-01-27 7.39 7.52 7.13 7.42 6.26 1722568400 AAPL 26\n", + "49 2010-01-27 56.35 57.88 56.35 57.74 40.93 9695000 AMGN 26\n", + "50 2010-01-27 37.96 38.84 37.83 38.67 31.16 12908300 AXP 26\n", + "51 2010-01-28 7.32 7.34 7.10 7.12 6.00 1173502400 AAPL 27\n", + "52 2010-01-28 57.87 58.78 57.56 58.08 41.17 11638200 AMGN 27\n", + "53 2010-01-28 38.67 38.67 36.83 37.43 30.16 14148600 AXP 27\n", + "54 2010-01-29 7.18 7.22 6.79 6.86 5.79 1245952400 AAPL 28\n", + "55 2010-01-29 58.35 58.93 58.16 58.48 41.45 9465700 AMGN 28\n", + "56 2010-01-29 37.60 38.77 37.36 37.66 30.35 14219900 AXP 28\n" + ] + } + ], + "source": [ + "#df = YahooDownloader(start_date = TRAIN_START_DATE,\n", + "# end_date = TRADE_END_DATE,\n", + "# ticker_list = config_tickers.DOW_30_TICKER).fetch_data()\n", + "yfp = YahooFinanceProcessor()\n", + "df = yfp.scrap_data(['AXP', 'AMGN', 'AAPL'], '2010-01-01', '2010-02-01')\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JzqRRTOX6aFu", + "outputId": "58a21ede-016a-4eaf-db9f-aeb190b3f939" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "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(config_tickers.DOW_30_TICKER)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "CV3HrZHLh1hy", + "outputId": "c2cf4956-210b-4811-be12-0c7fd18b923c" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": 144, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 498 - }, - "id": "6xRfrqK4RVfq", - "outputId": "81bdf0b6-6471-4997-8ea0-a97ec5772d39" - }, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {} - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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oVKpRHBwsPj888/r7Zda/7yqMnLkSNGzZ88G33dDx7N8+XLh7e0tlEqluPvuu8U///zT4Oe4k7WFeTVmzBhhb28vlEqlCA8PF19//XW99z1u3LgaxxMZGWlsExMTI0JCQoRKpRIODg5izJgx4sKFC/X2TS1/XtX2+Wn+/PlCiNo/11/7+bs2x44dE/fee69QqVTCw8NDLF682OQ859XNuV1z64MPPhAdOnQQarVaaDQa0blzZ/Hxxx9XS0u8XnN+dn/66aeFj4+PUCqVwsnJSfTt27fZgl5CCCEJIQSIiIiIiIiIiIjaGG7XQEREREREREREbRIDX0RERERERERE1CYx8EVERERERERERG0SA19ERERERERERNQmMfBFRERERERERERtEgNfRERERERERETUJjHwRUREREREREREbRIDX0REREQtxAMPPIAXX3yxuYdBRERE1GYw8EVERETUCsXExECSJFy5cqW5h0JERETUYjHwRUREREREREREbRIDX0RERETNoKioCGPHjoWVlRXc3NywZMkSk/PffPMNunXrBmtra7i6uuKpp55CZmYmAODMmTPo3bs3AMDOzg6SJGH8+PEAAL1ej0WLFsHPzw8WFhbo1KkTfvrpp9t6b0REREQtBQNfRERERM3glVdewc6dO/Hrr7/izz//RExMDI4cOWI8X15ejrfeegvHjh3DL7/8gjNnzhiDW15eXvj5558BAKdOncKlS5ewbNkyAMCiRYvw9ddf49NPP8Xx48cxY8YMjB49Gjt37rzt90hERETU3CQhhGjuQRARERHdSQoLC+Hg4IBvv/0Wjz32GAAgJycHnp6emDx5MpYuXVrtmkOHDuGuu+5CQUEBrKysEBMTg969eyM3Nxe2trYAgLKyMtjb22Pr1q3o0aOH8dpnnnkGxcXFWLNmze24PSIiIqIWw6y5B0BERER0p0lOToZWq0X37t2Nx+zt7dG+fXvjz4cPH8Ybb7yBY8eOITc3F3q9HgCQlpaG0NDQGvtNSkpCcXExHnzwQZPjWq0WnTt3vgV3QkRERNSyMfBFRERE1MIUFRUhKioKUVFR+O677+Dk5IS0tDRERUVBq9XWel1hYSEAYOPGjfDw8DA5p1KpbumYiYiIiFoiBr6IiIiIbrOAgAAoFArs378f3t7eAIDc3FycPn0akZGRSEhIQHZ2NhYvXgwvLy8AhlTHaymVSgCATqczHgsNDYVKpUJaWhoiIyNv090QERERtVwMfBERERHdZlZWVpg4cSJeeeUVODg4wNnZGXPmzIFMZth3yNvbG0qlEsuXL8eUKVMQHx+Pt956y6QPHx8fSJKE33//HQMHDoSFhQWsra0xc+ZMzJgxA3q9Hvfeey/y8vKwZ88eaDQajBs3rjlul4iIiKjZcFdHIiIiombw7rvv4r777sOQIUPQr18/3HvvvejatSsAwMnJCatWrcKPP/6I0NBQLF68GO+9957J9R4eHliwYAFeffVVuLi4YNq0aQCAt956C/PmzcOiRYsQEhKChx56CBs3boSfn99tv0ciIiKi5sZdHYmIiIiIiIiIqE3iii8iIiIiIiIiImqTGPgiIiIiIiIiIqI2iYEvIiIiIiIiIiJqkxj4IiIiIiIiIiKiNomBLyIiIiIiIiIiapMY+CIiIiIiIiIiojaJgS8iIiIiIiIiImqTGPgiIiIiIiIiIqI2iYEvIiIiIiIiIiJqkxj4IiIiIiIiIiKiNomBLyIiIiIiIiIiapMY+CIiIiIiIiIiojbp/wP0GGmEHouLkgAAAABJRU5ErkJggg==\n" - }, - "metadata": {} - } - ], - "source": [ - "%matplotlib inline\n", - "plt.rcParams[\"figure.figsize\"] = (15,5)\n", - "plt.figure();\n", - "result.plot();" + "data": { + "text/plain": [ + "(57, 9)" ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" } - ], - "metadata": { + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { "colab": { - "collapsed_sections": [ - "Uy5_PTmOh1hj", - "A289rQWMh1hq", - "uqC6c40Zh1iH", - "-QsYaY0Dh1iw", - "uijiWgkuh1jB", - "MRiOtrywfAo1", - "_gDkU-j-fCmZ", - "3Zpv4S0-fDBv" - ], - "provenance": [] - }, - "kernelspec": { - "display_name": "base", - "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.8.5 (default, Sep 4 2020, 02:22:02) \n[Clang 10.0.0 ]" - }, - "vscode": { - "interpreter": { - "hash": "54cefccbf0f07c9750f12aa115c023dfa5ed4acecf9e7ad3bc9391869be60d0c" - } + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "id": "4hYkeaPiICHS", + "outputId": "6d7a1c0d-15dc-4adc-b776-f1020e173a5c" + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'date'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_24692/1255811168.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'date'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'tic'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mignore_index\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.12/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, by, axis, ascending, inplace, kind, na_position, ignore_index, key)\u001b[0m\n\u001b[1;32m 7168\u001b[0m \u001b[0;34mf\"\u001b[0m\u001b[0;34mLength of ascending (\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mascending\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\"\u001b[0m \u001b[0;31m# type: ignore[arg-type]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7169\u001b[0m \u001b[0;34mf\"\u001b[0m\u001b[0;34m != length of by (\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mby\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7170\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7171\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mby\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 7172\u001b[0;31m \u001b[0mkeys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_label_or_level_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mby\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7173\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7174\u001b[0m \u001b[0;31m# need to rewrap columns in Series to apply key function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7175\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.local/lib/python3.12/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, key, axis)\u001b[0m\n\u001b[1;32m 1907\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mother_axes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_values\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1908\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_is_level_reference\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1909\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_level_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_values\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1910\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1911\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1912\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1913\u001b[0m \u001b[0;31m# Check for duplicates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1914\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 'date'" + ] } + ], + "source": [ + "df.sort_values(['date','tic'],ignore_index=True).head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uqC6c40Zh1iH" + }, + "source": [ + "# Part 4: Preprocess Data\n", + "We need to check for missing data and do feature engineering to convert the data point into a state.\n", + "* **Adding technical indicators**. In practical trading, various information needs to be taken into account, such as historical prices, current holding shares, technical indicators, etc. Here, we demonstrate two trend-following technical indicators: MACD and RSI.\n", + "* **Adding turbulence index**. Risk-aversion reflects whether an investor prefers to protect 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 turbulence index that measures extreme fluctuation of asset price." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PmKP-1ii3RLS", + "outputId": "22fecb54-5555-4ec4-cb32-0a54f443e54e" + }, + "outputs": [], + "source": [ + "fe = FeatureEngineer(\n", + " use_technical_indicator=True,\n", + " tech_indicator_list = INDICATORS,\n", + " use_vix=True,\n", + " use_turbulence=True,\n", + " user_defined_feature = False)\n", + "\n", + "processed = fe.preprocess_data(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Kixon2tR3RLT" + }, + "outputs": [], + "source": [ + "list_ticker = processed[\"tic\"].unique().tolist()\n", + "list_date = list(pd.date_range(processed['date'].min(),processed['date'].max()).astype(str))\n", + "combination = list(itertools.product(list_date,list_ticker))\n", + "\n", + "processed_full = pd.DataFrame(combination,columns=[\"date\",\"tic\"]).merge(processed,on=[\"date\",\"tic\"],how=\"left\")\n", + "processed_full = processed_full[processed_full['date'].isin(processed['date'])]\n", + "processed_full = processed_full.sort_values(['date','tic'])\n", + "\n", + "processed_full = processed_full.fillna(0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "id": "grvhGJJII3Xn", + "outputId": "2af27938-0df3-4fea-e86d-7a361e71d2e2" + }, + "outputs": [], + "source": [ + "processed_full.sort_values(['date','tic'],ignore_index=True).head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "5vdORQ384Qx-" + }, + "outputs": [], + "source": [ + "mvo_df = processed_full.sort_values(['date','tic'],ignore_index=True)[['date','tic','close']]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-QsYaY0Dh1iw" + }, + "source": [ + "\n", + "# Part 5. Build A Market Environment in OpenAI Gym-style\n", + "The training process involves observing stock price change, taking an action and reward's calculation. By interacting with the market environment, the agent will eventually derive a trading strategy that may maximize (expected) rewards.\n", + "\n", + "Our market environment, based on OpenAI Gym, simulates stock markets with historical market data." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5TOhcryx44bb" + }, + "source": [ + "## Data Split\n", + "We split the data into training set and testing set as follows:\n", + "\n", + "Training data period: 2009-01-01 to 2020-07-01\n", + "\n", + "Trading data period: 2020-07-01 to 2021-10-31\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "W0qaVGjLtgbI", + "outputId": "4f16484e-811e-46cd-efee-54c6b309f5a5" + }, + "outputs": [], + "source": [ + "train = data_split(processed_full, TRAIN_START_DATE,TRAIN_END_DATE)\n", + "trade = data_split(processed_full, TRADE_START_DATE,TRADE_END_DATE)\n", + "train_length = len(train)\n", + "trade_length = len(trade)\n", + "print(train_length)\n", + "print(trade_length)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "id": "p52zNCOhTtLR", + "outputId": "d708401b-129f-495b-e691-7ab8666d6847" + }, + "outputs": [], + "source": [ + "train.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0 + }, + "id": "k9zU9YaTTvFq", + "outputId": "9080799c-a150-4414-c2de-a68c5e7c3a85" + }, + "outputs": [], + "source": [ + "trade.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zYN573SOHhxG", + "outputId": "f5dcfc60-af90-4aa0-8849-11848b3ef619" + }, + "outputs": [], + "source": [ + "INDICATORS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q2zqII8rMIqn", + "outputId": "b6f16ea3-8f52-44c7-ceb1-f58dabe3d1be" + }, + "outputs": [], + "source": [ + "stock_dimension = len(train.tic.unique())\n", + "state_space = 1 + 2*stock_dimension + len(INDICATORS)*stock_dimension\n", + "print(f\"Stock Dimension: {stock_dimension}, State Space: {state_space}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "AWyp84Ltto19" + }, + "outputs": [], + "source": [ + "buy_cost_list = sell_cost_list = [0.001] * stock_dimension\n", + "num_stock_shares = [0] * stock_dimension\n", + "\n", + "env_kwargs = {\n", + " \"hmax\": 100,\n", + " \"initial_amount\": 1000000,\n", + " \"num_stock_shares\": num_stock_shares,\n", + " \"buy_cost_pct\": buy_cost_list,\n", + " \"sell_cost_pct\": sell_cost_list,\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", + "}\n", + "\n", + "\n", + "e_train_gym = StockTradingEnv(df = train, **env_kwargs)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "64EoqOrQjiVf" + }, + "source": [ + "## Environment for Training\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xwSvvPjutpqS", + "outputId": "e8fc8f68-b8c9-47a8-e7d2-a6ed0715d216" + }, + "outputs": [], + "source": [ + "env_train, _ = e_train_gym.get_sb_env()\n", + "print(type(env_train))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HMNR5nHjh1iz" + }, + "source": [ + "\n", + "# Part 6: Train DRL Agents\n", + "* The DRL algorithms are from **Stable Baselines 3**. Users are also encouraged to try **ElegantRL** and **Ray RLlib**.\n", + "* FinRL includes fine-tuned standard DRL algorithms, such as DQN, DDPG, Multi-Agent DDPG, PPO, SAC, A2C and TD3. We also allow users to\n", + "design their own DRL algorithms by adapting these DRL algorithms." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "364PsqckttcQ" + }, + "outputs": [], + "source": [ + "agent = DRLAgent(env = env_train)\n", + "\n", + "if_using_a2c = True\n", + "if_using_ddpg = True\n", + "if_using_ppo = True\n", + "if_using_td3 = True\n", + "if_using_sac = True\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YDmqOyF9h1iz" + }, + "source": [ + "### Agent Training: 5 algorithms (A2C, DDPG, PPO, TD3, SAC)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uijiWgkuh1jB" + }, + "source": [ + "### Agent 1: A2C\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GUCnkn-HIbmj", + "outputId": "7112ce2a-0f62-4a9c-c8be-4443779b4ba0" + }, + "outputs": [], + "source": [ + "agent = DRLAgent(env = env_train)\n", + "model_a2c = agent.get_model(\"a2c\")\n", + "\n", + "if if_using_a2c:\n", + " # set up logger\n", + " tmp_path = RESULTS_DIR + '/a2c'\n", + " new_logger_a2c = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", + " # Set new logger\n", + " model_a2c.set_logger(new_logger_a2c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0GVpkWGqH4-D", + "outputId": "d00d9ef6-7489-4126-f53f-376612f48466" + }, + "outputs": [], + "source": [ + "trained_a2c = agent.train_model(model=model_a2c, \n", + " tb_log_name='a2c',\n", + " total_timesteps=50000) if if_using_a2c else None" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MRiOtrywfAo1" + }, + "source": [ + "### Agent 2: DDPG" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "M2YadjfnLwgt", + "outputId": "8c8b5e98-763c-453c-a280-1b4f3ac13510" + }, + "outputs": [], + "source": [ + "agent = DRLAgent(env = env_train)\n", + "model_ddpg = agent.get_model(\"ddpg\")\n", + "\n", + "if if_using_ddpg:\n", + " # set up logger\n", + " tmp_path = RESULTS_DIR + '/ddpg'\n", + " new_logger_ddpg = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", + " # Set new logger\n", + " model_ddpg.set_logger(new_logger_ddpg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tCDa78rqfO_a", + "outputId": "35589661-85de-42ca-b9f1-52cde7ded447" + }, + "outputs": [], + "source": [ + "trained_ddpg = agent.train_model(model=model_ddpg, \n", + " tb_log_name='ddpg',\n", + " total_timesteps=50000) if if_using_ddpg else None" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_gDkU-j-fCmZ" + }, + "source": [ + "### Agent 3: PPO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "y5D5PFUhMzSV", + "outputId": "2abd06c0-deca-457b-819b-3059c3f17645" + }, + "outputs": [], + "source": [ + "agent = DRLAgent(env = env_train)\n", + "PPO_PARAMS = {\n", + " \"n_steps\": 2048,\n", + " \"ent_coef\": 0.01,\n", + " \"learning_rate\": 0.00025,\n", + " \"batch_size\": 128,\n", + "}\n", + "model_ppo = agent.get_model(\"ppo\",model_kwargs = PPO_PARAMS)\n", + "\n", + "if if_using_ppo:\n", + " # set up logger\n", + " tmp_path = RESULTS_DIR + '/ppo'\n", + " new_logger_ppo = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", + " # Set new logger\n", + " model_ppo.set_logger(new_logger_ppo)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Gt8eIQKYM4G3", + "outputId": "26365c9a-f608-4dd4-9695-018b98d1036a" + }, + "outputs": [], + "source": [ + "trained_ppo = agent.train_model(model=model_ppo, \n", + " tb_log_name='ppo',\n", + " total_timesteps=50000) if if_using_ppo else None" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3Zpv4S0-fDBv" + }, + "source": [ + "### Agent 4: TD3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JSAHhV4Xc-bh", + "outputId": "db147b9a-163a-4d03-dd6c-9e89f0e8f421" + }, + "outputs": [], + "source": [ + "agent = DRLAgent(env = env_train)\n", + "TD3_PARAMS = {\"batch_size\": 100, \n", + " \"buffer_size\": 1000000, \n", + " \"learning_rate\": 0.001}\n", + "\n", + "model_td3 = agent.get_model(\"td3\",model_kwargs = TD3_PARAMS)\n", + "\n", + "if if_using_td3:\n", + " # set up logger\n", + " tmp_path = RESULTS_DIR + '/td3'\n", + " new_logger_td3 = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", + " # Set new logger\n", + " model_td3.set_logger(new_logger_td3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OSRxNYAxdKpU", + "outputId": "1d85d74c-54cf-4682-a34b-481a5aafe5d4" + }, + "outputs": [], + "source": [ + "trained_td3 = agent.train_model(model=model_td3, \n", + " tb_log_name='td3',\n", + " total_timesteps=50000) if if_using_td3 else None" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Dr49PotrfG01" + }, + "source": [ + "### Agent 5: SAC" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xwOhVjqRkCdM", + "outputId": "9018f9ed-0dff-4b75-c0b2-7566784c52cf" + }, + "outputs": [], + "source": [ + "agent = DRLAgent(env = env_train)\n", + "SAC_PARAMS = {\n", + " \"batch_size\": 128,\n", + " \"buffer_size\": 100000,\n", + " \"learning_rate\": 0.0001,\n", + " \"learning_starts\": 100,\n", + " \"ent_coef\": \"auto_0.1\",\n", + "}\n", + "\n", + "model_sac = agent.get_model(\"sac\",model_kwargs = SAC_PARAMS)\n", + "\n", + "if if_using_sac:\n", + " # set up logger\n", + " tmp_path = RESULTS_DIR + '/sac'\n", + " new_logger_sac = configure(tmp_path, [\"stdout\", \"csv\", \"tensorboard\"])\n", + " # Set new logger\n", + " model_sac.set_logger(new_logger_sac)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K8RSdKCckJyH", + "outputId": "bfa91496-f7e6-4d0f-fb77-bc9dd1797e81" + }, + "outputs": [], + "source": [ + "trained_sac = agent.train_model(model=model_sac, \n", + " tb_log_name='sac',\n", + " total_timesteps=50000) if if_using_sac else None" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f2wZgkQXh1jE" + }, + "source": [ + "## In-sample Performance\n", + "\n", + "Assume that the initial capital is $1,000,000." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bEv5KGC8h1jE" + }, + "source": [ + "### Set turbulence threshold\n", + "Set the turbulence threshold to be greater than the maximum of insample turbulence data. If current turbulence index is greater than the threshold, then we assume that the current market is volatile" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "efwBi84ch1jE" + }, + "outputs": [], + "source": [ + "data_risk_indicator = processed_full[(processed_full.date=TRAIN_START_DATE)]\n", + "insample_risk_indicator = data_risk_indicator.drop_duplicates(subset=['date'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VHZMBpSqh1jG", + "outputId": "3164bf6e-3b83-4bbf-ecd4-7688c6309e8c" + }, + "outputs": [], + "source": [ + "insample_risk_indicator.vix.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BDkszkMloRWT", + "outputId": "7e36e119-63e2-4379-f110-490836222522" + }, + "outputs": [], + "source": [ + "insample_risk_indicator.vix.quantile(0.996)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AL7hs7svnNWT", + "outputId": "13abfde5-de24-40b7-921e-385dd435b3e8" + }, + "outputs": [], + "source": [ + "insample_risk_indicator.turbulence.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "N78hfHckoqJ9", + "outputId": "b5f650e9-cf0a-4481-b519-b77c8a0b1b2a" + }, + "outputs": [], + "source": [ + "insample_risk_indicator.turbulence.quantile(0.996)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U5mmgQF_h1jQ" + }, + "source": [ + "### Trading (Out-of-sample Performance)\n", + "\n", + "We update periodically in order to take full advantage of the data, e.g., retrain quarterly, monthly or weekly. We also tune the parameters along the way, in this notebook we use the in-sample data from 2009-01 to 2020-07 to tune the parameters once, so there is some alpha decay here as the length of trade date extends. \n", + "\n", + "Numerous hyperparameters – e.g. the learning rate, the total number of samples to train on – influence the learning process and are usually determined by testing some variations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cIqoV0GSI52v" + }, + "outputs": [], + "source": [ + "e_trade_gym = StockTradingEnv(df = trade, turbulence_threshold = 70,risk_indicator_col='vix', **env_kwargs)\n", + "# env_trade, obs_trade = e_trade_gym.get_sb_env()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 357 + }, + "id": "W_XNgGsBMeVw", + "outputId": "13588f5a-daef-4a7b-c116-c737bf61e994" + }, + "outputs": [], + "source": [ + "trade.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lbFchno5j3xs", + "outputId": "5df880d8-ff14-4104-a2f8-a2d1a417cc1c" + }, + "outputs": [], + "source": [ + "trained_moedl = trained_a2c\n", + "df_account_value_a2c, df_actions_a2c = DRLAgent.DRL_prediction(\n", + " model=trained_moedl, \n", + " environment = e_trade_gym)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JbYljWGjj3pH", + "outputId": "2fb2632a-dd77-40f2-eeff-e4b3385727f2" + }, + "outputs": [], + "source": [ + "trained_moedl = trained_ddpg\n", + "df_account_value_ddpg, df_actions_ddpg = DRLAgent.DRL_prediction(\n", + " model=trained_moedl, \n", + " environment = e_trade_gym)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "74jNP2DBj3hb", + "outputId": "9659e354-3d56-4fe3-b6bb-81777d179c51" + }, + "outputs": [], + "source": [ + "trained_moedl = trained_ppo\n", + "df_account_value_ppo, df_actions_ppo = DRLAgent.DRL_prediction(\n", + " model=trained_moedl, \n", + " environment = e_trade_gym)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "S7VyGGJPj3SH", + "outputId": "a65b52c5-aba0-4e48-b111-481b514fcce2" + }, + "outputs": [], + "source": [ + "trained_moedl = trained_td3\n", + "df_account_value_td3, df_actions_td3 = DRLAgent.DRL_prediction(\n", + " model=trained_moedl, \n", + " environment = e_trade_gym)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eLOnL5eYh1jR", + "outputId": "3d9bf94b-2bb5-4091-dc7f-bfe2851dc0be" + }, + "outputs": [], + "source": [ + "trained_moedl = trained_sac\n", + "df_account_value_sac, df_actions_sac = DRLAgent.DRL_prediction(\n", + " model=trained_moedl, \n", + " environment = e_trade_gym)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ERxw3KqLkcP4", + "outputId": "219b1298-4a18-41a3-8390-788739158dd7" + }, + "outputs": [], + "source": [ + "df_account_value_a2c.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GcE-t08w6DaW" + }, + "source": [ + "\n", + "# Part 6.5: Mean Variance Optimization" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GzyHU-RokTaj" + }, + "source": [ + "Mean Variance optimization is a very classic strategy in portfolio management. Here, we go through the whole process to do the mean variance optimization and add it as a baseline to compare.\n", + "\n", + "First, process dataframe to the form for MVO weight calculation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ZaxdYAdRcA67" + }, + "outputs": [], + "source": [ + "def process_df_for_mvo(df):\n", + " df = df.sort_values(['date','tic'],ignore_index=True)[['date','tic','close']]\n", + " fst = df\n", + " fst = fst.iloc[0:stock_dimension, :]\n", + " tic = fst['tic'].tolist()\n", + "\n", + " mvo = pd.DataFrame()\n", + "\n", + " for k in range(len(tic)):\n", + " mvo[tic[k]] = 0\n", + "\n", + " for i in range(df.shape[0]//stock_dimension):\n", + " n = df\n", + " n = n.iloc[i * stock_dimension:(i+1) * stock_dimension, :]\n", + " date = n['date'][i*stock_dimension]\n", + " mvo.loc[date] = n['close'].tolist()\n", + " \n", + " return mvo" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tcHDZ7hFkdyL" + }, + "source": [ + "### Helper functions for mean returns and variance-covariance matrix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "gKjY9bvYcEkb" + }, + "outputs": [], + "source": [ + "# Codes in this section partially refer to Dr G A Vijayalakshmi Pai\n", + "\n", + "# https://www.kaggle.com/code/vijipai/lesson-5-mean-variance-optimization-of-portfolios/notebook\n", + "\n", + "def StockReturnsComputing(StockPrice, Rows, Columns): \n", + " import numpy as np \n", + " StockReturn = np.zeros([Rows-1, Columns]) \n", + " for j in range(Columns): # j: Assets \n", + " for i in range(Rows-1): # i: Daily Prices \n", + " StockReturn[i,j]=((StockPrice[i+1, j]-StockPrice[i,j])/StockPrice[i,j])* 100 \n", + " \n", + " return StockReturn" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CPnMNonxkj-I" + }, + "source": [ + "### Calculate the weights for mean-variance" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wdF2erPNcVd3" + }, + "outputs": [], + "source": [ + "train_mvo = data_split(processed_full, TRAIN_START_DATE,TRAIN_END_DATE).reset_index()\n", + "trade_mvo = data_split(processed_full, TRADE_START_DATE,TRADE_END_DATE).reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9-64xYTOcJ36", + "outputId": "5cf98bac-c467-4ef1-e98c-2bb858a848c2" + }, + "outputs": [], + "source": [ + "StockData = process_df_for_mvo(train_mvo)\n", + "TradeData = process_df_for_mvo(trade_mvo)\n", + "\n", + "TradeData.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "28q2-ebfcfbu", + "outputId": "3a51ec82-f586-4462-f5d1-604017ffa1fe" + }, + "outputs": [], + "source": [ + "#compute asset returns\n", + "arStockPrices = np.asarray(StockData)\n", + "[Rows, Cols]=arStockPrices.shape\n", + "arReturns = StockReturnsComputing(arStockPrices, Rows, Cols)\n", + "\n", + "#compute mean returns and variance covariance matrix of returns\n", + "meanReturns = np.mean(arReturns, axis = 0)\n", + "covReturns = np.cov(arReturns, rowvar=False)\n", + " \n", + "#set precision for printing results\n", + "np.set_printoptions(precision=3, suppress = True)\n", + "\n", + "#display mean returns and variance-covariance matrix of returns\n", + "print('Mean returns of assets in k-portfolio 1\\n', meanReturns)\n", + "print('Variance-Covariance matrix of returns\\n', covReturns)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ei3f_NxDkpOx" + }, + "source": [ + "### Use PyPortfolioOpt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bHc3FC3Hckay", + "outputId": "6585f4b7-fda4-4d83-c3cc-38c5ed750aea" + }, + "outputs": [], + "source": [ + "from pypfopt.efficient_frontier import EfficientFrontier\n", + "\n", + "ef_mean = EfficientFrontier(meanReturns, covReturns, weight_bounds=(0, 0.5))\n", + "raw_weights_mean = ef_mean.max_sharpe()\n", + "cleaned_weights_mean = ef_mean.clean_weights()\n", + "mvo_weights = np.array([1000000 * cleaned_weights_mean[i] for i in range(29)])\n", + "mvo_weights" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iFiwDj29ck9s", + "outputId": "1e4c7967-c5af-43de-a858-beadfef5116c" + }, + "outputs": [], + "source": [ + "LastPrice = np.array([1/p for p in StockData.tail(1).to_numpy()[0]])\n", + "Initial_Portfolio = np.multiply(mvo_weights, LastPrice)\n", + "Initial_Portfolio" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "wbcVsNYfcn2B" + }, + "outputs": [], + "source": [ + "Portfolio_Assets = TradeData @ Initial_Portfolio\n", + "MVO_result = pd.DataFrame(Portfolio_Assets, columns=[\"Mean Var\"])\n", + "# MVO_result" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "W6vvNSC6h1jZ" + }, + "source": [ + "\n", + "# Part 7: Backtesting Results\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": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KeDeGAc9VrEg", + "outputId": "fe8802d9-e883-48fb-ed8d-36a8236322f7" + }, + "outputs": [], + "source": [ + "df_result_a2c = df_account_value_a2c.set_index(df_account_value_a2c.columns[0])\n", + "df_result_a2c.rename(columns = {'account_value':'a2c'}, inplace = True)\n", + "df_result_ddpg = df_account_value_ddpg.set_index(df_account_value_ddpg.columns[0])\n", + "df_result_ddpg.rename(columns = {'account_value':'ddpg'}, inplace = True)\n", + "df_result_td3 = df_account_value_td3.set_index(df_account_value_td3.columns[0])\n", + "df_result_td3.rename(columns = {'account_value':'td3'}, inplace = True)\n", + "df_result_ppo = df_account_value_ppo.set_index(df_account_value_ppo.columns[0])\n", + "df_result_ppo.rename(columns = {'account_value':'ppo'}, inplace = True)\n", + "df_result_sac = df_account_value_sac.set_index(df_account_value_sac.columns[0])\n", + "df_result_sac.rename(columns = {'account_value':'sac'}, inplace = True)\n", + "df_account_value_a2c.to_csv(\"df_account_value_a2c.csv\")\n", + "#baseline stats\n", + "print(\"==============Get Baseline Stats===========\")\n", + "df_dji_ = get_baseline(\n", + " ticker=\"^DJI\", \n", + " start = TRADE_START_DATE,\n", + " end = TRADE_END_DATE)\n", + "stats = backtest_stats(df_dji_, value_col_name = 'close')\n", + "df_dji = pd.DataFrame()\n", + "df_dji['date'] = df_account_value_a2c['date']\n", + "df_dji['account_value'] = df_dji_['close'] / df_dji_['close'][0] * env_kwargs[\"initial_amount\"]\n", + "df_dji.to_csv(\"df_dji.csv\")\n", + "df_dji = df_dji.set_index(df_dji.columns[0])\n", + "df_dji.to_csv(\"df_dji+.csv\")\n", + "\n", + "result = pd.DataFrame()\n", + "result = pd.merge(result, df_result_a2c, how='outer', left_index=True, right_index=True)\n", + "result = pd.merge(result, df_result_ddpg, how='outer', left_index=True, right_index=True)\n", + "result = pd.merge(result, df_result_td3, how='outer', left_index=True, right_index=True)\n", + "result = pd.merge(result, df_result_ppo, how='outer', left_index=True, right_index=True)\n", + "result = pd.merge(result, df_result_sac, how='outer', left_index=True, right_index=True)\n", + "result = pd.merge(result, MVO_result, how='outer', left_index=True, right_index=True)\n", + "print(result.head())\n", + "result = pd.merge(result, df_dji, how='outer', left_index=True, right_index=True)\n", + "# result.columns = ['a2c', 'ddpg', 'td3', 'ppo', 'sac', 'mean var', 'dji']\n", + "\n", + "# print(\"result: \", result)\n", + "result.to_csv(\"result.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 455 + }, + "id": "WLapAJTri_7B", + "outputId": "d9625b21-8814-4ec5-bc6e-3a331be40856" + }, + "outputs": [], + "source": [ + "df_result_ddpg" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 498 + }, + "id": "6xRfrqK4RVfq", + "outputId": "81bdf0b6-6471-4997-8ea0-a97ec5772d39" + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "plt.rcParams[\"figure.figsize\"] = (15,5)\n", + "plt.figure();\n", + "result.plot();" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "Uy5_PTmOh1hj", + "A289rQWMh1hq", + "uqC6c40Zh1iH", + "-QsYaY0Dh1iw", + "uijiWgkuh1jB", + "MRiOtrywfAo1", + "_gDkU-j-fCmZ", + "3Zpv4S0-fDBv" + ], + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.12.8" }, - "nbformat": 4, - "nbformat_minor": 0 + "vscode": { + "interpreter": { + "hash": "54cefccbf0f07c9750f12aa115c023dfa5ed4acecf9e7ad3bc9391869be60d0c" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/finrl/meta/data_processors/processor_yahoofinance.py b/finrl/meta/data_processors/processor_yahoofinance.py index 11c4c2da0..6c05d588e 100644 --- a/finrl/meta/data_processors/processor_yahoofinance.py +++ b/finrl/meta/data_processors/processor_yahoofinance.py @@ -3,6 +3,7 @@ from __future__ import annotations import datetime +import time from datetime import date from datetime import timedelta from sqlite3 import Timestamp @@ -19,7 +20,16 @@ import pandas as pd import pytz import yfinance as yf +from bs4 import BeautifulSoup +from selenium import webdriver +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.common.by import By from stockstats import StockDataFrame as Sdf +from webdriver_manager.chrome import ChromeDriverManager + +### Added by aymeric75 for scrap_data function class YahooFinanceProcessor: @@ -56,6 +66,119 @@ def __init__(self): ... """ + ######## ADDED BY aymeric75 ################### + + def date_to_unix(self, date_str) -> int: + """Convert a date string in yyyy-mm-dd format to Unix timestamp.""" + dt = datetime.datetime.strptime(date_str, "%Y-%m-%d") + return int(dt.timestamp()) + + def fetch_stock_data(self, stock_name, period1, period2) -> pd.DataFrame: + # Base URL + url = f"https://finance.yahoo.com/quote/{stock_name}/history/?period1={period1}&period2={period2}&filter=history" + + # Selenium WebDriver Setup + options = Options() + options.add_argument("--headless") # Headless for performance + options.add_argument("--disable-gpu") # Disable GPU for compatibility + driver = webdriver.Chrome( + service=Service(ChromeDriverManager().install()), options=options + ) + + # Navigate to the URL + driver.get(url) + driver.maximize_window() + time.sleep(5) # Wait for redirection and page load + + # Handle potential popup + try: + RejectAll = driver.find_element( + By.XPATH, '//button[@class="btn secondary reject-all"]' + ) + action = ActionChains(driver) + action.click(on_element=RejectAll) + action.perform() + time.sleep(5) + + except Exception as e: + print("Popup not found or handled:", e) + + # Parse the page for the table + soup = BeautifulSoup(driver.page_source, "html.parser") + table = soup.find("table") + if not table: + raise Exception("No table found after handling redirection and popup.") + + # Extract headers + headers = [th.text.strip() for th in table.find_all("th")] + headers[4] = "Close" + headers[5] = "Adj Close" + headers = ["date", "open", "high", "low", "close", "adjcp", "volume"] + # , 'tic', 'day' + + # Extract rows + rows = [] + for tr in table.find_all("tr")[1:]: # Skip header row + cells = [td.text.strip() for td in tr.find_all("td")] + if len(cells) == len(headers): # Only add rows with correct column count + rows.append(cells) + + # Create DataFrame + df = pd.DataFrame(rows, columns=headers) + + # Convert columns to appropriate data types + def safe_convert(value, dtype): + try: + return dtype(value.replace(",", "")) + except ValueError: + return value + + df["open"] = df["open"].apply(lambda x: safe_convert(x, float)) + df["high"] = df["high"].apply(lambda x: safe_convert(x, float)) + df["low"] = df["low"].apply(lambda x: safe_convert(x, float)) + df["close"] = df["close"].apply(lambda x: safe_convert(x, float)) + df["adjcp"] = df["adjcp"].apply(lambda x: safe_convert(x, float)) + df["volume"] = df["volume"].apply(lambda x: safe_convert(x, int)) + + # Add 'tic' column + df["tic"] = stock_name + + # Add 'day' column + start_date = datetime.datetime.fromtimestamp(period1) + df["date"] = pd.to_datetime(df["date"]) + df["day"] = (df["date"] - start_date).dt.days + df = df[df["day"] >= 0] # Exclude rows with days before the start date + + # Reverse the DataFrame rows + df = df.iloc[::-1].reset_index(drop=True) + + return df + + def scrap_data(self, stock_names, start_date, end_date) -> pd.DataFrame: + """Fetch and combine stock data for multiple stock names.""" + period1 = self.date_to_unix(start_date) + period2 = self.date_to_unix(end_date) + + all_dataframes = [] + total_stocks = len(stock_names) + + for i, stock_name in enumerate(stock_names): + try: + print( + f"Processing {stock_name} ({i + 1}/{total_stocks})... {(i + 1) / total_stocks * 100:.2f}% complete." + ) + df = self.fetch_stock_data(stock_name, period1, period2) + all_dataframes.append(df) + except Exception as e: + print(f"Error fetching data for {stock_name}: {e}") + + combined_df = pd.concat(all_dataframes, ignore_index=True) + combined_df = combined_df.sort_values(by=["day", "tick"]).reset_index(drop=True) + + return combined_df + + ######## END ADDED BY aymeric75 ################### + def convert_interval(self, time_interval: str) -> str: # Convert FinRL 'standardised' time periods to Yahoo format: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo if time_interval in [