添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
569 lines
74 KiB
Plaintext
569 lines
74 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",
|
|
" self.logits = tf.layers.dense(feed_actor, output_size)\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",
|
|
" feed_critic = tf.layers.dense(feed_critic, output_size, activation = tf.nn.relu) + 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",
|
|
" state = next_state\n",
|
|
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\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": [
|
|
"epoch: 10, total rewards: 1539.185237.3, cost: 2.181347, total money: 1684.395196\n",
|
|
"epoch: 20, total rewards: 1308.335026.3, cost: 658.992737, total money: 11308.335026\n",
|
|
"epoch: 30, total rewards: 810.315002.3, cost: 19406.357422, total money: 5871.594971\n",
|
|
"epoch: 40, total rewards: 380.889899.3, cost: 436790400.000000, total money: 7327.869879\n",
|
|
"epoch: 50, total rewards: 676.170224.3, cost: 27570524160.000000, total money: 10676.170224\n",
|
|
"epoch: 60, total rewards: 796.770199.3, cost: 935274741760.000000, total money: 10796.770199\n",
|
|
"epoch: 70, total rewards: 47.440366.3, cost: 8344191369216.000000, total money: 7043.150388\n",
|
|
"epoch: 80, total rewards: 450.169980.3, cost: 88121093914624.000000, total money: 6472.479916\n",
|
|
"epoch: 90, total rewards: 443.664980.3, cost: 675454474256384.000000, total money: 9427.024965\n",
|
|
"epoch: 100, total rewards: 350.460142.3, cost: 1153362061950976.000000, total money: 10350.460142\n",
|
|
"epoch: 110, total rewards: 247.584961.3, cost: 6317238688677888.000000, total money: 9230.944946\n",
|
|
"epoch: 120, total rewards: 138.510132.3, cost: 3956869119726321664.000000, total money: 8102.600097\n",
|
|
"epoch: 130, total rewards: 410.025086.3, cost: 2205253088434978816.000000, total money: 10410.025086\n",
|
|
"epoch: 140, total rewards: 513.814999.3, cost: 5849743807884558336.000000, total money: 9497.174984\n",
|
|
"epoch: 150, total rewards: 876.734991.3, cost: 25442419893862400.000000, total money: 9860.094976\n",
|
|
"epoch: 160, total rewards: 216.929627.3, cost: 73146239398445056.000000, total money: 9244.369629\n",
|
|
"epoch: 170, total rewards: 26.000066.3, cost: 210379489706770432.000000, total money: 7992.250066\n",
|
|
"epoch: 180, total rewards: 230.090269.3, cost: 378469838063927296.000000, total money: 8194.180234\n",
|
|
"epoch: 190, total rewards: 31.099796.3, cost: 1333389845631860736.000000, total money: 6978.079776\n",
|
|
"epoch: 200, total rewards: 158.599487.3, cost: 459357028892629008384.000000, total money: 10158.599487\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 3: buy 1 unit at price 782.520020, total balance 9217.479980\n",
|
|
"day 4: buy 1 unit at price 790.510010, total balance 8426.969970\n",
|
|
"day 5, sell 1 unit at price 785.309998, investment 0.356538 %, total balance 9212.279968,\n",
|
|
"day 6, sell 1 unit at price 762.559998, investment -3.535694 %, total balance 9974.839966,\n",
|
|
"day 16: buy 1 unit at price 761.679993, total balance 9213.159973\n",
|
|
"day 17: buy 1 unit at price 768.239990, total balance 8444.919983\n",
|
|
"day 18, sell 1 unit at price 770.840027, investment 1.202609 %, total balance 9215.760010,\n",
|
|
"day 19, sell 1 unit at price 758.039978, investment -1.327712 %, total balance 9973.799988,\n",
|
|
"day 20: buy 1 unit at price 747.919983, total balance 9225.880005\n",
|
|
"day 21: buy 1 unit at price 750.500000, total balance 8475.380005\n",
|
|
"day 22, sell 1 unit at price 762.520020, investment 1.952085 %, total balance 9237.900025,\n",
|
|
"day 24, sell 1 unit at price 771.190002, investment 2.756829 %, total balance 10009.090027,\n",
|
|
"day 25: buy 1 unit at price 776.419983, total balance 9232.670044\n",
|
|
"day 26, sell 1 unit at price 789.289978, investment 1.657607 %, total balance 10021.960022,\n",
|
|
"day 27: buy 1 unit at price 789.270020, total balance 9232.690002\n",
|
|
"day 28: buy 1 unit at price 796.099976, total balance 8436.590026\n",
|
|
"day 31, sell 1 unit at price 790.799988, investment 0.193846 %, total balance 9227.390014,\n",
|
|
"day 32, sell 1 unit at price 794.200012, investment -0.238659 %, total balance 10021.590026,\n",
|
|
"day 33: buy 1 unit at price 796.419983, total balance 9225.170043\n",
|
|
"day 34, sell 1 unit at price 794.559998, investment -0.233543 %, total balance 10019.730041,\n",
|
|
"day 36: buy 1 unit at price 789.909973, total balance 9229.820068\n",
|
|
"day 37, sell 1 unit at price 791.549988, investment 0.207620 %, total balance 10021.370056,\n",
|
|
"day 49: buy 1 unit at price 807.880005, total balance 9213.490051\n",
|
|
"day 51: buy 1 unit at price 806.070007, total balance 8407.420044\n",
|
|
"day 52, sell 1 unit at price 802.174988, investment -0.706171 %, total balance 9209.595032,\n",
|
|
"day 53, sell 1 unit at price 805.020020, investment -0.130260 %, total balance 10014.615052,\n",
|
|
"day 59: buy 1 unit at price 802.320007, total balance 9212.295045\n",
|
|
"day 62, sell 1 unit at price 798.530029, investment -0.472377 %, total balance 10010.825074,\n",
|
|
"day 63: buy 1 unit at price 801.489990, total balance 9209.335084\n",
|
|
"day 64, sell 1 unit at price 801.340027, investment -0.018711 %, total balance 10010.675111,\n",
|
|
"day 67: buy 1 unit at price 809.559998, total balance 9201.115113\n",
|
|
"day 68, sell 1 unit at price 813.669983, investment 0.507681 %, total balance 10014.785096,\n",
|
|
"day 73: buy 1 unit at price 828.070007, total balance 9186.715089\n",
|
|
"day 74, sell 1 unit at price 831.659973, investment 0.433534 %, total balance 10018.375062,\n",
|
|
"day 81: buy 1 unit at price 830.630005, total balance 9187.745057\n",
|
|
"day 82, sell 1 unit at price 829.080017, investment -0.186604 %, total balance 10016.825074,\n",
|
|
"day 87: buy 1 unit at price 843.250000, total balance 9173.575074\n",
|
|
"day 88, sell 1 unit at price 845.539978, investment 0.271566 %, total balance 10019.115052,\n",
|
|
"day 92: buy 1 unit at price 852.119995, total balance 9166.995057\n",
|
|
"day 93, sell 1 unit at price 848.400024, investment -0.436555 %, total balance 10015.395081,\n",
|
|
"day 97: buy 1 unit at price 814.429993, total balance 9200.965088\n",
|
|
"day 98: buy 1 unit at price 819.510010, total balance 8381.455078\n",
|
|
"day 99, sell 1 unit at price 820.919983, investment 0.796875 %, total balance 9202.375061,\n",
|
|
"day 100: buy 1 unit at price 831.409973, total balance 8370.965088\n",
|
|
"day 101, sell 1 unit at price 831.500000, investment 1.463068 %, total balance 9202.465088,\n",
|
|
"day 102, sell 1 unit at price 829.559998, investment -0.222511 %, total balance 10032.025086,\n",
|
|
"day 107: buy 1 unit at price 824.669983, total balance 9207.355103\n",
|
|
"day 109, sell 1 unit at price 823.349976, investment -0.160065 %, total balance 10030.705079,\n",
|
|
"day 110: buy 1 unit at price 824.320007, total balance 9206.385072\n",
|
|
"day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 10029.945070,\n",
|
|
"day 115: buy 1 unit at price 841.650024, total balance 9188.295046\n",
|
|
"day 116, sell 1 unit at price 843.190002, investment 0.182971 %, total balance 10031.485048,\n",
|
|
"day 119: buy 1 unit at price 871.729980, total balance 9159.755068\n",
|
|
"day 120, sell 1 unit at price 874.250000, investment 0.289083 %, total balance 10034.005068,\n",
|
|
"day 129: buy 1 unit at price 928.780029, total balance 9105.225039\n",
|
|
"day 130, sell 1 unit at price 930.599976, investment 0.195950 %, total balance 10035.825015,\n",
|
|
"day 137: buy 1 unit at price 941.859985, total balance 9093.965030\n",
|
|
"day 138, sell 1 unit at price 948.820007, investment 0.738966 %, total balance 10042.785037,\n",
|
|
"day 140: buy 1 unit at price 969.539978, total balance 9073.245059\n",
|
|
"day 141, sell 1 unit at price 971.469971, investment 0.199063 %, total balance 10044.715030,\n",
|
|
"day 144: buy 1 unit at price 966.950012, total balance 9077.765018\n",
|
|
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10053.364994,\n",
|
|
"day 147: buy 1 unit at price 976.570007, total balance 9076.794987\n",
|
|
"day 148, sell 1 unit at price 980.940002, investment 0.447484 %, total balance 10057.734989,\n",
|
|
"day 156: buy 1 unit at price 957.369995, total balance 9100.364994\n",
|
|
"day 157, sell 1 unit at price 950.630005, investment -0.704011 %, total balance 10050.994999,\n",
|
|
"day 160: buy 1 unit at price 965.590027, total balance 9085.404972\n",
|
|
"day 161, sell 1 unit at price 952.270020, investment -1.379468 %, total balance 10037.674992,\n",
|
|
"day 165: buy 1 unit at price 908.729980, total balance 9128.945012\n",
|
|
"day 166: buy 1 unit at price 898.700012, total balance 8230.245000\n",
|
|
"day 167, sell 1 unit at price 911.710022, investment 0.327935 %, total balance 9141.955022,\n",
|
|
"day 168, sell 1 unit at price 906.690002, investment 0.889061 %, total balance 10048.645024,\n",
|
|
"day 169: buy 1 unit at price 918.590027, total balance 9130.054997\n",
|
|
"day 170, sell 1 unit at price 928.799988, investment 1.111482 %, total balance 10058.854985,\n",
|
|
"day 171: buy 1 unit at price 930.090027, total balance 9128.764958\n",
|
|
"day 172: buy 1 unit at price 943.830017, total balance 8184.934941\n",
|
|
"day 173, sell 1 unit at price 947.159973, investment 1.835300 %, total balance 9132.094914,\n",
|
|
"day 174: buy 1 unit at price 955.989990, total balance 8176.104924\n",
|
|
"day 176: buy 1 unit at price 965.400024, total balance 7210.704900\n",
|
|
"day 177, sell 1 unit at price 970.890015, investment 2.867041 %, total balance 8181.594915,\n",
|
|
"day 178, sell 1 unit at price 968.150024, investment 1.271983 %, total balance 9149.744939,\n",
|
|
"day 179, sell 1 unit at price 972.919983, investment 0.778947 %, total balance 10122.664922,\n",
|
|
"day 182: buy 1 unit at price 947.799988, total balance 9174.864934\n",
|
|
"day 183, sell 1 unit at price 934.090027, investment -1.446504 %, total balance 10108.954961,\n",
|
|
"day 184: buy 1 unit at price 941.530029, total balance 9167.424932\n",
|
|
"day 185: buy 1 unit at price 930.500000, total balance 8236.924932\n",
|
|
"day 186, sell 1 unit at price 930.830017, investment -1.136449 %, total balance 9167.754949,\n",
|
|
"day 187, sell 1 unit at price 930.390015, investment -0.011820 %, total balance 10098.144964,\n",
|
|
"day 189: buy 1 unit at price 927.960022, total balance 9170.184942\n",
|
|
"day 190, sell 1 unit at price 929.359985, investment 0.150865 %, total balance 10099.544927,\n",
|
|
"day 192: buy 1 unit at price 922.900024, total balance 9176.644903\n",
|
|
"day 193, sell 1 unit at price 907.239990, investment -1.696829 %, total balance 10083.884893,\n",
|
|
"day 197: buy 1 unit at price 926.960022, total balance 9156.924871\n",
|
|
"day 198, sell 1 unit at price 910.979980, investment -1.723919 %, total balance 10067.904851,\n",
|
|
"day 199: buy 1 unit at price 910.669983, total balance 9157.234868\n",
|
|
"day 200, sell 1 unit at price 906.659973, investment -0.440336 %, total balance 10063.894841,\n",
|
|
"day 202: buy 1 unit at price 927.000000, total balance 9136.894841\n",
|
|
"day 203, sell 1 unit at price 921.280029, investment -0.617041 %, total balance 10058.174870,\n",
|
|
"day 204: buy 1 unit at price 915.890015, total balance 9142.284855\n",
|
|
"day 205: buy 1 unit at price 913.809998, total balance 8228.474857\n",
|
|
"day 206, sell 1 unit at price 921.289978, investment 0.589586 %, total balance 9149.764835,\n",
|
|
"day 207, sell 1 unit at price 929.570007, investment 1.724648 %, total balance 10079.334842,\n",
|
|
"day 209: buy 1 unit at price 937.340027, total balance 9141.994815\n",
|
|
"day 210, sell 1 unit at price 928.450012, investment -0.948430 %, total balance 10070.444827,\n",
|
|
"day 211: buy 1 unit at price 927.809998, total balance 9142.634829\n",
|
|
"day 212: buy 1 unit at price 935.950012, total balance 8206.684817\n",
|
|
"day 213: buy 1 unit at price 926.500000, total balance 7280.184817\n",
|
|
"day 214, sell 1 unit at price 929.080017, investment 0.136884 %, total balance 8209.264834,\n",
|
|
"day 215: buy 1 unit at price 932.070007, total balance 7277.194827\n",
|
|
"day 216: buy 1 unit at price 935.090027, total balance 6342.104800\n",
|
|
"day 217, sell 1 unit at price 925.109985, investment -1.158184 %, total balance 7267.214785,\n",
|
|
"day 218, sell 1 unit at price 920.289978, investment -0.670267 %, total balance 8187.504763,\n",
|
|
"day 219, sell 1 unit at price 915.000000, investment -1.831408 %, total balance 9102.504763,\n",
|
|
"day 221, sell 1 unit at price 931.580017, investment -0.375366 %, total balance 10034.084780,\n",
|
|
"day 223: buy 1 unit at price 928.530029, total balance 9105.554751\n",
|
|
"day 224: buy 1 unit at price 920.969971, total balance 8184.584780\n",
|
|
"day 225, sell 1 unit at price 924.859985, investment -0.395253 %, total balance 9109.444765,\n",
|
|
"day 226, sell 1 unit at price 944.489990, investment 2.553831 %, total balance 10053.934755,\n",
|
|
"day 227: buy 1 unit at price 949.500000, total balance 9104.434755\n",
|
|
"day 228, sell 1 unit at price 959.109985, investment 1.012110 %, total balance 10063.544740,\n",
|
|
"day 231: buy 1 unit at price 951.679993, total balance 9111.864747\n",
|
|
"day 232: buy 1 unit at price 969.960022, total balance 8141.904725\n",
|
|
"day 233: buy 1 unit at price 978.890015, total balance 7163.014710\n",
|
|
"day 235, sell 1 unit at price 972.599976, investment 2.198216 %, total balance 8135.614686,\n",
|
|
"day 236, sell 1 unit at price 989.250000, investment 1.988739 %, total balance 9124.864686,\n",
|
|
"day 238, sell 1 unit at price 989.679993, investment 1.102267 %, total balance 10114.544679,\n",
|
|
"day 243: buy 1 unit at price 988.200012, total balance 9126.344667\n",
|
|
"day 244: buy 1 unit at price 968.450012, total balance 8157.894655\n",
|
|
"day 245: buy 1 unit at price 970.539978, total balance 7187.354677\n",
|
|
"day 246, sell 1 unit at price 973.330017, investment -1.504756 %, total balance 8160.684694,\n",
|
|
"day 247: buy 1 unit at price 972.559998, total balance 7188.124696\n",
|
|
"day 248, sell 1 unit at price 1019.270020, investment 5.247561 %, total balance 8207.394716,\n",
|
|
"day 249, sell 1 unit at price 1017.109985, investment 4.798361 %, total balance 9224.504701,\n",
|
|
"day 250: buy 1 unit at price 1016.640015, total balance 8207.864686\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
|
|
}
|