Skip to content

Instantly share code, notes, and snippets.

@tsu-nera
Last active July 12, 2017 12:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsu-nera/1102438625def2b4a9f6e5a5d8f3f236 to your computer and use it in GitHub Desktop.
Save tsu-nera/1102438625def2b4a9f6e5a5d8f3f236 to your computer and use it in GitHub Desktop.
sine_wave_dqn.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# sin curve with DQN"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* https://github.com/dogwood008/DeepFX\n* http://recruit.gmo.jp/engineer/jisedai/blog/deep-q-learning/\n* https://www.slideshare.net/JunichiroKatsuta/deep-qlearningfx"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import math\nimport numpy as np\nfrom matplotlib import pyplot",
"execution_count": 1,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import math\nimport numpy as np\nfrom matplotlib import pyplot\n\nx = np.linspace(0, 48, 240) \ny = np.sin(x)\n\npyplot.plot(x, y)\npyplot.show()",
"execution_count": 2,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7f469c1f9eb8>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import enum\nclass Action(enum.Enum):\n HOLD = 0\n BUY = 1\n SELL = 2\n\nclass Position():\n def __init__(self):\n self.NONE = 0\n self.HOLD = 1\n self.reset()\n\n def reset(self):\n self.holding = self.NONE\n self.change_action = None\n self.bid = None\n\n def is_hold(self):\n return self.holding == self.HOLD\n\n def change(self, action, bid):\n self.bid = bid\n self.holding = self.HOLD\n self.change_action = action\n\n def close(self, action, bid):\n if action == Action.BUY.value:\n reward = (bid - self.bid) * 100000\n else:\n reward = (self.bid - bid) * 100000\n self.reset()\n return reward",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import gym\nimport gym.spaces\n\nclass FXTrade(gym.core.Env):\n def __init__(self):\n self.action_space = gym.spaces.Discrete(3) \n high = np.array([1.0, 1])\n low = np.array([-1.0, 0])\n self.observation_space = gym.spaces.Box(low=low, high=high) \n\n self._position = Position()\n\n self._hist_list = []\n for t in np.linspace(0, 48, 240):\n self._hist_list.append(np.sin(t))\n self._hist_list_len = len(self._hist_list)\n\n self.cur_id = 0\n\n def _step(self, action):\n bid = self._hist_list[self.cur_id]\n self.cur_id +=1\n done = True if self.cur_id == self._hist_list_len else False\n\n if action != Action.HOLD.value and action == self._position.change_action:\n # invalid action ... hold\n action = Action.HOLD.value\n\n if action == Action.HOLD.value:\n reward = 0\n else:\n if not self._position.is_hold():\n self._position.change(action, bid)\n reward = 0\n else:\n reward = self._position.close(action, bid)\n observation = np.array([bid, self._position.holding])\n return observation, reward, done ,{}\n\n def _reset(self):\n self.cur_id = 0\n self._position.reset()\n return np.array([self._hist_list[self.cur_id], self._position.holding])",
"execution_count": 4,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "env = FXTrade()\nenv.reset()",
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 5,
"data": {
"text/plain": "array([ 0., 0.])"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from keras.models import Sequential\nfrom keras.layers import Dense, Activation, Flatten\nfrom keras.optimizers import Adam\n\nfrom rl.agents.dqn import DQNAgent\nfrom rl.policy import BoltzmannQPolicy\nfrom rl.memory import SequentialMemory",
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": "Using TensorFlow backend.\n",
"name": "stderr"
}
]
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "nb_actions = env.action_space.n\n\nmodel = Sequential()\nmodel.add(Flatten(input_shape=(1,) + env.observation_space.shape))\nmodel.add(Dense(16))\nmodel.add(Activation('relu'))\nmodel.add(Dense(16))\nmodel.add(Activation('relu'))\nmodel.add(Dense(16))\nmodel.add(Activation('relu'))\nmodel.add(Dense(nb_actions))\nmodel.add(Activation('linear'))\nmodel.summary()",
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": "_________________________________________________________________\nLayer (type) Output Shape Param # \n=================================================================\nflatten_1 (Flatten) (None, 2) 0 \n_________________________________________________________________\ndense_1 (Dense) (None, 16) 48 \n_________________________________________________________________\nactivation_1 (Activation) (None, 16) 0 \n_________________________________________________________________\ndense_2 (Dense) (None, 16) 272 \n_________________________________________________________________\nactivation_2 (Activation) (None, 16) 0 \n_________________________________________________________________\ndense_3 (Dense) (None, 16) 272 \n_________________________________________________________________\nactivation_3 (Activation) (None, 16) 0 \n_________________________________________________________________\ndense_4 (Dense) (None, 3) 51 \n_________________________________________________________________\nactivation_4 (Activation) (None, 3) 0 \n=================================================================\nTotal params: 643\nTrainable params: 643\nNon-trainable params: 0\n_________________________________________________________________\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "memory = SequentialMemory(limit=50000, window_length=1)\npolicy = BoltzmannQPolicy()\ndqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory,\n target_model_update=1e-2, policy=policy)\ndqn.compile(Adam(lr=1e-3), metrics=['mae'])",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "dqn.fit(env, nb_steps=4800, visualize=False, verbose=1)",
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": "Training for 4800 steps ...\nInterval 1 (0 steps performed)\n 4800/10000 [=============>................] - ETA: 48s - reward: 1488.5743- ETA: 48s - redone, took 44.549 seconds\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 9,
"data": {
"text/plain": "<keras.callbacks.History at 0x7f46803b0128>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "dqn.test(env, nb_episodes=5, visualize=False)",
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": "Testing for 5 episodes ...\nEpisode 1: reward: 1379938.398, steps: 240\nEpisode 2: reward: 1379938.398, steps: 240\nEpisode 3: reward: 1379938.398, steps: 240\nEpisode 4: reward: 1379938.398, steps: 240\nEpisode 5: reward: 1379938.398, steps: 240\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 10,
"data": {
"text/plain": "<keras.callbacks.History at 0x7f46803b0080>"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.1",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"toc": {
"threshold": 4,
"number_sections": false,
"toc_cell": false,
"toc_window_display": false,
"toc_section_display": "block",
"sideBar": true,
"navigate_menu": true,
"moveMenuLeft": true,
"widenNotebook": false,
"colors": {
"hover_highlight": "#DAA520",
"selected_highlight": "#FFD700",
"running_highlight": "#FF0000",
"wrapper_background": "#FFFFFF",
"sidebar_border": "#EEEEEE",
"navigate_text": "#333333",
"navigate_num": "#000000"
},
"nav_menu": {
"height": "4px",
"width": "254px"
}
},
"gist": {
"id": "",
"data": {
"description": "sine_wave_dqn.ipynb",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment