添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
498 lines
68 KiB
Plaintext
498 lines
68 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",
|
|
"\n",
|
|
"class Agent:\n",
|
|
" def __init__(self, state_size, window_size, trend, skip, batch_size):\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",
|
|
" self.action_size = 3\n",
|
|
" self.batch_size = batch_size\n",
|
|
" self.memory = deque(maxlen = 1000)\n",
|
|
" self.inventory = []\n",
|
|
"\n",
|
|
" self.gamma = 0.95\n",
|
|
" self.epsilon = 0.5\n",
|
|
" self.epsilon_min = 0.01\n",
|
|
" self.epsilon_decay = 0.999\n",
|
|
"\n",
|
|
" tf.reset_default_graph()\n",
|
|
" self.sess = tf.InteractiveSession()\n",
|
|
" self.X = tf.placeholder(tf.float32, [None, self.state_size])\n",
|
|
" self.Y = tf.placeholder(tf.float32, [None, self.action_size])\n",
|
|
" feed = tf.layers.dense(self.X, 256, activation = tf.nn.relu)\n",
|
|
" self.logits = tf.layers.dense(feed, self.action_size)\n",
|
|
" self.cost = tf.reduce_mean(tf.square(self.Y - self.logits))\n",
|
|
" self.optimizer = tf.train.GradientDescentOptimizer(1e-5).minimize(\n",
|
|
" self.cost\n",
|
|
" )\n",
|
|
" self.sess.run(tf.global_variables_initializer())\n",
|
|
"\n",
|
|
" def act(self, state):\n",
|
|
" if random.random() <= self.epsilon:\n",
|
|
" return random.randrange(self.action_size)\n",
|
|
" return np.argmax(\n",
|
|
" self.sess.run(self.logits, feed_dict = {self.X: state})[0]\n",
|
|
" )\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 replay(self, batch_size):\n",
|
|
" mini_batch = []\n",
|
|
" l = len(self.memory)\n",
|
|
" for i in range(l - batch_size, l):\n",
|
|
" mini_batch.append(self.memory[i])\n",
|
|
" replay_size = len(mini_batch)\n",
|
|
" X = np.empty((replay_size, self.state_size))\n",
|
|
" Y = np.empty((replay_size, self.action_size))\n",
|
|
" states = np.array([a[0][0] for a in mini_batch])\n",
|
|
" new_states = np.array([a[3][0] for a in mini_batch])\n",
|
|
" Q = self.sess.run(self.logits, feed_dict = {self.X: states})\n",
|
|
" Q_new = self.sess.run(self.logits, feed_dict = {self.X: new_states})\n",
|
|
" for i in range(len(mini_batch)):\n",
|
|
" state, action, reward, next_state, done = mini_batch[i]\n",
|
|
" target = Q[i]\n",
|
|
" target[action] = reward\n",
|
|
" if not done:\n",
|
|
" target[action] += self.gamma * np.amax(Q_new[i])\n",
|
|
" X[i] = state\n",
|
|
" Y[i] = target\n",
|
|
" cost, _ = self.sess.run(\n",
|
|
" [self.cost, self.optimizer], feed_dict = {self.X: X, self.Y: Y}\n",
|
|
" )\n",
|
|
" if self.epsilon > self.epsilon_min:\n",
|
|
" self.epsilon *= self.epsilon_decay\n",
|
|
" return cost\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.act(state)\n",
|
|
" next_state = self.get_state(t + 1)\n",
|
|
" \n",
|
|
" if action == 1 and initial_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\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",
|
|
" \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",
|
|
" action = self.act(state)\n",
|
|
" next_state = self.get_state(t + 1)\n",
|
|
" \n",
|
|
" if action == 1 and starting_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\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",
|
|
" self.memory.append((state, action, invest, \n",
|
|
" next_state, starting_money < initial_money))\n",
|
|
" state = next_state\n",
|
|
" batch_size = min(self.batch_size, len(self.memory))\n",
|
|
" cost = self.replay(batch_size)\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: 274.710201.3, cost: 0.810730, total money: 10274.710201\n",
|
|
"epoch: 20, total rewards: 161.429929.3, cost: 0.406487, total money: 10161.429929\n",
|
|
"epoch: 30, total rewards: 89.659849.3, cost: 0.225568, total money: 10089.659849\n",
|
|
"epoch: 40, total rewards: 121.209836.3, cost: 0.152499, total money: 10121.209836\n",
|
|
"epoch: 50, total rewards: 94.869810.3, cost: 0.120762, total money: 10094.869810\n",
|
|
"epoch: 60, total rewards: 123.609922.3, cost: 0.097353, total money: 10123.609922\n",
|
|
"epoch: 70, total rewards: 130.149901.3, cost: 0.131718, total money: 10130.149901\n",
|
|
"epoch: 80, total rewards: 55.369871.3, cost: 0.072531, total money: 10055.369871\n",
|
|
"epoch: 90, total rewards: 177.780026.3, cost: 0.062346, total money: 10177.780026\n",
|
|
"epoch: 100, total rewards: 151.249997.3, cost: 0.056566, total money: 10151.249997\n",
|
|
"epoch: 110, total rewards: 101.629942.3, cost: 0.050717, total money: 10101.629942\n",
|
|
"epoch: 120, total rewards: 138.329892.3, cost: 0.075178, total money: 10138.329892\n",
|
|
"epoch: 130, total rewards: 187.559812.3, cost: 0.039170, total money: 10187.559812\n",
|
|
"epoch: 140, total rewards: 125.699889.3, cost: 0.035156, total money: 10125.699889\n",
|
|
"epoch: 150, total rewards: 138.249876.3, cost: 0.403965, total money: 10138.249876\n",
|
|
"epoch: 160, total rewards: 141.329832.3, cost: 0.029966, total money: 10141.329832\n",
|
|
"epoch: 170, total rewards: 179.989928.3, cost: 0.027219, total money: 10179.989928\n",
|
|
"epoch: 180, total rewards: 191.619871.3, cost: 0.025002, total money: 10191.619871\n",
|
|
"epoch: 190, total rewards: 191.929868.3, cost: 0.149151, total money: 10191.929868\n",
|
|
"epoch: 200, total rewards: 113.759886.3, cost: 0.021398, total money: 10113.759886\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",
|
|
" batch_size = batch_size)\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 4: buy 1 unit at price 790.510010, total balance 9209.489990\n",
|
|
"day 5, sell 1 unit at price 785.309998, investment -0.657805 %, total balance 9994.799988,\n",
|
|
"day 14: buy 1 unit at price 768.270020, total balance 9226.529968\n",
|
|
"day 16, sell 1 unit at price 761.679993, investment -0.857775 %, total balance 9988.209961,\n",
|
|
"day 22: buy 1 unit at price 762.520020, total balance 9225.689941\n",
|
|
"day 23, sell 1 unit at price 759.109985, investment -0.447206 %, total balance 9984.799926,\n",
|
|
"day 28: buy 1 unit at price 796.099976, total balance 9188.699950\n",
|
|
"day 29, sell 1 unit at price 797.070007, investment 0.121848 %, total balance 9985.769957,\n",
|
|
"day 32: buy 1 unit at price 794.200012, total balance 9191.569945\n",
|
|
"day 35: buy 1 unit at price 791.260010, total balance 8400.309935\n",
|
|
"day 36: buy 1 unit at price 789.909973, total balance 7610.399962\n",
|
|
"day 37, sell 1 unit at price 791.549988, investment -0.333672 %, total balance 8401.949950,\n",
|
|
"day 38, sell 1 unit at price 785.049988, investment -0.784827 %, total balance 9186.999938,\n",
|
|
"day 39, sell 1 unit at price 782.789978, investment -0.901368 %, total balance 9969.789916,\n",
|
|
"day 42: buy 1 unit at price 786.900024, total balance 9182.889892\n",
|
|
"day 43: buy 1 unit at price 794.020020, total balance 8388.869872\n",
|
|
"day 44: buy 1 unit at price 806.150024, total balance 7582.719848\n",
|
|
"day 45: buy 1 unit at price 806.650024, total balance 6776.069824\n",
|
|
"day 46: buy 1 unit at price 804.789978, total balance 5971.279846\n",
|
|
"day 48, sell 1 unit at price 806.359985, investment 2.472990 %, total balance 6777.639831,\n",
|
|
"day 49, sell 1 unit at price 807.880005, investment 1.745546 %, total balance 7585.519836,\n",
|
|
"day 50, sell 1 unit at price 804.609985, investment -0.191036 %, total balance 8390.129821,\n",
|
|
"day 51, sell 1 unit at price 806.070007, investment -0.071904 %, total balance 9196.199828,\n",
|
|
"day 53: buy 1 unit at price 805.020020, total balance 8391.179808\n",
|
|
"day 56, sell 1 unit at price 835.669983, investment 3.837027 %, total balance 9226.849791,\n",
|
|
"day 57, sell 1 unit at price 832.150024, investment 3.370103 %, total balance 10058.999815,\n",
|
|
"day 63: buy 1 unit at price 801.489990, total balance 9257.509825\n",
|
|
"day 66: buy 1 unit at price 808.380005, total balance 8449.129820\n",
|
|
"day 67, sell 1 unit at price 809.559998, investment 1.006876 %, total balance 9258.689818,\n",
|
|
"day 68, sell 1 unit at price 813.669983, investment 0.654392 %, total balance 10072.359801,\n",
|
|
"day 71: buy 1 unit at price 818.979980, total balance 9253.379821\n",
|
|
"day 72: buy 1 unit at price 824.159973, total balance 8429.219848\n",
|
|
"day 73: buy 1 unit at price 828.070007, total balance 7601.149841\n",
|
|
"day 74: buy 1 unit at price 831.659973, total balance 6769.489868\n",
|
|
"day 75: buy 1 unit at price 830.760010, total balance 5938.729858\n",
|
|
"day 81, sell 1 unit at price 830.630005, investment 1.422504 %, total balance 6769.359863,\n",
|
|
"day 82, sell 1 unit at price 829.080017, investment 0.596977 %, total balance 7598.439880,\n",
|
|
"day 85, sell 1 unit at price 835.369995, investment 0.881567 %, total balance 8433.809875,\n",
|
|
"day 87, sell 1 unit at price 843.250000, investment 1.393602 %, total balance 9277.059875,\n",
|
|
"day 88, sell 1 unit at price 845.539978, investment 1.779090 %, total balance 10122.599853,\n",
|
|
"day 92: buy 1 unit at price 852.119995, total balance 9270.479858\n",
|
|
"day 93, sell 1 unit at price 848.400024, investment -0.436555 %, total balance 10118.879882,\n",
|
|
"day 99: buy 1 unit at price 820.919983, total balance 9297.959899\n",
|
|
"day 101: buy 1 unit at price 831.500000, total balance 8466.459899\n",
|
|
"day 104, sell 1 unit at price 834.570007, investment 1.662772 %, total balance 9301.029906,\n",
|
|
"day 105, sell 1 unit at price 831.409973, investment -0.010827 %, total balance 10132.439879,\n",
|
|
"day 111: buy 1 unit at price 823.559998, total balance 9308.879881\n",
|
|
"day 113, sell 1 unit at price 836.820007, investment 1.610084 %, total balance 10145.699888,\n",
|
|
"day 116: buy 1 unit at price 843.190002, total balance 9302.509886\n",
|
|
"day 117: buy 1 unit at price 862.760010, total balance 8439.749876\n",
|
|
"day 118: buy 1 unit at price 872.299988, total balance 7567.449888\n",
|
|
"day 119, sell 1 unit at price 871.729980, investment 3.384762 %, total balance 8439.179868,\n",
|
|
"day 120: buy 1 unit at price 874.250000, total balance 7564.929868\n",
|
|
"day 121: buy 1 unit at price 905.960022, total balance 6658.969846\n",
|
|
"day 122, sell 1 unit at price 912.570007, investment 5.773332 %, total balance 7571.539853,\n",
|
|
"day 123, sell 1 unit at price 916.440002, investment 5.060187 %, total balance 8487.979855,\n",
|
|
"day 124, sell 1 unit at price 927.039978, investment 6.038316 %, total balance 9415.019833,\n",
|
|
"day 125: buy 1 unit at price 931.659973, total balance 8483.359860\n",
|
|
"day 126: buy 1 unit at price 927.130005, total balance 7556.229855\n",
|
|
"day 127: buy 1 unit at price 934.299988, total balance 6621.929867\n",
|
|
"day 128: buy 1 unit at price 932.169983, total balance 5689.759884\n",
|
|
"day 129, sell 1 unit at price 928.780029, investment 2.518876 %, total balance 6618.539913,\n",
|
|
"day 130, sell 1 unit at price 930.599976, investment -0.113775 %, total balance 7549.139889,\n",
|
|
"day 131: buy 1 unit at price 932.219971, total balance 6616.919918\n",
|
|
"day 133, sell 1 unit at price 943.000000, investment 1.711734 %, total balance 7559.919918,\n",
|
|
"day 134, sell 1 unit at price 919.619995, investment -1.571229 %, total balance 8479.539913,\n",
|
|
"day 136, sell 1 unit at price 934.010010, investment 0.197392 %, total balance 9413.549923,\n",
|
|
"day 137, sell 1 unit at price 941.859985, investment 1.034092 %, total balance 10355.409908,\n",
|
|
"day 139: buy 1 unit at price 954.960022, total balance 9400.449886\n",
|
|
"day 141, sell 1 unit at price 971.469971, investment 1.728863 %, total balance 10371.919857,\n",
|
|
"day 144: buy 1 unit at price 966.950012, total balance 9404.969845\n",
|
|
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10380.569821,\n",
|
|
"day 149: buy 1 unit at price 983.409973, total balance 9397.159848\n",
|
|
"day 151: buy 1 unit at price 942.900024, total balance 8454.259824\n",
|
|
"day 154, sell 1 unit at price 942.309998, investment -4.179333 %, total balance 9396.569822,\n",
|
|
"day 157: buy 1 unit at price 950.630005, total balance 8445.939817\n",
|
|
"day 159, sell 1 unit at price 957.090027, investment 1.504932 %, total balance 9403.029844,\n",
|
|
"day 160: buy 1 unit at price 965.590027, total balance 8437.439817\n",
|
|
"day 161, sell 1 unit at price 952.270020, investment 0.172519 %, total balance 9389.709837,\n",
|
|
"day 162, sell 1 unit at price 927.330017, investment -3.962345 %, total balance 10317.039854,\n",
|
|
"day 173: buy 1 unit at price 947.159973, total balance 9369.879881\n",
|
|
"day 176, sell 1 unit at price 965.400024, investment 1.925762 %, total balance 10335.279905,\n",
|
|
"day 180: buy 1 unit at price 980.340027, total balance 9354.939878\n",
|
|
"day 184, sell 1 unit at price 941.530029, investment -3.958830 %, total balance 10296.469907,\n",
|
|
"day 185: buy 1 unit at price 930.500000, total balance 9365.969907\n",
|
|
"day 186: buy 1 unit at price 930.830017, total balance 8435.139890\n",
|
|
"day 187, sell 1 unit at price 930.390015, investment -0.011820 %, total balance 9365.529905,\n",
|
|
"day 189, sell 1 unit at price 927.960022, investment -0.308326 %, total balance 10293.489927,\n",
|
|
"day 197: buy 1 unit at price 926.960022, total balance 9366.529905\n",
|
|
"day 200, sell 1 unit at price 906.659973, investment -2.189959 %, total balance 10273.189878,\n",
|
|
"day 203: buy 1 unit at price 921.280029, total balance 9351.909849\n",
|
|
"day 205: buy 1 unit at price 913.809998, total balance 8438.099851\n",
|
|
"day 210, sell 1 unit at price 928.450012, investment 0.778263 %, total balance 9366.549863,\n",
|
|
"day 213, sell 1 unit at price 926.500000, investment 1.388692 %, total balance 10293.049863,\n",
|
|
"day 229: buy 1 unit at price 953.270020, total balance 9339.779843\n",
|
|
"day 232, sell 1 unit at price 969.960022, investment 1.750816 %, total balance 10309.739865,\n",
|
|
"day 234: buy 1 unit at price 977.000000, total balance 9332.739865\n",
|
|
"day 239, sell 1 unit at price 992.000000, investment 1.535312 %, total balance 10324.739865,\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
|
|
}
|