{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Recurrent Neural Networks and Bitcoins\n", "\n", "### Marco Tavora" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction\n", "\n", "Nowadays most articles about bitcoin are speculative. Analyses based on strong technical foundations are rare.\n", "\n", "My goal in this project is to build predictive models for the price of Bitcoins and other cryptocurrencies. To accomplish that, I will:\n", "- Use first Long Short-Term Memory recurrent neural networks (LSTMs) for predictions;\n", "- I will then study correlations between altcoins;\n", "- The third step will be to repeat the first analysis using traditional time series.\n", "\n", "For a thorough introduction to Bitcoins you can check this [book](https://github.com/bitcoinbook/bitcoinbook). For LSTM [this](http://colah.github.io/posts/2015-08-Understanding-LSTMs/) is a great source." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Importing libraries" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/vnd.plotly.v1+html": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import statsmodels.api as sm\n", "import aux_functions as af \n", "from scipy import stats\n", "import keras\n", "import pickle\n", "import quandl\n", "from keras.models import Sequential\n", "from keras.layers import Activation, Dense,LSTM,Dropout\n", "from sklearn.metrics import mean_squared_error\n", "from math import sqrt\n", "from random import randint\n", "from keras import initializers\n", "import datetime\n", "from datetime import datetime\n", "from matplotlib import pyplot as plt\n", "import json\n", "import requests\n", "import plotly.offline as py\n", "import plotly.graph_objs as go\n", "py.init_notebook_mode(connected=True)\n", "%matplotlib inline\n", "from IPython.core.interactiveshell import InteractiveShell\n", "InteractiveShell.ast_node_interactivity = \"all\" # see the value of multiple statements at once.\n", "pd.set_option('display.max_columns', None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data\n", "\n", "There are several ways to fetch historical data for Bitcoins (or any other cryptocurrency). Here are a few examples:\n", "\n", "### Flat files\n", "If a flat file already available, we can just read it using `pandas`. For example, one of the datasets that will be used in this notebook can be found [here](https://www.kaggle.com/mczielinski/bitcoin-historical-data/data). This data is from *bitFlyer* a Bitcoin exchange and marketplace." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TimestampOpenHighLowCloseVolume_(BTC)Volume_(Currency)Weighted_Price
014991552602961272965582960162965401.1586003.432441e+05296257.67168
1149915532029653929676929606029667911.1155103.295332e+06296462.51372
214991553802960602960902960602960605.5274941.636491e+06296063.83615
314991554402960602962602960152960158.4140642.491620e+06296125.66780
414991555002963612965402961552961553.9930101.183292e+06296340.78573
\n", "
" ], "text/plain": [ " Timestamp Open High Low Close Volume_(BTC) \\\n", "0 1499155260 296127 296558 296016 296540 1.158600 \n", "1 1499155320 296539 296769 296060 296679 11.115510 \n", "2 1499155380 296060 296090 296060 296060 5.527494 \n", "3 1499155440 296060 296260 296015 296015 8.414064 \n", "4 1499155500 296361 296540 296155 296155 3.993010 \n", "\n", " Volume_(Currency) Weighted_Price \n", "0 3.432441e+05 296257.67168 \n", "1 3.295332e+06 296462.51372 \n", "2 1.636491e+06 296063.83615 \n", "3 2.491620e+06 296125.66780 \n", "4 1.183292e+06 296340.78573 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('bitcoin_data.csv')\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This dataset from [Kaggle](https://www.kaggle.com/mczielinski/bitcoin-historical-data/kernels) contains, for the time period of 01/2012-03/2018, minute-to-minute updates of the open, high, low and close prices (OHLC), the volume in BTC and indicated currency, and the [weighted bitcoin price](https://github.com/Bitcoin-Foundation-Italia/bitcoin-wp). " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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TTz13V6j1216cTC8vQQGvL2xxs9e8cwAdIgOrfH1RERERDUuXCOECAbgJUlSgeb1WgCzAQwFcF2nqEy4JEkvCyGSATyN6sI18yVJStIUrkkHkKC59V5UFq7JFULsQWWxm134//buPDyqIt3j+K8ChH3fRNawyaJshoCCOAoiBO/FqzDiOIOC21zc7zM6gDrjKCA6g17X8XGUxX27uIIDiM6AKGJA1gFZQlBAdkGQYUlS94+uNN2d7k53SHI66e/nec6T7urq05Xzck54u+pU+SauecpaO9cY8+dwnxGtvUxcg9J07GSeOt3/d0nSnNv7a9iTnxd7X6v+OFhZOQd08OhJXXlui4j17njjG72/cmfE1+OVec4Zevaac4v9/qcWbtK0BRuDyu4c1EF3DupYqO573+zwD7eN16bJQwv1zCWaK55dohXfHYzrPY+O6BbUO/vpht2yVvpw1U69FxLnQZ2b6JEru6lhraol0l4AAJAcYp245nSSxLaS3nVPK0t6zVo72RjTUNJbklpJ+k7SSJfwGUlPSxoi3xIYY6y1WW5fYyVNdPuabK2d4crTdWoJjI8l3eaWwAj7GdHaS5KI0hTLguWhZozprTEzvo65/pYpmarketFueXWF5qz5IWr9F69N10erf9C8dbt09ESefwKar3MO+Hv9Uoy0eXLJ9M7l51uNn71ab2WdupU4Us9kpIlaYlXcHs+Cz728x5n631E9i/350ew7clzpIUOKw2lYM1XL778kpn0u2bxPM5bk6JP1uyVJyyYOVJM61U6rnQAAIPmUepJY3pAkojRFShIX3X2RBvy58NDBqzNa6uEruslaq017juiaF74KmowkknaNa2rO7Rf4ey0jKSqJeuazzWpRv7qG92getV68fj6eq65uqO27485Xz1b1I9YtTmJdYMNDQ+Je42/9Dz9p6BOLg8p+md5C44d2Vq+HFuiV6/uof4dGxW5TgVh+r8X3XKSWDWrEve9t+39Wveqpqluj+EOSAQBA8iJJDEGSiNISOklNgddu7KPz2jYM22MWOmto9t4junjaP0+7LYkwWUlBklTUsh+rtx/Ufz69RNNGdtfgrk11zgPzw9b7/ZBOunlA26B7/CTp5gvbavyQTjFNaJOXb9VuYmw9lxd0aKSXr+8TU92vsvfrqueX+p83r1ddOw6eWh5k/l0D1LFpbf8x+cVZ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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lst_col = df.shape[1]-1\n", "df.iloc[:,lst_col].plot(lw=2, figsize=(15,5));\n", "plt.legend(['Bitcoin'], loc='upper left',fontsize = 'x-large');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Retrieve Data from Quandl's API\n", "Another possibility is to retrieve Bitcoin pricing data using Quandl's free [Bitcoin API](https://blog.quandl.com/api-for-bitcoin-data). For example, to obtain the daily bitcoin exchange rate (BTC vs. USD) on Bitstamp (Bitstamp is a bitcoin exchange based in Luxembourg) we use the code snippet below. The function `quandl_data` is inside the library `af`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded BCHARTS/KRAKENUSD from cache\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
openhighlowclosevolume_btcvolume_currencyweighted_price
Date
2014-01-07874.67040892.06753810.00000810.0000015.62237813151.472844841.835522
2014-01-08810.00000899.84281788.00000824.9828719.18275616097.329584839.156269
2014-01-09825.56345870.00000807.42084841.869348.1583356784.249982831.572913
2014-01-10839.99000857.34056817.00000857.330568.0245106780.220188844.938794
2014-01-11858.20000918.05471857.16554899.8410518.74828516698.566929890.671709
\n", "
" ], "text/plain": [ " open high low close volume_btc \\\n", "Date \n", "2014-01-07 874.67040 892.06753 810.00000 810.00000 15.622378 \n", "2014-01-08 810.00000 899.84281 788.00000 824.98287 19.182756 \n", "2014-01-09 825.56345 870.00000 807.42084 841.86934 8.158335 \n", "2014-01-10 839.99000 857.34056 817.00000 857.33056 8.024510 \n", "2014-01-11 858.20000 918.05471 857.16554 899.84105 18.748285 \n", "\n", " volume_currency weighted_price \n", "Date \n", "2014-01-07 13151.472844 841.835522 \n", "2014-01-08 16097.329584 839.156269 \n", "2014-01-09 6784.249982 831.572913 \n", "2014-01-10 6780.220188 844.938794 \n", "2014-01-11 16698.566929 890.671709 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quandl_id = 'BCHARTS/KRAKENUSD'\n", "df_qdl = af.quandl_data(quandl_id)\n", "df_qdl.columns = [c.lower().replace(' ', '_').replace('(', '').replace(')', '') for c in df_qdl.columns.values]\n", "df_qdl.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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Cgo0e/bs0Pm//Mu/6KWXXtLvfve7dqGvo+fec889Ov/88/W9730v1Pa///u/Gjp0qJ5//nlddNFFkqSmpiY99thjoZD17W9/W5/73OfU2NgYCobdkZqaqkcffVTXX3+9Hn30UR177LE67bTTdOGFF2rhwoXdesasWbPknNP27dsJfQAAAHFUGxX6qhtb+mkkiAemdyag559/XldeeaWeeOKJiGDW5oQTTog4r6+v1+23366ZM2dq2LBhysnJ0XPPPRcxNbOr565YsUJPP/20cnJyQj/Dhw9XY2OjNm/eHOpXVFQUEbCKi4vlnFN5eXmPv+fFF1+s3bt36/nnn9ell16qdevWadGiRbr55pu7dX/btFTmlwMAAMRXdKWvusHXQU8MBElT6evN9Mr+MmvWLGVkZOiXv/ylFi9erLS0tNA1j8fTrqL2rW99S0uXLtW9994betfuG9/4hqqqqrr93EAgoKuuukq33357u/EMHz48dBx+j3Q4cAUCrfu3pKeny+/3q66urt2UzcrKSk2ePDmiLT09XQsXLtTChQt1xx136O6779Z3vvMdfetb39L48eM7/ee0du1amZkmTpzYaT8AAAD0TLvQR6VvQKPSl4BKSkr02muvaePGjbr44ovV1NTUaf/XXntNn//85/XZz35Wc+bM0cSJE7Vp06YePXf+/Plas2aNJk2apMmTJ0f8DB06tNtjnzZtmiRp+fLlEe1VVVXatGlT6HpHpk+fLkmqqKjotF91dbWWLFmiRYsWRYRSAAAA9F1DS+TCLdUNhL6BjNCXoIqKivTqq69qx44duuCCC9TQ0NBh36lTp2rp0qVavny51q1bpxtuuEF79uzp0XPvvPNOrV+/XldeeaWWL1+u7du365VXXtGtt96qbdu2dXvc8+bN04IFC3TjjTfq2Wef1fbt2/XWW2/p8ssvV0ZGhq688kpJrXv0LViwQI8++qhWr16tHTt26Nlnn9Udd9yhCRMmaO7cuaFnNjc3a+/evSorK9O6dev08MMP68QTT1RTU5OWLFnS7bEBAACgexpbAhHn1Y1M7xzICH0JbPTo0Xr11Ve1d+9enX/++aqvr4/Z7yc/+YnGjRunM844Q4sWLVJxcbE+/elP9+i506dP15tvvqna2lqdffbZmjFjhq6//no1NDQoPz+/R+P+y1/+oksvvVTf/OY3NXPmTF1+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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lst_col_2 = df_qdl.shape[1]-1\n", "df_qdl.iloc[:,lst_col_2].plot(lw=3, figsize=(15,5));\n", "plt.legend(['krakenUSD'], loc='upper left',fontsize = 'x-large');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Retrieve Data from cryptocompare.com\n", "Another possibility is to retrieve data from [cryptocompare](https://www.cryptocompare.com/). In this case, we use the `requests` packages to make a `.get` request (the object `res` is a `Response` object) such as:\n", "\n", " res = requests.get(URL)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenvolumefromvolumeto
time
2012-11-2212.4212.4311.6711.7758301.30703582.88
2012-11-2312.3512.4112.1312.4218967.90233370.93
2012-11-2412.4112.4812.2512.3519570.39242058.59
2012-11-2512.4812.6012.3112.4124023.69299989.40
2012-11-2612.2512.6511.8912.4835913.82443753.07
\n", "
" ], "text/plain": [ " close high low open volumefrom volumeto\n", "time \n", "2012-11-22 12.42 12.43 11.67 11.77 58301.30 703582.88\n", "2012-11-23 12.35 12.41 12.13 12.42 18967.90 233370.93\n", "2012-11-24 12.41 12.48 12.25 12.35 19570.39 242058.59\n", "2012-11-25 12.48 12.60 12.31 12.41 24023.69 299989.40\n", "2012-11-26 12.25 12.65 11.89 12.48 35913.82 443753.07" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res = requests.get('https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=2000')\n", "df_cc = pd.DataFrame(json.loads(res.content)['Data']).set_index('time')\n", "df_cc.index = pd.to_datetime(df_cc.index, unit='s')\n", "df_cc.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2QAAAFICAYAAAA/GT2sAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xec3FW9//H3mbK9JtlNlhQSINUECARQQEQFpEm5FkDFiw0sqD8VsXLlKipXsSBW4KKiolcQCwgCAhHpJKGEVJKQsglJNsn2MvX8/pidyZTv7Hx3M7szk309H/DI7He+852zk9lk3vmc8znGWisAAAAAwNjzFHoAAAAAADBeEcgAAAAAoEAIZAAAAABQIAQyAAAAACgQAhkAAAAAFAiBDAAAAAAKZNQCmTHmNmPMbmPMyy7OPdQY87Ax5iVjzFJjzLTRGhcAAAAAFIvRrJD9StKZLs+9QdLt1tojJX1d0rdHa1AAAAAAUCxGLZBZax+TtC/5mDHmcGPMP4wxy40x/zbGzBu8a4GkhwdvPyrp/NEaFwAAAAAUi7FeQ3azpE9aa4+VdJWknw4ef1HSOwZvXyip1hgzcYzHBgAAAABjyjdWT2SMqZF0oqQ7jTHxw+WDv14l6cfGmMskPSZpu6TwWI0NAAAAAAphzAKZYtW4Dmvt0el3WGt3SPoPKRHc3mGt7RzDsQEAAADAmBuzKYvW2i5Jrxpj3iVJJuaowduTjDHxsXxJ0m1jNS4AAAAAKJTRbHv/e0lPSZprjGk1xnxI0nslfcgY86KkVdrfvONUSeuMMeslTZb0zdEaFwAAAAAUC2OtLfQYAAAAAGBcGusuiwAAAACAQQQyAAAAACiQUemyOGnSJDtz5szRuDQAAAAAFL3ly5fvsdY25TpvVALZzJkztWzZstG4NAAAAAAUPWPMFjfnMWURAAAAAAqEQAYAAAAABUIgAwAAAIACIZABAAAAQIEQyAAAAACgQEaly2IuXV1d2r17t0KhUCGeHqPA7/erublZdXV1hR4KAAAAUDLGPJB1dXVp165dmjp1qiorK2WMGeshIM+sterv79f27dsliVAGAAAAuDTmUxZ3796tqVOnqqqqijB2kDDGqKqqSlOnTtXu3bsLPRwAAACgZIx5IAuFQqqsrBzrp8UYqKysZBoqAAAAMAwFaepBZezgxO8rAABAcQlHorrhgXVavmVfoYeCLOiyCAAAAByk/m/ZNv340Q16x8+eKvRQkAWB7ABde+21OuKII4b1mFNPPVUf/vCHE19fdtllOu200/I9NAAAAIxzOzr6Cz0E5EAgK4C7775b3//+9/N6zV/96lcyxiT+r6ys1Lx58/S9730vcc7MmTNTznH6P27v3r26+uqrNXfuXFVUVKi5uVmnnHKKbr/9doXD4byOHQAAABivCrIP2Xg3YcKEUbmu1+tVa2urJKm/v18PPvigrrzySjU3N+vSSy/Vc889p0gkIkl67bXXdMwxx+hPf/qTTjzxxJTrtLa26qSTTpLP59PXv/51LV68WH6/X08++aRuuOEGHXnkkTr66KNH5XsAAAAAxhMqZMMQCAT0sY99TPX19WpsbNTHPvYxBQKBlHNWrFihs846S83NzaqpqdFxxx2nf/zjHynnpE9ZTPboo4/K6/Vq27ZtKcd//etfq7a2Vt3d3UOOccqUKZoyZYpmzZqlK664QkceeaSWLVsmSWpqakrc39TUJCkWDuPHpkyZIkmJ72vFihV673vfqwULFmj27Nn6z//8Ty1fvlyzZ892/6IBAAAAyIpANgxf/OIX9ac//Um33367nnrqKVVXV+snP/lJyjldXV26+OKLtXTpUq1YsUJve9vbdN5552n9+vWunuPNb36zZs+erdtuuy3l+K233qqLL75YtbW1rq5jrdXSpUu1Zs2ajArYUPbt26f77rtPV155perr6zPu9/v9qq6udn09AAAAANm5mrJojGmQdKukhZKspA9aa/PWqmXmF/+er0sNy+brz3F9bm9vr372s5/ppptu0vnnny9JuuGGG7R06VJ1dHQkzjv11FNTHnfdddfpnnvu0Z133qmvfOUrrp7r8ssv14033qhrrrlGHo9H69at0+OPP55z3VkkElFNTY2kWDUvHA7rc5/7nC666CLX3+eGDRsUjUa1YMEC148BAAAAMDJuK2Q3SvqHtXaepKMkrRm9IRWnjRs3KhAIZFSbTj755JSv29ra9PGPf1zz5s1TQ0ODampqtGrVKm3ZssX1c1122WXavXu3HnjgAUnSLbfcoqOOOkrHHXfckI/zer164YUX9MILL+jFF1/UHXfcodtvv13XXnut6+e21kpiTzEAAABgLOSskBlj6iSdIukySbLWBiUF8zmI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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lst_col = df_cc.shape[1]-1\n", "df_cc.iloc[:,lst_col].plot(lw=2, figsize=(15,5));\n", "plt.legend(['daily BTC'], loc='upper left',fontsize = 'x-large');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Handling\n", "\n", "Let us start with `df` (from *bitFlyer*) from Kaggle." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Checking for `NaNs` and making column titles cleaner\n", "\n", "Using `df.isnull().any()` we quickly see that the data does not contain null values. We get rid of upper cases, spaces, parentheses and so on, in the column titles." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp 0\n", "Open 0\n", "High 0\n", "Low 0\n", "Close 0\n", "Volume_(BTC) 0\n", "Volume_(Currency) 0\n", "Weighted_Price 0\n", "dtype: int64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestampopenhighlowclosevolume_btcvolume_currencyweighted_price
014991552602961272965582960162965401.1586003.432441e+05296257.67168
1149915532029653929676929606029667911.1155103.295332e+06296462.51372
214991553802960602960902960602960605.5274941.636491e+06296063.83615
314991554402960602962602960152960158.4140642.491620e+06296125.66780
414991555002963612965402961552961553.9930101.183292e+06296340.78573
\n", "
" ], "text/plain": [ " timestamp open high low close volume_btc volume_currency \\\n", "0 1499155260 296127 296558 296016 296540 1.158600 3.432441e+05 \n", "1 1499155320 296539 296769 296060 296679 11.115510 3.295332e+06 \n", "2 1499155380 296060 296090 296060 296060 5.527494 1.636491e+06 \n", "3 1499155440 296060 296260 296015 296015 8.414064 2.491620e+06 \n", "4 1499155500 296361 296540 296155 296155 3.993010 1.183292e+06 \n", "\n", " weighted_price \n", "0 296257.67168 \n", "1 296462.51372 \n", "2 296063.83615 \n", "3 296125.66780 \n", "4 296340.78573 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum()\n", "df.columns = [c.lower().replace(' ', '_').replace('(', '').replace(')', '') for c in df.columns.values]\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Group data by day and take the mean value\n", "\n", "\n", "Though Timestamps are in Unix time, this is easily taken care of using Python's `datetime` library:\n", "- `pd.to_datetime` converts the argument to `datetime` \n", "- `Series.dt.date` gives a numpy array of Python `datetime.date` objects\n", "\n", "We then drop the `Timestamp` column. The repeated dates occur simply because the data is collected minute-to-minute. Taking the daily mean using the method `daily_weighted_prices` from `af` we obtain:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "date\n", "2017-07-04 292177.556681\n", "2017-07-05 290562.675337\n", "2017-07-06 293182.524481\n", "2017-07-07 289683.612931\n", "2017-07-08 289174.397839\n", "Name: weighted_price, dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "daily = af.daily_weighted_prices(df,'date','timestamp','s')\n", "daily.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exploratory Data Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can look for trends and seasonality in the data. Joining train and test sets and using the functions `trend`, `seasonal`, `residue` and `plot_components` for `af`:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Trend, seasonality and residue" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "data": [ { "mode": "lines", "name": "trend", "type": "scatter", "x": [ 0, 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 ], "y": [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 360966.5382322159, 364830.4565204761, 368456.56250928814, 371741.15390936064, 375093.8596234242, 378641.72608085256, 382115.4810033606, 385453.2017361753, 388623.5031845606, 391731.70024299464, 394987.2160634983, 398353.0957520621, 401478.1502276137, 404088.1777449303, 406511.64549604163, 408946.691658835, 411409.4391566058, 413918.33883842564, 416244.1831735387, 418356.3248369002, 420212.45420655556, 422083.69256202737, 424220.3981340015, 426475.9394881793, 428682.96198093786, 430918.5066768136, 433456.75156381726, 436065.6587026392, 438679.2699146046, 441549.17847295443, 444622.7983195959, 447645.1576545516, 450174.5087039686, 452243.72558061517, 454237.5636516989, 456109.50411390513, 458019.3298537659, 460241.2327913236, 462694.08517936425, 464997.4826180945, 467019.82245619065, 469421.95382616133, 472207.8307176397, 474985.40373406763, 477672.53451892664, 480328.0358748626, 483019.3196513636, 485876.9433356557, 489132.3937410221, 493024.6579519098, 496985.107184075, 500526.9771694894, 503642.0244259121, 506250.83327490545, 509008.4915062776, 512083.288485609, 515023.2387384689, 517720.80972298904, 520428.90666189656, 523211.0422307588, 526355.3066203219, 530416.5099220509, 535479.293813883, 541152.0947803432, 547000.7376992151, 552744.7593857207, 558425.7371419634, 564025.4036502964, 569163.8057276508, 573488.4573702357, 577614.1064888682, 582533.4563170552, 588644.7374741319, 596005.071915306, 603942.9386173013, 611705.9976699647, 619234.375518001, 626854.2295288689, 634767.1679471545, 642910.5516489457, 651215.0794414859, 659517.8799907564, 668009.4466961351, 677222.9515251325, 687404.5216985759, 698395.8270593345, 710152.529382736, 722094.3874282277, 733684.9616959875, 745730.0784983868, 758477.6135177563, 771602.2711222962, 785200.785079709, 800055.6163916148, 818826.1561335872, 842075.4528100586, 865237.587402938, 885647.1643504158, 906763.6688669763, 929939.5922933404, 952928.5767326527, 974884.9335157013, 996785.4834649826, 1020184.3375795616, 1045517.0773718675, 1071406.9891723, 1096951.0366687926, 1121109.482612452, 1143193.7341461699, 1162592.597460505, 1180339.0963627717, 1197514.1377326476, 1213833.7065558112, 1231470.2319527557, 1250569.2200524383, 1268805.5485714362, 1286237.9248745176, 1303169.471356459, 1318751.2608695775, 1334118.9014963463, 1349603.0890631627, 1365173.4643289852, 1381124.484485945, 1398207.6094763726, 1416481.0674886506, 1435119.77934042, 1453316.5396933502, 1471176.8549123686, 1489201.576571015, 1506926.5773450155, 1523642.8390656663, 1539593.0729564023, 1555060.9012714187, 1569624.972769054, 1581687.2777333024, 1589650.0222148476, 1596300.9733580865, 1603319.8719620768, 1610658.1087018033, 1618228.08194603, 1624709.493607747, 1630012.8058826767, 1634731.470063869, 1639069.6673983429, 1642096.5129455146, 1643819.1860685805, 1645089.2615637882, 1646256.8388135096, 1646822.4140066474, 1645549.7341073437, 1642401.0166555794, 1637355.9499481714, 1631304.3341613978, 1624272.6118402183, 1612200.3021770816, 1593928.4917666046, 1575865.2521856283, 1561609.3554763785, 1546702.7192932048, 1530033.9809376784, 1513241.2349431927, 1496577.8588103736, 1479742.6697879948, 1461683.4615044256, 1442612.981938497, 1423841.5501110856, 1406418.1198104655, 1391062.7320863097, 1377668.9064037667, 1367153.6284097356, 1358142.2191457825, 1348821.0945548941, 1339858.6231411267, 1329638.709301734, 1317363.3940011673, 1305553.1829754647, 1295483.9040973017, 1286568.6122062772, 1278777.7426157747, 1271097.1340421005, 1263362.9170634104, 1254931.4014036115, 1245527.444234965, 1234613.1781482426, 1221338.8911607815, 1206474.203090007, 1190995.1173450742, 1175849.7708043351, 1161435.0412275265, 1148354.9067886383, 1136485.7702221111, 1124220.1141736538, 1110874.6050299609, 1097246.992998067, 1085370.150901265, 1076949.830383523, 1070172.826362383, 1063512.1392263153, 1056747.5874282378, 1049697.1660526197, 1043283.9110648034, 1038096.536593826, 1033232.2397230386, 1027433.4885252068, 1021543.8120046238, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ] }, { "mode": "lines", "name": "seasonal", "type": "scatter", "x": [ 0, 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 ], "y": [ 26439.310329233478, 70036.89950227283, 87199.64523090918, 115605.4540609774, 146851.11532934025, 141172.7693624413, 105329.3322495354, 79709.17499416957, 33074.45624873456, -11085.442362818005, -17566.86337970664, -7856.3431181429105, -17599.676343293057, -12775.861321796307, -61468.08711026637, -168035.19222126176, -118074.12863495969, -112906.56145682743, -84795.55425352373, -107936.43885632032, -151628.629129965, -172154.56671339078, -159124.92060818055, -128044.34211549346, -122873.19439769372, -102288.43702009779, -52953.99968216669, -82144.82559131463, -102874.26337787986, -105215.55084272297, -97383.77444652465, -127356.11147609686, -105783.87361757053, -84261.56647593249, -17269.059189712272, 5089.6239035345725, -12080.79004027199, -31571.19793892654, 35384.03889366266, 57274.68901107368, 54840.37631918181, 78252.04937899558, 94355.83824176276, 123300.78454479873, 175508.34532120114, 162789.004770412, 164015.50592563866, 135018.8988284674, 123052.19671813255, 92229.21668096176, 84129.80610058854, 34837.077284907275, 18211.162878127354, 38936.14674628183, 53302.271694155985, 15864.380026212748, 22950.85902762476, -3369.92690821581, -9445.797945779253, 13164.546973516397, 26439.310329233478, 70036.89950227283, 87199.64523090918, 115605.4540609774, 146851.11532934025, 141172.7693624413, 105329.3322495354, 79709.17499416957, 33074.45624873456, -11085.442362818005, -17566.86337970664, -7856.3431181429105, -17599.676343293057, -12775.861321796307, -61468.08711026637, -168035.19222126176, -118074.12863495969, -112906.56145682743, -84795.55425352373, -107936.43885632032, -151628.629129965, -172154.56671339078, -159124.92060818055, -128044.34211549346, -122873.19439769372, -102288.43702009779, -52953.99968216669, -82144.82559131463, -102874.26337787986, -105215.55084272297, -97383.77444652465, -127356.11147609686, -105783.87361757053, -84261.56647593249, -17269.059189712272, 5089.6239035345725, -12080.79004027199, -31571.19793892654, 35384.03889366266, 57274.68901107368, 54840.37631918181, 78252.04937899558, 94355.83824176276, 123300.78454479873, 175508.34532120114, 162789.004770412, 164015.50592563866, 135018.8988284674, 123052.19671813255, 92229.21668096176, 84129.80610058854, 34837.077284907275, 18211.162878127354, 38936.14674628183, 53302.271694155985, 15864.380026212748, 22950.85902762476, -3369.92690821581, -9445.797945779253, 13164.546973516397, 26439.310329233478, 70036.89950227283, 87199.64523090918, 115605.4540609774, 146851.11532934025, 141172.7693624413, 105329.3322495354, 79709.17499416957, 33074.45624873456, -11085.442362818005, -17566.86337970664, -7856.3431181429105, -17599.676343293057, -12775.861321796307, -61468.08711026637, -168035.19222126176, -118074.12863495969, -112906.56145682743, -84795.55425352373, -107936.43885632032, -151628.629129965, -172154.56671339078, -159124.92060818055, -128044.34211549346, -122873.19439769372, -102288.43702009779, -52953.99968216669, -82144.82559131463, -102874.26337787986, -105215.55084272297, -97383.77444652465, -127356.11147609686, -105783.87361757053, -84261.56647593249, -17269.059189712272, 5089.6239035345725, -12080.79004027199, -31571.19793892654, 35384.03889366266, 57274.68901107368, 54840.37631918181, 78252.04937899558, 94355.83824176276, 123300.78454479873, 175508.34532120114, 162789.004770412, 164015.50592563866, 135018.8988284674, 123052.19671813255, 92229.21668096176, 84129.80610058854, 34837.077284907275, 18211.162878127354, 38936.14674628183, 53302.271694155985, 15864.380026212748, 22950.85902762476, -3369.92690821581, -9445.797945779253, 13164.546973516397, 26439.310329233478, 70036.89950227283, 87199.64523090918, 115605.4540609774, 146851.11532934025, 141172.7693624413, 105329.3322495354, 79709.17499416957, 33074.45624873456, -11085.442362818005, -17566.86337970664, -7856.3431181429105, -17599.676343293057, -12775.861321796307, -61468.08711026637, -168035.19222126176, -118074.12863495969, -112906.56145682743, -84795.55425352373, -107936.43885632032, -151628.629129965, -172154.56671339078, -159124.92060818055, -128044.34211549346, -122873.19439769372, -102288.43702009779, -52953.99968216669, -82144.82559131463, -102874.26337787986, -105215.55084272297, -97383.77444652465, -127356.11147609686, -105783.87361757053, -84261.56647593249, -17269.059189712272, 5089.6239035345725, -12080.79004027199, -31571.19793892654, 35384.03889366266, 57274.68901107368, 54840.37631918181, 78252.04937899558, 94355.83824176276, 123300.78454479873, 175508.34532120114, 162789.004770412, 164015.50592563866, 135018.8988284674, 123052.19671813255, 92229.21668096176, 84129.80610058854, 34837.077284907275, 18211.162878127354, 38936.14674628183, 53302.271694155985, 15864.380026212748, 22950.85902762476, -3369.92690821581, -9445.797945779253, 13164.546973516397, 26439.310329233478, 70036.89950227283, 87199.64523090918, 115605.4540609774, 146851.11532934025, 141172.7693624413, 105329.3322495354, 79709.17499416957, 33074.45624873456, -11085.442362818005, -17566.86337970664, -7856.3431181429105, -17599.676343293057, -12775.861321796307, -61468.08711026637, -168035.19222126176, -118074.12863495969, -112906.56145682743, -84795.55425352373, -107936.43885632032, -151628.629129965, -172154.56671339078, -159124.92060818055, -128044.34211549346, -122873.19439769372 ] }, { "mode": "lines", "name": "error", "type": "scatter", "x": [ 0, 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 ], "y": [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 40590.34584399659, 76326.67413874572, 86811.14199026136, 72442.75809657882, 10564.744563496199, 589.1849699946824, 5340.6281280637995, 22505.124895813664, -38953.551642105835, -35025.39492976259, 990.9892102426456, -11701.940418633836, -25702.12963599419, -64300.976682076245, -102927.42156981921, -103642.7630111152, -125832.42023675231, -97402.17660874, -95541.9075883453, -78989.65636429841, -46370.05494712283, 3663.717505850487, 33797.95829791926, 8661.588567115185, -5263.204789010393, 25844.005178910593, 28177.574143119575, 70548.17584577047, 86265.95922990274, 77178.22317781993, 55461.84185883728, 2204.418944835139, -38382.711561906166, -89823.51659439866, -97931.64557080422, -94749.25182533215, -74372.45490496766, -73790.17400429178, -43042.87870500913, 4366.880746667808, 14577.534999169711, -27607.97059478914, -61486.63993181223, -91622.591646633, -7394.3933104379175, 87242.93158066392, 65367.012226638326, 67148.89362202583, 30902.5128342158, 40536.6714079104, 62191.1982321814, 88326.94900167131, 71108.22272794947, 46899.23856627618, 47286.18339631973, 34815.613835640936, 4744.904983836881, 25471.189068214488, 58592.96902130899, 64137.15231478345, 64596.28091271667, 84029.03747502477, 50022.11987784752, 21104.133230999345, -40153.88098764886, -70069.2453947698, -45235.14216734394, -15173.21035458448, -66045.4342840433, -93822.87931053177, -61914.39339005708, -27348.04441221038, -47097.74647652723, -88680.07928708331, -145440.81207337126, -142659.80892763298, -174445.56351263978, -126635.0182696415, -107113.89274753032, -43423.177484254455, -62239.478014323526, -23879.27384087821, -46076.61557548463, -92942.8362793597, -82208.36393247556, -54434.07825802613, -82923.4102781866, -57366.828135011994, -41881.82462738783, -60004.316508230215, -48079.60693112756, -44721.6647236452, -42905.95071705764, -87402.32865074412, -110916.16654272765, -143036.66965077902, -137551.9125757241, -171274.92444185115, -198425.3942316132, -230304.09997939813, -206524.45399056468, -207555.73618862708, -178225.7679256613, -161419.91730471642, -98096.54011135217, -49411.33144919542, -99584.05329400033, -102681.81584742469, -139008.04718399348, -135976.0042727111, -117674.71966965016, -115812.21692588212, -112943.44939210828, -98839.59064172246, -51966.69380647947, -45257.85430251861, -32314.294291708313, -61109.99396674331, -47727.951653711614, 6641.875804433686, 17640.11803898515, 47939.376043777986, 37531.31111960989, 113473.99404983921, 393405.18274474365, 534431.9423052759, 352453.99877206044, 234244.62858988813, 391328.046653303, 376438.56009766017, 347035.4473676545, 295376.57957976335, 334767.84300861874, 397280.7603262179, 457162.88342028286, 405837.54796973907, 387332.1567841216, 257068.53439945512, 206936.15544166026, 19181.900995021817, 55923.36731507232, -25026.494843349145, -23798.085053034876, 72592.94159057963, 127595.72303935408, 24005.90679367786, 50161.669849629354, -17765.513996196143, -48968.30088795259, -21758.072955027386, -11966.401213147394, 37933.07949337235, 76704.49599352611, 172641.6789597051, 204263.6458280942, 233201.7551906735, 207340.20119525408, 240480.93216070527, 236884.10665118467, 221353.05294729263, 187362.75270595727, 230579.54049797857, 235128.24157203583, 248458.34266591177, 100906.76713635243, -42415.766416906175, 29632.8747819243, 30948.755939961164, 103521.36806434, 90855.16657936304, 50899.35515203109, 22901.101638773136, 37251.06037872119, 47356.1857900086, 96.34412472204713, 5858.074181439981, 22985.22302243377, 31054.638613091127, -15449.183653035085, -75363.19440465482, -128938.96650961533, -214407.3093714654, -180476.7947016357, -213133.1070913343, -369928.26803450787, -471064.10359441774, -318671.7064466972, -247688.7648450342, -292441.2824410708, -253702.50757128268, -292224.26490175695, -262438.816462836, -268080.1886100142, -250411.9260709753, -214906.87149100925, -165647.1977449077, -93166.39474864636, -39143.561234990426, -10392.576819701542, 97118.71113961413, 46573.943932457114, 39129.829464459974, 29964.52061668336, 5576.084407748007, -46236.37603178503, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ] }, { "mode": "lines", "name": "actual", "type": "scatter", "x": [ 0, 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 ], "y": [ 292177.5566814914, 290562.6753366103, 293182.524480576, 289683.6129308824, 289174.397838923, 290771.68233092286, 283886.9558174656, 270722.9972242986, 267726.7254737574, 270294.21123918745, 261353.30537797225, 232729.26618325018, 219343.35130633294, 231161.81182384022, 257419.06290666613, 258721.22689061795, 275597.05185419443, 293766.4650713197, 302490.84253768023, 304916.40068414615, 305520.6417470138, 294177.79134042305, 281742.2260261392, 288323.86774389545, 305360.6433556601, 304405.9389453127, 302429.2839555344, 312363.17662586074, 311198.263443507, 302692.96556266, 304173.10962968785, 313801.01918312494, 349483.83088197897, 359922.345530007, 368389.5449972081, 384320.5349543818, 375375.3190911524, 376387.1286930624, 385053.99043611746, 413980.99432430574, 450818.58159292274, 464903.20471242385, 470131.85883338226, 463087.9856076528, 479092.56924742355, 468092.9334181318, 449592.52484549215, 451535.06105815305, 443754.47230332595, 431595.8851535636, 457972.20536002127, 460584.48735278513, 476229.5193100481, 474073.6748015763, 476722.02888608346, 472626.8918819369, 484585.1847345616, 503243.9076401939, 515499.4311987281, 531891.9486242908, 526523.9505076667, 519886.4761016596, 498991.4423729716, 478025.6630471939, 503157.0334102349, 502533.0216510143, 488976.20719833364, 466160.2337812014, 452725.6627230897, 458278.9210019443, 464030.4940756537, 433957.6401132293, 393121.5144425344, 370586.9507656383, 408810.05409822235, 399535.7752342647, 430312.2032430422, 440119.2755008541, 435239.35232171416, 425624.8905034999, 407547.6762862914, 416699.3594577699, 415625.32654568105, 425105.7297256882, 433421.4805049036, 444610.46530115214, 466814.1440401391, 461047.1731998889, 476147.6123053257, 482132.6437028193, 493567.81308651395, 487089.4359209788, 479717.54007416, 477994.6615354101, 489577.79752185394, 487765.1378944855, 501109.8049343475, 517280.99535678537, 538502.4103372701, 536940.2670707776, 570540.089417993, 633437.4612838404, 635902.8292393674, 630625.7771730215, 634010.4718651312, 631835.1935127437, 608804.3179309999, 635238.1100876948, 650705.4719177567, 691716.590845653, 673105.4075277509, 670475.6834347855, 640143.9939987778, 623216.2619920546, 658498.4294602564, 659826.1288275211, 650179.9781321741, 661357.6323849999, 682357.3391228204, 698890.308963673, 736837.3169158623, 796917.5059009239, 829494.4795935606, 828258.741801848, 854761.1049201998, 840211.5525217209, 833015.0070767493, 794081.4149027342, 741412.7308840976, 688550.0499511242, 728837.2593623814, 759472.8542089313, 800960.0391960283, 845988.5589530489, 885952.450150249, 853960.4655018429, 879292.8547398326, 905521.1053081999, 919390.1327086526, 918680.1543314736, 911035.7475631565, 909547.3540933747, 941765.3365555224, 1004586.2991955398, 1075729.3318482651, 1121259.2572488198, 1200969.6309006426, 1159914.651798401, 1168149.045837986, 1235545.226458057, 1269859.4326556232, 1285756.7288966663, 1312871.9219879843, 1427420.0370502793, 1792617.191043682, 1974641.3455492305, 1793689.7484251386, 1673850.2855633302, 1915913.6621179807, 1940639.8264537493, 1925518.6627525026, 1913221.7019151612, 1984184.5825218002, 2090206.5176400705, 2214358.5064747864, 2158276.5749549987, 2147648.636067847, 1995407.3051899993, 1940646.460861596, 1729639.1996220136, 1764762.6670234078, 1639823.3883242349, 1629144.5478889614, 1750598.7557352043, 1822994.5076790247, 1683689.472888471, 1718201.7904410423, 1625121.3979090976, 1588408.3151729156, 1636956.2081258327, 1656873.9257716655, 1745325.9289438166, 1795208.475385833, 1912519.7448609008, 1963315.063334516, 1968303.0163197194, 1888534.7856304178, 1881799.4626312533, 1816661.282193124, 1740301.591522153, 1683037.1242694433, 1719301.0561902092, 1697271.2350167376, 1697365.942848541, 1482051.661964583, 1213390.5914729177, 1317976.86595743, 1309104.9265694434, 1396394.720214583, 1350072.3561327783, 1257412.9451678486, 1199567.6294802765, 1217984.7629116673, 1248950.5529762493, 1194586.5437281956, 1209122.820136807, 1265515.1274375687, 1235478.4252280537, 1160454.2955848598, 1090518.3887947227, 1037040.1761072704, 913167.9805560493, 959266.7759157587, 937218.5045809759, 834141.5639365613, 740499.7233991238, 860242.620858105, 896589.8080203744, 904377.7976801184, 951927.0882284293, 899101.881639536, 940033.3470898133, 937150.2546617094, 970135.8514718905, 1045971.6247314569, 1074091.6374090272, 1141021.9375393754, 1159387.4768197923, 1169407.2073266688, 1239045.0938731956, 1173987.661097849, 1112063.4433431933, 1081407.9232178493, 1071945.7196792366, 1028609.7076669948, 1060848.949816183, 1132728.8481337503, 1140759.3132934708, 1137866.0489282643, 1165825.445529584, 1199898.6509250696, 1190519.3246145854, 1221540.2194774305, 1176476.0703626384, 1106444.2993374297, 1041411.2118238541, 957936.3007343882, 994956.3626385626, 973736.8329687923, 1013609.908079916, 985432.4197284227, 945027.0349163385, 870084.1590474461, 889239.5749905632, 864956.9782063474, 820046.8131020686, 898080.1617915081, 929719.1744072359, 964034.2566074949, 936382.2546657021, 901512.4480969659, 932983.1900338592, 900853.5778636106, 870231.5942844792, 866544.31995 ] } ], "layout": { "title": "Components", "xaxis": { "title": "Time" }, "yaxis": { "title": "Price, USD" } } }, "text/html": [ "
" ], "text/vnd.plotly.v1+html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dataset = daily.reset_index()\n", "dataset['date'] = pd.to_datetime(dataset['date'])\n", "dataset = dataset.set_index('date')\n", "\n", "af.plot_comp(af.trend(dataset,'weighted_price'),\n", " af.seasonal(dataset,'weighted_price'),\n", " af.residue(dataset,'weighted_price'),\n", " af.actual(dataset,'weighted_price')) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Partial Auto-correlation (PACF)\n", "\n", "The PACF is the correlation (of the variable with itself) at a given lag, **controlling for the effect of previous (shorter) lags**. We see below that according to the PACF, prices with **one day** difference are highly correlated. After that the partial auto-correlation essentially drops to zero." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(15,7))\n", "ax = plt.subplot(211)\n", "sm.graphics.tsa.plot_pacf(dataset['weighted_price'].values.squeeze(), lags=48, ax=ax)\n", "plt.show();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train/Test split" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now need to split our dataset. We need to fit the model using the training data and test the model with the test data. We can proceed as follows. We must choose the proportion of rows that will constitute the training set." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "198" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_size = 0.75\n", "training_rows = train_size*len(daily)\n", "int(training_rows)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we slice `daily` using, for obvious reasons:\n", "\n", " [:int(training_rows)]\n", " [int(training_rows):]\n", " \n", "We then have:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shapes of training and testing sets: 198 and 67\n" ] } ], "source": [ "train = daily[0:int(training_rows)] \n", "test = daily[int(training_rows):] \n", "print('Shapes of training and testing sets:',train.shape[0],'and',test.shape[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can automatize the split using a simple function for the library `aux_func`:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shapes of training and testing sets: 199 and 66\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2017-07-04292177.556681
2017-07-05290562.675337
2017-07-06293182.524481
2017-07-07289683.612931
2017-07-08289174.397839
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2017-07-04 292177.556681\n", "2017-07-05 290562.675337\n", "2017-07-06 293182.524481\n", "2017-07-07 289683.612931\n", "2017-07-08 289174.397839" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2018-01-161.482052e+06
2018-01-171.213391e+06
2018-01-181.317977e+06
2018-01-191.309105e+06
2018-01-201.396395e+06
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2018-01-16 1.482052e+06\n", "2018-01-17 1.213391e+06\n", "2018-01-18 1.317977e+06\n", "2018-01-19 1.309105e+06\n", "2018-01-20 1.396395e+06" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2018-01-211.350072e+06
2018-01-221.257413e+06
2018-01-231.199568e+06
2018-01-241.217985e+06
2018-01-251.248951e+06
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2018-01-21 1.350072e+06\n", "2018-01-22 1.257413e+06\n", "2018-01-23 1.199568e+06\n", "2018-01-24 1.217985e+06\n", "2018-01-25 1.248951e+06" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2018-03-23901512.448097
2018-03-24932983.190034
2018-03-25900853.577864
2018-03-26870231.594284
2018-03-27866544.319950
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2018-03-23 901512.448097\n", "2018-03-24 932983.190034\n", "2018-03-25 900853.577864\n", "2018-03-26 870231.594284\n", "2018-03-27 866544.319950" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "((199,), (66,))" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_size = 1 - train_size\n", "train = af.train_test_split(daily, test_size=test_size)[0]\n", "test = af.train_test_split(daily, test_size=test_size)[1]\n", "print('Shapes of training and testing sets:',train.shape[0],'and',test.shape[0])\n", "af.vc_to_df(train).head() \n", "af.vc_to_df(train).tail() \n", "af.vc_to_df(test).head()\n", "af.vc_to_df(test).tail()\n", "train.shape,test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Checking" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2017-07-04292177.556681
2017-07-05290562.675337
2017-07-06293182.524481
2017-07-07289683.612931
2017-07-08289174.397839
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2017-07-04 292177.556681\n", "2017-07-05 290562.675337\n", "2017-07-06 293182.524481\n", "2017-07-07 289683.612931\n", "2017-07-08 289174.397839" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2018-01-161.482052e+06
2018-01-171.213391e+06
2018-01-181.317977e+06
2018-01-191.309105e+06
2018-01-201.396395e+06
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2018-01-16 1.482052e+06\n", "2018-01-17 1.213391e+06\n", "2018-01-18 1.317977e+06\n", "2018-01-19 1.309105e+06\n", "2018-01-20 1.396395e+06" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2018-01-211.350072e+06
2018-01-221.257413e+06
2018-01-231.199568e+06
2018-01-241.217985e+06
2018-01-251.248951e+06
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2018-01-21 1.350072e+06\n", "2018-01-22 1.257413e+06\n", "2018-01-23 1.199568e+06\n", "2018-01-24 1.217985e+06\n", "2018-01-25 1.248951e+06" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
column
col_name
2018-03-23901512.448097
2018-03-24932983.190034
2018-03-25900853.577864
2018-03-26870231.594284
2018-03-27866544.319950
\n", "
" ], "text/plain": [ " column\n", "col_name \n", "2018-03-23 901512.448097\n", "2018-03-24 932983.190034\n", "2018-03-25 900853.577864\n", "2018-03-26 870231.594284\n", "2018-03-27 866544.319950" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "af.vc_to_df(daily[0:199]).head() \n", "af.vc_to_df(daily[0:199]).tail() \n", "af.vc_to_df(daily[199:]).head()\n", "af.vc_to_df(daily[199:]).tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reshaping\n", "\n", "We must reshape `train` and `test` for `Keras`." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/marcotavora/anaconda3/lib/python3.6/site-packages/numpy/core/fromnumeric.py:52: FutureWarning:\n", "\n", "reshape is deprecated and will raise in a subsequent release. Please use .values.reshape(...) instead\n", "\n" ] } ], "source": [ "train = np.reshape(train, (len(train), 1));\n", "test = np.reshape(test, (len(test), 1));" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(199, 1)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "(66, 1)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.shape\n", "test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `MinMaxScaler ` \n", "\n", "We must now use `MinMaxScaler` which scales and translates features to a given range (between zero and one). " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import MinMaxScaler\n", "scaler = MinMaxScaler()\n", "train = scaler.fit_transform(train)\n", "test = scaler.transform(test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reshaping once more:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "X_train, Y_train = af.lb(train, 1)\n", "X_test, Y_test = af.lb(test, 1)\n", "X_train = np.reshape(X_train, (len(X_train), 1, X_train.shape[1]))\n", "X_test = np.reshape(X_test, (len(X_test), 1, X_test.shape[1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the shape is (number of examples, time steps, features per step)." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(198, 1, 1)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "(65, 1, 1)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.shape\n", "X_test.shape" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 198 samples, validate on 65 samples\n", "Epoch 1/100\n", "198/198 [==============================] - 1s 7ms/step - loss: 0.1528 - val_loss: 0.1036\n", "Epoch 2/100\n", "198/198 [==============================] - 0s 695us/step - loss: 0.0933 - val_loss: 0.0326\n", "Epoch 3/100\n", "198/198 [==============================] - 0s 710us/step - loss: 0.0419 - val_loss: 0.0019\n", "Epoch 4/100\n", "198/198 [==============================] - 0s 720us/step - loss: 0.0337 - val_loss: 0.0075\n", "Epoch 5/100\n", "198/198 [==============================] - 0s 669us/step - loss: 0.0246 - val_loss: 0.0012\n", "Epoch 6/100\n", "198/198 [==============================] - 0s 727us/step - loss: 0.0145 - val_loss: 0.0024\n", "Epoch 7/100\n", "198/198 [==============================] - 0s 691us/step - loss: 0.0091 - val_loss: 0.0011\n", "Epoch 8/100\n", "198/198 [==============================] - 0s 736us/step - loss: 0.0036 - val_loss: 9.9089e-04\n", "Epoch 9/100\n", "198/198 [==============================] - 0s 723us/step - loss: 0.0017 - val_loss: 6.7229e-04\n", "Epoch 10/100\n", "198/198 [==============================] - 0s 707us/step - loss: 0.0012 - val_loss: 9.1775e-04\n", "Epoch 11/100\n", "198/198 [==============================] - 0s 702us/step - loss: 0.0013 - val_loss: 7.2912e-04\n", "Epoch 12/100\n", "198/198 [==============================] - 0s 729us/step - loss: 0.0013 - val_loss: 7.0782e-04\n", "Epoch 13/100\n", "198/198 [==============================] - 0s 662us/step - loss: 0.0011 - val_loss: 6.8369e-04\n", "Epoch 14/100\n", "198/198 [==============================] - 0s 664us/step - loss: 0.0011 - val_loss: 7.6915e-04\n", "Epoch 15/100\n", "198/198 [==============================] - 0s 634us/step - loss: 0.0011 - val_loss: 6.6362e-04\n", "Epoch 16/100\n", "198/198 [==============================] - 0s 661us/step - loss: 0.0011 - val_loss: 6.6041e-04\n", "Epoch 17/100\n", "198/198 [==============================] - 0s 677us/step - loss: 0.0011 - val_loss: 6.9043e-04\n", "Epoch 18/100\n", "198/198 [==============================] - 0s 703us/step - loss: 0.0010 - val_loss: 6.6951e-04\n", "Epoch 19/100\n", "198/198 [==============================] - 0s 644us/step - loss: 0.0010 - val_loss: 6.6813e-04\n", "Epoch 20/100\n", "198/198 [==============================] - 0s 656us/step - loss: 0.0010 - val_loss: 6.7729e-04\n", "Epoch 21/100\n", "198/198 [==============================] - 0s 687us/step - loss: 0.0010 - val_loss: 6.9212e-04\n", "Epoch 22/100\n", "198/198 [==============================] - 0s 679us/step - loss: 0.0010 - val_loss: 6.6143e-04\n", "Epoch 23/100\n", "198/198 [==============================] - 0s 684us/step - loss: 0.0011 - val_loss: 6.7110e-04\n", "Epoch 24/100\n", "198/198 [==============================] - 0s 667us/step - loss: 0.0010 - val_loss: 7.5473e-04\n", "Epoch 25/100\n", "198/198 [==============================] - 0s 659us/step - loss: 0.0011 - val_loss: 6.7296e-04\n", "Epoch 26/100\n", "198/198 [==============================] - 0s 678us/step - loss: 0.0011 - val_loss: 7.2251e-04\n", "Epoch 27/100\n", "198/198 [==============================] - 0s 657us/step - loss: 0.0010 - val_loss: 6.5816e-04\n", "Epoch 28/100\n", "198/198 [==============================] - 0s 683us/step - loss: 0.0010 - val_loss: 6.9990e-04\n", "Epoch 29/100\n", "198/198 [==============================] - 0s 654us/step - loss: 0.0011 - val_loss: 6.6128e-04\n", "Epoch 30/100\n", "198/198 [==============================] - 0s 688us/step - loss: 0.0011 - val_loss: 7.3160e-04\n", "Epoch 31/100\n", "198/198 [==============================] - 0s 678us/step - loss: 0.0010 - val_loss: 7.2021e-04\n", "Epoch 32/100\n", "198/198 [==============================] - 0s 654us/step - loss: 0.0010 - val_loss: 6.7265e-04\n", "Epoch 33/100\n", "198/198 [==============================] - 0s 738us/step - loss: 0.0010 - val_loss: 6.6554e-04\n", "Epoch 34/100\n", "198/198 [==============================] - 0s 1ms/step - loss: 0.0010 - val_loss: 6.6404e-04\n", "Epoch 35/100\n", "198/198 [==============================] - 0s 990us/step - loss: 0.0010 - val_loss: 6.6763e-04\n", "Epoch 36/100\n", "198/198 [==============================] - 0s 681us/step - loss: 9.8911e-04 - val_loss: 6.9875e-04\n", "Epoch 37/100\n", "198/198 [==============================] - 0s 763us/step - loss: 0.0011 - val_loss: 6.6426e-04\n", "Epoch 38/100\n", "198/198 [==============================] - 0s 776us/step - loss: 0.0010 - val_loss: 6.5739e-04\n", "Epoch 39/100\n", "198/198 [==============================] - 0s 844us/step - loss: 0.0010 - val_loss: 6.5929e-04\n", "Epoch 40/100\n", "198/198 [==============================] - 0s 789us/step - loss: 0.0010 - val_loss: 7.6339e-04\n", "Epoch 41/100\n", "198/198 [==============================] - 0s 781us/step - loss: 0.0010 - val_loss: 6.9245e-04\n", "Epoch 42/100\n", "198/198 [==============================] - 0s 745us/step - loss: 0.0010 - val_loss: 7.2030e-04\n", "Epoch 43/100\n", "198/198 [==============================] - 0s 729us/step - loss: 0.0011 - val_loss: 6.7876e-04\n", "Epoch 44/100\n", "198/198 [==============================] - 0s 816us/step - loss: 0.0010 - val_loss: 6.7443e-04\n", "Epoch 45/100\n", "198/198 [==============================] - 0s 761us/step - loss: 0.0010 - val_loss: 6.8526e-04\n", "Epoch 46/100\n", "198/198 [==============================] - 0s 683us/step - loss: 0.0011 - val_loss: 6.6283e-04\n", "Epoch 47/100\n", "198/198 [==============================] - 0s 791us/step - loss: 0.0011 - val_loss: 8.3781e-04\n", "Epoch 48/100\n", "198/198 [==============================] - 0s 729us/step - loss: 0.0010 - val_loss: 7.8161e-04\n", "Epoch 49/100\n", "198/198 [==============================] - 0s 716us/step - loss: 0.0011 - val_loss: 7.1934e-04\n", "Epoch 50/100\n", "198/198 [==============================] - 0s 706us/step - loss: 9.7000e-04 - val_loss: 6.7207e-04\n", "Epoch 51/100\n", "198/198 [==============================] - 0s 721us/step - loss: 0.0010 - val_loss: 6.5542e-04\n", "Epoch 52/100\n", "198/198 [==============================] - 0s 847us/step - loss: 9.6917e-04 - val_loss: 6.6080e-04\n", "Epoch 53/100\n", "198/198 [==============================] - 0s 735us/step - loss: 9.9767e-04 - val_loss: 6.6035e-04\n", "Epoch 54/100\n", "198/198 [==============================] - 0s 768us/step - loss: 9.5302e-04 - val_loss: 7.3299e-04\n", "Epoch 55/100\n", "198/198 [==============================] - 0s 777us/step - loss: 9.7338e-04 - val_loss: 6.6971e-04\n", "Epoch 56/100\n", "198/198 [==============================] - 0s 721us/step - loss: 9.7361e-04 - val_loss: 6.7386e-04\n", "Epoch 57/100\n", "198/198 [==============================] - 0s 903us/step - loss: 9.6577e-04 - val_loss: 6.5706e-04\n", "Epoch 58/100\n", "198/198 [==============================] - 0s 773us/step - loss: 0.0010 - val_loss: 7.1604e-04\n", "Epoch 59/100\n", "198/198 [==============================] - 0s 710us/step - loss: 9.3962e-04 - val_loss: 6.7298e-04\n", "Epoch 60/100\n", "198/198 [==============================] - 0s 718us/step - loss: 9.8478e-04 - val_loss: 6.9064e-04\n", "Epoch 61/100\n", "198/198 [==============================] - 0s 690us/step - loss: 9.4962e-04 - val_loss: 6.6279e-04\n", "Epoch 62/100\n", "198/198 [==============================] - 0s 721us/step - loss: 9.8239e-04 - val_loss: 6.8884e-04\n", "Epoch 63/100\n", "198/198 [==============================] - 0s 670us/step - loss: 9.4334e-04 - val_loss: 6.6673e-04\n", "Epoch 64/100\n", "198/198 [==============================] - 0s 642us/step - loss: 9.8488e-04 - val_loss: 6.9145e-04\n", "Epoch 65/100\n", "198/198 [==============================] - 0s 688us/step - loss: 9.4353e-04 - val_loss: 7.5603e-04\n", "Epoch 66/100\n", "198/198 [==============================] - 0s 703us/step - loss: 9.7033e-04 - val_loss: 6.7267e-04\n", "Epoch 67/100\n", "198/198 [==============================] - 0s 1ms/step - loss: 0.0010 - val_loss: 6.5869e-04\n", "Epoch 68/100\n", "198/198 [==============================] - 0s 862us/step - loss: 9.6522e-04 - val_loss: 6.8443e-04\n", "Epoch 69/100\n", "198/198 [==============================] - 0s 766us/step - loss: 9.7770e-04 - val_loss: 6.5598e-04\n", "Epoch 70/100\n", "198/198 [==============================] - 0s 769us/step - loss: 9.5235e-04 - val_loss: 8.3394e-04\n", "Epoch 71/100\n", "198/198 [==============================] - 0s 725us/step - loss: 9.5636e-04 - val_loss: 6.7147e-04\n", "Epoch 72/100\n", "198/198 [==============================] - 0s 726us/step - loss: 9.7629e-04 - val_loss: 7.5754e-04\n", "Epoch 73/100\n", "198/198 [==============================] - 0s 744us/step - loss: 9.3162e-04 - val_loss: 6.6331e-04\n", "Epoch 74/100\n", "198/198 [==============================] - 0s 983us/step - loss: 9.3801e-04 - val_loss: 8.1598e-04\n", "Epoch 75/100\n", "198/198 [==============================] - 0s 871us/step - loss: 9.5201e-04 - val_loss: 6.9924e-04\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 76/100\n", "198/198 [==============================] - 0s 738us/step - loss: 9.2465e-04 - val_loss: 6.7209e-04\n", "Epoch 77/100\n", "198/198 [==============================] - 0s 747us/step - loss: 0.0011 - val_loss: 6.7907e-04\n", "Epoch 78/100\n", "198/198 [==============================] - 0s 894us/step - loss: 9.7758e-04 - val_loss: 7.8197e-04\n", "Epoch 79/100\n", "198/198 [==============================] - 0s 875us/step - loss: 9.4757e-04 - val_loss: 6.7783e-04\n", "Epoch 80/100\n", "198/198 [==============================] - 0s 821us/step - loss: 9.0183e-04 - val_loss: 8.9421e-04\n", "Epoch 81/100\n", "198/198 [==============================] - 0s 703us/step - loss: 9.4133e-04 - val_loss: 7.0518e-04\n", "Epoch 82/100\n", "198/198 [==============================] - 0s 692us/step - loss: 9.1960e-04 - val_loss: 8.0741e-04\n", "Epoch 83/100\n", "198/198 [==============================] - 0s 974us/step - loss: 0.0011 - val_loss: 6.6771e-04\n", "Epoch 84/100\n", "198/198 [==============================] - 0s 1ms/step - loss: 0.0012 - val_loss: 7.3280e-04\n", "Epoch 85/100\n", "198/198 [==============================] - 0s 936us/step - loss: 0.0011 - val_loss: 7.2867e-04\n", "Epoch 86/100\n", "198/198 [==============================] - 0s 752us/step - loss: 0.0015 - val_loss: 7.3439e-04\n", "Epoch 87/100\n", "198/198 [==============================] - 0s 866us/step - loss: 0.0018 - val_loss: 8.2242e-04\n", "Epoch 88/100\n", "198/198 [==============================] - 0s 767us/step - loss: 0.0018 - val_loss: 7.5484e-04\n", "Epoch 89/100\n", "198/198 [==============================] - 0s 698us/step - loss: 0.0012 - val_loss: 0.0014\n", "Epoch 90/100\n", "198/198 [==============================] - 0s 752us/step - loss: 0.0012 - val_loss: 6.7217e-04\n", "Epoch 91/100\n", "198/198 [==============================] - 0s 725us/step - loss: 9.9636e-04 - val_loss: 0.0011\n", "Epoch 92/100\n", "198/198 [==============================] - 0s 1ms/step - loss: 9.3326e-04 - val_loss: 6.8320e-04\n", "Epoch 93/100\n", "198/198 [==============================] - 0s 833us/step - loss: 0.0010 - val_loss: 9.9121e-04\n", "Epoch 94/100\n", "198/198 [==============================] - 0s 706us/step - loss: 9.8282e-04 - val_loss: 6.8533e-04\n", "Epoch 95/100\n", "198/198 [==============================] - 0s 772us/step - loss: 9.3256e-04 - val_loss: 7.6536e-04\n", "Epoch 96/100\n", "198/198 [==============================] - 0s 795us/step - loss: 9.1516e-04 - val_loss: 6.8049e-04\n", "Epoch 97/100\n", "198/198 [==============================] - 0s 857us/step - loss: 9.2704e-04 - val_loss: 9.1657e-04\n", "Epoch 98/100\n", "198/198 [==============================] - 0s 849us/step - loss: 9.2964e-04 - val_loss: 7.4756e-04\n", "Epoch 99/100\n", "198/198 [==============================] - 0s 925us/step - loss: 9.1245e-04 - val_loss: 8.7900e-04\n", "Epoch 100/100\n", "198/198 [==============================] - 0s 1ms/step - loss: 9.2234e-04 - val_loss: 7.4333e-04\n" ] } ], "source": [ "model = Sequential()\n", "model.add(LSTM(256, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))\n", "model.add(LSTM(256))\n", "model.add(Dense(1))\n", "\n", "# compile and fit the model\n", "model.compile(loss='mean_squared_error', optimizer='adam')\n", "history = model.fit(X_train, Y_train, epochs=100, batch_size=32, \n", " validation_data=(X_test, Y_test))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "lstm_1 (LSTM) (None, 1, 256) 264192 \n", "_________________________________________________________________\n", "lstm_2 (LSTM) (None, 256) 525312 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 1) 257 \n", "=================================================================\n", "Total params: 789,761\n", "Trainable params: 789,761\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train and test loss\n", "\n", "While the model is being trained, the train and test losses vary as shown in the figure below. The package `plotly.graph_objs` is extremely useful. The function `t( )` inside the argument is defined in `aux_func`:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "data": [ { "mode": "lines", "name": "training_loss", "type": "scatter", "x": [ 0, 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 ], "y": [ 0.15278316085988825, 0.09331246390186175, 0.04185895284995286, 0.033672913683183266, 0.024559803006022868, 0.014465997616449991, 0.00909286252495767, 0.003625491222441949, 0.001699868593755357, 0.0011826494933256523, 0.0013059012586253253, 0.0013374386842108586, 0.001145938047299907, 0.0010646101157298557, 0.0010722025316396747, 0.0010681872263743608, 0.001073839636213814, 0.0010394986029220463, 0.001037561893889403, 0.0010464103105172252, 0.0010444256376737912, 0.0010335881097214015, 0.0010882067124269941, 0.0010327681625083164, 0.0010840535549578644, 0.0010529799922487013, 0.0010483012354763393, 0.001027729859660295, 0.0010895007254668708, 0.0010597319503883934, 0.0010487562047806803, 0.0010305856715539716, 0.0010345267141331927, 0.001010991392170333, 0.0010295045478892692, 0.0009891067648005456, 0.0010711673618943403, 0.0010181377815891696, 0.0010285268448330838, 0.0010140033267118564, 0.0010157458812252364, 0.0010149916869146053, 0.001060995991554022, 0.0010312970015997915, 0.0010452426056027167, 0.001100310714764878, 0.001073638218892456, 0.001035192844368555, 0.001062749776838705, 0.0009699994780480711, 0.0010247789721670232, 0.0009691661313138526, 0.000997671632289021, 0.0009530217708982151, 0.0009733848347248641, 0.0009736051768854712, 0.0009657704492447653, 0.0010031403049431515, 0.0009396161162059265, 0.0009847805380228567, 0.0009496214410355974, 0.000982393680999968, 0.0009433385266950636, 0.0009848845895083452, 0.0009435259040640291, 0.0009703260612429468, 0.001040113759415243, 0.000965221859679341, 0.0009776979712463653, 0.0009523488703475457, 0.0009563553589160996, 0.0009762900910867059, 0.0009316194675671115, 0.0009380143182528573, 0.0009520051094251826, 0.000924653590026528, 0.0010535976363844567, 0.0009775835640888398, 0.000947569922021957, 0.0009018312234224544, 0.0009413332580776904, 0.0009196017953482541, 0.001090455741205281, 0.001210545568322443, 0.0011366048823063723, 0.0015346268756371555, 0.0017693929393032585, 0.0018111335753340913, 0.0011799125461792103, 0.0011959682533874958, 0.0009963644293343856, 0.0009332593730174598, 0.0010054465178976474, 0.000982815058016444, 0.000932564034662915, 0.0009151559318368785, 0.0009270427099457293, 0.0009296367050116503, 0.0009124451370544101, 0.0009223387438910919 ] }, { "mode": "lines", "name": "val_loss", "type": "scatter", "x": [ 0, 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 ], "y": [ 0.10356946656337152, 0.032617612885167964, 0.0018896349240094424, 0.0074994577381473325, 0.0011898879176722122, 0.0024486381457581256, 0.0011301795432210873, 0.0009908949114525547, 0.0006722858108612575, 0.0009177482234708106, 0.0007291167092402108, 0.00070781712121026, 0.000683686543897448, 0.0007691484612923187, 0.0006636205434495842, 0.0006604137316571723, 0.0006904339003085625, 0.0006695053013083032, 0.0006681310107873846, 0.0006772943566410014, 0.0006921199311573918, 0.0006614293472396709, 0.0006710980997295425, 0.0007547339919256046, 0.0006729598395815208, 0.0007225083530871556, 0.0006581565082622267, 0.0006998964995056248, 0.0006612784491153434, 0.0007316004995328303, 0.0007202069301946232, 0.0006726523587627316, 0.0006655415417412769, 0.0006640385683182943, 0.0006676277658558459, 0.0006987536830890279, 0.0006642630867505572, 0.000657385199731773, 0.0006592868170418324, 0.0007633944904507818, 0.0006924481508926525, 0.0007203008822846012, 0.0006787551603378116, 0.0006744265772655266, 0.0006852622832341764, 0.0006628256356936373, 0.0008378139953352869, 0.000781614944123878, 0.0007193414975168147, 0.0006720719653318296, 0.0006554199195062001, 0.0006608017766491404, 0.0006603531512457022, 0.0007329876890043335, 0.0006697126810684915, 0.0006738637912873785, 0.0006570558476509037, 0.0007160405696105534, 0.0006729750504466491, 0.0006906356692735034, 0.0006627922114039218, 0.0006888365263876039, 0.0006667303079806376, 0.0006914492860792402, 0.0007560336929880297, 0.0006726690058712848, 0.0006586908047137395, 0.0006844316069383729, 0.0006559837060999248, 0.0008339364540566189, 0.0006714670994231125, 0.0007575447302280317, 0.0006633071162853481, 0.0008159754145218847, 0.0006992407317459136, 0.0006720872195993129, 0.0006790670068137563, 0.0007819658547165231, 0.0006778348761284948, 0.0008942136556680243, 0.0007051827337328667, 0.0008074091610839017, 0.0006677121332677198, 0.0007327963532588911, 0.0007286714909311671, 0.0007343900940703372, 0.0008224173279953763, 0.0007548420927308213, 0.0014341463952755125, 0.0006721731017863092, 0.0011451585786954428, 0.0006832041132908601, 0.0009912064616890768, 0.0006853271706019698, 0.0007653569334741825, 0.0006804880907881083, 0.0009165675309934438, 0.0007475636618507381, 0.0008789995974019313, 0.0007433266756729259 ] } ], "layout": { "title": "history of training loss", "xaxis": { "title": "epochs" }, "yaxis": { "title": "loss" } } }, "text/html": [ "
" ], "text/vnd.plotly.v1+html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "py.iplot(dict(data=[af.t('loss','training_loss',history), af.t('val_loss','val_loss',history)], \n", " layout=dict(title = 'history of training loss', xaxis = dict(title = 'epochs'),\n", " yaxis = dict(title = 'loss'))), filename='training_process')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Root-mean-square deviation (RMSE)\n", "\n", "The RMSE measures differences between values predicted by a model the actual values." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "X_test_new = X_test.copy()\n", "X_test_new = np.append(X_test_new, scaler.transform(dataset.iloc[-1][0]))\n", "X_test_new = np.reshape(X_test_new, (len(X_test_new), 1, 1))\n", "prediction = model.predict(X_test_new)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inverting original scaling:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "pred_inv = scaler.inverse_transform(prediction.reshape(-1, 1))\n", "Y_test_inv = scaler.inverse_transform(Y_test.reshape(-1, 1))\n", "pred_inv_new = np.array(pred_inv[:,0][1:])\n", "Y_test_new_inv = np.array(Y_test_inv[:,0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Renaming arrays for clarity" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "y_testing = Y_test_new_inv\n", "y_predict = pred_inv_new" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prediction versus True Values" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "data": [ { "name": "Prediction", "type": "scatter", "x": [ 0, 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 ], "y": [ 1257412.9451678486, 1199567.6294802765, 1217984.7629116673, 1248950.5529762493, 1194586.5437281956, 1209122.820136807, 1265515.1274375687, 1235478.4252280537, 1160454.2955848598, 1090518.3887947227, 1037040.1761072704, 913167.9805560492, 959266.7759157587, 937218.5045809759, 834141.5639365613, 740499.7233991238, 860242.620858105, 896589.8080203744, 904377.7976801184, 951927.0882284292, 899101.8816395359, 940033.3470898132, 937150.2546617093, 970135.8514718903, 1045971.6247314569, 1074091.6374090272, 1141021.9375393754, 1159387.4768197923, 1169407.2073266688, 1239045.0938731956, 1173987.661097849, 1112063.4433431933, 1081407.9232178493, 1071945.7196792366, 1028609.7076669948, 1060848.949816183, 1132728.8481337503, 1140759.3132934708, 1137866.0489282643, 1165825.445529584, 1199898.6509250696, 1190519.3246145854, 1221540.2194774305, 1176476.0703626384, 1106444.2993374297, 1041411.2118238541, 957936.3007343882, 994956.3626385625, 973736.8329687922, 1013609.908079916, 985432.4197284225, 945027.0349163384, 870084.159047446, 889239.5749905631, 864956.9782063474, 820046.8131020685, 898080.161791508, 929719.1744072358, 964034.2566074948, 936382.254665702, 901512.4480969659, 932983.1900338592, 900853.5778636106, 870231.5942844792, 866544.31995 ] }, { "name": "True", "type": "scatter", "x": [ 0, 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 ], "y": [ 1266397.625, 1209014.875, 1227301.125, 1258012.25, 1204066.375, 1218504, 1274422.875, 1244656.25, 1170128.75, 1100432, 1046995.5, 922768.6875, 969071.4375, 946936.0625, 843201.1875, 748617.625, 869507.1875, 906096.8125, 913930.1875, 961704.9375, 908623.6875, 949763.125, 946867.5, 979976.3125, 1055928.25, 1084030.875, 1150784.25, 1169067.25, 1179035.625, 1248193.125, 1183591.25, 1121926, 1091337.25, 1081887.5, 1038560.6875, 1070800.5, 1142523.5, 1150522.625, 1147641, 1175472.75, 1209343.5, 1200025.125, 1230829.5, 1186065.625, 1116322.125, 1051367.5, 967736.25, 1004860.75, 983588.125, 1023545.875, 995315.25, 954777.6875, 879419.4375, 898701.625, 874255.9375, 828985.125, 907596.0625, 939402.8125, 973855.1875, 946096.1875, 911048.375, 942681.9375, 910385.6875, 879567.875, 875854.5625 ] } ], "layout": { "title": "True prices vs predicted prices", "xaxis": { "title": "Day" }, "yaxis": { "title": "USD" } } }, "text/html": [ "
" ], "text/vnd.plotly.v1+html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "layout = dict(title = 'True prices vs predicted prices',\n", " xaxis = dict(title = 'Day'), yaxis = dict(title = 'USD'))\n", "fig = dict(data=[af.prediction_vs_true(y_testing,'Prediction'),\n", " af.prediction_vs_true(y_predict,'True')],\n", " layout=layout)\n", "py.iplot(fig, filename='results')" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Prediction:\n", "\n", "[1266397.6, 1209014.9, 1227301.1, 1258012.2, 1204066.4, 1218504.0, 1274422.9, 1244656.2, 1170128.8, 1100432.0]\n", "\n", "Test set:\n", "\n", "[1257412.9, 1199567.6, 1217984.8, 1248950.6, 1194586.5, 1209122.8, 1265515.1, 1235478.4, 1160454.3, 1090518.4]\n", "\n", "Difference:\n", "\n", "[0.05, 0.01, 0.02, 0.05, 0.0, 0.04, 0.03, 0.07, 0.07, 0.06, 0.13, 0.04, 0.03, 0.12, 0.12, 0.15, 0.03, 0.0, 0.04, 0.07, 0.03, 0.01, 0.02, 0.07, 0.02, 0.05, 0.01, 0.0, 0.05, 0.06]\n", "\n", "Mean difference:\n", "\n", "4.8 %\n" ] } ], "source": [ "print('Prediction:\\n')\n", "print(list(y_predict[0:10]))\n", "print('')\n", "print('Test set:\\n')\n", "y_testing = [round(i,1) for i in list(Y_test_new_inv)]\n", "print(y_testing[0:10])\n", "print('')\n", "print('Difference:\\n')\n", "diff = [round(abs((y_testing[i+1]-list(y_predict)[i])/list(y_predict)[i]),2) for i in range(len(y_predict)-1)]\n", "print(diff[0:30])\n", "print('')\n", "print('Mean difference:\\n')\n", "print(100*round(np.mean(diff[0:30]),3),'%')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The average difference is ~5%. There is something wrong here!" ] }, { "cell_type": "code", "execution_count": 191, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
predictiontesting
20.0151250.015353
30.0250230.025424
4-0.042882-0.043528
50.0119910.012168
60.0458910.046639
\n", "
" ], "text/plain": [ " prediction testing\n", "2 0.015125 0.015353\n", "3 0.025023 0.025424\n", "4 -0.042882 -0.043528\n", "5 0.011991 0.012168\n", "6 0.045891 0.046639" ] }, "execution_count": 191, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(data={'prediction': y_predict.tolist(), 'testing': y_testing})\n", "\n", "pct_variation = df.pct_change()[1:]\n", "pct_variation = pct_variation[1:]\n", "\n", "pct_variation.head()" ] }, { "cell_type": "code", "execution_count": 193, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "data": [ { "name": "Prediction", "type": "scatter", "x": [ 0, 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 ], "y": [ 0.015124917300955554, 0.02502330061825697, -0.04288183600755879, 0.011990721857007225, 0.04589141685214004, -0.02335694500147767, -0.05987797835747821, -0.05956331728452957, -0.04855956569783504, -0.11865076067662184, 0.0501780680545687, -0.022841840284865467, -0.10954791892298432, -0.11217199869040739, 0.16148372475200534, 0.04208087699102547, 0.008645185472385686, 0.05227395992978945, -0.05519494382340118, 0.045276650901751925, -0.003048786506635537, 0.034966679604062856, 0.07750385038005692, 0.026614142580236866, 0.061578850325642254, 0.01588742633556195, 0.008526776368083189, 0.058655988448186314, -0.05175631375152778, -0.052100123247785124, -0.027264498728080122, -0.008658872406307028, -0.040047428683666286, 0.031042781503319627, 0.0669807307710446, 0.007001278310686754, -0.0025046226274776373, 0.02425126847158654, 0.028814576943617, -0.0077053169756979845, 0.025669775039085074, -0.03636886749951962, -0.05880239552512112, -0.05818627396639653, -0.0795452113556867, 0.038362208711309576, -0.021169724262789624, 0.04062447378571199, -0.027581201477657302, -0.04072836470655905, -0.07892753568353572, 0.021926041974708932, -0.02720111638832301, -0.05178210471118472, 0.09482792287738584, 0.03504505067197772, 0.03667476245713286, -0.028504237956836875, -0.03704466095842929, 0.034722154572746966, -0.034259964803876386, -0.03385138070945348, -0.004221746388816228 ] }, { "name": "True", "type": "scatter", "x": [ 0, 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 ], "y": [ 0.015353198936016499, 0.025423798392229635, -0.0435278224775264, 0.012168478381431536, 0.046639017972368135, -0.023734762232390683, -0.06072473626410613, -0.06026596652707494, -0.04903924592193942, -0.11944782854126579, 0.05048227708373498, -0.022984533604206936, -0.10998171717694438, -0.11226139542734714, 0.1617055347895482, 0.04225226697678086, 0.00868624648640881, 0.052576810266682816, -0.0554929048663495, 0.04552476198748989, -0.003066912629584473, 0.03519776923722895, 0.07817018213633786, 0.026884095132219787, 0.06231340045858258, 0.01609574715437101, 0.008642235663227416, 0.05954974452012962, -0.05250607907654059, -0.052746975117371364, -0.027566324006347176, -0.008749889842676328, -0.040427420903875966, 0.03134250046446185, 0.0677569633149453, 0.007089516925852024, -0.002536293151412461, 0.02457178613298927, 0.029226760713911393, -0.007816826537106802, 0.02605661243795021, -0.036891213240464626, -0.059526751117171095, -0.05877665961133338, -0.08015556199126717, 0.03864568030254212, -0.021327165692888617, 0.040948539687521324, -0.027799156263173863, -0.04100271109413489, -0.07930228448499355, 0.022015570447090127, -0.027307150963587268, -0.051921887446427895, 0.09515725200073932, 0.035229593080885246, 0.03690910115656432, -0.02868362671328184, -0.037238956780793475, 0.034908893100083827, -0.03443749040711552, -0.033992204726716935, -0.004237147904075145 ] } ], "layout": { "title": "True prices vs predicted prices variation (%)", "xaxis": { "title": "Day" }, "yaxis": { "title": "USD" } } }, "text/html": [ "
" ], "text/vnd.plotly.v1+html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "layout = dict(title = 'True prices vs predicted prices variation (%)',\n", " xaxis = dict(title = 'Day'), yaxis = dict(title = 'USD'))\n", "fig = dict(data=[af.prediction_vs_true(pct_variation['prediction'],'Prediction'),af.prediction_vs_true(pct_variation['testing'],'True')],\n", " layout=layout)\n", "py.iplot(fig, filename='results')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Altcoins\n", "\n", "Using the Poloniex API and two auxiliar function ([Ref.1](https://blog.patricktriest.com/analyzing-cryptocurrencies-python/)). Choosing the value of the end date to be today we have:" ] }, { "cell_type": "code", "execution_count": 194, "metadata": {}, "outputs": [], "source": [ "poloniex = 'https://poloniex.com/public?command=returnChartData¤cyPair={}&start={}&end={}&period={}'\n", "start = datetime.strptime('2015-01-01', '%Y-%m-%d') # get data from the start of 2015\n", "end = datetime.now() \n", "period = 86400 # day in seconds" ] }, { "cell_type": "code", "execution_count": 195, "metadata": {}, "outputs": [], "source": [ "def get_crypto_data(poloniex_pair):\n", " data_df = af.get_json_data(poloniex.format(poloniex_pair, \n", " start.timestamp(),\n", " end.timestamp(), \n", " period),\n", " poloniex_pair)\n", " data_df = data_df.set_index('date')\n", " return data_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst_ac = ['ETH','LTC','XRP','ETC','STR','DASH','SC','XMR','XEM']\n", "len(lst_ac)\n", "ac_data = {}\n", "for a in lst_ac:\n", " ac_data[a] = get_crypto_data('BTC_{}'.format(a))" ] }, { "cell_type": "code", "execution_count": 197, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: ETH\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-08-080.00312550.0000000.00262050.0000002.662061e+051205.8033210.004530
2015-08-090.0025810.0041000.0024000.0030003.139879e+05898.1234340.002860
2015-08-100.0026450.0029020.0022000.0026502.845754e+05718.3652660.002524
2015-08-110.0039500.0044000.0024140.0026509.151385e+053007.2741110.003286
2015-08-120.0045000.0048820.0029100.0039551.117821e+064690.0750320.004196
\n", "
" ], "text/plain": [ " close high low open quoteVolume \\\n", "date \n", "2015-08-08 0.003125 50.000000 0.002620 50.000000 2.662061e+05 \n", "2015-08-09 0.002581 0.004100 0.002400 0.003000 3.139879e+05 \n", "2015-08-10 0.002645 0.002902 0.002200 0.002650 2.845754e+05 \n", "2015-08-11 0.003950 0.004400 0.002414 0.002650 9.151385e+05 \n", "2015-08-12 0.004500 0.004882 0.002910 0.003955 1.117821e+06 \n", "\n", " volume weightedAverage \n", "date \n", "2015-08-08 1205.803321 0.004530 \n", "2015-08-09 898.123434 0.002860 \n", "2015-08-10 718.365266 0.002524 \n", "2015-08-11 3007.274111 0.003286 \n", "2015-08-12 4690.075032 0.004196 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: LTC\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-01-020.0084100.0086160.0084000.008614338.5980052.8794190.008504
2015-01-030.0076300.0085700.0075300.0084541655.02724213.1171140.007926
2015-01-040.0075490.0079990.0073010.0076321155.3067488.6823490.007515
2015-01-050.0077700.0078000.0074100.007410750.1570675.7463750.007660
2015-01-060.0076950.0077690.0075240.007700413.7631263.1557050.007627
\n", "
" ], "text/plain": [ " close high low open quoteVolume volume \\\n", "date \n", "2015-01-02 0.008410 0.008616 0.008400 0.008614 338.598005 2.879419 \n", "2015-01-03 0.007630 0.008570 0.007530 0.008454 1655.027242 13.117114 \n", "2015-01-04 0.007549 0.007999 0.007301 0.007632 1155.306748 8.682349 \n", "2015-01-05 0.007770 0.007800 0.007410 0.007410 750.157067 5.746375 \n", "2015-01-06 0.007695 0.007769 0.007524 0.007700 413.763126 3.155705 \n", "\n", " weightedAverage \n", "date \n", "2015-01-02 0.008504 \n", "2015-01-03 0.007926 \n", "2015-01-04 0.007515 \n", "2015-01-05 0.007660 \n", "2015-01-06 0.007627 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: XRP\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-01-020.0000780.0000780.0000760.0000772.355432e+0518.2835040.000078
2015-01-030.0000740.0000780.0000690.0000786.786861e+0550.1897360.000074
2015-01-040.0000690.0000740.0000660.0000721.375164e+0694.4219530.000069
2015-01-050.0000750.0000760.0000680.0000685.179275e+0538.3036740.000074
2015-01-060.0000730.0000760.0000720.0000747.620949e+0556.5485660.000074
\n", "
" ], "text/plain": [ " close high low open quoteVolume volume \\\n", "date \n", "2015-01-02 0.000078 0.000078 0.000076 0.000077 2.355432e+05 18.283504 \n", "2015-01-03 0.000074 0.000078 0.000069 0.000078 6.786861e+05 50.189736 \n", "2015-01-04 0.000069 0.000074 0.000066 0.000072 1.375164e+06 94.421953 \n", "2015-01-05 0.000075 0.000076 0.000068 0.000068 5.179275e+05 38.303674 \n", "2015-01-06 0.000073 0.000076 0.000072 0.000074 7.620949e+05 56.548566 \n", "\n", " weightedAverage \n", "date \n", "2015-01-02 0.000078 \n", "2015-01-03 0.000074 \n", "2015-01-04 0.000069 \n", "2015-01-05 0.000074 \n", "2015-01-06 0.000074 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: ETC\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2016-07-240.0014100.0100000.0001010.0099501.734943e+0724099.4330420.001389
2016-07-250.0009250.0014200.0006690.0014101.365341e+0713184.1566470.000966
2016-07-260.0033100.0048720.0009160.0009255.199938e+07144768.5739330.002784
2016-07-270.0024260.0038000.0018600.0033002.558753e+0772354.9088040.002828
2016-07-280.0023200.0025000.0020680.0024403.118785e+067175.4110110.002301
\n", "
" ], "text/plain": [ " close high low open quoteVolume \\\n", "date \n", "2016-07-24 0.001410 0.010000 0.000101 0.009950 1.734943e+07 \n", "2016-07-25 0.000925 0.001420 0.000669 0.001410 1.365341e+07 \n", "2016-07-26 0.003310 0.004872 0.000916 0.000925 5.199938e+07 \n", "2016-07-27 0.002426 0.003800 0.001860 0.003300 2.558753e+07 \n", "2016-07-28 0.002320 0.002500 0.002068 0.002440 3.118785e+06 \n", "\n", " volume weightedAverage \n", "date \n", "2016-07-24 24099.433042 0.001389 \n", "2016-07-25 13184.156647 0.000966 \n", "2016-07-26 144768.573933 0.002784 \n", "2016-07-27 72354.908804 0.002828 \n", "2016-07-28 7175.411011 0.002301 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: STR\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-01-020.0000180.0000180.0000170.0000173.886411e+0668.1450040.000018
2015-01-030.0000160.0000180.0000160.0000189.187188e+06155.9264770.000017
2015-01-040.0000170.0000170.0000160.0000167.835991e+06128.0858280.000016
2015-01-050.0000190.0000220.0000160.0000177.365508e+06132.2992320.000018
2015-01-060.0000170.0000190.0000170.0000194.806229e+0686.3891940.000018
\n", "
" ], "text/plain": [ " close high low open quoteVolume volume \\\n", "date \n", "2015-01-02 0.000018 0.000018 0.000017 0.000017 3.886411e+06 68.145004 \n", "2015-01-03 0.000016 0.000018 0.000016 0.000018 9.187188e+06 155.926477 \n", "2015-01-04 0.000017 0.000017 0.000016 0.000016 7.835991e+06 128.085828 \n", "2015-01-05 0.000019 0.000022 0.000016 0.000017 7.365508e+06 132.299232 \n", "2015-01-06 0.000017 0.000019 0.000017 0.000019 4.806229e+06 86.389194 \n", "\n", " weightedAverage \n", "date \n", "2015-01-02 0.000018 \n", "2015-01-03 0.000017 \n", "2015-01-04 0.000016 \n", "2015-01-05 0.000018 \n", "2015-01-06 0.000018 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: DASH\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-01-020.0063000.0064000.0060490.006143209.5618431.3101850.006252
2015-01-030.0062130.0063000.0060000.0060741067.6831606.4385560.006030
2015-01-040.0062000.0063010.0060000.006000353.1644072.1766650.006163
2015-01-050.0060000.0062000.0060000.006110453.5201042.7608900.006088
2015-01-060.0060000.0062000.0060000.006000306.5352921.8639590.006081
\n", "
" ], "text/plain": [ " close high low open quoteVolume volume \\\n", "date \n", "2015-01-02 0.006300 0.006400 0.006049 0.006143 209.561843 1.310185 \n", "2015-01-03 0.006213 0.006300 0.006000 0.006074 1067.683160 6.438556 \n", "2015-01-04 0.006200 0.006301 0.006000 0.006000 353.164407 2.176665 \n", "2015-01-05 0.006000 0.006200 0.006000 0.006110 453.520104 2.760890 \n", "2015-01-06 0.006000 0.006200 0.006000 0.006000 306.535292 1.863959 \n", "\n", " weightedAverage \n", "date \n", "2015-01-02 0.006252 \n", "2015-01-03 0.006030 \n", "2015-01-04 0.006163 \n", "2015-01-05 0.006088 \n", "2015-01-06 0.006081 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: SC\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-08-252.400000e-076.900000e-051.500000e-075.000000e-071.796256e+0838.4403392.100000e-07
2015-08-261.800000e-073.300000e-071.400000e-072.500000e-075.201470e+08113.2691472.100000e-07
2015-08-271.900000e-072.400000e-071.700000e-071.800000e-072.073278e+0842.7339652.000000e-07
2015-08-281.700000e-072.100000e-071.500000e-071.900000e-071.540448e+0826.6433251.700000e-07
2015-08-291.500000e-071.800000e-071.500000e-071.700000e-075.399869e+078.8120461.600000e-07
\n", "
" ], "text/plain": [ " close high low open \\\n", "date \n", "2015-08-25 2.400000e-07 6.900000e-05 1.500000e-07 5.000000e-07 \n", "2015-08-26 1.800000e-07 3.300000e-07 1.400000e-07 2.500000e-07 \n", "2015-08-27 1.900000e-07 2.400000e-07 1.700000e-07 1.800000e-07 \n", "2015-08-28 1.700000e-07 2.100000e-07 1.500000e-07 1.900000e-07 \n", "2015-08-29 1.500000e-07 1.800000e-07 1.500000e-07 1.700000e-07 \n", "\n", " quoteVolume volume weightedAverage \n", "date \n", "2015-08-25 1.796256e+08 38.440339 2.100000e-07 \n", "2015-08-26 5.201470e+08 113.269147 2.100000e-07 \n", "2015-08-27 2.073278e+08 42.733965 2.000000e-07 \n", "2015-08-28 1.540448e+08 26.643325 1.700000e-07 \n", "2015-08-29 5.399869e+07 8.812046 1.600000e-07 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: XMR\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-01-020.0014300.0015490.0013700.00154949065.14343070.8501010.001444
2015-01-030.0016600.0016910.0014120.00142769499.330582109.2489230.001572
2015-01-040.0015560.0016500.0014520.00164049664.57745976.2395970.001535
2015-01-050.0015400.0016890.0014400.00154660422.79966092.2465490.001527
2015-01-060.0015880.0016890.0014900.00154050438.34936080.9991250.001606
\n", "
" ], "text/plain": [ " close high low open quoteVolume volume \\\n", "date \n", "2015-01-02 0.001430 0.001549 0.001370 0.001549 49065.143430 70.850101 \n", "2015-01-03 0.001660 0.001691 0.001412 0.001427 69499.330582 109.248923 \n", "2015-01-04 0.001556 0.001650 0.001452 0.001640 49664.577459 76.239597 \n", "2015-01-05 0.001540 0.001689 0.001440 0.001546 60422.799660 92.246549 \n", "2015-01-06 0.001588 0.001689 0.001490 0.001540 50438.349360 80.999125 \n", "\n", " weightedAverage \n", "date \n", "2015-01-02 0.001444 \n", "2015-01-03 0.001572 \n", "2015-01-04 0.001535 \n", "2015-01-05 0.001527 \n", "2015-01-06 0.001606 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Altcoin: XEM\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-03-311.600000e-060.0001027.100000e-070.0000025.961381e+0797.3190380.000002
2015-04-019.800000e-070.0000027.000000e-070.0000022.384865e+08264.9910410.000001
2015-04-021.230000e-060.0000019.100000e-070.0000019.577869e+07112.8415650.000001
2015-04-031.220000e-060.0000011.150000e-060.0000016.581851e+0781.2956970.000001
2015-04-041.070000e-060.0000019.900000e-070.0000018.535530e+0792.8882740.000001
\n", "
" ], "text/plain": [ " close high low open quoteVolume \\\n", "date \n", "2015-03-31 1.600000e-06 0.000102 7.100000e-07 0.000002 5.961381e+07 \n", "2015-04-01 9.800000e-07 0.000002 7.000000e-07 0.000002 2.384865e+08 \n", "2015-04-02 1.230000e-06 0.000001 9.100000e-07 0.000001 9.577869e+07 \n", "2015-04-03 1.220000e-06 0.000001 1.150000e-06 0.000001 6.581851e+07 \n", "2015-04-04 1.070000e-06 0.000001 9.900000e-07 0.000001 8.535530e+07 \n", "\n", " volume weightedAverage \n", "date \n", "2015-03-31 97.319038 0.000002 \n", "2015-04-01 264.991041 0.000001 \n", "2015-04-02 112.841565 0.000001 \n", "2015-04-03 81.295697 0.000001 \n", "2015-04-04 92.888274 0.000001 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst_df = []\n", "for el in lst_ac:\n", " print('Altcoin:',el)\n", " ac_data[el].head()\n", " lst_df.append(ac_data[el])" ] }, { "cell_type": "code", "execution_count": 198, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
closehighlowopenquoteVolumevolumeweightedAverage
date
2015-08-080.00312550.0000000.00262050.0000002.662061e+051205.8033210.004530
2015-08-090.0025810.0041000.0024000.0030003.139879e+05898.1234340.002860
2015-08-100.0026450.0029020.0022000.0026502.845754e+05718.3652660.002524
2015-08-110.0039500.0044000.0024140.0026509.151385e+053007.2741110.003286
2015-08-120.0045000.0048820.0029100.0039551.117821e+064690.0750320.004196
\n", "
" ], "text/plain": [ " close high low open quoteVolume \\\n", "date \n", "2015-08-08 0.003125 50.000000 0.002620 50.000000 2.662061e+05 \n", "2015-08-09 0.002581 0.004100 0.002400 0.003000 3.139879e+05 \n", "2015-08-10 0.002645 0.002902 0.002200 0.002650 2.845754e+05 \n", "2015-08-11 0.003950 0.004400 0.002414 0.002650 9.151385e+05 \n", "2015-08-12 0.004500 0.004882 0.002910 0.003955 1.117821e+06 \n", "\n", " volume weightedAverage \n", "date \n", "2015-08-08 1205.803321 0.004530 \n", "2015-08-09 898.123434 0.002860 \n", "2015-08-10 718.365266 0.002524 \n", "2015-08-11 3007.274111 0.003286 \n", "2015-08-12 4690.075032 0.004196 " ] }, "execution_count": 198, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst_df[0].head()" ] }, { "cell_type": "code", "execution_count": 200, "metadata": {}, "outputs": [], "source": [ "# lst_col = lst_df[0].shape[1]-1\n", "# lst_df[0].iloc[:,lst_col].plot(lw=2, figsize=(15,5));\n", "# lst_df[1].iloc[:,lst_col].plot(lw=2, figsize=(15,5));\n", "# plt.legend(['daily'], loc='upper left',fontsize = 'x-large');" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }