└── use LSTM to predict stocks price-Copy1.ipynb /use LSTM to predict stocks price-Copy1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 123, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas_datareader.data as web\n", 10 | "import datetime\n", 11 | "start = datetime.datetime(2000,1,1)\n", 12 | "end = datetime.datetime(2021,9,1)\n", 13 | "df = web.DataReader('GOOGL', 'stooq', start, end)" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 124, 19 | "metadata": {}, 20 | "outputs": [ 21 | { 22 | "name": "stdout", 23 | "output_type": "stream", 24 | "text": [ 25 | " Open High Low Close Volume\n", 26 | "Date \n", 27 | "2021-08-18 2730.0000 2742.085 2706.430 2708.980 961858.0\n", 28 | "2021-08-17 2755.0000 2765.310 2721.640 2733.230 1085760.0\n", 29 | "2021-08-16 2750.4979 2767.250 2705.975 2766.190 1119918.0\n", 30 | "2021-08-13 2745.0000 2757.130 2740.660 2754.550 797372.0\n", 31 | "2021-08-12 2719.5100 2746.000 2708.510 2743.880 825943.0\n", 32 | "... ... ... ... ... ...\n", 33 | "2004-08-25 52.4800 54.000 51.940 53.000 9197800.0\n", 34 | "2004-08-24 55.6200 55.800 51.785 52.435 15262600.0\n", 35 | "2004-08-23 55.3750 56.740 54.525 54.700 18274400.0\n", 36 | "2004-08-20 50.5050 54.540 50.250 54.155 22857200.0\n", 37 | "2004-08-19 50.0000 52.030 47.980 50.170 44703800.0\n", 38 | "\n", 39 | "[4280 rows x 5 columns]\n" 40 | ] 41 | } 42 | ], 43 | "source": [ 44 | "print(df)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 125, 50 | "metadata": {}, 51 | "outputs": [], 52 | "source": [ 53 | "def Stock_Price_LSTM_Data_Precesing(df,mem_his_days,pre_days):\n", 54 | " df.dropna(inplace=True)\n", 55 | " df.sort_index(inplace=True)\n", 56 | "\n", 57 | " df['label'] = df['Close'].shift(-pre_days)\n", 58 | "\n", 59 | " from sklearn.preprocessing import StandardScaler\n", 60 | " scaler = StandardScaler()\n", 61 | " sca_X = scaler.fit_transform(df.iloc[:,:-1])\n", 62 | "\n", 63 | " from collections import deque\n", 64 | " deq = deque(maxlen=mem_his_days)\n", 65 | "\n", 66 | " X = []\n", 67 | " for i in sca_X:\n", 68 | " deq.append(list(i))\n", 69 | " if len(deq)==mem_his_days:\n", 70 | " X.append(list(deq))\n", 71 | "\n", 72 | " X_lately = X[-pre_days:]\n", 73 | " X = X[:-pre_days]\n", 74 | "\n", 75 | " y = df['label'].values[mem_his_days-1:-pre_days]\n", 76 | "\n", 77 | " import numpy as np\n", 78 | " X = np.array(X)\n", 79 | " y = np.array(y)\n", 80 | "\n", 81 | " return X,y,X_lately" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 126, 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [ 90 | "X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,5,10)" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 127, 96 | "metadata": {}, 97 | "outputs": [ 98 | { 99 | "name": "stdout", 100 | "output_type": "stream", 101 | "text": [ 102 | "4265\n", 103 | "4265\n", 104 | "10\n" 105 | ] 106 | } 107 | ], 108 | "source": [ 109 | "print(len(X))\n", 110 | "print(len(y))\n", 111 | "print(len(X_lately))" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "pre_days = 30\n", 121 | "# mem_days = [5,10,15]\n", 122 | "# lstm_layers = [1,2,3]\n", 123 | "# dense_layers = [1,2,3]\n", 124 | "# units = [16,32]\n", 125 | "mem_days = [5]\n", 126 | "lstm_layers = [1]\n", 127 | "dense_layers = [1]\n", 128 | "units = [32]\n", 129 | "from tensorflow.keras.callbacks import ModelCheckpoint\n", 130 | "for the_mem_days in mem_days:\n", 131 | " for the_lstm_layers in lstm_layers:\n", 132 | " for the_dense_layers in dense_layers:\n", 133 | " for the_units in units:\n", 134 | " filepath = './models/{val_mape:.2f}_{epoch:02d}_'+f'men_{the_mem_days}_lstm_{the_lstm_layers}_dense_{the_dense_layers}_unit_{the_units}'\n", 135 | " checkpoint = ModelCheckpoint(\n", 136 | " filepath=filepath,\n", 137 | " save_weights_only=False,\n", 138 | " monitor='val_mape',\n", 139 | " mode='min',\n", 140 | " save_best_only=True)\n", 141 | "\n", 142 | " X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,the_mem_days,pre_days)\n", 143 | " from sklearn.model_selection import train_test_split\n", 144 | " X_train, X_test, y_train, y_test = train_test_split(X,y,shuffle=False,test_size=0.1)\n", 145 | " \n", 146 | " import tensorflow as tf\n", 147 | " from tensorflow.keras.models import Sequential\n", 148 | " from tensorflow.keras.layers import LSTM, Dense, Dropout\n", 149 | " model = Sequential()\n", 150 | " model.add(LSTM(the_units,input_shape=X.shape[1:],activation='relu',return_sequences=True))\n", 151 | " model.add(Dropout(0.1))\n", 152 | " \n", 153 | " for i in range(the_lstm_layers):\n", 154 | " model.add(LSTM(the_units,activation='relu',return_sequences=True))\n", 155 | " model.add(Dropout(0.1))\n", 156 | "\n", 157 | " model.add(LSTM(the_units,activation='relu'))\n", 158 | " model.add(Dropout(0.1))\n", 159 | "\n", 160 | " for i in range(the_dense_layers):\n", 161 | " model.add(Dense(the_units,activation='relu'))\n", 162 | " model.add(Dropout(0.1))\n", 163 | "\n", 164 | " model.add(Dense(1))\n", 165 | "\n", 166 | " model.compile(optimizer='adam',\n", 167 | " loss='mse',\n", 168 | " metrics=['mape'])\n", 169 | "\n", 170 | " model.fit(X_train,y_train,batch_size=32,epochs=50,validation_data=(X_test,y_test),callbacks=[checkpoint])" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 134, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": [ 179 | "from tensorflow.keras.models import load_model\n", 180 | "best_model = load_model('./models/8.79_07_men_5_lstm_1_dense_1_unit_32')" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 135, 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "name": "stdout", 190 | "output_type": "stream", 191 | "text": [ 192 | "14/14 [==============================] - 0s 2ms/step - loss: 30790.6641 - mape: 8.7935\n", 193 | "423\n" 194 | ] 195 | } 196 | ], 197 | "source": [ 198 | "best_model.evaluate(X_test,y_test)\n", 199 | "pre = best_model.predict(X_test)\n", 200 | "print(len(pre))" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 136, 206 | "metadata": {}, 207 | "outputs": [ 208 | { 209 | "name": "stdout", 210 | "output_type": "stream", 211 | "text": [ 212 | "14/14 [==============================] - 0s 2ms/step - loss: 542585.8125 - mape: 33.3177\n" 213 | ] 214 | }, 215 | { 216 | "data": { 217 | "text/plain": [ 218 | "[542585.8125, 33.31769943237305]" 219 | ] 220 | }, 221 | "execution_count": 136, 222 | "metadata": {}, 223 | "output_type": "execute_result" 224 | } 225 | ], 226 | "source": [ 227 | "model.evaluate(X_test,y_test)\n" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 137, 233 | "metadata": {}, 234 | "outputs": [ 235 | { 236 | "data": { 237 | "image/png": "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\n", 238 | "text/plain": [ 239 | "
" 240 | ] 241 | }, 242 | "metadata": { 243 | "needs_background": "light" 244 | }, 245 | "output_type": "display_data" 246 | } 247 | ], 248 | "source": [ 249 | "import matplotlib.pyplot as plt\n", 250 | "df_time = df.index[-len(y_test):]\n", 251 | "plt.plot(df_time,y_test,color='red',label='price')\n", 252 | "plt.plot(df_time,pre,color='green',label='predict')\n", 253 | "plt.show()\n" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": 116, 259 | "metadata": {}, 260 | "outputs": [ 261 | { 262 | "name": "stdout", 263 | "output_type": "stream", 264 | "text": [ 265 | "417\n" 266 | ] 267 | } 268 | ], 269 | "source": [ 270 | "print(len(y_test))" 271 | ] 272 | } 273 | ], 274 | "metadata": { 275 | "kernelspec": { 276 | "display_name": "Python 3", 277 | "language": "python", 278 | "name": "python3" 279 | }, 280 | "language_info": { 281 | "codemirror_mode": { 282 | "name": "ipython", 283 | "version": 3 284 | }, 285 | "file_extension": ".py", 286 | "mimetype": "text/x-python", 287 | "name": "python", 288 | "nbconvert_exporter": "python", 289 | "pygments_lexer": "ipython3", 290 | "version": "3.8.5" 291 | } 292 | }, 293 | "nbformat": 4, 294 | "nbformat_minor": 4 295 | } 296 | --------------------------------------------------------------------------------