├── AppleStockAnalysis.ipynb ├── BitcoinPredictionRNN.ipynb ├── Bitcoinprediction.py ├── CryptoScraper.ipynb ├── LICENSE ├── MLPresentation.pdf ├── Machine_Learning_Project_Report.pdf ├── PredictStockPricesRNN.py ├── README.md └── RedditScraper.ipynb /AppleStockAnalysis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "AppleStockAnalysis.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "id": "view-in-github", 21 | "colab_type": "text" 22 | }, 23 | "source": [ 24 | "\"Open" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": { 30 | "id": "8yDlnoA-xbTy", 31 | "colab_type": "text" 32 | }, 33 | "source": [ 34 | "# Apple Stock prediction Recurrent Neural Network\n", 35 | "\n", 36 | "Please Note, this notebook is only for exploration purpose and is meant to explore application of LSTMs into financial markets. Please don't trade or make decisions based on these analysis. " 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "metadata": { 42 | "id": "NEG0TzxOShBM", 43 | "colab_type": "code", 44 | "colab": {} 45 | }, 46 | "source": [ 47 | "!pip install yfinance\n", 48 | "!conda install -c pytorch pytorch-nightly-cpu -y \n", 49 | "!conda install -c fastai torchvision-nightly-cpu -y \n", 50 | "!conda install -c fastai fastai -y \n", 51 | "!pip install tensorflow\n", 52 | "!pip install fastai\n", 53 | "!conda install nb_conda -y\n", 54 | "!pip install dataclasses\n", 55 | "!pip install fastai==0.7.0\n", 56 | "!pip install keras\n", 57 | "!pip install --upgrade pip\n", 58 | "!conda remove seaborn -y\n", 59 | "!pip uninstall seaborn \n", 60 | "!pip3 --no-cache-dir install seaborn " 61 | ], 62 | "execution_count": 0, 63 | "outputs": [] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "metadata": { 68 | "id": "1YjrU5aqSiIr", 69 | "colab_type": "code", 70 | "colab": { 71 | "base_uri": "https://localhost:8080/", 72 | "height": 34 73 | }, 74 | "outputId": "9ed3e1fe-9864-4742-849b-542d13275169" 75 | }, 76 | "source": [ 77 | "import yfinance as yf\n", 78 | "import matplotlib.pyplot as plt\n", 79 | "import numpy as np\n", 80 | "import pandas as pd\n", 81 | "import seaborn; seaborn.set()\n", 82 | "import datetime\n", 83 | "import pandas as pd\n", 84 | "from keras.models import Sequential\n", 85 | "from keras.layers import Dense, Activation\n", 86 | "import seaborn as sns\n", 87 | "sns.set()\n", 88 | "%load_ext autoreload\n", 89 | "%autoreload 2\n", 90 | "%matplotlib inline\n", 91 | "from fastai.imports import *\n", 92 | "from fastai.structured import *\n", 93 | "from pandas_summary import DataFrameSummary\n", 94 | "from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\n", 95 | "from IPython.display import display\n", 96 | "from sklearn import metrics" 97 | ], 98 | "execution_count": 85, 99 | "outputs": [ 100 | { 101 | "output_type": "stream", 102 | "text": [ 103 | "Using TensorFlow backend.\n" 104 | ], 105 | "name": "stderr" 106 | } 107 | ] 108 | }, 109 | { 110 | "cell_type": "markdown", 111 | "metadata": { 112 | "id": "MBPNT_XqZIcj", 113 | "colab_type": "text" 114 | }, 115 | "source": [ 116 | "### We will do this in 2 steps:\n", 117 | "\n", 118 | "\n", 119 | "1. Fundamental analysis using Yahoo Finance API\n", 120 | "2. Applying Recurrent Neural Network\n", 121 | "\n" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": { 127 | "id": "F1mFDySKydB1", 128 | "colab_type": "text" 129 | }, 130 | "source": [ 131 | "## Fundamental analysis" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "metadata": { 137 | "id": "5Tssn1a4Wz_9", 138 | "colab_type": "code", 139 | "outputId": "754fdb1c-6851-4efd-9f93-a9f0240ff51e", 140 | "colab": { 141 | "base_uri": "https://localhost:8080/", 142 | "height": 1000 143 | } 144 | }, 145 | "source": [ 146 | "apple=yf.Ticker(\"AAPL\")\n", 147 | "pd.DataFrame(list(apple.info.items()))\n", 148 | "#print(apple.actions)" 149 | ], 150 | "execution_count": 86, 151 | "outputs": [ 152 | { 153 | "output_type": "execute_result", 154 | "data": { 155 | "text/html": [ 156 | "
\n", 157 | "\n", 170 | "\n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | "
01
0languageen-US
1regionUS
2quoteTypeEQUITY
3quoteSourceNameDelayed Quote
4currencyUSD
5priceHint2
6shortNameApple Inc.
7marketus_market
8regularMarketPrice236.41
9regularMarketTime1571428801
10regularMarketChange1.13
11regularMarketOpen234.59
12regularMarketDayHigh237.58
13regularMarketDayLow234.29
14regularMarketVolume21772221
15exchangeDataDelayedBy0
16marketStateCLOSED
17exchangeNMS
18twoHundredDayAverageChangePercent0.153417
19marketCap1068384059392
20forwardPE18.5274
21priceToBook11.1064
22sourceInterval15
23exchangeTimezoneNameAmerica/New_York
24exchangeTimezoneShortNameEDT
25gmtOffSetMilliseconds-14400000
26esgPopulatedFalse
27tradeableTrue
28triggerableTrue
29messageBoardIdfinmb_24937
.........
40financialCurrencyUSD
41postMarketPrice236.21
42postMarketChange-0.199997
43regularMarketChangePercent0.480281
44regularMarketDayRange234.29 - 237.58
45bid236.21
46ask236.37
47bidSize14
48askSize9
49trailingAnnualDividendRate2.96
50trailingAnnualDividendYield0.0125808
51epsTrailingTwelveMonths11.777
52epsForward12.76
53fullExchangeNameNasdaqGS
54longNameApple Inc.
55averageDailyVolume3Month28456101
56averageDailyVolume10Day25089957
57fiftyTwoWeekLowChange94.41
58fiftyTwoWeekLowChangePercent0.664859
59fiftyTwoWeekRange142.0 - 238.13
60fiftyTwoWeekHighChange-1.72
61fiftyTwoWeekHighChangePercent-0.00722295
62fiftyTwoWeekLow142
63fiftyTwoWeekHigh238.13
64dividendDate1565827200
65earningsTimestamp1572480000
66earningsTimestampStart1572480000
67earningsTimestampEnd1572480000
68trailingPE20.0739
69symbolAAPL
\n", 486 | "

70 rows × 2 columns

\n", 487 | "
" 488 | ], 489 | "text/plain": [ 490 | " 0 1\n", 491 | "0 language en-US\n", 492 | "1 region US\n", 493 | "2 quoteType EQUITY\n", 494 | "3 quoteSourceName Delayed Quote\n", 495 | "4 currency USD\n", 496 | "5 priceHint 2\n", 497 | "6 shortName Apple Inc.\n", 498 | "7 market us_market\n", 499 | "8 regularMarketPrice 236.41\n", 500 | "9 regularMarketTime 1571428801\n", 501 | "10 regularMarketChange 1.13\n", 502 | "11 regularMarketOpen 234.59\n", 503 | "12 regularMarketDayHigh 237.58\n", 504 | "13 regularMarketDayLow 234.29\n", 505 | "14 regularMarketVolume 21772221\n", 506 | "15 exchangeDataDelayedBy 0\n", 507 | "16 marketState CLOSED\n", 508 | "17 exchange NMS\n", 509 | "18 twoHundredDayAverageChangePercent 0.153417\n", 510 | "19 marketCap 1068384059392\n", 511 | "20 forwardPE 18.5274\n", 512 | "21 priceToBook 11.1064\n", 513 | "22 sourceInterval 15\n", 514 | "23 exchangeTimezoneName America/New_York\n", 515 | "24 exchangeTimezoneShortName EDT\n", 516 | "25 gmtOffSetMilliseconds -14400000\n", 517 | "26 esgPopulated False\n", 518 | "27 tradeable True\n", 519 | "28 triggerable True\n", 520 | "29 messageBoardId finmb_24937\n", 521 | ".. ... ...\n", 522 | "40 financialCurrency USD\n", 523 | "41 postMarketPrice 236.21\n", 524 | "42 postMarketChange -0.199997\n", 525 | "43 regularMarketChangePercent 0.480281\n", 526 | "44 regularMarketDayRange 234.29 - 237.58\n", 527 | "45 bid 236.21\n", 528 | "46 ask 236.37\n", 529 | "47 bidSize 14\n", 530 | "48 askSize 9\n", 531 | "49 trailingAnnualDividendRate 2.96\n", 532 | "50 trailingAnnualDividendYield 0.0125808\n", 533 | "51 epsTrailingTwelveMonths 11.777\n", 534 | "52 epsForward 12.76\n", 535 | "53 fullExchangeName NasdaqGS\n", 536 | "54 longName Apple Inc.\n", 537 | "55 averageDailyVolume3Month 28456101\n", 538 | "56 averageDailyVolume10Day 25089957\n", 539 | "57 fiftyTwoWeekLowChange 94.41\n", 540 | "58 fiftyTwoWeekLowChangePercent 0.664859\n", 541 | "59 fiftyTwoWeekRange 142.0 - 238.13\n", 542 | "60 fiftyTwoWeekHighChange -1.72\n", 543 | "61 fiftyTwoWeekHighChangePercent -0.00722295\n", 544 | "62 fiftyTwoWeekLow 142\n", 545 | "63 fiftyTwoWeekHigh 238.13\n", 546 | "64 dividendDate 1565827200\n", 547 | "65 earningsTimestamp 1572480000\n", 548 | "66 earningsTimestampStart 1572480000\n", 549 | "67 earningsTimestampEnd 1572480000\n", 550 | "68 trailingPE 20.0739\n", 551 | "69 symbol AAPL\n", 552 | "\n", 553 | "[70 rows x 2 columns]" 554 | ] 555 | }, 556 | "metadata": { 557 | "tags": [] 558 | }, 559 | "execution_count": 86 560 | } 561 | ] 562 | }, 563 | { 564 | "cell_type": "markdown", 565 | "metadata": { 566 | "id": "YKh9oWzubCfv", 567 | "colab_type": "text" 568 | }, 569 | "source": [ 570 | "So two important things, price of the stock is **236 dollars**. The regular market change is **234.29 - 237.58**. So If one is enter to buy apple stock once can target for 234 $ for that day.\n", 571 | "Looking at the 52 week range: **142.0 - 238.13**, the stock is very volatile and looks inflated at this price and can likely go back down. The fifty day average is **222.745**, so may be one **should wait** to drop a bit and then buy. " 572 | ] 573 | }, 574 | { 575 | "cell_type": "code", 576 | "metadata": { 577 | "id": "xbHH847Pcklp", 578 | "colab_type": "code", 579 | "outputId": "f2cc65c0-8c5a-48da-dbbd-2b86754d5e08", 580 | "colab": { 581 | "base_uri": "https://localhost:8080/", 582 | "height": 187 583 | } 584 | }, 585 | "source": [ 586 | "print('Total Dividends:')\n", 587 | "print(apple.actions['Dividends'].sum())\n", 588 | "\n", 589 | "print('Total Stock splits since inception')\n", 590 | "print(apple.actions['Stock Splits'][apple.actions['Stock Splits']!=0])\n", 591 | "apple.actions['Stock Splits'][apple.actions['Stock Splits']!=0].product()\n" 592 | ], 593 | "execution_count": 87, 594 | "outputs": [ 595 | { 596 | "output_type": "stream", 597 | "text": [ 598 | "Total Dividends:\n", 599 | "16.234360000000002\n", 600 | "Total Stock splits since inception\n", 601 | "Date\n", 602 | "1987-06-16 2.0\n", 603 | "2000-06-21 2.0\n", 604 | "2005-02-28 2.0\n", 605 | "2014-06-09 7.0\n", 606 | "Name: Stock Splits, dtype: float64\n" 607 | ], 608 | "name": "stdout" 609 | }, 610 | { 611 | "output_type": "execute_result", 612 | "data": { 613 | "text/plain": [ 614 | "56.0" 615 | ] 616 | }, 617 | "metadata": { 618 | "tags": [] 619 | }, 620 | "execution_count": 87 621 | } 622 | ] 623 | }, 624 | { 625 | "cell_type": "markdown", 626 | "metadata": { 627 | "id": "mQUePSFgdLlw", 628 | "colab_type": "text" 629 | }, 630 | "source": [ 631 | "Since, inception Apple has given **16.23 dollars** of dividend to their shareholders. Since incpetion, if you had 1 apple stock it has split **4 times** and today you would be having **56 stocks for 1 stock**. " 632 | ] 633 | }, 634 | { 635 | "cell_type": "code", 636 | "metadata": { 637 | "id": "Kr4jbySrfCLP", 638 | "colab_type": "code", 639 | "outputId": "3a2b771d-62ef-4980-fb16-293e5760b103", 640 | "colab": { 641 | "base_uri": "https://localhost:8080/", 642 | "height": 102 643 | } 644 | }, 645 | "source": [ 646 | "stockpriceAtInception=apple.history(period=\"MAX\")['Close'][0]\n", 647 | "latestStockPrice=apple.history(period=\"MAX\")['Close'][-1:]\n", 648 | "stockSplit=apple.actions['Stock Splits'][apple.actions['Stock Splits']!=0].product()\n", 649 | "\n", 650 | "profitSinceInception=(latestStockPrice-stockpriceAtInception)*stockSplit\n", 651 | "profitPercentageSinceInception=profitSinceInception/stockpriceAtInception*100\n", 652 | "print(\"Stock Price at inception was\",stockpriceAtInception)\n", 653 | "print(\"Stock Price today is\",latestStockPrice.to_string(index=False))\n", 654 | "print(\"This is\",profitPercentageSinceInception.to_string(index=False),\"percetage of profit.\")" 655 | ], 656 | "execution_count": 122, 657 | "outputs": [ 658 | { 659 | "output_type": "stream", 660 | "text": [ 661 | "Stock Price at inception was 0.4089711308479309\n", 662 | "Stock Price today is Date\n", 663 | " 236.410004\n", 664 | "This is Date\n", 665 | " 32315.380781 percetage of profit.\n" 666 | ], 667 | "name": "stdout" 668 | } 669 | ] 670 | }, 671 | { 672 | "cell_type": "markdown", 673 | "metadata": { 674 | "id": "opdBudb2mYb6", 675 | "colab_type": "text" 676 | }, 677 | "source": [ 678 | "If you purchased 1 stock since inception for 0.4 today, you would have 3231538.0781 percetage of profit! Wow!" 679 | ] 680 | }, 681 | { 682 | "cell_type": "markdown", 683 | "metadata": { 684 | "id": "0sWlCovPfWob", 685 | "colab_type": "text" 686 | }, 687 | "source": [ 688 | "Okay, now the fundamental analysis is done lets try to predict how is the stock going to behave in the coming days. " 689 | ] 690 | }, 691 | { 692 | "cell_type": "code", 693 | "metadata": { 694 | "id": "P9X9HToHfnm7", 695 | "colab_type": "code", 696 | "colab": { 697 | "base_uri": "https://localhost:8080/", 698 | "height": 309 699 | }, 700 | "outputId": "60c4a01f-1cb1-4714-c382-b4cb858b3e2d" 701 | }, 702 | "source": [ 703 | "history=apple.history(period=\"MAX\")['Close']\n", 704 | "import seaborn as sns; sns.set()\n", 705 | "plt.title('Analysis since inception')\n", 706 | "history.plot()" 707 | ], 708 | "execution_count": 137, 709 | "outputs": [ 710 | { 711 | "output_type": "execute_result", 712 | "data": { 713 | "text/plain": [ 714 | "" 715 | ] 716 | }, 717 | "metadata": { 718 | "tags": [] 719 | }, 720 | "execution_count": 137 721 | }, 722 | { 723 | "output_type": "display_data", 724 | "data": { 725 | "image/png": "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\n5GR+/PFHunTpQmRkpEvyONs1c03g3LlzFBQUACVtqRcuXOC3335j8eLFnD9/nvj4eAAKCwvrPUd+\nfj4Ap06dYv369aSmpvLWW2+xevVqvvnmG1avXl2vGUqVti37+fnx17/+lXHjxgEQHBxMWlqa/SBX\n3229pZ8HwKFDh0hJSSEwMJB//etfPPTQQ8ycOZMvvviiXjOU+uKLL/j5559JSUkBoE2bNmzdutU+\nPyYmhi5duvDaa68B9dcuX5ojPT3dPs3Ly4tff/2VMWPGoJTi448/Jj4+HovFUi8ZrsySmpoKQNeu\nXVmyZAnPP/88jz32GPn5+UybNo0XX3wRqL/PJCsry/66RYsW3HfffZhMJqxWK5GRkQ3WFl+ao/QL\nm5ubG7/88gu7du3iiSeeYNeuXTz77LO88MILgD6u3dSJauS++eYbde+996pHHnlEjR8/3j49LS1N\nzZ49WymlVFxcnBo0aJB64IEH1P79++s9x9ixY+3T582bpyZOnKgmTJigTpw4odatW6eGDRumjh49\nWi85lFJq06ZNauzYserZZ59Vr732Wrl5RUVFSimlpkyZojZt2lRvGa7M8eqrr9qnDxo0SM2ZM0e9\n9NJL6uzZs2rNmjVq+PDh6vjx4/WW5ciRI+oPf/iDmjRpkpo1a5aaOHGiKiwsVOfPn1ePPPKI+uqr\nr+zLnjhxQt12220qKyurwXIopdR//vMf9dFHHymllFq8eLHq2LGjmjJliiouLlaapjVIloKCAqWU\nUvHx8erxxx9Xv/32m1JKqTNnzqjOnTur8+fPOz3Hli1bVK9evdS9995b5TKHDx9W48ePVxaLxen7\nry5HYmKimjZtmnrooYfUyZMnlVJKnT59WnXp0kVduHCh3vI0lEZ9JrBz506WLl3KtGnTePfdd7l4\n8SKbN28GStrxrFYrFy5cYMOGDeTk5NCqVSu6detW7zmSk5PZtGkTAM899xxt27bln//8J+3bt2fE\niBG0bNnSntPZdu3axb/+9S+mTp3Kww8/zObNm8udRru7u5OSkkJSUhIDBgwAICcnB3DuN5orc3z7\n7bcsWLAAgEmTJrF+/XqGDh1K69atueuuuwgLC3P6Z6LKnOEcOHCAUaNGsWzZMubPn4+3tzfPPfcc\n4eHh9OvXj9WrV9vPJL28vIiKinJa093Vcvj4+DB9+nQAQkND+fHHH5k8eTK7d++mc+fOhIaGYjab\nnXa2Vl2WGTNmANCqVSsuXrxIeHg4UHLGNHDgQBISEpySo1Rqaiqff/45c+bMISEhga+++gq4/LdY\nmnfPnj106NABNzc3fvvtN3744YcGyQElTcs33XQTe/bssV8Qbtu2LTExMSQlJTk1hys06iKwbds2\n+vTpQ0xMDNnZ2XTq1IlWrVphsVgIDAxk7969jB07lpiYGP71r3+xbds2Tp482SA52rRpg8ViwcPD\ng6SkJNavXw+AxWLB39+fHj16OD0HwJYtWxg4cCD9+/cnMjKS+++/n88++4w9e/bYlzl06BA9e/bE\ny8uLBQsWMHv2bCwWi1PbnyvL8fnnnxMfH8/IkSNp0aKF/R+yUoqAgACioqKctn+LxVLuOsOePXu4\nePEiUFIIY2Nj2bp1K/v37+f+++/Hw8ODGTNmkJCQwNKlS8nJyXHKHSDV5XjllVfYvXs3+/fvx83N\njYsXLzJw4ED++9//8u9//5t169aRnp7ulN+NI1l+/PFHdu/eTYsWLYiIiOCNN95A0zReeuklcnJy\n6NChg1NylGrRogVTp07l7rvvZvr06SxcuBDA/vOWFoOUlBRCQkJ45513mDlzplOadR3JASVFYNSo\nUQwePJh//OMfpKWl8fLLL5OdnU379u3rnMPVGtUtoitXruTixYsYjUb8/f2xWq0sWbKEhIQEFi1a\nREBAANu3b2fHjh306NGDyMhI5s6dS8+ePWnZsiWBgYH07t0bk8nUIDlKD4ReXl4sXLiQjIwMXnvt\nNa6//noeeOCBOueoLEtycjJfffUVo0ePxmw2s3fvXhITEzl9+jR/+MMfAFi3bh1xcXFs2LCBsLAw\n5syZg5eXV73nSEhI4NSpU9x33310796dzz77jEOHDvHqq6/Srl07xowZ45TP5MMPP2ThwoWcOXOG\n5ORkOnfujIeHBxs3biQmJgZvb288PDwoKChgxYoVTJgwgZiYGA4cOMCXX35Js2bNWLBgAZ6eng2S\nIy8vjy+//JKnn36au+++214MPTw8eOihh5xyQ0NNPpOVK1cyZswYgoKC+Oqrr/j0008JDg7m5Zdf\nxs/Pz2k5UlJS6NSpE4GBgRiNRrp06cKXX35JcnIy0dHR2Gw2TCYTSin77ao33HADCxcupHPnzg2W\nQ9M0mjVrxqBBg+x/Iz4+PixcuLDBbzapFy5sinLYyZMn1QMPPKAmTZqkYmNj1bBhw9SJEyeUUkr9\n/vvv6u9//7v64YcflFJK5eTkqCFDhqgdO3bY1y9tB3dFjq1btyqllPrpp5/U8uXLnXYtoLIsv//+\nuyoqKlIPPfSQevjhh9WYMWPU/Pnz1bFjx1T//v1VYmKiUkqpp59+Wo0dO1adOnXKJTkSEhKUUkql\np6erH3/80f4ZOsOqVavU+PHj1b59+9SaNWtU//791c6dO1VWVpaaPXu2evPNN+3Lnjt3Tj344IPq\n7Nmz9ml5eXkuy1Havmy1Wp16DaA2WUp/Rzk5OSo1NbXecmzfvl0pdfnf6C+//KJuvPFG+/v09HSl\nlFJvvvmm0/7t1CZHWlqaff38/Hyn5NCLRlEE/vOf/6j33nvP/n7q1KnqvvvuU1lZWaqoqEg98MAD\n5f4hP/vss+rLL790eY6ZM2eqlStXOj1HVVnuv/9+VVhYqAoKCtTx48fVrl27lFJKXbhwQT3xxBP2\nC50ZGRkuyzF16lSVmZnp1INcTk6O/fXMmTPVmjVr7O8/+ugjNWzYMFVUVKS2bNmiHnjgAbVz506l\nVMmFwBkzZlxzOfSU5Wo5Pv74Y3XHHXcom82mlLp8AH7mmWfUgw8+qKZOnaoWLFjg8hzTpk1TL774\nolNy6JEurwnYbLZyF1z279/P6dOn7e979uzJyZMn2bhxI+7u7lx//fXMnz+f3NxcXn/9dXubt6tz\nHD58mF69etU5h6NZfvvtN9auXYunpyeRkZH069cPgGXLlhEQEGA/lff393dZDn9/f5o3b+6U5wKs\nViuvvfYajz32GK+//jrHjx/npptuYuPGjfZl/vSnPwHw6aefMmjQIIYPH86CBQuYMWMGr7zyilN+\nP3rJoacsjuR48MEHcXNz44MPPgBKbsWEkgvze/fupWPHjsyePdvlOW644QbmzJlTpxx6prtrAmvX\nruXee+/lxIkT3HnnnZjNZgICAnj//fdp0aIFhw8f5tixY9x4442sWrWKiRMn0r17d3744Qfi4uIw\nm80sWrSIsLCwayJHTbOsXLmSiRMnYjAY+Pbbb5kxYwaenp4899xzdW7j1ksOKHkQ769//SstWrTg\n//2//8epU6dYtWoVt99+O3v37iUkJISIiAgAwsPD+eCDDxg/fjw9evSgX79+eHp6Mn36dHr37n1N\n5NBTlprm+PDDD5kwYQIGg4GlS5eSmprKsmXLiImJuSZy6J2uikB+fj6ffvopEydOZOvWrYSHh3P9\n9dcTHh5O8+bNOXbsGPHx8UycOJE77riDbdu20bdvX1q2bMmdd97J7bffzogRI+p8kVMvOWqTZceO\nHfTt2xdfX1+MRiODBw9m/PjxdT7w6iVHqbS0NEJDQ3n88cdp2bIl7u7uHDlyhH79+pGfn8/WrVsZ\nNmwYUHILbFpaGtHR0ZjNZgIDA+nUqZNTfj96yaGnLLXJ0bdvX9zd3enWrRvDhg27pnLonqvbo650\n7tw5pZRS77//vho3bpz9wpBSqlw78saNG+0Pg13LOfSURS85lFLKYrGovLw8+36PHDmi7rvvPqVp\nmjp16pT685//rObPn6/Onj2rpk6dqubMmXNN59BTFsnRuOjumkCrVq0AmDx5MkVFRaxevdp+r7Cm\naaSnp/PGG28QGxtrv5VO1UO3B3rJoacseskBJe223t7e9msLBw8epF27dvZO2BYuXIjBYGDGjBm0\nadPG3uXBtZpDT1kkRyPj2hpUudKr9Js3b1bDhg2z39VSVFSkNm7cqObMmVMvj6/rNYeesuglRymr\n1aqUUur5559Xn332mVJKqQ0bNti7oGio2/n0kkNPWSRH42BQSp8jnJR2ofu3v/2NwsJCLly4QExM\nDE8//XSTzKGnLHrJUUopxZNPPkmvXr04cOAAaWlpPPfcc3Ts2LFJ5tBTFsmhf7rtSrr0sfGsrCwO\nHjzItGnTmDBhQpPNoacseslR6vfff2fTpk1cvHiRMWPGMGbMmCadQ09ZJEcj4MKzkGr997//VS+/\n/LLTnvht7Dn0lEUvOZQqeRBo6dKlLs+ilxx6yiI59E+3zUGAS4dh1GMO0E8WveQQQtSNrouAEEKI\n+qW7W0SFEEI0HCkCQgjRhEkREEKIJkyKgBBCNGFSBIQQognT7cNiQjSEwYMHk5qaislkwmQy0b59\ne0aPHs3YsWOrHdf3/PnzDBkyhEOHDmE2yz8l0TjJX65o8t59911uueUWcnJy2L17NwsXLuTAgQO8\n/PLLro4mRL2T5iAhLvH19WXIkCG8/vrrrFq1iuPHj/P9999z991307NnT2JiYnjzzTftyz/44IMA\n9O7dmx49erB3714AvvjiC4YPH07v3r2ZPHkyFy5ccMnPI4QjpAgIcYVu3brRsmVL4uPj8fLyIjY2\nlvj4eJYuXcry5cvZvHkzAP/5z38A2LNnD3v37qVHjx5s3ryZpUuX8tZbb7Fr1y569erF3/72N1f+\nOEJclRQBISoREhJCVlYWffv2pWPHjhiNRjp16sSIESPYvXt3leutWLGCKVOmEBkZidls5tFHH+XI\nkSNyNiB0S64JCFGJpKQkmjdvzv79+1myZAknTpyguLgYi8ViH5KwMgkJCbz00kvExsbapymlSEpK\nso9nK4SeSBEQ4goHDhwgKSmJXr168fjjj/Pggw/y/vvv4+HhwcKFC8nIyACotAO9sLAwHn30UUaN\nGtXQsYWoFWkOEuKS3NxcvvvuO6ZPn86oUaPo2LEjeXl5NG/eHA8PDw4cOMC6devsywcGBmI0Gjl3\n7px92rhx43jvvfc4ceIEUDKA+YYNGxr8ZxHCUdKLqGjSyj4nYDQaad++PaNGjWLcuHGYTCa+/vpr\nYmNjyczMpE+fPkRERJCdnc2SJUsA+Oc//8ny5cuxWq28//77dO/enbi4OJYtW8aFCxfw9fXllltu\nkdtNhW5JERBCiCZMmoOEEKIJkyIghBBNmBQBIYRowqQICCFEEyZFQAghmjApAkII0YRJERBCiCZM\nioAQQjRhUgSEEKIJ+/+nQbXZ0WAPwwAAAABJRU5ErkJggg==\n", 726 | "text/plain": [ 727 | "
" 728 | ] 729 | }, 730 | "metadata": { 731 | "tags": [] 732 | } 733 | } 734 | ] 735 | }, 736 | { 737 | "cell_type": "markdown", 738 | "metadata": { 739 | "id": "rHuRYaKJnFnK", 740 | "colab_type": "text" 741 | }, 742 | "source": [ 743 | "So the apple stock price has gained maximum profits since 1998. If you look on the web, that is when Apple Ipods was released and it was spectacular and apple started becoming the industry trend setter. " 744 | ] 745 | }, 746 | { 747 | "cell_type": "code", 748 | "metadata": { 749 | "id": "U9ssXxYPg-Iw", 750 | "colab_type": "code", 751 | "colab": { 752 | "base_uri": "https://localhost:8080/", 753 | "height": 318 754 | }, 755 | "outputId": "3452598a-9c57-4576-af46-ba2b6a10375b" 756 | }, 757 | "source": [ 758 | "history=apple.history(period=\"5y\")['Close']\n", 759 | "import seaborn as sns; sns.set()\n", 760 | "plt.title('5 years price analysis')\n", 761 | "history.plot()" 762 | ], 763 | "execution_count": 138, 764 | "outputs": [ 765 | { 766 | "output_type": "execute_result", 767 | "data": { 768 | "text/plain": [ 769 | "" 770 | ] 771 | }, 772 | "metadata": { 773 | "tags": [] 774 | }, 775 | "execution_count": 138 776 | }, 777 | { 778 | "output_type": "display_data", 779 | "data": { 780 | "image/png": "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\n", 781 | "text/plain": [ 782 | "
" 783 | ] 784 | }, 785 | "metadata": { 786 | "tags": [] 787 | } 788 | } 789 | ] 790 | }, 791 | { 792 | "cell_type": "code", 793 | "metadata": { 794 | "id": "qopwnL1moYTe", 795 | "colab_type": "code", 796 | "colab": { 797 | "base_uri": "https://localhost:8080/", 798 | "height": 318 799 | }, 800 | "outputId": "4f1a264e-c465-495f-a17f-d872d1953809" 801 | }, 802 | "source": [ 803 | "history=apple.history(period=\"2y\")['Close']\n", 804 | "import seaborn as sns; sns.set()\n", 805 | "plt.title('2 years price analysis')\n", 806 | "history.plot()" 807 | ], 808 | "execution_count": 140, 809 | "outputs": [ 810 | { 811 | "output_type": "execute_result", 812 | "data": { 813 | "text/plain": [ 814 | "" 815 | ] 816 | }, 817 | "metadata": { 818 | "tags": [] 819 | }, 820 | "execution_count": 140 821 | }, 822 | { 823 | "output_type": "display_data", 824 | "data": { 825 | "image/png": "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\nGISGhjq0E2h6BGj7ndn+rbYZfZJGJebzabalM+fzUa02aptRIXcH7dy5E2PGjMGiRYswb948AIBW\nq4XVapU3ZM+ePfHqq68iMzNT/jqTyYTw8HD542HDhqmy8/r16806bUPrqP9g9tiezjiw2lIn3Xfm\nhG17rVq1CkeOHIFer8f48eNhMBgc3miTm5uLiRMnQq/XY9u2bQCatpHFYlHNjD5po7Pn0x7b0lkH\n/ltqvf+AuRpm1KaN07/jU9qyZQvy8vIwd+5cvPDCC4iPj8f58+cRGhoqPxo5d+4c6urq8OGHHyIu\nLg6JiYkoKSmBh4cHwsLCuPMZ7SwqKkJdXR169eoFjUaDsrIyeHh44Pjx45g9ezb69evnlNatW7ci\nNzcXCQkJqKysxNKlS0FEeO+99+T//EpvUxEaRepsbataZrQZh+9wsrOEhATasmULETUdTU9ISKDy\n8nIiatrXlp6eTkOHDqU//viDiIiqq6vp1KlTTt/vz53O74yKiqIjR44QEVFFRQV9+umnlJOT49RO\nIqIZM2bQzp07iahp3/CsWbPo9ddfp6qqKjKbzarYpiI0itTZ2la1zOj9VH9MoKqqCm3btkVjY6N8\ngcrKlStRUlKCr7/+Gu3bt0deXh6Ki4sRHh6OyspKLF68GIGBgQAADw8PdOnSxeH7/blTHZ0BAQEA\nAE9PT0RHR6Nnz54O7by/1Ww2Q5IkFBcX48yZMxg2bBg0Gg3Onz+Ps2fPorq6GgMHDsSNGzecvk1F\naBSp82lalZjRFim6BLVg//791LdvXxo7duy/PnfixAn67LPP6OLFi0REdPnyZQoLC6OSkhL5Pmaz\nmTu5U5HW06dP09ixY+nzzz+nMWPGUGZmJu3bt49iYmKorq7Oqa0iNIrUKVpra6jywHB5eTm2bNmC\nefPmwWQyyZdS287vffnll3H9+nW89NJLAICAgABERkbKVwMCcMoZANzpmp0ttQJAeHg4srKy8P77\n72P27NmIj4+H1WpFQEAAPDw85IPYjm4VoVGkTtFaW03ZNej/Hjx39+zZs0RE9NNPP9GgQYPk261W\nK926dYtmzpxJ6enpZLFYKDU1lWJiYuj27dvcyZ2qaH1QUlISZWVlOTaQxGgkEqeTSKzWJ6GKYwLr\n169Hamoqrly5gps3b6Jbt27w8fGBJEkIDw/Hzz//jBs3bmDQoEHyi1f5+vpi165d2LhxI3x9fZGW\nlob27dtzJ3cq3mp7kTWNRoMff/wRc+fOhb+/P+Lj49GmjeNOyBOhUaRO0VqfmNKr0Pbt2ykmJoZO\nnjxJO3bsoMGDB8tH+m0r8IkTJygsLEz+2PbIr7KyUj5DhDu5U02tFRUVRERkMBiouLiYGwXrFK31\naWiInP8aurW1tfDy8gIAzJkzB5GRkRg5ciQAICcnBxs2bMCePXsgSRIaGhrg7u6OpKQklJaWwsfH\nB76+vvLFQtzJna7aKkKjSJ2itdqLUw8Mm81mLFu2DNOmTcPy5ctx4cIF9OjRA7/++qt8n0mTJsHN\nzQ3ffvstgP+/+JOnpycKCgrQtWtXh29k7nTNTlFaRWgUqVO0Vntz2iJQUFCAcePGoba2FomJiSAi\n6PV6BAUFwWw249ixY/J9Z82ahby8PABNl1xnZ2ejvr4ehw4dQlxcHHdyp8u2itAoUqdorY7gtKMV\nbm5uiImJwYQJEwA0vejU5cuX4eXlhfDwcGzcuBEDBgwAAHTq1AmvvfYa7ty5g3bt2mHy5MnyS+ty\nJ3e6cqsIjSJ1itbqCE57JhAaGgqdTiefK9uuXTsYjUZ0794dI0eORGVlJRYtWoRr165h7dq10Gg0\naNeuHQA4dSNzp2t2itIqQqNInaK1OoLTFgE3Nzc899xz8qv5nT59GoGBgdBoNAgMDERqaio0Gg2S\nkpLwyiuvICUlxVlp3MmdwrSK0ChSp2itjuD0k1dt7/l55swZ+SnWnj17EBQUhPnz56Ourg6enp7O\nzvoX7rQvUToBMVpFaATE6QTEarUnp79shFarBRHh1q1bqKurQ2JiIjZv3iy/1rZaNjJ32pconYAY\nrSI0AuJ0AmK12pMil7H9/fff2Lt3L0pLSzF+/HiMHz9eiYz/xJ32JUonIEarCI2AOJ2AWK1246yr\n0u5XU1ND2dnZir4XbWtwp32J0kkkRqsIjUTidBKJ1WovilwxzBhjTB1U+VLSjDHGnIMXAcYYc2G8\nCDDGmAvjRYAxxlwYLwKMMebCeBFgjDEXpuL3PGPM8YYOHYry8nJotVpotVoEBwdj1KhR+OCDDyBJ\nLT9GKikpQVRUFM6cOaPutw9krAU8uczlZWVlISIiAjU1NTh27BhSU1NRWFiItLQ0pdMYczjeHcTY\nPd7e3oiKisLy5cuxfft2XLhwAQcOHMDo0aPRp08fDBkyBCtXrpTvP2nSJABA//790bt3bxQUFAAA\ntm7dihEjRqB///6YMmUKjEajIj8PY63BiwBjD+jZsydefPFFGAwGeHp6Qq/Xw2AwIDs7G5s2bcK+\nffsANL3nLAAcP34cBQUF6N27N/bt24fs7GysWrUKR48eRd++fZGYmKjkj8NYi3gRYOwhOnfujKqq\nKgwcOBChoaGQJAndunVDdHR0s7cbfNDmzZsRGxuLoKAgtGnTBlOnTkVRURE/G2CqxccEGHuIsrIy\ndOjQAadOnUJGRgaKi4vR2NiIhoYGDB8+/JFfZzKZsGTJEuj1evk2IkJZWRn8/f2dkc7YY+FFgLEH\nFBYWoqysDH379kVcXBwmTZqEtWvXwsPDA6mpqbh9+zYAyO9EdT8/Pz9MnToVOp3O2dmMPRHeHcTY\nPbW1tfjtt98wc+ZM6HQ6hIaG4s6dO+jQoQM8PDxQWFiIXbt2yff38fGBJEm4du2afNuECROwZs0a\nFBcXAwBqamrwyy+/OP1nYay1+KWkmUu7/zoBSZIQHBwMnU6HCRMmQKvVYs+ePdDr9aisrMSAAQPg\n7++P6upqZGRkAAAyMzOxadMmmM1mrF27Fr169UJubi7WrVsHo9EIb29vRERE8OmmTLV4EWCMMRfG\nu4MYY8yF8SLAGGMujBcBxhhzYbwIMMaYC+NFgDHGXBgvAowx5sJ4EWCMMRfGiwBjjLkwXgQYY8yF\n/Q9/dUYZ4olQQQAAAABJRU5ErkJggg==\n", 826 | "text/plain": [ 827 | "
" 828 | ] 829 | }, 830 | "metadata": { 831 | "tags": [] 832 | } 833 | } 834 | ] 835 | }, 836 | { 837 | "cell_type": "code", 838 | "metadata": { 839 | "id": "Qtdfk9RDoiZg", 840 | "colab_type": "code", 841 | "colab": { 842 | "base_uri": "https://localhost:8080/", 843 | "height": 318 844 | }, 845 | "outputId": "9f30fd22-43e1-4992-f3f4-317e3c945e5c" 846 | }, 847 | "source": [ 848 | "history=apple.history(period=\"6mo\")['Close']\n", 849 | "import seaborn as sns; sns.set()\n", 850 | "plt.title('6 month price analysis')\n", 851 | "history.plot()" 852 | ], 853 | "execution_count": 145, 854 | "outputs": [ 855 | { 856 | "output_type": "execute_result", 857 | "data": { 858 | "text/plain": [ 859 | "" 860 | ] 861 | }, 862 | "metadata": { 863 | "tags": [] 864 | }, 865 | "execution_count": 145 866 | }, 867 | { 868 | "output_type": "display_data", 869 | "data": { 870 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAEcCAYAAAAhoQi5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xl4VPW9+PH3mSSTZDJZJ5OdJOyE\nJUAIILJJQAMKrlWpxT5Xq+2t9Vp71db+tOLW3qIUrV5caxdbL7RWZVXQVgURZFG2EAgQQgLZk5kk\nk0ky6/n9MclAzA7Z83k9j4/krN9vZnI+57srqqqqCCGEGJI0fZ0AIYQQfUeCgBBCDGESBIQQYgiT\nICCEEEOYBAEhhBjCJAgIIcQQJkFADCpjx44lPz+/x65/3XXXsXfv3h67fnc6f/48Y8eOxel0XvI1\nDhw4QGZmZjemSvQ3EgREp2zdupUlS5YwZcoUFi1axIEDB/o6Sdx55528++67vXrPrVu3MnPmzF69\nZ19KT09n+/btfZ0M0YN8+zoBov/78ssvWb16NS+88AKpqamUl5f3dZJ6ndPpxNdX/lzE4CMlAdGh\nl19+mfvuu48pU6ag0WiIjo4mOjq61WPff/99li9fzm9+8xvS09NZuHAh33zzDe+//z7z589n1qxZ\nfPDBB97jLRYLP//5z7niiitYsGABr7zyCm6323ut7373u6xatYrp06eTkZHBjh07AHjhhRc4cOAA\nTz/9NFOnTuXpp5/2XnP37t1cc801pKen89RTT9HWoPiXX36ZBx54gAcffJCpU6dy0003ceLECe/+\njIwM3njjDZYtW8aUKVNwOp1kZGSwe/duAFwuF6+99hqLFi1i6tSp3HzzzRQXFwOQm5vLXXfdxYwZ\nM8jMzOTDDz9s8/f73nvvsWTJEqZOncrChQtZv369d9/evXuZN28ef/zjH5k1axZz5szhvffe8+7/\n/PPPufHGG0lLS2P+/Pm8/PLLrd7jo48+4uabb2627U9/+hM//vGPAdixYwfXXnstU6dOZe7cubz1\n1lvN7t/kjTfeYO7cuUydOpXMzEz27NnTZr7EAKEK0Q6n06lOmDBBff3119VFixapc+fOVZ966im1\nvr6+1ePfe+89NSUlRf3nP/+pOp1Odc2aNer8+fPVJ598UrXZbOoXX3yhTpkyRa2trVVVVVUfeeQR\n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\n", 871 | "text/plain": [ 872 | "
" 873 | ] 874 | }, 875 | "metadata": { 876 | "tags": [] 877 | } 878 | } 879 | ] 880 | }, 881 | { 882 | "cell_type": "markdown", 883 | "metadata": { 884 | "id": "mKv6Rsvjq8OP", 885 | "colab_type": "text" 886 | }, 887 | "source": [ 888 | "#Recurrent Neural network \n", 889 | "RNNs to capture time series data and predict stock price for the next few day" 890 | ] 891 | }, 892 | { 893 | "cell_type": "code", 894 | "metadata": { 895 | "id": "bBasfZzdrL86", 896 | "colab_type": "code", 897 | "colab": { 898 | "base_uri": "https://localhost:8080/", 899 | "height": 1000 900 | }, 901 | "outputId": "d0757f6d-ce96-4f04-84c0-a682955e5b97" 902 | }, 903 | "source": [ 904 | "import numpy\n", 905 | "import matplotlib.pyplot as plt\n", 906 | "from pandas import read_csv\n", 907 | "import math\n", 908 | "from keras.models import Sequential\n", 909 | "from keras.layers import Dense\n", 910 | "from keras.layers import LSTM,GRU\n", 911 | "from sklearn.preprocessing import MinMaxScaler,RobustScaler,StandardScaler\n", 912 | "from sklearn.metrics import mean_squared_error\n", 913 | "from pandas import Series\n", 914 | "\n", 915 | "data=apple.history(period=\"3y\")['Close']\n", 916 | "\n", 917 | "\n", 918 | "#data=data.set_index(pd.DatetimeIndex(data['Date']))['Close']\n", 919 | "def difference(dataset, interval=1):\n", 920 | "\tdiff = list()\n", 921 | "\tfor i in range(interval, len(dataset)):\n", 922 | "\t\tvalue = dataset[i] - dataset[i - interval]\n", 923 | "\t\tdiff.append(value)\n", 924 | "\treturn Series(diff)\n", 925 | "\n", 926 | "look_back=7\n", 927 | "#data=difference(data,look_back)\n", 928 | "\n", 929 | "\n", 930 | "#def project(data,look_back):\n", 931 | " #convert an array of values into a dataset matrix\n", 932 | " \n", 933 | "\n", 934 | "def create_dataset(dataset, look_back=1):\n", 935 | " dataX, dataY = [], []\n", 936 | " for i in range(len(dataset)-look_back-1):\n", 937 | " #takes \n", 938 | " a = dataset[i:(i+look_back), 0]\n", 939 | " dataX.append(a)\n", 940 | " dataY.append(dataset[i+look_back, 0])\n", 941 | " return numpy.array(dataX), numpy.array(dataY)\n", 942 | "\n", 943 | "# fix random seed for reproducibility\n", 944 | "numpy.random.seed(0)\n", 945 | "\n", 946 | "# load the dataset\n", 947 | "dataframe = data\n", 948 | "dataset = dataframe.values\n", 949 | "dataset = dataset.astype('float64').reshape(-1, 1)\n", 950 | "\n", 951 | "# normalize the dataset\n", 952 | "scaler = MinMaxScaler()\n", 953 | "#scaler=RobustScaler()\n", 954 | "#scaler=StandardScaler()\n", 955 | "dataset = scaler.fit_transform(dataset)\n", 956 | "\n", 957 | "# split into train and test sets\n", 958 | "train_size = int(len(dataset) * 0.67)\n", 959 | "test_size = len(dataset) - train_size\n", 960 | "train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]\n", 961 | "\n", 962 | "# reshape into X=t and Y=t+1\n", 963 | "#look_back = 10\n", 964 | "trainX, trainY = create_dataset(train, look_back)\n", 965 | "testX, testY = create_dataset(test, look_back)\n", 966 | "\n", 967 | "# reshape input to be [samples, time steps, features]\n", 968 | "trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))\n", 969 | "testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))\n", 970 | "# create and fit the LSTM network\n", 971 | "from keras.layers import Activation, Dense,Dropout\n", 972 | "model = Sequential()\n", 973 | "\n", 974 | "model.add(LSTM(256, return_sequences=True,input_shape=(1, look_back)))\n", 975 | "model.add(LSTM(256, return_sequences=True,input_shape=(1, look_back)))\n", 976 | "#model.add(LSTM(256, return_sequences=True,input_shape=(1, look_back)))\n", 977 | "model.add(LSTM(256))\n", 978 | "#model.add(LSTM(100, input_shape=(1, look_back)))\n", 979 | "\n", 980 | "model.add(Dense(1))\n", 981 | "import keras\n", 982 | "from keras import optimizers\n", 983 | "\n", 984 | "#keras.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False, clipnorm=1)\n", 985 | "\n", 986 | "model.compile(loss='mean_squared_error', optimizer='adam')\n", 987 | "model.fit(trainX, trainY, epochs=50, verbose=1,shuffle=False,batch_size=50)\n", 988 | "# make predictions\n", 989 | "trainPredict = model.predict(trainX)\n", 990 | "testPredict = model.predict(testX)\n", 991 | "# invert predictions\n", 992 | "trainPredict = scaler.inverse_transform(trainPredict)\n", 993 | "trainY = scaler.inverse_transform([trainY])\n", 994 | "testPredict = scaler.inverse_transform(testPredict)\n", 995 | "testY = scaler.inverse_transform([testY])\n", 996 | "# calculate root mean squared error\n", 997 | "trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))\n", 998 | "print('Train Score: %.2f RMSE' % (trainScore))\n", 999 | "testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))\n", 1000 | "print('Test Score: %.2f RMSE' % (testScore))\n", 1001 | "predictions = numpy.empty_like(dataset)\n", 1002 | "predictions[:, :] = numpy.nan\n", 1003 | "predictions[look_back:len(trainPredict)+look_back, :] = trainPredict\n", 1004 | "predictions[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict\n", 1005 | "#data=pd.DataFrame(numpy.concatenate((trainPredict[0:len(trainPredict)-look_back-1],testPredict[0:len(testPredict)-look_back-1])),columns=[\"predicted\"])\n", 1006 | "#print('one',data.count())\n", 1007 | "#print('two',dataframe.count())\n", 1008 | "predictionsDF=pd.DataFrame(predictions,columns=[\"predicted\"],index=dataframe.index)\n", 1009 | "ans=pd.concat([dataframe,predictionsDF],axis=1)\n", 1010 | "print( ans,[look_back,trainScore,testScore])" 1011 | ], 1012 | "execution_count": 159, 1013 | "outputs": [ 1014 | { 1015 | "output_type": "stream", 1016 | "text": [ 1017 | "Epoch 1/50\n", 1018 | "496/496 [==============================] - 5s 11ms/step - loss: 0.1539\n", 1019 | "Epoch 2/50\n", 1020 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0041\n", 1021 | "Epoch 3/50\n", 1022 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0258\n", 1023 | "Epoch 4/50\n", 1024 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0086\n", 1025 | "Epoch 5/50\n", 1026 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0087\n", 1027 | "Epoch 6/50\n", 1028 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0056\n", 1029 | "Epoch 7/50\n", 1030 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0039\n", 1031 | "Epoch 8/50\n", 1032 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0031\n", 1033 | "Epoch 9/50\n", 1034 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0032\n", 1035 | "Epoch 10/50\n", 1036 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0052\n", 1037 | "Epoch 11/50\n", 1038 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0052\n", 1039 | "Epoch 12/50\n", 1040 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0103\n", 1041 | "Epoch 13/50\n", 1042 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0098\n", 1043 | "Epoch 14/50\n", 1044 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0197\n", 1045 | "Epoch 15/50\n", 1046 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0134\n", 1047 | "Epoch 16/50\n", 1048 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0280\n", 1049 | "Epoch 17/50\n", 1050 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0088\n", 1051 | "Epoch 18/50\n", 1052 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0128\n", 1053 | "Epoch 19/50\n", 1054 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0035\n", 1055 | "Epoch 20/50\n", 1056 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0037\n", 1057 | "Epoch 21/50\n", 1058 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0017\n", 1059 | "Epoch 22/50\n", 1060 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0015\n", 1061 | "Epoch 23/50\n", 1062 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0012\n", 1063 | "Epoch 24/50\n", 1064 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0012\n", 1065 | "Epoch 25/50\n", 1066 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0012\n", 1067 | "Epoch 26/50\n", 1068 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0014\n", 1069 | "Epoch 27/50\n", 1070 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0013\n", 1071 | "Epoch 28/50\n", 1072 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0016\n", 1073 | "Epoch 29/50\n", 1074 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0016\n", 1075 | "Epoch 30/50\n", 1076 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0021\n", 1077 | "Epoch 31/50\n", 1078 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0021\n", 1079 | "Epoch 32/50\n", 1080 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0028\n", 1081 | "Epoch 33/50\n", 1082 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0029\n", 1083 | "Epoch 34/50\n", 1084 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0041\n", 1085 | "Epoch 35/50\n", 1086 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0039\n", 1087 | "Epoch 36/50\n", 1088 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0057\n", 1089 | "Epoch 37/50\n", 1090 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0050\n", 1091 | "Epoch 38/50\n", 1092 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0074\n", 1093 | "Epoch 39/50\n", 1094 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0057\n", 1095 | "Epoch 40/50\n", 1096 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0082\n", 1097 | "Epoch 41/50\n", 1098 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0056\n", 1099 | "Epoch 42/50\n", 1100 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0074\n", 1101 | "Epoch 43/50\n", 1102 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0047\n", 1103 | "Epoch 44/50\n", 1104 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0057\n", 1105 | "Epoch 45/50\n", 1106 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0037\n", 1107 | "Epoch 46/50\n", 1108 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0041\n", 1109 | "Epoch 47/50\n", 1110 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0030\n", 1111 | "Epoch 48/50\n", 1112 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0032\n", 1113 | "Epoch 49/50\n", 1114 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0025\n", 1115 | "Epoch 50/50\n", 1116 | "496/496 [==============================] - 1s 1ms/step - loss: 0.0027\n", 1117 | "Train Score: 4.26 RMSE\n", 1118 | "Test Score: 6.51 RMSE\n", 1119 | " Close predicted\n", 1120 | "Date \n", 1121 | "2016-10-21 111.147491 NaN\n", 1122 | "2016-10-24 112.148384 NaN\n", 1123 | "2016-10-25 112.720345 NaN\n", 1124 | "2016-10-26 110.184723 NaN\n", 1125 | "2016-10-27 109.126633 NaN\n", 1126 | "2016-10-28 108.402168 NaN\n", 1127 | "2016-10-31 108.230583 NaN\n", 1128 | "2016-11-01 106.276443 111.018829\n", 1129 | "2016-11-02 106.371758 110.281784\n", 1130 | "2016-11-03 105.231598 109.543221\n", 1131 | "2016-11-04 104.283051 108.522545\n", 1132 | "2016-11-07 105.787323 107.737976\n", 1133 | "2016-11-08 106.410103 107.361107\n", 1134 | "2016-11-09 106.237648 107.135780\n", 1135 | "2016-11-10 103.277008 106.972916\n", 1136 | "2016-11-11 103.890221 106.498917\n", 1137 | "2016-11-14 101.284096 106.184479\n", 1138 | "2016-11-15 102.625488 105.460014\n", 1139 | "2016-11-16 105.384895 105.269196\n", 1140 | "2016-11-17 105.346558 105.287186\n", 1141 | "2016-11-18 105.451973 105.247276\n", 1142 | "2016-11-21 107.052055 105.317947\n", 1143 | "2016-11-22 107.119118 105.877716\n", 1144 | "2016-11-23 106.572975 106.313782\n", 1145 | "2016-11-25 107.109535 106.974609\n", 1146 | "2016-11-28 106.898750 107.526741\n", 1147 | "2016-11-29 106.793365 107.680824\n", 1148 | "2016-11-30 105.892700 107.859009\n", 1149 | "2016-12-01 104.905830 107.847054\n", 1150 | "2016-12-02 105.298676 107.513321\n", 1151 | "... ... ...\n", 1152 | "2019-09-09 214.169998 205.542816\n", 1153 | "2019-09-10 216.699997 206.734802\n", 1154 | "2019-09-11 223.589996 207.771317\n", 1155 | "2019-09-12 223.089996 209.858673\n", 1156 | "2019-09-13 218.750000 211.992386\n", 1157 | "2019-09-16 219.899994 213.104614\n", 1158 | "2019-09-17 220.699997 213.852753\n", 1159 | "2019-09-18 222.770004 214.549957\n", 1160 | "2019-09-19 220.960007 215.600220\n", 1161 | "2019-09-20 217.729996 216.026169\n", 1162 | "2019-09-23 218.720001 215.283585\n", 1163 | "2019-09-24 217.679993 214.765121\n", 1164 | "2019-09-25 221.029999 214.467484\n", 1165 | "2019-09-26 219.889999 214.731934\n", 1166 | "2019-09-27 218.820007 214.612671\n", 1167 | "2019-09-30 223.970001 214.232010\n", 1168 | "2019-10-01 224.589996 214.792908\n", 1169 | "2019-10-02 218.960007 215.612198\n", 1170 | "2019-10-03 220.820007 215.589096\n", 1171 | "2019-10-04 227.009995 215.963852\n", 1172 | "2019-10-07 227.059998 216.730896\n", 1173 | "2019-10-08 224.399994 217.663986\n", 1174 | "2019-10-09 227.029999 218.378906\n", 1175 | "2019-10-10 230.089996 218.831711\n", 1176 | "2019-10-11 236.210007 219.549927\n", 1177 | "2019-10-14 235.869995 221.819977\n", 1178 | "2019-10-15 235.320007 223.642380\n", 1179 | "2019-10-16 234.369995 224.751572\n", 1180 | "2019-10-17 235.279999 225.541077\n", 1181 | "2019-10-18 236.410004 NaN\n", 1182 | "\n", 1183 | "[753 rows x 2 columns] [7, 4.256240830438758, 6.506423928549112]\n" 1184 | ], 1185 | "name": "stdout" 1186 | } 1187 | ] 1188 | }, 1189 | { 1190 | "cell_type": "markdown", 1191 | "metadata": { 1192 | "id": "VAtgdnszusJS", 1193 | "colab_type": "text" 1194 | }, 1195 | "source": [ 1196 | "The above is a LSTM RNN to predict the stock price of Apple for past X runs. It has been trained on last 67% of the runs and tested on the new runs. " 1197 | ] 1198 | }, 1199 | { 1200 | "cell_type": "markdown", 1201 | "metadata": { 1202 | "id": "UmOzkfp7vGxv", 1203 | "colab_type": "text" 1204 | }, 1205 | "source": [ 1206 | "# Observations\n", 1207 | "### Lookback \n", 1208 | "The lookback parameter is nothing but how much past data will the model be given to predict todays price, one can play around and see the accuracy of the model. for various dates. \n", 1209 | "My observation is if you want to predict short term price say, for the next week or so, lookback < 5-20 gives good performance. That seems pretty obvious too, looks like the model is doing nothing but weighted sum of past runs. \n", 1210 | "The intresting thing is, the stock price over a longer run, say next 3 months you need to give past 200-300 days of data and it will actually give you the stock price based on what its value should be. (Its an algorithm purely based on time series and thats why it doesnt take into account any sentiments etc) Why is this important? Say there was a rumour about Apple that some analyst downgraded stocks rating, investers would start selling but the value of the company is unchanged, so the stocks are bound to rise if you take into account the long run. Adding to that this model can be used to leverage many temporal patterns such as stock rises during christmas because may be the sales for iphone is always high. Etc. This is a temporal pattern and having lookback to 365 captures such details. \n", 1211 | "\n", 1212 | "### MoreFeatures\n", 1213 | "I think adding earnings date, iphone sales date and apple launch date can help in analysing more about the common patterns to build strategies to profit from the stock price. \n", 1214 | "\n" 1215 | ] 1216 | } 1217 | ] 1218 | } -------------------------------------------------------------------------------- /Bitcoinprediction.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """Download Bitcoin prices and forecast using three models.""" 3 | 4 | import pandas as pd 5 | import numpy as np 6 | import yfinance as yf 7 | from sklearn.model_selection import train_test_split 8 | from sklearn.ensemble import RandomForestRegressor 9 | from sklearn.metrics import mean_squared_error 10 | from tensorflow.keras.models import Sequential 11 | from tensorflow.keras.layers import LSTM, Dense 12 | from sklearn.preprocessing import MinMaxScaler 13 | from statsmodels.tsa.arima.model import ARIMA 14 | 15 | 16 | def download_data(ticker="BTC-USD", period="5y"): 17 | """Download historical data from Yahoo Finance.""" 18 | print(f"Downloading {ticker} data for {period}...") 19 | df = yf.download(ticker, period=period) 20 | print("Data downloaded:\n", df.head()) 21 | return df 22 | 23 | 24 | def prepare_random_forest_data(df): 25 | """Create features and next-day target for RandomForest.""" 26 | print("Preparing data for RandomForest...") 27 | df = df.copy() 28 | df["target"] = df["Close"].shift(-1) 29 | df = df.dropna() 30 | features = ["Open", "High", "Low", "Close", "Volume"] 31 | X = df[features] 32 | y = df["target"] 33 | X_train, X_test, y_train, y_test = train_test_split( 34 | X, y, test_size=0.2, shuffle=False 35 | ) 36 | test_dates = y_test.index 37 | return X_train, X_test, y_train, y_test, test_dates 38 | 39 | 40 | def run_random_forest(X_train, X_test, y_train, y_test): 41 | print("\n=== Training RandomForestRegressor ===") 42 | model = RandomForestRegressor(n_estimators=100, random_state=0) 43 | model.fit(X_train, y_train) 44 | preds = model.predict(X_test) 45 | rmse = mean_squared_error(y_test, preds) ** 0.5 46 | print(f"Random Forest RMSE: {rmse:.2f}") 47 | print("RandomForest training complete!") 48 | return model, preds, rmse 49 | 50 | 51 | def prepare_lstm_data(df, look_back=3): 52 | """Prepare sequences for LSTM model.""" 53 | print("Preparing data for LSTM...") 54 | values = df[["Close"]].values.astype("float32") 55 | scaler = MinMaxScaler() 56 | scaled = scaler.fit_transform(values) 57 | 58 | X, y = [], [] 59 | for i in range(len(scaled) - look_back - 1): 60 | X.append(scaled[i:(i + look_back), 0]) 61 | y.append(scaled[i + look_back, 0]) 62 | X = np.array(X) 63 | y = np.array(y) 64 | 65 | train_size = int(len(X) * 0.67) 66 | X_train, X_test = X[:train_size], X[train_size:] 67 | y_train, y_test = y[:train_size], y[train_size:] 68 | 69 | # reshape input to be [samples, time steps, features] 70 | X_train = X_train.reshape((X_train.shape[0], 1, X_train.shape[1])) 71 | X_test = X_test.reshape((X_test.shape[0], 1, X_test.shape[1])) 72 | return X_train, X_test, y_train, y_test, scaler 73 | 74 | 75 | def run_lstm(X_train, X_test, y_train, y_test, scaler): 76 | print("\n=== Training LSTM ===") 77 | model = Sequential() 78 | model.add(LSTM(256, return_sequences=True, input_shape=(1, X_train.shape[2]))) 79 | model.add(LSTM(256)) 80 | model.add(Dense(1)) 81 | model.compile(loss="mean_squared_error", optimizer="adam") 82 | model.fit(X_train, y_train, epochs=50, batch_size=50, verbose=1, shuffle=False) 83 | 84 | train_pred = model.predict(X_train) 85 | test_pred = model.predict(X_test) 86 | train_rmse = mean_squared_error(y_train, train_pred) ** 0.5 87 | test_rmse = mean_squared_error(y_test, test_pred) ** 0.5 88 | print(f"LSTM Train RMSE: {train_rmse:.4f}") 89 | print(f"LSTM Test RMSE: {test_rmse:.4f}") 90 | print("LSTM training complete!") 91 | return model, test_pred.flatten(), test_rmse 92 | 93 | 94 | def prepare_arima_data(series, test_size=0.2): 95 | """Split series for ARIMA training and testing.""" 96 | print("Preparing data for ARIMA...") 97 | split = int(len(series) * (1 - test_size)) 98 | train, test = series[:split], series[split:] 99 | return train, test 100 | 101 | 102 | def run_arima(train_series, test_series): 103 | print("\n=== Training ARIMA(5,1,0) ===") 104 | model = ARIMA(train_series, order=(5, 1, 0)) 105 | model_fit = model.fit() 106 | preds = model_fit.forecast(steps=len(test_series)) 107 | rmse = mean_squared_error(test_series, preds) ** 0.5 108 | print(f"ARIMA RMSE: {rmse:.2f}") 109 | print("ARIMA training complete!") 110 | return model_fit, preds, rmse 111 | 112 | 113 | def main(): 114 | print("Starting Bitcoin prediction pipeline...") 115 | df = download_data() 116 | 117 | # Random Forest 118 | X_train, X_test, y_train, y_test, test_dates = prepare_random_forest_data(df) 119 | rf_model, rf_preds, rf_rmse = run_random_forest(X_train, X_test, y_train, y_test) 120 | 121 | # LSTM 122 | X_train_lstm, X_test_lstm, y_train_lstm, y_test_lstm, scaler = prepare_lstm_data(df) 123 | lstm_model, lstm_preds_scaled, lstm_rmse = run_lstm( 124 | X_train_lstm, X_test_lstm, y_train_lstm, y_test_lstm, scaler 125 | ) 126 | lstm_preds_all = scaler.inverse_transform(lstm_preds_scaled.reshape(-1, 1)).flatten() 127 | 128 | # Align LSTM output length with RandomForest test set 129 | align_len = min(len(test_dates), len(lstm_preds_all)) 130 | lstm_preds = lstm_preds_all[-align_len:] 131 | test_dates = test_dates[-align_len:] 132 | y_test = y_test[-align_len:] 133 | 134 | # ARIMA 135 | train_series, test_series = prepare_arima_data(df["Close"]) 136 | arima_model, arima_preds, arima_rmse = run_arima(train_series, test_series) 137 | 138 | # Assemble comparison table 139 | compare_df = pd.DataFrame({ 140 | "Date": test_dates, 141 | "Actual": y_test.values, 142 | "RandomForest": rf_preds[-align_len:], 143 | "LSTM": lstm_preds, 144 | "ARIMA": arima_preds.values[-align_len:], 145 | }) 146 | 147 | print("\n=== Prediction Comparison (last 5 points) ===") 148 | print(compare_df.tail(5).to_string(index=False)) 149 | 150 | print("\n=== RMSE Report ===") 151 | print(f"Random Forest RMSE: {rf_rmse:.2f}") 152 | print(f"LSTM Test RMSE: {lstm_rmse:.2f}") 153 | print(f"ARIMA RMSE: {arima_rmse:.2f}") 154 | print("Pipeline complete!") 155 | 156 | 157 | if __name__ == "__main__": 158 | main() 159 | -------------------------------------------------------------------------------- /CryptoScraper.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "CryptoScraper.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyMNxduQpnBeKaAzQpIgRPDZ", 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "id": "view-in-github", 21 | "colab_type": "text" 22 | }, 23 | "source": [ 24 | "\"Open" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": { 30 | "id": "zXrwcuzGkirp", 31 | "colab_type": "text" 32 | }, 33 | "source": [ 34 | "# **Scrape CryptoCurrency**\n", 35 | "\n", 36 | "* For Frequency (Daily, Hourly, Minute)\n", 37 | "* For all cryptocurrencies\n", 38 | "\n", 39 | "\n", 40 | "\n" 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": { 46 | "id": "D-53FVt4hDim", 47 | "colab_type": "text" 48 | }, 49 | "source": [ 50 | "Scrape BitCoinData RealTime using this API https://min-api.cryptocompare.com/\n", 51 | "\n", 52 | "1. Create a trial account\n", 53 | "2. Create a free token and fill it here\n", 54 | "3. Fetch Latest Bitcoin data" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": { 60 | "id": "FJ0hmhsnhe7A", 61 | "colab_type": "text" 62 | }, 63 | "source": [ 64 | "# Bitcoin Scraper " 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "metadata": { 70 | "id": "KWZg0nQthAiT", 71 | "colab_type": "code", 72 | "colab": {} 73 | }, 74 | "source": [ 75 | "from datetime import datetime\n", 76 | "import pandas as pd\n", 77 | "import requests\n", 78 | "\n", 79 | "\n", 80 | "def convertTimeStampToUTC(data):\n", 81 | " from datetime import datetime\n", 82 | " return datetime.fromtimestamp(data)\n", 83 | " \n", 84 | "def getURL(apiKey,cryptoSymbol,frequency,timestamp,MaxRecordsToGetOnEachCall):\n", 85 | " API_KEY='&api_key='+str(apiKey)\n", 86 | " limit='&limit='+str(MaxRecordsToGetOnEachCall)\n", 87 | " cryptoHeader='fsym='+str(cryptoSymbol)\n", 88 | " ouputCurrency='&tsym=USD'\n", 89 | "\n", 90 | " if(timestamp==\"\"):\n", 91 | " url='https://min-api.cryptocompare.com/data/v2/histo'+frequency+'?'+cryptoHeader\n", 92 | " else: \n", 93 | " url='https://min-api.cryptocompare.com/data/v2/histo'+frequency+'?'+cryptoHeader+'&toTs='+str(timestamp)\n", 94 | "\n", 95 | " return url+ouputCurrency+API_KEY+limit \n", 96 | "\n", 97 | "\n", 98 | "def getCryptoData(apikey,crypto,frequency,numOfTimesToHitApi,MaxRecordsToGetOnEachCall):\n", 99 | " numOfTimesToHitApi=5\n", 100 | " data=pd.DataFrame()\n", 101 | " nextTimeStamp=0\n", 102 | "\n", 103 | " for i in range(0,numOfTimesToHitApi):\n", 104 | " if(nextTimeStamp==0):\n", 105 | " url=getURL(apikey,crypto,frequency,\"\",MaxRecordsToGetOnEachCall)\n", 106 | " else:\n", 107 | " url=getURL(apikey,crypto,frequency,nextTimeStamp,MaxRecordsToGetOnEachCall)\n", 108 | "\n", 109 | " response = requests.get(url).json()\n", 110 | " partialData=pd.DataFrame(response.get('Data').get('Data'))\n", 111 | " nextTimeStamp=partialData['time'].min()-1\n", 112 | " data=pd.concat([data,partialData])\n", 113 | "\n", 114 | "\n", 115 | " data=data.sort_values(by=['time'],ignore_index=True)\n", 116 | " data['timeUTC']=data['time'].apply(convertTimeStampToUTC)\n", 117 | " data=data.reset_index(drop=True)\n", 118 | " return data\n" 119 | ], 120 | "execution_count": 0, 121 | "outputs": [] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "metadata": { 126 | "id": "oxxYi4oohqJl", 127 | "colab_type": "code", 128 | "colab": {} 129 | }, 130 | "source": [ 131 | "" 132 | ], 133 | "execution_count": 0, 134 | "outputs": [] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": { 139 | "id": "hv3i969ohsnH", 140 | "colab_type": "text" 141 | }, 142 | "source": [ 143 | "# Invoke BitCoin Scraper" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "metadata": { 149 | "id": "PWIk1Vm6hr64", 150 | "colab_type": "code", 151 | "colab": { 152 | "base_uri": "https://localhost:8080/", 153 | "height": 413 154 | }, 155 | "outputId": "dc087da5-102e-43fb-98df-2b85366e81a8" 156 | }, 157 | "source": [ 158 | "## Parameters To Scrape Any Bitcoin Data\n", 159 | "\n", 160 | "## API_KEY: Create a trial account on https://min-api.cryptocompare.com/ and create a API_KEY (Its free)\n", 161 | "## Valid Values for crypto: BTC | ETH | XRP | BCH | BSV | LTC | EOS | XMR | ADA and Many More\n", 162 | "## numOfTimesToHitApi: For Trial Account this is somwhere 1000 per second, which is sufficient here\n", 163 | "## MaxRecordsToGetOnEachCall: Max is 2000\n", 164 | "## frequency : Valid Options are day|hour|minute\n", 165 | "\n", 166 | "API_KEY=\"\"\n", 167 | "crypto=\"BTC\"\n", 168 | "numOfTimesToHitApi=5\n", 169 | "MaxRecordsToGetOnEachCall=200\n", 170 | "frequency=\"hour\"\n", 171 | "\n", 172 | "cryptoData=getCryptoData(API_KEY,crypto,frequency,numOfTimesToHitApi,MaxRecordsToGetOnEachCall)\n", 173 | "cryptoData" 174 | ], 175 | "execution_count": 2, 176 | "outputs": [ 177 | { 178 | "output_type": "execute_result", 179 | "data": { 180 | "text/html": [ 181 | "
\n", 182 | "\n", 195 | "\n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | "
timehighlowopenvolumefromvolumetocloseconversionTypeconversionSymboltimeUTC
015839856007671.977574.947671.973575.2927208739.927634.05direct2020-03-12 04:00:00
115839892007664.827609.077634.051549.6311831969.347653.71direct2020-03-12 05:00:00
215839928007656.607470.017653.716044.1845503478.497510.10direct2020-03-12 06:00:00
315839964007510.647368.717510.108287.6061461972.467396.02direct2020-03-12 07:00:00
415840000007466.437321.577396.026152.7145465855.447383.65direct2020-03-12 08:00:00
.................................
100015875856007123.767094.557098.281009.657182051.747119.91direct2020-04-22 20:00:00
100115875892007140.167100.177119.911127.318033871.977102.78direct2020-04-22 21:00:00
100215875928007124.717096.367102.781100.927832794.377120.72direct2020-04-22 22:00:00
100315875964007135.417113.247120.721193.308502019.007135.41direct2020-04-22 23:00:00
100415876000007152.447110.827135.411375.449805176.617125.60direct2020-04-23 00:00:00
\n", 357 | "

