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

449 lines
64 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 = 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",
" \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.INITIAL_FEATURES = np.zeros((4, self.state_size))\n",
" self.X = tf.placeholder(tf.float32, (None, None, self.state_size))\n",
" self.Y = tf.placeholder(tf.float32, (None, self.OUTPUT_SIZE))\n",
" cell = tf.nn.rnn_cell.LSTMCell(self.LAYER_SIZE, state_is_tuple = False)\n",
" self.hidden_layer = tf.placeholder(tf.float32, (None, 2 * self.LAYER_SIZE))\n",
" self.rnn,self.last_state = tf.nn.dynamic_rnn(inputs=self.X,cell=cell,\n",
" dtype=tf.float32,\n",
" initial_state=self.hidden_layer)\n",
" tensor_action, tensor_validation = tf.split(self.rnn[:,-1],2,1)\n",
" feed_action = tf.layers.dense(tensor_action, self.OUTPUT_SIZE)\n",
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
" self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
" self.optimizer = tf.train.AdamOptimizer(learning_rate = self.LEARNING_RATE).minimize(self.cost)\n",
" self.sess = tf.InteractiveSession()\n",
" self.sess.run(tf.global_variables_initializer())\n",
" \n",
" def _memorize(self, state, action, reward, new_state, dead, rnn_state):\n",
" self.MEMORIES.append((state, action, reward, new_state, dead, rnn_state))\n",
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
" self.MEMORIES.popleft()\n",
"\n",
" def _construct_memories(self, replay):\n",
" states = np.array([a[0] for a in replay])\n",
" new_states = np.array([a[3] for a in replay])\n",
" init_values = np.array([a[-1] for a in replay])\n",
" Q = self.sess.run(self.logits, feed_dict={self.X:states, self.hidden_layer:init_values})\n",
" Q_new = self.sess.run(self.logits, feed_dict={self.X:new_states, self.hidden_layer:init_values})\n",
" replay_size = len(replay)\n",
" X = np.empty((replay_size, 4, self.state_size))\n",
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
" INIT_VAL = np.empty((replay_size, 2 * self.LAYER_SIZE))\n",
" for i in range(replay_size):\n",
" state_r, action_r, reward_r, new_state_r, dead_r, rnn_memory = replay[i]\n",
" target = Q[i]\n",
" target[action_r] = reward_r\n",
" if not dead_r:\n",
" target[action_r] += self.GAMMA * np.amax(Q_new[i])\n",
" X[i] = state_r\n",
" Y[i] = target\n",
" INIT_VAL[i] = rnn_memory\n",
" return X, Y, INIT_VAL\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",
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
" self.INITIAL_FEATURES[k,:] = state\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action, last_state = self.sess.run([self.logits,self.last_state],\n",
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
" self.hidden_layer:init_value})\n",
" action, init_value = np.argmax(action[0]), last_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",
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
" self.INITIAL_FEATURES = new_state\n",
" invest = ((initial_money - starting_money) / starting_money) * 100\n",
" total_gains = initial_money - starting_money\n",
" return states_buy, states_sell, total_gains, invest\n",
" \n",
" \n",
" def train(self, iterations, checkpoint, initial_money):\n",
" for i in range(iterations):\n",
" total_profit = 0\n",
" inventory = []\n",
" state = self.get_state(0)\n",
" starting_money = initial_money\n",
" init_value = np.zeros((1, 2 * self.LAYER_SIZE))\n",
" for k in range(self.INITIAL_FEATURES.shape[0]):\n",
" self.INITIAL_FEATURES[k,:] = state\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" \n",
" if np.random.rand() < self.EPSILON:\n",
" action = np.random.randint(self.OUTPUT_SIZE)\n",
" else:\n",
" action, last_state = self.sess.run([self.logits,\n",
" self.last_state],\n",
" feed_dict={self.X:[self.INITIAL_FEATURES],\n",
" self.hidden_layer:init_value})\n",
" action, init_value = np.argmax(action[0]), last_state\n",
" \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",
" new_state = np.append([self.get_state(t + 1)], self.INITIAL_FEATURES[:3, :], axis = 0)\n",
" self._memorize(self.INITIAL_FEATURES, action, invest, new_state, \n",
" starting_money < initial_money, init_value[0])\n",
" self.INITIAL_FEATURES = new_state\n",
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
" replay = random.sample(self.MEMORIES, batch_size)\n",
" X, Y, INIT_VAL = self._construct_memories(replay)\n",
" \n",
" cost, _ = self.sess.run([self.cost, self.optimizer], \n",
" feed_dict={self.X: X, self.Y:Y,\n",
" self.hidden_layer: INIT_VAL})\n",
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
" \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:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f2873435940>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.\n",
"WARNING:tensorflow:From <ipython-input-3-976c717fc00c>:35: 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: 1303.755127.3, cost: 0.204159, total money: 2622.175109\n",
"epoch: 20, total rewards: 1332.510133.3, cost: 2.512769, total money: 11332.510133\n",
"epoch: 30, total rewards: 167.034789.3, cost: 0.204751, total money: 10167.034789\n",
"epoch: 40, total rewards: 885.269897.3, cost: 0.095390, total money: 8848.889892\n",
"epoch: 50, total rewards: 312.624996.3, cost: 0.415782, total money: 10312.624996\n",
"epoch: 60, total rewards: 220.209960.3, cost: 0.119438, total money: 10220.209960\n",
"epoch: 70, total rewards: 407.794859.3, cost: 0.983801, total money: 8417.984861\n",
"epoch: 80, total rewards: 200.149718.3, cost: 0.235913, total money: 9226.819701\n",
"epoch: 90, total rewards: 87.564821.3, cost: 0.034903, total money: 8097.894838\n",
"epoch: 100, total rewards: 1056.600041.3, cost: 0.286240, total money: 11056.600041\n",
"epoch: 110, total rewards: 537.204957.3, cost: 0.140037, total money: 7610.014955\n",
"epoch: 120, total rewards: 263.944828.3, cost: 0.535866, total money: 9247.304813\n",
"epoch: 130, total rewards: 387.030092.3, cost: 0.352989, total money: 8396.590090\n",
"epoch: 140, total rewards: 207.069887.3, cost: 0.474047, total money: 10207.069887\n",
"epoch: 150, total rewards: -119.230104.3, cost: 0.301262, total money: 9880.769896\n",
"epoch: 160, total rewards: 21.299804.3, cost: 0.709494, total money: 10021.299804\n",
"epoch: 170, total rewards: 241.145077.3, cost: 0.486697, total money: 10241.145077\n",
"epoch: 180, total rewards: 5.329770.3, cost: 0.447255, total money: 7042.329770\n",
"epoch: 190, total rewards: 126.395198.3, cost: 0.240739, total money: 9107.125178\n",
"epoch: 200, total rewards: 91.499876.3, cost: 0.259028, total money: 8055.119871\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 53: buy 1 unit at price 805.020020, total balance 9194.979980\n",
"day 54, sell 1 unit at price 819.309998, investment 1.775108 %, total balance 10014.289978,\n",
"day 64: buy 1 unit at price 801.340027, total balance 9212.949951\n",
"day 68, sell 1 unit at price 813.669983, investment 1.538667 %, total balance 10026.619934,\n",
"day 79: buy 1 unit at price 823.210022, total balance 9203.409912\n",
"day 82: buy 1 unit at price 829.080017, total balance 8374.329895\n",
"day 84, sell 1 unit at price 831.909973, investment 1.056832 %, total balance 9206.239868,\n",
"day 86, sell 1 unit at price 838.679993, investment 1.157907 %, total balance 10044.919861,\n",
"day 111: buy 1 unit at price 823.559998, total balance 9221.359863\n",
"day 116, sell 1 unit at price 843.190002, investment 2.383555 %, total balance 10064.549865,\n",
"day 167: buy 1 unit at price 911.710022, total balance 9152.839843\n",
"day 169, sell 1 unit at price 918.590027, investment 0.754626 %, total balance 10071.429870,\n",
"day 182: buy 1 unit at price 947.799988, total balance 9123.629882\n",
"day 183, sell 1 unit at price 934.090027, investment -1.446504 %, total balance 10057.719909,\n",
"day 185: buy 1 unit at price 930.500000, total balance 9127.219909\n",
"day 187: buy 1 unit at price 930.390015, total balance 8196.829894\n",
"day 188, sell 1 unit at price 923.650024, investment -0.736161 %, total balance 9120.479918,\n",
"day 190, sell 1 unit at price 929.359985, investment -0.110709 %, total balance 10049.839903,\n",
"day 206: buy 1 unit at price 921.289978, total balance 9128.549925\n",
"day 207, sell 1 unit at price 929.570007, investment 0.898743 %, total balance 10058.119932,\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
}