From ecf16b8726138bff78130fcb838b4a01eb137e71 Mon Sep 17 00:00:00 2001 From: manishrana Date: Sun, 30 Jun 2024 17:36:46 +0530 Subject: [PATCH] RL --- ...StrategiesusingReinforcementLearning.ipynb | 1 + .../HistoricalData_1719635817381 (1).csv | 23 ++++++++++++++++++ .../dqn_agent.h5 | Bin 0 -> 41232 bytes .../requierement.txt | 6 +++++ 4 files changed, 30 insertions(+) create mode 100644 Dynamic Hedging Strategies using Reinforcement Learning/DynamicHedgingStrategiesusingReinforcementLearning.ipynb create mode 100644 Dynamic Hedging Strategies using Reinforcement Learning/HistoricalData_1719635817381 (1).csv create mode 100644 Dynamic Hedging Strategies using Reinforcement Learning/dqn_agent.h5 create mode 100644 Dynamic Hedging Strategies using Reinforcement Learning/requierement.txt diff --git a/Dynamic Hedging Strategies using Reinforcement Learning/DynamicHedgingStrategiesusingReinforcementLearning.ipynb b/Dynamic Hedging Strategies using Reinforcement Learning/DynamicHedgingStrategiesusingReinforcementLearning.ipynb new file mode 100644 index 00000000..64ce411f --- /dev/null +++ b/Dynamic Hedging Strategies using Reinforcement Learning/DynamicHedgingStrategiesusingReinforcementLearning.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyNSwhEY61a4SLgMM8+Euhvy"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"NapX2-9G9OV9","executionInfo":{"status":"ok","timestamp":1719748066537,"user_tz":-330,"elapsed":5213,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"07338948-63c8-4012-98ae-d1a2205a96cc"},"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]}],"source":["from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","source":["import pandas as pd\n","data=pd.read_csv(\"/content/drive/MyDrive/GirlsScriptOpenSource/Hedging-of-Financial-Derivatives/DynamicHedgingStrategiesusingReinforcementLearning/HistoricalData_1719635817381.csv\")"],"metadata":{"id":"KqQuWmNi-ALt","executionInfo":{"status":"ok","timestamp":1719748067277,"user_tz":-330,"elapsed":745,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}}},"execution_count":4,"outputs":[]},{"cell_type":"markdown","source":["Preprocess the Data"],"metadata":{"id":"zUMCEfI59dFb"}},{"cell_type":"code","source":["import pandas as pd\n","from sklearn.preprocessing import MinMaxScaler\n","\n","# Convert the 'Date' column to datetime format\n","data['Date'] = pd.to_datetime(data['Date'], format='%m/%d/%Y')\n","\n","# Check column names\n","print(data.columns)\n","\n","# Initialize the scaler\n","scaler = MinMaxScaler()\n","\n","# Normalize the price columns\n","data[['Close/Last', 'Open', 'High', 'Low']] = scaler.fit_transform(data[['Close/Last', 'Open', 'High', 'Low']])\n","\n","# Create a column for daily returns\n","data['Daily Return'] = data['Close/Last'].pct_change()\n","\n","# Drop the first row with NaN value in 'Daily Return'\n","data = data.dropna()\n","\n","# Verify 'Daily Return' column is created\n","print(data.head())\n","print(data.columns)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"DIoNHwdj9Rhc","executionInfo":{"status":"ok","timestamp":1719748069781,"user_tz":-330,"elapsed":2510,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"f2a4ae11-9da1-4abc-9e54-e456767d2e47"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","text":["Index(['Date', 'Close/Last', 'Open', 'High', 'Low'], dtype='object')\n"," Date Close/Last Open High Low Daily Return\n","1 2024-06-27 0.983463 0.897188 0.875375 0.986483 0.099511\n","2 2024-06-26 0.963705 0.847029 0.846259 0.930446 -0.020090\n","3 2024-06-25 0.929517 0.847106 0.807311 0.911458 -0.035476\n","4 2024-06-24 0.844325 0.842628 0.874805 0.915141 -0.091652\n","5 2024-06-21 0.910912 0.870629 0.827924 0.931018 0.078864\n","Index(['Date', 'Close/Last', 'Open', 'High', 'Low', 'Daily Return'], dtype='object')\n"]}]},{"cell_type":"code","source":[],"metadata":{"id":"VrkbSto198dl","executionInfo":{"status":"ok","timestamp":1719748069782,"user_tz":-330,"elapsed":10,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}}},"execution_count":5,"outputs":[]},{"cell_type":"markdown","source":["Define the Environment"],"metadata":{"id":"BcOGyrbg9gjM"}},{"cell_type":"code","source":["import numpy as np\n","import gym\n","from gym import spaces\n","\n","class HedgingEnv(gym.Env):\n"," def __init__(self, data):\n"," super(HedgingEnv, self).__init__()\n"," self.data = data\n"," self.current_step = 0\n","\n"," # State space: normalized prices and daily returns\n"," self.observation_space = spaces.Box(\n"," low=-np.inf, high=np.inf, shape=(5,), dtype=np.float32\n"," )\n","\n"," # Action space: increase, decrease, or maintain hedge ratio\n"," self.action_space = spaces.Discrete(3)\n","\n"," # Initial hedge ratio\n"," self.hedge_ratio = 0.5\n","\n"," def reset(self):\n"," self.current_step = 0\n"," self.hedge_ratio = 0.5\n"," return self._next_observation()\n","\n"," def _next_observation(self):\n"," obs = self.data.iloc[self.current_step][['Close/Last', 'Open', 'High', 'Low', 'Daily Return']].values\n"," return obs\n","\n"," def step(self, action):\n"," self.current_step += 1\n","\n"," if self.current_step >= len(self.data) - 1:\n"," done = True\n"," else:\n"," done = False\n","\n"," # Update hedge ratio based on action\n"," if action == 0:\n"," self.hedge_ratio -= 0.1\n"," elif action == 1:\n"," self.hedge_ratio += 0.1\n"," self.hedge_ratio = np.clip(self.hedge_ratio, 0, 1)\n","\n"," # Calculate reward (simplified example)\n"," reward = -abs(self.data.iloc[self.current_step]['Daily Return'] - self.hedge_ratio)\n","\n"," return self._next_observation(), reward, done, {}\n","\n"," def render(self, mode='human'):\n"," pass\n","\n","# Example usage\n","env = HedgingEnv(data)\n","initial_observation = env.reset()\n","print(initial_observation)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"w8fxsPLW9Vux","executionInfo":{"status":"ok","timestamp":1719748070777,"user_tz":-330,"elapsed":1001,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"0c2dad73-766b-4915-e486-156dcfeb7ae8"},"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["[0.9834625322997432 0.8971882545369603 0.8753748623922881\n"," 0.9864826205120885 0.09951111111111066]\n"]}]},{"cell_type":"markdown","source":["Implement the DQN Agent"],"metadata":{"id":"Raff6CDH9jQO"}},{"cell_type":"code","source":["import numpy as np\n","import gym\n","from gym import spaces\n","from collections import deque\n","import random\n","import tensorflow as tf\n","from tensorflow.keras.models import Sequential\n","from tensorflow.keras.layers import Dense\n","from tensorflow.keras.optimizers import Adam\n","\n","class DQNAgent:\n"," def __init__(self, state_size, action_size):\n"," self.state_size = state_size\n"," self.action_size = action_size\n"," self.memory = deque(maxlen=2000)\n"," self.gamma = 0.95 # discount rate\n"," self.epsilon = 1.0 # exploration rate\n"," self.epsilon_min = 0.01\n"," self.epsilon_decay = 0.995\n"," self.learning_rate = 0.001\n"," self.model = self._build_model()\n","\n"," def _build_model(self):\n"," # Neural Net for Deep Q-learning Model\n"," model = Sequential()\n"," model.add(Dense(24, input_dim=self.state_size, activation='relu'))\n"," model.add(Dense(24, activation='relu'))\n"," model.add(Dense(self.action_size, activation='linear'))\n"," model.compile(loss='mse',\n"," optimizer=Adam(learning_rate=self.learning_rate))\n"," return model\n","\n"," def remember(self, state, action, reward, next_state, done):\n"," self.memory.append((state, action, reward, next_state, done))\n","\n"," def act(self, state):\n"," if np.random.rand() <= self.epsilon:\n"," return random.randrange(self.action_size)\n"," act_values = self.model.predict(state)\n"," return np.argmax(act_values[0])\n","\n"," def replay(self, batch_size):\n"," minibatch = random.sample(self.memory, batch_size)\n"," for state, action, reward, next_state, done in minibatch:\n"," target = reward\n"," if not done:\n"," target = (reward + self.gamma *\n"," np.amax(self.model.predict(next_state)[0]))\n"," target_f = self.model.predict(state)\n"," target_f[0][action] = target\n"," self.model.fit(state, target_f, epochs=1, verbose=0)\n"," if self.epsilon > self.epsilon_min:\n"," self.epsilon *= self.epsilon_decay\n","\n","# Initialize the environment and the agent\n","state_size = 5\n","action_size = 3\n","agent = DQNAgent(state_size, action_size)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Etem35Qs9Wco","executionInfo":{"status":"ok","timestamp":1719748074399,"user_tz":-330,"elapsed":3634,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"8fb47876-0d47-4f98-e337-bcbd801a3d55"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"markdown","source":["Train the DQN Agent"],"metadata":{"id":"aO4NOXwx9mop"}},{"cell_type":"code","source":["env = HedgingEnv(data)\n","done = False\n","batch_size = 10\n","EPISODES = 2\n","\n","for e in range(EPISODES):\n"," state = env.reset()\n"," state = np.reshape(state, [1, state_size]).astype(np.float32) # Ensure the correct data type\n"," for time in range(500):\n"," action = agent.act(state)\n"," next_state, reward, done, _ = env.step(action)\n"," reward = reward if not done else -10\n"," next_state = np.reshape(next_state, [1, state_size]).astype(np.float32) # Ensure the correct data type\n"," agent.remember(state, action, reward, next_state, done)\n"," state = next_state\n"," if done:\n"," print(f\"episode: {e}/{EPISODES}, score: {time}, e: {agent.epsilon:.2}\")\n"," break\n"," if len(agent.memory) > batch_size:\n"," agent.replay(batch_size)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"_vaJuuK69YT0","executionInfo":{"status":"ok","timestamp":1719748149577,"user_tz":-330,"elapsed":75213,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"5e40be30-b0e0-4df0-90f4-9751c3a49180"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"stream","name":"stdout","text":["1/1 [==============================] - 0s 191ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 32ms/step\n","1/1 [==============================] - 0s 32ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 38ms/step\n","1/1 [==============================] - 0s 48ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 32ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 45ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 41ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 52ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 44ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","episode: 0/2, score: 19, e: 0.96\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 32ms/step\n","1/1 [==============================] - 0s 54ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 37ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 41ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 32ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 37ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 44ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 46ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 32ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 38ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 40ms/step\n","1/1 [==============================] - 0s 32ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 33ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 26ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 27ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 19ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 57ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 34ms/step\n","1/1 [==============================] - 0s 29ms/step\n","1/1 [==============================] - 0s 36ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 35ms/step\n","1/1 [==============================] - 0s 44ms/step\n","1/1 [==============================] - 0s 41ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 37ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 30ms/step\n","1/1 [==============================] - 0s 43ms/step\n","1/1 [==============================] - 0s 31ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 25ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 21ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 28ms/step\n","1/1 [==============================] - 0s 22ms/step\n","1/1 [==============================] - 0s 20ms/step\n","1/1 [==============================] - 0s 24ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 23ms/step\n","1/1 [==============================] - 0s 29ms/step\n","episode: 1/2, score: 19, e: 0.87\n"]}]},{"cell_type":"markdown","source":["e: 0.87: This usually refers to the epsilon-greedy parameter in Q-learning or similar algorithms. Epsilon (ε) is a value between 0 and 1 used to balance exploration and exploitation in RL. A higher epsilon value (like 0.87 in this case) means the agent is more likely to explore new actions rather than exploiting the known best actions based on its current policy."],"metadata":{"id":"eNA5SOhC--zV"}},{"cell_type":"markdown","source":["Score: Represents the cumulative reward obtained by the agent during the episode. It indicates how well the agent performed in achieving its goals or tasks within that episode. episode: 1/2, score: 19, e: 0.87"],"metadata":{"id":"QjRNZg2o_GTp"}},{"cell_type":"code","source":["# e: 0.87: This usually refers to the epsilon-greedy parameter in Q-learning or similar algorithms. Epsilon (ε) is a value between 0 and 1 used to balance exploration and exploitation in RL. A higher epsilon value (like 0.87 in this case) means the agent is more likely to explore new actions rather than exploiting the known best actions based on its current policy."],"metadata":{"id":"py48UYNR-8Dx"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":[" Evaluate the agent"],"metadata":{"id":"S6QxqtM69syY"}},{"cell_type":"code","source":["\n","import matplotlib.pyplot as plt\n","\n","# Plot the cumulative reward for each episode\n","episodes = range(EPISODES)\n","rewards = [0] * EPISODES\n","for i in range(EPISODES):\n"," rewards[i] = sum([reward for _, _, reward, _, _ in agent.memory if reward != -10])\n","\n","plt.plot(episodes, rewards)\n","plt.xlabel('Episode')\n","plt.ylabel('Cumulative Reward')\n","plt.title('DQN Agent Cumulative Reward')\n","plt.show()\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":472},"id":"nmqDWKMm9pmX","executionInfo":{"status":"ok","timestamp":1719748425556,"user_tz":-330,"elapsed":1994,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"3e26a103-ccc3-4551-f7ae-ecc697710793"},"execution_count":12,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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ybr99tv173//WyNGjHC8mVemTBm1adPmsn00b95cGzZs0I033qi6desqICBAderUUVBQkFauXKnt27dr/PjxjvY7d+7Uvn37NHfu3DwDulevXu103dWqVVNOTo4OHDiQ525S7uNAgHgNXIW1a9fqpZde0o033uh4BVmSXnzxRRlj1KdPn3xjjhISEvTcc88pIiLC8SZdYVq2bKlWrVrpX//6l1OT/H3++ee6cOGCBg4cqAceeCDf0r59ey1evFgZGRny9PRUmzZt9MUXX+jYsWOOPvbv3+94ay3X/fffL09PT40fPz7f3SFjjM6cOXPZ2v4qd24bZ9+6eu655+Tn56fHHntMJ06cyPf5gQMH9Oabb0r6405U+fLl87219s4777hc5+XkPrr587Gys7MLnBbirzw9PWWz2fLchTp06FCBbyP6+fm59IZat27ddOzYMc2aNUs//vhjnkdwUtH8mUp/TB3RsGFDvfHGG/r9998VFhbmCPzHjx/P1/7UqVN51ps3b65Dhw45Ap4keXh4KC4uTtOmTVNmZmae8Uq5d8X+fA7GGMffBWfkjtH787QFkvTGG2843Qeub9xZApy0YsUK7dmzR1lZWTpx4oTWrl2r1atXq1q1alqyZIl8fHwcbZs1a6bXX39dgwcPVu3atdWnTx9VqlRJe/bs0cyZM+Xh4aEvvvgi34SUBRk7dqzTj83mz5+vG264odDX6zt27KiZM2dq2bJluv/++zVu3DitWrVKTZs21YABA5Sdna1///vfqlmzZp6ZtaOiovTyyy9r5MiROnTokDp37qyAgAAlJCTo888/V//+/TV8+HCnavxzn8HBwXr33XcVEBAgPz8/NWrUqNDpFqKiovTf//5X3bp1U2xsrHr16qWaNWvq0qVL+u677/Tpp5865h6S/hiwPWXKFD322GNq0KCBNmzYoH379rlUozNuueUWNW7cWCNHjlRycrLKlSunBQsWKCsr67L73nvvvZo2bZratWunhx9+WCdPntTbb7+t6OjofI9x69evr6+//lrTpk1zPK5q1KhRoX3nziM0fPhweXp6Ol6Rz1UUf6a5nn32WXXt2lVz5szRE088obffflvNmjVTrVq11K9fP0VGRurEiRPavHmzfvvtN/3444+OfXOD0N69ezVp0iTH9hYtWmjFihWy2+2OObokqUaNGoqKitLw4cN1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KKgoagMAACh2Loel5ORkHjUBAIC/DZcHeAcGBiolJUWzZs3SyJEjlZycLOmPx3NHjx51e4EAAADFyeU7Sz/99JPuuOMOBQcH69ChQ+rXr5/KlSunzz77TImJiZo3b15R1AkAAFAsXL6zNHToUP3zn//Ur7/+Kh8fH8f2e+65Rxs2bHBrcQAAAMXN5bC0detWPf744/m2h4eHKykpyS1FAQAAlBQuhyW73a60tLR82/ft26fQ0FC3FAUAAFBSuByWOnbsqAkTJigzM1OSZLPZlJiYqOeff15dunRxe4EAAADFyeWw9Nprr+n8+fMKCwvTxYsX1bJlS0VHR8vf318TJ04sihoBAACKjctvwwUFBWn16tXatGmTfvrpJ50/f1633nqr2rRpUxT1AQAAFKur+m24P9u+fbvGjBmjpUuXuqO7UoXfhgMAoPRx9vvbpcdwX331lYYPH64XXnhBBw8elCTt2bNHnTt31m233aacnJyrqxoAAKCEcfox3AcffOCYgPLs2bOaNWuWpk2bpqeeekrdunXTzz//rNjY2KKsFQAA4Jpz+s7Sm2++qX/96186ffq0Fi5cqNOnT+udd97Rzp079e677xKUAADAdcnpMUt+fn765ZdfVL16dRljZLfbtW7dOjVt2rSoayzxGLMEAEDp4/YxSxcvXpSvr6+kP+ZWstvtqlSp0tVXCgAAUIK5NHXArFmz5O/vL0nKysrSnDlzVL58+Txtnn76afdVBwAAUMycfgxXvXp12Ww2685sNsdbcn8nPIYDAKD0cfb72+k7S4cOHXJHXQAAAKWKyz93AgAA8HdCWAIAALBAWAIAALBAWAIAALBAWAIAALBwRWHpwIEDevHFF9W9e3edPHlSkrRixQr98ssvbi0OAACguLkclr755hvVqlVLP/zwgz777DOdP39ekvTjjz9q7Nixbi8QAACgOLkclkaMGKGXX35Zq1evlre3t2N769at9f3337u1OAAAgOLmcljauXOn7rvvvnzbw8LCdPr0abcUBQAAUFK4HJaCg4N1/PjxfNt37Nih8PBwtxQFAABQUrgclh566CE9//zzSkpKks1mU05Ojr799lsNHz5cvXr1KooaJUkTJ05UXFycfH19FRwcbNn2zJkzqlKlimw2m1JSUpzqPyMjQ3Xr1pXNZlN8fPxV1wsAAK4PLoelSZMmqUaNGoqI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BcISAACABcJSCWa32zV27FjZ7fbiLuW6x7W+NrjO1wbX+drgOl8bJeE6M8AbAADAAneWAAAALBCWAAAALBCWAAAALBCWAAAALBCWitnbb7+t6tWry8fHR40aNdKWLVss23/66aeqUaOGfHx8VKtWLS1fvvwaVVq6uXKdZ86cqebNmyskJEQhISFq06bNZf9c8H9c/Tuda8GCBbLZbOrcuXPRFnidcPU6p6SkaODAgapUqZLsdrv+8Y9/8L8fTnD1Or/xxhu66aabVLZsWUVERGjIkCH6/fffr1G1pdOGDRvUoUMHVa5cWTabTV988cVl91m/fr1uvfVW2e12RUdHa86cOUVbpEGxWbBggfH29jb/+c9/zC+//GL69etngoODzYkTJwps/+233xpPT0/zyiuvmF27dpkXX3zRlClTxuzcufMaV166uHqdH374YfP222+bHTt2mN27d5s+ffqYoKAg89tvv13jyksfV691roSEBBMeHm6aN29uOnXqdG2KLcVcvc4ZGRmmQYMG5p577jGbNm0yCQkJZv369SY+Pv4aV166uHqd58+fb+x2u5k/f75JSEgwX331lalUqZIZMmTINa68dFm+fLkZNWqU+eyzz4wk8/nnn1u2P3jwoPH19TVDhw41u3btMtOnTzeenp5m5cqVRVYjYakYNWzY0AwcONCxnp2dbSpXrmwmT55cYPsHH3zQ3HvvvXm2NWrUyDz++ONFWmdp5+p1/qusrCwTEBBg5s6dW1QlXjeu5FpnZWWZuLg4M2vWLNO7d2/CkhNcvc4zZswwkZGR5tKlS9eqxOuCq9d54MCBpnXr1nm2DR061DRt2rRI67yeOBOWnnvuOXPLLbfk2datWzfTtm3bIquLx3DF5NKlS9q2bZvatGnj2Obh4aE2bdpo8+bNBe6zefPmPO0lqW3btoW2x5Vd579KT09XZmamypUrV1RlXheu9FpPmDBBYWFh6tu377Uos9S7kuu8ZMkSNWnSRAMHDlSFChVUs2ZNTZo0SdnZ2deq7FLnSq5zXFyctm3b5nhUd/DgQS1fvlz33HPPNan576I4vgv5Id1icvr0aWVnZ6tChQp5tleoUEF79uwpcJ+kpKQC2yclJRVZnaXdlVznv3r++edVuXLlfP84kdeVXOtNmzbpgw8+UHx8/DWo8PpwJdf54MGDWrt2rXr06KHly5dr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\n"},"metadata":{}}]},{"cell_type":"code","source":["# Plot the epsilon decay over episodes\n","plt.plot(episodes, [agent.epsilon for i in range(EPISODES)])\n","plt.xlabel('Episode')\n","plt.ylabel('Epsilon')\n","plt.title('Epsilon Decay')\n","plt.show()\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":472},"id":"WFS1Y9lM_kMw","executionInfo":{"status":"ok","timestamp":1719748415556,"user_tz":-330,"elapsed":577,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"5e65d215-1ce3-40ba-f3b2-d4940e6de1ed"},"execution_count":11,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAv1klEQVR4nO3de1hVVf7H8c8B5aIBmgKikXjLu6KSBOpoRZEWXcZJS1Oki2OaU+pMgylimqJdiEZNs/KSlzRLy0nTlPLXmKYF2k3UDG+ZeCkF00Dl7N8fPZ7pBDpwBA643q/n2c/jWWftfb57jXk+s/baZ9ssy7IEAABgEA93FwAAAFDRCEAAAMA4BCAAAGAcAhAAADAOAQgAABiHAAQAAIxDAAIAAMYhAAEAAOMQgAAAgHEIQAAqhR49eqhHjx6O1/v27ZPNZtO8efPcVhOAKxcBCICTefPmyWazXXT77LPP3F1iuRs0aJDTOV911VVq3Lix/vKXv+idd96R3W53d4kALlM1dxcAoHKaMGGCGjVqVKS9adOm5fJ5H374Ybkc11Xe3t567bXXJEm//vqr9u/fr3//+9/6y1/+oh49eui9996Tv7+/m6sE4CoCEIBi9ezZUxERERX2eV5eXhX2WSVRrVo1PfDAA05tzzzzjKZMmaLRo0frkUce0dKlS91UHYDLxSUwAC65sEbn+eef14svvqiGDRvK19dX3bt31zfffOPUNycnRwkJCbrmmmvk7e2tkJAQ3XXXXdq3b5+jzx/XAF3MRx99pG7duqlmzZqqVauW7rrrLmVlZTn1GT9+vGw2m/bs2aNBgwapVq1aCggIUEJCgs6cOXNZ552YmKhbb71Vy5Yt0+7du53e++CDDxy1+fn56fbbb9e3335b5Bg7d+5Unz59FBgYKF9fXzVv3lxjxoxxvL9//34NHTpUzZs3l6+vr+rUqaN7773Xabyys7Nls9n04osvFjn+pk2bZLPZ9Oabb17WuQJXMmaAABQrNzdXx48fd2qz2WyqU6eOU9sbb7yhU6dOadiwYcrPz9dLL72km266SV9//bWCg4MlSb1799a3336r4cOHKywsTEePHtW6det04MABhYWFlbim9evXq2fPnmrcuLHGjx+vX3/9VdOmTVOXLl2UmZlZ5Fh9+vRRo0aNlJKSoszMTL322msKCgrS1KlTXRqTCwYMGKAPP/xQ69at03XXXSdJWrBggeLj4xUbG6upU6fqzJkzmjlzprp27apt27Y5avvqq6/UrVs3Va9eXYMHD1ZYWJi+//57/fvf/9akSZMkSZ9//rk2bdqk++67T9dcc4327dunmTNnqkePHtqxY4dq1Kihxo0bq0uXLlq0aJFGjBjhVN+iRYvk5+enu+6667LOE7iiWQDwO3PnzrUkFbt5e3s7+u3du9eSZPn6+lo//PCDo33Lli2WJGvEiBGWZVnWiRMnLEnWc889d8nP7d69u9W9e/cix587d66jLTw83AoKCrJ++uknR9uXX35peXh4WAMHDnS0JScnW5KsBx980Okz7rnnHqtOnTr/cwzi4+OtmjVrXvT9bdu2OZ3jqVOnrFq1almPPPKIU7+cnBwrICDAqf1Pf/qT5efnZ+3fv9+pr91ud/z5zJkzRT5z8+bNliTrjTfecLS98sorliQrKyvL0Xb27Fmrbt26Vnx8/P88T8BkXAIDUKwZM2Zo3bp1TtsHH3xQpN/dd9+tBg0aOF537txZkZGRWr16tSTJ19dXXl5e2rBhg06cOOFyPYcPH9b27ds1aNAgXX311Y72du3a6ZZbbnF83u8NGTLE6XW3bt30008/KS8vz+U6JOmqq66SJJ06dUqStG7dOp08eVL333+/jh8/7tg8PT0VGRmpjz/+WJJ07NgxffLJJ3rwwQd17bXXOh3TZrM5/uzr6+v487lz5/TTTz+padOmqlWrljIzMx3v9enTRz4+Plq0aJGjbe3atTp+/HiR9UsAnHEJDECxOnfuXKJF0M2aNSvSdt111+mtt96S9NvdVFOnTtWoUaMUHBysG264QXfccYcGDhyoevXqlbie/fv3S5KaN29e5L2WLVtq7dq1On36tGrWrOlo/2PIqF27tiTpxIkTl3UH1y+//CJJ8vPzkyR99913kqSbbrqp2P4XPis7O1uS1KZNm0se/9dff1VKSormzp2rQ4cOybIsx3u5ubmOP9eqVUtxcXFavHixJk6cKOm3y18NGjS4aC0AfkMAAlDunnjiCcXFxendd9/V2rVrlZSUpJSUFH300Ufq0KFDuX2up6dnse2/DxSuuLDI+8JPAlz4XaAFCxYUG+qqVSvdP7XDhw/X3Llz9cQTTygqKkoBAQGy2Wy67777ivwG0cCBA7Vs2TJt2rRJbdu21cqVKzV06FB5eDDBD1wKAQjAZbkw+/F7u3fvLrIguUmTJho1apRGjRql7777TuHh4XrhhRe0cOHCEn1Ow4YNJUm7du0q8t7OnTtVt25dp9mf8rRgwQLZbDbdcsstkn47N0kKCgpSTEzMRfdr3LixJBW5S+6P3n77bcXHx+uFF15wtOXn5+vkyZNF+t52220KDAzUokWLFBkZqTNnzmjAgAGlPSXAOPxfBACX5d1339WhQ4ccr7du3aotW7aoZ8+ekqQzZ84oPz/faZ8mTZrIz89PBQUFJf6ckJAQhYeHa/78+U5B4JtvvtGHH36oXr16Xd6JlNCUKVP04Ycfqm/fvo7Lf7GxsfL399fkyZN17ty5IvscO3ZMkhQYGKg//elPmjNnjg4cOODU5/ezUp6enkVmqaZNm6bCwsIix65WrZruv/9+vfXWW5o3b57atm2rdu3aXfZ5Alc6ZoAAFOuDDz7Qzp07i7RHR0c7ZjKk3y4Dde3aVY8++qgKCgqUlpamOnXq6Mknn5T022zQzTffrD59+qhVq1aqVq2aVqxYoSNHjui+++4rVU3PPfecevbsqaioKD300EOO2+ADAgI0fvz4yzrfPzp//rxjdio/P1/79+/XypUr9dVXX+nGG2/U7NmzHX39/f01c+ZMDRgwQB07dtR9992nwMBAHThwQKtWrVKXLl00ffp0SdK//vUvde3aVR07dtTgwYPVqFEj7du3T6tWrdL27dslSXfccYcWLFiggIAAtWrVSps3b9b69euL/ATBBQMHDtS//vUvffzxx5d9iz9gCgIQgGKNGzeu2Pa5c+c6BaCBAwfKw8NDaWlpOnr0qDp37qzp06crJCREkhQaGqr7779f6enpWrBggapVq6YWLVrorbfeUu/evUtVU0xMjNasWaPk5GSNGzdO1atXV/fu3TV16tRiH9txOQoKChyXkmrUqKGgoCB16tRJ48aN0z333FNkjU2/fv1Uv359TZkyRc8995wKCgrUoEEDdevWTQkJCY5+7du312effaakpCTNnDlT+fn5atiwofr06ePo89JLL8nT01OLFi1Sfn6+unTpovXr1ys2NrbYWjt16qTWrVsrKytL/fv3L9NxAK5UNutyVwMCMNK+ffvUqFEjPffcc/r73//u7nKM16FDB1199dVKT093dylAlcAaIACo4r744gtt375dAwcOdHcpQJXBJTAA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\n"},"metadata":{}}]},{"cell_type":"code","source":["# Evaluate the agent\n","state = env.reset()\n","state = np.reshape(state, [1, state_size]).astype(np.float32)\n","for time in range(200):\n"," action = agent.act(state)\n"," next_state, reward, done, _ = env.step(action)\n"," next_state = np.reshape(next_state, [1, state_size]).astype(np.float32)\n"," state = next_state\n"," if done:\n"," break\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"bjKGOjJk9bqh","executionInfo":{"status":"ok","timestamp":1719748149580,"user_tz":-330,"elapsed":40,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"2fbed8c4-2b70-4c17-cf87-47cb20f2d194"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":["1/1 [==============================] - 0s 24ms/step\n"]}]},{"cell_type":"markdown","source":["saving the model"],"metadata":{"id":"-z9dHQlmAagT"}},{"cell_type":"code","source":["# prompt: after doing the evaluation of agent what can we do here\n","\n","# Save the model\n","agent.model.save('dqn_agent.h5')\n","\n","# Load the model\n","agent.model.load_weights('dqn_agent.h5')\n","\n","# Use the model to make predictions on new data\n","new_state = env.reset()\n","new_state = np.reshape(new_state, [1, state_size]).astype(np.float32)\n","action = agent.act(new_state)\n","\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"5HTPDT3CADLt","executionInfo":{"status":"ok","timestamp":1719748567446,"user_tz":-330,"elapsed":492,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"af99b741-d7cc-41bb-984a-e91c640d1563"},"execution_count":14,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py:3103: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.\n"," saving_api.save_model(\n"]}]},{"cell_type":"markdown","source":["Testing the Model"],"metadata":{"id":"ML0Vak5BAfte"}},{"cell_type":"code","source":["\n","import numpy as np\n","\n","# Load the trained model\n","agent.model.load_weights('dqn_agent.h5')\n","\n","# Create a new state\n","new_state = np.array([0.5, 0.6, 0.7, 0.8, 0.9])\n","\n","# Reshape the state to match the model input\n","new_state = np.reshape(new_state, [1, state_size]).astype(np.float32)\n","\n","# Predict the action using the loaded model\n","action = agent.act(new_state)\n","\n","# Print the predicted action\n","print(\"Predicted action:\", action)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"4vIOcoQeAPYH","executionInfo":{"status":"ok","timestamp":1719748619384,"user_tz":-330,"elapsed":549,"user":{"displayName":"Manish rana","userId":"17181877021940383610"}},"outputId":"323044e3-e610-4209-c331-2f6b5deb905a"},"execution_count":15,"outputs":[{"output_type":"stream","name":"stdout","text":["Predicted action: 1\n"]}]}]} \ No newline at end of file diff --git a/Dynamic Hedging Strategies using Reinforcement Learning/HistoricalData_1719635817381 (1).csv b/Dynamic Hedging Strategies using Reinforcement Learning/HistoricalData_1719635817381 (1).csv new file mode 100644 index 00000000..8e32001f --- /dev/null +++ b/Dynamic Hedging Strategies using Reinforcement Learning/HistoricalData_1719635817381 (1).csv @@ -0,0 +1,23 @@ +Date,Close/Last,Open,High,Low +06/28/2024,5460.48,5488.48,5523.64,5451.12 +06/27/2024,5482.87,5473.59,5490.81,5467.54 +06/26/2024,5477.90,5460.71,5483.14,5451.87 +06/25/2024,5469.30,5460.73,5472.88,5446.56 +06/24/2024,5447.87,5459.58,5490.66,5447.59 +06/21/2024,5464.62,5466.77,5478.31,5452.03 +06/20/2024,5473.17,5499.99,5505.53,5455.56 +06/18/2024,5487.03,5476.15,5490.38,5471.32 +06/17/2024,5473.23,5431.11,5488.50,5420.40 +06/14/2024,5431.60,5424.08,5432.39,5403.75 +06/13/2024,5433.74,5441.93,5441.93,5402.51 +06/12/2024,5421.03,5409.13,5447.25,5409.13 +06/11/2024,5375.32,5353.00,5375.95,5327.25 +06/10/2024,5360.79,5341.22,5365.79,5331.52 +06/07/2024,5346.99,5343.81,5375.08,5331.33 +06/06/2024,5352.96,5357.80,5362.35,5335.36 +06/05/2024,5354.03,5314.48,5354.16,5297.64 +06/04/2024,5291.34,5278.24,5298.80,5257.63 +06/03/2024,5283.40,5297.15,5302.11,5234.32 +05/31/2024,5277.51,5243.21,5280.33,5191.68 +05/30/2024,5235.48,5259.77,5260.21,5222.10 +05/29/2024,5266.95,5278.73,5282.27,5262.70 diff --git a/Dynamic Hedging Strategies using Reinforcement Learning/dqn_agent.h5 b/Dynamic Hedging Strategies using Reinforcement Learning/dqn_agent.h5 new file mode 100644 index 0000000000000000000000000000000000000000..8fd7389e0dee4bdaade236958303f5192561cd64 GIT binary patch literal 41232 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 Y4J8#PD#70t{P*+`JDHaB`_{+*0jbzU9smFU literal 0 HcmV?d00001 diff --git a/Dynamic Hedging Strategies using Reinforcement Learning/requierement.txt b/Dynamic Hedging Strategies using Reinforcement Learning/requierement.txt new file mode 100644 index 00000000..82bdb085 --- /dev/null +++ b/Dynamic Hedging Strategies using Reinforcement Learning/requierement.txt @@ -0,0 +1,6 @@ +require libraries-> +tensorflow +gym +pandas +numpy +matplotlib \ No newline at end of file