1005 rows × 10 columns

\n", 358 | "
" 359 | ], 360 | "text/plain": [ 361 | " time high ... conversionSymbol timeUTC\n", 362 | "0 1583985600 7671.97 ... 2020-03-12 04:00:00\n", 363 | "1 1583989200 7664.82 ... 2020-03-12 05:00:00\n", 364 | "2 1583992800 7656.60 ... 2020-03-12 06:00:00\n", 365 | "3 1583996400 7510.64 ... 2020-03-12 07:00:00\n", 366 | "4 1584000000 7466.43 ... 2020-03-12 08:00:00\n", 367 | "... ... ... ... ... ...\n", 368 | "1000 1587585600 7123.76 ... 2020-04-22 20:00:00\n", 369 | "1001 1587589200 7140.16 ... 2020-04-22 21:00:00\n", 370 | "1002 1587592800 7124.71 ... 2020-04-22 22:00:00\n", 371 | "1003 1587596400 7135.41 ... 2020-04-22 23:00:00\n", 372 | "1004 1587600000 7152.44 ... 2020-04-23 00:00:00\n", 373 | "\n", 374 | "[1005 rows x 10 columns]" 375 | ] 376 | }, 377 | "metadata": { 378 | "tags": [] 379 | }, 380 | "execution_count": 2 381 | } 382 | ] 383 | }, 384 | { 385 | "cell_type": "markdown", 386 | "metadata": { 387 | "id": "vu9Whyf_jfss", 388 | "colab_type": "text" 389 | }, 390 | "source": [ 391 | "\n", 392 | "Get Daily Bitcoin Rate\n" 393 | ] 394 | }, 395 | { 396 | "cell_type": "code", 397 | "metadata": { 398 | "id": "l_X1CkVbh1Mv", 399 | "colab_type": "code", 400 | "colab": { 401 | "base_uri": "https://localhost:8080/", 402 | "height": 413 403 | }, 404 | "outputId": "1f8adef1-3990-4cb7-f7fe-b28ed62e1db7" 405 | }, 406 | "source": [ 407 | "API_KEY=\"\"\n", 408 | "crypto=\"BTC\"\n", 409 | "numOfTimesToHitApi=5\n", 410 | "MaxRecordsToGetOnEachCall=200\n", 411 | "frequency=\"day\"\n", 412 | "\n", 413 | "cryptoData=getCryptoData(API_KEY,crypto,frequency,numOfTimesToHitApi,MaxRecordsToGetOnEachCall)\n", 414 | "cryptoData" 415 | ], 416 | "execution_count": 4, 417 | "outputs": [ 418 | { 419 | "output_type": "execute_result", 420 | "data": { 421 | "text/html": [ 422 | "
\n", 423 | "\n", 436 | "\n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | "
timehighlowopenvolumefromvolumetocloseconversionTypeconversionSymboltimeUTC
015008544002798.892715.692756.6183009.252.290474e+082763.42direct2017-07-24
115009408002779.082472.622763.42205883.155.347654e+082582.58direct2017-07-25
215010272002631.732441.542582.58135502.933.404652e+082559.21direct2017-07-26
315011136002712.922547.742559.21103832.542.698809e+082691.88direct2017-07-27
415012000002843.782683.592691.88138904.863.834798e+082806.75direct2017-07-28
.................................
100015872544007276.847072.337264.2929493.832.114224e+087132.88direct2020-04-19
100115873408007225.236770.077132.8864707.004.523198e+086842.45direct2020-04-20
100215874272006948.786779.516842.4544531.913.058443e+086855.11direct2020-04-21
100315875136007165.436831.446855.1143780.723.082545e+087135.41direct2020-04-22
100415876000007152.447110.827135.411478.461.053967e+077129.93direct2020-04-23
\n", 598 | "

1005 rows × 10 columns

\n", 599 | "
" 600 | ], 601 | "text/plain": [ 602 | " time high low ... conversionType conversionSymbol timeUTC\n", 603 | "0 1500854400 2798.89 2715.69 ... direct 2017-07-24\n", 604 | "1 1500940800 2779.08 2472.62 ... direct 2017-07-25\n", 605 | "2 1501027200 2631.73 2441.54 ... direct 2017-07-26\n", 606 | "3 1501113600 2712.92 2547.74 ... direct 2017-07-27\n", 607 | "4 1501200000 2843.78 2683.59 ... direct 2017-07-28\n", 608 | "... ... ... ... ... ... ... ...\n", 609 | "1000 1587254400 7276.84 7072.33 ... direct 2020-04-19\n", 610 | "1001 1587340800 7225.23 6770.07 ... direct 2020-04-20\n", 611 | "1002 1587427200 6948.78 6779.51 ... direct 2020-04-21\n", 612 | "1003 1587513600 7165.43 6831.44 ... direct 2020-04-22\n", 613 | "1004 1587600000 7152.44 7110.82 ... direct 2020-04-23\n", 614 | "\n", 615 | "[1005 rows x 10 columns]" 616 | ] 617 | }, 618 | "metadata": { 619 | "tags": [] 620 | }, 621 | "execution_count": 4 622 | } 623 | ] 624 | }, 625 | { 626 | "cell_type": "markdown", 627 | "metadata": { 628 | "id": "vhtZO9GxjhMW", 629 | "colab_type": "text" 630 | }, 631 | "source": [ 632 | "Get Every Minute of Bitcoin Price" 633 | ] 634 | }, 635 | { 636 | "cell_type": "code", 637 | "metadata": { 638 | "id": "4ovlVZudjhYn", 639 | "colab_type": "code", 640 | "colab": { 641 | "base_uri": "https://localhost:8080/", 642 | "height": 413 643 | }, 644 | "outputId": "5184315e-41b7-4e00-ad38-b4cc66db4a03" 645 | }, 646 | "source": [ 647 | "API_KEY=\"\"\n", 648 | "crypto=\"BTC\"\n", 649 | "numOfTimesToHitApi=5\n", 650 | "MaxRecordsToGetOnEachCall=200\n", 651 | "frequency=\"minute\"\n", 652 | "\n", 653 | "cryptoData=getCryptoData(API_KEY,crypto,frequency,numOfTimesToHitApi,MaxRecordsToGetOnEachCall)\n", 654 | "cryptoData" 655 | ], 656 | "execution_count": 5, 657 | "outputs": [ 658 | { 659 | "output_type": "execute_result", 660 | "data": { 661 | "text/html": [ 662 | "
\n", 663 | "\n", 676 | "\n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | "
timehighlowopenvolumefromvolumetocloseconversionTypeconversionSymboltimeUTC
015875434806956.056951.096951.0923.080160433.106955.98direct2020-04-22 08:18:00
115875435406956.716955.716955.984.89534046.806955.88direct2020-04-22 08:19:00
215875436006956.386954.246955.8837.710262219.936954.75direct2020-04-22 08:20:00
315875436606954.766954.446954.753.22322407.706954.44direct2020-04-22 08:21:00
415875437206956.876954.256954.4410.95076207.626955.57direct2020-04-22 08:22:00
.................................
100015876034807129.567128.667129.2810.74076532.657129.17direct2020-04-23 00:58:00
100115876035407129.457126.767129.1726.470188599.657126.88direct2020-04-23 00:59:00
100215876036007127.247125.597126.8824.010171058.447125.59direct2020-04-23 01:00:00
100315876036607129.797123.117125.599.07264643.107129.20direct2020-04-23 01:01:00
100415876037207129.307129.207129.200.0000.007129.30direct2020-04-23 01:02:00
\n", 838 | "

