添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
549 lines
72 KiB
Plaintext
549 lines
72 KiB
Plaintext
{
|
|
"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": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>Date</th>\n",
|
|
" <th>Open</th>\n",
|
|
" <th>High</th>\n",
|
|
" <th>Low</th>\n",
|
|
" <th>Close</th>\n",
|
|
" <th>Adj Close</th>\n",
|
|
" <th>Volume</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>2016-11-02</td>\n",
|
|
" <td>778.200012</td>\n",
|
|
" <td>781.650024</td>\n",
|
|
" <td>763.450012</td>\n",
|
|
" <td>768.700012</td>\n",
|
|
" <td>768.700012</td>\n",
|
|
" <td>1872400</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>2016-11-03</td>\n",
|
|
" <td>767.250000</td>\n",
|
|
" <td>769.950012</td>\n",
|
|
" <td>759.030029</td>\n",
|
|
" <td>762.130005</td>\n",
|
|
" <td>762.130005</td>\n",
|
|
" <td>1943200</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>2016-11-04</td>\n",
|
|
" <td>750.659973</td>\n",
|
|
" <td>770.359985</td>\n",
|
|
" <td>750.560974</td>\n",
|
|
" <td>762.020020</td>\n",
|
|
" <td>762.020020</td>\n",
|
|
" <td>2134800</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>2016-11-07</td>\n",
|
|
" <td>774.500000</td>\n",
|
|
" <td>785.190002</td>\n",
|
|
" <td>772.549988</td>\n",
|
|
" <td>782.520020</td>\n",
|
|
" <td>782.520020</td>\n",
|
|
" <td>1585100</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>2016-11-08</td>\n",
|
|
" <td>783.400024</td>\n",
|
|
" <td>795.632996</td>\n",
|
|
" <td>780.190002</td>\n",
|
|
" <td>790.510010</td>\n",
|
|
" <td>790.510010</td>\n",
|
|
" <td>1350800</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"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_forward = tf.layers.dense(self.X, layer_size, activation = tf.nn.relu)\n",
|
|
" self.logits = tf.layers.dense(feed_forward, output_size)\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",
|
|
" replay = random.sample(self.MEMORIES, batch_size)\n",
|
|
" state = next_state\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": [
|
|
"epoch: 10, total rewards: 1241.885127.3, cost: 1.110860, total money: 1744.875178\n",
|
|
"epoch: 20, total rewards: 89.105106.3, cost: 0.649060, total money: 8097.275088\n",
|
|
"epoch: 30, total rewards: 719.079470.3, cost: 0.823131, total money: 9699.809450\n",
|
|
"epoch: 40, total rewards: 684.040043.3, cost: 1.931746, total money: 134.750004\n",
|
|
"epoch: 50, total rewards: 1744.829771.3, cost: 0.895153, total money: 11744.829771\n",
|
|
"epoch: 60, total rewards: 149.195010.3, cost: 1.097174, total money: 5196.854982\n",
|
|
"epoch: 70, total rewards: 1389.289786.3, cost: 0.860031, total money: 9399.319754\n",
|
|
"epoch: 80, total rewards: 529.019898.3, cost: 0.305593, total money: 10529.019898\n",
|
|
"epoch: 90, total rewards: 1285.264893.3, cost: 1.882383, total money: 9251.514893\n",
|
|
"epoch: 100, total rewards: 409.474970.3, cost: 0.146280, total money: 551.414972\n",
|
|
"epoch: 110, total rewards: 1074.725155.3, cost: 0.661549, total money: 2231.475154\n",
|
|
"epoch: 120, total rewards: 1713.854676.3, cost: 1.219318, total money: 11713.854676\n",
|
|
"epoch: 130, total rewards: 871.945621.3, cost: 1.460638, total money: 8947.665652\n",
|
|
"epoch: 140, total rewards: 1564.314818.3, cost: 1.133385, total money: 2767.354796\n",
|
|
"epoch: 150, total rewards: 855.729796.3, cost: 1.886093, total money: 10855.729796\n",
|
|
"epoch: 160, total rewards: 302.970157.3, cost: 0.642825, total money: 6320.700137\n",
|
|
"epoch: 170, total rewards: 512.139521.3, cost: 3.411159, total money: 1801.649470\n",
|
|
"epoch: 180, total rewards: 769.354739.3, cost: 0.379282, total money: 10769.354739\n",
|
|
"epoch: 190, total rewards: 332.274720.3, cost: 1.111366, total money: 10332.274720\n",
|
|
"epoch: 200, total rewards: 395.419923.3, cost: 0.270106, total money: 5401.389893\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 7: buy 1 unit at price 754.020020, total balance 9245.979980\n",
|
|
"day 9, sell 1 unit at price 758.489990, investment 0.592818 %, total balance 10004.469970,\n",
|
|
"day 10: buy 1 unit at price 764.479980, total balance 9239.989990\n",
|
|
"day 11: buy 1 unit at price 771.229980, total balance 8468.760010\n",
|
|
"day 12, sell 1 unit at price 760.539978, investment -0.515383 %, total balance 9229.299988,\n",
|
|
"day 13, sell 1 unit at price 769.200012, investment -0.263212 %, total balance 9998.500000,\n",
|
|
"day 17: buy 1 unit at price 768.239990, total balance 9230.260010\n",
|
|
"day 19, sell 1 unit at price 758.039978, investment -1.327712 %, total balance 9988.299988,\n",
|
|
"day 21: buy 1 unit at price 750.500000, total balance 9237.799988\n",
|
|
"day 22, sell 1 unit at price 762.520020, investment 1.601602 %, total balance 10000.320008,\n",
|
|
"day 26: buy 1 unit at price 789.289978, total balance 9211.030030\n",
|
|
"day 27, sell 1 unit at price 789.270020, investment -0.002529 %, total balance 10000.300050,\n",
|
|
"day 30: buy 1 unit at price 797.849976, total balance 9202.450074\n",
|
|
"day 33, sell 1 unit at price 796.419983, investment -0.179231 %, total balance 9998.870057,\n",
|
|
"day 41: buy 1 unit at price 786.140015, total balance 9212.730042\n",
|
|
"day 42, sell 1 unit at price 786.900024, investment 0.096676 %, total balance 9999.630066,\n",
|
|
"day 45: buy 1 unit at price 806.650024, total balance 9192.980042\n",
|
|
"day 46: buy 1 unit at price 804.789978, total balance 8388.190064\n",
|
|
"day 47, sell 1 unit at price 807.909973, investment 0.156195 %, total balance 9196.100037,\n",
|
|
"day 49, sell 1 unit at price 807.880005, investment 0.383954 %, total balance 10003.980042,\n",
|
|
"day 54: buy 1 unit at price 819.309998, total balance 9184.670044\n",
|
|
"day 55, sell 1 unit at price 823.869995, investment 0.556566 %, total balance 10008.540039,\n",
|
|
"day 61: buy 1 unit at price 795.695007, total balance 9212.845032\n",
|
|
"day 62, sell 1 unit at price 798.530029, investment 0.356295 %, total balance 10011.375061,\n",
|
|
"day 64: buy 1 unit at price 801.340027, total balance 9210.035034\n",
|
|
"day 65, sell 1 unit at price 806.969971, investment 0.702566 %, total balance 10017.005005,\n",
|
|
"day 66: buy 1 unit at price 808.380005, total balance 9208.625000\n",
|
|
"day 67: buy 1 unit at price 809.559998, total balance 8399.065002\n",
|
|
"day 68: buy 1 unit at price 813.669983, total balance 7585.395019\n",
|
|
"day 69, sell 1 unit at price 819.239990, investment 1.343426 %, total balance 8404.635009,\n",
|
|
"day 70, sell 1 unit at price 820.450012, investment 1.345177 %, total balance 9225.085021,\n",
|
|
"day 71, sell 1 unit at price 818.979980, investment 0.652598 %, total balance 10044.065001,\n",
|
|
"day 74: buy 1 unit at price 831.659973, total balance 9212.405028\n",
|
|
"day 76, sell 1 unit at price 831.330017, investment -0.039674 %, total balance 10043.735045,\n",
|
|
"day 79: buy 1 unit at price 823.210022, total balance 9220.525023\n",
|
|
"day 80, sell 1 unit at price 835.239990, investment 1.461349 %, total balance 10055.765013,\n",
|
|
"day 83: buy 1 unit at price 827.780029, total balance 9227.984984\n",
|
|
"day 84, sell 1 unit at price 831.909973, investment 0.498918 %, total balance 10059.894957,\n",
|
|
"day 97: buy 1 unit at price 814.429993, total balance 9245.464964\n",
|
|
"day 98, sell 1 unit at price 819.510010, investment 0.623751 %, total balance 10064.974974,\n",
|
|
"day 102: buy 1 unit at price 829.559998, total balance 9235.414976\n",
|
|
"day 103, sell 1 unit at price 838.549988, investment 1.083706 %, total balance 10073.964964,\n",
|
|
"day 104: buy 1 unit at price 834.570007, total balance 9239.394957\n",
|
|
"day 105, sell 1 unit at price 831.409973, investment -0.378642 %, total balance 10070.804930,\n",
|
|
"day 107: buy 1 unit at price 824.669983, total balance 9246.134947\n",
|
|
"day 108: buy 1 unit at price 824.729980, total balance 8421.404967\n",
|
|
"day 109, sell 1 unit at price 823.349976, investment -0.160065 %, total balance 9244.754943,\n",
|
|
"day 110, sell 1 unit at price 824.320007, investment -0.049710 %, total balance 10069.074950,\n",
|
|
"day 113: buy 1 unit at price 836.820007, total balance 9232.254943\n",
|
|
"day 114, sell 1 unit at price 838.210022, investment 0.166107 %, total balance 10070.464965,\n",
|
|
"day 117: buy 1 unit at price 862.760010, total balance 9207.704955\n",
|
|
"day 118, sell 1 unit at price 872.299988, investment 1.105751 %, total balance 10080.004943,\n",
|
|
"day 120: buy 1 unit at price 874.250000, total balance 9205.754943\n",
|
|
"day 123, sell 1 unit at price 916.440002, investment 4.825851 %, total balance 10122.194945,\n",
|
|
"day 125: buy 1 unit at price 931.659973, total balance 9190.534972\n",
|
|
"day 126: buy 1 unit at price 927.130005, total balance 8263.404967\n",
|
|
"day 127, sell 1 unit at price 934.299988, investment 0.283367 %, total balance 9197.704955,\n",
|
|
"day 128, sell 1 unit at price 932.169983, investment 0.543611 %, total balance 10129.874938,\n",
|
|
"day 132: buy 1 unit at price 937.080017, total balance 9192.794921\n",
|
|
"day 133, sell 1 unit at price 943.000000, investment 0.631748 %, total balance 10135.794921,\n",
|
|
"day 135: buy 1 unit at price 930.239990, total balance 9205.554931\n",
|
|
"day 138, sell 1 unit at price 948.820007, investment 1.997336 %, total balance 10154.374938,\n",
|
|
"day 139: buy 1 unit at price 954.960022, total balance 9199.414916\n",
|
|
"day 140, sell 1 unit at price 969.539978, investment 1.526761 %, total balance 10168.954894,\n",
|
|
"day 141: buy 1 unit at price 971.469971, total balance 9197.484923\n",
|
|
"day 143, sell 1 unit at price 964.859985, investment -0.680411 %, total balance 10162.344908,\n",
|
|
"day 153: buy 1 unit at price 950.760010, total balance 9211.584898\n",
|
|
"day 154, sell 1 unit at price 942.309998, investment -0.888764 %, total balance 10153.894896,\n",
|
|
"day 157: buy 1 unit at price 950.630005, total balance 9203.264891\n",
|
|
"day 158, sell 1 unit at price 959.450012, investment 0.927807 %, total balance 10162.714903,\n",
|
|
"day 161: buy 1 unit at price 952.270020, total balance 9210.444883\n",
|
|
"day 162: buy 1 unit at price 927.330017, total balance 8283.114866\n",
|
|
"day 163, sell 1 unit at price 940.489990, investment -1.237047 %, total balance 9223.604856,\n",
|
|
"day 164, sell 1 unit at price 917.789978, investment -1.028764 %, total balance 10141.394834,\n",
|
|
"day 171: buy 1 unit at price 930.090027, total balance 9211.304807\n",
|
|
"day 172, sell 1 unit at price 943.830017, investment 1.477275 %, total balance 10155.134824,\n",
|
|
"day 178: buy 1 unit at price 968.150024, total balance 9186.984800\n",
|
|
"day 179, sell 1 unit at price 972.919983, investment 0.492688 %, total balance 10159.904783,\n",
|
|
"day 180: buy 1 unit at price 980.340027, total balance 9179.564756\n",
|
|
"day 181: buy 1 unit at price 950.700012, total balance 8228.864744\n",
|
|
"day 182: buy 1 unit at price 947.799988, total balance 7281.064756\n",
|
|
"day 183: buy 1 unit at price 934.090027, total balance 6346.974729\n",
|
|
"day 185: buy 1 unit at price 930.500000, total balance 5416.474729\n",
|
|
"day 186, sell 1 unit at price 930.830017, investment -5.050290 %, total balance 6347.304746,\n",
|
|
"day 188: buy 1 unit at price 923.650024, total balance 5423.654722\n",
|
|
"day 189: buy 1 unit at price 927.960022, total balance 4495.694700\n",
|
|
"day 190, sell 1 unit at price 929.359985, investment -2.244665 %, total balance 5425.054685,\n",
|
|
"day 193, sell 1 unit at price 907.239990, investment -4.279384 %, total balance 6332.294675,\n",
|
|
"day 195, sell 1 unit at price 922.669983, investment -1.222585 %, total balance 7254.964658,\n",
|
|
"day 196, sell 1 unit at price 922.219971, investment -0.889847 %, total balance 8177.184629,\n",
|
|
"day 197, sell 1 unit at price 926.960022, investment 0.358361 %, total balance 9104.144651,\n",
|
|
"day 198, sell 1 unit at price 910.979980, investment -1.829825 %, total balance 10015.124631,\n",
|
|
"day 202: buy 1 unit at price 927.000000, total balance 9088.124631\n",
|
|
"day 205: buy 1 unit at price 913.809998, total balance 8174.314633\n",
|
|
"day 207, sell 1 unit at price 929.570007, investment 0.277239 %, total balance 9103.884640,\n",
|
|
"day 208, sell 1 unit at price 939.330017, investment 2.792705 %, total balance 10043.214657,\n",
|
|
"day 215: buy 1 unit at price 932.070007, total balance 9111.144650\n",
|
|
"day 217: buy 1 unit at price 925.109985, total balance 8186.034665\n",
|
|
"day 218: buy 1 unit at price 920.289978, total balance 7265.744687\n",
|
|
"day 219: buy 1 unit at price 915.000000, total balance 6350.744687\n",
|
|
"day 220: buy 1 unit at price 921.809998, total balance 5428.934689\n",
|
|
"day 221, sell 1 unit at price 931.580017, investment -0.052570 %, total balance 6360.514706,\n",
|
|
"day 222: buy 1 unit at price 932.450012, total balance 5428.064694\n",
|
|
"day 223: buy 1 unit at price 928.530029, total balance 4499.534665\n",
|
|
"day 224, sell 1 unit at price 920.969971, investment -0.447516 %, total balance 5420.504636,\n",
|
|
"day 225: buy 1 unit at price 924.859985, total balance 4495.644651\n",
|
|
"day 226: buy 1 unit at price 944.489990, total balance 3551.154661\n",
|
|
"day 228, sell 1 unit at price 959.109985, investment 4.218236 %, total balance 4510.264646,\n",
|
|
"day 229, sell 1 unit at price 953.270020, investment 4.182516 %, total balance 5463.534666,\n",
|
|
"day 230, sell 1 unit at price 957.789978, investment 3.903188 %, total balance 6421.324644,\n",
|
|
"day 231, sell 1 unit at price 951.679993, investment 2.062307 %, total balance 7373.004637,\n",
|
|
"day 232, sell 1 unit at price 969.960022, investment 4.461890 %, total balance 8342.964659,\n",
|
|
"day 235: buy 1 unit at price 972.599976, total balance 7370.364683\n",
|
|
"day 236, sell 1 unit at price 989.250000, investment 6.962137 %, total balance 8359.614683,\n",
|
|
"day 238: buy 1 unit at price 989.679993, total balance 7369.934690\n",
|
|
"day 241: buy 1 unit at price 992.809998, total balance 6377.124692\n",
|
|
"day 242, sell 1 unit at price 984.450012, investment 4.230857 %, total balance 7361.574704,\n",
|
|
"day 243: buy 1 unit at price 988.200012, total balance 6373.374692\n",
|
|
"day 244: buy 1 unit at price 968.450012, total balance 5404.924680\n",
|
|
"day 245, sell 1 unit at price 970.539978, investment -0.211803 %, total balance 6375.464658,\n",
|
|
"day 246: buy 1 unit at price 973.330017, total balance 5402.134641\n",
|
|
"day 247, sell 1 unit at price 972.559998, investment -1.729852 %, total balance 6374.694639,\n",
|
|
"day 248: buy 1 unit at price 1019.270020, total balance 5355.424619\n",
|
|
"day 249, sell 1 unit at price 1017.109985, investment 2.447597 %, total balance 6372.534604,\n",
|
|
"day 250: buy 1 unit at price 1016.640015, total balance 5355.894589\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": [
|
|
"<Figure size 1080x360 with 1 Axes>"
|
|
]
|
|
},
|
|
"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
|
|
}
|