-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStocktPricePrediction.py
More file actions
706 lines (706 loc) · 68.1 KB
/
StocktPricePrediction.py
File metadata and controls
706 lines (706 loc) · 68.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "e9b58df1-1f87-4a87-8ed9-8c1f10a05183",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[*********************100%***********************] 1 of 1 completed\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2010-01-01 00:00:00+02:00</th>\n",
" <td>3.582293</td>\n",
" <td>3.582293</td>\n",
" <td>3.582293</td>\n",
" <td>3.582293</td>\n",
" <td>3.523511</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-04 00:00:00+02:00</th>\n",
" <td>3.613994</td>\n",
" <td>3.677398</td>\n",
" <td>3.487188</td>\n",
" <td>3.645696</td>\n",
" <td>3.585874</td>\n",
" <td>11846086</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-05 00:00:00+02:00</th>\n",
" <td>3.645696</td>\n",
" <td>3.677398</td>\n",
" <td>3.613994</td>\n",
" <td>3.645696</td>\n",
" <td>3.585874</td>\n",
" <td>7929532</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-06 00:00:00+02:00</th>\n",
" <td>3.645696</td>\n",
" <td>3.677398</td>\n",
" <td>3.550591</td>\n",
" <td>3.613994</td>\n",
" <td>3.554692</td>\n",
" <td>9721300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-07 00:00:00+02:00</th>\n",
" <td>3.550591</td>\n",
" <td>3.582293</td>\n",
" <td>3.518889</td>\n",
" <td>3.550591</td>\n",
" <td>3.492329</td>\n",
" <td>7407485</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Open High Low Close Adj Close \\\n",
"Date \n",
"2010-01-01 00:00:00+02:00 3.582293 3.582293 3.582293 3.582293 3.523511 \n",
"2010-01-04 00:00:00+02:00 3.613994 3.677398 3.487188 3.645696 3.585874 \n",
"2010-01-05 00:00:00+02:00 3.645696 3.677398 3.613994 3.645696 3.585874 \n",
"2010-01-06 00:00:00+02:00 3.645696 3.677398 3.550591 3.613994 3.554692 \n",
"2010-01-07 00:00:00+02:00 3.550591 3.582293 3.518889 3.550591 3.492329 \n",
"\n",
" Volume \n",
"Date \n",
"2010-01-01 00:00:00+02:00 0 \n",
"2010-01-04 00:00:00+02:00 11846086 \n",
"2010-01-05 00:00:00+02:00 7929532 \n",
"2010-01-06 00:00:00+02:00 9721300 \n",
"2010-01-07 00:00:00+02:00 7407485 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import math \n",
"import numpy as np \n",
"import pandas as pd \n",
"from datetime import date, timedelta, datetime\n",
"from pandas.plotting import register_matplotlib_converters\n",
"import matplotlib.pyplot as plt \n",
"import matplotlib.dates as mdates \n",
"import tensorflow as tf\n",
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n",
"from tensorflow.keras import Sequential \n",
"from tensorflow.keras.layers import LSTM, Dense, Dropout, BatchNormalization\n",
"from tensorflow.keras.callbacks import EarlyStopping,ModelCheckpoint\n",
"from sklearn.preprocessing import RobustScaler, MinMaxScaler \n",
"import seaborn as sns \n",
"\n",
"end_date = date.today().strftime(\"%Y-%m-%d\")\n",
"start_date = '2010-01-01'\n",
"\n",
"stockname = 'Turkish Airlines'\n",
"symbol = 'THYAO.IS'\n",
"\n",
"import yfinance as yf \n",
"df = yf.download(symbol, start=start_date, end=end_date)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "1c7e0047-7119-442d-b8f9-2a3f2559322c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"FEATURE LIST\n",
"['High', 'Low', 'Open', 'Close', 'Volume']\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Open</th>\n",
" <th>Close</th>\n",
" <th>Volume</th>\n",
" <th>Prediction</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2023-01-30 00:00:00+03:00</th>\n",
" <td>150.300</td>\n",
" <td>144.800</td>\n",
" <td>150.000</td>\n",
" <td>144.800</td>\n",
" <td>48666913</td>\n",
" <td>144.800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-01-31 00:00:00+03:00</th>\n",
" <td>144.500</td>\n",
" <td>137.600</td>\n",
" <td>144.500</td>\n",
" <td>137.600</td>\n",
" <td>65737449</td>\n",
" <td>137.600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-02-01 00:00:00+03:00</th>\n",
" <td>140.300</td>\n",
" <td>130.800</td>\n",
" <td>139.100</td>\n",
" <td>130.800</td>\n",
" <td>64560389</td>\n",
" <td>130.800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-02-02 00:00:00+03:00</th>\n",
" <td>136.400</td>\n",
" <td>125.100</td>\n",
" <td>130.200</td>\n",
" <td>134.600</td>\n",
" <td>103057422</td>\n",
" <td>134.600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2023-02-03 00:00:00+03:00</th>\n",
" <td>143.400</td>\n",
" <td>133.200</td>\n",
" <td>134.600</td>\n",
" <td>142.700</td>\n",
" <td>77657983</td>\n",
" <td>142.700</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" High Low Open Close Volume \\\n",
"Date \n",
"2023-01-30 00:00:00+03:00 150.300 144.800 150.000 144.800 48666913 \n",
"2023-01-31 00:00:00+03:00 144.500 137.600 144.500 137.600 65737449 \n",
"2023-02-01 00:00:00+03:00 140.300 130.800 139.100 130.800 64560389 \n",
"2023-02-02 00:00:00+03:00 136.400 125.100 130.200 134.600 103057422 \n",
"2023-02-03 00:00:00+03:00 143.400 133.200 134.600 142.700 77657983 \n",
"\n",
" Prediction \n",
"Date \n",
"2023-01-30 00:00:00+03:00 144.800 \n",
"2023-01-31 00:00:00+03:00 137.600 \n",
"2023-02-01 00:00:00+03:00 130.800 \n",
"2023-02-02 00:00:00+03:00 134.600 \n",
"2023-02-03 00:00:00+03:00 142.700 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df = df.sort_values(by=['Date']).copy()\n",
"\n",
"FEATURES = ['High', 'Low', 'Open', 'Close', 'Volume'\n",
" ,# 'Month' , 'Year', 'Adj Close'\n",
" ]\n",
"\n",
"print('FEATURE LIST')\n",
"print([f for f in FEATURES])\n",
"\n",
"data = pd.DataFrame(train_df)\n",
"data_filtered = data[FEATURES]\n",
"\n",
"data_filtered_ext = data_filtered.copy()\n",
"data_filtered_ext['Prediction'] = data_filtered_ext['Close']"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "b79dfa07-ae97-42ca-8d22-42b914093677",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3375, 5)\n"
]
}
],
"source": [
"nrows = data_filtered.shape[0]\n",
"\n",
"np_data_unscaled = np.array(data_filtered)\n",
"np_data = np.reshape(np_data_unscaled, (nrows, -1))\n",
"print(np_data.shape)\n",
"\n",
"scaler = MinMaxScaler()\n",
"np_data_scaled = scaler.fit_transform(np_data_unscaled)\n",
"\n",
"scaler_pred = MinMaxScaler()\n",
"df_Close = pd.DataFrame(data_filtered_ext['Close'])\n",
"np_Close_scaled = scaler_pred.fit_transform(df_Close)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "83c0acb1-cccb-4f7f-bc14-522b19af60d7",
"metadata": {},
"outputs": [],
"source": [
"np.set_printoptions(precision=3)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "b434b6a1-ada6-4a9d-b1ad-ce3e625933c3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(2650, 50, 5) (2650,)\n",
"(675, 50, 5) (675,)\n",
"0.01081344028732197\n",
"0.01081344028732197\n"
]
}
],
"source": [
"sequence_length = 50\n",
"\n",
"index_Close = data.columns.get_loc(\"Close\")\n",
"\n",
"# Verileri train test olarak ayırın.\n",
"# Verilerin %80 ini eğitim için kullanacağız.\n",
"train_data_len = math.ceil(np_data_scaled.shape[0] * 0.8)\n",
"\n",
"train_data = np_data_scaled[0:train_data_len, :]\n",
"test_data = np_data_scaled[train_data_len - sequence_length:, :]\n",
"\n",
"# Model için verileri bu biçime dönüştürün : [samples, time steps, features] \n",
"def partition_dataset(sequence_length, data):\n",
" x, y = [], []\n",
" data_len = data.shape[0]\n",
" for i in range(sequence_length, data_len):\n",
" x.append(data[i-sequence_length:i,:]) \n",
" y.append(data[i, index_Close]) \n",
"\n",
" # Sonra bunları numpy array'e dönüştür. \n",
" x = np.array(x)\n",
" y = np.array(y)\n",
" return x, y\n",
"\n",
"x_train, y_train = partition_dataset(sequence_length, train_data)\n",
"x_test, y_test = partition_dataset(sequence_length, test_data)\n",
"\n",
"print(x_train.shape, y_train.shape)\n",
"print(x_test.shape, y_test.shape)\n",
"\n",
"# İkinci girdi örneğinin son kapanış fiyatı ilk tahmin değerine eşit olmalıdır.\n",
"print(x_train[1][sequence_length-1][index_Close])\n",
"print(y_train[0])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "944d0cc8-4813-487d-af95-8357ffaa6c25",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"250 50 5\n"
]
}
],
"source": [
"model = Sequential()\n",
"\n",
"n_neurons = x_train.shape[1] * x_train.shape[2]\n",
"print(n_neurons, x_train.shape[1], x_train.shape[2])\n",
"\n",
"model.add(LSTM(n_neurons, return_sequences=True, input_shape=(x_train.shape[1], x_train.shape[2]))) \n",
"\n",
"model.add(LSTM(n_neurons, return_sequences=False))\n",
"\n",
"model.add(Dense(5))\n",
"\n",
"model.add(Dense(1))\n",
"\n",
"model.compile(optimizer='adam', loss='mse')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "90843b73-e031-4e4e-b40c-84c0c327fe31",
"metadata": {},
"outputs": [],
"source": [
"callbacks = EarlyStopping(monitor = \"loss\",patience = 8,verbose = 1)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "ebce5845-5744-4348-8ecb-0036f08ee47a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"166/166 [==============================] - 19s 94ms/step - loss: 6.2669e-05 - val_loss: 0.0013\n",
"Epoch 2/50\n",
"166/166 [==============================] - 14s 87ms/step - loss: 1.2675e-05 - val_loss: 5.2799e-04\n",
"Epoch 3/50\n",
"166/166 [==============================] - 14s 86ms/step - loss: 9.1138e-06 - val_loss: 6.5937e-04\n",
"Epoch 4/50\n",
"166/166 [==============================] - 15s 88ms/step - loss: 7.7524e-06 - val_loss: 0.0013\n",
"Epoch 5/50\n",
"166/166 [==============================] - 15s 88ms/step - loss: 9.4702e-06 - val_loss: 6.0444e-04\n",
"Epoch 6/50\n",
"166/166 [==============================] - 15s 91ms/step - loss: 6.9981e-06 - val_loss: 5.0480e-04\n",
"Epoch 7/50\n",
"166/166 [==============================] - 17s 104ms/step - loss: 6.3855e-06 - val_loss: 7.8252e-04\n",
"Epoch 8/50\n",
"166/166 [==============================] - 17s 100ms/step - loss: 6.1963e-06 - val_loss: 5.3397e-04\n",
"Epoch 9/50\n",
"166/166 [==============================] - 16s 96ms/step - loss: 6.4832e-06 - val_loss: 6.9496e-04\n",
"Epoch 10/50\n",
"166/166 [==============================] - 16s 95ms/step - loss: 6.3773e-06 - val_loss: 2.7291e-04\n",
"Epoch 11/50\n",
"166/166 [==============================] - 16s 97ms/step - loss: 7.3216e-06 - val_loss: 5.1724e-04\n",
"Epoch 12/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 5.4264e-06 - val_loss: 5.7465e-04\n",
"Epoch 13/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 5.0695e-06 - val_loss: 9.0038e-04\n",
"Epoch 14/50\n",
"166/166 [==============================] - 16s 97ms/step - loss: 5.5047e-06 - val_loss: 3.8271e-04\n",
"Epoch 15/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 4.8325e-06 - val_loss: 1.7964e-04\n",
"Epoch 16/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 4.3743e-06 - val_loss: 3.8342e-04\n",
"Epoch 17/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 4.6765e-06 - val_loss: 4.8678e-04\n",
"Epoch 18/50\n",
"166/166 [==============================] - 16s 96ms/step - loss: 4.3197e-06 - val_loss: 7.1517e-04\n",
"Epoch 19/50\n",
"166/166 [==============================] - 16s 96ms/step - loss: 4.0351e-06 - val_loss: 7.0832e-04\n",
"Epoch 20/50\n",
"166/166 [==============================] - 16s 97ms/step - loss: 4.7843e-06 - val_loss: 3.1526e-04\n",
"Epoch 21/50\n",
"166/166 [==============================] - 17s 100ms/step - loss: 5.5624e-06 - val_loss: 5.5475e-04\n",
"Epoch 22/50\n",
"166/166 [==============================] - 17s 105ms/step - loss: 4.3196e-06 - val_loss: 4.6126e-04\n",
"Epoch 23/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 4.4442e-06 - val_loss: 2.1733e-04\n",
"Epoch 24/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.6965e-06 - val_loss: 1.9020e-04\n",
"Epoch 25/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 3.6469e-06 - val_loss: 3.3181e-04\n",
"Epoch 26/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 4.0283e-06 - val_loss: 7.6043e-04\n",
"Epoch 27/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 4.5140e-06 - val_loss: 3.2403e-04\n",
"Epoch 28/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.4815e-06 - val_loss: 8.2453e-04\n",
"Epoch 29/50\n",
"166/166 [==============================] - 17s 100ms/step - loss: 3.6797e-06 - val_loss: 1.9892e-04\n",
"Epoch 30/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 4.6198e-06 - val_loss: 4.5724e-04\n",
"Epoch 31/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 3.4136e-06 - val_loss: 1.7638e-04\n",
"Epoch 32/50\n",
"166/166 [==============================] - 17s 100ms/step - loss: 3.3620e-06 - val_loss: 3.0634e-04\n",
"Epoch 33/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.4192e-06 - val_loss: 1.6359e-04\n",
"Epoch 34/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.6273e-06 - val_loss: 1.8038e-04\n",
"Epoch 35/50\n",
"166/166 [==============================] - 17s 100ms/step - loss: 3.5885e-06 - val_loss: 1.9309e-04\n",
"Epoch 36/50\n",
"166/166 [==============================] - 17s 100ms/step - loss: 3.8726e-06 - val_loss: 2.3350e-04\n",
"Epoch 37/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.7766e-06 - val_loss: 1.8495e-04\n",
"Epoch 38/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.5671e-06 - val_loss: 3.0538e-04\n",
"Epoch 39/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 3.2608e-06 - val_loss: 2.7266e-04\n",
"Epoch 40/50\n",
"166/166 [==============================] - 17s 101ms/step - loss: 3.6492e-06 - val_loss: 4.3421e-04\n",
"Epoch 41/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 3.2745e-06 - val_loss: 3.1552e-04\n",
"Epoch 42/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.7057e-06 - val_loss: 4.0314e-04\n",
"Epoch 43/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.5208e-06 - val_loss: 1.9599e-04\n",
"Epoch 44/50\n",
"166/166 [==============================] - 17s 100ms/step - loss: 3.2838e-06 - val_loss: 2.5376e-04\n",
"Epoch 45/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.2311e-06 - val_loss: 2.4984e-04\n",
"Epoch 46/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.5953e-06 - val_loss: 4.1739e-04\n",
"Epoch 47/50\n",
"166/166 [==============================] - 16s 99ms/step - loss: 3.4862e-06 - val_loss: 2.0802e-04\n",
"Epoch 48/50\n",
"166/166 [==============================] - 17s 101ms/step - loss: 3.7598e-06 - val_loss: 1.4387e-04\n",
"Epoch 49/50\n",
"166/166 [==============================] - 17s 99ms/step - loss: 3.5017e-06 - val_loss: 1.8391e-04\n",
"Epoch 50/50\n",
"166/166 [==============================] - 16s 98ms/step - loss: 3.6049e-06 - val_loss: 1.2879e-04\n"
]
}
],
"source": [
"epochs = 50\n",
"batch_size = 16\n",
"history = model.fit(x_train, y_train, \n",
" batch_size=batch_size, \n",
" epochs=epochs,\n",
" validation_data=(x_test, y_test),\n",
" callbacks = [callbacks] \n",
" )\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "b1c59f62-c808-4753-ba45-572c2358f974",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"22/22 [==============================] - 2s 67ms/step\n",
"R2: 0.998\n",
"Median Absolute Error (MAE): 0.86\n",
"Mean Absolute Percentage Error (MAPE): 2.16 %\n",
"Median Absolute Percentage Error (MDAPE): 1.53 %\n"
]
}
],
"source": [
"y_pred_scaled = model.predict(x_test)\n",
"\n",
"y_pred = scaler_pred.inverse_transform(y_pred_scaled)\n",
"y_test_unscaled = scaler_pred.inverse_transform(y_test.reshape(-1, 1))\n",
"\n",
"R2 = r2_score(y_test_unscaled, y_pred)\n",
"print(f'R2: {np.round(R2, 3)}')\n",
"\n",
"MAE = mean_absolute_error(y_test_unscaled, y_pred)\n",
"print(f'Median Absolute Error (MAE): {np.round(MAE, 2)}')\n",
"\n",
"MAPE = np.mean((np.abs(np.subtract(y_test_unscaled, y_pred)/ y_test_unscaled))) * 100\n",
"print(f'Mean Absolute Percentage Error (MAPE): {np.round(MAPE, 2)} %')\n",
"\n",
"MDAPE = np.median((np.abs(np.subtract(y_test_unscaled, y_pred)/ y_test_unscaled)) ) * 100\n",
"print(f'Median Absolute Percentage Error (MDAPE): {np.round(MDAPE, 2)} %')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "d96fec94-55bd-4e47-b488-64bc030d5e72",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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aQ3aZdgVERERERGRtk1htx2ZPn06V155ZaTLEBERERERaXIKu21AKBSKdAkiIiIiIiItSrubjXlHN1z7KgsXbAxrm8NHdue+v59Z7zG33nor6enpXH311QDccsstdOrUiauuumqn47788ktuu+020tLSWL58OZMnT+axxx7D5XKRmJjItddey8cff8wDDzzAunXr+Mc//oHf72fChAk89thjuN1unnvuOe655x6ysrIYMGAAMTExYb1fERERERGRlkg9uxFw8cUX8/zzzwPgOA6vvvoq55xzTq3Hzp49mwceeIBFixaxevVq3nrrLQAqKioYOnQos2bNIi0tjddee41vv/2WBQsW4Ha7eemll8jOzub222/n22+/5dNPP2XJkiXNdo8iIiIiIiKR1K57dvfUA9tUevXqRVpaGvPnzycnJ4dRo0aRlpZW67Hjx4+nT58+AJx11ll88803nHrqqbjdbk455RQAZsyYwbx58xg3bhwAPp+PzMxMZs2axZQpU8jIyADgjDPOYMWKFc1whyIiIiIiIpHVrsNuJF1yySVMnz6drVu3ctFFF9V53K5L/Wx7HRsbi9vtBsBaywUXXMA999yz07HvvPOOlgoSEREREZF2ScOYI+Skk07io48+Ys6cORx55JF1Hjd79mzWrl2L4zi89tprHHjggbsdM3XqVN58801yc3MBKCwsZP369UyYMIEvv/ySgoICAoEAb7zxRpPdj4iIiIiISEuint0IiY6O5pBDDiE1NXV7D21tJk2axI033siiRYuYPHkyJ5100m7HDB48mL/85S8cccQROI6Dx+Phn//8JxMnTuSOO+5g0qRJZGVlMXr0aM3cLCIiIiIi7YLCboQ4jsMPP/ywx97W+Ph4Xnvttd22l5eX7/T6jDPO4IwzztjtuF/96lf86le/2rdiRUREREREWhkNY46AJUuW0K9fP6ZOnUr//v0jXY6IiIiIiLQzpdfsj1NeHOkympR6diNg8ODBrFmzZvvrRYsWcd555+10TExMzPbZlEVERERERMLJyVmHs3EZrv0mRrqUJqOw2wIMGzaMBQsWRLoMERERERFpB6zjAOAU50S4kqalYcwiIiIiIiLtSaASACdvQ4QLaVoKuyIiIiIiIu2IrfIBENq8KsKVNC2FXRERERERkXbEVnnBGII/foqtrIh0OU1GYVdERERERKQ9qfLhyuqLe9AE/N+9g1NRgg0GIl1V2CnstmDr1q3j5Zdf3qtz999//zBXIyIiIiIibYGt8mJi4ok57Hz8M/5N6aX7Ufnq3ZEuK+wiFnaNMc8aY3KNMYt32HaHMWazMWZBza+jd9h3kzFmlTFmuTHmyMhU3bzqC7vBYLDec7/77rumKElERERERFo5W+WFmHiihh2MLS8CILRxWYSrCr9ILj00HXgUeGGX7Q9aa+/fcYMxZjBwJjAE6AJ8ZowZYK0N7UsBt73s5ecN+9TEbob0cHPn2fH1HnPrrbeSnp7O1VdfDcAtt9xCp06duOqqq3Y67sYbb2Tp0qWMHDmSCy64gA4dOvD+++9TWVlJRUUF7733HieccAJFRUUEAgH+8pe/cMIJJwCQmJhIeXk5X375JXfccQfp6eksXryYMWPG8OKLL2KMCet9i4iIiIhIK1HlpcRrOf+ER7khK4vBbMTWzNDclkSsZ9da+zVQ2MDDTwBetdZWWWvXAquA8U1WXBO7+OKLef755wFwHIdXX32Vc845Z7fj7r33Xg466CAWLFjANddcA8D333/P888/z+eff05sbCxvv/02P/74I1988QXXXXcd1trd2pk/fz4PPfQQS5YsYc2aNXz77bdNe4MiIiIiItJi2SofheUOoWCInzZWr7lrvWURrir8ItmzW5crjTHnA3OB66y1RUBX4IcdjtlUs22f7KkHtqn06tWLtLQ05s+fT05ODqNGjSItLa1B5x5++OF07NgRAGstN998M19//TUul4vNmzeTk5ND586ddzpn/PjxdOvWDYCRI0eybt06DjzwwPDelIiIiIiItAq2yosvFMXosb3oWdYLcudiSwsIrvmJqD4jIl1e2LS0CaoeB/oCI4Fs4IGa7bWNud29CxMwxlxmjJlrjJmbl5fXJEWGwyWXXML06dN57rnnuOiiixp8XkJCwvavX3rpJfLy8pg3bx4LFiygU6dOVFbuPvwgJiZm+9dut3uPz/uKiIiIiEgbVuWlImBITY0nevw0ZvkHET35dILzP4t0ZWHVosKutTbHWhuy1jrAU/wyVHkT0H2HQ7sBW+po40lr7Vhr7diMjIymLXgfnHTSSXz00UfMmTOHI4+sfb6tpKQkysrqHk5QUlJCZmYmHo+HL774gvXr1zdVuSIiIiIi0kbYygrK/S5SUuPpNmoUv1+yP66sPoRy2laeaFHDmI0xWdba7JqXJwHbZmp+D3jZGPN3qieo6g/MjkCJYRMdHc0hhxxCamoqbre71mOGDx9OVFQUI0aM4MILL6RDhw477T/nnHM47rjjGDt2LCNHjmTQoEHNUbqIiIiIiLRiTsFmtlbFk5EaT1aXFLK3FOPu1Av/5y9GurSwiljYNca8AkwB0o0xm4DbgSnGmJFUD1FeB/wawFr7szHmdWAJEASu2NeZmCPNcRx++OEH3njjjTqP8Xg8zJgxY6dtF1544fav09PT+f7772s9t7y8HIApU6YwZcqU7dsfffTRvS9aRERERERaPSd3A+vLU+ibHEdychyhkGX26iCDstdGurSwiljYtdaeVcvmZ+o5/i7grqarqPksWbKEY489lpNOOon+/ftHuhwREREREWlHnNz1rCoez0mpcRhjMAYOO+E51p1ehvWVY+ISI11iWLSoYcztxeDBg1mzZs3214sWLeK8887b6ZiYmBhmzZrV3KWJiIiIiEgr533uZjzDD8YzZve5gazj4ORvZmVBFKmp1avTeL1+wLC5KomOOeuI6jW0mStuGgq7LcCwYcNYsGBBpMsQEREREZFWzgaq8H86HaytPex6S8ETQ05BFSk1YXfM2F6cdMoYVn/0Iz1XL6djGwm7LWo2ZhEREREREdl7oY3LADAxcbXutxXFmIRUysqqSEurXtZ05g+3cO0N0/CndGPdnB+brdamprArIiIiIiLSgjmlBVjvL0uSWsfBydtU+7H5mwEo2by51v22rIhgTBIZmUm4XDvHwZR+AyleuTRMVUeewq6IiIiIiEgLVvnG36j6dPr216FV86h48OJaj3UKNuOkduGbD36odb+tKKbSnUjnrJTd9vUaNxqTvyEsNbcECrst2Lp163j55Zf3+vy77747jNWIiIiIiEgkONlrcHJ/CaFOUQ5Oaf7217ay4pev8zfjyxhAWowfvz+4W1u2rIgKG0unTsm77et/wHgyTDElJd4w30FkKOy2YAq7IiIiIiISylmLk//LsGVbmo8tK6r+OlBF6ZVjcSpKgOqe3cKEXqTF+Ckq2j202vJCSkMxdM5K3W2fp1MPMmOrWLNiS9PcSDNT2I2AW2+9lYcffnj761tuuYV//OMfux134403MnPmTEaOHMmDDz5IKBTihhtuYNy4cQwfPpwnnngCgOzsbCZPnszI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uvF5/6sJLPqK9CSzc9jN3cgczzhCR1+toNtEFHZFRERERETCrcpHlfXgTknHM3h/xkUtp6z0l6HN1ldGTomll57VbTIKuyIiIiIiImFm/T4qnSji46PxHHQaI/zzKC39pWfX+srILgzQs1daBKts2xR2RUREREREwsxW+fCF3NVhd+ShpAeyeeGB13jmqa+r91dWkFdm6ZiWGOFK2y6FXRERERERkXDz+/AF3cTFRWM8MWzutD+n9NzM0iVbgOqe3fxySErS87pNRWFXREREREQkzGyVD2/QRUJCNABFPQ9ialYu6enVPbmhilLKA25iYrRATlNR2BUREREREQkz6/dR4XcRH18ddn2eZFKiA0RHV4fbUHkpjiceY0wky2zTFHZFRERERETCrcpLud8QFx8DgI2JJyEqREVFFQAhbxlOTEIkK2zzFHZFRERERETCzFb5KPOb7T27x5yyP2kJFm+Fv/oAXzkmLimCFbZ9CrsiIiIiIiJhZr2llPogvuaZXVdCMjG2isu3/BFrLVSW44rTTMxNSWFXREREREQkzEJrF7GoIHF7z65xuQFIsmWU3TKNEr8H4pMjWWKbp7ArIiIiIiISRtbvI7RxCT9k/xJ2d/Rjh8MZ9do41m4oiUB17YfCroiIiIiISBiF1izEZPXHTzQez85LCy3xdebCh7IJWhcrlm+NUIXtgxZ1EhERERERCaPgijn4sobSOWv3uFVQGuCU08Zyznn7U1xUEYHq2g+FXRERERERkTAKrphDXvoBdOlSuNs+X9DNuefvz6jRPSNQWfuiYcwiIiIiIiJhYq0ltGIua+lBl66pu+3f6I1n+IjuzV9YO6SeXRERERERkTBxtq6B2ATWFrrI6pK6077kR+ZyRqnB7VafY3NQ2BUREREREQkTJ28j7k69WL58KwMHdt5pnyutC93SIlRYO6QfKYiIiIiIiISJLc6j3J3Cf9+ZzxlnT4h0Oe2aenZFRERERETCoKTES85PS5g/L5/fXXcynTunRLqkdk1hV0REREREJAzeu/1uir//jHxXOje/eFiky2n3FHZFRERERET2kXUcjst9lkBvw/PBUcTEeCJdUrunZ3ZFRERERET2kbN1DQAelyWms5YWagkiFnaNMc8aY3KNMYt32NbRGPOpMWZlze8ddth3kzFmlTFmuTHmyMhULSIiIiIisrvQmoXb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\n",
"text/plain": [
"<Figure size 1152x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Tarihin görüntülendiği tarih\n",
"display_start_date = \"2019-01-01\" \n",
"\n",
"# Geçerli ve tahmini fiyatlar arasındaki fark\n",
"train = pd.DataFrame(data_filtered_ext['Close'][:train_data_len + 1]).rename(columns={'Close': 'y_train'})\n",
"valid = pd.DataFrame(data_filtered_ext['Close'][train_data_len:]).rename(columns={'Close': 'y_test'})\n",
"valid.insert(1, \"y_pred\", y_pred, True)\n",
"valid.insert(1, \"residuals\", valid[\"y_pred\"] - valid[\"y_test\"], True)\n",
"df_union = pd.concat([train, valid])\n",
"\n",
"# Daha yakın bir zaman dilimine yakınlaştırın\n",
"df_union_zoom = df_union[df_union.index > display_start_date]\n",
"\n",
"fig, ax1 = plt.subplots(figsize=(16, 8))\n",
"plt.title(\"y_pred vs y_test\")\n",
"plt.ylabel(stockname, fontsize=18)\n",
"sns.set_palette([\"#090364\", \"#1960EF\", \"#EF5919\"])\n",
"sns.lineplot(data=df_union_zoom[['y_pred', 'y_train', 'y_test']], linewidth=1.0, dashes=False, ax=ax1)\n",
"\n",
"# Farkların grafiği\n",
"df_sub = [\"#2BC97A\" if x > 0 else \"#C92B2B\" for x in df_union_zoom[\"residuals\"].dropna()]\n",
"ax1.bar(height=df_union_zoom['residuals'].dropna(), x=df_union_zoom['residuals'].dropna().index, width=3, label='residuals', color=df_sub)\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "b8d9a078-dc88-4068-9398-984d79e99867",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1/1 [==============================] - 0s 20ms/step\n",
"The close price for Turkish Airlines at 2023-02-06 was 142.7\n",
"The predicted close price is 138.6199951171875 (-2.94%)\n"
]
}
],
"source": [
"df_temp = df[-sequence_length:]\n",
"new_df = df_temp.filter(FEATURES)\n",
"\n",
"N = sequence_length\n",
"\n",
"# Son N günlük kapanış fiyatı değerlerini alın ve verileri 0 ile 1 arasında değerler olacak şekilde ölçeklendirin\n",
"last_N_days = new_df[-sequence_length:].values\n",
"last_N_days_scaled = scaler.transform(last_N_days)\n",
"\n",
"# Boş bir liste oluşturun ve son N günü ekleyin\n",
"X_test_new = []\n",
"X_test_new.append(last_N_days_scaled)\n",
"\n",
"# X_test veri kümesini numpy dizisine dönüştürün ve verileri tekrar eski haline çevirin\n",
"pred_price_scaled = model.predict(np.array(X_test_new))\n",
"pred_price_unscaled = scaler_pred.inverse_transform(pred_price_scaled.reshape(-1, 1))\n",
"\n",
"# Bir sonraki gün için son fiyatı ve tahmini fiyatı yazdırın\n",
"price_today = np.round(new_df['Close'][-1], 2)\n",
"predicted_price = np.round(pred_price_unscaled.ravel()[0], 2)\n",
"change_percent = np.round(100 - (price_today * 100)/predicted_price, 2)\n",
"\n",
"plus = '+'; minus = ''\n",
"print(f'The close price for {stockname} at {end_date} was {price_today}')\n",
"print(f'The predicted close price is {predicted_price} ({plus if change_percent > 0 else minus}{change_percent}%)')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}