1005 rows × 10 columns

\n", 839 | "
" 840 | ], 841 | "text/plain": [ 842 | " time high ... conversionSymbol timeUTC\n", 843 | "0 1587543480 6956.05 ... 2020-04-22 08:18:00\n", 844 | "1 1587543540 6956.71 ... 2020-04-22 08:19:00\n", 845 | "2 1587543600 6956.38 ... 2020-04-22 08:20:00\n", 846 | "3 1587543660 6954.76 ... 2020-04-22 08:21:00\n", 847 | "4 1587543720 6956.87 ... 2020-04-22 08:22:00\n", 848 | "... ... ... ... ... ...\n", 849 | "1000 1587603480 7129.56 ... 2020-04-23 00:58:00\n", 850 | "1001 1587603540 7129.45 ... 2020-04-23 00:59:00\n", 851 | "1002 1587603600 7127.24 ... 2020-04-23 01:00:00\n", 852 | "1003 1587603660 7129.79 ... 2020-04-23 01:01:00\n", 853 | "1004 1587603720 7129.30 ... 2020-04-23 01:02:00\n", 854 | "\n", 855 | "[1005 rows x 10 columns]" 856 | ] 857 | }, 858 | "metadata": { 859 | "tags": [] 860 | }, 861 | "execution_count": 5 862 | } 863 | ] 864 | }, 865 | { 866 | "cell_type": "markdown", 867 | "metadata": { 868 | "id": "SzJvZDYRjhmV", 869 | "colab_type": "text" 870 | }, 871 | "source": [ 872 | "Get Ethereum Price, frequency daily" 873 | ] 874 | }, 875 | { 876 | "cell_type": "code", 877 | "metadata": { 878 | "id": "q3ERdzMMjhyH", 879 | "colab_type": "code", 880 | "colab": { 881 | "base_uri": "https://localhost:8080/", 882 | "height": 413 883 | }, 884 | "outputId": "d288fd2f-7115-4c12-c5d7-55c7d41db8d3" 885 | }, 886 | "source": [ 887 | "API_KEY=\"\"\n", 888 | "crypto=\"ETH\"\n", 889 | "numOfTimesToHitApi=5\n", 890 | "MaxRecordsToGetOnEachCall=200\n", 891 | "frequency=\"day\"\n", 892 | "\n", 893 | "cryptoData=getCryptoData(API_KEY,crypto,frequency,numOfTimesToHitApi,MaxRecordsToGetOnEachCall)\n", 894 | "cryptoData" 895 | ], 896 | "execution_count": 6, 897 | "outputs": [ 898 | { 899 | "output_type": "execute_result", 900 | "data": { 901 | "text/html": [ 902 | "
\n", 903 | "\n", 916 | "\n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | "
timehighlowopenvolumefromvolumetocloseconversionTypeconversionSymboltimeUTC
01500854400229.56224.04228.32397799.349.016589e+07225.48direct2017-07-24
11500940800225.98192.64225.481382784.112.853748e+08203.59direct2017-07-25
21501027200209.29193.10203.59809346.641.616593e+08202.88direct2017-07-26
31501113600205.68198.93202.88504777.471.020094e+08202.93direct2017-07-27
41501200000203.93189.77202.93631780.701.234255e+08191.21direct2017-07-28
.................................
10001587254400185.31178.32187.851929266.853.478839e+08180.32multiplyBTC2020-04-19
10011587340800176.88169.08180.322362597.954.031790e+08170.65multiplyBTC2020-04-20
10021587427200173.37170.14170.651526448.922.610762e+08171.03multiplyBTC2020-04-21
10031587513600183.59177.67171.031563640.092.861825e+08183.02multiplyBTC2020-04-22
10041587600000183.65181.76183.0414310.172.614673e+06182.49direct2020-04-23
\n", 1078 | "

