{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import tensorflow as tf\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateOpenHighLowCloseAdj CloseVolume
02016-11-02778.200012781.650024763.450012768.700012768.7000121872400
12016-11-03767.250000769.950012759.030029762.130005762.1300051943200
22016-11-04750.659973770.359985750.560974762.020020762.0200202134800
32016-11-07774.500000785.190002772.549988782.520020782.5200201585100
42016-11-08783.400024795.632996780.190002790.510010790.5100101350800
\n", "
" ], "text/plain": [ " Date Open High Low Close Adj Close \\\n", "0 2016-11-02 778.200012 781.650024 763.450012 768.700012 768.700012 \n", "1 2016-11-03 767.250000 769.950012 759.030029 762.130005 762.130005 \n", "2 2016-11-04 750.659973 770.359985 750.560974 762.020020 762.020020 \n", "3 2016-11-07 774.500000 785.190002 772.549988 782.520020 782.520020 \n", "4 2016-11-08 783.400024 795.632996 780.190002 790.510010 790.510010 \n", "\n", " Volume \n", "0 1872400 \n", "1 1943200 \n", "2 2134800 \n", "3 1585100 \n", "4 1350800 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('../dataset/GOOG-year.csv')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from collections import deque\n", "import random\n", "\n", "class Model:\n", " def __init__(self, input_size, output_size, layer_size, learning_rate):\n", " self.X = tf.placeholder(tf.float32, (None, input_size))\n", " self.Y = tf.placeholder(tf.float32, (None, output_size))\n", " feed = tf.layers.dense(self.X, layer_size, activation = tf.nn.relu)\n", " tensor_action, tensor_validation = tf.split(feed,2,1)\n", " feed_action = tf.layers.dense(tensor_action, output_size)\n", " feed_validation = tf.layers.dense(tensor_validation, 1)\n", " self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n", " self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n", " self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n", " \n", "class Agent:\n", "\n", " LEARNING_RATE = 0.003\n", " BATCH_SIZE = 32\n", " LAYER_SIZE = 500\n", " OUTPUT_SIZE = 3\n", " EPSILON = 0.5\n", " DECAY_RATE = 0.005\n", " MIN_EPSILON = 0.1\n", " GAMMA = 0.99\n", " MEMORIES = deque()\n", " COPY = 1000\n", " T_COPY = 0\n", " MEMORY_SIZE = 300\n", " \n", " def __init__(self, state_size, window_size, trend, skip):\n", " self.state_size = state_size\n", " self.window_size = window_size\n", " self.half_window = window_size // 2\n", " self.trend = trend\n", " self.skip = skip\n", " tf.reset_default_graph()\n", " self.model = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n", " self.model_negative = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n", " self.sess = tf.InteractiveSession()\n", " self.sess.run(tf.global_variables_initializer())\n", " self.trainable = tf.trainable_variables()\n", " \n", " def _assign(self):\n", " for i in range(len(self.trainable)//2):\n", " assign_op = self.trainable[i+len(self.trainable)//2].assign(self.trainable[i])\n", " self.sess.run(assign_op)\n", "\n", " def _memorize(self, state, action, reward, new_state, done):\n", " self.MEMORIES.append((state, action, reward, new_state, done))\n", " if len(self.MEMORIES) > self.MEMORY_SIZE:\n", " self.MEMORIES.popleft()\n", "\n", " def _select_action(self, state):\n", " if np.random.rand() < self.EPSILON:\n", " action = np.random.randint(self.OUTPUT_SIZE)\n", " else:\n", " action = self.get_predicted_action([state])\n", " return action\n", "\n", " def _construct_memories(self, replay):\n", " states = np.array([a[0] for a in replay])\n", " new_states = np.array([a[3] for a in replay])\n", " Q = self.predict(states)\n", " Q_new = self.predict(new_states)\n", " Q_new_negative = self.sess.run(self.model_negative.logits, feed_dict={self.model_negative.X:new_states})\n", " replay_size = len(replay)\n", " X = np.empty((replay_size, self.state_size))\n", " Y = np.empty((replay_size, self.OUTPUT_SIZE))\n", " for i in range(replay_size):\n", " state_r, action_r, reward_r, new_state_r, done_r = replay[i]\n", " target = Q[i]\n", " target[action_r] = reward_r\n", " if not done_r:\n", " target[action_r] += self.GAMMA * Q_new_negative[i, np.argmax(Q_new[i])]\n", " X[i] = state_r\n", " Y[i] = target\n", " return X, Y\n", "\n", " def predict(self, inputs):\n", " return self.sess.run(self.model.logits, feed_dict={self.model.X:inputs})\n", " \n", " def get_predicted_action(self, sequence):\n", " prediction = self.predict(np.array(sequence))[0]\n", " return np.argmax(prediction)\n", " \n", " def get_state(self, t):\n", " window_size = self.window_size + 1\n", " d = t - window_size + 1\n", " block = self.trend[d : t + 1] if d >= 0 else -d * [self.trend[0]] + self.trend[0 : t + 1]\n", " res = []\n", " for i in range(window_size - 1):\n", " res.append(block[i + 1] - block[i])\n", " return np.array(res)\n", " \n", " def buy(self, initial_money):\n", " starting_money = initial_money\n", " states_sell = []\n", " states_buy = []\n", " inventory = []\n", " state = self.get_state(0)\n", " for t in range(0, len(self.trend) - 1, self.skip):\n", " action = self._select_action(state)\n", " next_state = self.get_state(t + 1)\n", " \n", " if action == 1 and initial_money >= self.trend[t]:\n", " inventory.append(self.trend[t])\n", " initial_money -= self.trend[t]\n", " states_buy.append(t)\n", " print('day %d: buy 1 unit at price %f, total balance %f'% (t, self.trend[t], initial_money))\n", " \n", " elif action == 2 and len(inventory):\n", " bought_price = inventory.pop(0)\n", " initial_money += self.trend[t]\n", " states_sell.append(t)\n", " try:\n", " invest = ((close[t] - bought_price) / bought_price) * 100\n", " except:\n", " invest = 0\n", " print(\n", " 'day %d, sell 1 unit at price %f, investment %f %%, total balance %f,'\n", " % (t, close[t], invest, initial_money)\n", " )\n", " \n", " state = next_state\n", " invest = ((initial_money - starting_money) / starting_money) * 100\n", " total_gains = initial_money - starting_money\n", " return states_buy, states_sell, total_gains, invest\n", " \n", " \n", " def train(self, iterations, checkpoint, initial_money):\n", " for i in range(iterations):\n", " total_profit = 0\n", " inventory = []\n", " state = self.get_state(0)\n", " starting_money = initial_money\n", " for t in range(0, len(self.trend) - 1, self.skip):\n", " if (self.T_COPY + 1) % self.COPY == 0:\n", " self._assign()\n", " \n", " action = self._select_action(state)\n", " next_state = self.get_state(t + 1)\n", " \n", " if action == 1 and starting_money >= self.trend[t]:\n", " inventory.append(self.trend[t])\n", " starting_money -= self.trend[t]\n", " \n", " elif action == 2 and len(inventory) > 0:\n", " bought_price = inventory.pop(0)\n", " total_profit += self.trend[t] - bought_price\n", " starting_money += self.trend[t]\n", " \n", " invest = ((starting_money - initial_money) / initial_money)\n", " \n", " self._memorize(state, action, invest, next_state, starting_money < initial_money)\n", " batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n", " state = next_state\n", " replay = random.sample(self.MEMORIES, batch_size)\n", " X, Y = self._construct_memories(replay)\n", " \n", " cost, _ = self.sess.run([self.model.cost, self.model.optimizer], \n", " feed_dict={self.model.X: X, self.model.Y:Y})\n", " self.T_COPY += 1\n", " self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n", " if (i+1) % checkpoint == 0:\n", " print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n", " starting_money))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From :12: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "keep_dims is deprecated, use keepdims instead\n", "epoch: 10, total rewards: 1486.684997.3, cost: 0.694152, total money: 10514.124999\n", "epoch: 20, total rewards: 313.279660.3, cost: 0.878157, total money: 8354.909665\n", "epoch: 30, total rewards: 752.595089.3, cost: 0.320037, total money: 10752.595089\n", "epoch: 40, total rewards: 1159.299987.3, cost: 0.318166, total money: 10186.739989\n", "epoch: 50, total rewards: 993.220279.3, cost: 0.391151, total money: 4149.310245\n", "epoch: 60, total rewards: 1616.499880.3, cost: 0.307440, total money: 9630.939883\n", "epoch: 70, total rewards: 941.484560.3, cost: 0.332979, total money: 6969.054506\n", "epoch: 80, total rewards: 904.899903.3, cost: 0.718111, total money: 1132.559876\n", "epoch: 90, total rewards: 346.619873.3, cost: 0.482044, total money: 542.599852\n", "epoch: 100, total rewards: 141.554626.3, cost: 0.238426, total money: 6115.974608\n", "epoch: 110, total rewards: -159.529845.3, cost: 0.202412, total money: 8852.270143\n", "epoch: 120, total rewards: -37.579779.3, cost: 0.433529, total money: 8945.780206\n", "epoch: 130, total rewards: 1049.544800.3, cost: 0.408910, total money: 8099.664795\n", "epoch: 140, total rewards: 59.114809.3, cost: 0.028664, total money: 7098.904848\n", "epoch: 150, total rewards: 96.424866.3, cost: 0.070552, total money: 9079.784851\n", "epoch: 160, total rewards: 74.179754.3, cost: 0.044092, total money: 10074.179754\n", "epoch: 170, total rewards: 80.999883.3, cost: 0.018813, total money: 8047.249883\n", "epoch: 180, total rewards: 62.700011.3, cost: 0.083292, total money: 10062.700011\n", "epoch: 190, total rewards: 70.424991.3, cost: 0.013884, total money: 9053.315006\n", "epoch: 200, total rewards: 10.620115.3, cost: 0.030838, total money: 10010.620115\n" ] } ], "source": [ "close = df.Close.values.tolist()\n", "initial_money = 10000\n", "window_size = 30\n", "skip = 1\n", "batch_size = 32\n", "agent = Agent(state_size = window_size, \n", " window_size = window_size, \n", " trend = close, \n", " skip = skip)\n", "agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "day 1: buy 1 unit at price 762.130005, total balance 9237.869995\n", "day 2, sell 1 unit at price 762.020020, investment -0.014431 %, total balance 9999.890015,\n", "day 11: buy 1 unit at price 771.229980, total balance 9228.660035\n", "day 12: buy 1 unit at price 760.539978, total balance 8468.120057\n", "day 13, sell 1 unit at price 769.200012, investment -0.263212 %, total balance 9237.320069,\n", "day 15, sell 1 unit at price 760.989990, investment 0.059170 %, total balance 9998.310059,\n", "day 34: buy 1 unit at price 794.559998, total balance 9203.750061\n", "day 35, sell 1 unit at price 791.260010, investment -0.415323 %, total balance 9995.010071,\n", "day 36: buy 1 unit at price 789.909973, total balance 9205.100098\n", "day 37, sell 1 unit at price 791.549988, investment 0.207620 %, total balance 9996.650086,\n", "day 38: buy 1 unit at price 785.049988, total balance 9211.600098\n", "day 40, sell 1 unit at price 771.820007, investment -1.685241 %, total balance 9983.420105,\n", "day 54: buy 1 unit at price 819.309998, total balance 9164.110107\n", "day 55, sell 1 unit at price 823.869995, investment 0.556566 %, total balance 9987.980102,\n", "day 62: buy 1 unit at price 798.530029, total balance 9189.450073\n", "day 64, sell 1 unit at price 801.340027, investment 0.351896 %, total balance 9990.790100,\n", "day 68: buy 1 unit at price 813.669983, total balance 9177.120117\n", "day 69, sell 1 unit at price 819.239990, investment 0.684554 %, total balance 9996.360107,\n", "day 72: buy 1 unit at price 824.159973, total balance 9172.200134\n", "day 73, sell 1 unit at price 828.070007, investment 0.474427 %, total balance 10000.270141,\n", "day 74: buy 1 unit at price 831.659973, total balance 9168.610168\n", "day 75, sell 1 unit at price 830.760010, investment -0.108213 %, total balance 9999.370178,\n", "day 79: buy 1 unit at price 823.210022, total balance 9176.160156\n", "day 80, sell 1 unit at price 835.239990, investment 1.461349 %, total balance 10011.400146,\n", "day 90: buy 1 unit at price 847.200012, total balance 9164.200134\n", "day 91, sell 1 unit at price 848.780029, investment 0.186499 %, total balance 10012.980163,\n", "day 93: buy 1 unit at price 848.400024, total balance 9164.580139\n", "day 94: buy 1 unit at price 830.460022, total balance 8334.120117\n", "day 95, sell 1 unit at price 829.590027, investment -2.217114 %, total balance 9163.710144,\n", "day 96, sell 1 unit at price 817.580017, investment -1.550948 %, total balance 9981.290161,\n", "day 100: buy 1 unit at price 831.409973, total balance 9149.880188\n", "day 101, sell 1 unit at price 831.500000, investment 0.010828 %, total balance 9981.380188,\n", "day 104: buy 1 unit at price 834.570007, total balance 9146.810181\n", "day 106: buy 1 unit at price 827.880005, total balance 8318.930176\n", "day 107, sell 1 unit at price 824.669983, investment -1.186242 %, total balance 9143.600159,\n", "day 108, sell 1 unit at price 824.729980, investment -0.380493 %, total balance 9968.330139,\n", "day 110: buy 1 unit at price 824.320007, total balance 9144.010132\n", "day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 9967.570130,\n", "day 115: buy 1 unit at price 841.650024, total balance 9125.920106\n", "day 116, sell 1 unit at price 843.190002, investment 0.182971 %, total balance 9969.110108,\n", "day 125: buy 1 unit at price 931.659973, total balance 9037.450135\n", "day 126, sell 1 unit at price 927.130005, investment -0.486225 %, total balance 9964.580140,\n", "day 127: buy 1 unit at price 934.299988, total balance 9030.280152\n", "day 128, sell 1 unit at price 932.169983, investment -0.227979 %, total balance 9962.450135,\n", "day 141: buy 1 unit at price 971.469971, total balance 8990.980164\n", "day 142, sell 1 unit at price 975.880005, investment 0.453955 %, total balance 9966.860169,\n", "day 152: buy 1 unit at price 953.400024, total balance 9013.460145\n", "day 153, sell 1 unit at price 950.760010, investment -0.276905 %, total balance 9964.220155,\n", "day 156: buy 1 unit at price 957.369995, total balance 9006.850160\n", "day 157, sell 1 unit at price 950.630005, investment -0.704011 %, total balance 9957.480165,\n", "day 166: buy 1 unit at price 898.700012, total balance 9058.780153\n", "day 167, sell 1 unit at price 911.710022, investment 1.447648 %, total balance 9970.490175,\n", "day 172: buy 1 unit at price 943.830017, total balance 9026.660158\n", "day 173, sell 1 unit at price 947.159973, investment 0.352813 %, total balance 9973.820131,\n", "day 185: buy 1 unit at price 930.500000, total balance 9043.320131\n", "day 186: buy 1 unit at price 930.830017, total balance 8112.490114\n", "day 187, sell 1 unit at price 930.390015, investment -0.011820 %, total balance 9042.880129,\n", "day 188, sell 1 unit at price 923.650024, investment -0.771354 %, total balance 9966.530153,\n", "day 193: buy 1 unit at price 907.239990, total balance 9059.290163\n", "day 194, sell 1 unit at price 914.390015, investment 0.788107 %, total balance 9973.680178,\n", "day 197: buy 1 unit at price 926.960022, total balance 9046.720156\n", "day 199, sell 1 unit at price 910.669983, investment -1.757362 %, total balance 9957.390139,\n", "day 211: buy 1 unit at price 927.809998, total balance 9029.580141\n", "day 212, sell 1 unit at price 935.950012, investment 0.877336 %, total balance 9965.530153,\n", "day 213: buy 1 unit at price 926.500000, total balance 9039.030153\n", "day 214, sell 1 unit at price 929.080017, investment 0.278469 %, total balance 9968.110170,\n" ] } ], "source": [ "states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (15,5))\n", "plt.plot(close, color='r', lw=2.)\n", "plt.plot(close, '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n", "plt.plot(close, 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n", "plt.title('total gains %f, total investment %f%%'%(total_gains, invest))\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }