{ "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, name):\n", " with tf.variable_scope(name):\n", " self.X = tf.placeholder(tf.float32, (None, None, input_size))\n", " self.Y = tf.placeholder(tf.float32, (None, output_size))\n", " cell = tf.nn.rnn_cell.LSTMCell(layer_size, state_is_tuple = False)\n", " self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * layer_size))\n", " self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n", " dtype=tf.float32,\n", " initial_state=self.hidden_layer)\n", " tensor_action, tensor_validation = tf.split(self.rnn[:,-1],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 = 256\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.INITIAL_FEATURES = np.zeros((4, self.state_size))\n", " self.model = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE,\n", " 'real_model')\n", " self.model_negative = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE,\n", " 'negative_model')\n", " self.sess = tf.InteractiveSession()\n", " self.sess.run(tf.global_variables_initializer())\n", " self.trainable = tf.trainable_variables()\n", " \n", " def _assign(self, from_name, to_name):\n", " from_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=from_name)\n", " to_w = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope=to_name)\n", " for i in range(len(from_w)):\n", " assign_op = to_w[i].assign(from_w[i])\n", " self.sess.run(assign_op)\n", "\n", " def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n", " self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\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", " init_values = np.array([a[-1] for a in replay])\n", " Q = self.sess.run(self.model.logits, feed_dict={self.model.X:states, \n", " self.model.hidden_layer:init_values})\n", " Q_new = self.sess.run(self.model.logits, feed_dict={self.model.X:new_states, \n", " self.model.hidden_layer:init_values})\n", " Q_new_negative = self.sess.run(self.model_negative.logits, \n", " feed_dict={self.model_negative.X:new_states, \n", " self.model_negative.hidden_layer:init_values})\n", " replay_size = len(replay)\n", " X = np.empty((replay_size, 4, self.state_size))\n", " Y = np.empty((replay_size, self.OUTPUT_SIZE))\n", " INIT_VAL = np.empty((replay_size, 2 * self.LAYER_SIZE))\n", " for i in range(replay_size):\n", " state_r, action_r, reward_r, new_state_r, dead_r, rnn_memory = replay[i]\n", " target = Q[i]\n", " target[action_r] = reward_r\n", " if not dead_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", " INIT_VAL[i] = rnn_memory\n", " return X, Y, INIT_VAL\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", " init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n", " for k in range(self.INITIAL_FEATURES.shape[0]):\n", " self.INITIAL_FEATURES[k,:] = state\n", " for t in range(0, len(self.trend) - 1, self.skip):\n", " action, last_state = self.sess.run([self.model.logits,self.model.last_state],\n", " feed_dict={self.model.X:[self.INITIAL_FEATURES],\n", " self.model.hidden_layer:init_value})\n", " action, init_value = np.argmax(action[0]), last_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", " new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n", " self.INITIAL_FEATURES = new_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", " init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n", " for k in range(self.INITIAL_FEATURES.shape[0]):\n", " self.INITIAL_FEATURES[k,:] = state\n", " for t in range(0, len(self.trend) - 1, self.skip):\n", " if (self.T_COPY + 1) % self.COPY == 0:\n", " self._assign('real_model', 'negative_model')\n", " \n", " if np.random.rand() < self.EPSILON:\n", " action = np.random.randint(self.OUTPUT_SIZE)\n", " else:\n", " action, last_state = self.sess.run([self.model.logits,\n", " self.model.last_state],\n", " feed_dict={self.model.X:[self.INITIAL_FEATURES],\n", " self.model.hidden_layer:init_value})\n", " action, init_value = np.argmax(action[0]), last_state\n", " \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", " new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n", " \n", " self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n", " starting_money < initial_money, init_value[0])\n", " self.INITIAL_FEATURES = new_state\n", " batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n", " replay = random.sample(self.MEMORIES, batch_size)\n", " X, Y, INIT_VAL = 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.model.hidden_layer: INIT_VAL})\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:: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n", "WARNING:tensorflow:From :17: 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", "WARNING:tensorflow:: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n", "epoch: 10, total rewards: 328.014401.3, cost: 0.233912, total money: 2446.714413\n", "epoch: 20, total rewards: 629.485052.3, cost: 0.592428, total money: 5723.605047\n", "epoch: 30, total rewards: 1222.065245.3, cost: 0.182284, total money: 7288.965209\n", "epoch: 40, total rewards: 719.309753.3, cost: 0.690094, total money: 3739.159728\n", "epoch: 50, total rewards: 328.994876.3, cost: 0.918951, total money: 2756.724856\n", "epoch: 60, total rewards: 1518.540281.3, cost: 0.226017, total money: 10545.210264\n", "epoch: 70, total rewards: 440.315127.3, cost: 0.145386, total money: 7494.335086\n", "epoch: 80, total rewards: 656.779966.3, cost: 0.113699, total money: 6666.949948\n", "epoch: 90, total rewards: 846.820129.3, cost: 0.444679, total money: 6860.080139\n", "epoch: 100, total rewards: 1044.679930.3, cost: 0.240218, total money: 9067.419920\n", "epoch: 110, total rewards: 207.934935.3, cost: 0.236219, total money: 10207.934935\n", "epoch: 120, total rewards: 6.745002.3, cost: 1.133358, total money: 10006.745002\n", "epoch: 130, total rewards: 586.910091.3, cost: 0.162622, total money: 4665.650081\n", "epoch: 140, total rewards: 1084.244877.3, cost: 0.630996, total money: 6178.484867\n", "epoch: 150, total rewards: 991.774842.3, cost: 1.439193, total money: 420.904786\n", "epoch: 160, total rewards: 714.735100.3, cost: 0.337296, total money: 5744.735038\n", "epoch: 170, total rewards: 1158.574706.3, cost: 0.186633, total money: 10185.244689\n", "epoch: 180, total rewards: 1120.314817.3, cost: 0.539594, total money: 7186.704770\n", "epoch: 190, total rewards: 230.760193.3, cost: 0.110742, total money: 4290.020202\n", "epoch: 200, total rewards: 218.420047.3, cost: 0.125164, total money: 10218.420047\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 17: buy 1 unit at price 768.239990, total balance 9231.760010\n", "day 18, sell 1 unit at price 770.840027, investment 0.338441 %, total balance 10002.600037,\n", "day 20: buy 1 unit at price 747.919983, total balance 9254.680054\n", "day 21: buy 1 unit at price 750.500000, total balance 8504.180054\n", "day 23, sell 1 unit at price 759.109985, investment 1.496150 %, total balance 9263.290039,\n", "day 24, sell 1 unit at price 771.190002, investment 2.756829 %, total balance 10034.480041,\n", "day 27: buy 1 unit at price 789.270020, total balance 9245.210021\n", "day 28, sell 1 unit at price 796.099976, investment 0.865351 %, total balance 10041.309997,\n", "day 34: buy 1 unit at price 794.559998, total balance 9246.749999\n", "day 35, sell 1 unit at price 791.260010, investment -0.415323 %, total balance 10038.010009,\n", "day 36: buy 1 unit at price 789.909973, total balance 9248.100036\n", "day 38: buy 1 unit at price 785.049988, total balance 8463.050048\n", "day 40: buy 1 unit at price 771.820007, total balance 7691.230041\n", "day 41, sell 1 unit at price 786.140015, investment -0.477264 %, total balance 8477.370056,\n", "day 44: buy 1 unit at price 806.150024, total balance 7671.220032\n", "day 45, sell 1 unit at price 806.650024, investment 2.751422 %, total balance 8477.870056,\n", "day 48, sell 1 unit at price 806.359985, investment 4.475134 %, total balance 9284.230041,\n", "day 49, sell 1 unit at price 807.880005, investment 0.214598 %, total balance 10092.110046,\n", "day 51: buy 1 unit at price 806.070007, total balance 9286.040039\n", "day 52, sell 1 unit at price 802.174988, investment -0.483211 %, total balance 10088.215027,\n", "day 57: buy 1 unit at price 832.150024, total balance 9256.065003\n", "day 58: buy 1 unit at price 823.309998, total balance 8432.755005\n", "day 61: buy 1 unit at price 795.695007, total balance 7637.059998\n", "day 63: buy 1 unit at price 801.489990, total balance 6835.570008\n", "day 64, sell 1 unit at price 801.340027, investment -3.702457 %, total balance 7636.910035,\n", "day 66, sell 1 unit at price 808.380005, investment -1.813411 %, total balance 8445.290040,\n", "day 67, sell 1 unit at price 809.559998, investment 1.742501 %, total balance 9254.850038,\n", "day 68: buy 1 unit at price 813.669983, total balance 8441.180055\n", "day 70, sell 1 unit at price 820.450012, investment 2.365597 %, total balance 9261.630067,\n", "day 71: buy 1 unit at price 818.979980, total balance 8442.650087\n", "day 73: buy 1 unit at price 828.070007, total balance 7614.580080\n", "day 76, sell 1 unit at price 831.330017, investment 2.170417 %, total balance 8445.910097,\n", "day 77, sell 1 unit at price 828.640015, investment 1.179520 %, total balance 9274.550112,\n", "day 78: buy 1 unit at price 829.280029, total balance 8445.270083\n", "day 82: buy 1 unit at price 829.080017, total balance 7616.190066\n", "day 83: buy 1 unit at price 827.780029, total balance 6788.410037\n", "day 84: buy 1 unit at price 831.909973, total balance 5956.500064\n", "day 87: buy 1 unit at price 843.250000, total balance 5113.250064\n", "day 88: buy 1 unit at price 845.539978, total balance 4267.710086\n", "day 90: buy 1 unit at price 847.200012, total balance 3420.510074\n", "day 91, sell 1 unit at price 848.780029, investment 2.500999 %, total balance 4269.290103,\n", "day 98: buy 1 unit at price 819.510010, total balance 3449.780093\n", "day 99, sell 1 unit at price 820.919983, investment -1.008109 %, total balance 4270.700076,\n", "day 100: buy 1 unit at price 831.409973, total balance 3439.290103\n", "day 103, sell 1 unit at price 838.549988, investment 1.142226 %, total balance 4277.840091,\n", "day 104: buy 1 unit at price 834.570007, total balance 3443.270084\n", "day 106: buy 1 unit at price 827.880005, total balance 2615.390079\n", "day 107, sell 1 unit at price 824.669983, investment -0.375709 %, total balance 3440.060062,\n", "day 108, sell 1 unit at price 824.729980, investment -0.863073 %, total balance 4264.790042,\n", "day 109, sell 1 unit at price 823.349976, investment -2.359920 %, total balance 5088.140018,\n", "day 110: buy 1 unit at price 824.320007, total balance 4263.820011\n", "day 111, sell 1 unit at price 823.559998, investment -2.599520 %, total balance 5087.380009,\n", "day 114: buy 1 unit at price 838.210022, total balance 4249.169987\n", "day 115, sell 1 unit at price 841.650024, investment -0.655098 %, total balance 5090.820011,\n", "day 117, sell 1 unit at price 862.760010, investment 5.277544 %, total balance 5953.580021,\n", "day 118, sell 1 unit at price 872.299988, investment 4.918153 %, total balance 6825.880009,\n", "day 119: buy 1 unit at price 871.729980, total balance 5954.150029\n", "day 121, sell 1 unit at price 905.960022, investment 8.554107 %, total balance 6860.110051,\n", "day 122, sell 1 unit at price 912.570007, investment 10.229744 %, total balance 7772.680058,\n", "day 123: buy 1 unit at price 916.440002, total balance 6856.240056\n", "day 124, sell 1 unit at price 927.039978, investment 12.461177 %, total balance 7783.280034,\n", "day 125, sell 1 unit at price 931.659973, investment 11.148751 %, total balance 8714.940007,\n", "day 126, sell 1 unit at price 927.130005, investment 6.355182 %, total balance 9642.070012,\n", "day 129: buy 1 unit at price 928.780029, total balance 8713.289983\n", "day 131: buy 1 unit at price 932.219971, total balance 7781.070012\n", "day 134, sell 1 unit at price 919.619995, investment 0.346994 %, total balance 8700.690007,\n", "day 136: buy 1 unit at price 934.010010, total balance 7766.679997\n", "day 138, sell 1 unit at price 948.820007, investment 2.157667 %, total balance 8715.500004,\n", "day 139, sell 1 unit at price 954.960022, investment 2.439344 %, total balance 9670.460026,\n", "day 140, sell 1 unit at price 969.539978, investment 3.804024 %, total balance 10640.000004,\n", "day 141: buy 1 unit at price 971.469971, total balance 9668.530033\n", "day 142, sell 1 unit at price 975.880005, investment 0.453955 %, total balance 10644.410038,\n", "day 143: buy 1 unit at price 964.859985, total balance 9679.550053\n", "day 144, sell 1 unit at price 966.950012, investment 0.216615 %, total balance 10646.500065,\n", "day 145: buy 1 unit at price 975.599976, total balance 9670.900089\n", "day 146: buy 1 unit at price 983.679993, total balance 8687.220096\n", "day 148, sell 1 unit at price 980.940002, investment 0.547358 %, total balance 9668.160098,\n", "day 150, sell 1 unit at price 949.830017, investment -3.441157 %, total balance 10617.990115,\n", "day 152: buy 1 unit at price 953.400024, total balance 9664.590091\n", "day 154, sell 1 unit at price 942.309998, investment -1.163208 %, total balance 10606.900089,\n", "day 162: buy 1 unit at price 927.330017, total balance 9679.570072\n", "day 163: buy 1 unit at price 940.489990, total balance 8739.080082\n", "day 170: buy 1 unit at price 928.799988, total balance 7810.280094\n", "day 173, sell 1 unit at price 947.159973, investment 2.138393 %, total balance 8757.440067,\n", "day 175: buy 1 unit at price 953.419983, total balance 7804.020084\n", "day 176, sell 1 unit at price 965.400024, investment 2.648623 %, total balance 8769.420108,\n", "day 177, sell 1 unit at price 970.890015, investment 4.531657 %, total balance 9740.310123,\n", "day 178: buy 1 unit at price 968.150024, total balance 8772.160099\n", "day 179, sell 1 unit at price 972.919983, investment 2.045269 %, total balance 9745.080082,\n", "day 180, sell 1 unit at price 980.340027, investment 1.259103 %, total balance 10725.420109,\n", "day 185: buy 1 unit at price 930.500000, total balance 9794.920109\n", "day 186: buy 1 unit at price 930.830017, total balance 8864.090092\n", "day 187: buy 1 unit at price 930.390015, total balance 7933.700077\n", "day 188: buy 1 unit at price 923.650024, total balance 7010.050053\n", "day 191, sell 1 unit at price 926.789978, investment -0.398713 %, total balance 7936.840031,\n", "day 192, sell 1 unit at price 922.900024, investment -0.851927 %, total balance 8859.740055,\n", "day 195, sell 1 unit at price 922.669983, investment -0.829763 %, total balance 9782.410038,\n", "day 198: buy 1 unit at price 910.979980, total balance 8871.430058\n", "day 202: buy 1 unit at price 927.000000, total balance 7944.430058\n", "day 203, sell 1 unit at price 921.280029, investment -0.256590 %, total balance 8865.710087,\n", "day 205, sell 1 unit at price 913.809998, investment 0.310656 %, total balance 9779.520085,\n", "day 206, sell 1 unit at price 921.289978, investment -0.615968 %, total balance 10700.810063,\n", "day 207: buy 1 unit at price 929.570007, total balance 9771.240056\n", "day 209, sell 1 unit at price 937.340027, investment 0.835872 %, total balance 10708.580083,\n", "day 212: buy 1 unit at price 935.950012, total balance 9772.630071\n", "day 213, sell 1 unit at price 926.500000, investment -1.009671 %, total balance 10699.130071,\n", "day 216: buy 1 unit at price 935.090027, total balance 9764.040044\n", "day 217: buy 1 unit at price 925.109985, total balance 8838.930059\n", "day 219: buy 1 unit at price 915.000000, total balance 7923.930059\n", "day 221: buy 1 unit at price 931.580017, total balance 6992.350042\n", "day 222: buy 1 unit at price 932.450012, total balance 6059.900030\n", "day 223, sell 1 unit at price 928.530029, investment -0.701537 %, total balance 6988.430059,\n", "day 224, sell 1 unit at price 920.969971, investment -0.447516 %, total balance 7909.400030,\n", "day 225: buy 1 unit at price 924.859985, total balance 6984.540045\n", "day 226: buy 1 unit at price 944.489990, total balance 6040.050055\n", "day 227: buy 1 unit at price 949.500000, total balance 5090.550055\n", "day 228, sell 1 unit at price 959.109985, investment 4.820763 %, total balance 6049.660040,\n", "day 229, sell 1 unit at price 953.270020, investment 2.328303 %, total balance 7002.930060,\n", "day 230: buy 1 unit at price 957.789978, total balance 6045.140082\n", "day 235, sell 1 unit at price 972.599976, investment 4.305857 %, total balance 7017.740058,\n", "day 236, sell 1 unit at price 989.250000, investment 6.962137 %, total balance 8006.990058,\n", "day 238: buy 1 unit at price 989.679993, total balance 7017.310065\n", "day 239, sell 1 unit at price 992.000000, investment 5.030229 %, total balance 8009.310065,\n", "day 240: buy 1 unit at price 992.179993, total balance 7017.130072\n", "day 241, sell 1 unit at price 992.809998, investment 4.561348 %, total balance 8009.940070,\n", "day 242, sell 1 unit at price 984.450012, investment 2.783495 %, total balance 8994.390082,\n", "day 244, sell 1 unit at price 968.450012, investment -2.145136 %, total balance 9962.840094,\n", "day 245, sell 1 unit at price 970.539978, investment -2.181057 %, total balance 10933.380072,\n", "day 248: buy 1 unit at price 1019.270020, total balance 9914.110052\n", "day 249, sell 1 unit at price 1017.109985, investment -0.211920 %, total balance 10931.220037,\n", "day 250: buy 1 unit at price 1016.640015, total balance 9914.580022\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 }