Files
Quant_Code/5.课程代码/4.Stock-Prediction-Models/使用文档/Stock-Prediction-Models-master/agent/18.curiosity-q-learning-agent.ipynb
zhoujie2104231 2757a4d0d2 chore: 添加Stock-Prediction-Models项目文件
添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
2025-04-27 16:28:06 +08:00

588 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 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.X = tf.placeholder(tf.float32, (None, self.state_size))\n",
" self.Y = tf.placeholder(tf.float32, (None, self.state_size))\n",
" self.ACTION = tf.placeholder(tf.float32, (None))\n",
" self.REWARD = tf.placeholder(tf.float32, (None))\n",
" self.batch_size = tf.shape(self.ACTION)[0]\n",
" \n",
" with tf.variable_scope('curiosity_model'):\n",
" action = tf.reshape(self.ACTION, (-1,1))\n",
" state_action = tf.concat([self.X, action], axis=1)\n",
" save_state = tf.identity(self.Y)\n",
" \n",
" feed = tf.layers.dense(state_action, 32, activation=tf.nn.relu)\n",
" self.curiosity_logits = tf.layers.dense(feed, self.state_size)\n",
" self.curiosity_cost = tf.reduce_sum(tf.square(save_state - self.curiosity_logits), axis=1)\n",
" \n",
" self.curiosity_optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE)\\\n",
" .minimize(tf.reduce_mean(self.curiosity_cost))\n",
" \n",
" total_reward = tf.add(self.curiosity_cost, self.REWARD)\n",
" \n",
" with tf.variable_scope(\"q_model\"):\n",
" with tf.variable_scope(\"eval_net\"):\n",
" x_action = tf.layers.dense(self.X, 128, tf.nn.relu)\n",
" self.logits = tf.layers.dense(x_action, self.OUTPUT_SIZE)\n",
" \n",
" with tf.variable_scope(\"target_net\"):\n",
" y_action = tf.layers.dense(self.Y, 128, tf.nn.relu)\n",
" y_q = tf.layers.dense(y_action, self.OUTPUT_SIZE)\n",
" \n",
" q_target = total_reward + self.GAMMA * tf.reduce_max(y_q, axis=1)\n",
" action = tf.cast(self.ACTION, tf.int32)\n",
" action_indices = tf.stack([tf.range(self.batch_size, dtype=tf.int32), action], axis=1)\n",
" q = tf.gather_nd(params=self.logits, indices=action_indices)\n",
" self.cost = tf.losses.mean_squared_error(labels=q_target, predictions=q)\n",
" self.optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE).minimize(\n",
" self.cost, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, \"q_model/eval_net\"))\n",
" \n",
" t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/target_net')\n",
" e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/eval_net')\n",
" self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]\n",
" \n",
" self.sess = tf.InteractiveSession()\n",
" self.sess.run(tf.global_variables_initializer())\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 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 predict(self, inputs):\n",
" return self.sess.run(self.logits, feed_dict={self.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 _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",
" actions = np.array([a[1] for a in replay])\n",
" rewards = np.array([a[2] for a in replay])\n",
" new_states = np.array([a[3] for a in replay])\n",
" if (self.T_COPY + 1) % self.COPY == 0:\n",
" self.sess.run(self.target_replace_op)\n",
" \n",
" cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict = {\n",
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
" })\n",
" \n",
" if (self.T_COPY + 1) % self.COPY == 0:\n",
" self.sess.run(self.curiosity_optimizer, feed_dict = {\n",
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
" })\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._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",
" \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(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: 2349.819823.3, cost: 69092.625000, total money: 12349.819823\n",
"epoch: 20, total rewards: 648.444882.3, cost: 4775652.000000, total money: 6742.654903\n",
"epoch: 30, total rewards: 1543.784977.3, cost: 26533.583984, total money: 7642.034916\n",
"epoch: 40, total rewards: 1360.930418.3, cost: 871420.750000, total money: 695.580380\n",
"epoch: 50, total rewards: 2233.069826.3, cost: 228718.296875, total money: 6354.209779\n",
"epoch: 60, total rewards: 1573.414983.3, cost: 407432.843750, total money: 8625.614995\n",
"epoch: 70, total rewards: -7.114931.3, cost: 32132.660156, total money: 5021.405088\n",
"epoch: 80, total rewards: 798.045042.3, cost: 435778.562500, total money: 9780.935057\n",
"epoch: 90, total rewards: 575.719967.3, cost: 72847.468750, total money: 9559.079952\n",
"epoch: 100, total rewards: 338.655157.3, cost: 379671.968750, total money: 820.245184\n",
"epoch: 110, total rewards: 277.220155.3, cost: 391019.375000, total money: 3452.330140\n",
"epoch: 120, total rewards: 370.379826.3, cost: 429969.843750, total money: 7361.909793\n",
"epoch: 130, total rewards: 441.860107.3, cost: 2082513.625000, total money: 2538.970093\n",
"epoch: 140, total rewards: 709.099850.3, cost: 558315.562500, total money: 130.919796\n",
"epoch: 150, total rewards: 159.675106.3, cost: 2904243.000000, total money: 481.725093\n",
"epoch: 160, total rewards: 581.489981.3, cost: 1408646.250000, total money: 5631.309988\n",
"epoch: 170, total rewards: 1768.579776.3, cost: 1693698.250000, total money: 15.189760\n",
"epoch: 180, total rewards: 952.280210.3, cost: 1472623.250000, total money: 8990.750181\n",
"epoch: 190, total rewards: 1418.655145.3, cost: 25627934.000000, total money: 3706.275139\n",
"epoch: 200, total rewards: 272.595214.3, cost: 922414.500000, total money: 9255.485229\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": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 7: buy 1 unit at price 754.020020, total balance 9245.979980\n",
"day 8: buy 1 unit at price 736.080017, total balance 8509.899963\n",
"day 9: buy 1 unit at price 758.489990, total balance 7751.409973\n",
"day 10: buy 1 unit at price 764.479980, total balance 6986.929993\n",
"day 11: buy 1 unit at price 771.229980, total balance 6215.700013\n",
"day 15, sell 1 unit at price 760.989990, investment 0.924375 %, total balance 6976.690003,\n",
"day 18: buy 1 unit at price 770.840027, total balance 6205.849976\n",
"day 19: buy 1 unit at price 758.039978, total balance 5447.809998\n",
"day 22: buy 1 unit at price 762.520020, total balance 4685.289978\n",
"day 23: buy 1 unit at price 759.109985, total balance 3926.179993\n",
"day 24, sell 1 unit at price 771.190002, investment 4.769860 %, total balance 4697.369995,\n",
"day 27: buy 1 unit at price 789.270020, total balance 3908.099975\n",
"day 28, sell 1 unit at price 796.099976, investment 4.958534 %, total balance 4704.199951,\n",
"day 29: buy 1 unit at price 797.070007, total balance 3907.129944\n",
"day 30, sell 1 unit at price 797.849976, investment 4.365058 %, total balance 4704.979920,\n",
"day 31: buy 1 unit at price 790.799988, total balance 3914.179932\n",
"day 32, sell 1 unit at price 794.200012, investment 2.978363 %, total balance 4708.379944,\n",
"day 33: buy 1 unit at price 796.419983, total balance 3911.959961\n",
"day 35: buy 1 unit at price 791.260010, total balance 3120.699951\n",
"day 36, sell 1 unit at price 789.909973, investment 2.473917 %, total balance 3910.609924,\n",
"day 37: buy 1 unit at price 791.549988, total balance 3119.059936\n",
"day 40, sell 1 unit at price 771.820007, investment 1.817850 %, total balance 3890.879943,\n",
"day 41, sell 1 unit at price 786.140015, investment 3.097623 %, total balance 4677.019958,\n",
"day 42, sell 1 unit at price 786.900024, investment 3.660871 %, total balance 5463.919982,\n",
"day 43, sell 1 unit at price 794.020020, investment 0.601822 %, total balance 6257.940002,\n",
"day 44: buy 1 unit at price 806.150024, total balance 5451.789978\n",
"day 45: buy 1 unit at price 806.650024, total balance 4645.139954\n",
"day 47: buy 1 unit at price 807.909973, total balance 3837.229981\n",
"day 48, sell 1 unit at price 806.359985, investment 1.165516 %, total balance 4643.589966,\n",
"day 50, sell 1 unit at price 804.609985, investment 1.746332 %, total balance 5448.199951,\n",
"day 51: buy 1 unit at price 806.070007, total balance 4642.129944\n",
"day 52: buy 1 unit at price 802.174988, total balance 3839.954956\n",
"day 54: buy 1 unit at price 819.309998, total balance 3020.644958\n",
"day 55, sell 1 unit at price 823.869995, investment 3.446675 %, total balance 3844.514953,\n",
"day 56: buy 1 unit at price 835.669983, total balance 3008.844970\n",
"day 57: buy 1 unit at price 832.150024, total balance 2176.694946\n",
"day 58: buy 1 unit at price 823.309998, total balance 1353.384948\n",
"day 60, sell 1 unit at price 796.789978, investment 0.698881 %, total balance 2150.174926,\n",
"day 61: buy 1 unit at price 795.695007, total balance 1354.479919\n",
"day 62: buy 1 unit at price 798.530029, total balance 555.949890\n",
"day 63, sell 1 unit at price 801.489990, investment 1.255764 %, total balance 1357.439880,\n",
"day 64, sell 1 unit at price 801.340027, investment -0.596663 %, total balance 2158.779907,\n",
"day 65, sell 1 unit at price 806.969971, investment 0.039664 %, total balance 2965.749878,\n",
"day 66, sell 1 unit at price 808.380005, investment 0.058179 %, total balance 3774.129883,\n",
"day 67: buy 1 unit at price 809.559998, total balance 2964.569885\n",
"day 68, sell 1 unit at price 813.669983, investment 0.942843 %, total balance 3778.239868,\n",
"day 69, sell 1 unit at price 819.239990, investment 2.127342 %, total balance 4597.479858,\n",
"day 70, sell 1 unit at price 820.450012, investment 0.139143 %, total balance 5417.929870,\n",
"day 73: buy 1 unit at price 828.070007, total balance 4589.859863\n",
"day 75: buy 1 unit at price 830.760010, total balance 3759.099853\n",
"day 76, sell 1 unit at price 831.330017, investment -0.519340 %, total balance 4590.429870,\n",
"day 81, sell 1 unit at price 830.630005, investment -0.182662 %, total balance 5421.059875,\n",
"day 82, sell 1 unit at price 829.080017, investment 0.700832 %, total balance 6250.139892,\n",
"day 83, sell 1 unit at price 827.780029, investment 4.032327 %, total balance 7077.919921,\n",
"day 84: buy 1 unit at price 831.909973, total balance 6246.009948\n",
"day 87: buy 1 unit at price 843.250000, total balance 5402.759948\n",
"day 88: buy 1 unit at price 845.539978, total balance 4557.219970\n",
"day 89, sell 1 unit at price 845.619995, investment 5.897081 %, total balance 5402.839965,\n",
"day 92, sell 1 unit at price 852.119995, investment 5.257176 %, total balance 6254.959960,\n",
"day 93: buy 1 unit at price 848.400024, total balance 5406.559936\n",
"day 94: buy 1 unit at price 830.460022, total balance 4576.099914\n",
"day 95, sell 1 unit at price 829.590027, investment 0.183562 %, total balance 5405.689941,\n",
"day 99, sell 1 unit at price 820.919983, investment -1.184461 %, total balance 6226.609924,\n",
"day 101, sell 1 unit at price 831.500000, investment -0.049281 %, total balance 7058.109924,\n",
"day 103, sell 1 unit at price 838.549988, investment -0.557369 %, total balance 7896.659912,\n",
"day 104: buy 1 unit at price 834.570007, total balance 7062.089905\n",
"day 107, sell 1 unit at price 824.669983, investment -2.468245 %, total balance 7886.759888,\n",
"day 109, sell 1 unit at price 823.349976, investment -2.952622 %, total balance 8710.109864,\n",
"day 110, sell 1 unit at price 824.320007, investment -0.739351 %, total balance 9534.429871,\n",
"day 111: buy 1 unit at price 823.559998, total balance 8710.869873\n",
"day 112, sell 1 unit at price 837.169983, investment 0.311535 %, total balance 9548.039856,\n",
"day 113, sell 1 unit at price 836.820007, investment 1.610084 %, total balance 10384.859863,\n",
"day 122: buy 1 unit at price 912.570007, total balance 9472.289856\n",
"day 123, sell 1 unit at price 916.440002, investment 0.424077 %, total balance 10388.729858,\n",
"day 128: buy 1 unit at price 932.169983, total balance 9456.559875\n",
"day 129, sell 1 unit at price 928.780029, investment -0.363663 %, total balance 10385.339904,\n",
"day 130: buy 1 unit at price 930.599976, total balance 9454.739928\n",
"day 132: buy 1 unit at price 937.080017, total balance 8517.659911\n",
"day 133, sell 1 unit at price 943.000000, investment 1.332476 %, total balance 9460.659911,\n",
"day 134, sell 1 unit at price 919.619995, investment -1.863237 %, total balance 10380.279906,\n",
"day 140: buy 1 unit at price 969.539978, total balance 9410.739928\n",
"day 141, sell 1 unit at price 971.469971, investment 0.199063 %, total balance 10382.209899,\n",
"day 145: buy 1 unit at price 975.599976, total balance 9406.609923\n",
"day 146: buy 1 unit at price 983.679993, total balance 8422.929930\n",
"day 149, sell 1 unit at price 983.409973, investment 0.800533 %, total balance 9406.339903,\n",
"day 150: buy 1 unit at price 949.830017, total balance 8456.509886\n",
"day 151, sell 1 unit at price 942.900024, investment -4.145654 %, total balance 9399.409910,\n",
"day 152, sell 1 unit at price 953.400024, investment 0.375857 %, total balance 10352.809934,\n",
"day 159: buy 1 unit at price 957.090027, total balance 9395.719907\n",
"day 160: buy 1 unit at price 965.590027, total balance 8430.129880\n",
"day 161: buy 1 unit at price 952.270020, total balance 7477.859860\n",
"day 164: buy 1 unit at price 917.789978, total balance 6560.069882\n",
"day 167: buy 1 unit at price 911.710022, total balance 5648.359860\n",
"day 170: buy 1 unit at price 928.799988, total balance 4719.559872\n",
"day 171, sell 1 unit at price 930.090027, investment -2.821051 %, total balance 5649.649899,\n",
"day 173: buy 1 unit at price 947.159973, total balance 4702.489926\n",
"day 174: buy 1 unit at price 955.989990, total balance 3746.499936\n",
"day 175: buy 1 unit at price 953.419983, total balance 2793.079953\n",
"day 176, sell 1 unit at price 965.400024, investment -0.019677 %, total balance 3758.479977,\n",
"day 177: buy 1 unit at price 970.890015, total balance 2787.589962\n",
"day 178, sell 1 unit at price 968.150024, investment 1.667595 %, total balance 3755.739986,\n",
"day 179: buy 1 unit at price 972.919983, total balance 2782.820003\n",
"day 180: buy 1 unit at price 980.340027, total balance 1802.479976\n",
"day 181: buy 1 unit at price 950.700012, total balance 851.779964\n",
"day 183, sell 1 unit at price 934.090027, investment 1.776011 %, total balance 1785.869991,\n",
"day 184, sell 1 unit at price 941.530029, investment 3.270778 %, total balance 2727.400020,\n",
"day 185, sell 1 unit at price 930.500000, investment 0.183033 %, total balance 3657.900020,\n",
"day 186: buy 1 unit at price 930.830017, total balance 2727.070003\n",
"day 190: buy 1 unit at price 929.359985, total balance 1797.710018\n",
"day 191: buy 1 unit at price 926.789978, total balance 870.920040\n",
"day 192, sell 1 unit at price 922.900024, investment -2.561336 %, total balance 1793.820064,\n",
"day 193, sell 1 unit at price 907.239990, investment -5.099426 %, total balance 2701.060054,\n",
"day 194, sell 1 unit at price 914.390015, investment -4.093681 %, total balance 3615.450069,\n",
"day 195: buy 1 unit at price 922.669983, total balance 2692.780086\n",
"day 196, sell 1 unit at price 922.219971, investment -5.012931 %, total balance 3615.000057,\n",
"day 197: buy 1 unit at price 926.960022, total balance 2688.040035\n",
"day 198: buy 1 unit at price 910.979980, total balance 1777.060055\n",
"day 199: buy 1 unit at price 910.669983, total balance 866.390072\n",
"day 200, sell 1 unit at price 906.659973, investment -6.810427 %, total balance 1773.050045,\n",
"day 201, sell 1 unit at price 924.690002, investment -5.676604 %, total balance 2697.740047,\n",
"day 202: buy 1 unit at price 927.000000, total balance 1770.740047\n",
"day 204, sell 1 unit at price 915.890015, investment -3.661512 %, total balance 2686.630062,\n",
"day 210, sell 1 unit at price 928.450012, investment -0.255686 %, total balance 3615.080074,\n",
"day 214: buy 1 unit at price 929.080017, total balance 2686.000057\n",
"day 215: buy 1 unit at price 932.070007, total balance 1753.930050\n",
"day 216: buy 1 unit at price 935.090027, total balance 818.840023\n",
"day 220, sell 1 unit at price 921.809998, investment -0.812386 %, total balance 1740.650021,\n",
"day 221, sell 1 unit at price 931.580017, investment 0.516842 %, total balance 2672.230038,\n",
"day 222, sell 1 unit at price 932.450012, investment 1.059970 %, total balance 3604.680050,\n",
"day 224, sell 1 unit at price 920.969971, investment -0.646204 %, total balance 4525.650021,\n",
"day 226, sell 1 unit at price 944.489990, investment 3.678457 %, total balance 5470.140011,\n",
"day 227, sell 1 unit at price 949.500000, investment 4.263896 %, total balance 6419.640011,\n",
"day 228, sell 1 unit at price 959.109985, investment 3.463860 %, total balance 7378.749996,\n",
"day 229, sell 1 unit at price 953.270020, investment 2.603651 %, total balance 8332.020016,\n",
"day 230, sell 1 unit at price 957.789978, investment 2.759446 %, total balance 9289.809994,\n",
"day 232, sell 1 unit at price 969.960022, investment 3.729052 %, total balance 10259.770016,\n",
"day 235: buy 1 unit at price 972.599976, total balance 9287.170040\n",
"day 236, sell 1 unit at price 989.250000, investment 1.711909 %, total balance 10276.420040,\n",
"day 237: buy 1 unit at price 987.830017, total balance 9288.590023\n",
"day 238, sell 1 unit at price 989.679993, investment 0.187277 %, total balance 10278.270016,\n",
"day 241: buy 1 unit at price 992.809998, total balance 9285.460018\n",
"day 242, sell 1 unit at price 984.450012, investment -0.842053 %, total balance 10269.910030,\n",
"day 245: buy 1 unit at price 970.539978, total balance 9299.370052\n",
"day 246: buy 1 unit at price 973.330017, total balance 8326.040035\n",
"day 247, sell 1 unit at price 972.559998, investment 0.208134 %, total balance 9298.600033,\n",
"day 249: buy 1 unit at price 1017.109985, total balance 8281.490048\n",
"day 250, sell 1 unit at price 1016.640015, investment 4.449672 %, total balance 9298.130063,\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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
}