├── 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 | " symbol | \n",
118 | " open | \n",
119 | " low | \n",
120 | " high | \n",
121 | " volume | \n",
122 | " adj close | \n",
123 | "
\n",
124 | " \n",
125 | " date | \n",
126 | " | \n",
127 | " | \n",
128 | " | \n",
129 | " | \n",
130 | " | \n",
131 | " | \n",
132 | "
\n",
133 | " \n",
134 | " \n",
135 | " \n",
136 | " 2016-01-05 | \n",
137 | " WLTW | \n",
138 | " 123.430000 | \n",
139 | " 122.309998 | \n",
140 | " 126.250000 | \n",
141 | " 2163600.0 | \n",
142 | " 125.839996 | \n",
143 | "
\n",
144 | " \n",
145 | " 2016-01-06 | \n",
146 | " WLTW | \n",
147 | " 125.239998 | \n",
148 | " 119.940002 | \n",
149 | " 125.540001 | \n",
150 | " 2386400.0 | \n",
151 | " 119.980003 | \n",
152 | "
\n",
153 | " \n",
154 | " 2016-01-07 | \n",
155 | " WLTW | \n",
156 | " 116.379997 | \n",
157 | " 114.930000 | \n",
158 | " 119.739998 | \n",
159 | " 2489500.0 | \n",
160 | " 114.949997 | \n",
161 | "
\n",
162 | " \n",
163 | " 2016-01-08 | \n",
164 | " WLTW | \n",
165 | " 115.480003 | \n",
166 | " 113.500000 | \n",
167 | " 117.440002 | \n",
168 | " 2006300.0 | \n",
169 | " 116.620003 | \n",
170 | "
\n",
171 | " \n",
172 | " 2016-01-11 | \n",
173 | " WLTW | \n",
174 | " 117.010002 | \n",
175 | " 114.089996 | \n",
176 | " 117.330002 | \n",
177 | " 1408600.0 | \n",
178 | " 114.970001 | \n",
179 | "
\n",
180 | " \n",
181 | "
\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 | " symbol | \n",
234 | " open | \n",
235 | " low | \n",
236 | " high | \n",
237 | " volume | \n",
238 | " adj close | \n",
239 | "
\n",
240 | " \n",
241 | " date | \n",
242 | " | \n",
243 | " | \n",
244 | " | \n",
245 | " | \n",
246 | " | \n",
247 | " | \n",
248 | "
\n",
249 | " \n",
250 | " \n",
251 | " \n",
252 | " 2016-01-05 | \n",
253 | " WLTW | \n",
254 | " 0.076934 | \n",
255 | " 0.078020 | \n",
256 | " 0.077818 | \n",
257 | " 0.002517 | \n",
258 | " 0.078812 | \n",
259 | "
\n",
260 | " \n",
261 | " 2016-01-06 | \n",
262 | " WLTW | \n",
263 | " 0.078078 | \n",
264 | " 0.076490 | \n",
265 | " 0.077374 | \n",
266 | " 0.002776 | \n",
267 | " 0.075095 | \n",
268 | "
\n",
269 | " \n",
270 | " 2016-01-07 | \n",
271 | " WLTW | \n",
272 | " 0.072480 | \n",
273 | " 0.073254 | \n",
274 | " 0.073747 | \n",
275 | " 0.002896 | \n",
276 | " 0.071904 | \n",
277 | "
\n",
278 | " \n",
279 | " 2016-01-08 | \n",
280 | " WLTW | \n",
281 | " 0.071911 | \n",
282 | " 0.072331 | \n",
283 | " 0.072309 | \n",
284 | " 0.002334 | \n",
285 | " 0.072964 | \n",
286 | "
\n",
287 | " \n",
288 | " 2016-01-11 | \n",
289 | " WLTW | \n",
290 | " 0.072878 | \n",
291 | " 0.072712 | \n",
292 | " 0.072240 | \n",
293 | " 0.001639 | \n",
294 | " 0.071917 | \n",
295 | "
\n",
296 | " \n",
297 | "
\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 | " open | \n",
481 | " low | \n",
482 | " high | \n",
483 | " volume | \n",
484 | " adj close | \n",
485 | "
\n",
486 | " \n",
487 | " date | \n",
488 | " | \n",
489 | " | \n",
490 | " | \n",
491 | " | \n",
492 | " | \n",
493 | "
\n",
494 | " \n",
495 | " \n",
496 | " \n",
497 | " 2010-01-04 | \n",
498 | " 0.157047 | \n",
499 | " 0.161167 | \n",
500 | " 0.156390 | \n",
501 | " 0.131722 | \n",
502 | " 0.159399 | \n",
503 | "
\n",
504 | " \n",
505 | " 2010-01-05 | \n",
506 | " 0.157238 | \n",
507 | " 0.158884 | \n",
508 | " 0.154995 | \n",
509 | " 0.202469 | \n",
510 | " 0.157092 | \n",
511 | "
\n",
512 | " \n",
513 | " 2010-01-06 | \n",
514 | " 0.156140 | \n",
515 | " 0.146049 | \n",
516 | " 0.153341 | \n",
517 | " 0.268184 | \n",
518 | " 0.143942 | \n",
519 | "
\n",
520 | " \n",
521 | " 2010-01-07 | \n",
522 | " 0.142436 | \n",
523 | " 0.134457 | \n",
524 | " 0.140094 | \n",
525 | " 0.432522 | \n",
526 | " 0.132105 | \n",
527 | "
\n",
528 | " \n",
529 | " 2010-01-08 | \n",
530 | " 0.127950 | \n",
531 | " 0.131464 | \n",
532 | " 0.134455 | \n",
533 | " 0.318492 | \n",
534 | " 0.138726 | \n",
535 | "
\n",
536 | " \n",
537 | "
\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": "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\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 |
--------------------------------------------------------------------------------