├── .gitignore ├── Custom Signals.ipynb └── data └── gmedata.csv /.gitignore: -------------------------------------------------------------------------------- 1 | Reinforcement Learning GME Trading Tutorial - Custom Signals.ipynb 2 | data/bitcoindata.csv 3 | logs 4 | train -------------------------------------------------------------------------------- /Custom Signals.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 0. Install and Import dependencies" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "!pip install tensorflow-gpu==1.15.0 tensorflow==1.15.0 stable-baselines gym-anytrading gym" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [ 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "WARNING:tensorflow:\n", 29 | "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n", 30 | "For more information, please see:\n", 31 | " * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n", 32 | " * https://github.com/tensorflow/addons\n", 33 | " * https://github.com/tensorflow/io (for I/O related ops)\n", 34 | "If you depend on functionality not listed there, please file an issue.\n", 35 | "\n" 36 | ] 37 | } 38 | ], 39 | "source": [ 40 | "# Gym stuff\n", 41 | "import gym\n", 42 | "import gym_anytrading\n", 43 | "\n", 44 | "# Stable baselines - rl stuff\n", 45 | "from stable_baselines.common.vec_env import DummyVecEnv\n", 46 | "from stable_baselines import A2C\n", 47 | "\n", 48 | "# Processing libraries\n", 49 | "import numpy as np\n", 50 | "import pandas as pd\n", 51 | "from matplotlib import pyplot as plt" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "# 1. Bring in Marketwatch GME Data \n", 59 | "https://www.marketwatch.com/investing/stock/gme/download-data?startDate=11/1/2019&endDate=03/12/2021" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 2, 65 | "metadata": {}, 66 | "outputs": [], 67 | "source": [ 68 | "df = pd.read_csv('data/gmedata.csv')" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 3, 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "data": { 78 | "text/html": [ 79 | "
\n", 80 | "\n", 93 | "\n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | "
DateOpenHighLowCloseVolume
003/12/2021275.00295.50262.27264.525,845,900
103/11/2021241.64281.50232.60260.028,312,490
203/10/2021269.43348.50172.00265.071,570,570
303/09/2021217.71249.85208.51246.939,099,328
403/08/2021154.89210.87146.10194.563,565,621
\n", 153 | "
" 154 | ], 155 | "text/plain": [ 156 | " Date Open High Low Close Volume\n", 157 | "0 03/12/2021 275.00 295.50 262.27 264.5 25,845,900\n", 158 | "1 03/11/2021 241.64 281.50 232.60 260.0 28,312,490\n", 159 | "2 03/10/2021 269.43 348.50 172.00 265.0 71,570,570\n", 160 | "3 03/09/2021 217.71 249.85 208.51 246.9 39,099,328\n", 161 | "4 03/08/2021 154.89 210.87 146.10 194.5 63,565,621" 162 | ] 163 | }, 164 | "execution_count": 3, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "df.head()" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 4, 176 | "metadata": {}, 177 | "outputs": [ 178 | { 179 | "data": { 180 | "text/plain": [ 181 | "Date datetime64[ns]\n", 182 | "Open float64\n", 183 | "High float64\n", 184 | "Low float64\n", 185 | "Close float64\n", 186 | "Volume object\n", 187 | "dtype: object" 188 | ] 189 | }, 190 | "execution_count": 4, 191 | "metadata": {}, 192 | "output_type": "execute_result" 193 | } 194 | ], 195 | "source": [ 196 | "df['Date'] = pd.to_datetime(df['Date'])\n", 197 | "df.dtypes" 198 | ] 199 | }, 200 | { 201 | "cell_type": "code", 202 | "execution_count": 5, 203 | "metadata": {}, 204 | "outputs": [ 205 | { 206 | "data": { 207 | "text/html": [ 208 | "
\n", 209 | "\n", 222 | "\n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | "
DateOpenHighLowCloseVolume
2502020-03-163.934.573.904.374,866,696
2492020-03-174.404.654.114.233,562,210
2482020-03-184.104.253.503.773,651,709
2472020-03-193.714.203.554.195,039,539
2462020-03-204.084.083.653.767,722,194
\n", 282 | "
" 283 | ], 284 | "text/plain": [ 285 | " Date Open High Low Close Volume\n", 286 | "250 2020-03-16 3.93 4.57 3.90 4.37 4,866,696\n", 287 | "249 2020-03-17 4.40 4.65 4.11 4.23 3,562,210\n", 288 | "248 2020-03-18 4.10 4.25 3.50 3.77 3,651,709\n", 289 | "247 2020-03-19 3.71 4.20 3.55 4.19 5,039,539\n", 290 | "246 2020-03-20 4.08 4.08 3.65 3.76 7,722,194" 291 | ] 292 | }, 293 | "execution_count": 5, 294 | "metadata": {}, 295 | "output_type": "execute_result" 296 | } 297 | ], 298 | "source": [ 299 | "df.sort_values('Date', ascending=True, inplace=True)\n", 300 | "df.head()" 301 | ] 302 | }, 303 | { 304 | "cell_type": "code", 305 | "execution_count": 6, 306 | "metadata": {}, 307 | "outputs": [ 308 | { 309 | "data": { 310 | "text/html": [ 311 | "
\n", 312 | "\n", 325 | "\n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | "
OpenHighLowCloseVolume
Date
2020-03-163.934.573.904.374,866,696
2020-03-174.404.654.114.233,562,210
2020-03-184.104.253.503.773,651,709
2020-03-193.714.203.554.195,039,539
2020-03-204.084.083.653.767,722,194
\n", 387 | "
" 388 | ], 389 | "text/plain": [ 390 | " Open High Low Close Volume\n", 391 | "Date \n", 392 | "2020-03-16 3.93 4.57 3.90 4.37 4,866,696\n", 393 | "2020-03-17 4.40 4.65 4.11 4.23 3,562,210\n", 394 | "2020-03-18 4.10 4.25 3.50 3.77 3,651,709\n", 395 | "2020-03-19 3.71 4.20 3.55 4.19 5,039,539\n", 396 | "2020-03-20 4.08 4.08 3.65 3.76 7,722,194" 397 | ] 398 | }, 399 | "execution_count": 6, 400 | "metadata": {}, 401 | "output_type": "execute_result" 402 | } 403 | ], 404 | "source": [ 405 | "df.set_index('Date', inplace=True)\n", 406 | "df.head()" 407 | ] 408 | }, 409 | { 410 | "cell_type": "code", 411 | "execution_count": 16, 412 | "metadata": {}, 413 | "outputs": [], 414 | "source": [ 415 | "env = gym.make('stocks-v0', df=df, frame_bound=(5,250), window_size=5)" 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": 17, 421 | "metadata": { 422 | "scrolled": true 423 | }, 424 | "outputs": [ 425 | { 426 | "data": { 427 | "text/plain": [ 428 | "array([[ 4.3700e+00, 0.0000e+00],\n", 429 | " [ 4.2300e+00, -1.4000e-01],\n", 430 | " [ 3.7700e+00, -4.6000e-01],\n", 431 | " [ 4.1900e+00, 4.2000e-01],\n", 432 | " [ 3.7600e+00, -4.3000e-01],\n", 433 | " [ 3.8100e+00, 5.0000e-02],\n", 434 | " [ 4.1600e+00, 3.5000e-01],\n", 435 | " [ 4.1700e+00, 1.0000e-02],\n", 436 | " [ 4.4100e+00, 2.4000e-01],\n", 437 | " [ 4.2200e+00, -1.9000e-01],\n", 438 | " [ 3.6500e+00, -5.7000e-01],\n", 439 | " [ 3.5000e+00, -1.5000e-01],\n", 440 | " [ 3.2500e+00, -2.5000e-01],\n", 441 | " [ 2.8500e+00, -4.0000e-01],\n", 442 | " [ 2.8000e+00, -5.0000e-02],\n", 443 | " [ 3.0900e+00, 2.9000e-01],\n", 444 | " [ 3.2700e+00, 1.8000e-01],\n", 445 | " [ 3.4100e+00, 1.4000e-01],\n", 446 | " [ 3.8900e+00, 4.8000e-01],\n", 447 | " [ 4.7400e+00, 8.5000e-01],\n", 448 | " [ 5.9500e+00, 1.2100e+00],\n", 449 | " [ 5.2700e+00, -6.8000e-01],\n", 450 | " [ 5.0300e+00, -2.4000e-01],\n", 451 | " [ 4.8800e+00, -1.5000e-01],\n", 452 | " [ 5.6100e+00, 7.3000e-01],\n", 453 | " [ 4.7800e+00, -8.3000e-01],\n", 454 | " [ 4.8900e+00, 1.1000e-01],\n", 455 | " [ 4.7000e+00, -1.9000e-01],\n", 456 | " [ 4.7700e+00, 7.0000e-02],\n", 457 | " [ 5.8200e+00, 1.0500e+00],\n", 458 | " [ 5.6400e+00, -1.8000e-01],\n", 459 | " [ 6.0400e+00, 4.0000e-01],\n", 460 | " [ 5.7300e+00, -3.1000e-01],\n", 461 | " [ 6.0500e+00, 3.2000e-01],\n", 462 | " [ 5.4800e+00, -5.7000e-01],\n", 463 | " [ 5.3900e+00, -9.0000e-02],\n", 464 | " [ 4.9300e+00, -4.6000e-01],\n", 465 | " [ 4.8700e+00, -6.0000e-02],\n", 466 | " [ 4.9800e+00, 1.1000e-01],\n", 467 | " [ 4.7600e+00, -2.2000e-01],\n", 468 | " [ 4.5400e+00, -2.2000e-01],\n", 469 | " [ 4.2100e+00, -3.3000e-01],\n", 470 | " [ 4.1300e+00, -8.0000e-02],\n", 471 | " [ 4.2200e+00, 9.0000e-02],\n", 472 | " [ 4.5800e+00, 3.6000e-01],\n", 473 | " [ 4.4400e+00, -1.4000e-01],\n", 474 | " [ 4.4300e+00, -1.0000e-02],\n", 475 | " [ 4.4400e+00, 1.0000e-02],\n", 476 | " [ 4.1800e+00, -2.6000e-01],\n", 477 | " [ 4.4200e+00, 2.4000e-01],\n", 478 | " [ 4.6900e+00, 2.7000e-01],\n", 479 | " [ 4.3300e+00, -3.6000e-01],\n", 480 | " [ 4.0600e+00, -2.7000e-01],\n", 481 | " [ 4.1300e+00, 7.0000e-02],\n", 482 | " [ 4.1800e+00, 5.0000e-02],\n", 483 | " [ 4.4400e+00, 2.6000e-01],\n", 484 | " [ 4.4700e+00, 3.0000e-02],\n", 485 | " [ 4.1400e+00, -3.3000e-01],\n", 486 | " [ 5.0100e+00, 8.7000e-01],\n", 487 | " [ 4.9600e+00, -5.0000e-02],\n", 488 | " [ 5.0700e+00, 1.1000e-01],\n", 489 | " [ 4.3700e+00, -7.0000e-01],\n", 490 | " [ 4.7200e+00, 3.5000e-01],\n", 491 | " [ 4.6900e+00, -3.0000e-02],\n", 492 | " [ 4.6400e+00, -5.0000e-02],\n", 493 | " [ 4.7600e+00, 1.2000e-01],\n", 494 | " [ 4.9500e+00, 1.9000e-01],\n", 495 | " [ 4.8800e+00, -7.0000e-02],\n", 496 | " [ 4.8700e+00, -1.0000e-02],\n", 497 | " [ 4.8300e+00, -4.0000e-02],\n", 498 | " [ 4.4100e+00, -4.2000e-01],\n", 499 | " [ 4.4600e+00, 5.0000e-02],\n", 500 | " [ 4.3500e+00, -1.1000e-01],\n", 501 | " [ 4.3800e+00, 3.0000e-02],\n", 502 | " [ 4.3400e+00, -4.0000e-02],\n", 503 | " [ 4.4400e+00, 1.0000e-01],\n", 504 | " [ 4.2900e+00, -1.5000e-01],\n", 505 | " [ 4.2400e+00, -5.0000e-02],\n", 506 | " [ 4.0900e+00, -1.5000e-01],\n", 507 | " [ 4.2600e+00, 1.7000e-01],\n", 508 | " [ 4.2100e+00, -5.0000e-02],\n", 509 | " [ 4.3400e+00, 1.3000e-01],\n", 510 | " [ 4.2600e+00, -8.0000e-02],\n", 511 | " [ 4.0800e+00, -1.8000e-01],\n", 512 | " [ 4.1900e+00, 1.1000e-01],\n", 513 | " [ 4.1700e+00, -2.0000e-02],\n", 514 | " [ 3.9600e+00, -2.1000e-01],\n", 515 | " [ 3.8500e+00, -1.1000e-01],\n", 516 | " [ 4.0100e+00, 1.6000e-01],\n", 517 | " [ 4.1100e+00, 1.0000e-01],\n", 518 | " [ 4.1100e+00, 0.0000e+00],\n", 519 | " [ 4.0300e+00, -8.0000e-02],\n", 520 | " [ 4.0100e+00, -2.0000e-02],\n", 521 | " [ 3.9400e+00, -7.0000e-02],\n", 522 | " [ 4.0600e+00, 1.2000e-01],\n", 523 | " [ 4.1000e+00, 4.0000e-02],\n", 524 | " [ 4.0100e+00, -9.0000e-02],\n", 525 | " [ 4.1500e+00, 1.4000e-01],\n", 526 | " [ 4.4300e+00, 2.8000e-01],\n", 527 | " [ 4.6300e+00, 2.0000e-01],\n", 528 | " [ 4.4300e+00, -2.0000e-01],\n", 529 | " [ 4.1600e+00, -2.7000e-01],\n", 530 | " [ 4.3300e+00, 1.7000e-01],\n", 531 | " [ 4.3500e+00, 2.0000e-02],\n", 532 | " [ 4.5200e+00, 1.7000e-01],\n", 533 | " [ 4.6400e+00, 1.2000e-01],\n", 534 | " [ 4.7500e+00, 1.1000e-01],\n", 535 | " [ 4.6300e+00, -1.2000e-01],\n", 536 | " [ 4.8100e+00, 1.8000e-01],\n", 537 | " [ 4.7200e+00, -9.0000e-02],\n", 538 | " [ 4.6100e+00, -1.1000e-01],\n", 539 | " [ 5.0300e+00, 4.2000e-01],\n", 540 | " [ 4.8700e+00, -1.6000e-01],\n", 541 | " [ 4.9800e+00, 1.1000e-01],\n", 542 | " [ 5.1100e+00, 1.3000e-01],\n", 543 | " [ 5.2500e+00, 1.4000e-01],\n", 544 | " [ 5.3900e+00, 1.4000e-01],\n", 545 | " [ 6.6800e+00, 1.2900e+00],\n", 546 | " [ 7.6500e+00, 9.7000e-01],\n", 547 | " [ 7.7100e+00, 6.0000e-02],\n", 548 | " [ 7.8200e+00, 1.1000e-01],\n", 549 | " [ 7.6500e+00, -1.7000e-01],\n", 550 | " [ 7.7000e+00, 5.0000e-02],\n", 551 | " [ 7.3500e+00, -3.5000e-01],\n", 552 | " [ 6.2300e+00, -1.1200e+00],\n", 553 | " [ 6.0900e+00, -1.4000e-01],\n", 554 | " [ 6.9100e+00, 8.2000e-01],\n", 555 | " [ 7.0900e+00, 1.8000e-01],\n", 556 | " [ 8.6800e+00, 1.5900e+00],\n", 557 | " [ 9.2000e+00, 5.2000e-01],\n", 558 | " [ 9.4700e+00, 2.7000e-01],\n", 559 | " [ 8.7500e+00, -7.2000e-01],\n", 560 | " [ 1.0560e+01, 1.8100e+00],\n", 561 | " [ 1.0040e+01, -5.2000e-01],\n", 562 | " [ 9.1400e+00, -9.0000e-01],\n", 563 | " [ 1.0020e+01, 8.8000e-01],\n", 564 | " [ 1.0090e+01, 7.0000e-02],\n", 565 | " [ 1.0350e+01, 2.6000e-01],\n", 566 | " [ 1.0200e+01, -1.5000e-01],\n", 567 | " [ 9.7700e+00, -4.3000e-01],\n", 568 | " [ 9.3900e+00, -3.8000e-01],\n", 569 | " [ 9.4600e+00, 7.0000e-02],\n", 570 | " [ 9.1300e+00, -3.3000e-01],\n", 571 | " [ 9.3600e+00, 2.3000e-01],\n", 572 | " [ 1.3490e+01, 4.1300e+00],\n", 573 | " [ 1.2020e+01, -1.4700e+00],\n", 574 | " [ 1.1800e+01, -2.2000e-01],\n", 575 | " [ 1.1880e+01, 8.0000e-02],\n", 576 | " [ 1.2250e+01, 3.7000e-01],\n", 577 | " [ 1.3830e+01, 1.5800e+00],\n", 578 | " [ 1.3310e+01, -5.2000e-01],\n", 579 | " [ 1.3910e+01, 6.0000e-01],\n", 580 | " [ 1.3860e+01, -5.0000e-02],\n", 581 | " [ 1.4100e+01, 2.4000e-01],\n", 582 | " [ 1.4910e+01, 8.1000e-01],\n", 583 | " [ 1.5000e+01, 9.0000e-02],\n", 584 | " [ 1.3450e+01, -1.5500e+00],\n", 585 | " [ 1.2690e+01, -7.6000e-01],\n", 586 | " [ 1.1820e+01, -8.7000e-01],\n", 587 | " [ 1.1730e+01, -9.0000e-02],\n", 588 | " [ 1.0470e+01, -1.2600e+00],\n", 589 | " [ 1.0750e+01, 2.8000e-01],\n", 590 | " [ 1.1570e+01, 8.2000e-01],\n", 591 | " [ 1.0910e+01, -6.6000e-01],\n", 592 | " [ 1.1450e+01, 5.4000e-01],\n", 593 | " [ 1.1860e+01, 4.1000e-01],\n", 594 | " [ 1.1490e+01, -3.7000e-01],\n", 595 | " [ 1.1100e+01, -3.9000e-01],\n", 596 | " [ 1.1750e+01, 6.5000e-01],\n", 597 | " [ 1.1130e+01, -6.2000e-01],\n", 598 | " [ 1.1010e+01, -1.2000e-01],\n", 599 | " [ 1.2060e+01, 1.0500e+00],\n", 600 | " [ 1.1630e+01, -4.3000e-01],\n", 601 | " [ 1.1570e+01, -6.0000e-02],\n", 602 | " [ 1.2460e+01, 8.9000e-01],\n", 603 | " [ 1.2710e+01, 2.5000e-01],\n", 604 | " [ 1.3900e+01, 1.1900e+00],\n", 605 | " [ 1.3670e+01, -2.3000e-01],\n", 606 | " [ 1.4750e+01, 1.0800e+00],\n", 607 | " [ 1.6080e+01, 1.3300e+00],\n", 608 | " [ 1.6560e+01, 4.8000e-01],\n", 609 | " [ 1.5800e+01, -7.6000e-01],\n", 610 | " [ 1.6580e+01, 7.8000e-01],\n", 611 | " [ 1.6120e+01, -4.6000e-01],\n", 612 | " [ 1.6900e+01, 7.8000e-01],\n", 613 | " [ 1.6350e+01, -5.5000e-01],\n", 614 | " [ 1.6940e+01, 5.9000e-01],\n", 615 | " [ 1.3660e+01, -3.2800e+00],\n", 616 | " [ 1.4120e+01, 4.6000e-01],\n", 617 | " [ 1.3310e+01, -8.1000e-01],\n", 618 | " [ 1.2720e+01, -5.9000e-01],\n", 619 | " [ 1.3850e+01, 1.1300e+00],\n", 620 | " [ 1.3850e+01, 0.0000e+00],\n", 621 | " [ 1.4830e+01, 9.8000e-01],\n", 622 | " [ 1.5630e+01, 8.0000e-01],\n", 623 | " [ 1.5530e+01, -1.0000e-01],\n", 624 | " [ 1.9460e+01, 3.9300e+00],\n", 625 | " [ 2.0570e+01, 1.1100e+00],\n", 626 | " [ 2.0150e+01, -4.2000e-01],\n", 627 | " [ 2.0990e+01, 8.4000e-01],\n", 628 | " [ 1.9380e+01, -1.6100e+00],\n", 629 | " [ 1.9260e+01, -1.2000e-01],\n", 630 | " [ 1.8840e+01, -4.2000e-01],\n", 631 | " [ 1.7250e+01, -1.5900e+00],\n", 632 | " [ 1.7370e+01, 1.2000e-01],\n", 633 | " [ 1.8360e+01, 9.9000e-01],\n", 634 | " [ 1.8080e+01, -2.8000e-01],\n", 635 | " [ 1.7690e+01, -3.9000e-01],\n", 636 | " [ 1.9940e+01, 2.2500e+00],\n", 637 | " [ 1.9950e+01, 1.0000e-02],\n", 638 | " [ 3.1400e+01, 1.1450e+01],\n", 639 | " [ 3.9910e+01, 8.5100e+00],\n", 640 | " [ 3.5500e+01, -4.4100e+00],\n", 641 | " [ 3.9360e+01, 3.8600e+00],\n", 642 | " [ 3.9120e+01, -2.4000e-01],\n", 643 | " [ 4.3030e+01, 3.9100e+00],\n", 644 | " [ 6.5010e+01, 2.1980e+01],\n", 645 | " [ 7.6790e+01, 1.1780e+01],\n", 646 | " [ 1.4798e+02, 7.1190e+01],\n", 647 | " [ 3.4751e+02, 1.9953e+02],\n", 648 | " [ 1.9360e+02, -1.5391e+02],\n", 649 | " [ 3.2500e+02, 1.3140e+02],\n", 650 | " [ 2.2500e+02, -1.0000e+02],\n", 651 | " [ 9.0000e+01, -1.3500e+02],\n", 652 | " [ 9.2410e+01, 2.4100e+00],\n", 653 | " [ 5.3500e+01, -3.8910e+01],\n", 654 | " [ 6.3770e+01, 1.0270e+01],\n", 655 | " [ 6.0000e+01, -3.7700e+00],\n", 656 | " [ 5.0310e+01, -9.6900e+00],\n", 657 | " [ 5.1200e+01, 8.9000e-01],\n", 658 | " [ 5.1100e+01, -1.0000e-01],\n", 659 | " [ 5.2400e+01, 1.3000e+00],\n", 660 | " [ 4.9510e+01, -2.8900e+00],\n", 661 | " [ 4.5940e+01, -3.5700e+00],\n", 662 | " [ 4.0690e+01, -5.2500e+00],\n", 663 | " [ 4.0590e+01, -1.0000e-01],\n", 664 | " [ 4.6000e+01, 5.4100e+00],\n", 665 | " [ 4.4970e+01, -1.0300e+00],\n", 666 | " [ 9.1710e+01, 4.6740e+01],\n", 667 | " [ 1.0873e+02, 1.7020e+01],\n", 668 | " [ 1.0174e+02, -6.9900e+00],\n", 669 | " [ 1.2040e+02, 1.8660e+01],\n", 670 | " [ 1.1818e+02, -2.2200e+00],\n", 671 | " [ 1.2418e+02, 6.0000e+00],\n", 672 | " [ 1.3235e+02, 8.1700e+00],\n", 673 | " [ 1.3774e+02, 5.3900e+00],\n", 674 | " [ 1.9450e+02, 5.6760e+01],\n", 675 | " [ 2.4690e+02, 5.2400e+01],\n", 676 | " [ 2.6500e+02, 1.8100e+01],\n", 677 | " [ 2.6000e+02, -5.0000e+00]])" 678 | ] 679 | }, 680 | "execution_count": 17, 681 | "metadata": {}, 682 | "output_type": "execute_result" 683 | } 684 | ], 685 | "source": [ 686 | "env.signal_features" 687 | ] 688 | }, 689 | { 690 | "cell_type": "markdown", 691 | "metadata": {}, 692 | "source": [ 693 | "# 2. Build Environment" 694 | ] 695 | }, 696 | { 697 | "cell_type": "code", 698 | "execution_count": 18, 699 | "metadata": {}, 700 | "outputs": [ 701 | { 702 | "data": { 703 | "text/plain": [ 704 | "Discrete(2)" 705 | ] 706 | }, 707 | "execution_count": 18, 708 | "metadata": {}, 709 | "output_type": "execute_result" 710 | } 711 | ], 712 | "source": [ 713 | "env.action_space" 714 | ] 715 | }, 716 | { 717 | "cell_type": "code", 718 | "execution_count": 19, 719 | "metadata": {}, 720 | "outputs": [ 721 | { 722 | "name": "stdout", 723 | "output_type": "stream", 724 | "text": [ 725 | "info {'total_reward': 48.68000000000002, 'total_profit': 2.2553045372528024, 'position': 0}\n" 726 | ] 727 | }, 728 | { 729 | "data": { 730 | "image/png": "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\n", 731 | "text/plain": [ 732 | "
" 733 | ] 734 | }, 735 | "metadata": { 736 | "needs_background": "light" 737 | }, 738 | "output_type": "display_data" 739 | } 740 | ], 741 | "source": [ 742 | "state = env.reset()\n", 743 | "while True: \n", 744 | " action = env.action_space.sample()\n", 745 | " n_state, reward, done, info = env.step(action)\n", 746 | " if done: \n", 747 | " print(\"info\", info)\n", 748 | " break\n", 749 | " \n", 750 | "plt.figure(figsize=(15,6))\n", 751 | "plt.cla()\n", 752 | "env.render_all()\n", 753 | "plt.show()" 754 | ] 755 | }, 756 | { 757 | "cell_type": "markdown", 758 | "metadata": {}, 759 | "source": [ 760 | "# 2.1 Add Custom Indicators" 761 | ] 762 | }, 763 | { 764 | "cell_type": "markdown", 765 | "metadata": {}, 766 | "source": [ 767 | "## 2.1.1. Install and Import New Dependencies" 768 | ] 769 | }, 770 | { 771 | "cell_type": "code", 772 | "execution_count": 20, 773 | "metadata": { 774 | "collapsed": true 775 | }, 776 | "outputs": [ 777 | { 778 | "name": "stdout", 779 | "output_type": "stream", 780 | "text": [ 781 | "Requirement already satisfied: finta in c:\\programdata\\anaconda3\\lib\\site-packages (1.2)\n", 782 | "Requirement already satisfied: numpy in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from finta) (1.18.5)\n", 783 | "Requirement already satisfied: pandas in c:\\programdata\\anaconda3\\lib\\site-packages (from finta) (0.24.2)\n", 784 | "Requirement already satisfied: pytz>=2011k in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas->finta) (2019.1)\n", 785 | "Requirement already satisfied: python-dateutil>=2.5.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas->finta) (2.8.0)\n", 786 | "Requirement already satisfied: six>=1.5 in c:\\users\\user\\appdata\\roaming\\python\\python37\\site-packages (from python-dateutil>=2.5.0->pandas->finta) (1.15.0)\n" 787 | ] 788 | } 789 | ], 790 | "source": [ 791 | "!pip install finta" 792 | ] 793 | }, 794 | { 795 | "cell_type": "code", 796 | "execution_count": 21, 797 | "metadata": {}, 798 | "outputs": [], 799 | "source": [ 800 | "from gym_anytrading.envs import StocksEnv\n", 801 | "from finta import TA" 802 | ] 803 | }, 804 | { 805 | "cell_type": "markdown", 806 | "metadata": {}, 807 | "source": [ 808 | "## 2.1.2. Fix Volume Column" 809 | ] 810 | }, 811 | { 812 | "cell_type": "code", 813 | "execution_count": 26, 814 | "metadata": {}, 815 | "outputs": [], 816 | "source": [ 817 | "df['Volume'] = df['Volume'].apply(lambda x: float(x.replace(\",\", \"\")))" 818 | ] 819 | }, 820 | { 821 | "cell_type": "code", 822 | "execution_count": 28, 823 | "metadata": {}, 824 | "outputs": [ 825 | { 826 | "data": { 827 | "text/plain": [ 828 | "Open float64\n", 829 | "High float64\n", 830 | "Low float64\n", 831 | "Close float64\n", 832 | "Volume float64\n", 833 | "dtype: object" 834 | ] 835 | }, 836 | "execution_count": 28, 837 | "metadata": {}, 838 | "output_type": "execute_result" 839 | } 840 | ], 841 | "source": [ 842 | "df.dtypes" 843 | ] 844 | }, 845 | { 846 | "cell_type": "markdown", 847 | "metadata": {}, 848 | "source": [ 849 | "## 2.1.3. Calculate SMA, RSI and OBV" 850 | ] 851 | }, 852 | { 853 | "cell_type": "code", 854 | "execution_count": 32, 855 | "metadata": {}, 856 | "outputs": [], 857 | "source": [ 858 | "df['SMA'] = TA.SMA(df, 12)\n", 859 | "df['RSI'] = TA.RSI(df)\n", 860 | "df['OBV'] = TA.OBV(df)\n", 861 | "df.fillna(0, inplace=True)" 862 | ] 863 | }, 864 | { 865 | "cell_type": "code", 866 | "execution_count": 33, 867 | "metadata": {}, 868 | "outputs": [ 869 | { 870 | "data": { 871 | "text/html": [ 872 | "
\n", 873 | "\n", 886 | "\n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | "
OpenHighLowCloseVolumeSMARSIOBV
Date
2020-03-163.934.573.904.374866696.00.0000000.0000000.0
2020-03-174.404.654.114.233562210.00.0000000.000000-3562210.0
2020-03-184.104.253.503.773651709.00.0000000.000000-7213919.0
2020-03-193.714.203.554.195039539.00.00000043.394834-2174380.0
2020-03-204.084.083.653.767722194.00.00000029.351457-9896574.0
2020-03-233.583.863.503.816009784.00.00000032.102964-3886790.0
2020-03-243.954.213.894.166805659.00.00000047.5129502918869.0
2020-03-254.154.494.044.173592059.00.00000047.8769476510928.0
2020-03-264.244.714.244.416210979.00.00000055.79955712721907.0
2020-03-274.945.094.154.227024763.00.00000049.3981415697144.0
2020-03-304.224.273.653.653350571.00.00000036.0402232346573.0
2020-03-313.633.803.503.502304132.04.02000033.47486542441.0
2020-04-013.453.493.123.254568695.03.92666729.682621-4526254.0
2020-04-023.263.352.852.854064339.03.81166724.834835-8590593.0
2020-04-032.852.942.572.803830761.03.73083324.300576-12421354.0
\n", 1079 | "
" 1080 | ], 1081 | "text/plain": [ 1082 | " Open High Low Close Volume SMA RSI \\\n", 1083 | "Date \n", 1084 | "2020-03-16 3.93 4.57 3.90 4.37 4866696.0 0.000000 0.000000 \n", 1085 | "2020-03-17 4.40 4.65 4.11 4.23 3562210.0 0.000000 0.000000 \n", 1086 | "2020-03-18 4.10 4.25 3.50 3.77 3651709.0 0.000000 0.000000 \n", 1087 | "2020-03-19 3.71 4.20 3.55 4.19 5039539.0 0.000000 43.394834 \n", 1088 | "2020-03-20 4.08 4.08 3.65 3.76 7722194.0 0.000000 29.351457 \n", 1089 | "2020-03-23 3.58 3.86 3.50 3.81 6009784.0 0.000000 32.102964 \n", 1090 | "2020-03-24 3.95 4.21 3.89 4.16 6805659.0 0.000000 47.512950 \n", 1091 | "2020-03-25 4.15 4.49 4.04 4.17 3592059.0 0.000000 47.876947 \n", 1092 | "2020-03-26 4.24 4.71 4.24 4.41 6210979.0 0.000000 55.799557 \n", 1093 | "2020-03-27 4.94 5.09 4.15 4.22 7024763.0 0.000000 49.398141 \n", 1094 | "2020-03-30 4.22 4.27 3.65 3.65 3350571.0 0.000000 36.040223 \n", 1095 | "2020-03-31 3.63 3.80 3.50 3.50 2304132.0 4.020000 33.474865 \n", 1096 | "2020-04-01 3.45 3.49 3.12 3.25 4568695.0 3.926667 29.682621 \n", 1097 | "2020-04-02 3.26 3.35 2.85 2.85 4064339.0 3.811667 24.834835 \n", 1098 | "2020-04-03 2.85 2.94 2.57 2.80 3830761.0 3.730833 24.300576 \n", 1099 | "\n", 1100 | " OBV \n", 1101 | "Date \n", 1102 | "2020-03-16 0.0 \n", 1103 | "2020-03-17 -3562210.0 \n", 1104 | "2020-03-18 -7213919.0 \n", 1105 | "2020-03-19 -2174380.0 \n", 1106 | "2020-03-20 -9896574.0 \n", 1107 | "2020-03-23 -3886790.0 \n", 1108 | "2020-03-24 2918869.0 \n", 1109 | "2020-03-25 6510928.0 \n", 1110 | "2020-03-26 12721907.0 \n", 1111 | "2020-03-27 5697144.0 \n", 1112 | "2020-03-30 2346573.0 \n", 1113 | "2020-03-31 42441.0 \n", 1114 | "2020-04-01 -4526254.0 \n", 1115 | "2020-04-02 -8590593.0 \n", 1116 | "2020-04-03 -12421354.0 " 1117 | ] 1118 | }, 1119 | "execution_count": 33, 1120 | "metadata": {}, 1121 | "output_type": "execute_result" 1122 | } 1123 | ], 1124 | "source": [ 1125 | "df.head(15)" 1126 | ] 1127 | }, 1128 | { 1129 | "cell_type": "markdown", 1130 | "metadata": {}, 1131 | "source": [ 1132 | "## 2.1.4. Create New Environments" 1133 | ] 1134 | }, 1135 | { 1136 | "cell_type": "code", 1137 | "execution_count": 35, 1138 | "metadata": {}, 1139 | "outputs": [], 1140 | "source": [ 1141 | "def add_signals(env):\n", 1142 | " start = env.frame_bound[0] - env.window_size\n", 1143 | " end = env.frame_bound[1]\n", 1144 | " prices = env.df.loc[:, 'Low'].to_numpy()[start:end]\n", 1145 | " signal_features = env.df.loc[:, ['Low', 'Volume','SMA', 'RSI', 'OBV']].to_numpy()[start:end]\n", 1146 | " return prices, signal_features" 1147 | ] 1148 | }, 1149 | { 1150 | "cell_type": "code", 1151 | "execution_count": 36, 1152 | "metadata": {}, 1153 | "outputs": [], 1154 | "source": [ 1155 | "class MyCustomEnv(StocksEnv):\n", 1156 | " _process_data = add_signals\n", 1157 | " \n", 1158 | "env2 = MyCustomEnv(df=df, window_size=12, frame_bound=(12,50))" 1159 | ] 1160 | }, 1161 | { 1162 | "cell_type": "code", 1163 | "execution_count": 40, 1164 | "metadata": { 1165 | "scrolled": true 1166 | }, 1167 | "outputs": [ 1168 | { 1169 | "data": { 1170 | "text/plain": [ 1171 | "array([[ 3.90000000e+00, 4.86669600e+06, 0.00000000e+00,\n", 1172 | " 0.00000000e+00, 0.00000000e+00],\n", 1173 | " [ 4.11000000e+00, 3.56221000e+06, 0.00000000e+00,\n", 1174 | " 0.00000000e+00, -3.56221000e+06],\n", 1175 | " [ 3.50000000e+00, 3.65170900e+06, 0.00000000e+00,\n", 1176 | " 0.00000000e+00, -7.21391900e+06],\n", 1177 | " [ 3.55000000e+00, 5.03953900e+06, 0.00000000e+00,\n", 1178 | " 4.33948339e+01, -2.17438000e+06],\n", 1179 | " [ 3.65000000e+00, 7.72219400e+06, 0.00000000e+00,\n", 1180 | " 2.93514572e+01, -9.89657400e+06],\n", 1181 | " [ 3.50000000e+00, 6.00978400e+06, 0.00000000e+00,\n", 1182 | " 3.21029638e+01, -3.88679000e+06],\n", 1183 | " [ 3.89000000e+00, 6.80565900e+06, 0.00000000e+00,\n", 1184 | " 4.75129499e+01, 2.91886900e+06],\n", 1185 | " [ 4.04000000e+00, 3.59205900e+06, 0.00000000e+00,\n", 1186 | " 4.78769470e+01, 6.51092800e+06],\n", 1187 | " [ 4.24000000e+00, 6.21097900e+06, 0.00000000e+00,\n", 1188 | " 5.57995572e+01, 1.27219070e+07],\n", 1189 | " [ 4.15000000e+00, 7.02476300e+06, 0.00000000e+00,\n", 1190 | " 4.93981406e+01, 5.69714400e+06],\n", 1191 | " [ 3.65000000e+00, 3.35057100e+06, 0.00000000e+00,\n", 1192 | " 3.60402233e+01, 2.34657300e+06],\n", 1193 | " [ 3.50000000e+00, 2.30413200e+06, 4.02000000e+00,\n", 1194 | " 3.34748648e+01, 4.24410000e+04],\n", 1195 | " [ 3.12000000e+00, 4.56869500e+06, 3.92666667e+00,\n", 1196 | " 2.96826208e+01, -4.52625400e+06],\n", 1197 | " [ 2.85000000e+00, 4.06433900e+06, 3.81166667e+00,\n", 1198 | " 2.48348354e+01, -8.59059300e+06],\n", 1199 | " [ 2.57000000e+00, 3.83076100e+06, 3.73083333e+00,\n", 1200 | " 2.43005757e+01, -1.24213540e+07],\n", 1201 | " [ 2.83000000e+00, 3.33107000e+06, 3.63916667e+00,\n", 1202 | " 3.32674579e+01, -9.09028400e+06],\n", 1203 | " [ 3.10000000e+00, 2.83685900e+06, 3.59833333e+00,\n", 1204 | " 3.81635819e+01, -6.25342500e+06],\n", 1205 | " [ 3.20000000e+00, 2.88452800e+06, 3.56500000e+00,\n", 1206 | " 4.17437038e+01, -3.36889700e+06],\n", 1207 | " [ 3.49000000e+00, 5.90891600e+06, 3.54250000e+00,\n", 1208 | " 5.20039324e+01, 2.54001900e+06],\n", 1209 | " [ 4.16000000e+00, 6.84450100e+06, 3.59000000e+00,\n", 1210 | " 6.40714144e+01, 9.38452000e+06],\n", 1211 | " [ 5.14000000e+00, 1.35066300e+07, 3.71833333e+00,\n", 1212 | " 7.40671104e+01, 2.28911500e+07],\n", 1213 | " [ 4.90000000e+00, 7.49985400e+06, 3.80583333e+00,\n", 1214 | " 6.33931944e+01, 1.53912960e+07],\n", 1215 | " [ 4.88000000e+00, 3.37192100e+06, 3.92083333e+00,\n", 1216 | " 6.01011321e+01, 1.20193750e+07],\n", 1217 | " [ 4.43000000e+00, 5.65318800e+06, 4.03583333e+00,\n", 1218 | " 5.80713382e+01, 6.36618700e+06],\n", 1219 | " [ 4.78000000e+00, 6.08501100e+06, 4.23250000e+00,\n", 1220 | " 6.43768198e+01, 1.24511980e+07],\n", 1221 | " [ 4.76000000e+00, 4.14205000e+06, 4.39333333e+00,\n", 1222 | " 5.43659043e+01, 8.30914800e+06],\n", 1223 | " [ 4.83000000e+00, 2.67813300e+06, 4.56750000e+00,\n", 1224 | " 5.53567351e+01, 1.09872810e+07],\n", 1225 | " [ 4.58000000e+00, 2.26585300e+06, 4.70166667e+00,\n", 1226 | " 5.32077636e+01, 8.72142800e+06],\n", 1227 | " [ 4.66000000e+00, 2.23654400e+06, 4.82666667e+00,\n", 1228 | " 5.39175455e+01, 1.09579720e+07],\n", 1229 | " [ 4.81000000e+00, 7.27513800e+06, 5.02750000e+00,\n", 1230 | " 6.29870029e+01, 1.82331100e+07],\n", 1231 | " [ 5.06000000e+00, 5.20018900e+06, 5.17333333e+00,\n", 1232 | " 6.07786688e+01, 1.30329210e+07],\n", 1233 | " [ 5.45000000e+00, 3.37004500e+06, 5.28166667e+00,\n", 1234 | " 6.38147771e+01, 1.64029660e+07],\n", 1235 | " [ 5.64000000e+00, 2.17353000e+06, 5.26333333e+00,\n", 1236 | " 5.99420834e+01, 1.42294360e+07],\n", 1237 | " [ 5.45000000e+00, 4.00559800e+06, 5.32833333e+00,\n", 1238 | " 6.24737146e+01, 1.82350340e+07],\n", 1239 | " [ 5.40000000e+00, 4.06810500e+06, 5.36583333e+00,\n", 1240 | " 5.57187511e+01, 1.41669290e+07],\n", 1241 | " [ 5.35000000e+00, 2.10591900e+06, 5.40833333e+00,\n", 1242 | " 5.47128225e+01, 1.20610100e+07],\n", 1243 | " [ 4.90000000e+00, 3.36964000e+06, 5.35166667e+00,\n", 1244 | " 4.97673242e+01, 8.69137000e+06],\n", 1245 | " [ 4.65000000e+00, 2.50119500e+06, 5.35916667e+00,\n", 1246 | " 4.91433540e+01, 6.19017500e+06],\n", 1247 | " [ 4.82000000e+00, 2.35366100e+06, 5.36666667e+00,\n", 1248 | " 5.03718500e+01, 8.54383600e+06],\n", 1249 | " [ 4.75000000e+00, 1.69915800e+06, 5.37166667e+00,\n", 1250 | " 4.78806928e+01, 6.84467800e+06],\n", 1251 | " [ 4.46000000e+00, 2.63915700e+06, 5.35250000e+00,\n", 1252 | " 4.54595360e+01, 4.20552100e+06],\n", 1253 | " [ 4.07000000e+00, 2.88287700e+06, 5.21833333e+00,\n", 1254 | " 4.20266220e+01, 1.32264400e+06],\n", 1255 | " [ 3.96000000e+00, 2.00486800e+06, 5.09250000e+00,\n", 1256 | " 4.12140829e+01, -6.82224000e+05],\n", 1257 | " [ 4.04000000e+00, 1.94070400e+06, 4.94083333e+00,\n", 1258 | " 4.25595553e+01, 1.25848000e+06],\n", 1259 | " [ 4.36000000e+00, 2.37169400e+06, 4.84500000e+00,\n", 1260 | " 4.77145371e+01, 3.63017400e+06],\n", 1261 | " [ 4.37000000e+00, 1.84073200e+06, 4.71083333e+00,\n", 1262 | " 4.59861286e+01, 1.78944200e+06],\n", 1263 | " [ 4.34000000e+00, 2.54360900e+06, 4.62333333e+00,\n", 1264 | " 4.58583463e+01, -7.54167000e+05],\n", 1265 | " [ 4.40000000e+00, 1.97190600e+06, 4.54416667e+00,\n", 1266 | " 4.60198797e+01, 1.21773900e+06],\n", 1267 | " [ 4.13000000e+00, 2.37985100e+06, 4.48166667e+00,\n", 1268 | " 4.24718284e+01, -1.16211200e+06],\n", 1269 | " [ 4.33000000e+00, 3.54592600e+06, 4.44416667e+00,\n", 1270 | " 4.65670389e+01, 2.38381400e+06]])" 1271 | ] 1272 | }, 1273 | "execution_count": 40, 1274 | "metadata": {}, 1275 | "output_type": "execute_result" 1276 | } 1277 | ], 1278 | "source": [ 1279 | "env2.signal_features" 1280 | ] 1281 | }, 1282 | { 1283 | "cell_type": "code", 1284 | "execution_count": 39, 1285 | "metadata": {}, 1286 | "outputs": [ 1287 | { 1288 | "data": { 1289 | "text/html": [ 1290 | "
\n", 1291 | "\n", 1304 | "\n", 1305 | " \n", 1306 | " \n", 1307 | " \n", 1308 | " \n", 1309 | " \n", 1310 | " \n", 1311 | " \n", 1312 | " \n", 1313 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1317 | " \n", 1318 | " \n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | " \n", 1337 | " \n", 1338 | " \n", 1339 | " \n", 1340 | " \n", 1341 | " \n", 1342 | " \n", 1343 | " \n", 1344 | " \n", 1345 | " \n", 1346 | " \n", 1347 | " \n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | " \n", 1362 | " \n", 1363 | " \n", 1364 | " \n", 1365 | " \n", 1366 | " \n", 1367 | " \n", 1368 | " \n", 1369 | " \n", 1370 | " \n", 1371 | " \n", 1372 | " \n", 1373 | " \n", 1374 | " \n", 1375 | " \n", 1376 | " \n", 1377 | " \n", 1378 | " \n", 1379 | " \n", 1380 | " \n", 1381 | " \n", 1382 | " \n", 1383 | " \n", 1384 | " \n", 1385 | " \n", 1386 | "
OpenHighLowCloseVolumeSMARSIOBV
Date
2020-03-163.934.573.904.374866696.00.00.0000000.0
2020-03-174.404.654.114.233562210.00.00.000000-3562210.0
2020-03-184.104.253.503.773651709.00.00.000000-7213919.0
2020-03-193.714.203.554.195039539.00.043.394834-2174380.0
2020-03-204.084.083.653.767722194.00.029.351457-9896574.0
\n", 1387 | "
" 1388 | ], 1389 | "text/plain": [ 1390 | " Open High Low Close Volume SMA RSI OBV\n", 1391 | "Date \n", 1392 | "2020-03-16 3.93 4.57 3.90 4.37 4866696.0 0.0 0.000000 0.0\n", 1393 | "2020-03-17 4.40 4.65 4.11 4.23 3562210.0 0.0 0.000000 -3562210.0\n", 1394 | "2020-03-18 4.10 4.25 3.50 3.77 3651709.0 0.0 0.000000 -7213919.0\n", 1395 | "2020-03-19 3.71 4.20 3.55 4.19 5039539.0 0.0 43.394834 -2174380.0\n", 1396 | "2020-03-20 4.08 4.08 3.65 3.76 7722194.0 0.0 29.351457 -9896574.0" 1397 | ] 1398 | }, 1399 | "execution_count": 39, 1400 | "metadata": {}, 1401 | "output_type": "execute_result" 1402 | } 1403 | ], 1404 | "source": [ 1405 | "df.head()" 1406 | ] 1407 | }, 1408 | { 1409 | "cell_type": "markdown", 1410 | "metadata": {}, 1411 | "source": [ 1412 | "# 3. Build Environment and Train" 1413 | ] 1414 | }, 1415 | { 1416 | "cell_type": "code", 1417 | "execution_count": 41, 1418 | "metadata": {}, 1419 | "outputs": [], 1420 | "source": [ 1421 | "env_maker = lambda: env2\n", 1422 | "env = DummyVecEnv([env_maker])" 1423 | ] 1424 | }, 1425 | { 1426 | "cell_type": "code", 1427 | "execution_count": 42, 1428 | "metadata": { 1429 | "scrolled": true 1430 | }, 1431 | "outputs": [ 1432 | { 1433 | "name": "stdout", 1434 | "output_type": "stream", 1435 | "text": [ 1436 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\tf_util.py:191: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.\n", 1437 | "\n", 1438 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\tf_util.py:200: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n", 1439 | "\n", 1440 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\policies.py:116: The name tf.variable_scope is deprecated. Please use tf.compat.v1.variable_scope instead.\n", 1441 | "\n", 1442 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\input.py:25: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n", 1443 | "\n", 1444 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\policies.py:420: flatten (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n", 1445 | "Instructions for updating:\n", 1446 | "Use keras.layers.flatten instead.\n", 1447 | "WARNING:tensorflow:From C:\\Users\\User\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\layers\\core.py:332: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.\n", 1448 | "Instructions for updating:\n", 1449 | "Please use `layer.__call__` method instead.\n", 1450 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\tf_layers.py:123: The name tf.get_variable is deprecated. Please use tf.compat.v1.get_variable instead.\n", 1451 | "\n", 1452 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\distributions.py:326: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n", 1453 | "\n", 1454 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\distributions.py:327: The name tf.log is deprecated. Please use tf.math.log instead.\n", 1455 | "\n", 1456 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\a2c\\a2c.py:160: The name tf.summary.scalar is deprecated. Please use tf.compat.v1.summary.scalar instead.\n", 1457 | "\n", 1458 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\tf_util.py:449: The name tf.get_collection is deprecated. Please use tf.compat.v1.get_collection instead.\n", 1459 | "\n", 1460 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\tf_util.py:449: The name tf.GraphKeys is deprecated. Please use tf.compat.v1.GraphKeys instead.\n", 1461 | "\n", 1462 | "WARNING:tensorflow:From C:\\Users\\User\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\ops\\clip_ops.py:301: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", 1463 | "Instructions for updating:\n", 1464 | "Use tf.where in 2.0, which has the same broadcast rule as np.where\n", 1465 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\a2c\\a2c.py:184: The name tf.train.RMSPropOptimizer is deprecated. Please use tf.compat.v1.train.RMSPropOptimizer instead.\n", 1466 | "\n", 1467 | "WARNING:tensorflow:From C:\\Users\\User\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\training\\rmsprop.py:119: calling Ones.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", 1468 | "Instructions for updating:\n", 1469 | "Call initializer instance with the dtype argument instead of passing it to the constructor\n", 1470 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\a2c\\a2c.py:194: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.\n", 1471 | "\n", 1472 | "WARNING:tensorflow:From C:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\a2c\\a2c.py:196: The name tf.summary.merge_all is deprecated. Please use tf.compat.v1.summary.merge_all instead.\n", 1473 | "\n", 1474 | "---------------------------------\n", 1475 | "| explained_variance | -467 |\n", 1476 | "| fps | 14 |\n", 1477 | "| nupdates | 1 |\n", 1478 | "| policy_entropy | 0.691 |\n", 1479 | "| total_timesteps | 5 |\n", 1480 | "| value_loss | 0.000654 |\n", 1481 | "---------------------------------\n", 1482 | "---------------------------------\n", 1483 | "| explained_variance | -25.8 |\n", 1484 | "| fps | 380 |\n", 1485 | "| nupdates | 100 |\n", 1486 | "| policy_entropy | 0.691 |\n", 1487 | "| total_timesteps | 500 |\n", 1488 | "| value_loss | 0.364 |\n", 1489 | "---------------------------------\n", 1490 | "---------------------------------\n", 1491 | "| explained_variance | 0.159 |\n", 1492 | "| fps | 439 |\n", 1493 | "| nupdates | 200 |\n", 1494 | "| policy_entropy | 0.68 |\n", 1495 | "| total_timesteps | 1000 |\n", 1496 | "| value_loss | 0.0516 |\n", 1497 | "---------------------------------\n", 1498 | "---------------------------------\n", 1499 | "| explained_variance | 0.332 |\n", 1500 | "| fps | 465 |\n", 1501 | "| nupdates | 300 |\n", 1502 | "| policy_entropy | 0.69 |\n", 1503 | "| total_timesteps | 1500 |\n", 1504 | "| value_loss | 0.127 |\n", 1505 | "---------------------------------\n", 1506 | "---------------------------------\n", 1507 | "| explained_variance | 0.073 |\n", 1508 | "| fps | 477 |\n", 1509 | "| nupdates | 400 |\n", 1510 | "| policy_entropy | 0.683 |\n", 1511 | "| total_timesteps | 2000 |\n", 1512 | "| value_loss | 0.0264 |\n", 1513 | "---------------------------------\n", 1514 | "---------------------------------\n", 1515 | "| explained_variance | 0.229 |\n", 1516 | "| fps | 484 |\n", 1517 | "| nupdates | 500 |\n", 1518 | "| policy_entropy | 0.688 |\n", 1519 | "| total_timesteps | 2500 |\n", 1520 | "| value_loss | 0.0305 |\n", 1521 | "---------------------------------\n", 1522 | "---------------------------------\n", 1523 | "| explained_variance | -0.00671 |\n", 1524 | "| fps | 490 |\n", 1525 | "| nupdates | 600 |\n", 1526 | "| policy_entropy | 0.682 |\n", 1527 | "| total_timesteps | 3000 |\n", 1528 | "| value_loss | 0.00356 |\n", 1529 | "---------------------------------\n", 1530 | "---------------------------------\n", 1531 | "| explained_variance | 0.476 |\n", 1532 | "| fps | 494 |\n", 1533 | "| nupdates | 700 |\n", 1534 | "| policy_entropy | 0.684 |\n", 1535 | "| total_timesteps | 3500 |\n", 1536 | "| value_loss | 0.0242 |\n", 1537 | "---------------------------------\n", 1538 | "---------------------------------\n", 1539 | "| explained_variance | 0.558 |\n", 1540 | "| fps | 498 |\n", 1541 | "| nupdates | 800 |\n", 1542 | "| policy_entropy | 0.685 |\n", 1543 | "| total_timesteps | 4000 |\n", 1544 | "| value_loss | 0.17 |\n", 1545 | "---------------------------------\n", 1546 | "---------------------------------\n", 1547 | "| explained_variance | 0.551 |\n", 1548 | "| fps | 500 |\n", 1549 | "| nupdates | 900 |\n", 1550 | "| policy_entropy | 0.688 |\n", 1551 | "| total_timesteps | 4500 |\n", 1552 | "| value_loss | 0.0382 |\n", 1553 | "---------------------------------\n", 1554 | "---------------------------------\n", 1555 | "| explained_variance | -288 |\n", 1556 | "| fps | 504 |\n", 1557 | "| nupdates | 1000 |\n", 1558 | "| policy_entropy | 0.681 |\n", 1559 | "| total_timesteps | 5000 |\n", 1560 | "| value_loss | 0.152 |\n", 1561 | "---------------------------------\n", 1562 | "---------------------------------\n", 1563 | "| explained_variance | 0.501 |\n", 1564 | "| fps | 507 |\n", 1565 | "| nupdates | 1100 |\n", 1566 | "| policy_entropy | 0.55 |\n", 1567 | "| total_timesteps | 5500 |\n", 1568 | "| value_loss | 0.156 |\n", 1569 | "---------------------------------\n", 1570 | "---------------------------------\n", 1571 | "| explained_variance | -0.744 |\n", 1572 | "| fps | 509 |\n", 1573 | "| nupdates | 1200 |\n", 1574 | "| policy_entropy | 0.686 |\n", 1575 | "| total_timesteps | 6000 |\n", 1576 | "| value_loss | 0.0239 |\n", 1577 | "---------------------------------\n", 1578 | "---------------------------------\n", 1579 | "| explained_variance | 0.13 |\n", 1580 | "| fps | 511 |\n", 1581 | "| nupdates | 1300 |\n", 1582 | "| policy_entropy | 0.56 |\n", 1583 | "| total_timesteps | 6500 |\n", 1584 | "| value_loss | 0.133 |\n", 1585 | "---------------------------------\n", 1586 | "---------------------------------\n", 1587 | "| explained_variance | 0.559 |\n", 1588 | "| fps | 512 |\n", 1589 | "| nupdates | 1400 |\n", 1590 | "| policy_entropy | 0.63 |\n", 1591 | "| total_timesteps | 7000 |\n", 1592 | "| value_loss | 0.0293 |\n", 1593 | "---------------------------------\n", 1594 | "---------------------------------\n", 1595 | "| explained_variance | -218 |\n", 1596 | "| fps | 513 |\n", 1597 | "| nupdates | 1500 |\n", 1598 | "| policy_entropy | 0.288 |\n", 1599 | "| total_timesteps | 7500 |\n", 1600 | "| value_loss | 0.0144 |\n", 1601 | "---------------------------------\n", 1602 | "---------------------------------\n", 1603 | "| explained_variance | 0.434 |\n", 1604 | "| fps | 514 |\n", 1605 | "| nupdates | 1600 |\n", 1606 | "| policy_entropy | 0.633 |\n", 1607 | "| total_timesteps | 8000 |\n", 1608 | "| value_loss | 0.103 |\n", 1609 | "---------------------------------\n" 1610 | ] 1611 | }, 1612 | { 1613 | "name": "stdout", 1614 | "output_type": "stream", 1615 | "text": [ 1616 | "---------------------------------\n", 1617 | "| explained_variance | -666 |\n", 1618 | "| fps | 514 |\n", 1619 | "| nupdates | 1700 |\n", 1620 | "| policy_entropy | 0.378 |\n", 1621 | "| total_timesteps | 8500 |\n", 1622 | "| value_loss | 0.00894 |\n", 1623 | "---------------------------------\n", 1624 | "---------------------------------\n", 1625 | "| explained_variance | 0.846 |\n", 1626 | "| fps | 514 |\n", 1627 | "| nupdates | 1800 |\n", 1628 | "| policy_entropy | 0.519 |\n", 1629 | "| total_timesteps | 9000 |\n", 1630 | "| value_loss | 0.0529 |\n", 1631 | "---------------------------------\n", 1632 | "---------------------------------\n", 1633 | "| explained_variance | -70.5 |\n", 1634 | "| fps | 515 |\n", 1635 | "| nupdates | 1900 |\n", 1636 | "| policy_entropy | 0.196 |\n", 1637 | "| total_timesteps | 9500 |\n", 1638 | "| value_loss | 0.00208 |\n", 1639 | "---------------------------------\n", 1640 | "---------------------------------\n", 1641 | "| explained_variance | 0.727 |\n", 1642 | "| fps | 515 |\n", 1643 | "| nupdates | 2000 |\n", 1644 | "| policy_entropy | 0.428 |\n", 1645 | "| total_timesteps | 10000 |\n", 1646 | "| value_loss | 0.628 |\n", 1647 | "---------------------------------\n", 1648 | "---------------------------------\n", 1649 | "| explained_variance | -1.03 |\n", 1650 | "| fps | 516 |\n", 1651 | "| nupdates | 2100 |\n", 1652 | "| policy_entropy | 0.472 |\n", 1653 | "| total_timesteps | 10500 |\n", 1654 | "| value_loss | 0.0664 |\n", 1655 | "---------------------------------\n", 1656 | "---------------------------------\n", 1657 | "| explained_variance | 0.888 |\n", 1658 | "| fps | 516 |\n", 1659 | "| nupdates | 2200 |\n", 1660 | "| policy_entropy | 0.34 |\n", 1661 | "| total_timesteps | 11000 |\n", 1662 | "| value_loss | 0.104 |\n", 1663 | "---------------------------------\n", 1664 | "---------------------------------\n", 1665 | "| explained_variance | -0.375 |\n", 1666 | "| fps | 517 |\n", 1667 | "| nupdates | 2300 |\n", 1668 | "| policy_entropy | 0.509 |\n", 1669 | "| total_timesteps | 11500 |\n", 1670 | "| value_loss | 0.131 |\n", 1671 | "---------------------------------\n", 1672 | "---------------------------------\n", 1673 | "| explained_variance | 0.84 |\n", 1674 | "| fps | 517 |\n", 1675 | "| nupdates | 2400 |\n", 1676 | "| policy_entropy | 0.316 |\n", 1677 | "| total_timesteps | 12000 |\n", 1678 | "| value_loss | 0.149 |\n", 1679 | "---------------------------------\n", 1680 | "---------------------------------\n", 1681 | "| explained_variance | 0.0525 |\n", 1682 | "| fps | 517 |\n", 1683 | "| nupdates | 2500 |\n", 1684 | "| policy_entropy | 0.349 |\n", 1685 | "| total_timesteps | 12500 |\n", 1686 | "| value_loss | 0.108 |\n", 1687 | "---------------------------------\n", 1688 | "---------------------------------\n", 1689 | "| explained_variance | -1.12 |\n", 1690 | "| fps | 517 |\n", 1691 | "| nupdates | 2600 |\n", 1692 | "| policy_entropy | 0.326 |\n", 1693 | "| total_timesteps | 13000 |\n", 1694 | "| value_loss | 0.144 |\n", 1695 | "---------------------------------\n", 1696 | "---------------------------------\n", 1697 | "| explained_variance | -108 |\n", 1698 | "| fps | 518 |\n", 1699 | "| nupdates | 2700 |\n", 1700 | "| policy_entropy | 0.362 |\n", 1701 | "| total_timesteps | 13500 |\n", 1702 | "| value_loss | 0.015 |\n", 1703 | "---------------------------------\n", 1704 | "---------------------------------\n", 1705 | "| explained_variance | 0.837 |\n", 1706 | "| fps | 518 |\n", 1707 | "| nupdates | 2800 |\n", 1708 | "| policy_entropy | 0.368 |\n", 1709 | "| total_timesteps | 14000 |\n", 1710 | "| value_loss | 0.00409 |\n", 1711 | "---------------------------------\n", 1712 | "---------------------------------\n", 1713 | "| explained_variance | 0.802 |\n", 1714 | "| fps | 519 |\n", 1715 | "| nupdates | 2900 |\n", 1716 | "| policy_entropy | 0.317 |\n", 1717 | "| total_timesteps | 14500 |\n", 1718 | "| value_loss | 0.0127 |\n", 1719 | "---------------------------------\n", 1720 | "---------------------------------\n", 1721 | "| explained_variance | 0.59 |\n", 1722 | "| fps | 519 |\n", 1723 | "| nupdates | 3000 |\n", 1724 | "| policy_entropy | 0.296 |\n", 1725 | "| total_timesteps | 15000 |\n", 1726 | "| value_loss | 0.0143 |\n", 1727 | "---------------------------------\n", 1728 | "---------------------------------\n", 1729 | "| explained_variance | 0.915 |\n", 1730 | "| fps | 520 |\n", 1731 | "| nupdates | 3100 |\n", 1732 | "| policy_entropy | 0.332 |\n", 1733 | "| total_timesteps | 15500 |\n", 1734 | "| value_loss | 0.00452 |\n", 1735 | "---------------------------------\n", 1736 | "---------------------------------\n", 1737 | "| explained_variance | 0.321 |\n", 1738 | "| fps | 520 |\n", 1739 | "| nupdates | 3200 |\n", 1740 | "| policy_entropy | 0.387 |\n", 1741 | "| total_timesteps | 16000 |\n", 1742 | "| value_loss | 0.0236 |\n", 1743 | "---------------------------------\n", 1744 | "---------------------------------\n", 1745 | "| explained_variance | 0.972 |\n", 1746 | "| fps | 521 |\n", 1747 | "| nupdates | 3300 |\n", 1748 | "| policy_entropy | 0.494 |\n", 1749 | "| total_timesteps | 16500 |\n", 1750 | "| value_loss | 0.00107 |\n", 1751 | "---------------------------------\n", 1752 | "---------------------------------\n", 1753 | "| explained_variance | -20.5 |\n", 1754 | "| fps | 521 |\n", 1755 | "| nupdates | 3400 |\n", 1756 | "| policy_entropy | 0.325 |\n", 1757 | "| total_timesteps | 17000 |\n", 1758 | "| value_loss | 0.0384 |\n", 1759 | "---------------------------------\n", 1760 | "---------------------------------\n", 1761 | "| explained_variance | 0.984 |\n", 1762 | "| fps | 522 |\n", 1763 | "| nupdates | 3500 |\n", 1764 | "| policy_entropy | 0.441 |\n", 1765 | "| total_timesteps | 17500 |\n", 1766 | "| value_loss | 0.00547 |\n", 1767 | "---------------------------------\n", 1768 | "---------------------------------\n", 1769 | "| explained_variance | -3.04 |\n", 1770 | "| fps | 522 |\n", 1771 | "| nupdates | 3600 |\n", 1772 | "| policy_entropy | 0.152 |\n", 1773 | "| total_timesteps | 18000 |\n", 1774 | "| value_loss | 0.00669 |\n", 1775 | "---------------------------------\n", 1776 | "---------------------------------\n", 1777 | "| explained_variance | 0.272 |\n", 1778 | "| fps | 522 |\n", 1779 | "| nupdates | 3700 |\n", 1780 | "| policy_entropy | 0.321 |\n", 1781 | "| total_timesteps | 18500 |\n", 1782 | "| value_loss | 0.00272 |\n", 1783 | "---------------------------------\n", 1784 | "---------------------------------\n", 1785 | "| explained_variance | -29.2 |\n", 1786 | "| fps | 523 |\n", 1787 | "| nupdates | 3800 |\n", 1788 | "| policy_entropy | 0.141 |\n", 1789 | "| total_timesteps | 19000 |\n", 1790 | "| value_loss | 0.0211 |\n", 1791 | "---------------------------------\n", 1792 | "---------------------------------\n", 1793 | "| explained_variance | 0.993 |\n", 1794 | "| fps | 523 |\n", 1795 | "| nupdates | 3900 |\n", 1796 | "| policy_entropy | 0.344 |\n", 1797 | "| total_timesteps | 19500 |\n", 1798 | "| value_loss | 0.0432 |\n", 1799 | "---------------------------------\n", 1800 | "---------------------------------\n", 1801 | "| explained_variance | -152 |\n", 1802 | "| fps | 523 |\n", 1803 | "| nupdates | 4000 |\n", 1804 | "| policy_entropy | 0.129 |\n", 1805 | "| total_timesteps | 20000 |\n", 1806 | "| value_loss | 0.137 |\n", 1807 | "---------------------------------\n", 1808 | "---------------------------------\n", 1809 | "| explained_variance | 0.997 |\n", 1810 | "| fps | 523 |\n", 1811 | "| nupdates | 4100 |\n", 1812 | "| policy_entropy | 0.173 |\n", 1813 | "| total_timesteps | 20500 |\n", 1814 | "| value_loss | 0.0275 |\n", 1815 | "---------------------------------\n", 1816 | "---------------------------------\n", 1817 | "| explained_variance | 0.997 |\n", 1818 | "| fps | 524 |\n", 1819 | "| nupdates | 4200 |\n", 1820 | "| policy_entropy | 0.132 |\n", 1821 | "| total_timesteps | 21000 |\n", 1822 | "| value_loss | 0.000371 |\n", 1823 | "---------------------------------\n", 1824 | "---------------------------------\n", 1825 | "| explained_variance | 1 |\n", 1826 | "| fps | 524 |\n", 1827 | "| nupdates | 4300 |\n", 1828 | "| policy_entropy | 0.09 |\n", 1829 | "| total_timesteps | 21500 |\n", 1830 | "| value_loss | 0.00113 |\n", 1831 | "---------------------------------\n", 1832 | "---------------------------------\n", 1833 | "| explained_variance | 0.966 |\n", 1834 | "| fps | 524 |\n", 1835 | "| nupdates | 4400 |\n", 1836 | "| policy_entropy | 0.0744 |\n", 1837 | "| total_timesteps | 22000 |\n", 1838 | "| value_loss | 0.00829 |\n", 1839 | "---------------------------------\n", 1840 | "---------------------------------\n", 1841 | "| explained_variance | 0.987 |\n", 1842 | "| fps | 524 |\n", 1843 | "| nupdates | 4500 |\n", 1844 | "| policy_entropy | 0.0909 |\n", 1845 | "| total_timesteps | 22500 |\n", 1846 | "| value_loss | 0.0252 |\n", 1847 | "---------------------------------\n", 1848 | "---------------------------------\n", 1849 | "| explained_variance | 0.976 |\n", 1850 | "| fps | 525 |\n", 1851 | "| nupdates | 4600 |\n", 1852 | "| policy_entropy | 0.0546 |\n", 1853 | "| total_timesteps | 23000 |\n", 1854 | "| value_loss | 0.00374 |\n", 1855 | "---------------------------------\n", 1856 | "---------------------------------\n", 1857 | "| explained_variance | 0.967 |\n", 1858 | "| fps | 525 |\n", 1859 | "| nupdates | 4700 |\n", 1860 | "| policy_entropy | 0.0854 |\n", 1861 | "| total_timesteps | 23500 |\n", 1862 | "| value_loss | 0.00123 |\n", 1863 | "---------------------------------\n" 1864 | ] 1865 | }, 1866 | { 1867 | "name": "stdout", 1868 | "output_type": "stream", 1869 | "text": [ 1870 | "---------------------------------\n", 1871 | "| explained_variance | -2.94 |\n", 1872 | "| fps | 525 |\n", 1873 | "| nupdates | 4800 |\n", 1874 | "| policy_entropy | 0.069 |\n", 1875 | "| total_timesteps | 24000 |\n", 1876 | "| value_loss | 0.000452 |\n", 1877 | "---------------------------------\n", 1878 | "---------------------------------\n", 1879 | "| explained_variance | 0.89 |\n", 1880 | "| fps | 525 |\n", 1881 | "| nupdates | 4900 |\n", 1882 | "| policy_entropy | 0.0423 |\n", 1883 | "| total_timesteps | 24500 |\n", 1884 | "| value_loss | 0.0176 |\n", 1885 | "---------------------------------\n", 1886 | "---------------------------------\n", 1887 | "| explained_variance | -2.31 |\n", 1888 | "| fps | 525 |\n", 1889 | "| nupdates | 5000 |\n", 1890 | "| policy_entropy | 0.0696 |\n", 1891 | "| total_timesteps | 25000 |\n", 1892 | "| value_loss | 0.000334 |\n", 1893 | "---------------------------------\n", 1894 | "---------------------------------\n", 1895 | "| explained_variance | 0.953 |\n", 1896 | "| fps | 525 |\n", 1897 | "| nupdates | 5100 |\n", 1898 | "| policy_entropy | 0.0813 |\n", 1899 | "| total_timesteps | 25500 |\n", 1900 | "| value_loss | 0.00272 |\n", 1901 | "---------------------------------\n", 1902 | "---------------------------------\n", 1903 | "| explained_variance | 0.178 |\n", 1904 | "| fps | 526 |\n", 1905 | "| nupdates | 5200 |\n", 1906 | "| policy_entropy | 0.0713 |\n", 1907 | "| total_timesteps | 26000 |\n", 1908 | "| value_loss | 0.000402 |\n", 1909 | "---------------------------------\n", 1910 | "---------------------------------\n", 1911 | "| explained_variance | -0.802 |\n", 1912 | "| fps | 526 |\n", 1913 | "| nupdates | 5300 |\n", 1914 | "| policy_entropy | 0.0364 |\n", 1915 | "| total_timesteps | 26500 |\n", 1916 | "| value_loss | 0.00977 |\n", 1917 | "---------------------------------\n", 1918 | "---------------------------------\n", 1919 | "| explained_variance | 0.942 |\n", 1920 | "| fps | 526 |\n", 1921 | "| nupdates | 5400 |\n", 1922 | "| policy_entropy | 0.0623 |\n", 1923 | "| total_timesteps | 27000 |\n", 1924 | "| value_loss | 0.000934 |\n", 1925 | "---------------------------------\n", 1926 | "---------------------------------\n", 1927 | "| explained_variance | 0.995 |\n", 1928 | "| fps | 526 |\n", 1929 | "| nupdates | 5500 |\n", 1930 | "| policy_entropy | 0.0254 |\n", 1931 | "| total_timesteps | 27500 |\n", 1932 | "| value_loss | 0.00379 |\n", 1933 | "---------------------------------\n", 1934 | "---------------------------------\n", 1935 | "| explained_variance | 0.995 |\n", 1936 | "| fps | 526 |\n", 1937 | "| nupdates | 5600 |\n", 1938 | "| policy_entropy | 0.0692 |\n", 1939 | "| total_timesteps | 28000 |\n", 1940 | "| value_loss | 0.000541 |\n", 1941 | "---------------------------------\n", 1942 | "---------------------------------\n", 1943 | "| explained_variance | 0.999 |\n", 1944 | "| fps | 526 |\n", 1945 | "| nupdates | 5700 |\n", 1946 | "| policy_entropy | 0.0144 |\n", 1947 | "| total_timesteps | 28500 |\n", 1948 | "| value_loss | 0.000932 |\n", 1949 | "---------------------------------\n", 1950 | "---------------------------------\n", 1951 | "| explained_variance | 0.983 |\n", 1952 | "| fps | 526 |\n", 1953 | "| nupdates | 5800 |\n", 1954 | "| policy_entropy | 0.0664 |\n", 1955 | "| total_timesteps | 29000 |\n", 1956 | "| value_loss | 0.00109 |\n", 1957 | "---------------------------------\n", 1958 | "---------------------------------\n", 1959 | "| explained_variance | 0.999 |\n", 1960 | "| fps | 527 |\n", 1961 | "| nupdates | 5900 |\n", 1962 | "| policy_entropy | 0.0195 |\n", 1963 | "| total_timesteps | 29500 |\n", 1964 | "| value_loss | 0.00217 |\n", 1965 | "---------------------------------\n", 1966 | "---------------------------------\n", 1967 | "| explained_variance | 0.988 |\n", 1968 | "| fps | 527 |\n", 1969 | "| nupdates | 6000 |\n", 1970 | "| policy_entropy | 0.0624 |\n", 1971 | "| total_timesteps | 30000 |\n", 1972 | "| value_loss | 0.000422 |\n", 1973 | "---------------------------------\n", 1974 | "---------------------------------\n", 1975 | "| explained_variance | 1 |\n", 1976 | "| fps | 527 |\n", 1977 | "| nupdates | 6100 |\n", 1978 | "| policy_entropy | 0.025 |\n", 1979 | "| total_timesteps | 30500 |\n", 1980 | "| value_loss | 0.00031 |\n", 1981 | "---------------------------------\n", 1982 | "---------------------------------\n", 1983 | "| explained_variance | 0.81 |\n", 1984 | "| fps | 526 |\n", 1985 | "| nupdates | 6200 |\n", 1986 | "| policy_entropy | 0.0487 |\n", 1987 | "| total_timesteps | 31000 |\n", 1988 | "| value_loss | 0.000109 |\n", 1989 | "---------------------------------\n", 1990 | "---------------------------------\n", 1991 | "| explained_variance | 0.957 |\n", 1992 | "| fps | 526 |\n", 1993 | "| nupdates | 6300 |\n", 1994 | "| policy_entropy | 0.0444 |\n", 1995 | "| total_timesteps | 31500 |\n", 1996 | "| value_loss | 0.000846 |\n", 1997 | "---------------------------------\n", 1998 | "---------------------------------\n", 1999 | "| explained_variance | -1.13 |\n", 2000 | "| fps | 526 |\n", 2001 | "| nupdates | 6400 |\n", 2002 | "| policy_entropy | 0.107 |\n", 2003 | "| total_timesteps | 32000 |\n", 2004 | "| value_loss | 0.102 |\n", 2005 | "---------------------------------\n", 2006 | "---------------------------------\n", 2007 | "| explained_variance | 0.816 |\n", 2008 | "| fps | 527 |\n", 2009 | "| nupdates | 6500 |\n", 2010 | "| policy_entropy | 0.0605 |\n", 2011 | "| total_timesteps | 32500 |\n", 2012 | "| value_loss | 0.00951 |\n", 2013 | "---------------------------------\n", 2014 | "---------------------------------\n", 2015 | "| explained_variance | 0.917 |\n", 2016 | "| fps | 527 |\n", 2017 | "| nupdates | 6600 |\n", 2018 | "| policy_entropy | 0.111 |\n", 2019 | "| total_timesteps | 33000 |\n", 2020 | "| value_loss | 0.00398 |\n", 2021 | "---------------------------------\n", 2022 | "---------------------------------\n", 2023 | "| explained_variance | 0.891 |\n", 2024 | "| fps | 527 |\n", 2025 | "| nupdates | 6700 |\n", 2026 | "| policy_entropy | 0.0583 |\n", 2027 | "| total_timesteps | 33500 |\n", 2028 | "| value_loss | 0.00824 |\n", 2029 | "---------------------------------\n", 2030 | "---------------------------------\n", 2031 | "| explained_variance | 0.998 |\n", 2032 | "| fps | 527 |\n", 2033 | "| nupdates | 6800 |\n", 2034 | "| policy_entropy | 0.19 |\n", 2035 | "| total_timesteps | 34000 |\n", 2036 | "| value_loss | 9.06e-05 |\n", 2037 | "---------------------------------\n", 2038 | "---------------------------------\n", 2039 | "| explained_variance | 0.995 |\n", 2040 | "| fps | 527 |\n", 2041 | "| nupdates | 6900 |\n", 2042 | "| policy_entropy | 0.157 |\n", 2043 | "| total_timesteps | 34500 |\n", 2044 | "| value_loss | 0.000606 |\n", 2045 | "---------------------------------\n", 2046 | "---------------------------------\n", 2047 | "| explained_variance | 0.997 |\n", 2048 | "| fps | 527 |\n", 2049 | "| nupdates | 7000 |\n", 2050 | "| policy_entropy | 0.146 |\n", 2051 | "| total_timesteps | 35000 |\n", 2052 | "| value_loss | 0.000427 |\n", 2053 | "---------------------------------\n", 2054 | "---------------------------------\n", 2055 | "| explained_variance | -2.64 |\n", 2056 | "| fps | 527 |\n", 2057 | "| nupdates | 7100 |\n", 2058 | "| policy_entropy | 0.114 |\n", 2059 | "| total_timesteps | 35500 |\n", 2060 | "| value_loss | 0.00557 |\n", 2061 | "---------------------------------\n", 2062 | "---------------------------------\n", 2063 | "| explained_variance | 0.978 |\n", 2064 | "| fps | 527 |\n", 2065 | "| nupdates | 7200 |\n", 2066 | "| policy_entropy | 0.182 |\n", 2067 | "| total_timesteps | 36000 |\n", 2068 | "| value_loss | 0.000835 |\n", 2069 | "---------------------------------\n", 2070 | "---------------------------------\n", 2071 | "| explained_variance | -3.59 |\n", 2072 | "| fps | 527 |\n", 2073 | "| nupdates | 7300 |\n", 2074 | "| policy_entropy | 0.145 |\n", 2075 | "| total_timesteps | 36500 |\n", 2076 | "| value_loss | 0.0131 |\n", 2077 | "---------------------------------\n", 2078 | "---------------------------------\n", 2079 | "| explained_variance | 0.808 |\n", 2080 | "| fps | 527 |\n", 2081 | "| nupdates | 7400 |\n", 2082 | "| policy_entropy | 0.145 |\n", 2083 | "| total_timesteps | 37000 |\n", 2084 | "| value_loss | 0.00111 |\n", 2085 | "---------------------------------\n", 2086 | "---------------------------------\n", 2087 | "| explained_variance | -0.0716 |\n", 2088 | "| fps | 527 |\n", 2089 | "| nupdates | 7500 |\n", 2090 | "| policy_entropy | 0.188 |\n", 2091 | "| total_timesteps | 37500 |\n", 2092 | "| value_loss | 0.00112 |\n", 2093 | "---------------------------------\n", 2094 | "---------------------------------\n", 2095 | "| explained_variance | 1 |\n", 2096 | "| fps | 527 |\n", 2097 | "| nupdates | 7600 |\n", 2098 | "| policy_entropy | 0.0702 |\n", 2099 | "| total_timesteps | 38000 |\n", 2100 | "| value_loss | 0.000107 |\n", 2101 | "---------------------------------\n", 2102 | "---------------------------------\n", 2103 | "| explained_variance | 0.979 |\n", 2104 | "| fps | 527 |\n", 2105 | "| nupdates | 7700 |\n", 2106 | "| policy_entropy | 0.181 |\n", 2107 | "| total_timesteps | 38500 |\n", 2108 | "| value_loss | 0.00362 |\n", 2109 | "---------------------------------\n", 2110 | "---------------------------------\n", 2111 | "| explained_variance | 1 |\n", 2112 | "| fps | 527 |\n", 2113 | "| nupdates | 7800 |\n", 2114 | "| policy_entropy | 0.0209 |\n", 2115 | "| total_timesteps | 39000 |\n", 2116 | "| value_loss | 0.000694 |\n", 2117 | "---------------------------------\n" 2118 | ] 2119 | }, 2120 | { 2121 | "name": "stdout", 2122 | "output_type": "stream", 2123 | "text": [ 2124 | "---------------------------------\n", 2125 | "| explained_variance | 0.985 |\n", 2126 | "| fps | 527 |\n", 2127 | "| nupdates | 7900 |\n", 2128 | "| policy_entropy | 0.0404 |\n", 2129 | "| total_timesteps | 39500 |\n", 2130 | "| value_loss | 0.00274 |\n", 2131 | "---------------------------------\n", 2132 | "---------------------------------\n", 2133 | "| explained_variance | 1 |\n", 2134 | "| fps | 527 |\n", 2135 | "| nupdates | 8000 |\n", 2136 | "| policy_entropy | 0.0199 |\n", 2137 | "| total_timesteps | 40000 |\n", 2138 | "| value_loss | 0.00167 |\n", 2139 | "---------------------------------\n", 2140 | "---------------------------------\n", 2141 | "| explained_variance | 1 |\n", 2142 | "| fps | 526 |\n", 2143 | "| nupdates | 8100 |\n", 2144 | "| policy_entropy | 0.02 |\n", 2145 | "| total_timesteps | 40500 |\n", 2146 | "| value_loss | 8.88e-06 |\n", 2147 | "---------------------------------\n", 2148 | "---------------------------------\n", 2149 | "| explained_variance | 1 |\n", 2150 | "| fps | 526 |\n", 2151 | "| nupdates | 8200 |\n", 2152 | "| policy_entropy | 0.0312 |\n", 2153 | "| total_timesteps | 41000 |\n", 2154 | "| value_loss | 0.000449 |\n", 2155 | "---------------------------------\n", 2156 | "---------------------------------\n", 2157 | "| explained_variance | 0.999 |\n", 2158 | "| fps | 526 |\n", 2159 | "| nupdates | 8300 |\n", 2160 | "| policy_entropy | 0.0128 |\n", 2161 | "| total_timesteps | 41500 |\n", 2162 | "| value_loss | 5.99e-05 |\n", 2163 | "---------------------------------\n", 2164 | "---------------------------------\n", 2165 | "| explained_variance | 0.996 |\n", 2166 | "| fps | 526 |\n", 2167 | "| nupdates | 8400 |\n", 2168 | "| policy_entropy | 0.0407 |\n", 2169 | "| total_timesteps | 42000 |\n", 2170 | "| value_loss | 0.000844 |\n", 2171 | "---------------------------------\n", 2172 | "---------------------------------\n", 2173 | "| explained_variance | -0.536 |\n", 2174 | "| fps | 526 |\n", 2175 | "| nupdates | 8500 |\n", 2176 | "| policy_entropy | 0.0549 |\n", 2177 | "| total_timesteps | 42500 |\n", 2178 | "| value_loss | 0.000144 |\n", 2179 | "---------------------------------\n", 2180 | "---------------------------------\n", 2181 | "| explained_variance | 0.997 |\n", 2182 | "| fps | 526 |\n", 2183 | "| nupdates | 8600 |\n", 2184 | "| policy_entropy | 0.0102 |\n", 2185 | "| total_timesteps | 43000 |\n", 2186 | "| value_loss | 0.000419 |\n", 2187 | "---------------------------------\n", 2188 | "---------------------------------\n", 2189 | "| explained_variance | -4.28 |\n", 2190 | "| fps | 526 |\n", 2191 | "| nupdates | 8700 |\n", 2192 | "| policy_entropy | 0.024 |\n", 2193 | "| total_timesteps | 43500 |\n", 2194 | "| value_loss | 0.00111 |\n", 2195 | "---------------------------------\n", 2196 | "---------------------------------\n", 2197 | "| explained_variance | 0.998 |\n", 2198 | "| fps | 526 |\n", 2199 | "| nupdates | 8800 |\n", 2200 | "| policy_entropy | 0.0096 |\n", 2201 | "| total_timesteps | 44000 |\n", 2202 | "| value_loss | 0.00163 |\n", 2203 | "---------------------------------\n", 2204 | "---------------------------------\n", 2205 | "| explained_variance | 0.52 |\n", 2206 | "| fps | 526 |\n", 2207 | "| nupdates | 8900 |\n", 2208 | "| policy_entropy | 0.0676 |\n", 2209 | "| total_timesteps | 44500 |\n", 2210 | "| value_loss | 0.000124 |\n", 2211 | "---------------------------------\n", 2212 | "---------------------------------\n", 2213 | "| explained_variance | 0.994 |\n", 2214 | "| fps | 526 |\n", 2215 | "| nupdates | 9000 |\n", 2216 | "| policy_entropy | 0.00787 |\n", 2217 | "| total_timesteps | 45000 |\n", 2218 | "| value_loss | 0.00129 |\n", 2219 | "---------------------------------\n", 2220 | "---------------------------------\n", 2221 | "| explained_variance | 0.994 |\n", 2222 | "| fps | 526 |\n", 2223 | "| nupdates | 9100 |\n", 2224 | "| policy_entropy | 0.0742 |\n", 2225 | "| total_timesteps | 45500 |\n", 2226 | "| value_loss | 0.000395 |\n", 2227 | "---------------------------------\n", 2228 | "---------------------------------\n", 2229 | "| explained_variance | 1 |\n", 2230 | "| fps | 526 |\n", 2231 | "| nupdates | 9200 |\n", 2232 | "| policy_entropy | 0.00514 |\n", 2233 | "| total_timesteps | 46000 |\n", 2234 | "| value_loss | 0.00014 |\n", 2235 | "---------------------------------\n", 2236 | "---------------------------------\n", 2237 | "| explained_variance | 0.99 |\n", 2238 | "| fps | 526 |\n", 2239 | "| nupdates | 9300 |\n", 2240 | "| policy_entropy | 0.0903 |\n", 2241 | "| total_timesteps | 46500 |\n", 2242 | "| value_loss | 0.00019 |\n", 2243 | "---------------------------------\n", 2244 | "---------------------------------\n", 2245 | "| explained_variance | 1 |\n", 2246 | "| fps | 525 |\n", 2247 | "| nupdates | 9400 |\n", 2248 | "| policy_entropy | 0.0135 |\n", 2249 | "| total_timesteps | 47000 |\n", 2250 | "| value_loss | 0.00026 |\n", 2251 | "---------------------------------\n", 2252 | "---------------------------------\n", 2253 | "| explained_variance | 0.973 |\n", 2254 | "| fps | 525 |\n", 2255 | "| nupdates | 9500 |\n", 2256 | "| policy_entropy | 0.0169 |\n", 2257 | "| total_timesteps | 47500 |\n", 2258 | "| value_loss | 0.00347 |\n", 2259 | "---------------------------------\n", 2260 | "---------------------------------\n", 2261 | "| explained_variance | 1 |\n", 2262 | "| fps | 525 |\n", 2263 | "| nupdates | 9600 |\n", 2264 | "| policy_entropy | 0.00614 |\n", 2265 | "| total_timesteps | 48000 |\n", 2266 | "| value_loss | 0.000452 |\n", 2267 | "---------------------------------\n", 2268 | "---------------------------------\n", 2269 | "| explained_variance | 0.999 |\n", 2270 | "| fps | 525 |\n", 2271 | "| nupdates | 9700 |\n", 2272 | "| policy_entropy | 0.0218 |\n", 2273 | "| total_timesteps | 48500 |\n", 2274 | "| value_loss | 0.00041 |\n", 2275 | "---------------------------------\n" 2276 | ] 2277 | }, 2278 | { 2279 | "ename": "KeyboardInterrupt", 2280 | "evalue": "", 2281 | "output_type": "error", 2282 | "traceback": [ 2283 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 2284 | "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", 2285 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mmodel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mA2C\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'MlpLstmPolicy'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0menv\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlearn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtotal_timesteps\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1000000\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 2286 | "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\a2c\\a2c.py\u001b[0m in \u001b[0;36mlearn\u001b[1;34m(self, total_timesteps, callback, log_interval, tb_log_name, reset_num_timesteps)\u001b[0m\n\u001b[0;32m 261\u001b[0m \u001b[0mcallback\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mon_rollout_start\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 262\u001b[0m \u001b[1;31m# true_reward is the reward without discount\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 263\u001b[1;33m \u001b[0mrollout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrunner\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcallback\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 264\u001b[0m \u001b[1;31m# unpack\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 265\u001b[0m \u001b[0mobs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstates\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrewards\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmasks\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mactions\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mep_infos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtrue_reward\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrollout\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2287 | "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\runners.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, callback)\u001b[0m\n\u001b[0;32m 46\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcallback\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcallback\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 47\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcontinue_training\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 48\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_run\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 49\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 50\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mabstractmethod\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2288 | "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\a2c\\a2c.py\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 350\u001b[0m \u001b[0mep_infos\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 351\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mn_steps\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 352\u001b[1;33m \u001b[0mactions\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstates\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mobs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstates\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdones\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 353\u001b[0m \u001b[0mmb_obs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mobs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 354\u001b[0m \u001b[0mmb_actions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mactions\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2289 | "\u001b[1;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\stable_baselines\\common\\policies.py\u001b[0m in \u001b[0;36mstep\u001b[1;34m(self, obs, state, mask, deterministic)\u001b[0m\n\u001b[0;32m 506\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 507\u001b[0m return self.sess.run([self.action, self.value_flat, self.snew, self.neglogp],\n\u001b[1;32m--> 508\u001b[1;33m {self.obs_ph: obs, self.states_ph: state, self.dones_ph: mask})\n\u001b[0m\u001b[0;32m 509\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 510\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mproba_step\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mobs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmask\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2290 | "\u001b[1;32m~\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 954\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 955\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[1;32m--> 956\u001b[1;33m run_metadata_ptr)\n\u001b[0m\u001b[0;32m 957\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 958\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2291 | "\u001b[1;32m~\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 1178\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[1;32mor\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1179\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[1;32m-> 1180\u001b[1;33m feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[0;32m 1181\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1182\u001b[0m \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2292 | "\u001b[1;32m~\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_do_run\u001b[1;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 1357\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1358\u001b[0m return self._do_call(_run_fn, feeds, fetches, targets, options,\n\u001b[1;32m-> 1359\u001b[1;33m run_metadata)\n\u001b[0m\u001b[0;32m 1360\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1361\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2293 | "\u001b[1;32m~\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_do_call\u001b[1;34m(self, fn, *args)\u001b[0m\n\u001b[0;32m 1363\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1364\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1365\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1366\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1367\u001b[0m \u001b[0mmessage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2294 | "\u001b[1;32m~\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[1;34m(feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[0;32m 1348\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_extend_graph\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1349\u001b[0m return self._call_tf_sessionrun(options, feed_dict, fetch_list,\n\u001b[1;32m-> 1350\u001b[1;33m target_list, run_metadata)\n\u001b[0m\u001b[0;32m 1351\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1352\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2295 | "\u001b[1;32m~\\AppData\\Roaming\\Python\\Python37\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_call_tf_sessionrun\u001b[1;34m(self, options, feed_dict, fetch_list, target_list, run_metadata)\u001b[0m\n\u001b[0;32m 1441\u001b[0m return tf_session.TF_SessionRun_wrapper(self._session, options, feed_dict,\n\u001b[0;32m 1442\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1443\u001b[1;33m run_metadata)\n\u001b[0m\u001b[0;32m 1444\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1445\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_call_tf_sessionprun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 2296 | "\u001b[1;31mKeyboardInterrupt\u001b[0m: " 2297 | ] 2298 | } 2299 | ], 2300 | "source": [ 2301 | "model = A2C('MlpLstmPolicy', env, verbose=1) \n", 2302 | "model.learn(total_timesteps=1000000)" 2303 | ] 2304 | }, 2305 | { 2306 | "cell_type": "markdown", 2307 | "metadata": {}, 2308 | "source": [ 2309 | "# 4. Evaluation" 2310 | ] 2311 | }, 2312 | { 2313 | "cell_type": "code", 2314 | "execution_count": 45, 2315 | "metadata": {}, 2316 | "outputs": [ 2317 | { 2318 | "name": "stdout", 2319 | "output_type": "stream", 2320 | "text": [ 2321 | "info {'total_reward': 16.17, 'total_profit': 1.3591332483648229, 'position': 0}\n" 2322 | ] 2323 | } 2324 | ], 2325 | "source": [ 2326 | "env = MyCustomEnv(df=df, window_size=12, frame_bound=(80,250))\n", 2327 | "obs = env.reset()\n", 2328 | "while True: \n", 2329 | " obs = obs[np.newaxis, ...]\n", 2330 | " action, _states = model.predict(obs)\n", 2331 | " obs, rewards, done, info = env.step(action)\n", 2332 | " if done:\n", 2333 | " print(\"info\", info)\n", 2334 | " break" 2335 | ] 2336 | }, 2337 | { 2338 | "cell_type": "code", 2339 | "execution_count": 46, 2340 | "metadata": {}, 2341 | "outputs": [ 2342 | { 2343 | "data": { 2344 | "image/png": "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\n", 2345 | "text/plain": [ 2346 | "
" 2347 | ] 2348 | }, 2349 | "metadata": { 2350 | "needs_background": "light" 2351 | }, 2352 | "output_type": "display_data" 2353 | } 2354 | ], 2355 | "source": [ 2356 | "plt.figure(figsize=(15,6))\n", 2357 | "plt.cla()\n", 2358 | "env.render_all()\n", 2359 | "plt.show()" 2360 | ] 2361 | }, 2362 | { 2363 | "cell_type": "code", 2364 | "execution_count": null, 2365 | "metadata": {}, 2366 | "outputs": [], 2367 | "source": [] 2368 | } 2369 | ], 2370 | "metadata": { 2371 | "kernelspec": { 2372 | "display_name": "Python 3", 2373 | "language": "python", 2374 | "name": "python3" 2375 | }, 2376 | "language_info": { 2377 | "codemirror_mode": { 2378 | "name": "ipython", 2379 | "version": 3 2380 | }, 2381 | "file_extension": ".py", 2382 | "mimetype": "text/x-python", 2383 | "name": "python", 2384 | "nbconvert_exporter": "python", 2385 | "pygments_lexer": "ipython3", 2386 | "version": "3.7.3" 2387 | } 2388 | }, 2389 | "nbformat": 4, 2390 | "nbformat_minor": 2 2391 | } 2392 | -------------------------------------------------------------------------------- /data/gmedata.csv: -------------------------------------------------------------------------------- 1 | Date,Open,High,Low,Close,Volume 2 | 03/12/2021,"275.00","295.50","262.27","264.50","25,845,900" 3 | 03/11/2021,"241.64","281.50","232.60","260.00","28,312,490" 4 | 03/10/2021,"269.43","348.50","172.00","265.00","71,570,570" 5 | 03/09/2021,"217.71","249.85","208.51","246.90","39,099,328" 6 | 03/08/2021,"154.89","210.87","146.10","194.50","63,565,621" 7 | 03/05/2021,"128.17","151.53","127.50","137.74","30,733,670" 8 | 03/04/2021,"125.00","147.87","115.30","132.35","32,606,891" 9 | 03/03/2021,"122.51","127.75","113.12","124.18","19,273,881" 10 | 03/02/2021,"116.93","133.20","112.20","118.18","33,783,039" 11 | 03/01/2021,"104.54","133.99","99.97","120.40","49,793,969" 12 | 02/26/2021,"117.46","142.90","86.00","101.74","92,194,148" 13 | 02/25/2021,"169.56","184.68","101.00","108.73","150,308,797" 14 | 02/24/2021,"44.70","91.71","44.70","91.71","83,111,742" 15 | 02/23/2021,"44.97","46.23","40.00","44.97","7,565,215" 16 | 02/22/2021,"46.69","48.51","42.40","46.00","19,476,020" 17 | 02/19/2021,"41.28","43.89","38.50","40.59","14,828,240" 18 | 02/18/2021,"48.49","48.87","40.65","40.69","23,990,561" 19 | 02/17/2021,"49.77","51.19","44.56","45.94","9,260,795" 20 | 02/16/2021,"52.66","53.50","49.04","49.51","8,175,030" 21 | 02/12/2021,"50.75","55.24","48.05","52.40","14,573,260" 22 | 02/11/2021,"50.01","55.32","48.22","51.10","13,056,730" 23 | 02/10/2021,"50.77","62.83","46.55","51.20","36,455,039" 24 | 02/09/2021,"56.61","57.00","46.52","50.31","26,843,080" 25 | 02/08/2021,"72.41","72.66","58.02","60.00","25,687,279" 26 | 02/05/2021,"54.04","95.00","51.09","63.77","81,345,008" 27 | 02/04/2021,"91.19","91.50","53.33","53.50","62,427,281" 28 | 02/03/2021,"112.01","113.40","85.25","92.41","42,698,512" 29 | 02/02/2021,"140.76","158.00","74.22","90.00","78,183,070" 30 | 02/01/2021,"316.56","322.00","212.00","225.00","37,382,152" 31 | 01/29/2021,"379.71","413.98","250.00","325.00","50,566,059" 32 | 01/28/2021,"265.00","483.00","112.25","193.60","58,815,809" 33 | 01/27/2021,"354.83","380.00","249.00","347.51","93,396,672" 34 | 01/26/2021,"88.56","150.00","80.20","147.98","178,588,000" 35 | 01/25/2021,"96.73","159.18","61.13","76.79","177,874,000" 36 | 01/22/2021,"42.59","76.76","42.32","65.01","197,157,906" 37 | 01/21/2021,"39.23","44.75","37.00","43.03","57,079,754" 38 | 01/20/2021,"37.37","41.19","36.06","39.12","33,471,789" 39 | 01/19/2021,"41.55","45.52","36.64","39.36","74,721,922" 40 | 01/15/2021,"38.49","40.75","34.01","35.50","46,866,359" 41 | 01/14/2021,"38.09","43.06","33.05","39.91","93,717,406" 42 | 01/13/2021,"20.42","38.65","20.03","31.40","144,501,703" 43 | 01/12/2021,"19.96","20.40","19.32","19.95","7,060,665" 44 | 01/11/2021,"19.41","20.65","19.01","19.94","14,927,610" 45 | 01/08/2021,"18.18","18.30","17.08","17.69","6,481,960" 46 | 01/07/2021,"18.47","19.45","18.02","18.08","6,129,276" 47 | 01/06/2021,"17.34","18.98","17.33","18.36","6,056,248" 48 | 01/05/2021,"17.35","18.08","17.23","17.37","4,961,457" 49 | 01/04/2021,"19.00","19.10","17.15","17.25","10,022,470" 50 | 12/31/2020,"19.25","19.80","18.80","18.84","6,922,652" 51 | 12/30/2020,"19.38","20.00","18.85","19.26","5,934,391" 52 | 12/29/2020,"20.82","21.07","18.56","19.38","9,241,441" 53 | 12/28/2020,"21.31","21.97","20.35","20.99","8,965,858" 54 | 12/24/2020,"21.01","21.48","19.95","20.15","6,262,174" 55 | 12/23/2020,"20.17","22.35","19.13","20.57","25,830,260" 56 | 12/22/2020,"16.22","20.04","16.15","19.46","30,687,721" 57 | 12/21/2020,"15.81","16.35","15.28","15.53","9,876,128" 58 | 12/18/2020,"15.78","16.30","15.18","15.63","16,618,779" 59 | 12/17/2020,"13.96","14.98","13.59","14.83","8,194,902" 60 | 12/16/2020,"13.96","14.31","13.58","13.85","5,865,123" 61 | 12/15/2020,"12.78","14.02","12.48","13.85","8,192,856" 62 | 12/14/2020,"13.34","13.43","12.14","12.72","10,007,090" 63 | 12/11/2020,"13.91","14.00","13.02","13.31","7,496,868" 64 | 12/10/2020,"13.12","14.41","13.05","14.12","7,558,922" 65 | 12/09/2020,"13.92","14.73","13.23","13.66","24,357,939" 66 | 12/08/2020,"16.37","17.21","15.93","16.94","16,120,160" 67 | 12/07/2020,"17.00","17.50","16.22","16.35","7,386,258" 68 | 12/04/2020,"16.30","17.29","16.26","16.90","8,972,672" 69 | 12/03/2020,"16.48","16.64","15.87","16.12","6,294,965" 70 | 12/02/2020,"15.70","16.68","15.38","16.58","7,883,380" 71 | 12/01/2020,"17.11","17.40","15.76","15.80","12,666,030" 72 | 11/30/2020,"18.17","19.42","16.56","16.56","31,983,500" 73 | 11/27/2020,"15.29","16.74","14.88","16.08","12,504,200" 74 | 11/25/2020,"13.60","15.25","13.42","14.75","8,860,092" 75 | 11/24/2020,"14.23","14.26","13.30","13.67","7,186,710" 76 | 11/23/2020,"12.90","14.12","12.67","13.90","9,607,973" 77 | 11/20/2020,"12.55","13.46","12.54","12.71","8,402,347" 78 | 11/19/2020,"11.60","12.79","11.45","12.46","11,787,610" 79 | 11/18/2020,"11.80","12.04","11.56","11.57","3,169,222" 80 | 11/17/2020,"11.65","11.92","11.23","11.63","6,678,176" 81 | 11/16/2020,"11.16","12.66","10.72","12.06","9,774,824" 82 | 11/13/2020,"11.36","11.55","11.00","11.01","3,546,171" 83 | 11/12/2020,"11.74","11.87","10.97","11.13","4,355,892" 84 | 11/11/2020,"11.50","11.95","11.21","11.75","4,882,569" 85 | 11/10/2020,"11.50","11.66","10.83","11.10","3,825,963" 86 | 11/09/2020,"12.76","12.93","11.25","11.49","6,244,865" 87 | 11/06/2020,"11.52","12.17","11.32","11.86","5,518,243" 88 | 11/05/2020,"11.27","11.84","11.06","11.45","4,705,245" 89 | 11/04/2020,"11.76","11.77","10.61","10.91","5,807,871" 90 | 11/03/2020,"10.75","11.86","10.63","11.57","7,454,472" 91 | 11/02/2020,"10.82","11.09","10.50","10.75","5,227,011" 92 | 10/30/2020,"11.64","11.64","10.36","10.47","11,562,370" 93 | 10/29/2020,"11.88","12.25","11.68","11.73","4,165,843" 94 | 10/28/2020,"12.27","13.05","11.78","11.82","6,388,580" 95 | 10/27/2020,"13.71","13.71","12.36","12.69","7,231,006" 96 | 10/26/2020,"14.93","15.45","13.26","13.45","13,376,270" 97 | 10/23/2020,"15.05","15.38","14.55","15.00","6,507,324" 98 | 10/22/2020,"14.20","15.87","14.19","14.91","16,212,230" 99 | 10/21/2020,"13.90","14.42","13.80","14.10","5,361,928" 100 | 10/20/2020,"14.03","14.14","13.67","13.86","6,603,951" 101 | 10/19/2020,"13.44","14.50","13.38","13.91","13,169,070" 102 | 10/16/2020,"13.77","13.90","13.08","13.31","11,651,580" 103 | 10/15/2020,"11.99","15.10","11.99","13.83","39,894,820" 104 | 10/14/2020,"12.67","12.68","12.05","12.25","10,776,760" 105 | 10/13/2020,"11.73","12.42","11.65","11.88","10,179,710" 106 | 10/12/2020,"11.66","12.77","11.40","11.80","23,655,699" 107 | 10/09/2020,"12.83","14.80","11.90","12.02","77,152,781" 108 | 10/08/2020,"9.54","13.64","9.19","13.49","76,453,562" 109 | 10/07/2020,"9.23","9.56","9.17","9.36","3,308,644" 110 | 10/06/2020,"9.56","9.84","9.10","9.13","4,535,421" 111 | 10/05/2020,"9.44","9.59","9.25","9.46","2,804,969" 112 | 10/02/2020,"9.38","9.78","9.30","9.39","4,340,484" 113 | 10/01/2020,"10.09","10.25","9.69","9.77","4,554,055" 114 | 09/30/2020,"10.25","10.76","10.06","10.20","6,079,033" 115 | 09/29/2020,"10.00","10.65","9.93","10.35","5,244,339" 116 | 09/28/2020,"10.16","10.26","9.55","10.09","6,764,323" 117 | 09/25/2020,"9.19","10.18","9.10","10.02","7,515,157" 118 | 09/24/2020,"9.71","9.81","9.01","9.14","7,938,838" 119 | 09/23/2020,"10.60","10.86","9.92","10.04","10,651,150" 120 | 09/22/2020,"10.45","11.17","9.90","10.56","34,752,480" 121 | 09/21/2020,"9.35","9.60","8.38","8.75","7,639,806" 122 | 09/18/2020,"9.20","9.77","8.91","9.47","17,407,510" 123 | 09/17/2020,"8.57","9.77","8.41","9.20","17,026,721" 124 | 09/16/2020,"7.03","9.04","7.03","8.68","19,346,510" 125 | 09/15/2020,"6.86","7.26","6.69","7.09","5,743,489" 126 | 09/14/2020,"6.80","7.00","6.43","6.91","10,118,970" 127 | 09/11/2020,"6.26","6.33","5.87","6.09","6,061,190" 128 | 09/10/2020,"6.65","6.95","6.19","6.23","15,558,280" 129 | 09/09/2020,"7.96","7.99","7.31","7.35","9,068,082" 130 | 09/08/2020,"7.55","8.28","7.48","7.70","9,816,620" 131 | 09/04/2020,"7.78","7.92","7.17","7.65","7,661,994" 132 | 09/03/2020,"7.88","8.45","7.24","7.82","14,344,500" 133 | 09/02/2020,"7.80","8.05","7.11","7.71","13,011,110" 134 | 09/01/2020,"7.30","7.82","6.77","7.65","23,211,051" 135 | 08/31/2020,"5.77","7.15","5.69","6.68","37,976,000" 136 | 08/28/2020,"5.30","5.57","5.22","5.39","4,236,926" 137 | 08/27/2020,"5.11","5.38","5.02","5.25","3,384,658" 138 | 08/26/2020,"4.97","5.22","4.92","5.11","2,779,664" 139 | 08/25/2020,"4.88","5.25","4.88","4.98","2,998,678" 140 | 08/24/2020,"5.10","5.13","4.56","4.87","4,585,366" 141 | 08/21/2020,"4.60","5.60","4.60","5.03","10,642,590" 142 | 08/20/2020,"4.62","4.68","4.51","4.61","2,441,184" 143 | 08/19/2020,"4.80","4.84","4.64","4.72","2,612,583" 144 | 08/18/2020,"4.61","4.87","4.44","4.81","3,834,840" 145 | 08/17/2020,"4.78","4.78","4.56","4.63","2,370,970" 146 | 08/14/2020,"4.60","4.83","4.55","4.75","3,474,692" 147 | 08/13/2020,"4.52","4.71","4.50","4.64","2,128,313" 148 | 08/12/2020,"4.40","4.63","4.36","4.52","3,057,594" 149 | 08/11/2020,"4.43","4.57","4.34","4.35","3,139,105" 150 | 08/10/2020,"4.20","4.57","4.18","4.33","4,561,772" 151 | 08/07/2020,"4.39","4.40","4.06","4.16","3,341,099" 152 | 08/06/2020,"4.60","4.66","4.38","4.43","1,901,224" 153 | 08/05/2020,"4.50","4.76","4.25","4.63","4,925,697" 154 | 08/04/2020,"4.13","4.74","4.13","4.43","10,361,360" 155 | 08/03/2020,"4.03","4.25","4.00","4.15","2,518,010" 156 | 07/31/2020,"4.06","4.16","3.99","4.01","1,879,553" 157 | 07/30/2020,"4.00","4.23","3.97","4.10","2,398,485" 158 | 07/29/2020,"3.94","4.18","3.92","4.06","2,879,626" 159 | 07/28/2020,"3.96","4.05","3.92","3.94","4,555,392" 160 | 07/27/2020,"4.02","4.12","3.95","4.01","2,472,696" 161 | 07/24/2020,"4.06","4.23","4.01","4.03","2,216,295" 162 | 07/23/2020,"4.09","4.31","4.06","4.11","3,237,550" 163 | 07/22/2020,"4.02","4.12","3.92","4.11","2,523,547" 164 | 07/21/2020,"3.90","4.09","3.88","4.01","3,341,012" 165 | 07/20/2020,"3.95","4.06","3.77","3.85","3,401,088" 166 | 07/17/2020,"4.16","4.23","3.94","3.96","3,066,549" 167 | 07/16/2020,"4.19","4.20","4.09","4.17","1,330,461" 168 | 07/15/2020,"4.13","4.29","4.13","4.19","1,474,126" 169 | 07/14/2020,"4.22","4.31","4.07","4.08","2,261,589" 170 | 07/13/2020,"4.35","4.55","4.26","4.26","4,216,265" 171 | 07/10/2020,"4.20","4.38","4.18","4.34","1,410,828" 172 | 07/09/2020,"4.27","4.32","4.13","4.21","1,992,621" 173 | 07/08/2020,"4.10","4.29","4.03","4.26","2,052,829" 174 | 07/07/2020,"4.20","4.25","4.06","4.09","2,456,970" 175 | 07/06/2020,"4.31","4.34","4.19","4.24","2,140,879" 176 | 07/02/2020,"4.49","4.51","4.29","4.29","1,887,751" 177 | 07/01/2020,"4.31","4.50","4.31","4.44","2,304,101" 178 | 06/30/2020,"4.33","4.51","4.20","4.34","3,889,029" 179 | 06/29/2020,"4.35","4.52","4.30","4.38","2,131,330" 180 | 06/26/2020,"4.48","4.50","4.27","4.35","3,801,155" 181 | 06/25/2020,"4.33","4.54","4.30","4.46","2,450,936" 182 | 06/24/2020,"4.83","4.84","4.38","4.41","2,976,209" 183 | 06/23/2020,"4.95","4.99","4.80","4.83","3,205,372" 184 | 06/22/2020,"4.79","4.95","4.72","4.87","3,178,966" 185 | 06/19/2020,"4.95","5.08","4.69","4.88","7,365,867" 186 | 06/18/2020,"4.67","4.95","4.65","4.95","3,423,827" 187 | 06/17/2020,"4.54","4.83","4.53","4.76","3,593,466" 188 | 06/16/2020,"4.95","4.95","4.51","4.64","3,123,535" 189 | 06/15/2020,"4.50","4.77","4.42","4.69","3,910,385" 190 | 06/12/2020,"4.60","4.78","4.39","4.72","4,378,192" 191 | 06/11/2020,"4.64","4.90","4.18","4.37","6,235,993" 192 | 06/10/2020,"4.78","5.53","4.68","5.07","10,606,370" 193 | 06/09/2020,"5.00","5.00","4.55","4.96","8,073,448" 194 | 06/08/2020,"4.28","5.14","4.27","5.01","10,133,660" 195 | 06/05/2020,"4.29","4.41","4.09","4.14","6,274,428" 196 | 06/04/2020,"4.44","4.72","4.37","4.47","3,514,299" 197 | 06/03/2020,"4.24","4.52","4.20","4.44","3,037,424" 198 | 06/02/2020,"4.27","4.31","4.06","4.18","2,369,780" 199 | 06/01/2020,"4.12","4.36","4.02","4.13","2,618,424" 200 | 05/29/2020,"4.33","4.42","4.05","4.06","3,973,540" 201 | 05/28/2020,"4.75","4.76","4.30","4.33","2,184,367" 202 | 05/27/2020,"4.57","4.71","4.36","4.69","3,146,603" 203 | 05/26/2020,"4.34","4.61","4.33","4.42","3,545,926" 204 | 05/22/2020,"4.46","4.49","4.13","4.18","2,379,851" 205 | 05/21/2020,"4.45","4.65","4.40","4.44","1,971,906" 206 | 05/20/2020,"4.50","4.69","4.34","4.43","2,543,609" 207 | 05/19/2020,"4.58","4.75","4.37","4.44","1,840,732" 208 | 05/18/2020,"4.40","4.63","4.36","4.58","2,371,694" 209 | 05/15/2020,"4.05","4.45","4.04","4.22","1,940,704" 210 | 05/14/2020,"4.15","4.19","3.96","4.13","2,004,868" 211 | 05/13/2020,"4.54","4.54","4.07","4.21","2,882,877" 212 | 05/12/2020,"4.78","4.92","4.46","4.54","2,639,157" 213 | 05/11/2020,"4.92","4.96","4.75","4.76","1,699,158" 214 | 05/08/2020,"4.88","5.19","4.82","4.98","2,353,661" 215 | 05/07/2020,"4.83","4.94","4.65","4.87","2,501,195" 216 | 05/06/2020,"5.40","5.40","4.90","4.93","3,369,640" 217 | 05/05/2020,"5.55","5.63","5.35","5.39","2,105,919" 218 | 05/04/2020,"5.84","5.93","5.40","5.48","4,068,105" 219 | 05/01/2020,"5.65","6.18","5.45","6.05","4,005,598" 220 | 04/30/2020,"5.87","5.98","5.64","5.73","2,173,530" 221 | 04/29/2020,"5.83","6.09","5.45","6.04","3,370,045" 222 | 04/28/2020,"5.92","6.04","5.06","5.64","5,200,189" 223 | 04/27/2020,"4.85","5.99","4.81","5.82","7,275,138" 224 | 04/24/2020,"4.78","4.85","4.66","4.77","2,236,544" 225 | 04/23/2020,"4.75","4.89","4.58","4.70","2,265,853" 226 | 04/22/2020,"5.14","5.17","4.83","4.89","2,678,133" 227 | 04/21/2020,"5.23","5.30","4.76","4.78","4,142,050" 228 | 04/20/2020,"4.85","5.90","4.78","5.61","6,085,011" 229 | 04/17/2020,"5.22","5.28","4.43","4.88","5,653,188" 230 | 04/16/2020,"5.12","5.44","4.88","5.03","3,371,921" 231 | 04/15/2020,"5.66","5.67","4.90","5.27","7,499,854" 232 | 04/14/2020,"5.21","6.47","5.14","5.95","13,506,630" 233 | 04/13/2020,"4.25","4.76","4.16","4.74","6,844,501" 234 | 04/09/2020,"3.60","4.25","3.49","3.89","5,908,916" 235 | 04/08/2020,"3.23","3.67","3.20","3.41","2,884,528" 236 | 04/07/2020,"3.39","3.44","3.10","3.27","2,836,859" 237 | 04/06/2020,"2.86","3.20","2.83","3.09","3,331,070" 238 | 04/03/2020,"2.85","2.94","2.57","2.80","3,830,761" 239 | 04/02/2020,"3.26","3.35","2.85","2.85","4,064,339" 240 | 04/01/2020,"3.45","3.49","3.12","3.25","4,568,695" 241 | 03/31/2020,"3.63","3.80","3.50","3.50","2,304,132" 242 | 03/30/2020,"4.22","4.27","3.65","3.65","3,350,571" 243 | 03/27/2020,"4.94","5.09","4.15","4.22","7,024,763" 244 | 03/26/2020,"4.24","4.71","4.24","4.41","6,210,979" 245 | 03/25/2020,"4.15","4.49","4.04","4.17","3,592,059" 246 | 03/24/2020,"3.95","4.21","3.89","4.16","6,805,659" 247 | 03/23/2020,"3.58","3.86","3.50","3.81","6,009,784" 248 | 03/20/2020,"4.08","4.08","3.65","3.76","7,722,194" 249 | 03/19/2020,"3.71","4.20","3.55","4.19","5,039,539" 250 | 03/18/2020,"4.10","4.25","3.50","3.77","3,651,709" 251 | 03/17/2020,"4.40","4.65","4.11","4.23","3,562,210" 252 | 03/16/2020,"3.93","4.57","3.90","4.37","4,866,696" 253 | --------------------------------------------------------------------------------