File size: 115,131 Bytes
5e78fe5 2ba5a41 5e78fe5 5d5dd44 5e78fe5 a39f235 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 ab0f626 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 ab0f626 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 5d5dd44 5e78fe5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 |
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "nwaAZRu1NTiI"
},
"source": [
"# Q-learning \n",
"\n",
"#### This version implements q-learning using a custom enviroment \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "DDf1gLC2NTiK"
},
"outputs": [],
"source": [
"# !pip install -r ./requirements.txt\n",
"!pip install stable_baselines3[extra]\n",
"!pip install yfinance\n",
"!pip install talib-binary\n",
"!pip install huggingface_sb3\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "LNXxxKojNTiL"
},
"outputs": [],
"source": [
"import gym\n",
"from gym import spaces\n",
"from gym.utils import seeding\n",
"\n",
"import talib as ta\n",
"from tqdm.notebook import tqdm\n",
"\n",
"import yfinance as yf\n",
"import pandas as pd\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "dmAuEhZZNTiL"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3015\n",
"1866\n"
]
},
{
"data": {
"text/plain": [
"1664"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get data\n",
"eth_usd = yf.Ticker(\"ETH-USD\")\n",
"eth = eth_usd.history(period=\"max\")\n",
"\n",
"btc_usd = yf.Ticker(\"BTC-USD\")\n",
"btc = btc_usd.history(period=\"max\")\n",
"print(len(btc))\n",
"print(len(eth))\n",
"\n",
"btc_train = eth[-3015:-200]\n",
"# btc_test = eth[-200:]\n",
"eth_train = eth[-1864:-200]\n",
"eth_test = eth[-200:]\n",
"# len(eth_train)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def initialize_q_table(state_space, action_space):\n",
" Qtable = np.zeros((state_space, action_space))\n",
" return Qtable"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"# Policy\n",
"\n",
"def greedy_policy(Qtable, state):\n",
" # Exploitation: take the action with the highest state, action value\n",
" # if we dont have a state with values return DO_NOTHING \n",
" if abs(np.max(Qtable[state])) > 0:\n",
" action = np.argmax(Qtable[state])\n",
" else:\n",
" action = 2\n",
" # action = np.argmax(Qtable[state])\n",
" return action\n",
"\n",
"\n",
"def epsilon_greedy_policy(Qtable, state, epsilon, env):\n",
" # Randomly generate a number between 0 and 1\n",
" random_num = np.random.uniform(size=1)\n",
" # if random_num > greater than epsilon --> exploitation\n",
" if random_num > epsilon:\n",
" # Take the action with the highest value given a state\n",
" # np.argmax can be useful here\n",
" action = greedy_policy(Qtable, state)\n",
" # else --> exploration\n",
" else:\n",
" # action = np.random.random_integers(4,size=1)[0]\n",
" action = env.action_space.sample()\n",
" \n",
" return action"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "wlC-EdLENTiN"
},
"outputs": [],
"source": [
"def train(n_training_episodes, min_epsilon, max_epsilon, decay_rate, env, max_steps, Qtable, learning_rate, gamma):\n",
" state_history = []\n",
" \n",
" for episode in range(n_training_episodes):\n",
" # Reduce epsilon (because we need less and less exploration)\n",
" epsilon = min_epsilon + (max_epsilon - min_epsilon)*np.exp(-decay_rate*episode)\n",
" # Reset the environment\n",
" state = env.reset()\n",
" step = 0\n",
" done = False\n",
"\n",
" # repeat\n",
" for step in range(max_steps):\n",
" # Choose the action At using epsilon greedy policy\n",
" action = epsilon_greedy_policy(Qtable, state, epsilon, env)\n",
"\n",
" # Take action At and observe Rt+1 and St+1\n",
" # Take the action (a) and observe the outcome state(s') and reward (r)\n",
" new_state, reward, done, info = env.step(action)\n",
"\n",
" # Update Q(s,a):= Q(s,a) + lr [R(s,a) + gamma * max Q(s',a') - Q(s,a)]\n",
" Qtable[state][action] = Qtable[state][action] + learning_rate * (reward + gamma * ( np.max(Qtable[new_state]) ) - Qtable[state][action] )\n",
"\n",
" # If done, finish the episode\n",
" if done:\n",
" break\n",
" \n",
" # Our next state is the new state\n",
" state = new_state\n",
"\n",
" state_history.append(state) \n",
"\n",
" return Qtable, state_history"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
"from enum import Enum\n",
"class Actions(Enum):\n",
" Sell = 0\n",
" Buy = 1\n",
" Do_nothing = 2\n",
"\n",
"class CustTradingEnv(gym.Env):\n",
"\n",
" def __init__(self, df, max_steps=0):\n",
" self.seed()\n",
" self.df = df\n",
" self.prices, self.signal_features = self._process_data()\n",
"\n",
" # spaces\n",
" self.action_space = spaces.Discrete(3)\n",
" self.observation_space = spaces.Box(low=0, high=1999, shape=(1,) , dtype=np.float64)\n",
"\n",
" # episode\n",
" self._start_tick = 0\n",
" self._end_tick = 0\n",
" self._done = None\n",
" self._current_tick = None\n",
" self._last_trade_tick = None\n",
" self._position = None\n",
" self._position_history = None\n",
" self._total_reward = None\n",
" self._total_profit = None\n",
" self._first_rendering = None\n",
" self.history = None\n",
" self._max_steps = max_steps\n",
" self._start_episode_tick = None\n",
" self._trade_history = None\n",
"\n",
" def reset(self):\n",
" self._done = False\n",
" self._start_episode_tick = np.random.randint(1,len(self.df)- self._max_steps )\n",
" self._end_tick = self._start_episode_tick + self._max_steps\n",
" self._current_tick = self._start_episode_tick\n",
" self._last_trade_tick = self._current_tick - 1\n",
" self._position = 0\n",
" self._position_history = []\n",
" # self._position_history = (self.window_size * [None]) + [self._position]\n",
" self._total_reward = 0.\n",
" self._total_profit = 0.\n",
" self._trade_history = []\n",
" self.history = {}\n",
" return self._get_observation()\n",
"\n",
"\n",
" def step(self, action):\n",
" self._done = False\n",
" self._current_tick += 1\n",
"\n",
" if self._current_tick == self._end_tick:\n",
" self._done = True\n",
"\n",
" step_reward = self._calculate_reward(action)\n",
" self._total_reward += step_reward\n",
"\n",
" observation = self._get_observation()\n",
" info = dict(\n",
" total_reward = self._total_reward,\n",
" total_profit = self._total_profit,\n",
" position = self._position,\n",
" action = action\n",
" )\n",
" self._update_history(info)\n",
"\n",
" return observation, step_reward, self._done, info\n",
"\n",
" def seed(self, seed=None):\n",
" self.np_random, seed = seeding.np_random(seed)\n",
" return [seed]\n",
" \n",
" def _get_observation(self):\n",
" return self.signal_features[self._current_tick]\n",
"\n",
" def _update_history(self, info):\n",
" if not self.history:\n",
" self.history = {key: [] for key in info.keys()}\n",
"\n",
" for key, value in info.items():\n",
" self.history[key].append(value)\n",
"\n",
"\n",
" def render(self, mode='human'):\n",
" window_ticks = np.arange(len(self._position_history))\n",
" prices = self.prices[self._start_episode_tick:self._end_tick+1]\n",
" plt.plot(prices)\n",
"\n",
" open_buy = []\n",
" close_buy = []\n",
" open_sell = []\n",
" close_sell = []\n",
" do_nothing = []\n",
"\n",
" for i, tick in enumerate(window_ticks):\n",
" if self._position_history[i] == 1:\n",
" open_buy.append(tick)\n",
" elif self._position_history[i] == 2 :\n",
" close_buy.append(tick)\n",
" elif self._position_history[i] == 3 :\n",
" open_sell.append(tick)\n",
" elif self._position_history[i] == 4 :\n",
" close_sell.append(tick)\n",
" elif self._position_history[i] == 0 :\n",
" do_nothing.append(tick)\n",
"\n",
" plt.plot(open_buy, prices[open_buy], 'go', marker=\"^\")\n",
" plt.plot(close_buy, prices[close_buy], 'go', marker=\"v\")\n",
" plt.plot(open_sell, prices[open_sell], 'ro', marker=\"v\")\n",
" plt.plot(close_sell, prices[close_sell], 'ro', marker=\"^\")\n",
" \n",
" plt.plot(do_nothing, prices[do_nothing], 'yo')\n",
"\n",
" plt.suptitle(\n",
" \"Total Reward: %.6f\" % self._total_reward + ' ~ ' +\n",
" \"Total Profit: %.6f\" % self._total_profit\n",
" )\n",
"\n",
" def _calculate_reward(self, action):\n",
" step_reward = 0\n",
"\n",
" current_price = self.prices[self._current_tick]\n",
" last_price = self.prices[self._current_tick - 1]\n",
" price_diff = current_price - last_price\n",
"\n",
" penalty = -1 * last_price * 0.01\n",
" # OPEN BUY - 1\n",
" if action == Actions.Buy.value and self._position == 0:\n",
" self._position = 1\n",
" step_reward += price_diff\n",
" self._last_trade_tick = self._current_tick - 1\n",
" self._position_history.append(1)\n",
"\n",
" elif action == Actions.Buy.value and self._position > 0:\n",
" step_reward += penalty\n",
" self._position_history.append(-1)\n",
" # CLOSE SELL - 4\n",
" elif action == Actions.Buy.value and self._position < 0:\n",
" self._position = 0\n",
" step_reward += -1 * (self.prices[self._current_tick -1] - self.prices[self._last_trade_tick]) \n",
" self._total_profit += step_reward\n",
" self._position_history.append(4)\n",
" self._trade_history.append(step_reward)\n",
"\n",
" # OPEN SELL - 3\n",
" elif action == Actions.Sell.value and self._position == 0:\n",
" self._position = -1\n",
" step_reward += -1 * price_diff\n",
" self._last_trade_tick = self._current_tick - 1\n",
" self._position_history.append(3)\n",
" # CLOSE BUY - 2\n",
" elif action == Actions.Sell.value and self._position > 0:\n",
" self._position = 0\n",
" step_reward += self.prices[self._current_tick -1] - self.prices[self._last_trade_tick] \n",
" self._total_profit += step_reward\n",
" self._position_history.append(2)\n",
" self._trade_history.append(step_reward)\n",
" elif action == Actions.Sell.value and self._position < 0:\n",
" step_reward += penalty\n",
" self._position_history.append(-1)\n",
"\n",
" # DO NOTHING - 0\n",
" elif action == Actions.Do_nothing.value and self._position > 0:\n",
" step_reward += price_diff\n",
" self._position_history.append(0)\n",
" elif action == Actions.Do_nothing.value and self._position < 0:\n",
" step_reward += -1 * price_diff\n",
" self._position_history.append(0)\n",
" elif action == Actions.Do_nothing.value and self._position == 0:\n",
" step_reward += -1 * abs(price_diff)\n",
" self._position_history.append(0)\n",
"\n",
" return step_reward\n",
"\n",
" def _do_bin(self,df):\n",
" df = pd.cut(df,bins=[0,10,20,30,40,50,60,70,80,90,100],labels=False, include_lowest=True)\n",
" return df\n",
" # Our state will be encode with 4 features MFI and Stochastic(only D line), ADX and DI+DI-\n",
" # the values of each feature will be binned in 10 bins, ex:\n",
" # MFI goes from 0-100, if we get 25 will put on the second bin \n",
" # DI+DI- if DI+ is over DI- set (1 otherwise 0) \n",
" # \n",
" # that will give a state space of 10(MFI) * 10(STOCH) * 10(ADX) * 2(DI) = 2000 states\n",
" # encoded as bins of DI MFI STOCH ADX = 1 45.2 25.4 90.1 , binned = 1 4 2 9 state = 1429 \n",
" def _process_data(self):\n",
" timeperiod = 14\n",
" self.df = self.df.copy()\n",
" \n",
" self.df['mfi_r'] = ta.MFI(self.df['High'], self.df['Low'], self.df['Close'],self.df['Volume'], timeperiod=timeperiod)\n",
" _, self.df['stock_d_r'] = ta.STOCH(self.df['High'], self.df['Low'], self.df['Close'], fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)\n",
" self.df['adx_r'] = ta.ADX(self.df['High'], self.df['Low'], self.df['Close'], timeperiod=timeperiod)\n",
" self.df['p_di'] = ta.PLUS_DI(self.df['High'], self.df['Low'], self.df['Close'], timeperiod=timeperiod)\n",
" self.df['m_di'] = ta.MINUS_DI(self.df['High'], self.df['Low'], self.df['Close'], timeperiod=timeperiod)\n",
" self.df['di'] = np.where( self.df['p_di'] > self.df['m_di'], 1, 0)\n",
"\n",
" self.df = self.df.dropna()\n",
" self.df['mfi'] = self._do_bin(self.df['mfi_r'])\n",
" self.df['stock_d'] = self._do_bin(self.df['stock_d_r'])\n",
" self.df['adx'] = self._do_bin(self.df['adx_r'])\n",
" self.df['state'] = self.df['di']*1000+ self.df['mfi']*100 + self.df['stock_d']*10 + self.df['adx']\n",
"\n",
" prices = self.df.loc[:, 'Close'].to_numpy()\n",
" # print(self.df.head(30))\n",
"\n",
" signal_features = self.df.loc[:, 'state'].to_numpy()\n",
"\n",
" return prices, signal_features"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
"# Training parameters\n",
"n_training_episodes = 20000 # Total training episodes\n",
"learning_rate = 0.2 # Learning rate\n",
"\n",
"# Environment parameters\n",
"max_steps = 20 # Max steps per episode\n",
"gamma = 0.95 # Discounting rate\n",
"\n",
"# Exploration parameters\n",
"max_epsilon = 1.0 # Exploration probability at start\n",
"# max_epsilon = 1.0 # Exploration probability at start\n",
"min_epsilon = 0.05 # Minimum exploration probability \n",
"# min_epsilon = 0.05 # Minimum exploration probability \n",
"decay_rate = 0.0005 # Exponential decay rate for exploration prob"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "REhmfLkYNTiN",
"outputId": "cf676f6d-83df-43f5-89fe-3258e0041d9d"
},
"outputs": [],
"source": [
"# create env\n",
"env = CustTradingEnv(df=eth_train, max_steps=max_steps)"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
"# create q-table\n",
"\n",
"action_space = env.action_space.n # buy sell do_nothing\n",
"state_space = 2000\n",
"\n",
"Qtable_trading = initialize_q_table(state_space, action_space)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"997"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# train with ETH\n",
"Qtable_trading, state_history = train(n_training_episodes, min_epsilon, max_epsilon, \n",
" decay_rate, env, max_steps, Qtable_trading, learning_rate, gamma )\n",
"len(np.where( Qtable_trading > 0 )[0])\n",
"\n",
"# #train with BTC\n",
"# env = CustTradingEnv(df=btc_train, max_steps=max_steps)\n",
"# Qtable_trading, state_history = train(n_training_episodes, min_epsilon, max_epsilon, \n",
"# decay_rate, env, max_steps, Qtable_trading, learning_rate, gamma )\n",
"# len(np.where( Qtable_trading > 0 )[0])"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 417
},
"id": "FIQ0OqtsO3jo",
"outputId": "f98374ad-c7de-4dc4-80b1-25f018ad96eb"
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 1080x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(15,6))\n",
"plt.cla()\n",
"env.render()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[919.390869140625,\n",
" 488.588623046875,\n",
" 626.90869140625,\n",
" 29.600830078125,\n",
" -8.8203125,\n",
" 166.931396484375]"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"env._trade_history"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"351"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(np.unique(state_history, return_counts=True)[1])\n",
"# count = 0\n",
"# for i in range(len(state_history)):\n",
"# if state_history[i] == 1987:\n",
"# count +=1\n",
"# count"
]
},
{
"cell_type": "code",
"execution_count": 438,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"352"
]
},
"execution_count": 438,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Qtable_trading[1987]\n",
"len(np.unique(env.signal_features))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def evaluate_agent(env, max_steps, n_eval_episodes, Q):\n",
" \"\"\"\n",
" Evaluate the agent for ``n_eval_episodes`` episodes and returns average reward and std of reward.\n",
" :param env: The evaluation environment\n",
" :param n_eval_episodes: Number of episode to evaluate the agent\n",
" :param Q: The Q-table\n",
" :param seed: The evaluation seed array (for taxi-v3)\n",
" \"\"\"\n",
" episode_rewards = []\n",
" episode_profits = []\n",
" for episode in tqdm(range(n_eval_episodes)):\n",
" state = env.reset()\n",
" step = 0\n",
" done = False\n",
" total_rewards_ep = 0\n",
" total_profit_ep = 0\n",
" \n",
" for step in range(max_steps):\n",
" # Take the action (index) that have the maximum expected future reward given that state\n",
" action = greedy_policy(Q, state)\n",
" new_state, reward, done, info = env.step(action)\n",
" total_rewards_ep += reward\n",
" \n",
" if done:\n",
" break\n",
" state = new_state\n",
"\n",
" episode_rewards.append(total_rewards_ep)\n",
" episode_profits.append(env.history['total_profit'][-1])\n",
" # print(env.history)\n",
" # env.render()\n",
" # assert 0\n",
"\n",
" mean_reward = np.mean(episode_rewards)\n",
" std_reward = np.std(episode_rewards)\n",
" mean_profit = np.mean(episode_profits)\n",
" std_profit = np.std(episode_profits)\n",
"\n",
" return mean_reward, std_reward, mean_profit, std_profit"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "746362c4808b4d068d499fd7b96419b0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/1000 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(-116.95613086669924, 426.2067715690095, 75.0213076171875, 277.93974493730184)"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"max_steps = 20 \n",
"env_test = CustTradingEnv(df=eth_test, max_steps=max_steps)\n",
"n_eval_episodes = 1000\n",
"\n",
"evaluate_agent(env_test, max_steps, n_eval_episodes, Qtable_trading)"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 1080x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(15,6))\n",
"plt.cla()\n",
"env_test.render()"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"173 151 0.8728323699421965\n"
]
}
],
"source": [
"def count_equal(env, Qtable):\n",
" count=0\n",
" for i in env.signal_features:\n",
" if abs(np.max(Qtable[i])) > 0:\n",
" count+=1\n",
" # else:\n",
" # print(i)\n",
" # assert 0\n",
" \n",
" print(len(env.signal_features), count, count / len(env.signal_features))\n",
"\n",
"count_equal(env_test, Qtable_trading)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3.8.13 ('rl2')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.13"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "cd60ab8388a66026f336166410d6a8a46ddf65ece2e85ad2d46c8b98d87580d1"
}
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"01a2dbcb714e40148b41c761fcf43147": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"20b0f38ec3234ff28a62a286cd57b933": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "PasswordModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "PasswordModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "PasswordView",
"continuous_update": true,
"description": "Token:",
"description_tooltip": null,
"disabled": false,
"layout": "IPY_MODEL_01a2dbcb714e40148b41c761fcf43147",
"placeholder": "",
"style": "IPY_MODEL_90c874e91b304ee1a7ef147767ac00ce",
"value": ""
}
},
"270cbb5d6e9c4b1e9e2f39c8b3b0c15f": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "VBoxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "VBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "VBoxView",
"box_style": "",
"children": [
"IPY_MODEL_a02224a43d8d4af3bd31d326540d25da",
"IPY_MODEL_20b0f38ec3234ff28a62a286cd57b933",
"IPY_MODEL_f6c845330d6743c0b35c2c7ad834de77",
"IPY_MODEL_f1675c09d16a4251b403f9c56255f168",
"IPY_MODEL_c1a82965ae26479a98e4fdbde1e64ec2"
],
"layout": "IPY_MODEL_3fa248114ac24656ba74923936a94d2d"
}
},
"2dc5fa9aa3334dfcbdee9c238f2ef60b": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"3e753b0212644990b558c68853ff2041": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"3fa248114ac24656ba74923936a94d2d": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": "center",
"align_self": null,
"border": null,
"bottom": null,
"display": "flex",
"flex": null,
"flex_flow": "column",
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": "50%"
}
},
"42d140b838b844819bc127afc1b7bc84": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"90c874e91b304ee1a7ef147767ac00ce": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"9d847f9a7d47458d8cd57d9b599e47c6": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"a02224a43d8d4af3bd31d326540d25da": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_caef095934ec47bbb8b64eab22049284",
"placeholder": "",
"style": "IPY_MODEL_2dc5fa9aa3334dfcbdee9c238f2ef60b",
"value": "<center> <img\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.svg\nalt='Hugging Face'> <br> Copy a token from <a\nhref=\"https://huggingface.co/settings/tokens\" target=\"_blank\">your Hugging Face\ntokens page</a> and paste it below. <br> Immediately click login after copying\nyour token or it might be stored in plain text in this notebook file. </center>"
}
},
"a2cfb91cf66447d7899292854bd64a07": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"c1a82965ae26479a98e4fdbde1e64ec2": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
"layout": "IPY_MODEL_9d847f9a7d47458d8cd57d9b599e47c6",
"placeholder": "",
"style": "IPY_MODEL_42d140b838b844819bc127afc1b7bc84",
"value": "\n<b>Pro Tip:</b> If you don't already have one, you can create a dedicated\n'notebooks' token with 'write' access, that you can then easily reuse for all\nnotebooks. </center>"
}
},
"caef095934ec47bbb8b64eab22049284": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"overflow_x": null,
"overflow_y": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"eaba3f1de4444aabadfea2a3dadb1d80": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"description_width": ""
}
},
"ee4a21bedc504171ad09d205d634b528": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ButtonStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
"button_color": null,
"font_weight": ""
}
},
"f1675c09d16a4251b403f9c56255f168": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "ButtonModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "ButtonModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "ButtonView",
"button_style": "",
"description": "Login",
"disabled": false,
"icon": "",
"layout": "IPY_MODEL_a2cfb91cf66447d7899292854bd64a07",
"style": "IPY_MODEL_ee4a21bedc504171ad09d205d634b528",
"tooltip": ""
}
},
"f6c845330d6743c0b35c2c7ad834de77": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
"model_name": "CheckboxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_model_name": "CheckboxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
"_view_name": "CheckboxView",
"description": "Add token as git credential?",
"description_tooltip": null,
"disabled": false,
"indent": true,
"layout": "IPY_MODEL_3e753b0212644990b558c68853ff2041",
"style": "IPY_MODEL_eaba3f1de4444aabadfea2a3dadb1d80",
"value": true
}
}
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}
|