添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
572 lines
75 KiB
Plaintext
572 lines
75 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 Actor:\n",
|
|
" def __init__(self, name, input_size, output_size, size_layer):\n",
|
|
" with tf.variable_scope(name):\n",
|
|
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
|
" feed_actor = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
|
" tensor_action, tensor_validation = tf.split(feed_actor,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,\n",
|
|
" tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
|
"\n",
|
|
"class Critic:\n",
|
|
" def __init__(self, name, input_size, output_size, size_layer, learning_rate):\n",
|
|
" with tf.variable_scope(name):\n",
|
|
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
|
|
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
|
|
" self.REWARD = tf.placeholder(tf.float32, (None, 1))\n",
|
|
" feed_critic = tf.layers.dense(self.X, size_layer, activation = tf.nn.relu)\n",
|
|
" tensor_action, tensor_validation = tf.split(feed_critic,2,1)\n",
|
|
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
|
|
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
|
|
" feed_critic = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
|
|
" feed_critic = tf.nn.relu(feed_critic) + self.Y\n",
|
|
" feed_critic = tf.layers.dense(feed_critic, size_layer//2, activation = tf.nn.relu)\n",
|
|
" self.logits = tf.layers.dense(feed_critic, 1)\n",
|
|
" self.cost = tf.reduce_mean(tf.square(self.REWARD - self.logits))\n",
|
|
" self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.cost)\n",
|
|
" \n",
|
|
"class Agent:\n",
|
|
"\n",
|
|
" LEARNING_RATE = 0.001\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",
|
|
" MEMORY_SIZE = 300\n",
|
|
" COPY = 1000\n",
|
|
" T_COPY = 0\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.actor = Actor('actor-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
|
" self.actor_target = Actor('actor-target', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE)\n",
|
|
" self.critic = Critic('critic-original', self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
|
" self.critic_target = Critic('critic-target', self.state_size, self.OUTPUT_SIZE, \n",
|
|
" self.LAYER_SIZE, self.LEARNING_RATE)\n",
|
|
" self.grad_critic = tf.gradients(self.critic.logits, self.critic.Y)\n",
|
|
" self.actor_critic_grad = tf.placeholder(tf.float32, [None, self.OUTPUT_SIZE])\n",
|
|
" weights_actor = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='actor')\n",
|
|
" self.grad_actor = tf.gradients(self.actor.logits, weights_actor, -self.actor_critic_grad)\n",
|
|
" grads = zip(self.grad_actor, weights_actor)\n",
|
|
" self.optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE).apply_gradients(grads)\n",
|
|
" self.sess = tf.InteractiveSession()\n",
|
|
" self.sess.run(tf.global_variables_initializer())\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):\n",
|
|
" self.MEMORIES.append((state, action, reward, new_state, dead))\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",
|
|
" prediction = self.sess.run(self.actor.logits, feed_dict={self.actor.X:[state]})[0]\n",
|
|
" action = np.argmax(prediction)\n",
|
|
" return action\n",
|
|
" \n",
|
|
" def _construct_memories_and_train(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.sess.run(self.actor.logits, feed_dict={self.actor.X: states})\n",
|
|
" Q_target = self.sess.run(self.actor_target.logits, feed_dict={self.actor_target.X: states})\n",
|
|
" grads = self.sess.run(self.grad_critic, feed_dict={self.critic.X:states, self.critic.Y:Q})[0]\n",
|
|
" self.sess.run(self.optimizer, feed_dict={self.actor.X:states, self.actor_critic_grad:grads})\n",
|
|
" \n",
|
|
" rewards = np.array([a[2] for a in replay]).reshape((-1, 1))\n",
|
|
" rewards_target = self.sess.run(self.critic_target.logits, \n",
|
|
" feed_dict={self.critic_target.X:new_states,self.critic_target.Y:Q_target})\n",
|
|
" for i in range(len(replay)):\n",
|
|
" if not replay[0][-1]:\n",
|
|
" rewards[i] += self.GAMMA * rewards_target[i]\n",
|
|
" cost, _ = self.sess.run([self.critic.cost, self.critic.optimizer], \n",
|
|
" feed_dict={self.critic.X:states, self.critic.Y:Q, self.critic.REWARD:rewards})\n",
|
|
" return cost\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",
|
|
" 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('actor-original', 'actor-target')\n",
|
|
" self._assign('critic-original', 'critic-target')\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",
|
|
" cost = self._construct_memories_and_train(replay)\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 <ipython-input-3-a50a3d0b4e36>:13: 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: 707.200200.3, cost: 0.405626, total money: 9715.020207\n",
|
|
"epoch: 20, total rewards: 1598.640143.3, cost: 30.734631, total money: 10581.530158\n",
|
|
"epoch: 30, total rewards: 1271.279733.3, cost: 465.966644, total money: 10254.169748\n",
|
|
"epoch: 40, total rewards: 611.054993.3, cost: 38.079464, total money: 2818.014953\n",
|
|
"epoch: 50, total rewards: 1098.115172.3, cost: 71481.406250, total money: 1453.295102\n",
|
|
"epoch: 60, total rewards: 575.370237.3, cost: 45955692.000000, total money: 9558.260252\n",
|
|
"epoch: 70, total rewards: 1020.545110.3, cost: 244974075904.000000, total money: 10003.435125\n",
|
|
"epoch: 80, total rewards: 824.555359.3, cost: 62751015698432.000000, total money: 4025.125366\n",
|
|
"epoch: 90, total rewards: 182.215205.3, cost: 3949580517376.000000, total money: 10182.215205\n",
|
|
"epoch: 100, total rewards: 861.215276.3, cost: 7310792458240.000000, total money: 7918.025274\n",
|
|
"epoch: 110, total rewards: 68.690005.3, cost: 3184271573385216.000000, total money: 10068.690005\n",
|
|
"epoch: 120, total rewards: 205.980352.3, cost: 224217291292672.000000, total money: 10205.980352\n",
|
|
"epoch: 130, total rewards: 256.794983.3, cost: 363017178972160.000000, total money: 8275.784973\n",
|
|
"epoch: 140, total rewards: 1586.720156.3, cost: 530019768074240.000000, total money: 11586.720156\n",
|
|
"epoch: 150, total rewards: 824.849978.3, cost: 3151772092727296.000000, total money: 8881.750002\n",
|
|
"epoch: 160, total rewards: 222.490291.3, cost: 6080023886823424.000000, total money: 9205.850276\n",
|
|
"epoch: 170, total rewards: 37.630069.3, cost: 9586346603577344.000000, total money: 9020.990054\n",
|
|
"epoch: 180, total rewards: 510.125126.3, cost: 22490134536519680.000000, total money: 5604.765140\n",
|
|
"epoch: 190, total rewards: 639.559874.3, cost: 106721235701858304.000000, total money: 9669.019896\n",
|
|
"epoch: 200, total rewards: 945.395079.3, cost: 31826508674760704.000000, total money: 384.445006\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 0: buy 1 unit at price 768.700012, total balance 9231.299988\n",
|
|
"day 2: buy 1 unit at price 762.020020, total balance 8469.279968\n",
|
|
"day 3, sell 1 unit at price 782.520020, investment 1.797842 %, total balance 9251.799988,\n",
|
|
"day 4, sell 1 unit at price 790.510010, investment 3.738746 %, total balance 10042.309998,\n",
|
|
"day 5: buy 1 unit at price 785.309998, total balance 9257.000000\n",
|
|
"day 8: buy 1 unit at price 736.080017, total balance 8520.919983\n",
|
|
"day 11, sell 1 unit at price 771.229980, investment -1.792925 %, total balance 9292.149963,\n",
|
|
"day 12: buy 1 unit at price 760.539978, total balance 8531.609985\n",
|
|
"day 14: buy 1 unit at price 768.270020, total balance 7763.339965\n",
|
|
"day 15: buy 1 unit at price 760.989990, total balance 7002.349975\n",
|
|
"day 17, sell 1 unit at price 768.239990, investment 4.369087 %, total balance 7770.589965,\n",
|
|
"day 20, sell 1 unit at price 747.919983, investment -1.659347 %, total balance 8518.509948,\n",
|
|
"day 21, sell 1 unit at price 750.500000, investment -2.312991 %, total balance 9269.009948,\n",
|
|
"day 22, sell 1 unit at price 762.520020, investment 0.201058 %, total balance 10031.529968,\n",
|
|
"day 27: buy 1 unit at price 789.270020, total balance 9242.259948\n",
|
|
"day 33: buy 1 unit at price 796.419983, total balance 8445.839965\n",
|
|
"day 34, sell 1 unit at price 794.559998, investment 0.670237 %, total balance 9240.399963,\n",
|
|
"day 35, sell 1 unit at price 791.260010, investment -0.647896 %, total balance 10031.659973,\n",
|
|
"day 36: buy 1 unit at price 789.909973, total balance 9241.750000\n",
|
|
"day 37, sell 1 unit at price 791.549988, investment 0.207620 %, total balance 10033.299988,\n",
|
|
"day 41: buy 1 unit at price 786.140015, total balance 9247.159973\n",
|
|
"day 43: buy 1 unit at price 794.020020, total balance 8453.139953\n",
|
|
"day 44: buy 1 unit at price 806.150024, total balance 7646.989929\n",
|
|
"day 45, sell 1 unit at price 806.650024, investment 2.608951 %, total balance 8453.639953,\n",
|
|
"day 47: buy 1 unit at price 807.909973, total balance 7645.729980\n",
|
|
"day 48: buy 1 unit at price 806.359985, total balance 6839.369995\n",
|
|
"day 49, sell 1 unit at price 807.880005, investment 1.745546 %, total balance 7647.250000,\n",
|
|
"day 55: buy 1 unit at price 823.869995, total balance 6823.380005\n",
|
|
"day 56, sell 1 unit at price 835.669983, investment 3.661844 %, total balance 7659.049988,\n",
|
|
"day 57, sell 1 unit at price 832.150024, investment 3.000341 %, total balance 8491.200012,\n",
|
|
"day 58, sell 1 unit at price 823.309998, investment 2.102040 %, total balance 9314.510010,\n",
|
|
"day 59: buy 1 unit at price 802.320007, total balance 8512.190003\n",
|
|
"day 60, sell 1 unit at price 796.789978, investment -3.286928 %, total balance 9308.979981,\n",
|
|
"day 62: buy 1 unit at price 798.530029, total balance 8510.449952\n",
|
|
"day 63, sell 1 unit at price 801.489990, investment -0.103452 %, total balance 9311.939942,\n",
|
|
"day 69, sell 1 unit at price 819.239990, investment 2.593511 %, total balance 10131.179932,\n",
|
|
"day 75: buy 1 unit at price 830.760010, total balance 9300.419922\n",
|
|
"day 76, sell 1 unit at price 831.330017, investment 0.068613 %, total balance 10131.749939,\n",
|
|
"day 77: buy 1 unit at price 828.640015, total balance 9303.109924\n",
|
|
"day 78: buy 1 unit at price 829.280029, total balance 8473.829895\n",
|
|
"day 80, sell 1 unit at price 835.239990, investment 0.796483 %, total balance 9309.069885,\n",
|
|
"day 83: buy 1 unit at price 827.780029, total balance 8481.289856\n",
|
|
"day 84, sell 1 unit at price 831.909973, investment 0.317136 %, total balance 9313.199829,\n",
|
|
"day 86: buy 1 unit at price 838.679993, total balance 8474.519836\n",
|
|
"day 87: buy 1 unit at price 843.250000, total balance 7631.269836\n",
|
|
"day 88: buy 1 unit at price 845.539978, total balance 6785.729858\n",
|
|
"day 89, sell 1 unit at price 845.619995, investment 2.155158 %, total balance 7631.349853,\n",
|
|
"day 91: buy 1 unit at price 848.780029, total balance 6782.569824\n",
|
|
"day 92: buy 1 unit at price 852.119995, total balance 5930.449829\n",
|
|
"day 94, sell 1 unit at price 830.460022, investment -0.980108 %, total balance 6760.909851,\n",
|
|
"day 95: buy 1 unit at price 829.590027, total balance 5931.319824\n",
|
|
"day 96: buy 1 unit at price 817.580017, total balance 5113.739807\n",
|
|
"day 97: buy 1 unit at price 814.429993, total balance 4299.309814\n",
|
|
"day 98: buy 1 unit at price 819.510010, total balance 3479.799804\n",
|
|
"day 104, sell 1 unit at price 834.570007, investment -1.029350 %, total balance 4314.369811,\n",
|
|
"day 105: buy 1 unit at price 831.409973, total balance 3482.959838\n",
|
|
"day 106: buy 1 unit at price 827.880005, total balance 2655.079833\n",
|
|
"day 107, sell 1 unit at price 824.669983, investment -2.468245 %, total balance 3479.749816,\n",
|
|
"day 108: buy 1 unit at price 824.729980, total balance 2655.019836\n",
|
|
"day 110, sell 1 unit at price 824.320007, investment -2.881786 %, total balance 3479.339843,\n",
|
|
"day 111, sell 1 unit at price 823.559998, investment -3.351640 %, total balance 4302.899841,\n",
|
|
"day 112: buy 1 unit at price 837.169983, total balance 3465.729858\n",
|
|
"day 118, sell 1 unit at price 872.299988, investment 5.148321 %, total balance 4338.029846,\n",
|
|
"day 121, sell 1 unit at price 905.960022, investment 10.809952 %, total balance 5243.989868,\n",
|
|
"day 122, sell 1 unit at price 912.570007, investment 12.050147 %, total balance 6156.559875,\n",
|
|
"day 123, sell 1 unit at price 916.440002, investment 11.827798 %, total balance 7072.999877,\n",
|
|
"day 125: buy 1 unit at price 931.659973, total balance 6141.339904\n",
|
|
"day 128: buy 1 unit at price 932.169983, total balance 5209.169921\n",
|
|
"day 132, sell 1 unit at price 937.080017, investment 12.709740 %, total balance 6146.249938,\n",
|
|
"day 133, sell 1 unit at price 943.000000, investment 13.905396 %, total balance 7089.249938,\n",
|
|
"day 134: buy 1 unit at price 919.619995, total balance 6169.629943\n",
|
|
"day 136, sell 1 unit at price 934.010010, investment 13.250401 %, total balance 7103.639953,\n",
|
|
"day 137, sell 1 unit at price 941.859985, investment 12.505226 %, total balance 8045.499938,\n",
|
|
"day 139, sell 1 unit at price 954.960022, investment 2.500918 %, total balance 9000.459960,\n",
|
|
"day 140: buy 1 unit at price 969.539978, total balance 8030.919982\n",
|
|
"day 143: buy 1 unit at price 964.859985, total balance 7066.059997\n",
|
|
"day 149, sell 1 unit at price 983.409973, investment 5.496850 %, total balance 8049.469970,\n",
|
|
"day 150: buy 1 unit at price 949.830017, total balance 7099.639953\n",
|
|
"day 152, sell 1 unit at price 953.400024, investment 3.673260 %, total balance 8053.039977,\n",
|
|
"day 153, sell 1 unit at price 950.760010, investment -1.936998 %, total balance 9003.799987,\n",
|
|
"day 154, sell 1 unit at price 942.309998, investment -2.337125 %, total balance 9946.109985,\n",
|
|
"day 156: buy 1 unit at price 957.369995, total balance 8988.739990\n",
|
|
"day 157, sell 1 unit at price 950.630005, investment 0.084224 %, total balance 9939.369995,\n",
|
|
"day 159, sell 1 unit at price 957.090027, investment -0.029243 %, total balance 10896.460022,\n",
|
|
"day 161: buy 1 unit at price 952.270020, total balance 9944.190002\n",
|
|
"day 163: buy 1 unit at price 940.489990, total balance 9003.700012\n",
|
|
"day 167, sell 1 unit at price 911.710022, investment -4.259296 %, total balance 9915.410034,\n",
|
|
"day 168: buy 1 unit at price 906.690002, total balance 9008.720032\n",
|
|
"day 170, sell 1 unit at price 928.799988, investment -1.242969 %, total balance 9937.520020,\n",
|
|
"day 171, sell 1 unit at price 930.090027, investment 2.580819 %, total balance 10867.610047,\n",
|
|
"day 188: buy 1 unit at price 923.650024, total balance 9943.960023\n",
|
|
"day 191, sell 1 unit at price 926.789978, investment 0.339951 %, total balance 10870.750001,\n",
|
|
"day 196: buy 1 unit at price 922.219971, total balance 9948.530030\n",
|
|
"day 197: buy 1 unit at price 926.960022, total balance 9021.570008\n",
|
|
"day 198, sell 1 unit at price 910.979980, investment -1.218797 %, total balance 9932.549988,\n",
|
|
"day 199: buy 1 unit at price 910.669983, total balance 9021.880005\n",
|
|
"day 202, sell 1 unit at price 927.000000, investment 0.004313 %, total balance 9948.880005,\n",
|
|
"day 203: buy 1 unit at price 921.280029, total balance 9027.599976\n",
|
|
"day 204, sell 1 unit at price 915.890015, investment 0.573208 %, total balance 9943.489991,\n",
|
|
"day 205: buy 1 unit at price 913.809998, total balance 9029.679993\n",
|
|
"day 206, sell 1 unit at price 921.289978, investment 0.001080 %, total balance 9950.969971,\n",
|
|
"day 207: buy 1 unit at price 929.570007, total balance 9021.399964\n",
|
|
"day 208, sell 1 unit at price 939.330017, investment 2.792705 %, total balance 9960.729981,\n",
|
|
"day 209: buy 1 unit at price 937.340027, total balance 9023.389954\n",
|
|
"day 210: buy 1 unit at price 928.450012, total balance 8094.939942\n",
|
|
"day 212: buy 1 unit at price 935.950012, total balance 7158.989930\n",
|
|
"day 213, sell 1 unit at price 926.500000, investment -0.330261 %, total balance 8085.489930,\n",
|
|
"day 219: buy 1 unit at price 915.000000, total balance 7170.489930\n",
|
|
"day 220, sell 1 unit at price 921.809998, investment -1.656819 %, total balance 8092.299928,\n",
|
|
"day 221, sell 1 unit at price 931.580017, investment 0.337122 %, total balance 9023.879945,\n",
|
|
"day 222, sell 1 unit at price 932.450012, investment -0.373952 %, total balance 9956.329957,\n",
|
|
"day 223: buy 1 unit at price 928.530029, total balance 9027.799928\n",
|
|
"day 226: buy 1 unit at price 944.489990, total balance 8083.309938\n",
|
|
"day 227, sell 1 unit at price 949.500000, investment 3.770492 %, total balance 9032.809938,\n",
|
|
"day 228: buy 1 unit at price 959.109985, total balance 8073.699953\n",
|
|
"day 229, sell 1 unit at price 953.270020, investment 2.664426 %, total balance 9026.969973,\n",
|
|
"day 231: buy 1 unit at price 951.679993, total balance 8075.289980\n",
|
|
"day 232, sell 1 unit at price 969.960022, investment 2.696697 %, total balance 9045.250002,\n",
|
|
"day 233, sell 1 unit at price 978.890015, investment 2.062332 %, total balance 10024.140017,\n",
|
|
"day 234, sell 1 unit at price 977.000000, investment 2.660559 %, total balance 11001.140017,\n",
|
|
"day 235: buy 1 unit at price 972.599976, total balance 10028.540041\n",
|
|
"day 238: buy 1 unit at price 989.679993, total balance 9038.860048\n",
|
|
"day 240, sell 1 unit at price 992.179993, investment 2.013162 %, total balance 10031.040041,\n",
|
|
"day 241, sell 1 unit at price 992.809998, investment 0.316264 %, total balance 11023.850039,\n",
|
|
"day 247: buy 1 unit at price 972.559998, total balance 10051.290041\n",
|
|
"day 248, sell 1 unit at price 1019.270020, investment 4.802791 %, total balance 11070.560061,\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
|
|
}
|