From e60c4d79bc30f38388d34f8761ca7fcf0bfb06ae Mon Sep 17 00:00:00 2001
From: dptrup69 <131466311+dptrup69@users.noreply.github.com>
Date: Sun, 19 May 2024 15:23:30 +0530
Subject: [PATCH] RL Model
Reinforcement Learning trading model on custom dataset using gym anytrading environment
---
RL Model/RL Trading.ipynb | 983 ++++++++++++++++++++++
RL Model/gmedata.csv | 252 ++++++
RL Model/requirents.txt | 0
Self Driving Car-RL/car.png | Bin 35597 -> 0 bytes
Self Driving Car-RL/map.png | Bin 88564 -> 0 bytes
Self Driving Car-RL/map2.png | Bin 74986 -> 0 bytes
Self Driving Car-RL/map3.png | Bin 112252 -> 0 bytes
Self Driving Car-RL/map4.png | Bin 35625 -> 0 bytes
Self Driving Car-RL/map5.png | Bin 38300 -> 0 bytes
Self Driving Car-RL/model.py | 264 ------
Self Driving Car-RL/tempCodeRunnerFile.py | 1 -
11 files changed, 1235 insertions(+), 265 deletions(-)
create mode 100644 RL Model/RL Trading.ipynb
create mode 100644 RL Model/gmedata.csv
create mode 100644 RL Model/requirents.txt
delete mode 100644 Self Driving Car-RL/car.png
delete mode 100644 Self Driving Car-RL/map.png
delete mode 100644 Self Driving Car-RL/map2.png
delete mode 100644 Self Driving Car-RL/map3.png
delete mode 100644 Self Driving Car-RL/map4.png
delete mode 100644 Self Driving Car-RL/map5.png
delete mode 100644 Self Driving Car-RL/model.py
delete mode 100644 Self Driving Car-RL/tempCodeRunnerFile.py
diff --git a/RL Model/RL Trading.ipynb b/RL Model/RL Trading.ipynb
new file mode 100644
index 00000000..11dbc612
--- /dev/null
+++ b/RL Model/RL Trading.ipynb
@@ -0,0 +1,983 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 0. Install and Import dependencies"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: tensorflow-gpu==1.15.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (1.15.0)\n",
+ "Requirement already satisfied: tensorflow==1.15.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (1.15.0)\n",
+ "Requirement already satisfied: stable-baselines in c:\\programdata\\anaconda3\\lib\\site-packages (2.10.1)\n",
+ "Requirement already satisfied: gym-anytrading in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (1.2.0)\n",
+ "Requirement already satisfied: gym in c:\\programdata\\anaconda3\\lib\\site-packages (0.18.0)\n",
+ "Requirement already satisfied: wrapt>=1.11.1 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.12.1)\n",
+ "Requirement already satisfied: protobuf>=3.6.1 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (3.14.0)\n",
+ "Requirement already satisfied: wheel>=0.26 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (0.36.2)\n",
+ "Requirement already satisfied: absl-py>=0.7.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (0.11.0)\n",
+ "Requirement already satisfied: grpcio>=1.8.6 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.32.0)\n",
+ "Requirement already satisfied: six>=1.10.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.15.0)\n",
+ "Requirement already satisfied: numpy<2.0,>=1.16.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.18.5)\n",
+ "Requirement already satisfied: keras-preprocessing>=1.0.5 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.1.2)\n",
+ "Requirement already satisfied: tensorflow-estimator==1.15.1 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.15.1)\n",
+ "Requirement already satisfied: termcolor>=1.1.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.1.0)\n",
+ "Requirement already satisfied: opt-einsum>=2.3.2 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (3.3.0)\n",
+ "Requirement already satisfied: gast==0.2.2 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (0.2.2)\n",
+ "Requirement already satisfied: google-pasta>=0.1.6 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (0.2.0)\n",
+ "Requirement already satisfied: astor>=0.6.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow-gpu==1.15.0) (0.8.1)\n",
+ "Requirement already satisfied: keras-applications>=1.0.8 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow-gpu==1.15.0) (1.0.8)\n",
+ "Requirement already satisfied: tensorboard<1.16.0,>=1.15.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorflow-gpu==1.15.0) (1.15.0)\n",
+ "Requirement already satisfied: scipy in c:\\programdata\\anaconda3\\lib\\site-packages (from stable-baselines) (1.2.1)\n",
+ "Requirement already satisfied: cloudpickle>=0.5.5 in c:\\programdata\\anaconda3\\lib\\site-packages (from stable-baselines) (1.2.1)\n",
+ "Requirement already satisfied: pandas in c:\\programdata\\anaconda3\\lib\\site-packages (from stable-baselines) (0.24.2)\n",
+ "Requirement already satisfied: opencv-python in c:\\programdata\\anaconda3\\lib\\site-packages (from stable-baselines) (4.5.1.48)\n",
+ "Requirement already satisfied: joblib in c:\\programdata\\anaconda3\\lib\\site-packages (from stable-baselines) (0.13.2)\n",
+ "Requirement already satisfied: matplotlib in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from stable-baselines) (3.2.2)\n",
+ "Requirement already satisfied: pyglet<=1.5.0,>=1.4.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from gym) (1.5.0)\n",
+ "Requirement already satisfied: Pillow<=7.2.0 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from gym) (7.2.0)\n",
+ "Requirement already satisfied: h5py in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from keras-applications>=1.0.8->tensorflow-gpu==1.15.0) (2.10.0)\n",
+ "Requirement already satisfied: werkzeug>=0.11.15 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow-gpu==1.15.0) (0.15.4)\n",
+ "Requirement already satisfied: setuptools>=41.0.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow-gpu==1.15.0) (41.0.1)\n",
+ "Requirement already satisfied: markdown>=2.6.8 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow-gpu==1.15.0) (3.3.3)\n",
+ "Requirement already satisfied: python-dateutil>=2.5.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas->stable-baselines) (2.8.0)\n",
+ "Requirement already satisfied: pytz>=2011k in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas->stable-baselines) (2019.1)\n",
+ "Requirement already satisfied: cycler>=0.10 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib->stable-baselines) (0.10.0)\n",
+ "Requirement already satisfied: kiwisolver>=1.0.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib->stable-baselines) (1.1.0)\n",
+ "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib->stable-baselines) (2.4.0)\n",
+ "Requirement already satisfied: future in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from pyglet<=1.5.0,>=1.4.0->gym) (0.18.2)\n",
+ "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in c:\\programdata\\anaconda3\\lib\\site-packages (from markdown>=2.6.8->tensorboard<1.16.0,>=1.15.0->tensorflow-gpu==1.15.0) (0.17)\n",
+ "Requirement already satisfied: zipp>=0.5 in c:\\programdata\\anaconda3\\lib\\site-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard<1.16.0,>=1.15.0->tensorflow-gpu==1.15.0) (0.5.1)\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install tensorflow-gpu==1.15.0 tensorflow==1.15.0 stable-baselines gym-anytrading gym"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:\n",
+ "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
+ "For more information, please see:\n",
+ " * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
+ " * https://github.com/tensorflow/addons\n",
+ " * https://github.com/tensorflow/io (for I/O related ops)\n",
+ "If you depend on functionality not listed there, please file an issue.\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Gym stuff\n",
+ "import gym\n",
+ "import gym_anytrading\n",
+ "\n",
+ "# Stable baselines - rl stuff\n",
+ "from stable_baselines.common.vec_env import DummyVecEnv\n",
+ "from stable_baselines import A2C\n",
+ "\n",
+ "# Processing libraries\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from matplotlib import pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 1. Bring in Marketwatch GME Data \n",
+ "https://www.marketwatch.com/investing/stock/gme/download-data?startDate=11/1/2019&endDate=03/12/2021"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv('data/gmedata.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Date | \n",
+ " Open | \n",
+ " High | \n",
+ " Low | \n",
+ " Close | \n",
+ " Volume | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 03/12/2021 | \n",
+ " 275.00 | \n",
+ " 295.50 | \n",
+ " 262.27 | \n",
+ " 264.5 | \n",
+ " 25,845,900 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 03/11/2021 | \n",
+ " 241.64 | \n",
+ " 281.50 | \n",
+ " 232.60 | \n",
+ " 260.0 | \n",
+ " 28,312,490 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 03/10/2021 | \n",
+ " 269.43 | \n",
+ " 348.50 | \n",
+ " 172.00 | \n",
+ " 265.0 | \n",
+ " 71,570,570 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 03/09/2021 | \n",
+ " 217.71 | \n",
+ " 249.85 | \n",
+ " 208.51 | \n",
+ " 246.9 | \n",
+ " 39,099,328 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 03/08/2021 | \n",
+ " 154.89 | \n",
+ " 210.87 | \n",
+ " 146.10 | \n",
+ " 194.5 | \n",
+ " 63,565,621 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Date Open High Low Close Volume\n",
+ "0 03/12/2021 275.00 295.50 262.27 264.5 25,845,900\n",
+ "1 03/11/2021 241.64 281.50 232.60 260.0 28,312,490\n",
+ "2 03/10/2021 269.43 348.50 172.00 265.0 71,570,570\n",
+ "3 03/09/2021 217.71 249.85 208.51 246.9 39,099,328\n",
+ "4 03/08/2021 154.89 210.87 146.10 194.5 63,565,621"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Date datetime64[ns]\n",
+ "Open float64\n",
+ "High float64\n",
+ "Low float64\n",
+ "Close float64\n",
+ "Volume object\n",
+ "dtype: object"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df['Date'] = pd.to_datetime(df['Date'])\n",
+ "df.dtypes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Open | \n",
+ " High | \n",
+ " Low | \n",
+ " Close | \n",
+ " Volume | \n",
+ "
\n",
+ " \n",
+ " Date | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 2021-03-12 | \n",
+ " 275.00 | \n",
+ " 295.50 | \n",
+ " 262.27 | \n",
+ " 264.5 | \n",
+ " 25,845,900 | \n",
+ "
\n",
+ " \n",
+ " 2021-03-11 | \n",
+ " 241.64 | \n",
+ " 281.50 | \n",
+ " 232.60 | \n",
+ " 260.0 | \n",
+ " 28,312,490 | \n",
+ "
\n",
+ " \n",
+ " 2021-03-10 | \n",
+ " 269.43 | \n",
+ " 348.50 | \n",
+ " 172.00 | \n",
+ " 265.0 | \n",
+ " 71,570,570 | \n",
+ "
\n",
+ " \n",
+ " 2021-03-09 | \n",
+ " 217.71 | \n",
+ " 249.85 | \n",
+ " 208.51 | \n",
+ " 246.9 | \n",
+ " 39,099,328 | \n",
+ "
\n",
+ " \n",
+ " 2021-03-08 | \n",
+ " 154.89 | \n",
+ " 210.87 | \n",
+ " 146.10 | \n",
+ " 194.5 | \n",
+ " 63,565,621 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Open High Low Close Volume\n",
+ "Date \n",
+ "2021-03-12 275.00 295.50 262.27 264.5 25,845,900\n",
+ "2021-03-11 241.64 281.50 232.60 260.0 28,312,490\n",
+ "2021-03-10 269.43 348.50 172.00 265.0 71,570,570\n",
+ "2021-03-09 217.71 249.85 208.51 246.9 39,099,328\n",
+ "2021-03-08 154.89 210.87 146.10 194.5 63,565,621"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.set_index('Date', inplace=True)\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "env = gym.make('stocks-v0', df=df, frame_bound=(5,100), window_size=5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 2.6450e+02, 0.0000e+00],\n",
+ " [ 2.6000e+02, -4.5000e+00],\n",
+ " [ 2.6500e+02, 5.0000e+00],\n",
+ " [ 2.4690e+02, -1.8100e+01],\n",
+ " [ 1.9450e+02, -5.2400e+01],\n",
+ " [ 1.3774e+02, -5.6760e+01],\n",
+ " [ 1.3235e+02, -5.3900e+00],\n",
+ " [ 1.2418e+02, -8.1700e+00],\n",
+ " [ 1.1818e+02, -6.0000e+00],\n",
+ " [ 1.2040e+02, 2.2200e+00],\n",
+ " [ 1.0174e+02, -1.8660e+01],\n",
+ " [ 1.0873e+02, 6.9900e+00],\n",
+ " [ 9.1710e+01, -1.7020e+01],\n",
+ " [ 4.4970e+01, -4.6740e+01],\n",
+ " [ 4.6000e+01, 1.0300e+00],\n",
+ " [ 4.0590e+01, -5.4100e+00],\n",
+ " [ 4.0690e+01, 1.0000e-01],\n",
+ " [ 4.5940e+01, 5.2500e+00],\n",
+ " [ 4.9510e+01, 3.5700e+00],\n",
+ " [ 5.2400e+01, 2.8900e+00],\n",
+ " [ 5.1100e+01, -1.3000e+00],\n",
+ " [ 5.1200e+01, 1.0000e-01],\n",
+ " [ 5.0310e+01, -8.9000e-01],\n",
+ " [ 6.0000e+01, 9.6900e+00],\n",
+ " [ 6.3770e+01, 3.7700e+00],\n",
+ " [ 5.3500e+01, -1.0270e+01],\n",
+ " [ 9.2410e+01, 3.8910e+01],\n",
+ " [ 9.0000e+01, -2.4100e+00],\n",
+ " [ 2.2500e+02, 1.3500e+02],\n",
+ " [ 3.2500e+02, 1.0000e+02],\n",
+ " [ 1.9360e+02, -1.3140e+02],\n",
+ " [ 3.4751e+02, 1.5391e+02],\n",
+ " [ 1.4798e+02, -1.9953e+02],\n",
+ " [ 7.6790e+01, -7.1190e+01],\n",
+ " [ 6.5010e+01, -1.1780e+01],\n",
+ " [ 4.3030e+01, -2.1980e+01],\n",
+ " [ 3.9120e+01, -3.9100e+00],\n",
+ " [ 3.9360e+01, 2.4000e-01],\n",
+ " [ 3.5500e+01, -3.8600e+00],\n",
+ " [ 3.9910e+01, 4.4100e+00],\n",
+ " [ 3.1400e+01, -8.5100e+00],\n",
+ " [ 1.9950e+01, -1.1450e+01],\n",
+ " [ 1.9940e+01, -1.0000e-02],\n",
+ " [ 1.7690e+01, -2.2500e+00],\n",
+ " [ 1.8080e+01, 3.9000e-01],\n",
+ " [ 1.8360e+01, 2.8000e-01],\n",
+ " [ 1.7370e+01, -9.9000e-01],\n",
+ " [ 1.7250e+01, -1.2000e-01],\n",
+ " [ 1.8840e+01, 1.5900e+00],\n",
+ " [ 1.9260e+01, 4.2000e-01],\n",
+ " [ 1.9380e+01, 1.2000e-01],\n",
+ " [ 2.0990e+01, 1.6100e+00],\n",
+ " [ 2.0150e+01, -8.4000e-01],\n",
+ " [ 2.0570e+01, 4.2000e-01],\n",
+ " [ 1.9460e+01, -1.1100e+00],\n",
+ " [ 1.5530e+01, -3.9300e+00],\n",
+ " [ 1.5630e+01, 1.0000e-01],\n",
+ " [ 1.4830e+01, -8.0000e-01],\n",
+ " [ 1.3850e+01, -9.8000e-01],\n",
+ " [ 1.3850e+01, 0.0000e+00],\n",
+ " [ 1.2720e+01, -1.1300e+00],\n",
+ " [ 1.3310e+01, 5.9000e-01],\n",
+ " [ 1.4120e+01, 8.1000e-01],\n",
+ " [ 1.3660e+01, -4.6000e-01],\n",
+ " [ 1.6940e+01, 3.2800e+00],\n",
+ " [ 1.6350e+01, -5.9000e-01],\n",
+ " [ 1.6900e+01, 5.5000e-01],\n",
+ " [ 1.6120e+01, -7.8000e-01],\n",
+ " [ 1.6580e+01, 4.6000e-01],\n",
+ " [ 1.5800e+01, -7.8000e-01],\n",
+ " [ 1.6560e+01, 7.6000e-01],\n",
+ " [ 1.6080e+01, -4.8000e-01],\n",
+ " [ 1.4750e+01, -1.3300e+00],\n",
+ " [ 1.3670e+01, -1.0800e+00],\n",
+ " [ 1.3900e+01, 2.3000e-01],\n",
+ " [ 1.2710e+01, -1.1900e+00],\n",
+ " [ 1.2460e+01, -2.5000e-01],\n",
+ " [ 1.1570e+01, -8.9000e-01],\n",
+ " [ 1.1630e+01, 6.0000e-02],\n",
+ " [ 1.2060e+01, 4.3000e-01],\n",
+ " [ 1.1010e+01, -1.0500e+00],\n",
+ " [ 1.1130e+01, 1.2000e-01],\n",
+ " [ 1.1750e+01, 6.2000e-01],\n",
+ " [ 1.1100e+01, -6.5000e-01],\n",
+ " [ 1.1490e+01, 3.9000e-01],\n",
+ " [ 1.1860e+01, 3.7000e-01],\n",
+ " [ 1.1450e+01, -4.1000e-01],\n",
+ " [ 1.0910e+01, -5.4000e-01],\n",
+ " [ 1.1570e+01, 6.6000e-01],\n",
+ " [ 1.0750e+01, -8.2000e-01],\n",
+ " [ 1.0470e+01, -2.8000e-01],\n",
+ " [ 1.1730e+01, 1.2600e+00],\n",
+ " [ 1.1820e+01, 9.0000e-02],\n",
+ " [ 1.2690e+01, 8.7000e-01],\n",
+ " [ 1.3450e+01, 7.6000e-01],\n",
+ " [ 1.5000e+01, 1.5500e+00],\n",
+ " [ 1.4910e+01, -9.0000e-02],\n",
+ " [ 1.4100e+01, -8.1000e-01],\n",
+ " [ 1.3860e+01, -2.4000e-01],\n",
+ " [ 1.3910e+01, 5.0000e-02]])"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "env.signal_features"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 2. Build Environment"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Discrete(2)"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "env.action_space"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "info {'total_reward': 64.09000000000002, 'total_profit': 0.7841440186360266, 'position': 1}\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "