{
"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",
" Timestamp | \n",
" Open | \n",
" High | \n",
" Low | \n",
" Close | \n",
" Volume_(BTC) | \n",
" Volume_(Currency) | \n",
" Weighted_Price | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1499155260 | \n",
" 296127 | \n",
" 296558 | \n",
" 296016 | \n",
" 296540 | \n",
" 1.158600 | \n",
" 3.432441e+05 | \n",
" 296257.67168 | \n",
"
\n",
" \n",
" 1 | \n",
" 1499155320 | \n",
" 296539 | \n",
" 296769 | \n",
" 296060 | \n",
" 296679 | \n",
" 11.115510 | \n",
" 3.295332e+06 | \n",
" 296462.51372 | \n",
"
\n",
" \n",
" 2 | \n",
" 1499155380 | \n",
" 296060 | \n",
" 296090 | \n",
" 296060 | \n",
" 296060 | \n",
" 5.527494 | \n",
" 1.636491e+06 | \n",
" 296063.83615 | \n",
"
\n",
" \n",
" 3 | \n",
" 1499155440 | \n",
" 296060 | \n",
" 296260 | \n",
" 296015 | \n",
" 296015 | \n",
" 8.414064 | \n",
" 2.491620e+06 | \n",
" 296125.66780 | \n",
"
\n",
" \n",
" 4 | \n",
" 1499155500 | \n",
" 296361 | \n",
" 296540 | \n",
" 296155 | \n",
" 296155 | \n",
" 3.993010 | \n",
" 1.183292e+06 | \n",
" 296340.78573 | \n",
"
\n",
" \n",
"
\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": "iVBORw0KGgoAAAANSUhEUgAAA4kAAAEyCAYAAABXvJXKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd4VFX6B/DvSS8kgZAQSCghEHpNIPQiHcIK6qqIothQwVXXtgEVFAWy/qwoujZEsLI2dOm9SUvovQYIkAQIpJA+c39/ZDKZO3OnJdPz/TwPD3PPPffeNwHCvHPOeY+QJAlEREREREREAODl7ACIiIiIiIjIdTBJJCIiIiIiIi0miURERERERKTFJJGIiIiIiIi0mCQSERERERGRFpNEIiIiIiIi0mKSSERERERERFpMEomIiIiIiEiLSSIRERERERFp+Tg7AEeJiIiQYmNjnR0GERERERGRU6Snp1+TJCnSXL86kyTGxsYiLS3N2WEQERERERE5hRDivCX9ON2UiIiIiIiItJgkEhERERERkRaTRCIiIiIiItJikkhERERERERaTBKJiIiIiIhIq85UNzUnPz8fOTk5KC8vd3YodZ6vry8aNWqE0NBQZ4dCRERERFTnMElEZYKYnZ2NmJgYBAYGQgjh7JDqLEmSUFxcjEuXLgEAE0UiIiIiIgfjdFMAOTk5iImJQVBQEBNEJxNCICgoCDExMcjJyXF2OEREREREdQ6TRADl5eUIDAx0dhikIzAwkFN/iYiIiIicgEmiBkcQXQv/PIiIPM/mk1fx0fpTkCTJ2aEQEZEJXJNIREREDvHQwt0AgIQWDdCvdYSToyEiImM4kkhEREQOda2w1NkhEBGRCUwS64jBgwfjscces/tzFi1aBB8fDlATEZFcSblK+1rN6aZERC6NSaIHmDx5MoQQ2l9hYWHo06cPVqxYoe3z66+/4r333tMeDxs2DJMnT7Z5LPfee692+woiIqIqN4uqi5Gp1Y54Xhne+PMIMq7dsv/DiIg8DJNEDzFgwABcuXIFV65cwc6dO5GQkIDx48fjzJkzAIDw8HCH7DkYGBiIqKgouz+HiIjc19ZTV+3+jG6z1+Lr7RkY/M4muz+LiMjTMEn0EH5+fmjcuDEaN26M9u3bIzU1FeXl5Th48CAA+XTTyZMnY/369fjmm2+0o4+bNm0CULln5MMPP4yoqCgEBASgbdu2WLhwofY5O3fuxMCBAxEYGIgGDRpg4sSJsv0M9aebVh1v374dCQkJCAoKQs+ePZGenu6A7woREbkKCdVTTLefue7ESIiIyBwuHjMiNmW5056dkZpcq+vLysrwxRdfwN/fHwkJCQbnP/zwQ5w9exZNmjTBhx9+CKBypLG4uBiDBg1CYGAgvvvuO8TFxeH06dPIzc0FAGRlZWHEiBEYO3YsFixYgLy8PEydOhV33XUXtm7dajQetVqN6dOn48MPP0RkZCSeeeYZ3HPPPThx4gTXLxIR1UGOXpK4ZOd5TOrdwrEPJSJyY3yH7iE2bdqEevXqAQCKiooQFBSExYsXo0ULw/8Uw8LC4Ofnh8DAQDRu3Fjb/tVXX+HcuXM4ffo0mjZtCgCIi4vTnl+wYAFCQ0OxaNEi+Pn5AQCWLFmCbt26YcuWLRg4cKBibJIk4YMPPtAmrLNnz0afPn1w5swZtG3b1jbfACIicmkC1fvf2nufxLIK+aLH134/zCSRiMgKTBKNqO1onqP16tUL33zzDQCgsLAQa9aswUMPPYSwsDCMHDnSonukp6ejQ4cO2gRR35EjR9C7d29tgggAXbt2RVhYGI4cOWI0SRRCoGvXrtrjmJgYAEB2djaTRCKiOkJ3uqm9q5veKq2w6/2JiDwdk0QPERgYiNatW2uPu3XrhvXr12POnDkWJ4lAZUJXk/OmrvPy8oK3t7dBX7UjytsREZFL0M0L7T3b9EZRmWL7xdwifL7lLJ4f3gYNgv0U+xAREQvXeDQfHx8UFRUpnvPz84NKpZK1JSYm4siRI8jMzFS8pmPHjtixYwfKyqr/8z1w4ADy8vLQsWNH2wVOREQeTa22b5p46FKeQduji/ZgwNsbsWTneXR/c61dn09E5O6YJHqIsrIyZGVlISsrC2fOnMEnn3yC1atX44477lDs37JlS6Snp+PMmTO4du0aysvLcd9996FFixa4/fbbsW7dOpw7dw7r16/HTz/9BAB4+umnkZ+fj8mTJ+Pw4cPYtm0bJk2ahP79+2PAgAGO/HKJiMjNSEZe21pJuQrP/rjfoH398RyF3kREpIRJoofYunUrmjRpgiZNmqBz585YsGABUlNTMX36dMX+L7zwAiIiItC1a1dERkZi+/btCAoKwubNm9GpUydMmDAB7du3x7Rp01BcXAwAiIqKwpo1a5CZmYmePXti7Nix6NSpE3755RdHfqlEROSGdEcP7bkkMfOG8gwaIiKynLB3hTFX0aNHDyktLU3x3LFjx9C+fXsHR0Tm8M+FiMhzXMwtwoC3NwIAgv28cWT2KLs8x9ItrNytQB0RkS0IIdIlSephrh9HEomIiMih7Lwk0SL622QQEVE1JolERERkd7oTl4rLVcY7Osj567ecHQIRkctikkhERER2J9l94wvr3CpzfqJKROSqmCQSERGR3blaCYR3Vp9wdghERC6LSaJGXSng4y7450FE5Flc7af6ttPXcDDzprPDICJySUwSAfj6+mq3eSDXUFxcDF9fX2eHQURENuKMD/8e6tPC5Pm1R7MdFAkRkXthkgigUaNGuHTpEoqKijiC5WSSJKGoqAiXLl1Co0aNnB0OERHZiDP+d31jXCeT58MC+WEkEZESH2cH4ApCQ0MBAJcvX0Z5ebmToyFfX19ERUVp/1yIiMj9ueJnsJ1iwpwdAhGRS2KSqBEaGsqkhIiIyG7snyXq7n2Y3KWJ2f7/XnUcv03tZ8+QiIjcEqebEhERkd05YiRx++lr2tf/HBZvtv++CyxcQ0SkhEkiERER2Z1+jmiPGgAl5dV7H0bU85edCwng5CkiIksxSSQiIiKHyy+usPk9y1TV003rB/nJzi2YmICTb422+TOJiDwRk0QiIiKyO7XeyOHN4jKbP8Pfx9voOSEAPx++7SEisgR/WhIREZHdVajkSaLaDmsUN5+8arZP2qvDZMdD392Ei7lFtg+GiMiNMUkkIiIiu9NfgqiyYZa47mg2TucUorMFW1ror1U8c/UW3vjzqM1iISLyBFzFTURERHYX6Cf/XFp/+mlNpZ+/gccWpwEAesY2MNpPQBg9t+5Ytk1iISLyFBxJJCIiIrvTzwl19zSsjae+Tde+3pNxwyb3JCKq65gkEhERkd3pjxsW62xXURs5BaVWX9OjheGIoy2nvxIRuTsmiURERGR3+tNLb5XafgsMS6Xe1dmgLf6VFfh1b6YToiEicj1MEomIiMju9KebTv56j02qivorbGtxao7hfohCZ0mij5fhNWoJeH7pgVrHQ0TkCcwmiUKIZkKIjUKIY0KII0KIZzXt4UKItUKIU5rfG2jahRBivhDitBDioBAiQedeD2n6nxJCPKTTniiEOKS5Zr4QlT/Ka/IMIiIicj1KdWoGvL2x1vd9Zmi8QZuvt+Hbm0Yh1VVNvYTxIjZERGTZSGIFgBckSWoPoDeAaUKIDgBSAKyXJCkewHrNMQCMBhCv+TUFwKdAZcIHYBaAXgCSAMyqSvo0faboXDdK027VM4iIiMg1SQarEm0j0Nfb5Plfp/bFhxO6IT4qRNvmCTlihUqN2JTlGPXBFmeHQkQeyGySKEnSFUmS9mpeFwA4BiAGwDgA32i6fQNgvOb1OACLpUo7AdQXQjQBMBLAWkmSciVJugFgLYBRmnOhkiTtkCRJArBY717WPIOIiIhckKU7XlSo1MgrLrf4vvprHY+/OUp2nNC8AcZ1i5G1eXm5f5bY+pWVAIDjWQX4b9pFxKYsR2zKckg22lqEiOo2q9YkCiFiAXQHsAtAlCRJV4DKRBJAI023GAAXdS7L1LSZas9UaEcNnqEf7xQhRJoQIu3q1avWfKlERERkQ8Zyl8OX8mTHIz/Ygq5vrMG1wuqqpauPZGHhtnOK15epqrfSiAzxR4CZkUUAMJUjFpRYnqC6ipd+Pqh93XL6CqhZqZWIasniJFEIUQ/ALwCekyQp31RXhTapBu0mw7HkGkmSPpckqYckST0iIyPN3JKIiIjsxdh0080n5R/inrl6CwDwf6tO4F8/H0RJuQpPLEnH7P8dle2JWOXtVScAAGGBvtjzyjCLYjG1JnHuimPVMbvpqNz0Xw85OwQicnMWJYlCCF9UJojfSZL0q6Y5u2qKp+b3HE17JoBmOpc3BXDZTHtThfaaPIOIiIhckLF8K9/I1NKf0i7ip7SLePG/1RVHVx7OMnp/a6aomlqT+MPuyolKTy5Jx+gPt7rl/ok/pV3ExhM55jsSERlhSXVTAeArAMckSXpP59QfAKoqlD4EYJlO+4OaCqS9AeRppoquBjBCCNFAU7BmBIDVmnMFQojemmc9qHcva55BRERELshYqlVaoTZyptKejFzZ8emcwlrHYmoksXWjegCAVUeycDyrwCbbdNjadZ2puMY8/PUeB0RCRJ7KkpHEfgAmARgihNiv+TUGQCqA4UKIUwCGa44BYAWAswBOA/gCwFQAkCQpF8CbAPZofs3WtAHAUwC+1FxzBsBKTbtVzyAiIiLXZGzqZkm5yuR12fnyhGjYe5uRlVdi0K+ev4/FsZhKEs9clSehrrhdRp/UDc4OgYg8nNmfqJIkbYPyGkAAGKrQXwIwzci9FgJYqNCeBqCTQvt1a59BRERErsfYrM1iM0mikt7z1iMjNVnW5utteTJnqnCNfi7rgjkiysyMvlZJP5+LxBbhKKtQw8/HqlqFRFTH8ScGEREROYBylrhsf81KCjy+OE22DnH6mPYWXyvMZH66FVct3S5DkiT8eeAyLlx33vTUJY8myY7v+nQH1h7NRptXV2LpnotGriIiMsQkkYiIiOzO1oVC1x7NRtc31qB5eBAAoIXmd0uYGx0c+9G26r4W3nPN0Wz844d9GPh/Gy2Ow9a8FRLaxxenAQBe/uWgwTkiImOYJBIREZHd2atG6AU7F5axdE3ikh3n7RqHJaxZl0lEZAqTRCIiIrK7TXbeksHcFFJZXyvuezmv2KJ+205fs+Ku9tGiYbCzQyAiD8EkkYiIiOxuwcYzdrt3RD1/tIq0PEFSmpZpzO5zueY76TFWydWeXhrZFmGBvnjj9o4OfzYReR4miUREROTWds0Yiob1/C3uH+Tng4f7xWLq4FZm+1qa74XoTPU0t/ejrXxwbzcktQwHADw1qPJreahvLH54vLdi/80nrzokLiJyf0wSiYiIyGXFRQTjz6f7Gz2/9eXbrBoZrDLrbx3x8qh2ZvtJFq6mLCit0L4uVzkmSewVF46lT/RBRmqyrAqrsbWJDy3c7ZC4iMj9MUkkIiIil7XhxcFGq5FmpCajmRVVTR1FZWxTSBsrLVdORoP8vY1eo7ttCBGRMUwSiYiIyCUYW8unVmg//uYomzzzzoQYk+c3nbB+ima5yn5JYkm5SvtaZeT7ZarKadc31uDM1UKbx0VEnoVJIhERETlVVXJYoTMCFx0WgPUvDNKcN7wmwNf4aJk15t7RGUseTcKPU5TX8dWkcM3qI1m1Dcso3a024iKUi/UEm9kKY96K4zaNiYg8D5NEIiIicqrLeSUA5Gv5tv1rCFpF1gMAtIkKAQC0axyCe3s0w5cP9rDZswN8vTEgPhLBfjXfY/Do5XzZ8RG949qSJAnHs/JRoVLj0s3qLTmMbfsRZCaBXncs2+5bkhCRe+Ouq0RERORUx6/kI6Z+oGyNnW4hlkA/b5x4axR8vbxk7bZ07IrxxK5cpYavt/HP1cfM3yo7LiqrMNKzZr7bdQGv/n4Y47pFY9n+y2b7W/I9mvz1HpyZO6ZGRX+IyPNxJJGIiIicqlizzq6kQmW0j7+Pt90SRAAoNVGRtKjUeFxKLEnkrPHtzvN2uW+rGStsej8i8hwcSSQiIiK7MrclxNPf78Puc7lYfvCKgyIy5O9j/HNz4eSP1MsctO8iEVEVjiQSERGRXd32ziazfRbvOI/rt8rsH4wRfeIaGj137HI+rheWWnW/XBt+LWev3bLZvYiILMEkkYiIiOwq80ax+U5O1iw8CIFGCr7c+/lOJL61Dpk3iiy+X8Kba20VmqLx3aLten8iqtuYJBIREREBGN4hyuT5dUezHRRJpZyCEhzKzFM89/rtHU1eGxpQvaLozu6m94IkItLHNYlEREREAG4UmZ4i6quwbjEnv8Re4SBpznqj5+oH+Zm8Vndrybl3dkaP2HDM+O2QQb+84nKEBfrWNEQi8lAcSSQiIiJCZQVVU2LqB8qOy1VqPLhwt9H+KrVk9Jy93ZXQFABwe9doBPh6Y2Kv5vjj6X4G/bq+sQaXb7r+dGAiciwmiUREREQA4iKDTZ7309sr8be9l3A8q8Bo/x1nrgMwX91VSW33Wpw+ph2+eSQJb/+9i7atRbjy17fpxNVaPYuIPA+TRCIiIiIYJoH6VJJ8ZDCnwPRU0+u3SpHyy0HEv7ISC7edsyqWZ37Yb/TciyPamL3e38cbg9pEIkCnGI+fiW0+9KnVEvKKyy3uT0SehUkiEREREcwnUfojgoWlKpP9G4UE4Mc9FwEAs/931OI4ylVqrDtmvEjO00PiLb6XLmN7Qf6+/5Ls+MDFm4ibsQJd31iDw5eUC+cQkWdjkkhEREQE80niI4vSZMdXC+R7Jz45qJXsONDP9BpHY1YcumL03DNDWtfongDg5SUU23efy9W+PnwpD+MWbNcej/1oW42fR0Tui0kiEREREQAfI0mUMYF+8rdRzcODZMcqtXzkccmODOQVmZ/C+eVW41NT70psanmAVpA0U2mXpl20y/2JyL0wSSQiIiIC0CkmzKr+FSr5GsV7esgTuAe/klc+fW3ZEXSdvcbsfQ8ZmeK59eXb0KKh6eI65vyVMgSfTUo0aG/72ipcKyzF5pMsYkNETBKJiIjICe7t0czZIRgI9DU/PVSts63FFr2Eykev8M2tMtNrFo2JDPFXbG+mN1JZE9H1A9GtWX2D9rIKNXq8tQ7nrxfJ2ttGhdT6mUTkfpgkEhERkUO0jAhGt2b1kdy5Cebc0cnZ4RiwZFP5NUeztK8v55mubmqJknIV8kvkU1DjIgxHCz+6r3utn1UlKjTA4r4nsgtw5yfbEZuyHLEpy/HKb4dsFgcRuS4miUREROQQEfX88Pu0flhwf4LBqJsraFjPz2yfbaevKbY/M7RmFUf7zFuPLq+vke2LOKJjY4N+f+saXaP728LeCze1r7/bdcFpcRCR47jeT2giIiLySEF+Ps4OwSQhzBeu+XZndZI0ZWCc9vXzwyv3Lgzxt+5rvKEpZJNxrXqaZ5BeVdRRCkmjM+mPfBKR52GSSERERA5Rz8oEytGsqW16Ja8YrSPrAQASWzTQth96Y6TF9zidU6B9nZVfrH1dodmP8fau0Xj37q74v7u7WBGZ/XV53XzxHSJyb0wSiYiIyCFcPUm01NmrhegzbwNe/uUgAMOtLyw1Zn71HoSPLErDocw8lFWoUVpRmSQ2rOeHuxKbIiTA/FpJW5v1tw4OfyYRuQ4miURERGQ3v6Rnal8Hu3iSaMFsUwDAh+tPyY69LdhfcdeModrXqw5fAVBZUVTX3z7ehjavrsQfBy4DAPx9zFdbrSmlbTCq3J3YFA/3a2m3ZxOR62OSSERERHbzwn8PaF/7+8rfdnx6f4LiNb7e1m1qbyvCwgmny/Zflh17W5Bd6ibIT36712Tfg5mV+yT6+djvbdrIjo3xx9P9FM+9NLKt2etVaslsHyJyX0wSiYiIyCGiw+RbL3RrbrhfHwCse36QI8Kx2O1mKot6WTCSGOxn/ajgH/svWX2NNbo0Vf7+hwcbVnnd/cpQrHpugPa4gMVriDwak0QiIiJyiGEdomTHPl7Kb0NaNDTcJ9ARJCiPjr13T1eT11mym4d+5dScfPN7LGbobWzvKErbkzQKCUCAzvTXHm+tc2RIRORgTBKJiIjIIfTX7kVYsC+hI0kKOWJ0WIDZPR31p5v2iWto9lk5BaVm+3SMDjXbx55eHFG5rUd8o8oqrrER1cl7BaebEnk0115BTkRERB6jUYh8uqkl+xI6Wy9NwndfUjP8sPuiYh9/X/lU0mbhgdhx1vR9x360zXQHAMumKa8ZdJRpt7XGuG4xaNog0KlxEJHjcSSRiIiICFCcbPrGuI4AgKYNjG9zEaBXYMbYINvzw9tYFY+5EUxbe354GxybPUp7LIRAs/Agt0jmici2mCQSERGRy3BWZVOgsrhMu8YhsrZQzR6FxWUqo9fN33BadqzWyxKnDIwDADwzNN4WYdrFEwPj8MzQeATWoMAOEXkeJolERETkMspVzlvrJoTAymcHKJ4rV6kV25WodRY3/vl0f/xrVLtax2YvK54ZgKmDW+HZYZYlsIse7gkAGBAfYc+wiMjJmCQSERGR3fRqGQ7A+J6I+qJC/e0ZjlnGplbm3iozes0DvZvLjkd0bAygsvBM56ZhBgV7LLF/5nCrr6mJDtGheHlUOwT5WVamouprUStV+SEij8HCNURERGQ3VUlFiGbapjmfPpBoz3Bq7HcTexa+Nb6z7Hh0p8b4fVo/bVVQa700si3qB7lW5dcqVZVcVaxuSuTROJJIREREdnMwMw+A4fYXxrSKqFliZW+jOzUxaIuLCEabKMN4hRDo1qw+gv1r9ln8tNta1+g6R/CqGkm0fPYtEbkhjiQSERGR3RSWVgAArhWa3xcQAPx93ePz6zfHd8L9Sc3Nd7TSnd1jbH5PW6pK9lWcbkrk0dzjJzERERG5pfDgymmTMRbutefv45pvTUrK5dVN70qIgZeX0I6s1Vbz8MotNlJGu26RGwDw0kw3TT9/w8mREJE9cSSRiIiI7Kaq4Iu3hXvtueqefKUV8vmVNSlGAwDjukVj2f7LBu2bXhyMonIV6tVwiqqjZOeXODsEInIA1/y4joiIiDzK6ZxCZ4dQK/qFWixNevUpjZQG+XnDy0u4fIIIGI6oEpFnYpJIREREdnf0Sr6zQ7Ca7nYc3ZrVl53z8a7ZWygBw+Tyt6n9anQvZ3DRgV4isjEmiURERGR3fi661tAUe+zyoJRktW0cYvsH2YmKVU2J6gSzP7GFEAuFEDlCiMM6ba8LIS4JIfZrfo3ROTddCHFaCHFCCDFSp32Upu20ECJFp72lEGKXEOKUEOInIYSfpt1fc3xacz7W3DOIiIjINbWNcp9EqIpaJ0vUrea57vlBNb6nu4/EFZVVODsEInIASz7WWwRglEL7+5IkddP8WgEAQogOACYA6Ki55hMhhLcQwhvAAgCjAXQAcJ+mLwD8W3OveAA3ADyqaX8UwA1JkloDeF/Tz+gzrPuyiYiIyN4kncSqc9Mws/37tW5oz3CsppsYqnVet25Um70c3TtLrB/k5+wQiMgBzCaJkiRtAZBr4f3GAfhRkqRSSZLOATgNIEnz67QkSWclSSoD8COAcaKyhNkQAD9rrv8GwHide32jef0zgKGa/saeQURERC5EtyJoXESw2f6utvWe7khi77jKBLZhcO2SJBvtmOE0uom/pXtfEpH7qc0CgaeFEAc101EbaNpiAFzU6ZOpaTPW3hDATUmSKvTaZffSnM/T9Dd2LyIiInIh568XaV9bsrWF2sWyRN01iYPbROKnKb1rNdUUADpGmx9RdWUx9av3u3x/7UknRkJE9lTTWsufAngTgKT5/V0Aj0B5DoUE5WRUMtEfJs6ZukZGCDEFwBQAaN68uVIXIiIispMtJ69a1d8ehWJqQzdpFUKgV1ztp8Pe27MZVJKEPnENIUkS4t1sraZukvvdrguYc0dnJ0ZDRPZSoyRRkqTsqtdCiC8A/E9zmAmgmU7XpgCqdoxVar8GoL4QwkczWqjbv+pemUIIHwBhqJz2auoZ+nF+DuBzAOjRo4eL/ddDRETk2RrpbCFhiTu7u9bEIP29EW3B20tgUu8WNr+vo9Sm8I4kSRaNKBOR89VouqkQoonO4R0Aqiqf/gFggqYyaUsA8QB2A9gDIF5TydQPlYVn/pAqJ7ZvBPB3zfUPAVimc6+HNK//DmCDpr+xZxAREZELCfKr/Cy6TZT5Qi/PDI3HvT2bme3nSPZIEuuqp75NR/L8bfyeErkJsyOJQogfAAwGECGEyAQwC8BgIUQ3VE7zzADwBABIknRECLEUwFEAFQCmSZKk0tznaQCrAXgDWChJ0hHNI/4F4EchxFsA9gH4StP+FYAlQojTqBxBnGDuGUREROQasvNL8PjiNABAfCPjUyon943F9tPXMHVwK5cbZWI6Y6imf0QrD2cBAC7kFqGlBUWMiMi5zCaJkiTdp9D8lUJbVf85AOYotK8AsEKh/SwUqpNKklQC4G5rnkFERESuYdayI+Y7AXj99o4uOw3R1QrpuAJRyy081h7NwpSBrWwUDRHZS22qmxIREREpWnUkS/t6+aErJvu6YoIIuN6WHK7A2j8qSZKwNK26KP3iHedtHBER2UNNq5sSERERUR1jbTr/3tqT+GjDae1x5o1i2wZERHbBkUQiIiKyqzGdGzs7BLIRa0d9dRNEInIfTBKJiIjI5gJ9vbWvm4QFmuhJ7sQ1JwYTka0xSSQiIiKbKy6vLjweGuDrxEjIlvQHEq8WlDonECKyKyaJREREZFeP9I91dghkI/rTTQ9m3gQA9Jm3Hv3/vcEZIRGRHbBwDREREdlViJuOJI7uxLWU5hSWVuBWaQWu5JUAAIrLVAj08zZzFRG5Oo4kEhERkU2p1NV7R7x3T1cnRlI7Ab5MdsxJXXkcFTp/3mUVarPXbDyRY8+QiMgGmCQSERGRTX2+5az29dB2UU6MpHZYpMW8yBB/QGc/yTeXHzV7zcNf77FjRERkC0wSiYiIyKYOXLypfe3v68ZvNZglmlWukqCSqrPEn9MzcTwr36BfUstwR4ZFRLXkxj+5iYiIyBWN7x6tfc0pm56ttFwlm14MAKM+2IqUXw7imR/2ads+n5SDMU53AAAgAElEQVTo6NCIqBZYuIaIiIhsqqiscvuL8d2izfR0bV5WbhxfV0TU88O1wjIAwNlrt6CWJIM+P+65KDsO9pe/5ZQkyaBSKhG5Do4kEhERkU1dulEMAChTmS9i4sqYwijbMX2o7LhCbZgk6vPxkn83S8rd++8GkadjkkhEREQ28+veTLy79iQAYMWhLCdHQ/bg6y1/+7jxuPlqpfqjhu1nrkJsynLkFZfbNDYisg0miURERFQjz/+0HyPe36xdk1ahUuP5pQe05wPcuWgNON3UUq/+ftiift5eht/PsR9ttXU4RGQD7v3Tm4iIiGxCrZbw5v+OYu3RbIv65xSU4Nd9l3Ayu1BbzbL1Kytlfbo1q2/zOB2pYT0/Z4fgUc7MHWPQdjG32AmREJE5TBKJiIgIG47n4Ktt5/D44jSL+t/16V/a11O/24vlB68Y9Pnh8d42i8+RljyahHHdojH1ttbODoWIyClY3ZSIiIhwIbfIqv66I0Dnrxdh2vd7Zec3vjjYbatXDoiPxID4SGeHQUTkNBxJJCIiIty0cQGRlhHBNr0fkb7VR7IQm7IcF65b9wEHEZnHJJGIiIigUFOkxg7MHGG7m5Hb+/6xXtrXjUL8Lbpm+q8HEZuyHN/tOo+isgrk5JfIzl+6WYwnlqQDAAb+30aUVqhsFzARMUkkIiIieSXP2X8exemcwhrd5+zcMQgL8rVVWOQB+raO0L4e3z3GZN+SchXmLD+KH3ZfBAC88tthdJi5Gklz1+NmURkA4PClPPRL3SC7ru2rq/D8T/ttHLl7uZhbhNiU5UhdedzZoZAHYJJIRERUx5Wr1HhPs7chACzcfg7D3tts8hr9zdGreNlySJI8TouGQbLjdo1DZMdPfpuOL7aeU7w24c21ACqnmSr5dd8lG0Tovm57ZxMA4D+bzzg3EPIITBKJiIjquF/3Zprts/30Ndz16V94e9VxqNUSKjR7IxKZ0jO2gew4pn6g7Liev7yG4qYTV43eq+qvnFoy/nevuMxzp50Wl6mw6+x17b6kuv48cJn/JsmmWN2UiIiojsvKKzV5vlylxv1f7gIApJ+/gU82KY9UfD25p81jI/dyZ0IMft1bOaK3Y/oQRNaTr0Ec1CYSrya3h0otYd7K49qE7x8/7MOfBy5b9Iy9528aPbforww8NbhVDaN3bVO/S8fGE1cxfXQ7PDGo+mvMyS/BP37Y58TITPt93yX4eAuM7RLt7FDIChxJJCIiquOWHzL95vxvH20ze4+/dY3GoDbcNqKuu79Xc+3rJmGB8PGWv9UUQuCxAXHo2TIcAHAwMw+jPthicYIIAGUqtdFz/151HFl5JUbPu7ONmlHW3/fLv1dJc9fLjv28XeftfUm5Cs/9tB9Pf78Pp7ILnB0OWcF1/hYRERGRU5zMNl2k5niW6Td3wztE4aP7unM9Yh0XEuCDbs0aICk2HA/3izXZt6pQUoVaMvv3q8qEns0AAIUlFbL2HdOHyI57z5MnTZ7m2JV8k+c7xoQ6KBLTbpVWyGId/v4WJ0ZD1uJ0UyIiIjJKf+sBJb7eTA4JmH9fd3h7CSx9so/ZvkVlFWb76DuqSTju6dkMb/7vKADgn8PaoElYoEHfpXsu4h5NUlnXXC0wPX3cnlRqCd6aD4s6zlotO9cqknunuhOOJBIREZFRd3+2Q7F9+TP9tZUqB7dt5MiQyEWdsHBEEAByb5VZff+DmXm4klcMSbOO8ZF+LfHssHgAlaPZul7+5aDV93dHaoViNZk3inEoM8+hcRy5nIfYlOVoNWMFYlOW48utZw36nLl6y6ExUe0wSSQiIiJF2fklOH+9SPFcx+gwLJvWD988koS/JzR1cGTkis5ftzwJ0N2X05gJPZshsYW8OmqfeRvw1vJjAAB/3+q3sSmj2xlcX1rhuZVOqzzxbbpi+98+3oYrecUOieG/aReRPF++brnqz0jftlPXHBES2QCTRCIiIlLUS68gRpxmutiCiQkAgPpBfhjUJpJrEQkA4ONl+dtKS/7KpIxuh1+e6ov37umqeN5Xp0BLq8h6+FlvmmvbV1dZHI+7Wns0W/taf3uREe85Zg3gSz9bPmr7wFe77BgJ2RKTRCIiojpugoVrt85evYWM1GQkd2li54jIHflYsTZVmBlJDAv0Rf0gPwBAsL9yCY3rhfK1dz1iwy1+vifYfS5XdvxfvSS5oLQCsSnLsfF4Tq2e89nmMwbVZ/84cBn//Gm/duoveR4miURERHXcj3suOjsEcjNBft4Gbb5WbL1gLrc4MGuE9rW3kYTyu10XDNoCfOvGW9tf92biHr31wsby7ocX7anxcw5cvIl5K4/L9mEsLlPhmR/24bd9l9By+gqT18c3qofHB7TE5L6x2rYKE1uYkOuoG/+SiIiIqNZ2zRjq7BDIRSjlI51jwiy+vnNT431HdWwsOy63IqnY/cowi/u6s+eXHpAdt2gYZNV0X0u9tuywQVv7mcrTeA+/MdKgbe3zg/BKcgf0bx2hbWv9ykomim6ASSIRERFZJCo0wNkhkItQmi6aoFdkxhT99XNV3hzXEf+ZlChrW3E4y6Bfq8hgnJk7xqA9NMAXc+/obHEc7mDHmeuITVluss+65wchMsTfps+dv/4UDupUSTU3tbSev4/RD5L2XbwhOz6QebP2AZJdMUkkIiIiolozNi3UGpP6xBq0KY06rX9hsHY/Pn1/T/Ssarv3fbHT5Plx3aK1U30zUpNt8szxC7bjvbUnZW2v/H4YOQWm902NCg1ARmoyDr8xUhbLgPhIWb+7PlXeWodcB5NEIiKiOkqSJHyw7qT5jkR6lNIza2c7Wjryde6afGuNZ4fGm+zvq1NA5+jlfOuCckOvje1g83vuv2g40vf9rgtImrNeoXd1xeMq9fSKDfWOa2hwDYveuDYmiURERHXUu2tO4oN1p5wdBrkjhSzR2pHEHhZOT83Q23/xuWGmk0TdqbBj5m/Ff9Mu4ppeJVRP0jDYz9khWFTx+LH+LWXHLaevQFFZhb1ColpikkhERFQHSZKEjzeetri//hs8qtuUBoGMTf805rEBlv2d+vnJvtrX9/dqbnb7DH0v/XwQPd5aZ9U1ruKQzppAY/S/H+0ahxj0qVCpkZNfgndWn8DtH29Dp1mroVbXbiTv7NwxWPxIkqwSrSl9WhmOJr743wMKPckVMEkkIiKqgy7mFlvVP6ll3dqDjkwrLDUcAfKyMklMbBGORQ/3xLJp/QAA3z3WS7GfbpGb2hRP2nbqWo2vdZYVh69Yfc0Pj/c2aFt+6AqS5q7HxxtP42BmHgpLK7Bw+znF6/X3X1Ry8PUR8PISGNgmEmGBvhbFpVSldsUhw6JE5BqYJBIREdVB5Wr5G7Zz8wwrReoa1j7KnuGQB/CxMkkEgMFtG6Frs/rISE1GP51tEnQ10JlOObFX8xrH98BXu8xWCXU1n246U/36/gSD8xN6NjNoa6Aw/fSzzWcN2o5dKTBo+33fJdn+i988kqSYBIYGWJYY6lL687U0wSTHY5JIRERUB6l0ppotmJhgdgqftaNE5NmU3tx72aC6qTEn3xqNA7NGIKKebbd5cEUqtYQ3/jyC0znyJG50Z8N1fy+NbKt4j4WTe8iOj2UZFvBp3aieQdtzP+2XHft4CaS9apu9J0MCfLH2nwNlbWoWr3FZTBKJiIjqkH0XbqDzrNW4VlBZyCPE38eiohNEupQqU1q7JtEafj5eNht1cvWN3BPeXIuvt2dg2HtbjPaJiwzG7leGoqGRpHlIuyjZFhRKudi/Vx2XHSv9mXaKDoOvt5csUXzn7q7mvgSj4qNCMLJj9ayE0nLX/rOoy5gkEhER1REZ127hjk/+QkFpBSZ+uQsAUKCwtkzf9NHt7B0aeQBb7JPoCK68kXtJuQp5xeVGz4cGVG4t0bVpfTQKqfn6TCX5xYY/C8KCKhNz3RHcuxJiavWc/zyQqH1dplLj3s92KK5XJOdikkhERFRHDH5nk9XXvH1XFzwxqJXtgyG3pjQ92V2mJO+/aL5iqLPc8clfJs//Pq0fnhgYh1l/s/3eiPpTP1c9N0B2fGbuGJyaM9rq6rL69K/fdS7XbavPejImiURERHXYymcHmDzfpVmYgyIhd+LOG6GvP5bt7BAUSZKEY1cM1w4CwNcP9wQAxEXWw/Qx7VE/yDZ7I97SmUlQlSQ2CPJFRmoy2jUOlfX19hLw9bZP6mBq9FSfO//dcydMEomIiOqw9k1CTZ4vq+A0MHI/m18aLDseEF9dWfNRF93z87d9l4yeu61tI7s8s+Os1Vi8IwPlKjWqalnZc22pKZk3isz26TBzFVpOX8HpqQ7AJJGIiIiMYol6ckctGgbLjpc8Wr0H48rDrrk33/NLlTeWt/W/wTZR8qqmM5cdwQNf7tKOJNZ2OmlN3a9ZJ21KUZkKABD/ykp7h1PnMUkkIiKqAw7qFOu4t0cz9GoZjo0vDjZ7XYCvtx2jIrKfzjGVU6V7tQyXtf+cnumMcGps32vDbXavzS8NxtND4g3ad53LRa+56wEAVzWVjx1tct9Yo+ee+jbd7fa4dHc+zg6AiIiI7O/2j7drX68/no20Vy174xkVatsKiuR5Fj+ShP4KG6U727eP9sKuc9dxWzv7TNW0Jd19S/XVpiDQzulD0Xveeu2xv483hrro90Np38Yq+qO/rSKDjfQkW2GSSEREVMfcl9TcbJ8FExPQomGQA6IhdzewTaSzQ1AUFuSLER0bW9S3pFyF/JJym28rYakLufL1eJ9NSsS1wlJ0jK5d4ajGYQEI8vPWTtP09/FCsL8PHu4Xi6+3Z9Tq3rZ2y4LteKoMttMaTapmdrqpEGKhECJHCHFYpy1cCLFWCHFK83sDTbsQQswXQpwWQhwUQiToXPOQpv8pIcRDOu2JQohDmmvmC81E6Jo8g4iIiMx7ZqjhdDN9yV2aoFMMK5uSslGdKpOvwW1dM0G0xvGsfLR7bRWS5qxHWkauU2K4+z87ZMcjOzbG/b1aoFuz+rW+98FZI7SvGwRXVkWdMaZ9re9ra09+uxcAUK5SIzZlOWJTluPp7/cq9l11OAu95q5DoRWJJVnHkjWJiwCM0mtLAbBekqR4AOs1xwAwGkC85tcUAJ8ClQkfgFkAegFIAjCrKunT9Jmic92omjyDiIiIjOvatDrhM1fGvlGIv8nzRG/c3gnz7+uOj+7r7uxQLDaxl/II+oKNZ7Svl6ZddFQ4MtcK7bcO0MfbCxmpychITda22Wsri9pacyRLVpTmfwevIK/IcHuMSzeLkZ1fik6zVrMCs52Y/RsiSdIWAPofq4wD8I3m9TcAxuu0L5Yq7QRQXwjRBMBIAGslScqVJOkGgLUARmnOhUqStEOq3PRksd69rHkGERERKUg/n4sDmZUbiH82KdFsfxPLo4gAAIF+3ri9azRCAtyn+u0vOgVrNp3I0b5ee7R6vdvSNMcXtVHr/YNb9/xAh8fgaL881Qf9WjfEhhcGydqnLEk36PvOmhMm79Xm1ZUsamMHNf0YIUqSpCsAoPm9amJwDADdj2AyNW2m2jMV2mvyDANCiClCiDQhRNrVq1et+gKJiIg8warDWbjr0+qpbDdulZm9hptVkycq1Rlxmvz1Hu3rknL5SNSc5Udr/IycghLEpizHNCPTJJXEzVghO27dKKTGz7fGvteGY3vKEIP2n5/sY/dnJ7YIx3eP9UZcpPFiNVWW7Dxv0T25d6Jt2XqsWan8klSD9po8w7BRkj6XJKmHJEk9IiPdf848ERGRtZ78Vv7JfD8LqlCGBLCuHdVdX2w9V+Nrk+ZUVhJdfvCK4jRISZKwJyNXcQqlozUI9kNM/UBZW0ZqMnrEhhu5wj50p8Kb08VEX1vtnXj4Uh6mfbcXZ64WGozy1iU1TRKzq6Z4an6vGrPPBNBMp19TAJfNtDdVaK/JM4iIiMiMZuHGK5b+OrUvkmLD8dmkHg6MiMgxXhjeRnb83poTOJVdYLfn5RUbJoLrjuXg7v/sQNfZaxSv2Tl9qN3iMWbm2A4AgAMzR5jpaR/Lnu5vcd/MG8V2jKQyiR/70TYsP3QFQ9/djEHvbLTr81xZTZPEPwBUVSh9CMAynfYHNRVIewPI00wVXQ1ghBCigaZgzQgAqzXnCoQQvTVVTR/Uu5c1zyAiIiIdL/73gOx43p2dTfZPaN4AS5/sg7aNHTPdjciRHh3QUnY8f8NpDH9/C8Z3i7bL85bsyJAd7zx7HY8vTpO16U7t3vTiYDQOc/wWHI/0b4mM1GSEBbnW+tJm4YEGbaueG2C0fy22k9RqOV0+9fdibjFiU5bj2JX82t/czViyBcYPAHYAaCuEyBRCPAogFcBwIcQpAMM1xwCwAsBZAKcBfAFgKgBIkpQL4E0AezS/ZmvaAOApAF9qrjkDoGqs2KpnEBERkdzPOoU66gf5WrQ/IpGnCvJTnkb9+375hLRIG1X3nb/htPa1Wi1hwuc7ZedvlVbIkpIgP2+bPNdTDIyXLxV7Nbm9yX0s7TlNdvSHW+12b1dldtGBJEn3GTllMB6uqVA6zch9FgJYqNCeBqCTQvt1a59BREREyrb/y7BABREZulpQiss3ixFd33Aky5SdZ68btG0/fQ39Wkfg9NVCg3MdZ62WHQcySZT5btcF2XGZkcI03z7aCw98tQu7z+WiuExV4++jyor1h0VlFQjwqXyOly2GMF2Qa26SQkRERDK5t8pQWFqBgpJy3LJgA+n1x7Jlx8H+LEZDZOn7+RHvbzHbJ6+oHLEpy9FzzjoAMBgpBID7v9wFANh4PMfgnD532k7E1hKa1zfb51S2PNF+VDNNtkyl0ra1n7nK6mdfKyyFSi1ZvFflp5vOoMPM1YibsQJxM1Z47PYb/B+DiIjIxZVWqJDw5lpZ23eP9UK5So3BbRspXvPoN9Vrn46/Ocqu8RG5Cx8vL6MjUm2i6uGkJhEpNPFBzM2iMpSrJAx8u7KoydUC08nF9cJSfLvL9DYOVcVj6ipvhew99c7OSPn1kPZ41eEsvH8vkNiiAdLP38ADvVsAAOoH+dX4uceu5CtOJT06eyQ6zJSP9O4+l4seLRrg36uOG/SvUKnh4+1ZY29MEomIiFzcAp21TVWqRiiqnJ07Bocv5+H2j7djQs9msnMBvpzGRgQAozs3xrL9ykXxJyY1x+t/mt8jsdvstQZtOQUlRvsnvrXO7D0f6d/SbB9PdubqLdnxjulDEOTrI0sSXxzZFgCw9Ik+yCsuR3hwZXLYtanxUciisgpcvllsdO9JpYQPqFy/mpGajC0nr+LBhbsBAPd8tkOxL1A5FdbTkkTP+mqIiIjcRIVKjS0nr6KkXGWy363SClkBDGPiZqzA7R9vBwD8uOeiTWIk8jRz7zBe4XeCXmEna9aoVe2PaIleLR27D6E7GNmxsey4SVggQgOrx7J8vAQe1STS3l5CmyBWHT85qBUA4N4e8g/IOsxcjWHvbTE6JXTTiasm40qy8M9qT8YNvPzzAWw4nm2+s5tgkkhEROQE4z/ZjgcX7ka714yvoZEkqdZV9d69u2utrifyJKbW5uqPuLeasQKXb8r35dPdssKYkR2jTJ5fcH+C9nXfVg2x55VhZu/p6UZ3qk4SnxsWDwAQQmDaba1wZ0IMTs8dY/L66PqVVU/XH8+GWi2huMzww7cTWYZ7YpqrKGvpLIyHFu7G0rRMPLIoDWUVytOZ3Q2nmxIRETnB4UvV+27FpizHXylDZNUUf07PNNjn0FqT+8birsSmtboHUV3WN3UDMlKTtcdHLpvfL2/2uE44kVWAjOtFBufW/nMgIur54+OJ3eHjJTCqUxObxuuudEcGnxjYSvv6pZHtLLq+arufa4VliJuxQrHPjaIy2fG8FcdQpJBM6n+w5u/jhVKFxO/zSYmYsiTdoL3Nqytlf2fcFUcSiYiIXMATem82TCWIXZvVx4cTuiEjNRln546Bj17RBz8fL2SkJuP12zvaJVaiumrsR9vM9okKDcD6FwYrnouLrFd5ny7RTBB1dIoJQ8rodlg4uUeNtrAY0cH06C1QWX1266nq6aWfbTmr2E//g7Vt/xpiMI0VAEboTZHVtWCj+SUCro5JIhERkYMpTVk7dCkP+SWVJfXNlVRfNq0fxnWLAVC5R9fpuWPwjyGttedPvjXatgETeZDeccbXmf2VUrv9RD+flAhAuVqnqXYCnhzUCkPamU/2lIztEm1Rv0lfVRahqVCocHtu3hjFEcDIEH/8Y2hrWVv/1hEAgO1G/r783+oTFk1NdmVMEomIiHQcuHgTsSnL0eX11Xb7T37FoSzF9i6vr1Fs354yBAdmjcDkvrE4MHOEYp/nh7dBl6ZhsmSRiAx9/1hvg7aNLw4GANmUbyUhAaZXap27dsvouZ6xDcwHRzUSGxFsVf/X/zxi0CaE8QQ+Okz+96Kq+FBM/UBkpCaja9MwPNBbXvio5fQVKDey3Yo7YJJIRER1xsnsAry39iSKyozvgTZuQWWF0PySCsxcZvhGwhamfb/X4r7/+0d/xNQPRFigL16/vSPCgpQ33BZC4I+n++OFEW1tFSaRR/LSG83LSE1GSwuTjJTRptfIdW4apn2te88fp/TG0if6WBEl2cv3uy4Y7G25e8ZQk9d4eQmse34QBraJRGiAD6beJv8wbtnT/fHWeMPKueaqp7oyFq4hIqI6Y8T7WwBUTvfsGB2GjcdzkHpXZwghIEkSTucUyvov2XkeTw5uhez8EiQ0t80owIGLNy3ue2f3GHSKCTPfkYjs7m8fbcOhS3km+/RtFaF9vfafA9H6lZUAKkeiTI1UkePM+O0QXk1uj9VHKrersLTITOtG9bD4kSSrntUoxN/q+FwFk0QiIqpzzl8vwkeavQdDAnzw6tgOaDlduSJev9QNAIDvH+8lewNYU1UjlaZ8+2gv9I+v/bOIyHqrnxuIkR9s0R6XVajh5+NlNEF8c1xHvLbsCP59l3wkycfbC9Nua4VLN4rRvGGQXWMm4w6+PgJXC0ox9N3NBudizEwvttaDfVpg8Y7z2uOuzerb9P6OxOmmRERU5+hONfpy2zmzhWIAYOIXuxCbshz7rRgJtISfj/y/4rjIYCaIRE7UtnEIVj47QHv8zpoTJvtP6hOLjNRk3NuzucG5l0a2wwcTuts8RjIUqrde9B9DWmPLS7chNMAXrTRVZat8syMDABAfJW+vrZljO9j0fs7EJJGIiOqcHWev1/ja8RaMBBqjlIwenz1KdhxRz32nJxF5ivhG1cnD50a2SiDX8vHEBNnxCyPaGh3BvZhbDADw8bJtKuTj7Tmpled8JURERDbQtEEgzs0bg88mJeLQ68qVRA+bWZekRClBPDdvDLy8BD6eWD3SMHsc9zYkcpQQf+WVV/pv9t19O4O6YIDODIz7kgz3NVzzz4EGbfp7zNpC2qvDAADPDo23+b0diWsSiYiINBoE+WLbvyr3vRqp2SjZz8cLZRXyMuZjP9pmcbEDU6oKWYztEm3xPl9EZDsVasuSv4zrRYrtvzzV15bhUC0IIfD5pEQsTbuIuXcYVhptExVi0ObjbfskMaKev03+f3A2jiQSEVGdpV+04KvJPQ367J853KDtheFtav3sdM2nzUTkPCoLk8Tk+Vtlx9Nua4V9rw1HYgvufehKRnRsjC8f6mlxJdnNbrxFhb0xSSQiojpBrfBm8IUR1cneb1P7Km5zEeTng4zUZGSkJuOJQXEAgHfXnsStUuN7Leq7klesfe3rLfDlgz3QkGsPiZxOZeE00qIylex4T8YNNAj2s0dIZEebXhwsOy6w4ud4XcMkkYiI6oSkuesN2vq3jsDZuWNwbt4YdLdgH8Svtp7Tvl57NFuxT0m5CjvPXpeNUPSZt0H7+tScMRjWIcqa0InITkyNJD7Wv6XRc/f3MqxkSq4vNiIYH07o5uww3ALXJBIRUZ1wrbDUoK1RaIBV99Bdv/TcT/vRMToU8XrrXF5YegDLD13RHp+dO8bKSInIFUSZ+PkwrluMAyMhW2oSVr3MICk23ImRuDaOJBIRkcerUKkN2g7MUq5cao3h728xaNNNEAEgbsaKWj+HiGzrs0mJAID/PJBgtE+Ar/Lb5OTOTewSEzmG7jrS7x7v5cRIXBtHEomIyONdvlkiOx7UJhJhgb5W36dlRDDOXbsla8u9VYZwC9cmrXt+kNXPJCLbG9mxMc7MHQNvE1sgNA1X3mNvwf3GE0tyfd5ewiOqj9obRxKJiMijFZep8N7aE9rjcd2i8fbfu9ToXo8NMFyjlPDmWouvb62zQTcROZepBBEA+rZq6KBIiFwPk0QiIvJo7Weuwu/7L2uPP5zQ3eRaI1PGdjbcy/C5YZZtmPy4QoJJRK7L14tvk6nu4nRTIiIiC4UF+SKinh+uFZZp2z5Ydwrz15/CnDs648rNYqPXvpLcwREhEpGNeJkZaSTyZEwSiYjIY8WmLJcdf2qDtUTDOzTGD7svyNrUEjD910OK/fu2aogFE7mGicgTTB3cytkhEDkEk0QiIvJIz/24T3b82aREjOzYuNb3DQ20/L/Of41qh6f4ppLIY0wZGOfsEIgcgpOtiYjI46jUkmwdIgCbJIgAMHVQawxp18hsv4f6tMATfENJ5Nb+80Ci7NjXm2+dqW7g33QiIrKb4jIVhr67CR9vOIXNJ6/a7TmSJMl+v15YKjt/bp7tNrQPC/LFwsk9McpM0vnGuE5c00Tk5uoHybfK8fHmv2mqGzjdlIiI7GbM/K04d+0W3llzUtt2bt4YlFao8dGGU/jnsDbwqeUn8xUqNVq/slJ73LVZfRy4eFN7nHpnZwhh+zd2pgofzh7X0ebPIyLHO3wpT3bMiqdUVzBJJCIiu1GpJYO2ltNXaF8v2HjG5KbGkiThVpkK9fyN/3d1PKtAdqybIALAhKTmloZrleeHt8GmE1dRVKYyOJdfXG6XZxKRY+n/DOPsAKor+NYfdKAAABvCSURBVHEIERHZxdurjuNCbpHZfrEpy/H6H0cUzw19dzM6zVqN2JTliE1ZjnKV2qCPs6Z/tW4UgsOvj1Q8t2DjGQdHQ0T2MLxDlLNDIHIKJolERGQXn2yyPFFa9FeGYvvZa7dkx/GvrMTG4zm4WlC95nDUB1uN3vfEW6MsjqEmjI0qtGoUbNfnEpFj3Co1nClAVBcwSSQiIhQrTJm0pRNvjcLD/WJN9tFf+2PMw4v2oOecdcgvKcfStIuyc34+lf+t3ZfUHBmpyfD38a5RvNboGdvAoG3O+M52fy4R2V9sRJCzQyByCq5JJCKq437dm4nnlx4AAMTUD8T2lCEAqjei/3xSIkbUYPuI0AAf5JdU4JtHkuDv443b2jbC19szjPYf+9E23N41GvPv6y57vjFdXl8jO9aN3ZF6xoZjT8YNWVubqBCHx0FEthcS4Gu+E5EHYpJIRFTHVSWIAHDpZrFBcjZlSbr2dbvGIdpCMfoFZyRJQufX16CwtELW3rJh5dTLAfEReGJgHDJvFmPu+M6Y9cdhg70M/zhwGeUqNW6zYB9CfT9O6W31NbbgozDlNNDP/iOYRORY79/b1dkhEDkMk0QiIrKYbiXRqmRy14yhAIBec9crXtMguPKTeCEEpo9pr21/5+6uBkkiAKw8nIWVh7NkbRmpyfj7p38h7fwNg/4AsHP6UDQOC7DiK7Edb5bEJ/Joc+/ojL0XbmBc1xhnh0LkMEwSiYioVowlh1WMbV/h4+2FjNRks9NKD8wcAQD4+am+KClXIcDXG4u2n8OyA5ex+JEkp08H062uOr5bNIa2ZzVEIk8ysVdzTOxln610iFwVP/4kIiJFj/ZvWeNrR3eqXMP469S+tdrI/vNJiQgLqk4CA3wrp3FO7tcSv03t5/QEEZBPN/1gQnf8rWu0E6MhIiKqPY4kEhGRgRNvjYK/jze+2nZO1n5fUjPMu7MLVh3OwpPfphtcV8/fB4deH2FVYrhsWj+cyC7A1YJS/N/qE7JzA9tE1uwLcCBvbq5NREQehkkiEVEdticjV/s6xN8H/32qD1pH1oOPd+VEEz9vL5RpNrDf8tJtaN6wshz8qE6NFaeKbnxxsNUjh12b1UfXZvUBQJYkDmsfpR05dGV3JjTF/PWncGdCU2eHQkREZBNMEomI6rC7/7ND+/r3p/uhVWQ92fkd04dg7dFsjOsWY1HFzsgQf5vEdWDmCNk0U1cWHuyH/TNHwIsjikRE5CGYJBIR1VFX8oplx3ERwQZ9Gtbzx4Qk4wUb5t7RGTN+O2SzmPS31XAXTBCJiMiTsHANEVEd1WfeBu3r6LCAGhWYmdCzmS1DIiIiIhfAJJGILPb2quP4eMMpZ4dBdrA9ZUiNrtMdQbujO/cQIyIi8gScbkpEFskvKccnm84AAJ4eEu/kaMgWosMCcDmvBAPiI2q1TcVfKUOw4XgO/p7Iwi1ERESegCOJRGSRMzmF2teXbxab6EmuqKCkHLEpy7XVSCVJwuW8EgDARBNrDi0RXT8QD/Ru4RaVSImIiMg8jiQSkVkVKjXu+OQv7XHf1A14YXgbfL/7An6f1g9RoQFOjI5MWXX4Cp78dq+sTX/birPXbjkyJCIiInJxQpIkZ8fgED169JDS0tKcHQaRW5EkCS2nrzDbz10rUtYF+gmhkhNvjYK/D0cBiYiIPJ0QIl2SpB7m+nG6KREp2nn2ukUJIlCZiNz5yXY7R0TWulVaYbZPyuh2TBCJiIhIplbTTYUQGQAKAKgAVEiS1EMIEQ7gJwCxADIA3CNJ0g1RWRXhQwBjABQBmCxJ0l7NfR4C8Krmtm9JkvSNpj0RwCIAgQBWAHhWkiTJ2DNq87UQUbUbt8ow4fOdBu39W0dg2+lritfsvXAT56/fQouG8r321GoJhy/noUOTUPh483MpR5j2/V4sP3hF1jakXSNMu60VnvlhPz5/MBGtIutxDSEREREpqtV0U02S2EOSpGs6bW8DyJUkKVUIkQKggSRJ/xJCjAHwD1Qmib0AfChJUi9NwpcGoAcACUA6gERNYrkbwLMAdqIySZwvSdJKY88wFSunmxKZZmpaYsuIYPz5j/4I9vM2O7p4bt4YCCHw1+lrmPjlLpN9N744GC0VNnCnmntySTpWHckyaOeUYCIiIrJ0uqk9CteMAzBY8/obAJsA/EvTvliqzEp3CiHqCyGaaPqulSQpFwCEEGsBjBJCbAIQKknSDk37YgDjAaw08QwilzLqgy04nlWgTZxc1fe7Lhg9d/iNkajnX/2joll4IC7mGq9u2nL6CmxPGWI2QQSA297ZxOQFxtd+mvrePPfjPpzMLsSih3siPNgPaglo8+pKxb5H3hhps1iJiIjI89U2SZQArBFCSAA+kyTpcwBRkiRdAQBJkq4IIRpp+sYAuKhzbaamzVR7pkI7TDxDRggxBcAUAGjevHYl3omsVa5S43hWAQBg9Idbseq5gQCAorIKrDmSjed+2g8A2PfacDQI9nNanCXlKsz47ZDiOaXkduvLQ7A07SJe/vkgkmLDsTsj1+C6fqkb7BKrpygqq0CHmasBAJ9NSsQTS9IV++mO7lb9WfScsw5XC0q17Ulz1xt9DkdqiYiIqCZqmyT2kyTpsiZJWyuEOG6ir9IwilSDdotpktbPgcrpptZcS1QbhaUV6DRrtfa4Klm8XliKxLfWyfp2f3MtGgT54pP7E9GnVcNaPTenoARJc+RJQ1JsOF5Jbo+UXw/h2JV8bfvR2SO1iYquxBYNsOjhnggJ8DX6nHt6NMM9PZppj81V0Dw3bwzWHcuBSq3GyI6NMX7BdhzIzAMAvPLbIbw1vpPJkVZJklx6JFaJWi3hQOZNdIoJg6/eWkzd77uxBFGfpUWEqnCEloiIiGqqVkmiJEmXNb/nCCF+A5AEIFsI0UQzwtcEQI6meyaAZjqXNwVwWdM+WK99k6a9qUJ/mHgGkdMcvpQHIYCO0WGyBLHKbe9swjkj+9HdKCrHfV/sxMHXRyDURHJmjn6CCAC7M3IxboFh5VGlBLGmicV/n+yDu/+zQ/Fc1T2Hd4jStukWsPlu1wV8t+sCXk1uj9u7RaNRSAAOX8rD8awC/D2xqSwBPTt3DLy8XD9ZVKslxM2oTupeTW6P5C5NsP/CTTz13V6j1216cTC8vQQGvL2xxs9e8cwAdIgOrfH1RERERDUuXCOECAbgJUlSgeb1WgCzAQwFcF2nqEy4JEkvCyGSATyN6sI18yVJStIUrkkHkKC59V5UFq7JFULsQWWxm134//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",
" open | \n",
" high | \n",
" low | \n",
" close | \n",
" volume_btc | \n",
" volume_currency | \n",
" weighted_price | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2014-01-07 | \n",
" 874.67040 | \n",
" 892.06753 | \n",
" 810.00000 | \n",
" 810.00000 | \n",
" 15.622378 | \n",
" 13151.472844 | \n",
" 841.835522 | \n",
"
\n",
" \n",
" 2014-01-08 | \n",
" 810.00000 | \n",
" 899.84281 | \n",
" 788.00000 | \n",
" 824.98287 | \n",
" 19.182756 | \n",
" 16097.329584 | \n",
" 839.156269 | \n",
"
\n",
" \n",
" 2014-01-09 | \n",
" 825.56345 | \n",
" 870.00000 | \n",
" 807.42084 | \n",
" 841.86934 | \n",
" 8.158335 | \n",
" 6784.249982 | \n",
" 831.572913 | \n",
"
\n",
" \n",
" 2014-01-10 | \n",
" 839.99000 | \n",
" 857.34056 | \n",
" 817.00000 | \n",
" 857.33056 | \n",
" 8.024510 | \n",
" 6780.220188 | \n",
" 844.938794 | \n",
"
\n",
" \n",
" 2014-01-11 | \n",
" 858.20000 | \n",
" 918.05471 | \n",
" 857.16554 | \n",
" 899.84105 | \n",
" 18.748285 | \n",
" 16698.566929 | \n",
" 890.671709 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" volumefrom | \n",
" volumeto | \n",
"
\n",
" \n",
" time | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2012-11-22 | \n",
" 12.42 | \n",
" 12.43 | \n",
" 11.67 | \n",
" 11.77 | \n",
" 58301.30 | \n",
" 703582.88 | \n",
"
\n",
" \n",
" 2012-11-23 | \n",
" 12.35 | \n",
" 12.41 | \n",
" 12.13 | \n",
" 12.42 | \n",
" 18967.90 | \n",
" 233370.93 | \n",
"
\n",
" \n",
" 2012-11-24 | \n",
" 12.41 | \n",
" 12.48 | \n",
" 12.25 | \n",
" 12.35 | \n",
" 19570.39 | \n",
" 242058.59 | \n",
"
\n",
" \n",
" 2012-11-25 | \n",
" 12.48 | \n",
" 12.60 | \n",
" 12.31 | \n",
" 12.41 | \n",
" 24023.69 | \n",
" 299989.40 | \n",
"
\n",
" \n",
" 2012-11-26 | \n",
" 12.25 | \n",
" 12.65 | \n",
" 11.89 | \n",
" 12.48 | \n",
" 35913.82 | \n",
" 443753.07 | \n",
"
\n",
" \n",
"
\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",
" timestamp | \n",
" open | \n",
" high | \n",
" low | \n",
" close | \n",
" volume_btc | \n",
" volume_currency | \n",
" weighted_price | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1499155260 | \n",
" 296127 | \n",
" 296558 | \n",
" 296016 | \n",
" 296540 | \n",
" 1.158600 | \n",
" 3.432441e+05 | \n",
" 296257.67168 | \n",
"
\n",
" \n",
" 1 | \n",
" 1499155320 | \n",
" 296539 | \n",
" 296769 | \n",
" 296060 | \n",
" 296679 | \n",
" 11.115510 | \n",
" 3.295332e+06 | \n",
" 296462.51372 | \n",
"
\n",
" \n",
" 2 | \n",
" 1499155380 | \n",
" 296060 | \n",
" 296090 | \n",
" 296060 | \n",
" 296060 | \n",
" 5.527494 | \n",
" 1.636491e+06 | \n",
" 296063.83615 | \n",
"
\n",
" \n",
" 3 | \n",
" 1499155440 | \n",
" 296060 | \n",
" 296260 | \n",
" 296015 | \n",
" 296015 | \n",
" 8.414064 | \n",
" 2.491620e+06 | \n",
" 296125.66780 | \n",
"
\n",
" \n",
" 4 | \n",
" 1499155500 | \n",
" 296361 | \n",
" 296540 | \n",
" 296155 | \n",
" 296155 | \n",
" 3.993010 | \n",
" 1.183292e+06 | \n",
" 296340.78573 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2017-07-04 | \n",
" 292177.556681 | \n",
"
\n",
" \n",
" 2017-07-05 | \n",
" 290562.675337 | \n",
"
\n",
" \n",
" 2017-07-06 | \n",
" 293182.524481 | \n",
"
\n",
" \n",
" 2017-07-07 | \n",
" 289683.612931 | \n",
"
\n",
" \n",
" 2017-07-08 | \n",
" 289174.397839 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2018-01-16 | \n",
" 1.482052e+06 | \n",
"
\n",
" \n",
" 2018-01-17 | \n",
" 1.213391e+06 | \n",
"
\n",
" \n",
" 2018-01-18 | \n",
" 1.317977e+06 | \n",
"
\n",
" \n",
" 2018-01-19 | \n",
" 1.309105e+06 | \n",
"
\n",
" \n",
" 2018-01-20 | \n",
" 1.396395e+06 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2018-01-21 | \n",
" 1.350072e+06 | \n",
"
\n",
" \n",
" 2018-01-22 | \n",
" 1.257413e+06 | \n",
"
\n",
" \n",
" 2018-01-23 | \n",
" 1.199568e+06 | \n",
"
\n",
" \n",
" 2018-01-24 | \n",
" 1.217985e+06 | \n",
"
\n",
" \n",
" 2018-01-25 | \n",
" 1.248951e+06 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2018-03-23 | \n",
" 901512.448097 | \n",
"
\n",
" \n",
" 2018-03-24 | \n",
" 932983.190034 | \n",
"
\n",
" \n",
" 2018-03-25 | \n",
" 900853.577864 | \n",
"
\n",
" \n",
" 2018-03-26 | \n",
" 870231.594284 | \n",
"
\n",
" \n",
" 2018-03-27 | \n",
" 866544.319950 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2017-07-04 | \n",
" 292177.556681 | \n",
"
\n",
" \n",
" 2017-07-05 | \n",
" 290562.675337 | \n",
"
\n",
" \n",
" 2017-07-06 | \n",
" 293182.524481 | \n",
"
\n",
" \n",
" 2017-07-07 | \n",
" 289683.612931 | \n",
"
\n",
" \n",
" 2017-07-08 | \n",
" 289174.397839 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2018-01-16 | \n",
" 1.482052e+06 | \n",
"
\n",
" \n",
" 2018-01-17 | \n",
" 1.213391e+06 | \n",
"
\n",
" \n",
" 2018-01-18 | \n",
" 1.317977e+06 | \n",
"
\n",
" \n",
" 2018-01-19 | \n",
" 1.309105e+06 | \n",
"
\n",
" \n",
" 2018-01-20 | \n",
" 1.396395e+06 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2018-01-21 | \n",
" 1.350072e+06 | \n",
"
\n",
" \n",
" 2018-01-22 | \n",
" 1.257413e+06 | \n",
"
\n",
" \n",
" 2018-01-23 | \n",
" 1.199568e+06 | \n",
"
\n",
" \n",
" 2018-01-24 | \n",
" 1.217985e+06 | \n",
"
\n",
" \n",
" 2018-01-25 | \n",
" 1.248951e+06 | \n",
"
\n",
" \n",
"
\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",
" column | \n",
"
\n",
" \n",
" col_name | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2018-03-23 | \n",
" 901512.448097 | \n",
"
\n",
" \n",
" 2018-03-24 | \n",
" 932983.190034 | \n",
"
\n",
" \n",
" 2018-03-25 | \n",
" 900853.577864 | \n",
"
\n",
" \n",
" 2018-03-26 | \n",
" 870231.594284 | \n",
"
\n",
" \n",
" 2018-03-27 | \n",
" 866544.319950 | \n",
"
\n",
" \n",
"
\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",
" prediction | \n",
" testing | \n",
"
\n",
" \n",
" \n",
" \n",
" 2 | \n",
" 0.015125 | \n",
" 0.015353 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.025023 | \n",
" 0.025424 | \n",
"
\n",
" \n",
" 4 | \n",
" -0.042882 | \n",
" -0.043528 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.011991 | \n",
" 0.012168 | \n",
"
\n",
" \n",
" 6 | \n",
" 0.045891 | \n",
" 0.046639 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-08-08 | \n",
" 0.003125 | \n",
" 50.000000 | \n",
" 0.002620 | \n",
" 50.000000 | \n",
" 2.662061e+05 | \n",
" 1205.803321 | \n",
" 0.004530 | \n",
"
\n",
" \n",
" 2015-08-09 | \n",
" 0.002581 | \n",
" 0.004100 | \n",
" 0.002400 | \n",
" 0.003000 | \n",
" 3.139879e+05 | \n",
" 898.123434 | \n",
" 0.002860 | \n",
"
\n",
" \n",
" 2015-08-10 | \n",
" 0.002645 | \n",
" 0.002902 | \n",
" 0.002200 | \n",
" 0.002650 | \n",
" 2.845754e+05 | \n",
" 718.365266 | \n",
" 0.002524 | \n",
"
\n",
" \n",
" 2015-08-11 | \n",
" 0.003950 | \n",
" 0.004400 | \n",
" 0.002414 | \n",
" 0.002650 | \n",
" 9.151385e+05 | \n",
" 3007.274111 | \n",
" 0.003286 | \n",
"
\n",
" \n",
" 2015-08-12 | \n",
" 0.004500 | \n",
" 0.004882 | \n",
" 0.002910 | \n",
" 0.003955 | \n",
" 1.117821e+06 | \n",
" 4690.075032 | \n",
" 0.004196 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-01-02 | \n",
" 0.008410 | \n",
" 0.008616 | \n",
" 0.008400 | \n",
" 0.008614 | \n",
" 338.598005 | \n",
" 2.879419 | \n",
" 0.008504 | \n",
"
\n",
" \n",
" 2015-01-03 | \n",
" 0.007630 | \n",
" 0.008570 | \n",
" 0.007530 | \n",
" 0.008454 | \n",
" 1655.027242 | \n",
" 13.117114 | \n",
" 0.007926 | \n",
"
\n",
" \n",
" 2015-01-04 | \n",
" 0.007549 | \n",
" 0.007999 | \n",
" 0.007301 | \n",
" 0.007632 | \n",
" 1155.306748 | \n",
" 8.682349 | \n",
" 0.007515 | \n",
"
\n",
" \n",
" 2015-01-05 | \n",
" 0.007770 | \n",
" 0.007800 | \n",
" 0.007410 | \n",
" 0.007410 | \n",
" 750.157067 | \n",
" 5.746375 | \n",
" 0.007660 | \n",
"
\n",
" \n",
" 2015-01-06 | \n",
" 0.007695 | \n",
" 0.007769 | \n",
" 0.007524 | \n",
" 0.007700 | \n",
" 413.763126 | \n",
" 3.155705 | \n",
" 0.007627 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-01-02 | \n",
" 0.000078 | \n",
" 0.000078 | \n",
" 0.000076 | \n",
" 0.000077 | \n",
" 2.355432e+05 | \n",
" 18.283504 | \n",
" 0.000078 | \n",
"
\n",
" \n",
" 2015-01-03 | \n",
" 0.000074 | \n",
" 0.000078 | \n",
" 0.000069 | \n",
" 0.000078 | \n",
" 6.786861e+05 | \n",
" 50.189736 | \n",
" 0.000074 | \n",
"
\n",
" \n",
" 2015-01-04 | \n",
" 0.000069 | \n",
" 0.000074 | \n",
" 0.000066 | \n",
" 0.000072 | \n",
" 1.375164e+06 | \n",
" 94.421953 | \n",
" 0.000069 | \n",
"
\n",
" \n",
" 2015-01-05 | \n",
" 0.000075 | \n",
" 0.000076 | \n",
" 0.000068 | \n",
" 0.000068 | \n",
" 5.179275e+05 | \n",
" 38.303674 | \n",
" 0.000074 | \n",
"
\n",
" \n",
" 2015-01-06 | \n",
" 0.000073 | \n",
" 0.000076 | \n",
" 0.000072 | \n",
" 0.000074 | \n",
" 7.620949e+05 | \n",
" 56.548566 | \n",
" 0.000074 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2016-07-24 | \n",
" 0.001410 | \n",
" 0.010000 | \n",
" 0.000101 | \n",
" 0.009950 | \n",
" 1.734943e+07 | \n",
" 24099.433042 | \n",
" 0.001389 | \n",
"
\n",
" \n",
" 2016-07-25 | \n",
" 0.000925 | \n",
" 0.001420 | \n",
" 0.000669 | \n",
" 0.001410 | \n",
" 1.365341e+07 | \n",
" 13184.156647 | \n",
" 0.000966 | \n",
"
\n",
" \n",
" 2016-07-26 | \n",
" 0.003310 | \n",
" 0.004872 | \n",
" 0.000916 | \n",
" 0.000925 | \n",
" 5.199938e+07 | \n",
" 144768.573933 | \n",
" 0.002784 | \n",
"
\n",
" \n",
" 2016-07-27 | \n",
" 0.002426 | \n",
" 0.003800 | \n",
" 0.001860 | \n",
" 0.003300 | \n",
" 2.558753e+07 | \n",
" 72354.908804 | \n",
" 0.002828 | \n",
"
\n",
" \n",
" 2016-07-28 | \n",
" 0.002320 | \n",
" 0.002500 | \n",
" 0.002068 | \n",
" 0.002440 | \n",
" 3.118785e+06 | \n",
" 7175.411011 | \n",
" 0.002301 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-01-02 | \n",
" 0.000018 | \n",
" 0.000018 | \n",
" 0.000017 | \n",
" 0.000017 | \n",
" 3.886411e+06 | \n",
" 68.145004 | \n",
" 0.000018 | \n",
"
\n",
" \n",
" 2015-01-03 | \n",
" 0.000016 | \n",
" 0.000018 | \n",
" 0.000016 | \n",
" 0.000018 | \n",
" 9.187188e+06 | \n",
" 155.926477 | \n",
" 0.000017 | \n",
"
\n",
" \n",
" 2015-01-04 | \n",
" 0.000017 | \n",
" 0.000017 | \n",
" 0.000016 | \n",
" 0.000016 | \n",
" 7.835991e+06 | \n",
" 128.085828 | \n",
" 0.000016 | \n",
"
\n",
" \n",
" 2015-01-05 | \n",
" 0.000019 | \n",
" 0.000022 | \n",
" 0.000016 | \n",
" 0.000017 | \n",
" 7.365508e+06 | \n",
" 132.299232 | \n",
" 0.000018 | \n",
"
\n",
" \n",
" 2015-01-06 | \n",
" 0.000017 | \n",
" 0.000019 | \n",
" 0.000017 | \n",
" 0.000019 | \n",
" 4.806229e+06 | \n",
" 86.389194 | \n",
" 0.000018 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-01-02 | \n",
" 0.006300 | \n",
" 0.006400 | \n",
" 0.006049 | \n",
" 0.006143 | \n",
" 209.561843 | \n",
" 1.310185 | \n",
" 0.006252 | \n",
"
\n",
" \n",
" 2015-01-03 | \n",
" 0.006213 | \n",
" 0.006300 | \n",
" 0.006000 | \n",
" 0.006074 | \n",
" 1067.683160 | \n",
" 6.438556 | \n",
" 0.006030 | \n",
"
\n",
" \n",
" 2015-01-04 | \n",
" 0.006200 | \n",
" 0.006301 | \n",
" 0.006000 | \n",
" 0.006000 | \n",
" 353.164407 | \n",
" 2.176665 | \n",
" 0.006163 | \n",
"
\n",
" \n",
" 2015-01-05 | \n",
" 0.006000 | \n",
" 0.006200 | \n",
" 0.006000 | \n",
" 0.006110 | \n",
" 453.520104 | \n",
" 2.760890 | \n",
" 0.006088 | \n",
"
\n",
" \n",
" 2015-01-06 | \n",
" 0.006000 | \n",
" 0.006200 | \n",
" 0.006000 | \n",
" 0.006000 | \n",
" 306.535292 | \n",
" 1.863959 | \n",
" 0.006081 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-08-25 | \n",
" 2.400000e-07 | \n",
" 6.900000e-05 | \n",
" 1.500000e-07 | \n",
" 5.000000e-07 | \n",
" 1.796256e+08 | \n",
" 38.440339 | \n",
" 2.100000e-07 | \n",
"
\n",
" \n",
" 2015-08-26 | \n",
" 1.800000e-07 | \n",
" 3.300000e-07 | \n",
" 1.400000e-07 | \n",
" 2.500000e-07 | \n",
" 5.201470e+08 | \n",
" 113.269147 | \n",
" 2.100000e-07 | \n",
"
\n",
" \n",
" 2015-08-27 | \n",
" 1.900000e-07 | \n",
" 2.400000e-07 | \n",
" 1.700000e-07 | \n",
" 1.800000e-07 | \n",
" 2.073278e+08 | \n",
" 42.733965 | \n",
" 2.000000e-07 | \n",
"
\n",
" \n",
" 2015-08-28 | \n",
" 1.700000e-07 | \n",
" 2.100000e-07 | \n",
" 1.500000e-07 | \n",
" 1.900000e-07 | \n",
" 1.540448e+08 | \n",
" 26.643325 | \n",
" 1.700000e-07 | \n",
"
\n",
" \n",
" 2015-08-29 | \n",
" 1.500000e-07 | \n",
" 1.800000e-07 | \n",
" 1.500000e-07 | \n",
" 1.700000e-07 | \n",
" 5.399869e+07 | \n",
" 8.812046 | \n",
" 1.600000e-07 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-01-02 | \n",
" 0.001430 | \n",
" 0.001549 | \n",
" 0.001370 | \n",
" 0.001549 | \n",
" 49065.143430 | \n",
" 70.850101 | \n",
" 0.001444 | \n",
"
\n",
" \n",
" 2015-01-03 | \n",
" 0.001660 | \n",
" 0.001691 | \n",
" 0.001412 | \n",
" 0.001427 | \n",
" 69499.330582 | \n",
" 109.248923 | \n",
" 0.001572 | \n",
"
\n",
" \n",
" 2015-01-04 | \n",
" 0.001556 | \n",
" 0.001650 | \n",
" 0.001452 | \n",
" 0.001640 | \n",
" 49664.577459 | \n",
" 76.239597 | \n",
" 0.001535 | \n",
"
\n",
" \n",
" 2015-01-05 | \n",
" 0.001540 | \n",
" 0.001689 | \n",
" 0.001440 | \n",
" 0.001546 | \n",
" 60422.799660 | \n",
" 92.246549 | \n",
" 0.001527 | \n",
"
\n",
" \n",
" 2015-01-06 | \n",
" 0.001588 | \n",
" 0.001689 | \n",
" 0.001490 | \n",
" 0.001540 | \n",
" 50438.349360 | \n",
" 80.999125 | \n",
" 0.001606 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-03-31 | \n",
" 1.600000e-06 | \n",
" 0.000102 | \n",
" 7.100000e-07 | \n",
" 0.000002 | \n",
" 5.961381e+07 | \n",
" 97.319038 | \n",
" 0.000002 | \n",
"
\n",
" \n",
" 2015-04-01 | \n",
" 9.800000e-07 | \n",
" 0.000002 | \n",
" 7.000000e-07 | \n",
" 0.000002 | \n",
" 2.384865e+08 | \n",
" 264.991041 | \n",
" 0.000001 | \n",
"
\n",
" \n",
" 2015-04-02 | \n",
" 1.230000e-06 | \n",
" 0.000001 | \n",
" 9.100000e-07 | \n",
" 0.000001 | \n",
" 9.577869e+07 | \n",
" 112.841565 | \n",
" 0.000001 | \n",
"
\n",
" \n",
" 2015-04-03 | \n",
" 1.220000e-06 | \n",
" 0.000001 | \n",
" 1.150000e-06 | \n",
" 0.000001 | \n",
" 6.581851e+07 | \n",
" 81.295697 | \n",
" 0.000001 | \n",
"
\n",
" \n",
" 2015-04-04 | \n",
" 1.070000e-06 | \n",
" 0.000001 | \n",
" 9.900000e-07 | \n",
" 0.000001 | \n",
" 8.535530e+07 | \n",
" 92.888274 | \n",
" 0.000001 | \n",
"
\n",
" \n",
"
\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",
" close | \n",
" high | \n",
" low | \n",
" open | \n",
" quoteVolume | \n",
" volume | \n",
" weightedAverage | \n",
"
\n",
" \n",
" date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2015-08-08 | \n",
" 0.003125 | \n",
" 50.000000 | \n",
" 0.002620 | \n",
" 50.000000 | \n",
" 2.662061e+05 | \n",
" 1205.803321 | \n",
" 0.004530 | \n",
"
\n",
" \n",
" 2015-08-09 | \n",
" 0.002581 | \n",
" 0.004100 | \n",
" 0.002400 | \n",
" 0.003000 | \n",
" 3.139879e+05 | \n",
" 898.123434 | \n",
" 0.002860 | \n",
"
\n",
" \n",
" 2015-08-10 | \n",
" 0.002645 | \n",
" 0.002902 | \n",
" 0.002200 | \n",
" 0.002650 | \n",
" 2.845754e+05 | \n",
" 718.365266 | \n",
" 0.002524 | \n",
"
\n",
" \n",
" 2015-08-11 | \n",
" 0.003950 | \n",
" 0.004400 | \n",
" 0.002414 | \n",
" 0.002650 | \n",
" 9.151385e+05 | \n",
" 3007.274111 | \n",
" 0.003286 | \n",
"
\n",
" \n",
" 2015-08-12 | \n",
" 0.004500 | \n",
" 0.004882 | \n",
" 0.002910 | \n",
" 0.003955 | \n",
" 1.117821e+06 | \n",
" 4690.075032 | \n",
" 0.004196 | \n",
"
\n",
" \n",
"
\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
}