├── README.md ├── baseline2_LSTM.ipynb ├── baseline2_LSTM.py ├── baseline_LSTM.ipynb ├── main2.ipynb ├── main2.py ├── main3.ipynb └── main3.py /README.md: -------------------------------------------------------------------------------- 1 | # Transfer-learning 2 | Transfer Knowledge Learned from Multiple Domains for Time-series Data Prediction 3 | • Applied a deep-learning based method to enable the knowledge transfer between time-series data, learned the feature 4 | space for both source and target domains based on Autoencoder. 5 | • Input the training data to multiple feature space to extract features in different feature structure learned from multiple 6 | domains, built model with NN on Keras to train the model with extracted features. 7 | • Predicted the time-series data (stock price) %30 more accurate than the baseline method. 8 | -------------------------------------------------------------------------------- /baseline2_LSTM.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "#reference: https://www.kaggle.com/benjibb/lstm-stock-prediction-20170507?scriptVersionId=1139231\n", 18 | "import numpy as np\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import pandas as pd\n", 21 | "from pandas import datetime\n", 22 | "import math, time\n", 23 | "import itertools\n", 24 | "from sklearn import preprocessing\n", 25 | "import datetime\n", 26 | "from operator import itemgetter\n", 27 | "from sklearn.metrics import mean_squared_error\n", 28 | "from math import sqrt\n", 29 | "from keras.models import Sequential\n", 30 | "from keras.layers.core import Dense, Dropout, Activation\n", 31 | "from keras.layers.recurrent import LSTM\n", 32 | "from keras.models import load_model\n", 33 | "import keras\n", 34 | "import h5py\n", 35 | "import requests\n", 36 | "import os" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 2, 42 | "metadata": { 43 | "collapsed": true 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "def load_data(stock, seq_len):\n", 48 | " amount_of_features = len(stock.columns) # 5\n", 49 | " data = stock.as_matrix() \n", 50 | " sequence_length = seq_len + 1 # index starting from 0\n", 51 | " result = []\n", 52 | " \n", 53 | " for index in range(len(data) - sequence_length): # maxmimum date = lastest date - sequence length\n", 54 | " result.append(data[index: index + sequence_length]) # index : index + 22days\n", 55 | " \n", 56 | " result = np.array(result)\n", 57 | " print(result.shape)\n", 58 | " row = round(0.9 * result.shape[0]) # 90% split\n", 59 | " train = result[:int(row), :] # 90% date, all features \n", 60 | " \n", 61 | " x_train = train[:, :-1] \n", 62 | " y_train = train[:, -1][:,-1]\n", 63 | " print(x_train.shape)\n", 64 | " print(y_train.shape)\n", 65 | " \n", 66 | " x_test = result[int(row):, :-1]\n", 67 | " y_test = result[int(row):, -1][:,-1]\n", 68 | " print(x_test.shape)\n", 69 | " print(y_test.shape)\n", 70 | "\n", 71 | " x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], amount_of_features))\n", 72 | " x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], amount_of_features)) \n", 73 | "\n", 74 | " return [x_train, y_train, x_test, y_test]" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 3, 80 | "metadata": { 81 | "collapsed": true 82 | }, 83 | "outputs": [], 84 | "source": [ 85 | "def hit_ratio(realvalue,predction):\n", 86 | " ratio = 0.0\n", 87 | " \n", 88 | " return ratio" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 4, 94 | "metadata": {}, 95 | "outputs": [ 96 | { 97 | "data": { 98 | "text/html": [ 99 | "
\n", 100 | "\n", 113 | "\n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | "
symbolopenlowhighvolumeadj close
date
2016-01-05WLTW123.430000122.309998126.2500002163600.0125.839996
2016-01-06WLTW125.239998119.940002125.5400012386400.0119.980003
2016-01-07WLTW116.379997114.930000119.7399982489500.0114.949997
2016-01-08WLTW115.480003113.500000117.4400022006300.0116.620003
2016-01-11WLTW117.010002114.089996117.3300021408600.0114.970001
\n", 182 | "
" 183 | ], 184 | "text/plain": [ 185 | " symbol open low high volume adj close\n", 186 | "date \n", 187 | "2016-01-05 WLTW 123.430000 122.309998 126.250000 2163600.0 125.839996\n", 188 | "2016-01-06 WLTW 125.239998 119.940002 125.540001 2386400.0 119.980003\n", 189 | "2016-01-07 WLTW 116.379997 114.930000 119.739998 2489500.0 114.949997\n", 190 | "2016-01-08 WLTW 115.480003 113.500000 117.440002 2006300.0 116.620003\n", 191 | "2016-01-11 WLTW 117.010002 114.089996 117.330002 1408600.0 114.970001" 192 | ] 193 | }, 194 | "execution_count": 4, 195 | "metadata": {}, 196 | "output_type": "execute_result" 197 | } 198 | ], 199 | "source": [ 200 | "df = pd.read_csv(\"prices-split-adjusted.csv\", index_col = 0)\n", 201 | "df[\"adj close\"] = df.close # Moving close to the last column\n", 202 | "df.drop(['close'], 1, inplace=True) # Moving close to the last column\n", 203 | "df.head()\n", 204 | "# print set(df.symbol)" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 5, 210 | "metadata": {}, 211 | "outputs": [ 212 | { 213 | "data": { 214 | "text/html": [ 215 | "
\n", 216 | "\n", 229 | "\n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | "
symbolopenlowhighvolumeadj close
date
2016-01-05WLTW0.0769340.0780200.0778180.0025170.078812
2016-01-06WLTW0.0780780.0764900.0773740.0027760.075095
2016-01-07WLTW0.0724800.0732540.0737470.0028960.071904
2016-01-08WLTW0.0719110.0723310.0723090.0023340.072964
2016-01-11WLTW0.0728780.0727120.0722400.0016390.071917
\n", 298 | "
" 299 | ], 300 | "text/plain": [ 301 | " symbol open low high volume adj close\n", 302 | "date \n", 303 | "2016-01-05 WLTW 0.076934 0.078020 0.077818 0.002517 0.078812\n", 304 | "2016-01-06 WLTW 0.078078 0.076490 0.077374 0.002776 0.075095\n", 305 | "2016-01-07 WLTW 0.072480 0.073254 0.073747 0.002896 0.071904\n", 306 | "2016-01-08 WLTW 0.071911 0.072331 0.072309 0.002334 0.072964\n", 307 | "2016-01-11 WLTW 0.072878 0.072712 0.072240 0.001639 0.071917" 308 | ] 309 | }, 310 | "execution_count": 5, 311 | "metadata": {}, 312 | "output_type": "execute_result" 313 | } 314 | ], 315 | "source": [ 316 | "from sklearn import preprocessing\n", 317 | "def normalize_data(df):\n", 318 | " min_max_scaler = preprocessing.MinMaxScaler()\n", 319 | " df['open'] = min_max_scaler.fit_transform(df.open.values.reshape(-1,1))\n", 320 | " df['high'] = min_max_scaler.fit_transform(df.high.values.reshape(-1,1))\n", 321 | " df['low'] = min_max_scaler.fit_transform(df.low.values.reshape(-1,1))\n", 322 | " df['volume'] = min_max_scaler.fit_transform(df.volume.values.reshape(-1,1))\n", 323 | " df['adj close'] = min_max_scaler.fit_transform(df['adj close'].values.reshape(-1,1))\n", 324 | " return df\n", 325 | "df = normalize_data(df)\n", 326 | "df.head()" 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": 6, 332 | "metadata": {}, 333 | "outputs": [ 334 | { 335 | "name": "stdout", 336 | "output_type": "stream", 337 | "text": [ 338 | " open low high volume adj close\n", 339 | "date \n", 340 | "2010-01-04 0.018215 0.018625 0.018030 0.143586 0.018384\n", 341 | "2010-01-05 0.018320 0.018705 0.018128 0.175045 0.018417\n", 342 | "2010-01-06 0.018301 0.018475 0.018096 0.160578 0.018108\n", 343 | "2010-01-07 0.018063 0.018318 0.017807 0.138758 0.018073\n", 344 | "2010-01-08 0.017932 0.018319 0.017807 0.130173 0.018200\n", 345 | " open low high volume adj close\n", 346 | "date \n", 347 | "2010-01-04 0.196265 0.199850 0.194964 0.004568 0.197023\n", 348 | "2010-01-05 0.196338 0.198981 0.194443 0.007017 0.196151\n", 349 | "2010-01-06 0.195922 0.194098 0.193827 0.009291 0.191181\n", 350 | "2010-01-07 0.190742 0.189687 0.188886 0.014979 0.186707\n", 351 | "2010-01-08 0.185266 0.188548 0.186783 0.011032 0.189210\n" 352 | ] 353 | }, 354 | { 355 | "name": "stderr", 356 | "output_type": "stream", 357 | "text": [ 358 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: \n", 359 | "A value is trying to be set on a copy of a slice from a DataFrame\n", 360 | "\n", 361 | "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", 362 | " \"\"\"\n", 363 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:8: SettingWithCopyWarning: \n", 364 | "A value is trying to be set on a copy of a slice from a DataFrame\n", 365 | "\n", 366 | "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", 367 | " \n" 368 | ] 369 | } 370 | ], 371 | "source": [ 372 | "symbols = list(set(df.symbol))\n", 373 | "stock_interest = 'AAPL'\n", 374 | "len(symbols)\n", 375 | "df3 = df[df.symbol == stock_interest]\n", 376 | "df3.drop(['symbol'],1,inplace=True)\n", 377 | "print (df3.head())\n", 378 | "df4 = df[df.symbol == 'GOOG']\n", 379 | "df4.drop(['symbol'],1,inplace=True)\n", 380 | "print (df4.head())" 381 | ] 382 | }, 383 | { 384 | "cell_type": "code", 385 | "execution_count": 7, 386 | "metadata": {}, 387 | "outputs": [ 388 | { 389 | "name": "stdout", 390 | "output_type": "stream", 391 | "text": [ 392 | " open low high volume adj close\n", 393 | "date \n", 394 | "2010-01-04 0.196265 0.199850 0.194964 0.004568 0.197023\n", 395 | "2010-01-05 0.196338 0.198981 0.194443 0.007017 0.196151\n", 396 | "2010-01-06 0.195922 0.194098 0.193827 0.009291 0.191181\n", 397 | "2010-01-07 0.190742 0.189687 0.188886 0.014979 0.186707\n", 398 | "2010-01-08 0.185266 0.188548 0.186783 0.011032 0.189210\n", 399 | " open low high volume adj close\n", 400 | "date \n", 401 | "2010-01-04 0.196265 0.199850 0.194964 0.004568 0.197023\n", 402 | "2010-01-05 0.196338 0.198981 0.194443 0.007017 0.196151\n", 403 | "2010-01-06 0.195922 0.194098 0.193827 0.009291 0.191181\n", 404 | "2010-01-07 0.190742 0.189687 0.188886 0.014979 0.186707\n", 405 | "2010-01-08 0.185266 0.188548 0.186783 0.011032 0.189210\n" 406 | ] 407 | }, 408 | { 409 | "name": "stderr", 410 | "output_type": "stream", 411 | "text": [ 412 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: \n", 413 | "A value is trying to be set on a copy of a slice from a DataFrame\n", 414 | "\n", 415 | "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", 416 | " \"\"\"\n" 417 | ] 418 | } 419 | ], 420 | "source": [ 421 | "symbols = list(set(df.symbol))\n", 422 | "stock_interest = 'GOOG'\n", 423 | "len(symbols)\n", 424 | "df2 = df[df.symbol == stock_interest]\n", 425 | "df2.drop(['symbol'],1,inplace=True)\n", 426 | "print (df2.head())\n", 427 | "df = df[df.symbol == stock_interest]\n", 428 | "df.drop(['symbol'],1,inplace=True)\n", 429 | "print (df.head())" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": 8, 435 | "metadata": { 436 | "collapsed": true 437 | }, 438 | "outputs": [], 439 | "source": [ 440 | "# df3 = normalize_data(df3)\n", 441 | "# df3.head()\n", 442 | "# df4 = normalize_data(df4)\n", 443 | "# df4.head()" 444 | ] 445 | }, 446 | { 447 | "cell_type": "code", 448 | "execution_count": 9, 449 | "metadata": {}, 450 | "outputs": [ 451 | { 452 | "name": "stdout", 453 | "output_type": "stream", 454 | "text": [ 455 | "(1762, 5)\n", 456 | "(1762, 5)\n" 457 | ] 458 | }, 459 | { 460 | "data": { 461 | "text/html": [ 462 | "
\n", 463 | "\n", 476 | "\n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | "
openlowhighvolumeadj close
date
2010-01-040.1570470.1611670.1563900.1317220.159399
2010-01-050.1572380.1588840.1549950.2024690.157092
2010-01-060.1561400.1460490.1533410.2681840.143942
2010-01-070.1424360.1344570.1400940.4325220.132105
2010-01-080.1279500.1314640.1344550.3184920.138726
\n", 538 | "
" 539 | ], 540 | "text/plain": [ 541 | " open low high volume adj close\n", 542 | "date \n", 543 | "2010-01-04 0.157047 0.161167 0.156390 0.131722 0.159399\n", 544 | "2010-01-05 0.157238 0.158884 0.154995 0.202469 0.157092\n", 545 | "2010-01-06 0.156140 0.146049 0.153341 0.268184 0.143942\n", 546 | "2010-01-07 0.142436 0.134457 0.140094 0.432522 0.132105\n", 547 | "2010-01-08 0.127950 0.131464 0.134455 0.318492 0.138726" 548 | ] 549 | }, 550 | "execution_count": 9, 551 | "metadata": {}, 552 | "output_type": "execute_result" 553 | } 554 | ], 555 | "source": [ 556 | "print (df.shape)\n", 557 | "print (df2.shape)\n", 558 | "df = normalize_data(df)\n", 559 | "df.head()\n", 560 | "df2 = normalize_data(df2)\n", 561 | "df2.head()" 562 | ] 563 | }, 564 | { 565 | "cell_type": "code", 566 | "execution_count": 10, 567 | "metadata": { 568 | "collapsed": true 569 | }, 570 | "outputs": [], 571 | "source": [ 572 | "def build_model(layers):\n", 573 | " d = 0.3\n", 574 | " model = Sequential()\n", 575 | " \n", 576 | " model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=True))\n", 577 | " model.add(Dropout(d))\n", 578 | " \n", 579 | " model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=False))\n", 580 | " model.add(Dropout(d))\n", 581 | " \n", 582 | " model.add(Dense(32,kernel_initializer=\"uniform\",activation='relu')) \n", 583 | " model.add(Dense(1,kernel_initializer=\"uniform\",activation='linear'))\n", 584 | " \n", 585 | " # adam = keras.optimizers.Adam(decay=0.2)\n", 586 | " \n", 587 | " start = time.time()\n", 588 | " model.compile(loss='mse',optimizer='adam', metrics=['accuracy'])\n", 589 | " print(\"Compilation Time : \", time.time() - start)\n", 590 | " return model" 591 | ] 592 | }, 593 | { 594 | "cell_type": "code", 595 | "execution_count": 12, 596 | "metadata": {}, 597 | "outputs": [ 598 | { 599 | "name": "stdout", 600 | "output_type": "stream", 601 | "text": [ 602 | "(1739, 23, 5)\n", 603 | "(1565, 22, 5)\n", 604 | "(1565,)\n", 605 | "(174, 22, 5)\n", 606 | "(174,)\n", 607 | "(1565, 22, 5)\n", 608 | "(1565,)\n" 609 | ] 610 | } 611 | ], 612 | "source": [ 613 | "window = 22\n", 614 | "X_train, y_train, X_test, y_test = load_data(df2, window)\n", 615 | "print(X_train.shape)\n", 616 | "print(y_train.shape)\n", 617 | "# print (X_train[0], y_train[0])" 618 | ] 619 | }, 620 | { 621 | "cell_type": "code", 622 | "execution_count": 15, 623 | "metadata": {}, 624 | "outputs": [ 625 | { 626 | "name": "stdout", 627 | "output_type": "stream", 628 | "text": [ 629 | "Compilation Time : 0.028599977493286133\n", 630 | "Train on 1408 samples, validate on 157 samples\n", 631 | "Epoch 1/90\n", 632 | "1408/1408 [==============================] - 8s 5ms/step - loss: 0.1276 - acc: 7.1023e-04 - val_loss: 0.5041 - val_acc: 0.0000e+00\n", 633 | "Epoch 2/90\n", 634 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0581 - acc: 7.1023e-04 - val_loss: 0.0336 - val_acc: 0.0000e+00\n", 635 | "Epoch 3/90\n", 636 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0344 - acc: 7.1023e-04 - val_loss: 0.1256 - val_acc: 0.0000e+00\n", 637 | "Epoch 4/90\n", 638 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0147 - acc: 7.1023e-04 - val_loss: 0.1904 - val_acc: 0.0000e+00\n", 639 | "Epoch 5/90\n", 640 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0165 - acc: 7.1023e-04 - val_loss: 0.0965 - val_acc: 0.0000e+00\n", 641 | "Epoch 6/90\n", 642 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0056 - acc: 7.1023e-04 - val_loss: 0.0364 - val_acc: 0.0000e+00\n", 643 | "Epoch 7/90\n", 644 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0082 - acc: 7.1023e-04 - val_loss: 0.0565 - val_acc: 0.0000e+00\n", 645 | "Epoch 8/90\n", 646 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0035 - acc: 7.1023e-04 - val_loss: 0.0807 - val_acc: 0.0000e+00\n", 647 | "Epoch 9/90\n", 648 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0054 - acc: 7.1023e-04 - val_loss: 0.0523 - val_acc: 0.0000e+00\n", 649 | "Epoch 10/90\n", 650 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0029 - acc: 7.1023e-04 - val_loss: 0.0267 - val_acc: 0.0000e+00\n", 651 | "Epoch 11/90\n", 652 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0043 - acc: 7.1023e-04 - val_loss: 0.0388 - val_acc: 0.0000e+00\n", 653 | "Epoch 12/90\n", 654 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0023 - acc: 7.1023e-04 - val_loss: 0.0621 - val_acc: 0.0000e+00\n", 655 | "Epoch 13/90\n", 656 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0029 - acc: 7.1023e-04 - val_loss: 0.0565 - val_acc: 0.0000e+00\n", 657 | "Epoch 14/90\n", 658 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0020 - acc: 7.1023e-04 - val_loss: 0.0402 - val_acc: 0.0000e+00\n", 659 | "Epoch 15/90\n", 660 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0022 - acc: 7.1023e-04 - val_loss: 0.0409 - val_acc: 0.0000e+00\n", 661 | "Epoch 16/90\n", 662 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0018 - acc: 7.1023e-04 - val_loss: 0.0485 - val_acc: 0.0000e+00\n", 663 | "Epoch 17/90\n", 664 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0018 - acc: 7.1023e-04 - val_loss: 0.0408 - val_acc: 0.0000e+00\n", 665 | "Epoch 18/90\n", 666 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0014 - acc: 7.1023e-04 - val_loss: 0.0281 - val_acc: 0.0000e+00\n", 667 | "Epoch 19/90\n", 668 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0016 - acc: 7.1023e-04 - val_loss: 0.0285 - val_acc: 0.0000e+00\n", 669 | "Epoch 20/90\n", 670 | "1408/1408 [==============================] - 8s 5ms/step - loss: 0.0014 - acc: 7.1023e-04 - val_loss: 0.0298 - val_acc: 0.0000e+00\n", 671 | "Epoch 21/90\n", 672 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0014 - acc: 7.1023e-04 - val_loss: 0.0215 - val_acc: 0.0000e+00\n", 673 | "Epoch 22/90\n", 674 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0014 - acc: 7.1023e-04 - val_loss: 0.0222 - val_acc: 0.0000e+00\n", 675 | "Epoch 23/90\n", 676 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0013 - acc: 7.1023e-04 - val_loss: 0.0229 - val_acc: 0.0000e+00\n", 677 | "Epoch 24/90\n", 678 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0013 - acc: 7.1023e-04 - val_loss: 0.0196 - val_acc: 0.0000e+00\n", 679 | "Epoch 25/90\n", 680 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0013 - acc: 7.1023e-04 - val_loss: 0.0201 - val_acc: 0.0000e+00\n", 681 | "Epoch 26/90\n", 682 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0196 - val_acc: 0.0000e+00\n", 683 | "Epoch 27/90\n", 684 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0169 - val_acc: 0.0000e+00\n", 685 | "Epoch 28/90\n", 686 | "1408/1408 [==============================] - 9s 6ms/step - loss: 0.0013 - acc: 7.1023e-04 - val_loss: 0.0179 - val_acc: 0.0000e+00\n", 687 | "Epoch 29/90\n", 688 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0149 - val_acc: 0.0000e+00\n", 689 | "Epoch 30/90\n", 690 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0013 - acc: 7.1023e-04 - val_loss: 0.0159 - val_acc: 0.0000e+00\n", 691 | "Epoch 31/90\n", 692 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0155 - val_acc: 0.0000e+00\n", 693 | "Epoch 32/90\n", 694 | "1408/1408 [==============================] - 9s 6ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0144 - val_acc: 0.0000e+00\n", 695 | "Epoch 33/90\n", 696 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0154 - val_acc: 0.0000e+00\n", 697 | "Epoch 34/90\n", 698 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0013 - acc: 7.1023e-04 - val_loss: 0.0144 - val_acc: 0.0000e+00\n", 699 | "Epoch 35/90\n", 700 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0139 - val_acc: 0.0000e+00\n", 701 | "Epoch 36/90\n", 702 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0142 - val_acc: 0.0000e+00\n", 703 | "Epoch 37/90\n", 704 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0134 - val_acc: 0.0000e+00\n", 705 | "Epoch 38/90\n", 706 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0130 - val_acc: 0.0000e+00\n", 707 | "Epoch 39/90\n", 708 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0128 - val_acc: 0.0000e+00\n", 709 | "Epoch 40/90\n", 710 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0138 - val_acc: 0.0000e+00\n", 711 | "Epoch 41/90\n", 712 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0117 - val_acc: 0.0000e+00\n", 713 | "Epoch 42/90\n", 714 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0130 - val_acc: 0.0000e+00\n", 715 | "Epoch 43/90\n", 716 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0120 - val_acc: 0.0000e+00\n", 717 | "Epoch 44/90\n", 718 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0112 - val_acc: 0.0000e+00\n", 719 | "Epoch 45/90\n", 720 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0120 - val_acc: 0.0000e+00\n", 721 | "Epoch 46/90\n", 722 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0098 - val_acc: 0.0000e+00\n", 723 | "Epoch 47/90\n", 724 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0118 - val_acc: 0.0000e+00\n", 725 | "Epoch 48/90\n", 726 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0094 - val_acc: 0.0000e+00\n", 727 | "Epoch 49/90\n", 728 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0101 - val_acc: 0.0000e+00\n", 729 | "Epoch 50/90\n", 730 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0098 - val_acc: 0.0000e+00\n", 731 | "Epoch 51/90\n", 732 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0087 - val_acc: 0.0000e+00\n", 733 | "Epoch 52/90\n", 734 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0092 - val_acc: 0.0000e+00\n", 735 | "Epoch 53/90\n", 736 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0091 - val_acc: 0.0000e+00\n", 737 | "Epoch 54/90\n", 738 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0010 - acc: 7.1023e-04 - val_loss: 0.0095 - val_acc: 0.0000e+00\n", 739 | "Epoch 55/90\n", 740 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0010 - acc: 7.1023e-04 - val_loss: 0.0084 - val_acc: 0.0000e+00\n", 741 | "Epoch 56/90\n", 742 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0086 - val_acc: 0.0000e+00\n", 743 | "Epoch 57/90\n", 744 | "1408/1408 [==============================] - 8s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0084 - val_acc: 0.0000e+00\n" 745 | ] 746 | }, 747 | { 748 | "name": "stdout", 749 | "output_type": "stream", 750 | "text": [ 751 | "Epoch 58/90\n", 752 | "1408/1408 [==============================] - 9s 7ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0078 - val_acc: 0.0000e+00\n", 753 | "Epoch 59/90\n", 754 | "1408/1408 [==============================] - 9s 7ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0077 - val_acc: 0.0000e+00\n", 755 | "Epoch 60/90\n", 756 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0012 - acc: 7.1023e-04 - val_loss: 0.0070 - val_acc: 0.0000e+00\n", 757 | "Epoch 61/90\n", 758 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.9504e-04 - acc: 7.1023e-04 - val_loss: 0.0073 - val_acc: 0.0000e+00\n", 759 | "Epoch 62/90\n", 760 | "1408/1408 [==============================] - 8s 6ms/step - loss: 9.7314e-04 - acc: 7.1023e-04 - val_loss: 0.0077 - val_acc: 0.0000e+00\n", 761 | "Epoch 63/90\n", 762 | "1408/1408 [==============================] - 8s 5ms/step - loss: 9.8187e-04 - acc: 7.1023e-04 - val_loss: 0.0062 - val_acc: 0.0000e+00\n", 763 | "Epoch 64/90\n", 764 | "1408/1408 [==============================] - 8s 6ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0080 - val_acc: 0.0000e+00\n", 765 | "Epoch 65/90\n", 766 | "1408/1408 [==============================] - 8s 6ms/step - loss: 9.8667e-04 - acc: 7.1023e-04 - val_loss: 0.0061 - val_acc: 0.0000e+00\n", 767 | "Epoch 66/90\n", 768 | "1408/1408 [==============================] - 8s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0060 - val_acc: 0.0000e+00\n", 769 | "Epoch 67/90\n", 770 | "1408/1408 [==============================] - 8s 6ms/step - loss: 9.6535e-04 - acc: 7.1023e-04 - val_loss: 0.0061 - val_acc: 0.0000e+00\n", 771 | "Epoch 68/90\n", 772 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.1207e-04 - acc: 7.1023e-04 - val_loss: 0.0062 - val_acc: 0.0000e+00\n", 773 | "Epoch 69/90\n", 774 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.5739e-04 - acc: 7.1023e-04 - val_loss: 0.0065 - val_acc: 0.0000e+00\n", 775 | "Epoch 70/90\n", 776 | "1408/1408 [==============================] - 8s 6ms/step - loss: 9.4107e-04 - acc: 7.1023e-04 - val_loss: 0.0062 - val_acc: 0.0000e+00\n", 777 | "Epoch 71/90\n", 778 | "1408/1408 [==============================] - 8s 5ms/step - loss: 8.7644e-04 - acc: 7.1023e-04 - val_loss: 0.0053 - val_acc: 0.0000e+00\n", 779 | "Epoch 72/90\n", 780 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.9115e-04 - acc: 7.1023e-04 - val_loss: 0.0062 - val_acc: 0.0000e+00\n", 781 | "Epoch 73/90\n", 782 | "1408/1408 [==============================] - 9s 6ms/step - loss: 9.4848e-04 - acc: 7.1023e-04 - val_loss: 0.0065 - val_acc: 0.0000e+00\n", 783 | "Epoch 74/90\n", 784 | "1408/1408 [==============================] - 9s 7ms/step - loss: 9.8743e-04 - acc: 7.1023e-04 - val_loss: 0.0051 - val_acc: 0.0000e+00\n", 785 | "Epoch 75/90\n", 786 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.6259e-04 - acc: 7.1023e-04 - val_loss: 0.0042 - val_acc: 0.0000e+00\n", 787 | "Epoch 76/90\n", 788 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.8592e-04 - acc: 7.1023e-04 - val_loss: 0.0064 - val_acc: 0.0000e+00\n", 789 | "Epoch 77/90\n", 790 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.2728e-04 - acc: 7.1023e-04 - val_loss: 0.0063 - val_acc: 0.0000e+00\n", 791 | "Epoch 78/90\n", 792 | "1408/1408 [==============================] - 7s 5ms/step - loss: 8.6849e-04 - acc: 7.1023e-04 - val_loss: 0.0063 - val_acc: 0.0000e+00\n", 793 | "Epoch 79/90\n", 794 | "1408/1408 [==============================] - 8s 5ms/step - loss: 8.9687e-04 - acc: 7.1023e-04 - val_loss: 0.0034 - val_acc: 0.0000e+00\n", 795 | "Epoch 80/90\n", 796 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.6089e-04 - acc: 7.1023e-04 - val_loss: 0.0067 - val_acc: 0.0000e+00\n", 797 | "Epoch 81/90\n", 798 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.3145e-04 - acc: 7.1023e-04 - val_loss: 0.0095 - val_acc: 0.0000e+00\n", 799 | "Epoch 82/90\n", 800 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0011 - acc: 7.1023e-04 - val_loss: 0.0060 - val_acc: 0.0000e+00\n", 801 | "Epoch 83/90\n", 802 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.5342e-04 - acc: 7.1023e-04 - val_loss: 0.0035 - val_acc: 0.0000e+00\n", 803 | "Epoch 84/90\n", 804 | "1408/1408 [==============================] - 8s 5ms/step - loss: 9.8694e-04 - acc: 7.1023e-04 - val_loss: 0.0074 - val_acc: 0.0000e+00\n", 805 | "Epoch 85/90\n", 806 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.1002e-04 - acc: 7.1023e-04 - val_loss: 0.0093 - val_acc: 0.0000e+00\n", 807 | "Epoch 86/90\n", 808 | "1408/1408 [==============================] - 7s 5ms/step - loss: 8.8485e-04 - acc: 7.1023e-04 - val_loss: 0.0046 - val_acc: 0.0000e+00\n", 809 | "Epoch 87/90\n", 810 | "1408/1408 [==============================] - 7s 5ms/step - loss: 8.9344e-04 - acc: 7.1023e-04 - val_loss: 0.0060 - val_acc: 0.0000e+00\n", 811 | "Epoch 88/90\n", 812 | "1408/1408 [==============================] - 7s 5ms/step - loss: 9.0518e-04 - acc: 7.1023e-04 - val_loss: 0.0106 - val_acc: 0.0000e+00\n", 813 | "Epoch 89/90\n", 814 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0010 - acc: 7.1023e-04 - val_loss: 0.0073 - val_acc: 0.0000e+00\n", 815 | "Epoch 90/90\n", 816 | "1408/1408 [==============================] - 7s 5ms/step - loss: 0.0010 - acc: 7.1023e-04 - val_loss: 0.0026 - val_acc: 0.0000e+00\n" 817 | ] 818 | }, 819 | { 820 | "data": { 821 | "text/plain": [ 822 | "" 823 | ] 824 | }, 825 | "execution_count": 15, 826 | "metadata": {}, 827 | "output_type": "execute_result" 828 | } 829 | ], 830 | "source": [ 831 | "model = build_model([5,window,1])\n", 832 | "model.fit(X_train,y_train,batch_size=512,epochs=90,validation_split=0.1,verbose=1)" 833 | ] 834 | }, 835 | { 836 | "cell_type": "code", 837 | "execution_count": 16, 838 | "metadata": {}, 839 | "outputs": [ 840 | { 841 | "name": "stdout", 842 | "output_type": "stream", 843 | "text": [ 844 | "(174, 1)\n" 845 | ] 846 | } 847 | ], 848 | "source": [ 849 | "# print(X_test[-1])\n", 850 | "diff=[]\n", 851 | "ratio=[]\n", 852 | "p = model.predict(X_test)\n", 853 | "print (p.shape)\n", 854 | "# for each data index in test data\n", 855 | "for u in range(len(y_test)):\n", 856 | " # pr = prediction day u\n", 857 | " pr = p[u][0]\n", 858 | " # (y_test day u / pr) - 1\n", 859 | " ratio.append((y_test[u]/pr)-1)\n", 860 | " diff.append(abs(y_test[u]- pr))\n", 861 | " # print(u, y_test[u], pr, (y_test[u]/pr)-1, abs(y_test[u]- pr))\n", 862 | " # Last day prediction\n", 863 | " # print(p[-1]) " 864 | ] 865 | }, 866 | { 867 | "cell_type": "code", 868 | "execution_count": 17, 869 | "metadata": { 870 | "collapsed": true 871 | }, 872 | "outputs": [], 873 | "source": [ 874 | "df = pd.read_csv(\"prices-split-adjusted.csv\", index_col = 0)\n", 875 | "df[\"adj close\"] = df.close # Moving close to the last column\n", 876 | "df.drop(['close'], 1, inplace=True) # Moving close to the last column\n", 877 | "df = df[df.symbol == stock_interest]\n", 878 | "df.drop(['symbol'],1,inplace=True)\n", 879 | "\n", 880 | "# Bug fixed at here, please update the denormalize function to this one\n", 881 | "def denormalize(df, normalized_value): \n", 882 | " df = df['adj close'].values.reshape(-1,1)\n", 883 | " normalized_value = normalized_value.reshape(-1,1)\n", 884 | " \n", 885 | " #return df.shape, p.shape\n", 886 | " min_max_scaler = preprocessing.MinMaxScaler()\n", 887 | " a = min_max_scaler.fit_transform(df)\n", 888 | " new = min_max_scaler.inverse_transform(normalized_value)\n", 889 | " return new\n", 890 | "\n", 891 | "newp = denormalize(df, p)\n", 892 | "newy_test = denormalize(df, y_test)" 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": 18, 898 | "metadata": {}, 899 | "outputs": [ 900 | { 901 | "name": "stdout", 902 | "output_type": "stream", 903 | "text": [ 904 | "Train Score: 0.00125 MSE (0.04 RMSE)\n", 905 | "Test Score: 0.00493 MSE (0.07 RMSE)\n" 906 | ] 907 | }, 908 | { 909 | "data": { 910 | "text/plain": [ 911 | "(0.0012544785633671304, 0.0049339870376319721)" 912 | ] 913 | }, 914 | "execution_count": 18, 915 | "metadata": {}, 916 | "output_type": "execute_result" 917 | } 918 | ], 919 | "source": [ 920 | "def model_score(model, X_train, y_train, X_test, y_test):\n", 921 | " trainScore = model.evaluate(X_train, y_train, verbose=0)\n", 922 | " print('Train Score: %.5f MSE (%.2f RMSE)' % (trainScore[0], math.sqrt(trainScore[0])))\n", 923 | "\n", 924 | " testScore = model.evaluate(X_test, y_test, verbose=0)\n", 925 | " print('Test Score: %.5f MSE (%.2f RMSE)' % (testScore[0], math.sqrt(testScore[0])))\n", 926 | " return trainScore[0], testScore[0]\n", 927 | "\n", 928 | "\n", 929 | "model_score(model, X_train, y_train, X_test, y_test)\n", 930 | "\n" 931 | ] 932 | }, 933 | { 934 | "cell_type": "code", 935 | "execution_count": 19, 936 | "metadata": {}, 937 | "outputs": [ 938 | { 939 | "name": "stdout", 940 | "output_type": "stream", 941 | "text": [ 942 | "0.4913294797687861\n" 943 | ] 944 | } 945 | ], 946 | "source": [ 947 | "def trend_score(actual, pred):\n", 948 | " trendScore = 0\n", 949 | " for i in range(len(actual)-1):\n", 950 | " if ((actual[i+1]-actual[i])*(pred[i+1]-actual[i])>0):\n", 951 | " trendScore=trendScore+1\n", 952 | " return trendScore/(len(actual)-1)\n", 953 | "\n", 954 | "trScore = trend_score(newy_test, newp) \n", 955 | "print(trScore)" 956 | ] 957 | }, 958 | { 959 | "cell_type": "code", 960 | "execution_count": 22, 961 | "metadata": {}, 962 | "outputs": [ 963 | { 964 | "data": { 965 | "image/png": "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\n", 966 | "text/plain": [ 967 | "" 968 | ] 969 | }, 970 | "metadata": {}, 971 | "output_type": "display_data" 972 | } 973 | ], 974 | "source": [ 975 | "import matplotlib.pyplot as plt2\n", 976 | "\n", 977 | "plt2.plot(newp,color='red', label='Prediction')\n", 978 | "plt2.plot(newy_test,color='blue', label='Actual')\n", 979 | "plt2.legend(loc='best')\n", 980 | "plt2.show()" 981 | ] 982 | }, 983 | { 984 | "cell_type": "code", 985 | "execution_count": 24, 986 | "metadata": {}, 987 | "outputs": [ 988 | { 989 | "name": "stdout", 990 | "output_type": "stream", 991 | "text": [ 992 | "GOOG\n" 993 | ] 994 | } 995 | ], 996 | "source": [ 997 | "print (stock_interest)" 998 | ] 999 | }, 1000 | { 1001 | "cell_type": "code", 1002 | "execution_count": 26, 1003 | "metadata": {}, 1004 | "outputs": [ 1005 | { 1006 | "name": "stderr", 1007 | "output_type": "stream", 1008 | "text": [ 1009 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n", 1010 | " from pandas.core import datetools\n", 1011 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/base/model.py:473: HessianInversionWarning: Inverting hessian failed, no bse or cov_params available\n", 1012 | " 'available', HessianInversionWarning)\n", 1013 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:584: RuntimeWarning: overflow encountered in exp\n", 1014 | " newparams = ((1-np.exp(-params))/\n", 1015 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:585: RuntimeWarning: overflow encountered in exp\n", 1016 | " (1+np.exp(-params))).copy()\n", 1017 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:585: RuntimeWarning: invalid value encountered in true_divide\n", 1018 | " (1+np.exp(-params))).copy()\n", 1019 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:586: RuntimeWarning: overflow encountered in exp\n", 1020 | " tmp = ((1-np.exp(-params))/\n", 1021 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:587: RuntimeWarning: overflow encountered in exp\n", 1022 | " (1+np.exp(-params))).copy()\n", 1023 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:587: RuntimeWarning: invalid value encountered in true_divide\n", 1024 | " (1+np.exp(-params))).copy()\n", 1025 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:628: RuntimeWarning: overflow encountered in exp\n", 1026 | " newparams = ((1-np.exp(-params))/(1+np.exp(-params))).copy()\n", 1027 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:628: RuntimeWarning: invalid value encountered in true_divide\n", 1028 | " newparams = ((1-np.exp(-params))/(1+np.exp(-params))).copy()\n", 1029 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:629: RuntimeWarning: overflow encountered in exp\n", 1030 | " tmp = ((1-np.exp(-params))/(1+np.exp(-params))).copy()\n", 1031 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/tsa/tsatools.py:629: RuntimeWarning: invalid value encountered in true_divide\n", 1032 | " tmp = ((1-np.exp(-params))/(1+np.exp(-params))).copy()\n", 1033 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/base/model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n", 1034 | " \"Check mle_retvals\", ConvergenceWarning)\n" 1035 | ] 1036 | }, 1037 | { 1038 | "name": "stdout", 1039 | "output_type": "stream", 1040 | "text": [ 1041 | "(1, 1)\n", 1042 | "(1, 1)\n" 1043 | ] 1044 | }, 1045 | { 1046 | "name": "stderr", 1047 | "output_type": "stream", 1048 | "text": [ 1049 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/base/model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n", 1050 | " \"Check mle_retvals\", ConvergenceWarning)\n" 1051 | ] 1052 | } 1053 | ], 1054 | "source": [ 1055 | "import statsmodels.api as sm\n", 1056 | "import statsmodels.api as sm\n", 1057 | "res = sm.tsa.arma_order_select_ic(y_train, ic=['aic', 'bic'], trend='nc')\n", 1058 | "print (res.aic_min_order)\n", 1059 | "print (res.bic_min_order)" 1060 | ] 1061 | }, 1062 | { 1063 | "cell_type": "code", 1064 | "execution_count": null, 1065 | "metadata": { 1066 | "collapsed": true 1067 | }, 1068 | "outputs": [], 1069 | "source": [] 1070 | }, 1071 | { 1072 | "cell_type": "code", 1073 | "execution_count": 28, 1074 | "metadata": {}, 1075 | "outputs": [ 1076 | { 1077 | "name": "stdout", 1078 | "output_type": "stream", 1079 | "text": [ 1080 | "(1565,)\n", 1081 | "(174,)\n" 1082 | ] 1083 | } 1084 | ], 1085 | "source": [ 1086 | "print (y_train.shape)\n", 1087 | "print (y_test.shape)\n", 1088 | "y_all = list(y_train).append(list(y_test))" 1089 | ] 1090 | }, 1091 | { 1092 | "cell_type": "code", 1093 | "execution_count": 29, 1094 | "metadata": {}, 1095 | "outputs": [ 1096 | { 1097 | "data": { 1098 | "image/png": "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\nAABJRU5ErkJggg==\n", 1099 | "text/plain": [ 1100 | "" 1101 | ] 1102 | }, 1103 | "metadata": {}, 1104 | "output_type": "display_data" 1105 | } 1106 | ], 1107 | "source": [ 1108 | "# print list(y_train)\n", 1109 | "y_all = np.zeros(1565+174)\n", 1110 | "y_all[:1565] = y_train\n", 1111 | "y_all[1565:] = y_test\n", 1112 | "plt2.plot(y_all)\n", 1113 | "plt2.show()" 1114 | ] 1115 | }, 1116 | { 1117 | "cell_type": "code", 1118 | "execution_count": 30, 1119 | "metadata": {}, 1120 | "outputs": [ 1121 | { 1122 | "name": "stderr", 1123 | "output_type": "stream", 1124 | "text": [ 1125 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/base/model.py:473: HessianInversionWarning: Inverting hessian failed, no bse or cov_params available\n", 1126 | " 'available', HessianInversionWarning)\n", 1127 | "/Users/sophiawj/anaconda/lib/python3.6/site-packages/statsmodels/base/model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals\n", 1128 | " \"Check mle_retvals\", ConvergenceWarning)\n" 1129 | ] 1130 | }, 1131 | { 1132 | "data": { 1133 | "image/png": "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\n", 1134 | "text/plain": [ 1135 | "" 1136 | ] 1137 | }, 1138 | "metadata": {}, 1139 | "output_type": "display_data" 1140 | } 1141 | ], 1142 | "source": [ 1143 | "from statsmodels.tsa.arima_model import ARMA\n", 1144 | "my_order = res.aic_min_order\n", 1145 | "arma_model = ARMA(y_train,(3,2),freq = 'Q').fit()\n", 1146 | "arma_y = arma_model.predict(start = 1565,end = 1565+174,dynamic=True)\n", 1147 | "\n", 1148 | "# arma_y = arma_model.predict(start = 4,end = 1700)\n", 1149 | "plt2.figure(2)\n", 1150 | "plt2.plot(arma_y,color='blue', label='ARMA Prediction')\n", 1151 | "plt2.plot(y_train,color='red', label='Actual')\n", 1152 | "plt2.legend(loc='best')\n", 1153 | "plt2.show()" 1154 | ] 1155 | }, 1156 | { 1157 | "cell_type": "code", 1158 | "execution_count": 31, 1159 | "metadata": {}, 1160 | "outputs": [ 1161 | { 1162 | "data": { 1163 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4VFX6xz8nBUKvIYQSQm+pEBCQElCwLAtYUGwsoiL+\ndFewrb2turKyuurau6tGBRUUFaV3AqF3aQkkBAKBhBICKef3x5ubmTQySSYzk+F8nmeeO3Pvufee\nO5l873vf877vUVprDAaDweC9+Li7AwaDwWCoXozQGwwGg5djhN5gMBi8HCP0BoPB4OUYoTcYDAYv\nxwi9wWAweDlG6A0Gg8HLMUJvMBgMXo4ReoPBYPBy/NzdAYDmzZvr0NBQd3fDYDAYahTr1q07prUO\nLK+dRwh9aGgoCQkJ7u6GwWAw1CiUUkmOtDOuG4PBYPByjNAbDAaDl2OE3mAwGLwcj/DRl0ZOTg7J\nyclkZ2e7uysGJxIQEECbNm3w9/d3d1cMhosGjxX65ORkGjRoQGhoKEopd3fH4AS01qSnp5OcnEz7\n9u3d3R2D4aLBY1032dnZNGvWzIi8F6GUolmzZuYpzWBwMR4r9IAReS/E/E0NBtfj0UJvMBg8k7g4\nOHrU3b0wOIoR+gtQv379Eut27dpFbGwsUVFRdO/enUmTJvHbb78RFRVFVFQU9evXp2vXrkRFRTF+\n/HgWL16MUooPP/yw8BgbN25EKcX06dNLHP/ZZ5+ldevWREVFERYWxo8//lila4iNjS1MRrv66qvJ\nyMgos+2sWbPYvn174eenn36a+fPnV+n8Bu8jLQ1uvhn+9S9398TgKB47GOup/O1vf2Pq1KmMHj0a\ngC1bthAeHs4VV1wBiLBOnz6dmJgYABYvXkxYWBjffvstd955JwBxcXFERkaWeY6pU6fy0EMPsWPH\nDgYNGkRaWho+PrZ7cm5uLn5+Ff/T/fLLLxfcPmvWLEaOHEmPHj0AeP755yt8DoP3c/CgLOfNc28/\nDI5jLPoKkpqaSps2bQo/h4eHl7tPu3btyM7O5siRI2itmTt3LldddVW5+3Xv3h0/Pz+OHTvGhAkT\nmDx5MpdccgmPPPIIZ86cYeLEifTt25fo6Ghmz54NwNmzZxk3bhzdu3fnmmuu4ezZs4XHCw0N5dix\nYwB8/vnnREREEBkZyW233cbKlSv58ccfefjhh4mKimLv3r1MmDCBmTNnArBgwQKio6MJDw9n4sSJ\nnDt3rvCYzzzzDL169SI8PJydO3c6/mUaaiQpKbLctAkOH3ZvXwyOUTMs+ilTYONG5x4zKgr+858K\n7zZ16lSGDRvGgAEDGDFiBLfffjuNGzcud7/rr7+eGTNmEB0dTa9evahdu3a5+8THx+Pj40NgoNQs\nSk5OZuXKlfj6+vL4448zbNgwPv74YzIyMujbty+XX3457733HnXr1mXHjh1s3ryZXr16lTjutm3b\neOGFF1i5ciXNmzfn+PHjNG3alFGjRjFy5Eiuv/76Iu2zs7OZMGECCxYsoEuXLowfP5533nmHKVOm\nANC8eXPWr1/P22+/zfTp04u4qQzeR3Ky7f28eXDbbe7ri8ExjEVfQW6//XZ27NjB2LFjWbx4Mf36\n9Su0bi/EDTfcwIwZM4iLi+Omm266YNvXXnuNqKgoHnroIb755pvCSJWxY8fi6+sLwO+//87LL79M\nVFQUsbGxZGdnc+DAAZYuXcqtt94KQEREBBERESWOv3DhQsaOHUvz5s0BaNq06QX7s2vXLtq3b0+X\nLl0A+Mtf/sLSpUsLt1977bUA9O7dm8TExHK/C0PNJjkZ/PygeXP4/Xd398bgCDXDoq+E5V2dtGrV\niokTJzJx4kTCwsLYunUrvXv3vuA+LVu2xN/fn3nz5vH666+zcuXKMttaPvri1KtXr/C91prvvvuO\nrl27Vv5CnIT1dOLr60tubq6be2OobpKToXVrGDBALPr8fPAxJqNHY/48FWTu3Lnk5OQAcPjwYdLT\n02ndurVD+z7//PNMmzat0CqvCldccQVvvvkmWmsANmzYAMDgwYP56quvANi6dSubN28use+wYcOY\nMWMG6enpABw/fhyABg0acOrUqRLtu3btSmJiInv27AHgf//7H0OGDKnyNRhqJikpIvTDh8ORI2AX\nqGXwUGqGRe8msrKyigy8PvDAAyQnJ3P//fcTEBAAwCuvvELLli0dOt6AAQOc1rennnqKKVOmEBER\nQX5+Pu3bt2fOnDncc8893H777XTv3p3u3buX+qTRs2dPnnjiCYYMGYKvry/R0dF8+umnjBs3jrvu\nuos33nijcBAWpD7NJ598wtixY8nNzaVPnz5MnjzZaddiqFkkJ8sQV58+8nnTJggLc2+fDBdGWRah\nO4mJidHFJx7ZsWMH3bt3d1OPDNWJ+dvWXLSG+vVh8mT45z/l/YMPynuD61FKrdNax5TXzrhuDAaD\nw2RkQFaWuG5q1YKuXWHrVnf3ylAeRugNBoPDWDH0lkczLMwIfU3ACL3BYHAYK4beXugTE6GUMXyD\nB+GQ0Culpiqltimltiql4pRSAUqppkqpeUqp3QXLJnbtH1NK7VFK7VJKXVF93TcYDK7EEnor0MxK\nDN+2zT39MThGuUKvlGoN/A2I0VqHAb7AOOBRYIHWujOwoOAzSqkeBdt7AlcCbyulqh5PaDAYXM7u\n3RAbK2GUIK4bpSA4WD5b0TbGfePZOOq68QPqKKX8gLrAIWA08FnB9s+AMQXvRwNfa63Paa33A3uA\nvs7rssFgcBUzZsCSJVKWGMSiDwqSgViA0FCoV88IvadTrtBrrVOA6cABIBXI1Fr/DgRprVMLmh0G\nggretwYO2h0iuWBdjWTWrFkopcot1vXpp59y6NChSp9n8eLFjBw5stL7GwzVwbJlsrTSKqysWAsf\nH+jZE7ZscX3fDI7jiOumCWKltwdaAfWUUrfat9ESjF+hgHyl1CSlVIJSKuGoB89gEBcXx8CBA4mz\nTJoyqKrQGwyeRl4erFwJAQGwYoUkRq1eDQUljwoJC5Oag6b6hefiiOvmcmC/1vqo1joH+B4YABxR\nSgUDFCzTCtqnAG3t9m9TsK4IWuv3tdYxWusYqzqjp3H69GmWL1/ORx99xNdff124ftq0aYSHhxMZ\nGcmjjz7KzJkzSUhI4JZbbiEqKoqzZ88WKQmckJBAbGwsAGvWrKF///5ER0czYMAAdu3a5Y5LMxjK\nZfNmOHkSrLJLV1wBZ87AU08VbTdyJBw/Dr/+6vo+uot162D6dLkZ1gQcKYFwAOinlKoLnAUuAxKA\nM8BfgJcLlrML2v8IfKWUehV5AugMrKlKJ91VpXj27NlceeWVdOnShWbNmrFu3TrS0tKYPXs28fHx\n1K1bt7DE73//+98iE46URbdu3Vi2bBl+fn7Mnz+fxx9/nO+++86JV2YwOAfLbXPXXfDDDxJZ8/jj\nUDypeeRIGZx9/334859d309XkpICU6fK2AVATIwMVns6jvjo44GZwHpgS8E+7yMCP1wptRux+l8u\naL8N+BbYDswF7tVa15D7XlHi4uIYN24cAOPGjSMuLo758+dz++23U7duXaD8Er/FyczMZOzYsYSF\nhTF16lS2mbg0g4eybBmEhMjr3nuhXz948smS7fz9YeJE+OUX2+xT3sjMmdCjB8yZAw8/LOvWrrVt\nT0sT0f/hB7d074I4VNRMa/0M8Eyx1ecQ67609i8CL1atazbcUaX4+PHjLFy4kC1btqCUIi8vD6UU\nY8eOdWh/Pz8/8vPzAZm4w+Kpp55i6NCh/PDDDyQmJha6dAwGT0JrEfrLL5fP99wjr7K480546SUY\nOxY6dZIbQrdurumrK9BabnYdOog136kTfPcdrFlj237PPRKhtHatjG1cYLZQl2MyY8tg5syZ3Hbb\nbSQlJZGYmMjBgwdp3749jRo14pNPPiErKwsou8RvaGgo69atAyjimsnMzCwsa/zpp5+66GoMhopx\n9KjEzlsVKssjNFSEMD0dvvzSFo7pLSQmisV+990i8gB9+9qE/ptv4PvvpcBb48ZwzTWelS1shL4M\n4uLiuOaaa4qsu+6660hNTWXUqFHExMQQFRXF9OnTAQrndLUGY5955hnuv/9+YmJiitSff+SRR3js\nsceIjo42k3QYPBYrgMyuSne5vPmmJFi1awd791ZPv9zF6tWy7NfPtq5vXzhwQF4PPCCfp02Tm9z+\n/fDRR+7pa6lord3+6t27ty7O9u3bS6wzeAfmb+v5/PKL1qD1ihUV33fYMK379XN+n9zJ3/6mdd26\nWufk2NYtXy7f0Q03yHLuXNu2QYO0bteuaPvqAEjQDmissegNBkMJDh+WpVXqoCJ07AgFk5F5DfHx\n4sbysxvVjI4GX1/49luJRBoxwrbtwQchKUn8+Bbp6TLtojswQm8wGEqQWpDz7uDkaUXo2BGOHZMY\nfG/g3DnYsKGo2wagbl1bUbf775caQBZ//jN07gz/+IfU8P/pJ/kuP//cdf22xwi9wWAoQWoqNGoE\ndepUfN+OHWXpqJ/+rrvg2Wcrfh5XsWEDnD8Pl1xSctuQIdCiBdx2W9H1Pj7w6qvwxx/Qvz/ccINk\nDi9Y4Jo+F8cIvcFgKEFqauXcNlAxoc/Pl8HLd95xn1ujLDIz4cUXbdMklib0L78sBd0K0mqKMHIk\n/Pyz1AcKCYGhQ6WUhDswQm8wGErgKqHfu1fKKqSlieXsScyeLfkAP/4o/vlWrUq2CQiAC1VwGT4c\ndu6UMMyRIyUax3KLuRIj9AaDB+OuCNyqCH3DhiJ+jgzI2pc2+eWXyp2vukhKkmVWlgzGVpbWrcUN\nduml8nnlyqr3raIYoS+H0soUJyYmUqdOHaKioujRowfjx48nJycHkHLDSik+/PDDwvYbN25EKVUY\ncw+Qm5tLYGAgjz76aJnnnjBhAu3btycqKopevXqxatWqKl2LfaG1AQMGXLBt8Wqcd955J9u3b6/S\n+Q0V4/XXxWKMiIAvvnDdebWumtCDWPWOWPQbN0okS0SE5xVFO3hQ/O916hQdaK0s0dG2SqCuxgh9\nOZRVprhjx45s3LiRLVu2kJyczLffflu4LSwsrMjnuLg4IovlQ8+bN48uXbowY8YMJBy2dF555RU2\nbtzIyy+/zN13311ie2WTrlaWY1YUF/oPP/yQHj16VOpchsqxcqVYgunp8O67zjnmtm22RJ7sbBkk\nLP5TyMyUba4Q+k2bJDRxzBixmtPTK39OZ3PgALRtW347R6lVS1xAxqL3MMoqU2yPr68vffv2JSXF\nVom5Xbt2ZGdnc+TIEbTWzJ07l6uuuqrIfnFxcdx///2EhIQ4ZKkPHjyYPQXPwrGxsUyZMoWYmBhe\nf/11jh49ynXXXUefPn3o06cPKwpMhvT0dEaMGEHPnj258847i9xQ6tevX/jekbLLsbGxJCQkFPY9\nPDycsLAw/v73vxc55hNPPEFkZCT9+vXjiDX/nIvIzBQ/b3y8WKU1nX37pDri5ZeL6DiD11+XujSr\nV8Mnn0jdlm++KdrG8iFXVegPHpTQxAuxcaNUkr3qKhmMnTev8ud0NgcPyiCqMxkwANavF3eQK3Go\nqJm7mTJ3ChsPO7dOcVTLKP5z5YWrpZVWprh3795F2mRnZxMfH8/rr79eZP3111/PjBkziI6Oplev\nXtSuXbvIPvPnz+e9994jIyODuLi4cl0pP/30E+FW0C5w/vz5QuG9+eabmTp1KgMHDuTAgQNcccUV\n7Nixg+eee46BAwfy9NNP8/PPP/NRKTnZv/76a4XKLh86dIi///3vrFu3jiZNmjBixAhmzZrFmDFj\nOHPmDP369ePFF1/kkUce4YMPPuDJ0sodOpmZM+Hf/5YBLyty4+GH4V//qvZTVyt794oF2Ly5lMfN\nzS2asFMZLL/5Y4/JwCCULAFelRh6i06d5Gb79tsSY+5Tikl57JhcV2SkiD3Izc0T0FpursOHO/e4\nV14pZRL+/e+Sdf2rE2PRX4DSyhRb7N27l6ioKIKCgggODiYiIqLIvjfccAMzZswgLi6Om266qci2\nOXPmMHToUOrUqcN1113HrFmzyCtjBoOHH36YqKgo3n///SJCfeONNxa+nz9/Pvfddx9RUVGMGjWK\nkydPcvr0aZYuXcqtt8pkYH/6059o0qRJieNXtOzy2rVriY2NJTAwED8/P2655RaWLl0KQK1atQqn\nQ+zduzeJiYkXPJYz2LcPbr1VklKeekoyEe+6C155RULjPC1kz1FOnJBXx45iVebn2+rPVKVY1t69\nMsfr4sUy2Ni1qwi9/ROQMyz6MWNg2DCpAXP99aW32bRJllFR4rsOCJC/oyeQkQGnTzvXdQNSxnjc\nOEmkcuX0izXCoi/P8q4OyipT/MorrwA2H/2xY8e49NJL+fHHHxk1alTh/i1btsTf35958+bx+uuv\nF/GJx8XFsXz5ckJDQwFxsSxcuJDhpZgPr7zyCteX8p9Sr169wvf5+fmsXr2agIAAZ11+pfD390cV\njFr5+vpWa9G2pCQpuDVlitRDX7DAFv42ZoyI4ZNPimvivfdKj4H2ZCz/docOIsxgK6A1eLAUELv3\n3ood89w5cUc8/DB89ZUMNE6aBJMnS3XG9u2lXVXKH1g0aADz58uxP/xQZmKyq+0H2J4krOGrxo3l\n5uYJWHX1ne26AfnbLVggNfxXrar6U5ojGIu+DMoqU7zMmnangObNm/Pyyy/zTyurwo7nn3+eadOm\nFaleefLkSZYtW8aBAwdITEwkMTGRt956q9w5aS/EiBEjePPNNws/byz4Dxo8eDBfffUVIC6aE6X8\nFw0fPtyhsssWffv2ZcmSJRw7doy8vDzi4uIYMmRIpfteGVatkrK4gYGSWv7000VjnH18JErliy+k\n3O5dd7m0e07BcmFYFj2IyK9eLdb3fffBG29U7JiJibJvz54yIPjLLxIJAkXdN6mpYl03alS1a1BK\njp+fL3HyxdmzR9xSzZvL5yZNPEforTGR6hD65s3FpTVkiOumIjRCXwZllSkuTZDHjBlDVlZWiZvA\ngAEDGDNmTJF1P/zwA8OGDSvisx89ejQ//fQT58obuSqDN954g4SEBCIiIujRowfvFoRoPPPMMyxd\nupSePXvy/fffE1LKr/bKK690qOyyRXBwMC+//DJDhw4lMjKS3r17M3r06Er1u7JYohQbK3W/77+/\nZBtfX7jlFrH4t2yxuT1qCvYWveU+OHBAsjBbtJDkm4ceqtignnXMjh3lmEFBMrG3j09JoQ8Odk5I\nofVUUNr3n55uE3nwLKG3LHpnu24srr9e5py1k4HqxZESl9X9MmWKLy6q+rd98EGtAwK0zssrv+2m\nTVJC9uOPtT57VuuvvtI6O7tKpy+V5culNG3jxlrffXfVj3fHHVoHBdk+N2um9T33aB0To/Xll2s9\nZ45c15Iljh/zjTdkn9TUouu7d9d61Cjb58GDtR4woGr9t1izRs75008ltw0bVvQ8V1+tda9ezjlv\nVXn0Ua39/R37jbkTTJlig7eyZ49YpaVFchQnPFysyrlzpS7JzTfLIK2z+fBDCZtr21ZmWKrkw1kh\n+/aJNW8REiKul+3bxfViVVKsSEy2NRAbFFR0fVSUzaKfPh2WLnXemMaFLPrjx6FZM9tnT7LoDxyQ\njFZHfmM1AS+5DMPFxJ49tuncykMpCWn77Tfbo/LLL0v9EWeydatUKfznPyVaoyAQqdLs3WurGQMi\n9CtXiqumZ08RyG7dKpZlaR2zuEsmKkqEbehQGai94QYJAXQGQUFyvrJcN/ZBXp4k9NURQ+9OyhV6\npVRXpdRGu9dJpdQUpdQ3dusSlVIbC9qHKqXO2m2rdE6f9oasF0MRqvo3zc8XwXJU6EGE3sr2nD9f\nrNp77nFe6GV+vmSchoWJWAYEwJw5lT+eFR1TXOgzM+V9WJgsBwwQ8ddabmTliWTxm4fFsGGS5p+R\nIQPbX30lkUzOwN9fBs1LK+SVnl7Sos/M9IyQ2AMHLjKh11rv0lpHaa2jgN5AFvCD1vpGu/XfAd/b\n7bbX2qa1nlyZjgUEBJCenm7E3ovQWpOenl6lMNBDh0SwKyL0l18ulvykSTBwoMTYL14M/3FS1O7+\n/XD2rAhw3bpw2WUi9JX96SYlyb7Fhd7CqkQxYIC4P/79b7mZvfSSrE9NlZIJr70Gt98usfKffCLu\noNKEPiZGKkhu2ADPPVcyDLKqtGpV0qLPzpanE3uhb9xYrtvdE5bk5Ulp4eoaiHUHFY3gvAwR8SRr\nhZLA6RuAYc7sWJs2bUhOTubo0aPOPKzBzQQEBNCmIjNOF8PK7KyI0DdtKpE37drJ5zvuECF+7DGx\nZq2szMqydassLUvbqkO+a5e4VyqKVTuuNKFv08YW9mhVQ3z4YVn+8INkA0+ZItPbgVx7s2ZyzcVv\nHvY4I8KmLIKDS1r0BVG8JVw3IE8mjRtXX3/K448/ROztx0hqOhUV+nFA8fjCQcARrfVuu3XtC1w5\nmcCTWutlVBB/f3/aWxkcBkMBlRF6kGndLJSSwdOICEnoWbWqakJnZThalvaf/iTL336rnND//LMk\nHNlX27CE3rqZAHTpIkKZkSFC/sEHMjYwa5Zc10svyU3h1CkZP9ixo2yhr05atSpZZsES+uKuGxCh\nd+e//m+/yfLyy93XB2fj8GCsUqoWMAqYUWzTTRQV/1QgpMCl8wDwlVKqYSnHm6SUSlBKJRir3eAo\ne/aI37eqj9XNm4s/Oj4ellXYDCnK1q0iTA0ayOc2bcSFU5lCZHl5MtHF1VcXjbG2hL5nT9s6Hx94\n/HFxQT3/vNysJk6Uae8mTxbh9PERsZ8zR8YlyimpVC0EB8ORI0WTg6wqlaVZ9O4ug/Drr3KDLkhc\n9woqEnVzFbBea11YklAp5QdcCxTWv9Nan9Napxe8XwfsBboUP5jW+n2tdYzWOibwQlO0GC5arFR8\nEKGaM0cGFDt0cI4fefx4EXy7aQIqxdatRS1tpUTc7PvvKPHxkkVaPActOBj+/neYMKHo+gcfhL/+\nVQqQ9esnfvjevW1lBSw6dJBsTLvKGS6jVauS2bGlWfSWu8adkTdZWbBkiVTT9CYqIvTFLXeAy4Gd\nWutka4VSKlAp5VvwvgPQGfCQmnSGmsJvv4m4vfaaDBJeey2MGiVlbJ3lfqhbV+rF/PSTuHLKiknP\nzZX+lBYNcv68+OLthR5EeCszZdzs2VL7pLjQKCVhocXPY4+VhD1xYsXPW52UFktvWfRluW7cxaJF\nEvV0UQq9UqoeMJyikTVQus9+MLC5wEc/E5istT5e1Y4aLi6sCboeekis28BAiZjJzKy4f/5C3Huv\nuFzuuksGNz/5pGSb116TqJbSZnnatUtuBKUJ/YUs+t27pQ7M7t1F18+eLSGalRmMvOMO+b7Gj6/4\nvtWJVYfI/sZ3IddNeUJ/6pStxLKz+fVXMQAGD66e47sLh4Rea31Ga91Ma51ZbP0ErfW7xdZ9p7Xu\nWRBa2Utr/ZMzO2zwfjIyxMq+4w7JbD14ED79VFw348dLQo+zCAyUcMZt28R//fDDRWc5OnJESsqC\nDG4WL0L10UfiB+/fv+j68lw3CxbIAOXTT9vW7d8vN44//7ly19KsmYSO2s0p4xGUZtEfPy5jEAXV\nsQHpt69v+T76xx8XN5Wj4aubNsmN2pGwzcWLpdiYy2rQuAiTGWvwOGbMkMfnyZMlwWnZMpkAomFD\n+OwzW1ihs2jSRCJm3nlHRGbyZFi+HBISYOpUiZF/4QUR4Zkzbfvt3g1vvSUzNhWPEmnZUizT7OzS\nz7ljhyy//ho2b5b3CxbI0puiPcA2gUlxi75p06LRTko5Vqp4yRLx9xdMf3xBtJZB6N9+ExdgeW33\n7ZOpDb0NI/QGj+PzzyXqoXdvGSwdONA1542IgEcfFTEfNEhmd4qLE7F/7DERgH/8Q/zyIG1r15Yk\no+JY4nbkiMx8ZSUzWezYISGfDRvarPoFC8T6rUxIpifj7y8VN4tb9Pb+eYvyyiCcPGnLW9i7VwyC\nyy4TK7+0Sp5ffy3hs2CrSFkWR4/KTd3Kt/AmasTEI4aLh/PnxZp+4onqTeIpixdeEJfRzp3Sl1at\nJHNUKaljM2aMCHO7dvD99yL8pU25Z7krUlPh/ffF9//Xv9pCMHfskDLLnTrBs8+Ke2HhQhgxwj3X\nXd20bVt0msDidW4syhP6tWttLhsr1HbhQnnNnCnbrYSynByJVAoPl1yH8sJdkwrSQL0prNLCWPQG\nj8L6J7efSMTVtG8vURejR4tVbwnv6NFSRmHaNJn4Y+RIsfRLwxL/w4dtBdSs5alTkmLfvbuIf716\n4v5JS5NMXW+kT5+ic/oWr3Nj0bjxhX30lnWulAi9Zd0//7y40pYssbVdv16s+CeflCfD8oTemvnS\nCL3BUM1YQl/K9LYewWuvScmE6Ghx65QVz2/vl7b88dbSEvzu3cWqvftuGQ8AcUN4IwMGiNvFKu9Q\nWdfN6tXyvbVtK66brVvFfTZlivwtrO8RbOGyAwdKwpmjFr03um6M0Bs8Csuac2etkwtRt64kNcXH\nXzi6pUULsTo3bbJdkyXwluBbg35Tp4oLolMn76qYaI+VkWtV26yM60ZrEfr+/eW72rNHoqW6dxeX\nWM+e4rqxWLlSrPNWrRwT+sRE+d1VdQpFT8QIvcGj8HSLHqBWrfIzc/38JHRz0SLbOnvL3s/PlvjV\npg28/rq4H7yVDh3k5mfV1D9//sIWfWmhk3v2yA2iXz/57izXjZXDEBMjFr3MaSXnsm4wbduWPxib\nlOSd1jyYwViDh1EThN5RWra0hU727VtU6Dt3Llrz/Z57XN8/V6KUrX5+aclSFo0bSwJaVlbJcg3W\nJCv9+8vvxAqvtIS+Tx/4+GMRbGuyEysUNyREXEeZmWVb7ImJ7in65gqMRW/wKDzddVMRrMib+vUl\nNn7PHrFkd+ywVbq8mBgwQAZMLRdWWRY9lO6+WbJE9unRo2h2tL1FD2LVW/55y6K3XGKluW+sJwBv\ntuiN0Bs8Cm+z6EHi4rt3l6zaNWtkENEbk3LKwxJdy0VVmtBbVn5pyVCLF0tpAh+f0oU+PFyektau\nFaGvX99TkpEuAAAgAElEQVS2rSyhX7VKzrl6tURDeWPEDRihN3gYJ07IgGetWu7uSdWxhL57d5uw\nT5okIYbjxrmvX+4iJgZ69YJ168QtU1rNImvegOJz+iYliWslNlY+W5OC1K9vE/HatSXp7auv4H//\nE1++X4Fzuiyhj4+Xp8gHHpDPxqI3GFxARoZ3uG3A5rrp3t2W7bpjh9Trsa8rf7FQu7aI/Nmz4i8v\nLVeiWzcZ6Lbi4y2s+HhL6OvXlxtpWFjRBLPBgyVH4dJL4c03beuDgkT0iw/IWrHzq1fL0lstejMY\na/AoTpzwDrcNFLXo69UTq/LwYcmEvdjxKcPErF1b5ri1Zu2yWLJEXCz2VUIffNB2M7V44QWJqS8e\npurrK9FNxS36pKSiSVreatEboTd4FN4k9IMHSzatVfLWipf3VqvRWYSFFY2Hh6L+eYuHHiq5b926\nZecilBZLn5go1v/ZszKIW1okkDdgXDcGj8LbXDezZtnEY8oUqX9vuDDh4VKy+fRp+Xz8uNTJqeo0\niCEhtuxXi8REseI//lj+Vt5YZwiM0Bs8DG+y6A2Vw3LPbNsmSyvuvrTicRWhfXvx31vVRzMzxbAI\nDRWxHzq0asf3ZIzQGzwKI/SG8HBZWgOyzgq57dJFIp6sKpreXK2yOEboDR5Dfr5EY3iL68ZQOdq3\nF1+7NSDrLKG3Qjf/+EOWVsSNtw7A2mOE3uAxZGZKhqKx6C9ufHwk/NRVQm8seoPBhXhTVqyhaoSF\n2Xz0zvpdNG0q2bjWhOxJSVCnjhSf83aM0Bs8Bm+qc2OoGm3ayEQseXnONQC6dClq0bdr572RNvaU\nK/RKqa5KqY12r5NKqSlKqWeVUil266+22+cxpdQepdQupdQV1XsJBm/BWPQGixYtbHXrT5yAgAB5\nVZXiQn8xuG3AAaHXWu/SWkdpraOA3kAW8EPB5tesbVrrXwCUUj2AcUBP4ErgbaVUOdW7DQYj9AYb\nljvl6FHnRmJ17izli0+fFteNEfrSuQzYq7VOukCb0cDXWutzWuv9wB6gb2U7aLh4MK4bg0V1CX2X\nLrJcsUKeFi6GiBuouNCPA+LsPv9VKbVZKfWxUsr6U7QG7EsHJResK4JSapJSKkEplXD06NEKdsPg\njRiL3mBR3UJ/zz1S/2b0aOcc19NxWOiVUrWAUcCMglXvAB2AKCAV+HdFTqy1fl9rHaO1jgm8GIa9\nDeWSkSH/fMVnFjJcfLRoIcu0NOcKvVUaef9+KUdxscwLUBGL/ipgvdb6CIDW+ojWOk9rnQ98gM09\nkwK0tduvTcE6g+GCWP/QF0MUhOHCWJOSONuir1cPWreWUMtnnnHOMWsCFaleeRN2bhulVLDWOrXg\n4zWAVUH6R+ArpdSrQCugM7DGCX01eDmm/IHBws9PxNjZQg/w2mtyPG+tVFkaDgm9UqoeMBy42271\nv5RSUYAGEq1tWuttSqlvge1ALnCv1jrPmZ02eCfeVLnSUHUCAyE1VcpiOFPox4513rFqCg4Jvdb6\nDNCs2LrbLtD+ReDFqnXNcDGRlwebNsHAge7uicFTCAy0ZbGaJ72qYTJjDR7BwoVivd14o7t7YvAU\nWrSAPXvkvRH6qmGE3uARfPEFNGoEf/qTu3ti8BQCAyE7W94boa8aRugNLmXaNHj55aLrzpyB778X\n36kz0twN3oF91LUR+qph5ow1uIxTp+C552SGnxtugA4dZP3s2ZKSfuut7u2fwbOwF/qLKUKmOjAW\nvaFa2bpVKhGuXStW+9mzUqzqRbuh+rffFtEfNMh9/TR4HlbSFBiLvqoYi95QrXz0EaSkwH33Qf36\nIugjR8Jbb8Hjj0u9kRUr4PXXZcIJg8HCuG6chxF6Q7WRlwdffy2TOq8pSJl7+mmYPBk++ABGjYK2\nbaFhQ7j9dvf21eB5WELvrBLFFzPGhjJUG4sWweHD8MYb0K+frLv1VggOhjlz4OBB+O03mDQJGjRw\nb18Nnocl9MaarzrGojdUG199Jdb6yJHQuzesXGmbt3PYMFiyBF55BR54wL39NHgmzZvL0gh91TFC\nb6gWTp+G776Da66ReTk7dLBF2VhER8vNwGAoDX9/EXkj9FXHuG5cSFISvPMO5Oe7uyfVzwcfSI2S\nyZPd3RNDTSYoyFbJ0lB5jEXvQiZPhrlzpabLO+94bzne8+fh3/+G2Fibb95gqAzvvScZ04aqYYTe\nRSQkiMhHRMiPNyhIkoe8kS+/lJDKjz5yd08MNZ3Bg93dA+/AuG5cxIsviq9x2TIp3DV9urg2vJHP\nP4eePWHECHf3xGAwgBF6l7B7N8yaBfffL1EoDz4IWVneOxCZlARRUd7rmjIYahpG6F3A6tWytCY8\niIkRIXzvPSkH4E1oLW6b1iWmgzcYDO7CCL0L2LIFatWyxZArBXfdBRs3wrp17u2bszl2TAZjjdAb\nDJ6DEXoXsGWLzDbv729bd8stIv7ffuu+flUHKQXTwLdp495+GAwGG0boXcDWrRAWVnRdo0aybuPG\nsvfLzZVZl2oSycmyNBa9weA5GKGvZk6cEPELDy+5LSpKhL40P/3110v9l1atID6++vvpLCyL3gi9\nweA5lCv0SqmuSqmNdq+TSqkpSqlXlFI7lVKblVI/KKUaF7QPVUqdtWv/bvVfhueybZssSxP6yEg4\nelQKf9mTkSHlA6xkI6vyY00gOVnKDbds6e6eGAwGi3KFXmu9S2sdpbWOAnoDWcAPwDwgTGsdAfwB\nPGa3215rH631RZ0Ev2WLLIu7bkCEHiRT1p79+2V5333QuDHs2FF9/XM2KSki8n4mFc9g8Bgq6rq5\nDBHxJK3171rr3IL1qwEz/GbHsWNw5IgIfcOGUne9OJbQF/fTW0Lfvj306AHbt1dvX52JCa00GDyP\nigr9OCCulPUTgV/tPrcvcNssUUpdlBPE3XADdOwIP/4o1nxpyUONG0O7dmVb9KGhEq1Tk4Q+OdlE\n3BgMnobDQq+UqgWMAmYUW/8EkAt8WbAqFQgpcPU8AHyllGpYyvEmKaUSlFIJR48erWz/PZLjx6XW\nulJi4Zbmn7eIjCwp9ImJ8hTQpIlY9EePyhNCTcBY9AaD51ERi/4qYL3W+oi1Qik1ARgJ3KK1xI5o\nrc9prdML3q8D9gJdih9Ma/2+1jpGax0TaD85ZAXYvBn69rVlnlaVSZPg11/Lb1ce8+ZJKeKff5a5\nUR96qOy2kZGwa5dMmm2xf7+4bZQSix5qhp/+9GnIzDRCbzB4GhUR+puwc9sopa4EHgFGaa2z7NYH\nKqV8C953ADoD+5zT3aL4+8PatTZXR1XIzJQa6p99VvVj/fILNG0Kl14K//d/0KlT2W2jouSmYA3a\ngk3oQSx6qBlCb5KlDAbPxCGhV0rVA4YD39ut/i/QAJhXLIxyMLBZKbURmAlM1lofd2KfCwkOluWh\nQ1U/1u7dsrxQApMj5OdLOeIrrgBf3/LbX3KJLJcvl6XW4rqxhL5tW6hb1/P99IcPm2Qpg8FTcSgI\nTmt9BmhWbF2pdqrW+jvgu6p3rXwaNZJp6pyRPWoJ/R9/wJkzUK9e5Y6zfj2kpcHVVzvWvnVr6NJF\nJtJ+4AHxx2dl2YTex0fcN55m0f/zn5CXB08+CQsWwOWXy3WAEXqDwdOo0ZmxSolV70yh11p8/5Vl\n0SJZXnGF4/tYE2Xn5haNuLHo0UMSrzyl0mVentTT/8c/ZJD4/fflhrtnj2w3Qm8weBY1Oq1l34l9\nJI+NZf7JwXywbggju4wkuIH4c/Yc38PcPXNZcXAFSRlJhDQKoVdwL67rfh0dm3YEICsni+UHlvPz\nHz/z/alEfG/2JS8lkh/X/plL+kXho+Q++Ef6H/y06yd2HtvJsbPH6B3cm+EdhtO7VW/8fOQrPHXu\nFIsSF/FN+ir8bzzIq5va0iu4F1d1vor6teoDkJefx4bDG1icuJjkk8n4+fgRGRRJ70FX8e67zVm3\nrkDoa2ey238eLy37g/SsdHyje5HywzDGjAlm2jQpjRD3dT7fLd/MmPviOa2SadtIztc7uDfKLpYz\n7UwaS5OWknIyRc7XMpJ+bfoV9tvq1/rU9ew5vofjZ48THRxNn1Z98Pe1q8IGpGelk3AogRVbDnG8\nUQicC+fVV1swa5ZMk3jjjbB9Zy7bMzaQmpyKn48fEUERtGlY0ml/5PQR9p3Yx4nsE0S3jC78u9mT\nr/PZnb6b1NOptG3YlnaN2xXpt/01pp1Jw1f50qFJB2r71S7RJi8/j7QzaWRkZ9C5WedSjwNw5vwZ\njmUdo1WDViWu3/5Y2bnZ+Pn4lXouC6015/LOEeAXUGYbq50yxfsN1YjSHmAmxsTE6ISEhArvt/PY\nToa/9DSptZaRV0fqCLRq0Irc/FzSzqQB0LpBazo368yBzAPsOyFjws3rNiewbiC7j+8mNz+XAL8A\nfI53Ad8csuruBKVpVLsRnZp2IuVUCodPy7GD6gXRKKARu9N3o5E2XZt3JTc/ly1HtpCTn4PSfvhm\ntYIGh8jNz6W2b216BPagaZ2mJBxKIPNcJgANajUgJz+H7NxsFAqd1oPuQZ04SQopuZvANweAWr61\nOJ93Xi74WHdI6w4+udBmNdRPK/GdtG7Qmt6tetMkoAlrUtaw41hJn0/jgMb0b9OfDk06kHIqhRUH\nVnA0q2iIaz3/egwMGUjXZnJ9q5JXseHwhqIH0goO9ofD0dxxS2MO5q9lxYEVnMk5U6RZWIswBrQZ\nQGjjUA6dOsSKgytKHKtLsy4MaTeEzk07k5ufy+qU1SxOXMzJc7ZpuBoHNOaqTlcRGRRJw9oNSTiU\nwLIDy9h9fHeRfseGxtKvTT/aNWrHoVOHWJm8kgX7FhT2q36t+gxoO4DBIYPp2LQjOXk5xKfEszhx\nMTuO7SBf56NQhLUI4+rOVxMRFEGDWg1Yl7qOFQdXsDp5NafPny7s9+XtL+eSNpcQ0iiEQ6cOserg\nKubvn8/+E/s5l3eObs27MShkEINCBtG+SXty8nJYk7KGpQeWsj51PUfPHKVNwzZEtozkyo5X0rNF\nTxrUasD61PWsPLiSVcmrOJp1FH8ffyKCIhjWfhh9W/elTcM2pJxMIT4lnoX7F5KYkcjJcyeJahnF\npW0v5dKQSwltHMr5vPOsTVnL8gPL2Xhko+18QZFc0ekKegT2oJ5/PTYc3sDq5NWsTl7NsaxjhYbI\n0PZDiWkVQ6sGrTh06hDxyfJdHTh5gFPnThEZFMmAtgMY0HYAIY1COJd3joRDCaw8uJJNRzaRnpVO\n64atiWgRwfCOw+narCu+Pr7sPLaT+OR41qSs4Xj2cfx9/AlvEU5saCyRLSMJ8AvgXO451h5ay9Kk\npRzIPMCZnDNEtIigf9v+9A7uTR3/OmitScxIZFXyKrYc2cLxs8flfEERxIbG0jigMQAnz51k3aF1\nrD20luNnC84XFM7gdoNpWd9Ws+NA5gGWH1jOgcwDZOVkEREUQb82/YoYLDl5OWw/up2EQwkczTpK\n6watCQ8KJyIootBA1Fqz98Re1h1ax4nsE/j7+NOteTeig6Op61+3xP9lZVBKrdNax5TbriYLPcis\nTZ98qlm5exs/7fqJvSf2AhARFMHILiPp0KRDYdukjCRm7ZzFjmM7OHz6MD0DezKo3SCGtBtC66A6\n3HgjbNmXRmrd37h84nISMxNp27AtkUGRjO42mpBGIQAcyzrGwv0Lmb9vPgcyDxSe7+rOV/Pk7Zfg\np+swf2Euqw6uYvau2ew4toMjp4/QK7gXQ0OHEhsaS3CDYPJ1PhtSN/Drnl+ZFreS/AZJNFJtyNgZ\nye9vjqJXcC9q+9Zm4+GNLNy/kB+3LmB/ejL5+YqIoAgWvncl44deyrvTQkg5mcKSpCX89MdP7Dq2\ni6NZR4luGU1saCxD2g2hU9NOnM87z4qDK/htz2+sTlnNgcwDhf/wI7uMJLplNA1qNyA+OZ5FiYtY\nlLiIlJMpKCXnG9FhBP3b9ufxe0M4eu4g0WOW8d3mn/Ft8Qd5tTIIbyH/NIPbDaZDkw6cyz3HquRV\nzNs3j/jkeDLPZdKwdkMigiL4U+c/ERkUSf1a9VmTsobFSYtZmrS0UNjbN27P5R0up3+b/rRt1JaD\nmQdZdmAZv+75tfDG2ySgCQNDBjIoZBChjUM5l3eOVQdXsWD/Anal7yr8u4c2DuWqTlcR1iKMev71\nCoVjS5ot1Kmefz0GtRtE31Z9ad2wNQczD7Li4AqWHVhGbr4kgCvke7i07aW0a9yOc7nnWJ2ymiWJ\nS4rc3Or612Vo6FB6BPagrn9d1h6SG6B1k7foEdiDPq36EFw/mORTyaw4sIL9GUVDyJrWaUr/Nv0J\naRRCdm428SnxbD9acmQ+rEUY3Zt3p45/HRIOJZTapmHthvQK7kVQvSCSTyazPnU9Z3PPFmlj3eBa\nN2xNdm426w6t49T5UyWO1TigMZ2bdibAL4ANhzcU3viKE9o4lBb1WpB8MplDp2xREwF+AWTnZhf2\nK7h+MNm52SRlJgHgq3xpUqcJx7JsCSSBdQOp7Veb5JMy6u/n40fzus05n3ee42cl3sPfx5/GAY0L\nDReFomX9ltT1r8u+E/vQiN7V8q1FTl5O4eeW9VvSsn5LDp06VGgkWvtbbVo1aEWrBq3IycthV/qu\nwv7b07ROUzo17UQdvzpsOrKJjOyMEm18lS/hQeG0adiGw6cPM6TdEKaPmF7q91ceF43QT5sGjz4q\nMdyVHUBNT4fmzeHf/5YQwbffhlOnbPVa8vNh6FCZLOTWWy98rK5dIToavv66Yn2YMgVef13eDxgA\nK1aUv0/v3tLv336r2LmqQlaWJHL99a8yD+6ll8Lf/gY33ZJTpqsDxA2TlZNV6MYqjbz8PM7mnkWh\nqFer7D/mqXOnOH72OG0btS20noqTkZ3B4dOHad2gNQ1qNyi1zfGzx0k7k4ZC0b5Je2r51irR5sz5\nMxw8eZDjZ48T1iKMhrVL5P6Rl5/HzmM7ST2dSusGrUt1H+XrfLambS08X1iLMILqBxVpo7Vm34l9\nhS6tyKBIujTrUsKtk3YmjfWp6wuvr2eLnrRq0KrEta06KE8CCkV4UDiRQZH4+thCwbJzs1l1cBX7\nM/aTkZ1BZFAkfVr3KXKNOXk5bDqyifWp60k7k0brBq0JaxFGr+BehcfKy89ja9pWefI4cxQf5UNY\nizAGtRtE0zpNC4+VlJHEosRFJGUkcfLcScKDwrmk9SV0bd618O945PQRVhxcwcbDG0k7k0arBq0I\naxFGbGhs4bHSzqQVPnmkZ6UXnm9gyEC6B3anlm8tsnOzxYBIXExSRhKnzp8iIiiCPq36ENMqhmZ1\nm5GTl8P61PWsOLiCzUc2cyzrGMH1gwvP16lpJ/x8/Nh0ZBPxyfHEp8Rz/OxxfJQPXZt1JaZVTOGT\nTvLJZNakrGFJ0hIOnjzIqXOnCG8RXtimZf2WZOdmsyVtC2tS1rAmZQ1pZ9IIbhDMiA4jmNp/aqm/\n0fJwVOjRWrv91bt3b11ZPvtMa9B69+5KH0KvWiXH+PFHrT//XN5v3WrbvnGjrLvllvKP1bCh1vff\nX/E+HDqk9auvav3BB1rv2uXYPuPHa92qVcXPVRXmzpXv4tdfXXteg8FQEiBBO6CxNTrqBqReO1Qt\nlt6KuOncGQYOlESsxx6zRbnMn1+0XVlkZcHJk5Ur0RscDFOnwp132sIUyyM8XK77eLVkKZTOsmWS\nHzDooqxgZDDUTGq80FtJU1UJsdy9W+LVO3SQ+PXp0+Gnn+C112T7ggWy/OOPC4c4HikoDuGqWuxW\n6eOtW11zPpB4/k6dKu8mMxgMrscIPVJ+oF07mcMVxP987bXw979LwbGlSyVOPCND/PllYU0g4iqh\nt4ql2ZdPqG527oRu3Vx3PoPBUHVqvNA3aQK1a1fedfPFFzBrFowZY1unFLz7rsSrjxolmbI33STb\nLuS+cbXQt2olpY5dZdHn5sr1W4XWDAZDzaDGC31VsmPXr4c77oDYWHj55aLbAgMlquTAATnHpEmy\n/kJCb/XBVUKvlFj1rrLo9+2DnBxj0RsMNY0aL/Qglm1lLHorBHLmTJvbxp5Jk6BPHwkh7NVLBiHL\ns+h9fOQm4SrCwsSid0WU7M6dsjQWveGCaC31vq+/XqIbRoyQ0rAnT5a/r6Fa8Aqhr6xFv2uXRNo0\na1b6dl9fqV3z888SiRMaWlLotYaICHjnHRH6wEDHqlY6i44dpcTyqZI5LU7HKqzWtWv1n8tQQ9m6\nVR6Rr74aVq0SCyopSaymqCjPq853kXBRC/3OneWLVr16MtsTyE3hjz+Kbj90SFwnX34pQu8qt41F\n8+aydMUkXTt3ynfdqFH1n8tQw9BaqtxFR0sFvrfeksJNCxfKD2fRIok/7t/feTMF1TQOHYK4OMnw\nfOABeOopl53aK4S+bVuJiNm1q/y2Fjk54nOuiHXaubNY9PZuEstAWb1abgKuFnrLTeSKqQZ37jRu\nG0MpnD8Pf/kLPP20TJa8c6fMuGP5Q5USKz8+Xh6fr7vOFrlwMRAfD9dcIzPy3HwzvPqquLK++cZl\nXfAKoR8/XqJv7rxTyhU4wr59EkVSkYHFzp2l1MK8ebaJQiy/dV6e3Gi81aLX2oRWGkohPx9uuQX+\n9z944QUJY7N+lMVp1w5++AFOnIBx4+Qf0Js5exYefFCeYpYuFUs+IUGebE6dKukeqEa8QuhbtpQ6\nNcuXS1ikI1jWf0UtepBa80OGyAQjO3ZIGGbdura+uBLrf6q6LfojR+SpyQi9oQiPPy7RDNOnwxNP\niPV+ISIi5J90yRJx73grJ05IgaxXX5Ua3klJ8NJLUqDKz/XV4b1C6AEmTJBp+T74wLH2liVeEaEf\nOlRmVHrqKTFkVq6U4/ToIU+m4L2uG+v7MkJvKOS//5WqgvfcIz5nR7ntNrGWnnrKOfOAehrHjokg\nbNgA330nVRLrl13MzxV4jdArBZGRtgmqy2PXLggKkoQjR6ldW8abnnhC3i9bJhZ9t24wfLi0cbXQ\n168vrtDqdt1Y0UaO1uExeDmffSYp5KNHwxtvlG/J26MUvPkmnDsnrg1v4vx5GYP44w+YM0dS7D0A\nrxF6kHj6o0fluy6PXbsqHyZYuzb07Sthl6mpMkB57bWSvNSnT+WOWVmUEqu+ui363bvlutu2rd7z\nuIRTpyQMMD5e/iHz8tzdo5pDXp4Mut5+u1g333xTOVdE587i9vn6a/j8c+f3011MmSL++I8+sll/\nHoDXCT04NqDvSGjlhRg0yObn79YNQkJkrtmOHSt/zMrSvLlrLPqOHSUhrEZy8CA884w8kjRsKHfl\nfv3kR9CggUSLLFzoORPzeiJHjkjy0z/+IVE2s2bJ3b+yPPEEDB4srp9t25zXT3fx3nuSUPPIIxJd\n40GU+2+rlOqqlNpo9zqplJqilGqqlJqnlNpdsGxit89jSqk9SqldSqkKTJNdNSyhLy+mPj1dXlXx\nNw8caHvv7pDD8iz6t96S319V2L3bNhhdo9BaLr5zZxGo0FBZfvONPJJ9+qlYpwsWwGWXifi7ciaX\nmsL8+RIjv3IlfPwxfPKJLQKhsvj5SVx5/fpw1VUujUJxOsuWwX33wZVXyqCrp+FI0XrrBfgCh4F2\nwL+ARwvWPwpMK3jfA9gE1AbaA3sB3wsdtyoTj9izbp1MivH99xdut2iRtPvll8qfKyNDa6W09vfX\nOien8sdxBuPGad2pU+nbsrO1btRI6z59Kn/8vDyta9fW+qGHKn8Mt3DunNY33SR/7Cuv1HrfvrLb\nnj2r9fvvax0aKu1vuEHrI0dc11dPJD9f682btZ4wQb6Trl213rTJ+efZsEHrwECtW7TQOiHB+cev\nbo4e1bplS627dNH6xAmXnhoHJx6pqHPtMmCv1jpJKTUaiC1Y/xmwGPg7MBr4Wmt9DtivlNoD9AVW\nVeZGVBEcnYRk0SJxQfTvX/lzNWokkWI5OW6JlipC8+ZlW/S//y4lEqpSZuTgQRk3q1EW/ZkzMnDy\n++9Sne7RRy/sdwoIkLki//IXeOUVeP55CQGMi5Nwq5pMbq7MTnPihAzqnD8vbpi0NPFz7t4tiSVZ\nWfKHzs6W18mTst3PT2bieeopqdftbKKixCIeMUIelT/+2FYu1tPRWlxP6ekwd27FojtcSEUlahwQ\nV/A+SGttOUkOA9YEmK0B+xzn5IJ1RVBKTQImAYSEhFSwG6Vj1Zkpz3WzYAHExFT9b/L2244N/FY3\ngYES456TIzV57Pn2W1k6IvSnTsFzz0kIqf13Yz8DV40gN1cKas2fL4NiEyc6vm+tWuI7Hj0axo6F\nyy8X0X/sMc8foNi1SyI99u2DxESJ3U5NLX8KskaN5I/boIHU/AgIEN97nTpiDY0eLSFq1UnXrrB2\nrUSs3HyzDHi98IJrC0dVhrg4ySP45z8l7M9DcVjolVK1gFHAY8W3aa21UqpCo1ha6/eB90EmB6/I\nvmXh6yu/R3uL/uhRSaS65hr5fPq0BFs89FDVzzdgQNWP4QyspKn09KLhndnZMHu2vM/MLP84c+ZI\n4lnr1jKtoUWNE/oHHhDr6r33Kiby9oSFifBMmiR3vhUrxJ/fooVTu1pl8vPhxx8lnt2qIdOkiYxF\ndOkimX2BgfIjaVIwjObnJ9cRFCSvpk0rFh5ZXbRoIVbYX/8qdcN37oQZM9z/yFwWyclw770iBA8/\n7O7eXBhH/DviCmI08Lvd511AcMH7YGBXwfvHgMfs2v0G9L/QsZ3lo9da65gYra+4wvZ5yhRxLyYm\nyudff5XP8+Y57ZRu59tv5Zq2bCl9/cCBsixvLMH6rix//uTJWk+cqPXUqVrXqSO+eo/n44/lIh54\nwDnHy8/X+p13ZJAiMFDrGTNknScwf77WUVFyvR07aj19utbJye7ulXP4z3/kuv72N3f3pHTy87Ue\nPlzrunW13r3bbd3AQR99RYT+a+B2u8+vUHQw9l8F73tSdDB2Hy4ajNVa61GjtI6IsH3u0kWu8pNP\n5GR1CTwAABfUSURBVPNDD2ldq5bWZ8447ZRuZ+FCucaFC23r1q3TunFjrTt31vqVV2T78eMXPs6A\nAdIOtP7sM9v75s21Dg+v3mtwClu2yB1p2DCtc3Ode+ytW7WOjpYvpG9frefOdZ/g79ih9ciR0pd2\n7bT+/HP3RwRUB1OnyjV+/LG7e1KS//5X+vbOO27thlOFHqgHpAON7NY1AxYAu4H5QFO7bU8g0Ta7\ngKvKO74zhf7uu0WYtNZ6716bWI0fL+t69dI6NtZpp/MItmyRa/z2W/m8e7fWTZqIBiQm2ozc/fvL\nPsb586KR118v0UR+floHBclNE7S+9lpXXEkVOH1a6+7dpdOpqdVzjvPntf7gA61DQuRLGTBArOry\nBD8/3zk3nrQ0rf/v/7T29dW6YUOtp02TaCFvJSdH66FD5VoPHXJ3b2zs2iX/LFde6fanO6db9NX5\ncqbQP/ecXNW5c7abbnS01m3bar1tm3x++WWnnc4jSE2V63rrLXGvDBwoIZV798r2mTNl+4Ui4zZs\nkDZffaX14MHy/s03tV69WoT/iSdccy2V5i9/kY7On1/95zp3Tiy5Nm10oW/s7bfF6k9O1nrtWvk8\nZoxYHT4+Is6hofLI+eqrIhaOkp+v9f/+J49ovr4i9mlp1Xd9nsTu3eI2GzfO3T0Rzp/X+pJLxJJK\nSXF3by5eof/gA7mqpCStr75aXJdvvSXrhg2TG/HRo047nUdw/rxc33PP2Vybn35q2/7777Ju2bKy\nj/H++9Jm926tf/pJ6z//WfRMa61XrSrf7eNWPvlEOv/0064979mzcjfs2NH26Gj/CgmRQY4nntD6\n8cclpr9TJ9v27t21vvNO+fI3bLB94RZ5eeKPu/JKaX/ppVpv3+7aa/QEnn1Wrv+339zdE60fflj6\n8s037u6J1voiFvqff5arWrRIRP2++8Slaf1vTZ7stFN5FI0ba33ZZXLNV19d9IkyPl6u/eefy97/\nzjvFSPGUcUaH2bpVLjo21vl+eUfJz5cf2Zdfav3uu+JD27u37C8zMVHrN96QqIEmTWw/TqUk8aZD\nB7lJ+PvL+sBAGWh11/W5m7Nnte7WTZ6gXJyQVITZs+Xvcc897utDMRwVeiVt3UtMTIxOSEhwyrE2\n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\n", 1164 | "text/plain": [ 1165 | "" 1166 | ] 1167 | }, 1168 | "metadata": {}, 1169 | "output_type": "display_data" 1170 | } 1171 | ], 1172 | "source": [ 1173 | "# arma_model.fit()\n", 1174 | "# arma_y = arma_model.predict(start = 1,end = 1700,exog = y_train)\n", 1175 | "arma_pred = denormalize(df, arma_y)\n", 1176 | "# import matplotlib.pyplot as plt2\n", 1177 | "\n", 1178 | "plt2.plot(newp,color='red', label='LSTM Prediction')\n", 1179 | "plt2.plot(newy_test,color='blue', label='Actual')\n", 1180 | "plt2.plot(arma_pred,color='green', label='ARMA Prediction')\n", 1181 | "plt2.legend(loc='best')\n", 1182 | "plt2.show()" 1183 | ] 1184 | }, 1185 | { 1186 | "cell_type": "code", 1187 | "execution_count": 32, 1188 | "metadata": {}, 1189 | "outputs": [ 1190 | { 1191 | "name": "stdout", 1192 | "output_type": "stream", 1193 | "text": [ 1194 | "174\n", 1195 | "175\n", 1196 | "[ 0.84197758 0.84138016 0.84061583 0.84061438 0.84136214 0.84192171\n", 1197 | " 0.84159054 0.8407665 0.84045397 0.84102362]\n", 1198 | "[ 0.87076446 0.88249493 0.8969774 0.89946115 0.90919449 0.92196531\n", 1199 | " 0.90068618 0.89857168 0.90942946]\n", 1200 | "[ 0.07582908 0.07959922 0.08142161 0.0839044 0.08224082 0.08387095\n", 1201 | " 0.08112903 0.08796707 0.08538401 0.08957211]\n", 1202 | "1565\n" 1203 | ] 1204 | }, 1205 | { 1206 | "data": { 1207 | "image/png": "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\nA/0/4ZOiHIxAwbUAAAAASUVORK5CYII=\n", 1208 | "text/plain": [ 1209 | "" 1210 | ] 1211 | }, 1212 | "metadata": {}, 1213 | "output_type": "display_data" 1214 | } 1215 | ], 1216 | "source": [ 1217 | "print (len(y_test))\n", 1218 | "print (len(arma_y))\n", 1219 | "print (arma_y[:10])\n", 1220 | "print (y_train[-10:-1])\n", 1221 | "print (y_train[:10])\n", 1222 | "print (len(y_train))\n", 1223 | "plt2.figure(2)\n", 1224 | "plt2.plot(arma_y,color='blue', label='ARMA Prediction')\n", 1225 | "plt2.plot(y_train[:157],color='red', label='Actual')\n", 1226 | "plt2.legend(loc='best')\n", 1227 | "plt2.show()\n", 1228 | " " 1229 | ] 1230 | }, 1231 | { 1232 | "cell_type": "code", 1233 | "execution_count": null, 1234 | "metadata": { 1235 | "collapsed": true 1236 | }, 1237 | "outputs": [], 1238 | "source": [] 1239 | } 1240 | ], 1241 | "metadata": { 1242 | "kernelspec": { 1243 | "display_name": "Python 3", 1244 | "language": "python", 1245 | "name": "python3" 1246 | }, 1247 | "language_info": { 1248 | "codemirror_mode": { 1249 | "name": "ipython", 1250 | "version": 3 1251 | }, 1252 | "file_extension": ".py", 1253 | "mimetype": "text/x-python", 1254 | "name": "python", 1255 | "nbconvert_exporter": "python", 1256 | "pygments_lexer": "ipython3", 1257 | "version": "3.6.2" 1258 | } 1259 | }, 1260 | "nbformat": 4, 1261 | "nbformat_minor": 2 1262 | } 1263 | -------------------------------------------------------------------------------- /baseline2_LSTM.py: -------------------------------------------------------------------------------- 1 | 2 | # coding: utf-8 3 | 4 | # In[1]: 5 | 6 | 7 | #reference: https://www.kaggle.com/benjibb/lstm-stock-prediction-20170507?scriptVersionId=1139231 8 | import numpy as np 9 | import matplotlib.pyplot as plt 10 | import pandas as pd 11 | from pandas import datetime 12 | import math, time 13 | import itertools 14 | from sklearn import preprocessing 15 | import datetime 16 | from operator import itemgetter 17 | from sklearn.metrics import mean_squared_error 18 | from math import sqrt 19 | from keras.models import Sequential 20 | from keras.layers.core import Dense, Dropout, Activation 21 | from keras.layers.recurrent import LSTM 22 | from keras.models import load_model 23 | import keras 24 | import h5py 25 | import requests 26 | import os 27 | 28 | 29 | # In[2]: 30 | 31 | 32 | def load_data(stock, seq_len): 33 | amount_of_features = len(stock.columns) # 5 34 | data = stock.as_matrix() 35 | sequence_length = seq_len + 1 # index starting from 0 36 | result = [] 37 | 38 | for index in range(len(data) - sequence_length): # maxmimum date = lastest date - sequence length 39 | result.append(data[index: index + sequence_length]) # index : index + 22days 40 | 41 | result = np.array(result) 42 | print(result.shape) 43 | row = round(0.9 * result.shape[0]) # 90% split 44 | train = result[:int(row), :] # 90% date, all features 45 | 46 | x_train = train[:, :-1] 47 | y_train = train[:, -1][:,-1] 48 | print(x_train.shape) 49 | print(y_train.shape) 50 | 51 | x_test = result[int(row):, :-1] 52 | y_test = result[int(row):, -1][:,-1] 53 | print(x_test.shape) 54 | print(y_test.shape) 55 | 56 | x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], amount_of_features)) 57 | x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], amount_of_features)) 58 | 59 | return [x_train, y_train, x_test, y_test] 60 | 61 | 62 | # In[3]: 63 | 64 | 65 | def hit_ratio(realvalue,predction): 66 | ratio = 0.0 67 | 68 | return ratio 69 | 70 | 71 | # In[4]: 72 | 73 | 74 | df = pd.read_csv("prices-split-adjusted.csv", index_col = 0) 75 | df["adj close"] = df.close # Moving close to the last column 76 | df.drop(['close'], 1, inplace=True) # Moving close to the last column 77 | df.head() 78 | # print set(df.symbol) 79 | 80 | 81 | # In[5]: 82 | 83 | 84 | from sklearn import preprocessing 85 | def normalize_data(df): 86 | min_max_scaler = preprocessing.MinMaxScaler() 87 | df['open'] = min_max_scaler.fit_transform(df.open.values.reshape(-1,1)) 88 | df['high'] = min_max_scaler.fit_transform(df.high.values.reshape(-1,1)) 89 | df['low'] = min_max_scaler.fit_transform(df.low.values.reshape(-1,1)) 90 | df['volume'] = min_max_scaler.fit_transform(df.volume.values.reshape(-1,1)) 91 | df['adj close'] = min_max_scaler.fit_transform(df['adj close'].values.reshape(-1,1)) 92 | return df 93 | df = normalize_data(df) 94 | df.head() 95 | 96 | 97 | # In[6]: 98 | 99 | 100 | symbols = list(set(df.symbol)) 101 | stock_interest = 'AAPL' 102 | len(symbols) 103 | df3 = df[df.symbol == stock_interest] 104 | df3.drop(['symbol'],1,inplace=True) 105 | print (df3.head()) 106 | df4 = df[df.symbol == 'GOOG'] 107 | df4.drop(['symbol'],1,inplace=True) 108 | print (df4.head()) 109 | 110 | 111 | # In[7]: 112 | 113 | 114 | symbols = list(set(df.symbol)) 115 | stock_interest = 'GOOG' 116 | len(symbols) 117 | df2 = df[df.symbol == stock_interest] 118 | df2.drop(['symbol'],1,inplace=True) 119 | print (df2.head()) 120 | df = df[df.symbol == stock_interest] 121 | df.drop(['symbol'],1,inplace=True) 122 | print (df.head()) 123 | 124 | 125 | # In[8]: 126 | 127 | 128 | # df3 = normalize_data(df3) 129 | # df3.head() 130 | # df4 = normalize_data(df4) 131 | # df4.head() 132 | 133 | 134 | # In[9]: 135 | 136 | 137 | print (df.shape) 138 | print (df2.shape) 139 | df = normalize_data(df) 140 | df.head() 141 | df2 = normalize_data(df2) 142 | df2.head() 143 | 144 | 145 | # In[10]: 146 | 147 | 148 | def build_model(layers): 149 | d = 0.3 150 | model = Sequential() 151 | 152 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=True)) 153 | model.add(Dropout(d)) 154 | 155 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=False)) 156 | model.add(Dropout(d)) 157 | 158 | model.add(Dense(32,kernel_initializer="uniform",activation='relu')) 159 | model.add(Dense(1,kernel_initializer="uniform",activation='linear')) 160 | 161 | # adam = keras.optimizers.Adam(decay=0.2) 162 | 163 | start = time.time() 164 | model.compile(loss='mse',optimizer='adam', metrics=['accuracy']) 165 | print("Compilation Time : ", time.time() - start) 166 | return model 167 | 168 | 169 | # In[12]: 170 | 171 | 172 | window = 22 173 | X_train, y_train, X_test, y_test = load_data(df2, window) 174 | print(X_train.shape) 175 | print(y_train.shape) 176 | # print (X_train[0], y_train[0]) 177 | 178 | 179 | # In[15]: 180 | 181 | 182 | model = build_model([5,window,1]) 183 | model.fit(X_train,y_train,batch_size=512,epochs=90,validation_split=0.1,verbose=1) 184 | 185 | 186 | # In[16]: 187 | 188 | 189 | # print(X_test[-1]) 190 | diff=[] 191 | ratio=[] 192 | p = model.predict(X_test) 193 | print (p.shape) 194 | # for each data index in test data 195 | for u in range(len(y_test)): 196 | # pr = prediction day u 197 | pr = p[u][0] 198 | # (y_test day u / pr) - 1 199 | ratio.append((y_test[u]/pr)-1) 200 | diff.append(abs(y_test[u]- pr)) 201 | # print(u, y_test[u], pr, (y_test[u]/pr)-1, abs(y_test[u]- pr)) 202 | # Last day prediction 203 | # print(p[-1]) 204 | 205 | 206 | # In[17]: 207 | 208 | 209 | df = pd.read_csv("prices-split-adjusted.csv", index_col = 0) 210 | df["adj close"] = df.close # Moving close to the last column 211 | df.drop(['close'], 1, inplace=True) # Moving close to the last column 212 | df = df[df.symbol == stock_interest] 213 | df.drop(['symbol'],1,inplace=True) 214 | 215 | # Bug fixed at here, please update the denormalize function to this one 216 | def denormalize(df, normalized_value): 217 | df = df['adj close'].values.reshape(-1,1) 218 | normalized_value = normalized_value.reshape(-1,1) 219 | 220 | #return df.shape, p.shape 221 | min_max_scaler = preprocessing.MinMaxScaler() 222 | a = min_max_scaler.fit_transform(df) 223 | new = min_max_scaler.inverse_transform(normalized_value) 224 | return new 225 | 226 | newp = denormalize(df, p) 227 | newy_test = denormalize(df, y_test) 228 | 229 | 230 | # In[18]: 231 | 232 | 233 | def model_score(model, X_train, y_train, X_test, y_test): 234 | trainScore = model.evaluate(X_train, y_train, verbose=0) 235 | print('Train Score: %.5f MSE (%.2f RMSE)' % (trainScore[0], math.sqrt(trainScore[0]))) 236 | 237 | testScore = model.evaluate(X_test, y_test, verbose=0) 238 | print('Test Score: %.5f MSE (%.2f RMSE)' % (testScore[0], math.sqrt(testScore[0]))) 239 | return trainScore[0], testScore[0] 240 | 241 | 242 | model_score(model, X_train, y_train, X_test, y_test) 243 | 244 | 245 | # In[19]: 246 | 247 | 248 | def trend_score(actual, pred): 249 | trendScore = 0 250 | for i in range(len(actual)-1): 251 | if ((actual[i+1]-actual[i])*(pred[i+1]-actual[i])>0): 252 | trendScore=trendScore+1 253 | return trendScore/(len(actual)-1) 254 | 255 | trScore = trend_score(newy_test, newp) 256 | print(trScore) 257 | 258 | 259 | # In[22]: 260 | 261 | 262 | import matplotlib.pyplot as plt2 263 | 264 | plt2.plot(newp,color='red', label='Prediction') 265 | plt2.plot(newy_test,color='blue', label='Actual') 266 | plt2.legend(loc='best') 267 | plt2.show() 268 | 269 | 270 | # In[24]: 271 | 272 | 273 | print (stock_interest) 274 | 275 | 276 | # In[26]: 277 | 278 | 279 | import statsmodels.api as sm 280 | import statsmodels.api as sm 281 | res = sm.tsa.arma_order_select_ic(y_train, ic=['aic', 'bic'], trend='nc') 282 | print (res.aic_min_order) 283 | print (res.bic_min_order) 284 | 285 | 286 | # In[28]: 287 | 288 | 289 | print (y_train.shape) 290 | print (y_test.shape) 291 | y_all = list(y_train).append(list(y_test)) 292 | 293 | 294 | # In[29]: 295 | 296 | 297 | # print list(y_train) 298 | y_all = np.zeros(1565+174) 299 | y_all[:1565] = y_train 300 | y_all[1565:] = y_test 301 | plt2.plot(y_all) 302 | plt2.show() 303 | 304 | 305 | # In[30]: 306 | 307 | 308 | from statsmodels.tsa.arima_model import ARMA 309 | my_order = res.aic_min_order 310 | arma_model = ARMA(y_train,(3,2),freq = 'Q').fit() 311 | arma_y = arma_model.predict(start = 1565,end = 1565+174,dynamic=True) 312 | 313 | # arma_y = arma_model.predict(start = 4,end = 1700) 314 | plt2.figure(2) 315 | plt2.plot(arma_y,color='blue', label='ARMA Prediction') 316 | plt2.plot(y_train,color='red', label='Actual') 317 | plt2.legend(loc='best') 318 | plt2.show() 319 | 320 | 321 | # In[31]: 322 | 323 | 324 | # arma_model.fit() 325 | # arma_y = arma_model.predict(start = 1,end = 1700,exog = y_train) 326 | arma_pred = denormalize(df, arma_y) 327 | # import matplotlib.pyplot as plt2 328 | 329 | plt2.plot(newp,color='red', label='LSTM Prediction') 330 | plt2.plot(newy_test,color='blue', label='Actual') 331 | plt2.plot(arma_pred,color='green', label='ARMA Prediction') 332 | plt2.legend(loc='best') 333 | plt2.show() 334 | 335 | 336 | # In[32]: 337 | 338 | 339 | print (len(y_test)) 340 | print (len(arma_y)) 341 | print (arma_y[:10]) 342 | print (y_train[-10:-1]) 343 | print (y_train[:10]) 344 | print (len(y_train)) 345 | plt2.figure(2) 346 | plt2.plot(arma_y,color='blue', label='ARMA Prediction') 347 | plt2.plot(y_train[:157],color='red', label='Actual') 348 | plt2.legend(loc='best') 349 | plt2.show() 350 | 351 | 352 | -------------------------------------------------------------------------------- /main2.py: -------------------------------------------------------------------------------- 1 | 2 | # coding: utf-8 3 | 4 | # In[2]: 5 | 6 | 7 | #reference: https://www.kaggle.com/benjibb/lstm-stock-prediction-20170507?scriptVersionId=1139231 8 | import numpy as np 9 | import matplotlib.pyplot as plt 10 | import pandas as pd 11 | from pandas import datetime 12 | import math, time 13 | import itertools 14 | from sklearn import preprocessing 15 | import datetime 16 | from operator import itemgetter 17 | from sklearn.metrics import mean_squared_error 18 | from math import sqrt 19 | from keras.models import Sequential 20 | from keras.layers.core import Dense, Dropout, Activation 21 | from keras.layers.recurrent import LSTM 22 | from keras.models import load_model 23 | from keras.layers import Input 24 | from keras.models import Model 25 | import keras 26 | import h5py 27 | import requests 28 | import os 29 | 30 | 31 | # In[3]: 32 | 33 | 34 | def normalize_data(df): 35 | min_max_scaler = preprocessing.MinMaxScaler() 36 | df['open'] = min_max_scaler.fit_transform(df.open.values.reshape(-1,1)) 37 | df['high'] = min_max_scaler.fit_transform(df.high.values.reshape(-1,1)) 38 | df['low'] = min_max_scaler.fit_transform(df.low.values.reshape(-1,1)) 39 | df['volume'] = min_max_scaler.fit_transform(df.volume.values.reshape(-1,1)) 40 | df['adj close'] = min_max_scaler.fit_transform(df['adj close'].values.reshape(-1,1)) 41 | return df 42 | 43 | # function for build the training data and test data 44 | def load_data(stock, seq_len): 45 | amount_of_features = len(stock.columns) # 5 46 | data = stock.as_matrix() 47 | sequence_length = seq_len + 1 # index starting from 0 48 | result = [] 49 | 50 | for index in range(len(data) - sequence_length): # maxmimum date = lastest date - sequence length 51 | result.append(data[index: index + sequence_length]) # index : index + 22days 52 | 53 | result = np.array(result) 54 | # print(result.shape) 55 | row = round(0.9 * result.shape[0]) # 90% split 56 | train = result[:int(row), :] # 90% date, all features 57 | 58 | x_train = train[:, :-1] 59 | y_train = train[:, -1][:,-1] 60 | # print(x_train.shape) 61 | # print(y_train.shape) 62 | 63 | x_test = result[int(row):, :-1] 64 | y_test = result[int(row):, -1][:,-1] 65 | # print(x_test.shape) 66 | # print(y_test.shape) 67 | 68 | x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], amount_of_features)) 69 | x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], amount_of_features)) 70 | 71 | return [x_train, y_train, x_test, y_test] 72 | 73 | 74 | # In[5]: 75 | 76 | 77 | df = pd.read_csv("data/prices-split-adjusted.csv", index_col = 0) 78 | df["adj close"] = df.close # Moving close to the last column 79 | df.drop(['close'], 1, inplace=True) # Moving close to the last column 80 | df.head() 81 | 82 | 83 | # In[6]: 84 | 85 | 86 | df = normalize_data(df) 87 | df.head() 88 | 89 | 90 | # In[7]: 91 | 92 | 93 | symbols = list(set(df.symbol)) 94 | print symbols 95 | 96 | 97 | # In[8]: 98 | 99 | 100 | science_list = ['GOOG','AAPL','YHOO','AMZN'] 101 | encoding_dim = 10 102 | # for symbol in science_list: 103 | # thisdf = df[df.symbol == symbol] 104 | # input_img = Input(shape=(22,)) 105 | # encoded = Dense(encoding_dim, activation='relu')(input_img) 106 | # decoded = Dense(784, activation='sigmoid')(encoded) 107 | # autoencoder = Model(input_img, decoded) 108 | # encoder = Model(input_img, encoded) 109 | stock_interest = 'AAPL' 110 | df3 = df[df.symbol == stock_interest] 111 | df3.drop(['symbol'],1,inplace=True) 112 | df3.head() 113 | 114 | 115 | # In[9]: 116 | 117 | 118 | window = 22 119 | X_train, y_train, X_test, y_test = load_data(df3, window) 120 | print X_train.shape 121 | 122 | 123 | # In[10]: 124 | 125 | 126 | print X_train.shape 127 | X_train = X_train.reshape(1565,22*5) 128 | 129 | 130 | # In[11]: 131 | 132 | 133 | print X_test.shape 134 | X_test = X_test.reshape(174,22*5) 135 | 136 | 137 | # In[12]: 138 | 139 | 140 | #Test the performance of autoencoder on the time series 141 | # build the model 142 | input_img = Input(shape=(22*5,)) 143 | encoding_dim = 10 144 | encoded = Dense(encoding_dim, activation='relu')(input_img) 145 | decoded = Dense(22*5, activation='linear')(encoded) 146 | autoencoder = Model(input_img, decoded) 147 | encoder = Model(input_img, encoded) 148 | encoded_input = Input(shape=(encoding_dim,)) 149 | decoder_layer = autoencoder.layers[-1] 150 | decoder = Model(encoded_input, decoder_layer(encoded_input)) 151 | autoencoder.compile(optimizer='adadelta', loss='mean_squared_error') 152 | 153 | 154 | # In[13]: 155 | 156 | 157 | print X_train 158 | earlyStopping=keras.callbacks.EarlyStopping(monitor='val_loss', patience=20, verbose=0, mode='auto') 159 | autoencoder.fit(X_train, X_train, 160 | epochs=150, 161 | batch_size=256, 162 | callbacks=[earlyStopping], 163 | shuffle=True, 164 | validation_data=(X_test, X_test)) 165 | 166 | 167 | # In[14]: 168 | 169 | 170 | # thisx = X_test 171 | print X_test.shape 172 | thisx = np.array([X_test[1,:]]) 173 | print thisx.shape 174 | encoded_imgs = encoder.predict(X_test) 175 | decoded_imgs = decoder.predict(encoded_imgs) 176 | 177 | 178 | # In[15]: 179 | 180 | 181 | 182 | print thisx 183 | print decoded_imgs[0] 184 | 185 | 186 | # In[16]: 187 | 188 | 189 | plt.plot(thisx[0],label = ' original') 190 | plt.plot(decoded_imgs[0],label = ' prediction') 191 | plt.legend() 192 | plt.show() 193 | 194 | 195 | # In[17]: 196 | 197 | 198 | #TODO 199 | science_list = ['GOOG','AAPL','YHOO','AMZN'] 200 | encoder_list = [] 201 | decoder_list = [] 202 | window = 22 203 | for symbol in science_list: 204 | # prepare the data 205 | df3 = df[df.symbol == symbol] 206 | df3.drop(['symbol'],1,inplace=True) 207 | df3.head() 208 | X_train, y_train, X_test, y_test = load_data(df3, window) 209 | X_train = X_train.reshape(X_train.shape[0],22*5) 210 | X_test = X_test.reshape(X_test.shape[0],22*5) 211 | 212 | 213 | 214 | # train an autoencoder 215 | input_img = Input(shape=(22*5,)) 216 | encoding_dim = 10 217 | encoded = Dense(encoding_dim, activation='relu')(input_img) 218 | decoded = Dense(22*5, activation='linear')(encoded) 219 | autoencoder = Model(input_img, decoded) 220 | encoder = Model(input_img, encoded) 221 | encoded_input = Input(shape=(encoding_dim,)) 222 | decoder_layer = autoencoder.layers[-1] 223 | decoder = Model(encoded_input, decoder_layer(encoded_input)) 224 | autoencoder.compile(optimizer='adadelta', loss='mean_squared_error') 225 | earlyStopping=keras.callbacks.EarlyStopping(monitor='val_loss', patience=20, verbose=0, mode='auto') 226 | autoencoder.fit(X_train, X_train, 227 | epochs=150, 228 | batch_size=256, 229 | callbacks=[earlyStopping], 230 | shuffle=True, 231 | validation_data=(X_test, X_test)) 232 | 233 | # autoencoder_list.append(None) # append the trained autoencoder 234 | encoder_list.append(encoder) 235 | decoder_list.append(decoder) 236 | 237 | 238 | # generate the predicted values for all stocks and put them in one matrix 239 | # train a LSTM using those values 240 | # test the results 241 | 242 | 243 | # In[18]: 244 | 245 | 246 | # train the main model 247 | # for stock in list 248 | # get the data and transform the data 249 | # bulid the train data 250 | # put into keras 251 | 252 | print encoded_imgs[4] 253 | 254 | 255 | # In[22]: 256 | 257 | 258 | def generate_data(df,symbol_list,encoder_list,deoder_list,window,feature_len): 259 | data = [] 260 | testdata = [] 261 | label = [] 262 | testlabel = [] 263 | num_symbol = len(symbol_list) 264 | first = 0 265 | for symbol in symbol_list: 266 | df3 = df[df.symbol == symbol] 267 | df3.drop(['symbol'],1,inplace=True) 268 | X_train, y_train, X_test, y_test = load_data(df3, window) 269 | 270 | X_train = X_train.reshape(X_train.shape[0],22*5) 271 | num_train = X_train.shape[0] 272 | X_test = X_test.reshape(X_test.shape[0],22*5) 273 | num_test = X_test.shape[0] 274 | 275 | 276 | thisdata = np.zeros([num_train,num_symbol * feature_len]) 277 | thistest = np.zeros([num_test,num_symbol * feature_len]) 278 | print num_test 279 | i = 0 280 | for encoder in encoder_list: 281 | 282 | encoded_imgs = encoder.predict(X_train) 283 | thisdata[:,i*feature_len:(i+1)*feature_len] = encoded_imgs 284 | encoded_imgs = encoder.predict(X_test) 285 | thistest[:,i*feature_len:(i+1)*feature_len] = encoded_imgs 286 | i += 1 287 | if first == 0: 288 | data = thisdata 289 | first =1 290 | testdata = thistest 291 | label = y_train 292 | testlabel = y_test 293 | print testdata.shape 294 | else: 295 | data = np.append(data,thisdata,axis=0) 296 | testdata = np.append(testdata,thistest,axis=0) 297 | label = np.append(label,y_train) 298 | testlabel = np.append(testlabel,y_test) 299 | print testdata.shape 300 | return data,testdata,label,testlabel 301 | 302 | 303 | def generate_data_decoded(df,symbol_list,encoder_list,deoder_list,window,feature_len): 304 | data = [] 305 | testdata = [] 306 | label = [] 307 | testlabel = [] 308 | num_symbol = len(symbol_list) 309 | first = 0 310 | for symbol in symbol_list: 311 | df3 = df[df.symbol == symbol] 312 | df3.drop(['symbol'],1,inplace=True) 313 | X_train, y_train, X_test, y_test = load_data(df3, window) 314 | 315 | X_train = X_train.reshape(X_train.shape[0],22*5) 316 | num_train = X_train.shape[0] 317 | X_test = X_test.reshape(X_test.shape[0],22*5) 318 | num_test = X_test.shape[0] 319 | 320 | 321 | thisdata = np.zeros([num_train,window,num_symbol * feature_len]) 322 | thistest = np.zeros([num_test,window,num_symbol * feature_len]) 323 | print num_test 324 | i = 0 325 | for encoder in encoder_list: 326 | 327 | encoded_imgs = encoder.predict(X_train) 328 | decoded_imgs = decoder.predict(encoded_imgs) 329 | decoded_imgs = decoded_imgs.reshape(num_train,window,feature_len) 330 | print decoded_imgs.shape 331 | 332 | thisdata[:,:,i*feature_len:(i+1)*feature_len] = decoded_imgs 333 | encoded_imgs = encoder.predict(X_test) 334 | decoded_imgs = decoder.predict(encoded_imgs) 335 | decoded_imgs = decoded_imgs.reshape(num_test,window,feature_len) 336 | thistest[:,:,i*feature_len:(i+1)*feature_len] = decoded_imgs 337 | i += 1 338 | if first == 0: 339 | data = thisdata 340 | first =1 341 | testdata = thistest 342 | label = y_train 343 | testlabel = y_test 344 | print testdata.shape 345 | else: 346 | data = np.append(data,thisdata,axis=0) 347 | testdata = np.append(testdata,thistest,axis=0) 348 | label = np.append(label,y_train) 349 | testlabel = np.append(testlabel,y_test) 350 | print testdata.shape 351 | return data,testdata,label,testlabel 352 | xx = generate_data(df,science_list,encoder_list,decoder_list,window,10) 353 | xx2 = generate_data_decoded(df,science_list,encoder_list,decoder_list,window,5) 354 | 355 | 356 | # In[23]: 357 | 358 | 359 | print np.array(xx).shape 360 | print xx[0].shape 361 | print xx[1].shape 362 | print xx[2].shape 363 | print xx[3].shape 364 | # xx = xx.reshape(1565,10*4) 365 | 366 | 367 | # In[27]: 368 | 369 | 370 | def build_model1(layers): 371 | d = 0.3 372 | model = Sequential() 373 | 374 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=True)) 375 | model.add(Dropout(d)) 376 | 377 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=False)) 378 | model.add(Dropout(d)) 379 | 380 | model.add(Dense(32,kernel_initializer="uniform",activation='relu')) 381 | model.add(Dense(1,kernel_initializer="uniform",activation='linear')) 382 | 383 | # adam = keras.optimizers.Adam(decay=0.2) 384 | 385 | start = time.time() 386 | model.compile(loss='mse',optimizer='adam', metrics=['accuracy']) 387 | print("Compilation Time : ", time.time() - start) 388 | return model 389 | def build_model2(layers): 390 | d = 0.3 391 | model = Sequential() 392 | print layers 393 | # model.add(LSTM(256, input_dim=layers[0], return_sequences=True)) 394 | # model.add(Dropout(d)) 395 | # model.add(LSTM(256, input_dim=layers[0], return_sequences=False)) 396 | # model.add(Dropout(d)) 397 | model.add(Dense(32,input_dim = 40, kernel_initializer="uniform",activation='relu')) 398 | model.add(Dropout(d)) 399 | # model.add(Dense(32, kernel_initializer="uniform",activation='relu')) 400 | # model.add(Dropout(d)) 401 | model.add(Dense(1,kernel_initializer="uniform",activation='linear')) 402 | # adam = keras.optimizers.Adam(decay=0.2) 403 | start = time.time() 404 | model.compile(loss='mse',optimizer='adam', metrics=['accuracy']) 405 | print("Compilation Time : ", time.time() - start) 406 | return model 407 | 408 | 409 | # In[28]: 410 | 411 | 412 | model = build_model2([40,1]) 413 | model2 = build_model1([20,window,1]) 414 | 415 | 416 | # In[29]: 417 | 418 | 419 | # X_train = xx[0].reshape(xx[0].shape[0],) 420 | model.fit(xx[0],xx[2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 421 | model2.fit(xx2[0],xx2[2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 422 | 423 | 424 | # In[30]: 425 | 426 | 427 | p = model.predict(xx[1]) 428 | p2 = model2.predict(xx2[1]) 429 | 430 | 431 | # In[37]: 432 | 433 | 434 | plt.plot(p[175:348],label = 'Prediction') 435 | plt.plot(xx[3][175:348],label = 'Observation') 436 | plt.plot(p2[175:348],label = 'Prediction 2') 437 | plt.legend(loc='lower right') 438 | plt.show() 439 | 440 | 441 | # In[34]: 442 | 443 | 444 | print len(p2) 445 | 446 | 447 | # In[38]: 448 | 449 | 450 | # TODO: 451 | # 1. re-normalize 452 | # 2. compare the loss 453 | # 3. try with different symbols 454 | # 4. play with build model two 455 | df = pd.read_csv("prices-split-adjusted.csv", index_col = 0) 456 | df["adj close"] = df.close # Moving close to the last column 457 | df.drop(['close'], 1, inplace=True) # Moving close to the last column 458 | df = df[df.symbol == stock_interest] 459 | df.drop(['symbol'],1,inplace=True) 460 | 461 | def denormalize(df, normalized_value): 462 | df = df['adj close'].values.reshape(-1,1) 463 | normalized_value = normalized_value.reshape(-1,1) 464 | 465 | #return df.shape, p.shape 466 | min_max_scaler = preprocessing.MinMaxScaler() 467 | a = min_max_scaler.fit_transform(df) 468 | new = min_max_scaler.inverse_transform(normalized_value) 469 | return new 470 | 471 | 472 | # In[39]: 473 | 474 | 475 | # get the prediction from lstm 476 | def build_model_baseline(layers): 477 | d = 0.3 478 | model = Sequential() 479 | 480 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=True)) 481 | model.add(Dropout(d)) 482 | 483 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=False)) 484 | model.add(Dropout(d)) 485 | 486 | model.add(Dense(32,kernel_initializer="uniform",activation='relu')) 487 | model.add(Dense(1,kernel_initializer="uniform",activation='linear')) 488 | 489 | # adam = keras.optimizers.Adam(decay=0.2) 490 | 491 | start = time.time() 492 | model.compile(loss='mse',optimizer='adam', metrics=['accuracy']) 493 | print("Compilation Time : ", time.time() - start) 494 | return model 495 | 496 | 497 | # In[40]: 498 | 499 | 500 | stock_interest = 'GOOG' 501 | df2 = df[df.symbol == stock_interest] 502 | df2.drop(['symbol'],1,inplace=True) 503 | df2 = normalize_data(df2) 504 | window = 22 505 | X_train, y_train, X_test, y_test = load_data(df2, window) 506 | model = build_model([5,window,1]) 507 | model.fit(X_train,y_train,batch_size=512,epochs=90,validation_split=0.1,verbose=1) 508 | plstm = model.predict(X_test) 509 | 510 | 511 | # In[50]: 512 | 513 | 514 | i = 0 515 | plt.plot(p[i*175:(i+1)*175-1],label = 'Prediction') 516 | plt.plot(xx[3][i*175:(i+1)*175-1],label = 'Observation') 517 | plt.plot(p2[i*175:(i+1)*175-1],label = 'Prediction 2') 518 | plt.plot(plstm,label='LSTM') 519 | plt.legend(loc='best') 520 | plt.show() 521 | 522 | 523 | # In[51]: 524 | 525 | 526 | stock_interest = 'AAPL' 527 | df2 = df[df.symbol == stock_interest] 528 | df2.drop(['symbol'],1,inplace=True) 529 | df2 = normalize_data(df2) 530 | window = 22 531 | X_train, y_train, X_test, y_test = load_data(df2, window) 532 | model = build_model([5,window,1]) 533 | model.fit(X_train,y_train,batch_size=512,epochs=90,validation_split=0.1,verbose=1) 534 | plstm2 = model.predict(X_test) 535 | 536 | 537 | # In[56]: 538 | 539 | 540 | i = 0 541 | plt.plot(p[i*175:(i+1)*175-1],label = 'Prediction') 542 | plt.plot(xx[3][i*175:(i+1)*175-1],label = 'Observation') 543 | plt.plot(p2[i*175:(i+1)*175-1],label = 'Prediction 2') 544 | plt.plot(plstm2,label='LSTM') 545 | plt.legend(loc='best') 546 | plt.show() 547 | 548 | -------------------------------------------------------------------------------- /main3.py: -------------------------------------------------------------------------------- 1 | 2 | # coding: utf-8 3 | 4 | # In[62]: 5 | 6 | 7 | #reference: https://www.kaggle.com/benjibb/lstm-stock-prediction-20170507?scriptVersionId=1139231 8 | import numpy as np 9 | import matplotlib.pyplot as plt 10 | import pandas as pd 11 | from pandas import datetime 12 | import math, time 13 | import itertools 14 | from sklearn import preprocessing 15 | import datetime 16 | from operator import itemgetter 17 | from sklearn.metrics import mean_squared_error 18 | from math import sqrt 19 | from keras.models import Sequential 20 | from keras.layers.core import Dense, Dropout, Activation 21 | from keras.layers.recurrent import LSTM 22 | from keras.models import load_model 23 | from keras.layers import Input 24 | from keras.models import Model 25 | import keras 26 | import h5py 27 | import requests 28 | import os 29 | 30 | 31 | # In[63]: 32 | 33 | 34 | def normalize_data(df): 35 | min_max_scaler = preprocessing.MinMaxScaler() 36 | df['open'] = min_max_scaler.fit_transform(df.open.values.reshape(-1,1)) 37 | df['high'] = min_max_scaler.fit_transform(df.high.values.reshape(-1,1)) 38 | df['low'] = min_max_scaler.fit_transform(df.low.values.reshape(-1,1)) 39 | df['volume'] = min_max_scaler.fit_transform(df.volume.values.reshape(-1,1)) 40 | df['adj close'] = min_max_scaler.fit_transform(df['adj close'].values.reshape(-1,1)) 41 | return df 42 | 43 | # function for build the training data and test data 44 | def load_data(stock, seq_len): 45 | amount_of_features = len(stock.columns) # 5 46 | data = stock.as_matrix() 47 | sequence_length = seq_len + 1 # index starting from 0 48 | result = [] 49 | 50 | for index in range(len(data) - sequence_length): # maxmimum date = lastest date - sequence length 51 | result.append(data[index: index + sequence_length]) # index : index + 22days 52 | 53 | result = np.array(result) 54 | # print(result.shape) 55 | row = round(0.9 * result.shape[0]) # 90% split 56 | train = result[:int(row), :] # 90% date, all features 57 | 58 | x_train = train[:, :-1] 59 | y_train = train[:, -1][:,-1] 60 | # print(x_train.shape) 61 | # print(y_train.shape) 62 | 63 | x_test = result[int(row):, :-1] 64 | y_test = result[int(row):, -1][:,-1] 65 | # print(x_test.shape) 66 | # print(y_test.shape) 67 | 68 | x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], amount_of_features)) 69 | x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], amount_of_features)) 70 | 71 | return [x_train, y_train, x_test, y_test] 72 | 73 | 74 | # In[64]: 75 | 76 | 77 | df = pd.read_csv("prices-split-adjusted.csv", index_col = 0) 78 | df["adj close"] = df.close # Moving close to the last column 79 | df.drop(['close'], 1, inplace=True) # Moving close to the last column 80 | df.head() 81 | 82 | 83 | # In[65]: 84 | 85 | 86 | # df = normalize_data(df) 87 | # df.head() 88 | 89 | 90 | # In[66]: 91 | 92 | 93 | symbols = list(set(df.symbol)) 94 | # print (symbols) 95 | 96 | 97 | # In[67]: 98 | 99 | 100 | science_list = ['GOOG','AAPL','YHOO','AMZN'] 101 | encoding_dim = 10 102 | # for symbol in science_list: 103 | # thisdf = df[df.symbol == symbol] 104 | # input_img = Input(shape=(22,)) 105 | # encoded = Dense(encoding_dim, activation='relu')(input_img) 106 | # decoded = Dense(784, activation='sigmoid')(encoded) 107 | # autoencoder = Model(input_img, decoded) 108 | # encoder = Model(input_img, encoded) 109 | stock_interest = 'AAPL' 110 | df3 = df[df.symbol == stock_interest] 111 | df3.drop(['symbol'],1,inplace=True) 112 | df3.head() 113 | 114 | 115 | # In[68]: 116 | 117 | 118 | window = 22 119 | X_train, y_train, X_test, y_test = load_data(df3, window) 120 | print (X_train.shape) 121 | 122 | 123 | # In[69]: 124 | 125 | 126 | print (X_train.shape) 127 | X_train = X_train.reshape(1565,22*5) 128 | 129 | 130 | # In[70]: 131 | 132 | 133 | print (X_test.shape) 134 | X_test = X_test.reshape(174,22*5) 135 | 136 | 137 | # In[71]: 138 | 139 | 140 | #Test the performance of autoencoder on the time series 141 | # build the model 142 | input_img = Input(shape=(22*5,)) 143 | encoding_dim = 10 144 | encoded = Dense(encoding_dim, activation='relu')(input_img) 145 | decoded = Dense(22*5, activation='linear')(encoded) 146 | autoencoder = Model(input_img, decoded) 147 | encoder = Model(input_img, encoded) 148 | encoded_input = Input(shape=(encoding_dim,)) 149 | decoder_layer = autoencoder.layers[-1] 150 | decoder = Model(encoded_input, decoder_layer(encoded_input)) 151 | autoencoder.compile(optimizer='adadelta', loss='mean_squared_error') 152 | 153 | 154 | # In[72]: 155 | 156 | 157 | print (X_train) 158 | earlyStopping=keras.callbacks.EarlyStopping(monitor='val_loss', patience=20, verbose=0, mode='auto') 159 | autoencoder.fit(X_train, X_train, 160 | epochs=150, 161 | batch_size=256, 162 | callbacks=[earlyStopping], 163 | shuffle=True, 164 | validation_data=(X_test, X_test)) 165 | 166 | 167 | # In[73]: 168 | 169 | 170 | # thisx = X_test 171 | print (X_test.shape) 172 | thisx = np.array([X_test[1,:]]) 173 | print (thisx.shape) 174 | encoded_imgs = encoder.predict(X_test) 175 | decoded_imgs = decoder.predict(encoded_imgs) 176 | print(encoded_imgs.shape) 177 | print(decoded_imgs.shape) 178 | 179 | 180 | # In[74]: 181 | 182 | 183 | 184 | # print (thisx) 185 | # print (decoded_imgs[0]) 186 | 187 | 188 | # In[75]: 189 | 190 | 191 | plt.plot(thisx[0],label = ' original') 192 | plt.plot(decoded_imgs[0],label = ' prediction') 193 | plt.legend() 194 | plt.show() 195 | 196 | 197 | # In[76]: 198 | 199 | 200 | #TODO 201 | # science_list = ['GOOG','AAPL','YHOO','AMZN'] 202 | # science_list = ['GOOG','AAPL','YHOO','AMZN', 'MSFT', 'IBM', 'GOOGL', 'FB'] 203 | science_list = ['GOOG','AAPL','YHOO','AMZN', 'MSFT', 'IBM', 'GOOGL', 'FB', 'EBAY', 'NVDA', 'ORCL', 'INTC'] 204 | encoder_list = [] 205 | decoder_list = [] 206 | window = 22 207 | for symbol in science_list: 208 | # prepare the data 209 | df3 = df[df.symbol == symbol] 210 | df3.drop(['symbol'],1,inplace=True) 211 | df3 = normalize_data(df3) 212 | df3.head() 213 | X_train, y_train, X_test, y_test = load_data(df3, window) 214 | X_train = X_train.reshape(X_train.shape[0],22*5) 215 | X_test = X_test.reshape(X_test.shape[0],22*5) 216 | 217 | 218 | 219 | # train an autoencoder 220 | input_img = Input(shape=(22*5,)) 221 | encoding_dim = 10 222 | encoded = Dense(encoding_dim, activation='relu')(input_img) 223 | decoded = Dense(22*5, activation='linear')(encoded) 224 | autoencoder = Model(input_img, decoded) 225 | encoder = Model(input_img, encoded) 226 | encoded_input = Input(shape=(encoding_dim,)) 227 | decoder_layer = autoencoder.layers[-1] 228 | decoder = Model(encoded_input, decoder_layer(encoded_input)) 229 | autoencoder.compile(optimizer='adadelta', loss='mean_squared_error') 230 | earlyStopping=keras.callbacks.EarlyStopping(monitor='val_loss', patience=20, verbose=0, mode='auto') 231 | autoencoder.fit(X_train, X_train, 232 | epochs=150, 233 | batch_size=256, 234 | callbacks=[earlyStopping], 235 | shuffle=True, 236 | validation_data=(X_test, X_test)) 237 | 238 | # autoencoder_list.append(None) # append the trained autoencoder 239 | encoder_list.append(encoder) 240 | decoder_list.append(decoder) 241 | 242 | 243 | # generate the predicted values for all stocks and put them in one matrix 244 | # train a LSTM using those values 245 | # test the results 246 | 247 | 248 | # In[77]: 249 | 250 | 251 | # train the main model 252 | # for stock in list 253 | # get the data and transform the data 254 | # bulid the train data 255 | # put into keras 256 | 257 | print (encoded_imgs[4]) 258 | 259 | 260 | # In[78]: 261 | 262 | 263 | def generate_data(df,symbol_list,encoder_list,deoder_list,window,feature_len): 264 | data = [] 265 | testdata = [] 266 | label = [] 267 | testlabel = [] 268 | num_symbol = len(symbol_list) 269 | first = 0 270 | for symbol in symbol_list: 271 | df3 = df[df.symbol == symbol] 272 | df3.drop(['symbol'],1,inplace=True) 273 | df3 = normalize_data(df3) 274 | X_train, y_train, X_test, y_test = load_data(df3, window) 275 | 276 | X_train = X_train.reshape(X_train.shape[0],22*5) 277 | num_train = X_train.shape[0] 278 | X_test = X_test.reshape(X_test.shape[0],22*5) 279 | num_test = X_test.shape[0] 280 | 281 | 282 | thisdata = np.zeros([num_train,num_symbol * feature_len]) 283 | thistest = np.zeros([num_test,num_symbol * feature_len]) 284 | # print (num_test) 285 | i = 0 286 | for encoder in encoder_list: 287 | 288 | encoded_imgs = encoder.predict(X_train) 289 | thisdata[:,i*feature_len:(i+1)*feature_len] = encoded_imgs 290 | encoded_imgs = encoder.predict(X_test) 291 | thistest[:,i*feature_len:(i+1)*feature_len] = encoded_imgs 292 | i += 1 293 | if first == 0: 294 | data = thisdata 295 | first =1 296 | testdata = thistest 297 | label = y_train 298 | testlabel = y_test 299 | # print (testdata.shape) 300 | else: 301 | data = np.append(data,thisdata,axis=0) 302 | testdata = np.append(testdata,thistest,axis=0) 303 | label = np.append(label,y_train) 304 | testlabel = np.append(testlabel,y_test) 305 | # print (testdata.shape) 306 | return data,testdata,label,testlabel 307 | 308 | 309 | def generate_data_decoded(df,symbol_list,encoder_list,deoder_list,window,feature_len): 310 | data = [] 311 | testdata = [] 312 | label = [] 313 | testlabel = [] 314 | num_symbol = len(symbol_list) 315 | first = 0 316 | for symbol in symbol_list: 317 | df3 = df[df.symbol == symbol] 318 | df3.drop(['symbol'],1,inplace=True) 319 | df3 = normalize_data(df3) 320 | X_train, y_train, X_test, y_test = load_data(df3, window) 321 | 322 | X_train = X_train.reshape(X_train.shape[0],22*5) 323 | num_train = X_train.shape[0] 324 | X_test = X_test.reshape(X_test.shape[0],22*5) 325 | num_test = X_test.shape[0] 326 | 327 | 328 | thisdata = np.zeros([num_train,window,num_symbol * feature_len]) 329 | thistest = np.zeros([num_test,window,num_symbol * feature_len]) 330 | # print (num_test) 331 | i = 0 332 | for encoder in encoder_list: 333 | 334 | encoded_imgs = encoder.predict(X_train) 335 | decoded_imgs = decoder.predict(encoded_imgs) 336 | decoded_imgs = decoded_imgs.reshape(num_train,window,feature_len) 337 | # print (decoded_imgs.shape) 338 | 339 | thisdata[:,:,i*feature_len:(i+1)*feature_len] = decoded_imgs 340 | encoded_imgs = encoder.predict(X_test) 341 | decoded_imgs = decoder.predict(encoded_imgs) 342 | decoded_imgs = decoded_imgs.reshape(num_test,window,feature_len) 343 | thistest[:,:,i*feature_len:(i+1)*feature_len] = decoded_imgs 344 | i += 1 345 | if first == 0: 346 | data = thisdata 347 | first =1 348 | testdata = thistest 349 | label = y_train 350 | testlabel = y_test 351 | # print (testdata.shape) 352 | else: 353 | data = np.append(data,thisdata,axis=0) 354 | testdata = np.append(testdata,thistest,axis=0) 355 | label = np.append(label,y_train) 356 | testlabel = np.append(testlabel,y_test) 357 | # print (testdata.shape) 358 | return data,testdata,label,testlabel 359 | # xx = generate_data(df,science_list[0:3],encoder_list[0:3],decoder_list[0:3],window,10) 360 | # xx2 = generate_data_decoded(df,science_list[0:3],encoder_list[0:3],decoder_list[0:3],window,5) 361 | 362 | 363 | # In[ ]: 364 | 365 | 366 | xx = generate_data(df,science_list[0:3],encoder_list[0:3],decoder_list[0:3],window,10) 367 | xx2 = generate_data_decoded(df,science_list[0:3],encoder_list[0:3],decoder_list[0:3],window,5) 368 | 369 | 370 | # In[111]: 371 | 372 | 373 | xx_s8 = generate_data(df,science_list[0:7],encoder_list[0:7],decoder_list[0:7],window,10) 374 | xx2_s8 = generate_data_decoded(df,science_list[0:7],encoder_list[0:7],decoder_list[0:7],window,5) 375 | 376 | 377 | # In[80]: 378 | 379 | 380 | xx_s12 = generate_data(df,science_list,encoder_list,decoder_list,window,10) 381 | xx2_s12 = generate_data_decoded(df,science_list,encoder_list,decoder_list,window,5) 382 | 383 | 384 | # In[81]: 385 | 386 | 387 | print (np.array(xx).shape) 388 | print (xx[0].shape) 389 | print (xx[1].shape) 390 | print (xx[2].shape) 391 | print (xx[3].shape) 392 | # xx = xx.reshape(1565,10*4) 393 | 394 | 395 | # In[119]: 396 | 397 | 398 | def build_model1(layers): 399 | d = 0.3 400 | model = Sequential() 401 | 402 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=True)) 403 | model.add(Dropout(d)) 404 | 405 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=False)) 406 | model.add(Dropout(d)) 407 | 408 | model.add(Dense(32,kernel_initializer="uniform",activation='relu')) 409 | model.add(Dense(1,kernel_initializer="uniform",activation='linear')) 410 | 411 | # adam = keras.optimizers.Adam(decay=0.2) 412 | 413 | start = time.time() 414 | model.compile(loss='mse',optimizer='adam', metrics=['accuracy']) 415 | print("Compilation Time : ", time.time() - start) 416 | return model 417 | def build_model2(layers): 418 | d = 0.3 419 | model = Sequential() 420 | print (layers) 421 | # model.add(LSTM(256, input_dim=layers[0], return_sequences=True)) 422 | # model.add(Dropout(d)) 423 | # model.add(LSTM(256, input_dim=layers[0], return_sequences=False)) 424 | # model.add(Dropout(d)) 425 | model.add(Dense(32,input_dim = 40*3, kernel_initializer="uniform",activation='relu')) 426 | model.add(Dropout(d)) 427 | # model.add(Dense(32, kernel_initializer="uniform",activation='relu')) 428 | # model.add(Dropout(d)) 429 | model.add(Dense(1,kernel_initializer="uniform",activation='linear')) 430 | # adam = keras.optimizers.Adam(decay=0.2) 431 | start = time.time() 432 | model.compile(loss='mse',optimizer='adam', metrics=['accuracy']) 433 | print("Compilation Time : ", time.time() - start) 434 | return model 435 | 436 | 437 | # In[83]: 438 | 439 | 440 | model = build_model2([40,1]) 441 | model2 = build_model1([20,window,1]) 442 | 443 | 444 | # In[31]: 445 | 446 | 447 | # X_train = xx[0].reshape(xx[0].shape[0],) 448 | model.fit(xx[0],xx[2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 449 | model2.fit(xx2[0],xx2[2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 450 | 451 | 452 | # In[115]: 453 | 454 | 455 | predictions = [] 456 | data1 = [xx, xx_s8, xx_s12] 457 | # for i in range(3): 458 | i=1 459 | model = build_model2([40*(i+1),1]) 460 | model.fit(data1[i][0],data1[i][2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 461 | predictions.append(model.predict(data1[i][1])) 462 | 463 | 464 | # In[120]: 465 | 466 | 467 | i=2 468 | model = build_model2([40*(i+1),1]) 469 | model.fit(data1[i][0],data1[i][2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 470 | predictions.append(model.predict(data1[i][1])) 471 | 472 | 473 | # In[112]: 474 | 475 | 476 | predictions2 = [] 477 | data2 = [xx2, xx2_s8, xx2_s12] 478 | # for i in range(3): 479 | i=1 480 | model2 = build_model1([20*(i+1),window,1]) 481 | model2.fit(data2[i][0],data2[i][2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 482 | predictions2.append(model2.predict(data2[i][1])) 483 | 484 | 485 | # In[118]: 486 | 487 | 488 | i=2 489 | model2 = build_model1([20*(i+1),window,1]) 490 | model2.fit(data2[i][0],data2[i][2],batch_size=512,epochs=90,validation_split=0.1,verbose=1) 491 | predictions2.append(model2.predict(data2[i][1])) 492 | 493 | 494 | # In[59]: 495 | 496 | 497 | p = model.predict(xx[1]) 498 | p2 = model2.predict(xx2[1]) 499 | 500 | 501 | # In[96]: 502 | 503 | 504 | plt.plot(predictions2[175:348],label = 'Prediction') 505 | plt.plot(xx[3][175:348],label = 'Observation') 506 | # plt.plot(p2[175:348],label = 'Prediction 2') 507 | plt.legend(loc='lower right') 508 | plt.show() 509 | 510 | 511 | # In[ ]: 512 | 513 | 514 | p_s8 = model.predict(xx_s8[1]) 515 | p2_s8 = model2.predict(xx2_s8[1]) 516 | 517 | 518 | # In[61]: 519 | 520 | 521 | # print (len(p)) 522 | # print (len(p2)) 523 | 524 | 525 | # In[35]: 526 | 527 | 528 | # TODO: 529 | # 1. re-normalize 530 | # 2. compare the loss 531 | # 3. try with different symbols 532 | # 4. play with build model two 533 | df = pd.read_csv("prices-split-adjusted.csv", index_col = 0) 534 | df["adj close"] = df.close # Moving close to the last column 535 | df.drop(['close'], 1, inplace=True) # Moving close to the last column 536 | df = df[df.symbol == stock_interest] 537 | # df.drop(['symbol'],1,inplace=True) 538 | 539 | def denormalize(df, normalized_value): 540 | df = df['adj close'].values.reshape(-1,1) 541 | normalized_value = normalized_value.reshape(-1,1) 542 | 543 | #return df.shape, p.shape 544 | min_max_scaler = preprocessing.MinMaxScaler() 545 | a = min_max_scaler.fit_transform(df) 546 | new = min_max_scaler.inverse_transform(normalized_value) 547 | return new 548 | 549 | 550 | # In[36]: 551 | 552 | 553 | # get the prediction from lstm 554 | def build_model_baseline(layers): 555 | d = 0.3 556 | model = Sequential() 557 | 558 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=True)) 559 | model.add(Dropout(d)) 560 | 561 | model.add(LSTM(256, input_shape=(layers[1], layers[0]), return_sequences=False)) 562 | model.add(Dropout(d)) 563 | 564 | model.add(Dense(32,kernel_initializer="uniform",activation='relu')) 565 | model.add(Dense(1,kernel_initializer="uniform",activation='linear')) 566 | 567 | # adam = keras.optimizers.Adam(decay=0.2) 568 | 569 | start = time.time() 570 | model.compile(loss='mse',optimizer='adam', metrics=['accuracy']) 571 | print("Compilation Time : ", time.time() - start) 572 | return model 573 | 574 | 575 | # In[131]: 576 | 577 | 578 | # stock_interest = 'GOOG' 579 | # df2 = df[df.symbol == stock_interest] 580 | # df2.drop(['symbol'],1,inplace=True) 581 | # df2 = normalize_data(df2) 582 | # window = 22 583 | # X_train, y_train, X_test, y_test = load_data(df2, window) 584 | # model = build_model_baseline([5,window,1]) 585 | # model.fit(X_train,y_train,batch_size=512,epochs=90,validation_split=0.1,verbose=1) 586 | # plstm = model.predict(X_test) 587 | 588 | 589 | # In[132]: 590 | 591 | 592 | # i = 0 593 | # plt.plot(p[i*175:(i+1)*175-1],label = 'Prediction') 594 | # plt.plot(xx[3][i*175:(i+1)*175-1],label = 'Observation') 595 | # plt.plot(p2[i*175:(i+1)*175-1],label = 'Prediction 2') 596 | # plt.plot(plstm,label='LSTM') 597 | # plt.legend(loc='best') 598 | # plt.show() 599 | 600 | 601 | # In[38]: 602 | 603 | 604 | stock_interest = 'AAPL' 605 | df2 = df[df.symbol == stock_interest] 606 | df2.drop(['symbol'],1,inplace=True) 607 | df2 = normalize_data(df2) 608 | window = 22 609 | X_train, y_train, X_test, y_test = load_data(df2, window) 610 | model = build_model_baseline([5,window,1]) 611 | model.fit(X_train,y_train,batch_size=512,epochs=90,validation_split=0.1,verbose=1) 612 | plstm2 = model.predict(X_test) 613 | 614 | 615 | # In[123]: 616 | 617 | 618 | # print (y_test) 619 | # print (plstm2) 620 | 621 | i = 1 622 | plt.plot(predictions[0][i*175:(i+1)*175-2],label = 'Prediction') 623 | plt.plot(xx[3][i*175:(i+1)*175-2],label = 'Observation') 624 | plt.plot(predictions2[0][i*175:(i+1)*175-2],label = 'Prediction 2') 625 | plt.plot(plstm2,label='LSTM') 626 | plt.legend(loc='best') 627 | plt.show() 628 | 629 | 630 | # In[124]: 631 | 632 | 633 | i = 1 634 | plt.plot(predictions[1][i*175:(i+1)*175-2],label = 'Prediction') 635 | plt.plot(xx[3][i*175:(i+1)*175-2],label = 'Observation') 636 | plt.plot(predictions2[1][i*175:(i+1)*175-2],label = 'Prediction 2') 637 | plt.plot(plstm2,label='LSTM') 638 | plt.legend(loc='best') 639 | plt.show() 640 | 641 | 642 | # In[100]: 643 | 644 | 645 | print(predictions2[0].shape) 646 | 647 | 648 | # In[ ]: 649 | 650 | 651 | # pay attention to scale 652 | 653 | 654 | # In[133]: 655 | 656 | 657 | # TODO: 658 | # 1. re-normalize 659 | # 2. compare the loss 660 | # 3. try with different symbols 661 | # 4. play with build model two 662 | # df = pd.read_csv("data/prices-split-adjusted.csv", index_col = 0) 663 | # df["adj close"] = df.close # Moving close to the last column 664 | # df.drop(['close'], 1, inplace=True) # Moving close to the last column 665 | df3 = df[df.symbol == 'AAPL'] 666 | df3.drop(['symbol'],1,inplace=True) 667 | 668 | def denormalize(df, normalized_value): 669 | df = df['adj close'].values.reshape(-1,1) 670 | normalized_value = normalized_value.reshape(-1,1) 671 | 672 | #return df.shape, p.shape 673 | min_max_scaler = preprocessing.MinMaxScaler() 674 | a = min_max_scaler.fit_transform(df) 675 | new = min_max_scaler.inverse_transform(normalized_value) 676 | return new 677 | 678 | 679 | # In[50]: 680 | 681 | 682 | newp = denormalize(df3, p[i*175:(i+1)*175-1]) 683 | newxx = denormalize(df, xx[3][i*175:(i+1)*175-1]) 684 | newp2 = denormalize(df3, p2[i*175:(i+1)*175-1]) 685 | newplsm2 = denormalize(df3, plstm2) 686 | obser = denormalize(df3,y_test) 687 | 688 | 689 | # In[53]: 690 | 691 | 692 | plt.plot(newp[0:173],label = 'Prediction') 693 | # plt.plot(newxx,label = 'Observation') 694 | plt.plot(obser[0:173],label = 'Observation') 695 | plt.plot(newp2[0:173],label = 'Prediction 2') 696 | plt.plot(newplsm2[0:173],label='LSTM') 697 | plt.legend(loc='best') 698 | plt.show() 699 | 700 | 701 | # In[151]: 702 | 703 | 704 | i = 1 705 | newp_s8 = denormalize(df3, predictions[0][i*174:(i+1)*174]) 706 | newxx = denormalize(df3, xx[3][i*174:(i+1)*174]) 707 | newp2_s8 = denormalize(df3, predictions2[0][i*174:(i+1)*174]) 708 | newplsm2 = denormalize(df3, plstm2) 709 | # obser = denormalize(df3,y_test) 710 | 711 | 712 | # In[152]: 713 | 714 | 715 | # print(newxx[:10]) 716 | # print(xx[3][i*175:i*175+10]) 717 | # print(predictions[0][i*175:i*175+10]) 718 | 719 | 720 | # In[153]: 721 | 722 | 723 | 724 | # obser = denormalize(df3,y_test) 725 | plt.plot(newp_s8[0:173],label = 'Prediction') 726 | # plt.plot(newxx,label = 'Observation') 727 | plt.plot(newxx[0:173],label = 'Observation') 728 | plt.plot(newp2_s8[0:173],label = 'Prediction 2') 729 | plt.plot(newplsm2[0:173],label='LSTM') 730 | plt.legend(loc='best') 731 | plt.show() 732 | 733 | 734 | # In[159]: 735 | 736 | 737 | i = 1 738 | newp_s12 = denormalize(df3, predictions[1][i*174:(i+1)*174]) 739 | newxx = denormalize(df3, xx[3][i*174:(i+1)*174]) 740 | newp2_s12 = denormalize(df3, predictions2[1][i*174:(i+1)*174]) 741 | newplsm2 = denormalize(df3, plstm2) 742 | plt.plot(newp_s12[0:173],label = 'Prediction') 743 | # plt.plot(newxx,label = 'Observation') 744 | plt.plot(newxx[0:173],label = 'Observation') 745 | plt.plot(newp2_s12[0:173],label = 'Prediction 2') 746 | plt.plot(newplsm2[0:173],label='LSTM') 747 | plt.legend(loc='best') 748 | plt.show() 749 | 750 | 751 | # In[160]: 752 | 753 | 754 | import sklearn.metrics 755 | # mse_t1 = [] 756 | # mse_t2 = [] 757 | # mse_lstm = [] 758 | mse_t1.append(sklearn.metrics.mean_squared_error(newp_s12,newxx)) 759 | mse_t2.append(sklearn.metrics.mean_squared_error(newp2_s12,newxx)) 760 | mse_lstm.append(sklearn.metrics.mean_squared_error(newplsm2,newxx)) 761 | print(mse_t1) 762 | print(mse_t2) 763 | print(mse_lstm) 764 | 765 | 766 | # In[54]: 767 | 768 | 769 | def trend_score(actual, pred): 770 | trendScore = 0 771 | for i in range(len(actual)-1): 772 | if ((actual[i+1]-actual[i])*(pred[i+1]-actual[i])>0): 773 | trendScore=trendScore+1 774 | return trendScore/(len(actual)-1) 775 | 776 | 777 | # In[56]: 778 | 779 | 780 | hitp1 = trend_score(obser, newp) 781 | hitp2 = trend_score(obser, newp2) 782 | hitlstm = trend_score(obser, newplsm2) 783 | print(hitp1) 784 | print(hitp2) 785 | print(hitlstm) 786 | 787 | 788 | # In[155]: 789 | 790 | 791 | hitp1 = trend_score(newxx, newp) 792 | hitp2 = trend_score(newxx, newp2) 793 | hitlstm = trend_score(newxx, newplsm2) 794 | print(hitp1) 795 | print(hitp2) 796 | print(hitlstm) 797 | 798 | 799 | # In[156]: 800 | 801 | 802 | hitp1_s8 = trend_score(newxx, newp_s8) 803 | hitp2_s8 = trend_score(newxx, newp2_s8) 804 | hitlstm = trend_score(newxx, newplsm2) 805 | print(hitp1_s8) 806 | print(hitp2_s8) 807 | print(hitlstm) 808 | 809 | 810 | # In[161]: 811 | 812 | 813 | hitp1_s12 = trend_score(newxx, newp_s12) 814 | hitp2_s12 = trend_score(newxx, newp2_s12) 815 | hitlstm = trend_score(newxx, newplsm2) 816 | print(hitp1_s12) 817 | print(hitp2_s12) 818 | print(hitlstm) 819 | 820 | --------------------------------------------------------------------------------