1005 rows × 10 columns

\n", 1079 | "
" 1080 | ], 1081 | "text/plain": [ 1082 | " time high low ... conversionType conversionSymbol timeUTC\n", 1083 | "0 1500854400 229.56 224.04 ... direct 2017-07-24\n", 1084 | "1 1500940800 225.98 192.64 ... direct 2017-07-25\n", 1085 | "2 1501027200 209.29 193.10 ... direct 2017-07-26\n", 1086 | "3 1501113600 205.68 198.93 ... direct 2017-07-27\n", 1087 | "4 1501200000 203.93 189.77 ... direct 2017-07-28\n", 1088 | "... ... ... ... ... ... ... ...\n", 1089 | "1000 1587254400 185.31 178.32 ... multiply BTC 2020-04-19\n", 1090 | "1001 1587340800 176.88 169.08 ... multiply BTC 2020-04-20\n", 1091 | "1002 1587427200 173.37 170.14 ... multiply BTC 2020-04-21\n", 1092 | "1003 1587513600 183.59 177.67 ... multiply BTC 2020-04-22\n", 1093 | "1004 1587600000 183.65 181.76 ... direct 2020-04-23\n", 1094 | "\n", 1095 | "[1005 rows x 10 columns]" 1096 | ] 1097 | }, 1098 | "metadata": { 1099 | "tags": [] 1100 | }, 1101 | "execution_count": 6 1102 | } 1103 | ] 1104 | }, 1105 | { 1106 | "cell_type": "code", 1107 | "metadata": { 1108 | "id": "TNb-HFryj-Q8", 1109 | "colab_type": "code", 1110 | "colab": {} 1111 | }, 1112 | "source": [ 1113 | "|" 1114 | ], 1115 | "execution_count": 0, 1116 | "outputs": [] 1117 | } 1118 | ] 1119 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Manthan Thakker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MLPresentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manthanthakker/BitcoinPrediction/aa7828be14955b64b0a3c8edc57b646ba1376505/MLPresentation.pdf -------------------------------------------------------------------------------- /Machine_Learning_Project_Report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manthanthakker/BitcoinPrediction/aa7828be14955b64b0a3c8edc57b646ba1376505/Machine_Learning_Project_Report.pdf -------------------------------------------------------------------------------- /PredictStockPricesRNN.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import tensorflow as tf 4 | import yfinance as yf 5 | 6 | # function to download and preprocess real-time data for Microsoft stock 7 | def get_data(): 8 | # use Yahoo Finance API to download real-time data for Microsoft stock 9 | msft = yf.Ticker("MSFT") 10 | df = msft.history(period="1d", interval="1m") 11 | 12 | # clean and format data 13 | df = df.dropna() 14 | df = df[['Close']] 15 | df = df.reset_index(drop=True) 16 | 17 | # normalize data 18 | df['Close'] = df['Close'] / df['Close'].iloc[0] 19 | 20 | return df 21 | 22 | # function to split data into training and testing sets 23 | def split_data(df, train_frac=0.8): 24 | # split data into training and testing sets 25 | train_size = int(len(df) * train_frac) 26 | train_data = df.iloc[:train_size] 27 | test_data = df.iloc[train_size:] 28 | 29 | # convert data to numpy arrays 30 | X_train = np.array(train_data['Close']) 31 | X_test = np.array(test_data['Close']) 32 | 33 | return (X_train, X_test) 34 | 35 | # function to create and train RNN 36 | def train_rnn(X_train, X_test): 37 | # create RNN model 38 | model = tf.keras.Sequential() 39 | model.add(tf.keras.layers.LSTM(units=50, input_shape=(1, 1))) 40 | model.add(tf.keras.layers.Dense(units=1)) 41 | model.compile(loss='mean_squared_error', optimizer='adam') 42 | 43 | # reshape data for use with RNN 44 | X_train = X_train.reshape((X_train.shape[0], 1, 1)) 45 | X_test = X_test.reshape((X_test.shape[0], 1, 1)) 46 | 47 | # check shapes of input data 48 | print(f"X_train shape: {X_train.shape}") 49 | print(f"X_test shape: {X_test.shape}") 50 | 51 | # train RNN 52 | model.fit(X_train, X_train, epochs=100, batch_size=1, verbose=2) 53 | 54 | return model 55 | 56 | # function to evaluate RNN 57 | def evaluate_rnn(model, X_test): 58 | # make predictions with RNN 59 | predictions = model.predict(X_test) 60 | 61 | # calculate mean squared error 62 | mse = np.mean((predictions - X_test)**2) 63 | 64 | return mse 65 | 66 | # function to make predictions with RNN 67 | def predict_with_rnn(model, X_test): 68 | # make predictions with RNN 69 | predictions = model.predict(X_test) 70 | 71 | return predictions 72 | 73 | def main(): 74 | # download and preprocess data 75 | df = get_data() 76 | 77 | # split data into training and testing sets 78 | X_train, X_test = split_data(df) 79 | 80 | # create and train RNN 81 | model = train_rnn(X_train, X_test) 82 | 83 | # evaluate RNN 84 | mse = evaluate_rnn(model, X_test) 85 | print(f"Mean Squared Error: {mse}") 86 | 87 | # make predictions with RNN 88 | predictions = predict_with_rnn(model, X_test) 89 | print(predictions) 90 | 91 | # call main function 92 | if __name__ == "__main__": 93 | main() 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BitcoinPrediction 2 | 3 | ### CryptoCurrency prediction using Deep Recurrent Neural Networks 4 | This repository contains various Machine learning models used in industry to predict stock prices and cryptocurrency in finance industry. 5 | 6 | - Fundamental analysis of the stock price using Yahoo Finance 7 | - Data Visualization using Seaborn 8 | - ARIMA model to capture the trends,seasonality, forecast the prices and use as a baseline 9 | - Simpler machine learning models (Random Forest, Regression etc) 10 | - Recurrent Neural Networks / Long Short Term Memory Networks 11 | 12 | Each model is compared against each other to highlight pros and cons of each model. 13 | 14 | ### Install 15 | 16 | This project requires **Python** and the following Python libraries installed: 17 | 18 | - [NumPy](http://www.numpy.org/) 19 | - [Pandas](http://pandas.pydata.org/) 20 | - [matplotlib](http://matplotlib.org/) 21 | - [scikit-learn](http://scikit-learn.org/stable/) 22 | - [fastai] 23 | - [pytorch] 24 | 25 | You will also need to have software installed to run and execute a [Jupyter Notebook](http://ipython.org/notebook.html) 26 | 27 | If you do not have Python installed yet, it is highly recommended that you install the [Anaconda](http://continuum.io/downloads) distribution of Python, which already has the above packages and more included. 28 | 29 | ### Code 30 | 31 | The source code is divided into multiple sections following the machine learning design pattern of : Data Exploration, Training, Testing and Hyperparameter Optimization. 32 | You can view the precompiled version of the notebook or you can rerun the entire notebook. The datasets are made available on public S3 Buckets. 33 | Running the notebook, will automatically download the datasets for you. 34 | 35 | ### Run 36 | 37 | In a terminal or command window, navigate to the top-level project directory `boston_housing/` (that contains this README) and run one of the following commands: 38 | 39 | ```bash 40 | ipython notebook BitcoinPredictionRNN.ipynb 41 | ``` 42 | or 43 | ```bash 44 | jupyter notebook BitcoinPredictionRNN.ipynb 45 | ``` 46 | 47 | You can also run the entire training and evaluation pipeline from the command 48 | line: 49 | 50 | ```bash 51 | python bitcoin_prediction_pipeline.py 52 | ``` 53 | 54 | The script downloads the latest Bitcoin price data and trains Random Forest, 55 | LSTM and ARIMA models. At the end it prints a comparison table of predictions 56 | and a summary of RMSE values. 57 | 58 | 59 | This will open the Jupyter Notebook software and project file in your browser. 60 | 61 | ### Data 62 | BitCoin Price Data from Jan 2015- August 2018. The prices are as per coinbase cryptoexchange. There were many missing values and forward strategy was used to fill these missing values. 63 | 64 | **Features** 65 | BitCoin Price Data from Jan 2015- August 2018 66 | 67 | **Target Variable** 68 | `Close Price`: Close price of Bitcoin for each day 69 | --------------------------------------------------------------------------------